framework/freecad_workbench/markupEntities.py

165 lines
6.2 KiB
Python
Raw Permalink Normal View History

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()