From 1f0fba2d9c510f46559a0953c742a4cdae4e988a Mon Sep 17 00:00:00 2001 From: Simon Lefort Date: Mon, 5 Feb 2024 11:23:08 +0100 Subject: [PATCH] =?UTF-8?q?tableToObject=20:=20Une=20macro=20pour=20int?= =?UTF-8?q?=C3=A9grer=20facilement=20les=20alias=20d'un=20tableau=20dans?= =?UTF-8?q?=20les=20param=C3=A8tres=20d'un=20corps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tableToObject.FCMacro | 133 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 tableToObject.FCMacro diff --git a/tableToObject.FCMacro b/tableToObject.FCMacro new file mode 100644 index 0000000..f697692 --- /dev/null +++ b/tableToObject.FCMacro @@ -0,0 +1,133 @@ +__Name__ = "tableToObject" +__Comment__ ="" +__Author__ = "2cv001" +__Title__ = "Macro Table to object" +__Date__ = "2024/02/01" #YYYY/MM/DD 18:55 Béta +__Version__ = __Date__ + +from PySide import QtGui +import FreeCAD as App +import FreeCADGui as Gui + + + +dico={ + "posx" : "Placement.Base.x", + "posy" : "Placement.Base.y", + "posz" : "Placement.Base.z", + "posX" : "Placement.Base.x", + "posY" : "Placement.Base.y", + "posZ" : "Placement.Base.z", + "angle": "Placement.Rotation.Angle", + "ang": "Placement.Rotation.Angle", + "axisx": "Placement.Rotation.Axis.x", + "axisy": "Placement.Rotation.Axis.y", + "axisz": "Placement.Rotation.Axis.z", + "axeX": "Placement.Rotation.Axis.x", + "axeY": "Placement.Rotation.Axis.y", + "axeZ": "Placement.Rotation.Axis.z", + "Length" : "Length", + "Length2" : "Length2", + "Radius" : "Radius", + "Height" : "Height", + "FirstAngle" : "FirstAngle", + "SecondAngle" : "SecondAngle", + "Angle1" : "Angle1", + "Angle2" : "Angle2", + "Angle3" : "Angle3", + } + +def recomputeAll() : + for obj in FreeCAD.ActiveDocument.Objects: + obj.touch() + FreeCAD.ActiveDocument.recompute() + + +def set_constraint_expression(sketchName, constraint_name, expression): + # Obtenez le Sketch + sketch = App.ActiveDocument.getObject(sketchName) + + # Parcourez toutes les contraintes dans le Sketch + for i in range(sketch.ConstraintCount): + # Obtenez la contrainte + constraint = sketch.Constraints[i] + + # Vérifiez si le nom de la contrainte correspond à celui recherché + if constraint.Name == constraint_name: + # Modifiez la valeur de la contrainte + sketch.setExpression('Constraints[' + str(i)+ ']', expression) + break + + +def set_property_based_on_alias(sheet,cell): + + # alias de la cellule + alias = sheet.getAlias(cell) + # Vérifier si l'alias est valide + if sheet.getContents(cell)!='' : + if alias is None: + print("La cellule sélectionnée " + cell + " n'a pas d'alias.") + return + + # Séparer l'alias en nom du corps et nom de la propriété + parts = alias.split('_') + if len(parts) != 2: + print("L'alias doit être sous la forme 'BodyName_PropertyName'.") + return + + objName, property_name = parts + #obj = App.ActiveDocument.getObject(objName) + obj=App.ActiveDocument.getObjectsByLabel(objName)[0] + + try : + property_name=dico[property_name] + except : + try : + if obj.TypeId != 'Sketcher::SketchObject' : + print ('propriété ' + property_name + ' non trouvé dans le dico. Voir en haut du code source') + except : + pass + + + if obj is None: + print(f"Il n'y a pas d objet nommé '{objName}' dans le document.") + return + + # Créer une expression qui fait référence à l'alias de la cellule + expression = f"<<{sheet.Label}>>.{alias}" + + # Modifier la propriété de l'objet + # si c'est une contrainte + if obj.TypeId == 'Sketcher::SketchObject' : + set_constraint_expression(objName, property_name, expression) + return + + if hasattr(obj, property_name.split('.')[0]): # Placement.Base.x -> Placement + obj.setExpression(property_name, expression) + else: + print(f"Le corps '{objName}' n'a pas de propriété '{property_name}'.") + + +def main() : + sheet = Gui.ActiveDocument.ActiveView.getSheet() + # Vérifiez si la feuille de calcul est active + if sheet.TypeId != 'Spreadsheet::Sheet': + print("Veuillez sélectionner des cellules dans une feuille de calcul.") + return + + # cellule active + #cell = Gui.activeView().currentIndex() + + aw = Gui.getMainWindow().centralWidget().activeSubWindow() # Store the active window + # To get list of all selected cells + sel_items = aw.widget().findChild(QtGui.QTableView).selectedIndexes() + getCellName = lambda r,c:'{}{}{}'.format(chr(c//26 + 64) if c//26 > 0 else '', chr(c%26 + 65), r + 1) + for cell in sel_items: # The selected cells are scanned + cellName=getCellName(cell.row(), cell.column()) + + if str(sheet.getContents(cellName))!= '' : + set_property_based_on_alias(sheet, cellName) + +if __name__ == '__main__': + main() +