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)




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