From 5f16da6201302a56ec467480e3927586d22d2e26 Mon Sep 17 00:00:00 2001 From: DeepSOIC Date: Fri, 3 Aug 2018 15:14:12 +0300 Subject: [PATCH] AttachablePlacement: create base class base class for all Lattice attachables --- Lattice2.py | 2 + lattice2AttachablePlacement.py | 85 +++++++++++++++++++++------------- lattice2Compatibility.py | 11 +++++ 3 files changed, 67 insertions(+), 31 deletions(-) create mode 100644 lattice2Compatibility.py diff --git a/Lattice2.py b/Lattice2.py index 04dc313..f470d3b 100644 --- a/Lattice2.py +++ b/Lattice2.py @@ -36,3 +36,5 @@ import Lattice2PartDesignFeatures as PartDesignFeatures import Lattice2GuiTools as GuiTools import lattice2_rc as resource_module + +import lattice2Compatibility as Compatibility diff --git a/lattice2AttachablePlacement.py b/lattice2AttachablePlacement.py index 662407c..b1c90ee 100644 --- a/lattice2AttachablePlacement.py +++ b/lattice2AttachablePlacement.py @@ -31,55 +31,56 @@ import FreeCAD as App import Part from lattice2Common import * +import lattice2Compatibility as Compat import lattice2BaseFeature import lattice2Subsequencer as Subsequencer +EDIT_ATTACHMENT = 56 # Viewprovider edit mode number + def makeAttachablePlacement(name): '''makeAttachablePlacement(name): makes an attachable Placement object.''' - - try: - rev_number = int(App.Version()[2].split(" ")[0]) - except Exception as err: - rev_number = 10000000 - - if rev_number < 9177: + if Compat.attach_extension_era: + obj = lattice2BaseFeature.makeLatticeFeature(name, AttachablePlacement, ViewProviderAttachablePlacement, no_disable_attacher= True) + else: #obsolete! obj = FreeCAD.ActiveDocument.addObject("Part::AttachableObjectPython",name) AttachablePlacement(obj) if FreeCAD.GuiUp: ViewProviderAttachablePlacement(obj.ViewObject) - else: - obj = lattice2BaseFeature.makeLatticeFeature(name, AttachablePlacement, ViewProviderAttachablePlacement, no_disable_attacher= True) - if not obj.hasExtension('Part::AttachExtension'): - obj.addExtension("Part::AttachExtensionPython", None) return obj -class AttachablePlacement(lattice2BaseFeature.LatticeFeature): - "Attachable Lattice Placement object" +class AttachableFeature(lattice2BaseFeature.LatticeFeature): + "Base class for attachable features" def derivedInit(self,obj): - self.Type = "AttachablePlacement" - - obj.ExposePlacement = True - obj.setEditorMode("ExposePlacement", 1) #read-only - - def derivedExecute(self,obj): - obj.positionBySupport() - - return [obj.Placement] + if Compat.attach_extension_era: + if not obj.hasExtension('Part::AttachExtension'): #PartDesign-related hack: the placement already has attachextension if created in PD + obj.addExtension('Part::AttachExtensionPython', None) def onDocumentRestored(self, selfobj): - #override that disables disabling of attacher + #PartDesign-related hack: this dummy override disables disabling of attacher pass -class ViewProviderAttachablePlacement(lattice2BaseFeature.ViewProviderLatticeFeature): +class AttachablePlacement(AttachableFeature): + "Attachable Lattice Placement object" + + def derivedInit(self,selfobj): + super(AttachablePlacement, self).derivedInit(selfobj) + selfobj.ExposePlacement = True + selfobj.setEditorMode('ExposePlacement', 1) #read-only - def getIcon(self): - return getIconPath('Lattice2_AttachablePlacement.svg') + def derivedExecute(self,selfobj): + selfobj.ExposePlacement = True + selfobj.positionBySupport() + + return [selfobj.Placement] +class ViewProviderAttachableFeature(lattice2BaseFeature.ViewProviderLatticeFeature): + always_edit_attachment = False def setEdit(self,vobj,mode): + if not (mode == EDIT_ATTACHMENT or (mode == 0 and always_edit_attachment)): raise NotImplementedError() import PartGui import FreeCADGui as Gui PartGui.AttachmentEditor.editAttachment(self.Object, @@ -88,10 +89,23 @@ class ViewProviderAttachablePlacement(lattice2BaseFeature.ViewProviderLatticeFea return True def unsetEdit(self,vobj,mode): + if not (mode == EDIT_ATTACHMENT or (mode == 0 and always_edit_attachment)): raise NotImplementedError() import FreeCADGui as Gui Gui.Control.closeDialog() return True + def setupContextMenu(self,vobj,menu): + from PySide import QtCore,QtGui + action1 = QtGui.QAction(QtGui.QIcon(":/icons/Part_Attachment.svg"),"Attachment...",menu) + QtCore.QObject.connect(action1,QtCore.SIGNAL("triggered()"), lambda: FreeCADGui.ActiveDocument.setEdit(vobj, 56)) + menu.addAction(action1) + menu.setDefaultAction(action1) + +class ViewProviderAttachablePlacement(ViewProviderAttachableFeature): + always_edit_attachment = True + def getIcon(self): + return getIconPath('Lattice2_AttachablePlacement.svg') + def makeLatticeAttachedPlacementSubsequence(name): '''makeLatticeAttachedPlacementSubsequence(name): makes a AttachedPlacementSubsequence object.''' @@ -136,6 +150,18 @@ class ViewProviderAttachedPlacementSubsequence(lattice2BaseFeature.ViewProviderL # -------------------------- Gui command -------------------------------------------------- +def editNewAttachment(f): + def accepted(f): + App.ActiveDocument.commitTransaction() + FreeCADGui.Selection.clearSelection() + FreeCADGui.Selection.addSelection(f) + import PartGui + PartGui.AttachmentEditor.editAttachment(f, take_selection= True, + create_transaction= False, + callback_OK= lambda f=f: accepted(f), + callback_Cancel= lambda: App.ActiveDocument.abortTransaction()) + + def CreateAttachablePlacement(name): sel = FreeCADGui.Selection.getSelectionEx() FreeCAD.ActiveDocument.openTransaction("Create Attachable Placement") @@ -144,11 +170,8 @@ def CreateAttachablePlacement(name): FreeCADGui.addModule("PartGui") FreeCADGui.doCommand("f = lattice2AttachablePlacement.makeAttachablePlacement(name='"+name+"')") FreeCADGui.doCommand("lattice2Executer.executeFeature(f)") - FreeCADGui.doCommand("PartGui.AttachmentEditor.editAttachment(f, take_selection= True," - "create_transaction= False," - "callback_OK= lambda: App.ActiveDocument.commitTransaction()," - "callback_Cancel= lambda: App.ActiveDocument.abortTransaction())") - FreeCAD.ActiveDocument.commitTransaction() + FreeCADGui.doCommand("lattice2AttachablePlacement.editNewAttachment(f)") + #FreeCAD.ActiveDocument.commitTransaction() def cmdCreateAttachedPlacementSubsequence(name): sel = FreeCADGui.Selection.getSelectionEx() diff --git a/lattice2Compatibility.py b/lattice2Compatibility.py new file mode 100644 index 0000000..1b3ca6e --- /dev/null +++ b/lattice2Compatibility.py @@ -0,0 +1,11 @@ +import FreeCAD as App + +try: + rev_number = int(App.Version()[2].split(" ")[0]) +except Exception as err: + rev_number = 10000000 + del err + +attach_extension_era = rev_number >= 9177 + +del App \ No newline at end of file