2023-06-18 15:55:12 +00:00
import FreeCAD as App
import FreeCADGui as Gui
doc = App . ActiveDocument
print ( ' lcs - локальная система координат ' )
print ( ' grip - позиция захвата ' )
print ( ' area - плоскость ' )
print ( ' vol - зона ' )
print ( ' joint - соединение ' )
entityType = input ( ' Введите тип получаемого обьекта ' )
def create ( entityType ) :
if entityType == ' grip ' :
print ( ' задайте начальную точку захватной зоны. ' )
print ( ' Учтите, что ось X должна быть направлена вдоль направления раскрытия пальцев ' )
print ( ' Ось Z должна быть направлена в противоположную сторону от направления кончика пальца захвата ' )
objname = input ( ' Введите название начальной точки ' + " \n " )
obj = doc . getObject ( objname )
poseGenerator ( obj )
elif entityType == ' area ' :
print ( ' задайте плоскость ' )
objname = input ( ' Введите название плоскости ' + " \n " )
obj = doc . getObject ( objname )
areaProps ( obj )
elif entityType == ' vol ' :
print ( ' задайте обьем ' )
objname = input ( ' Введите название обьема ' + " \n " )
obj = doc . getObject ( objname )
volProps ( obj )
elif entityType == ' joint ' :
print ( ' Задайте позицию соединения ' )
objname = input ( ' Введите название соединения ' + " \n " )
part1 = input ( ' укажите название первой детали ' + " \n " )
part2 = input ( ' укажите название второй детали ' + " \n " )
jointGenerator ( objname , part1 , part2 )
obj . addProperty ( " App::PropertyString " , " Type " ) . Type = entityType
## заглушки функций на случай, если что-то придумаю полезное для них
def areaProps ( area ) :
#здесь нужно отметить свойства зоны
#в принципе, Placement и размеры тут есть, больше ничего о с о б о не нужно
#добавить характеристику entityType
print ( area . Label )
def volProps ( vol ) :
#желательно указать координаты, габариты, позицию привязки
#но думаю, что это все уже есть
print ( vol . Label )
def jointGenerator ( jointName , part1 , part2 ) :
#получаем относительные координаты для первой детали и для второй детали
#создаем две сущности - точка входа и точка выхода (??????)
#в работе сейчас
print ( jointName . Label )
print ( part1 . Label )
print ( part2 . Label )
# Эта функция работает нормально
def poseGenerator ( lcs ) :
box = doc . addObject ( " Part::Box " , " gripSpace " )
box . Length = 62 #раскрытие
box . Width = 10 #ширина пальца
box . Height = 40 #глубина
box . Placement = lcs . Placement
#есть смысл создавать привязку прямо здесь же. благодаря параметризации, при подстройке куба все точки сместятся как надо
gripPose = App . ActiveDocument . addObject ( ' PartDesign::CoordinateSystem ' , ' GripPose ' )
gripPose . Support = box
gripPose . positionBySupport ( )
gripPose . MapMode = ' ObjectXY '
gripPose . AttachmentOffset . Base = [ str ( box . Label ) + ' .Length ' + ' /2 ' , str ( box . Label ) + ' .Length ' + ' /2 ' , 0 ] #здесь должна быть активная привязка, не просто значения координат
gripPose . addProperty ( " App::PropertyFloat " , " GripOpen " )
gripPose . addProperty ( " App::PropertyFloat " , " GripDepth " )
gripPose . addProperty ( " App::PropertyFloat " , " GripWidth " )
gripPose . setExpression ( ' GripDepth ' , str ( box . Label ) + ' .Height ' )
gripPose . setExpression ( ' GripOpen ' , str ( box . Label ) + ' .Length ' )
gripPose . setExpression ( ' GripWidth ' , str ( box . Label ) + ' .Width ' )
#нужно создавать внутри Part, а не внутри главного документа. сбиваются привязки !!!
print ( ' Установите захватную зону вручную, растянув обьект GripSpace ' )
doc . recompute ( )
#теперь нужно производить экспорт
#он делается через Tools.py или через импорт-экспорт
create ( entityType )
2024-04-14 18:54:47 +00:00
### getObjectInfo работает
def getFaceInfo ( face ) :
if face :
App . Console . PrintMessage ( f " Информация о грани: { face } \n " )
# Получите позицию (Base) и ориентацию (Rotation) грани в глобальных координатах
placement = face . Placement
position = App . Vector ( placement . Base )
orientation = App . Rotation ( placement . Rotation )
App . Console . PrintMessage ( f " Позиция грани: { position } \n " )
App . Console . PrintMessage ( f " Ориентация грани: { orientation } \n " )
def getObjectInfo ( ) :
selection = Gui . Selection . getSelectionEx ( )
if selection :
selected_object = selection [ 0 ] . Object
if selected_object :
subelement_name = selection [ 0 ] . SubElementNames [ 0 ]
if " Face " in subelement_name :
face = selected_object . Shape . Faces [ int ( subelement_name . split ( " Face " ) [ 1 ] ) ]
getFaceInfo ( face )
else :
App . Console . PrintError ( " Выберите грань, а не тело или другой элемент \n " )
else :
App . Console . PrintError ( " Объект не найден \n " )
else :
App . Console . PrintError ( " Н е выбраны объекты\n " )
getObjectInfo ( )