diff --git a/Align_View_to_Face.FCMacro b/Align_View_to_Face.FCMacro new file mode 100644 index 0000000..973f99f --- /dev/null +++ b/Align_View_to_Face.FCMacro @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +# Set the current view perpendicular to the selected line +# Place la vue perpendiculairement a la line selectionnee +# 2013 Jonathan Wiedemann, +# 2016 Werner Mayer, +# 2022 tchernomax, https://forum.freecadweb.org/viewtopic.php?p=630019#p630019 +# 2023 FreeCutter, modifications towards linked objects like in workbench Assembly 4 , https://forum.freecad.org/viewtopic.php?p=718516#p718516 +# +__title__ = "Align_View_to_Face" +__author__ = "Jonathan Wiedemann (Rockn)" +__url__ = "https://www.freecadweb.org/" +__Wiki__ = "https://wiki.freecadweb.org/Macro_Align_View_to_Face" +__version__ = "3.1" +__date__ = "2023/11/12" #YYYY/MM/DD + +from pivy import coin + +import FreeCAD as app +import FreeCADGui as gui + +def pointAt(normal, up): + z = normal + y = up + x = y.cross(z) + y = z.cross(x) + + rot = App.Matrix() + rot.A11 = x.x + rot.A21 = x.y + rot.A31 = x.z + + rot.A12 = y.x + rot.A22 = y.y + rot.A32 = y.z + + rot.A13 = z.x + rot.A23 = z.y + rot.A33 = z.z + + return App.Placement(rot).Rotation + +def get_selection_and_turn_view(): + doc = app.activeDocument() + if doc is None: + app.Console.PrintWarning('Align_view_to_face: No file open, nothing to do\n') + return + + selection = gui.Selection.getSelectionEx('', 0) # Returns a vector of selection objects + + if not selection: + app.Console.PrintWarning('Align_view_to_face: Nothing selected, nothing to do\n') + return + + cam = FreeCADGui.ActiveDocument.ActiveView.getCameraNode() + + ''' used to understand the 'getSelection' results + for selection_object in selection: + object_ = selection_object.Object + sub_fullpaths = selection_object.SubElementNames + if not sub_fullpaths: + # An object is selected, not a face, edge, vertex. + print(object_.Name) + for sub_fullpath in sub_fullpaths: + # One or more subelements are selected. + print(object_.Name, sub_fullpath) + ''' + + sel = selection[0] + face = sel.SubObjects[0] + if face.Area == 0: # trying to avoid errors due to wrong selected objects + app.Console.PrintWarning('Align_view_to_face: Please select a face - not an edge or vertex\n') + return + dir = face.normalAt(0,0) + + if dir.z == 1 : + rot = pointAt(dir, App.Vector(0.0,1.0,0.0)) + elif dir.z == -1 : + rot = pointAt(dir, App.Vector(0.0,1.0,0.0)) + else : + rot = pointAt(dir, App.Vector(0.0,0.0,1.0)) + + cam.orientation.setValue(rot.Q) + gui.SendMsgToActiveView("ViewSelection") + app.Console.PrintWarning('Align_view_to_face: Done\n') + +if __name__ == '__main__': + get_selection_and_turn_view() \ No newline at end of file diff --git a/Align_View_to_Face.FCMacro.manifest b/Align_View_to_Face.FCMacro.manifest new file mode 100644 index 0000000..4ff6991 --- /dev/null +++ b/Align_View_to_Face.FCMacro.manifest @@ -0,0 +1,4 @@ +[ + "/home/pgp/.var/app/org.freecad.FreeCAD/data/FreeCAD/Macro/MultiExport-FreeCAD/Macro_Align_View_to_Face.png", + "/home/pgp/.var/app/org.freecad.FreeCAD/data/FreeCAD/Macro/MultiExport-FreeCAD/Align_View_to_Face.FCMacro" +] \ No newline at end of file diff --git a/Macro_Align_View_to_Face.png b/Macro_Align_View_to_Face.png new file mode 100644 index 0000000..657340a Binary files /dev/null and b/Macro_Align_View_to_Face.png differ diff --git a/MultiExport.FCMacro b/MultiExport.FCMacro index 665a47f..3d1387c 100755 --- a/MultiExport.FCMacro +++ b/MultiExport.FCMacro @@ -4,7 +4,7 @@ import FreeCADGui import Draft import os import Mesh -from PySide2.QtWidgets import QWidget, QLabel, QSpinBox, QHBoxLayout, QListWidgetItem +from PySide.QtWidgets import QWidget, QLabel, QSpinBox, QHBoxLayout, QListWidgetItem from datetime import datetime