From 05641559f9c7691bb438f5dd395213052d9420f5 Mon Sep 17 00:00:00 2001 From: DeepSOIC Date: Sun, 2 Apr 2017 23:08:08 +0300 Subject: [PATCH] Workaround for FreeCAD bugs 2296, 2902 https://www.freecadweb.org/tracker/view.php?id=2996 https://www.freecadweb.org/tracker/view.php?id=2902 This change is to be removed in far future. Note: mostly untested. Something might have been broken. --- CompoundFilter2.py | 14 +++++++------- FuseCompound2.py | 6 +++--- lattice2ArrayFilter.py | 14 +++++++------- lattice2ArrayFromShape.py | 4 ++-- lattice2AttachablePlacement.py | 8 ++++---- lattice2BoundBox.py | 6 +++--- lattice2Common.py | 17 ++++++++++++++++- lattice2Downgrade.py | 10 +++++----- lattice2Invert.py | 6 +++--- lattice2LinearArray.py | 23 ++++++++++++----------- lattice2ParaSeries.py | 16 ++++++++-------- lattice2PolarArray.py | 19 ++++++++++--------- lattice2PopulateChildren.py | 22 +++++++++++----------- lattice2PopulateCopies.py | 16 ++++++++-------- lattice2ProjectArray.py | 10 +++++----- lattice2Resample.py | 6 +++--- lattice2ShapeInfoFeature.py | 6 +++--- lattice2ShapeString.py | 2 +- lattice2Slice.py | 10 +++++----- lattice2SubLink.py | 10 +++++----- lattice2TopoSeries.py | 16 ++++++++-------- lattice2ValueSeriesGenerator.py | 5 +++-- 22 files changed, 132 insertions(+), 114 deletions(-) diff --git a/CompoundFilter2.py b/CompoundFilter2.py index f1291fd..262b0b0 100644 --- a/CompoundFilter2.py +++ b/CompoundFilter2.py @@ -81,12 +81,12 @@ class _CompoundFilter: def execute(self,obj): #validity check - if isObjectLattice(obj.Base): + if isObjectLattice(screen(obj.Base)): import lattice2Executer lattice2Executer.warning(obj,"A generic shape is expected, but an array of placements was supplied. It will be treated as a generic shape.") rst = [] #variable to receive the final list of shapes - shps = obj.Base.Shape.childShapes() + shps = screen(obj.Base).Shape.childShapes() if obj.FilterType == 'bypass': rst = shps elif obj.FilterType == 'specific items': @@ -116,7 +116,7 @@ class _CompoundFilter: if not flags[i]: rst.append(shps[i]) elif obj.FilterType == 'collision-pass': - stencil = obj.Stencil.Shape + stencil = screen(obj.Stencil).Shape for s in shps: d = s.distToShape(stencil) if bool(d[0] < DistConfusion) ^ bool(obj.Invert): @@ -155,8 +155,8 @@ class _CompoundFilter: if len(rst) == 0: scale = 1.0 - if not obj.Base.Shape.isNull(): - scale = obj.Base.Shape.BoundBox.DiagonalLength/math.sqrt(3)/math.sqrt(len(shps)) + if not screen(obj.Base).Shape.isNull(): + scale = screen(obj.Base).Shape.BoundBox.DiagonalLength/math.sqrt(3)/math.sqrt(len(shps)) if scale < DistConfusion * 100: scale = 1.0 obj.Shape = markers.getNullShapeShape(scale) @@ -202,7 +202,7 @@ class _ViewProviderCompoundFilter: return None def claimChildren(self): - children = [self.Object.Base] + children = [screen(self.Object.Base)] if self.Object.Stencil: children.append(self.Object.Stencil) return children @@ -210,7 +210,7 @@ class _ViewProviderCompoundFilter: def onDelete(self, feature, subelements): # subelements is a tuple of strings if not self.ViewObject.DontUnhideOnDelete: try: - self.Object.Base.ViewObject.show() + screen(self.Object.Base).ViewObject.show() if self.Object.Stencil: self.Object.Stencil.ViewObject.show() except Exception as err: diff --git a/FuseCompound2.py b/FuseCompound2.py index 7eb3433..289955a 100644 --- a/FuseCompound2.py +++ b/FuseCompound2.py @@ -51,7 +51,7 @@ class _FuseCompound: def execute(self,obj): rst = None - shps = obj.Base.Shape.childShapes() + shps = screen(obj.Base).Shape.childShapes() if len(shps) > 1: rst = shps[0].multiFuse(shps[1:]) if obj.Refine: @@ -89,11 +89,11 @@ class _ViewProviderFuseCompound: return None def claimChildren(self): - return [self.Object.Base] + return [screen(self.Object.Base)] def onDelete(self, feature, subelements): # subelements is a tuple of strings try: - self.Object.Base.ViewObject.show() + screen(self.Object.Base).ViewObject.show() except Exception as err: FreeCAD.Console.PrintError("Error in onDelete: " + err.message) return True diff --git a/lattice2ArrayFilter.py b/lattice2ArrayFilter.py index 2661d95..72b8c74 100644 --- a/lattice2ArrayFilter.py +++ b/lattice2ArrayFilter.py @@ -73,11 +73,11 @@ class LatticeArrayFilter(lattice2BaseFeature.LatticeFeature): def derivedExecute(self,obj): #validity check - if not lattice2BaseFeature.isObjectLattice(obj.Base): + if not lattice2BaseFeature.isObjectLattice(screen(obj.Base)): lattice2Executer.warning(obj,"A lattice object is expected as Base, but a generic shape was provided. It will be treated as a lattice object; results may be unexpected.") output = [] #variable to receive the final list of placements - leaves = LCE.AllLeaves(obj.Base.Shape) + leaves = LCE.AllLeaves(screen(obj.Base).Shape) input = [leaf.Placement for leaf in leaves] if obj.FilterType == 'bypass': output = input @@ -107,7 +107,7 @@ class LatticeArrayFilter(lattice2BaseFeature.LatticeFeature): if not flags[i]: output.append(input[i]) elif obj.FilterType == 'collision-pass': - stencil = obj.Stencil.Shape + stencil = screen(obj.Stencil).Shape for plm in input: pnt = Part.Vertex(plm.Base) d = pnt.distToShape(stencil) @@ -118,7 +118,7 @@ class LatticeArrayFilter(lattice2BaseFeature.LatticeFeature): for i in xrange(0,len(input)): if obj.FilterType == 'window-distance': pnt = Part.Vertex(input[i].Base) - vals[i] = pnt.distToShape(obj.Stencil.Shape)[0] + vals[i] = pnt.distToShape(screen(obj.Stencil).Shape)[0] valFrom = obj.WindowFrom valTo = obj.WindowTo @@ -139,9 +139,9 @@ class ViewProviderArrayFilter(lattice2BaseFeature.ViewProviderLatticeFeature): return getIconPath("Lattice2_ArrayFilter.svg") def claimChildren(self): - children = [self.Object.Base] - if self.Object.Stencil: - children.append(self.Object.Stencil) + children = [screen(self.Object.Base)] + if screen(self.Object.Stencil): + children.append(screen(self.Object.Stencil)) return children def makeItemListFromSelection(sel, bMakeString = True): diff --git a/lattice2ArrayFromShape.py b/lattice2ArrayFromShape.py index c5b20f1..46891fb 100644 --- a/lattice2ArrayFromShape.py +++ b/lattice2ArrayFromShape.py @@ -68,10 +68,10 @@ class LatticeArrayFromShape(lattice2BaseFeature.LatticeFeature): def derivedExecute(self,obj): # cache stuff - if lattice2BaseFeature.isObjectLattice(obj.ShapeLink): + if lattice2BaseFeature.isObjectLattice(screen(obj.ShapeLink)): lattice2Executer.warning(obj,"ShapeLink points to a placement/array of placements. The placement/array will be reinterpreted as a generic shape; the results may be unexpected.") - base = obj.ShapeLink.Shape + base = screen(obj.ShapeLink).Shape if obj.CompoundTraversal == "Use as a whole": baseChildren = [base] else: diff --git a/lattice2AttachablePlacement.py b/lattice2AttachablePlacement.py index 2a4a6b4..6420562 100644 --- a/lattice2AttachablePlacement.py +++ b/lattice2AttachablePlacement.py @@ -100,8 +100,8 @@ class AttachedPlacementSubsequence(lattice2BaseFeature.LatticeFeature): obj.CycleMode = ['Open','Periodic'] def derivedExecute(self,obj): - attacher = Part.AttachEngine(obj.Base.AttacherType) - attacher.readParametersFromFeature(obj.Base) + attacher = Part.AttachEngine(screen(obj.Base).AttacherType) + attacher.readParametersFromFeature(screen(obj.Base)) i_filt_str = obj.RefIndexFilter ifilt = None if i_filt_str == "" else [i for i in range(len(i_filt_str)) if int(i_filt_str[i]) != 0] sublinks = Subsequencer.Subsequence_auto(attacher.References, @@ -110,7 +110,7 @@ class AttachedPlacementSubsequence(lattice2BaseFeature.LatticeFeature): plms = [] for lnkval in sublinks: attacher.References = lnkval - plms.append(attacher.calculateAttachedPlacement(obj.Base.Placement)) + plms.append(attacher.calculateAttachedPlacement(screen(obj.Base).Placement)) return plms class ViewProviderAttachedPlacementSubsequence(lattice2BaseFeature.ViewProviderLatticeFeature): @@ -118,7 +118,7 @@ class ViewProviderAttachedPlacementSubsequence(lattice2BaseFeature.ViewProviderL return getIconPath('Lattice2_AttachedPlacementSubsequence.svg') def claimChildren(self): - return [self.Object.Base] + return [screen(self.Object.Base)] # -------------------------- /document object -------------------------------------------------- diff --git a/lattice2BoundBox.py b/lattice2BoundBox.py index 46936d2..5f45001 100644 --- a/lattice2BoundBox.py +++ b/lattice2BoundBox.py @@ -138,7 +138,7 @@ class _BoundBox: def execute(self,obj): - base = obj.ShapeLink.Shape + base = screen(obj.ShapeLink).Shape if obj.CompoundTraversal == "Use as a whole": baseChildren = [base] else: @@ -155,11 +155,11 @@ class _BoundBox: if obj.OrientMode == "global": orients = [App.Placement()]*N elif obj.OrientMode == "local of compound": - orients = [obj.ShapeLink.Placement]*N + orients = [screen(obj.ShapeLink).Placement]*N elif obj.OrientMode == "local of child": orients = [child.Placement for child in baseChildren] elif obj.OrientMode == "use OrientLink": - orients = LBF.getPlacementsList(obj.OrientLink, context= obj) + orients = LBF.getPlacementsList(screen(obj.OrientLink), context= obj) if len(orients) == N: pass elif len(orients)>N: diff --git a/lattice2Common.py b/lattice2Common.py index 3ac203f..a4abccc 100644 --- a/lattice2Common.py +++ b/lattice2Common.py @@ -85,4 +85,19 @@ def deselect(sel): DistConfusion = 1e-7 ParaConfusion = 1e-8 -import lattice2_rc \ No newline at end of file +import lattice2_rc + +def screen(feature): + """screen(feature): protects link properties from being overwritten. + This is to be used as workaround for a bug where modifying an object accessed through + a link property of another object results in the latter being touched. + + returns: feature""" + if not hasattr(feature,"isDerivedFrom"): + return feature + if not feature.isDerivedFrom("App::DocumentObject"): + return feature + if feature.Document is None: + return feature + feature = getattr(feature.Document, feature.Name) + return feature diff --git a/lattice2Downgrade.py b/lattice2Downgrade.py index 9fa616c..df6b17b 100644 --- a/lattice2Downgrade.py +++ b/lattice2Downgrade.py @@ -74,7 +74,7 @@ class _latticeDowngrade: def execute(self,obj): rst = [] #variable to receive the final list of shapes - shp = obj.Base.Shape + shp = screen(obj.Base).Shape if obj.Mode == 'bypass': rst = [shp] elif obj.Mode == 'Leaves': @@ -124,8 +124,8 @@ class _latticeDowngrade: if len(rst) == 0: scale = 1.0 - if not obj.Base.Shape.isNull(): - scale = obj.Base.Shape.BoundBox.DiagonalLength/math.sqrt(3) + if not screen(obj.Base).Shape.isNull(): + scale = screen(obj.Base).Shape.BoundBox.DiagonalLength/math.sqrt(3) if scale < DistConfusion * 100: scale = 1.0 obj.Shape = markers.getNullShapeShape(scale) @@ -162,11 +162,11 @@ class _ViewProviderLatticeDowngrade: return None def claimChildren(self): - return [self.Object.Base] + return [screen(self.Object.Base)] def onDelete(self, feature, subelements): # subelements is a tuple of strings try: - self.Object.Base.ViewObject.show() + screen(self.Object.Base).ViewObject.show() except Exception as err: FreeCAD.Console.PrintError("Error in onDelete: " + err.message) return True diff --git a/lattice2Invert.py b/lattice2Invert.py index a9628db..61e569c 100644 --- a/lattice2Invert.py +++ b/lattice2Invert.py @@ -60,8 +60,8 @@ class LatticeInvert(lattice2BaseFeature.LatticeFeature): def derivedExecute(self,obj): # cache stuff - base = obj.Base.Shape - if not lattice2BaseFeature.isObjectLattice(obj.Base): + base = screen(obj.Base).Shape + if not lattice2BaseFeature.isObjectLattice(screen(obj.Base)): lattice2Executer.warning(obj, "Base is not a lattice, but lattice is expected. Results may be unexpected.\n") baseChildren = LCE.AllLeaves(base) @@ -107,7 +107,7 @@ class ViewProviderInvert(lattice2BaseFeature.ViewProviderLatticeFeature): return getIconPath('Lattice2_Invert.svg') def claimChildren(self): - return [self.Object.Base] + return [screen(self.Object.Base)] # -------------------------- /document object -------------------------------------------------- diff --git a/lattice2LinearArray.py b/lattice2LinearArray.py index d68304e..268977b 100644 --- a/lattice2LinearArray.py +++ b/lattice2LinearArray.py @@ -83,11 +83,12 @@ class LinearArray(lattice2BaseFeature.LatticeFeature): self.assureProperties(obj) def updateReadonlyness(self, obj): - obj.setEditorMode("Dir", 1 if (obj.Link and obj.DirIsDriven) else 0) - obj.setEditorMode("Point", 1 if (obj.Link and obj.PointIsDriven) else 0) - obj.setEditorMode("DirIsDriven", 0 if obj.Link else 1) - obj.setEditorMode("PointIsDriven", 0 if obj.Link else 1) - obj.setEditorMode("DrivenProperty", 0 if obj.Link else 1) + link = screen(obj.Link) + obj.setEditorMode("Dir", 1 if (link and obj.DirIsDriven) else 0) + obj.setEditorMode("Point", 1 if (link and obj.PointIsDriven) else 0) + obj.setEditorMode("DirIsDriven", 0 if link else 1) + obj.setEditorMode("PointIsDriven", 0 if link else 1) + obj.setEditorMode("DrivenProperty", 0 if link else 1) self.generator.updateReadonlyness() @@ -103,7 +104,7 @@ class LinearArray(lattice2BaseFeature.LatticeFeature): self.updateReadonlyness(obj) def assureProperties(self, selfobj): - assureProperty(selfobj, "App::PropertyLinkSub", "SubLink", sublinkFromApart(selfobj.Link, selfobj.LinkSubelement), "Lattice Array", "Mirror of Object+SubNames properties") + assureProperty(selfobj, "App::PropertyLinkSub", "SubLink", sublinkFromApart(screen(selfobj.Link), selfobj.LinkSubelement), "Lattice Array", "Mirror of Object+SubNames properties") def derivedExecute(self,obj): self.assureGenerator(obj) @@ -111,15 +112,15 @@ class LinearArray(lattice2BaseFeature.LatticeFeature): self.updateReadonlyness(obj) # Apply links - if obj.Link: - if lattice2BaseFeature.isObjectLattice(obj.Link): + if screen(obj.Link): + if lattice2BaseFeature.isObjectLattice(screen(obj.Link)): lattice2Executer.warning(obj,"For polar array, axis link is expected to be a regular shape. Lattice objct was supplied instead, it's going to be treated as a generic shape.") #resolve the link if len(obj.LinkSubelement) > 0: - linkedShape = obj.Link.Shape.getElement(obj.LinkSubelement) + linkedShape = screen(obj.Link).Shape.getElement(obj.LinkSubelement) else: - linkedShape = obj.Link.Shape + linkedShape = screen(obj.Link).Shape #Type check if linkedShape.ShapeType != 'Edge': @@ -155,7 +156,7 @@ class LinearArray(lattice2BaseFeature.LatticeFeature): #Apply reversal if obj.Reverse: obj.Dir = obj.Dir*(-1.0) - if not(obj.DirIsDriven and obj.Link): + if not(obj.DirIsDriven and screen(obj.Link)): obj.Reverse = False # precompute orientation diff --git a/lattice2ParaSeries.py b/lattice2ParaSeries.py index 60d133d..9849223 100644 --- a/lattice2ParaSeries.py +++ b/lattice2ParaSeries.py @@ -184,8 +184,8 @@ class LatticeParaSeries(lattice2BaseFeature.LatticeFeature): if len(values) == 0: scale = 1.0 try: - if not selfobj.Object.Shape.isNull(): - scale = selfobj.Object.Shape.BoundBox.DiagonalLength/math.sqrt(3) + if not screen(selfobj.Object).Shape.isNull(): + scale = screen(selfobj.Object).Shape.BoundBox.DiagonalLength/math.sqrt(3) except Exception: pass if scale < DistConfusion * 100: @@ -204,7 +204,7 @@ class LatticeParaSeries(lattice2BaseFeature.LatticeFeature): doc2 = App.newDocument() object_in_doc2 = None # define the variable, to prevent del() in finally block from raising another error try: - doc2.copyObject(selfobj.Object, True) + doc2.copyObject(screen(selfobj.Object), True) #if there are nested paraseries in the dependencies, make sure to enable them for objd2 in doc2.Objects: @@ -215,7 +215,7 @@ class LatticeParaSeries(lattice2BaseFeature.LatticeFeature): except exception: lattice2Executer.warning(selfobj,"Failed to enable recomputing of "+objd2.Name) - object_in_doc2 = doc2.getObject(selfobj.Object.Name) + object_in_doc2 = doc2.getObject(screen(selfobj.Object).Name) if bGui: progress.setValue(1) output_shapes = [] @@ -234,8 +234,8 @@ class LatticeParaSeries(lattice2BaseFeature.LatticeFeature): scale = 1.0 try: - if not selfobj.Object.Shape.isNull(): - scale = selfobj.Object.Shape.BoundBox.DiagonalLength/math.sqrt(3) + if not screen(selfobj.Object).Shape.isNull(): + scale = screen(selfobj.Object).Shape.BoundBox.DiagonalLength/math.sqrt(3) except Exception: pass if scale < DistConfusion * 100: @@ -263,7 +263,7 @@ class LatticeParaSeries(lattice2BaseFeature.LatticeFeature): selfobj.Shape = Part.makeCompound(output_shapes) - output_is_lattice = lattice2BaseFeature.isObjectLattice(selfobj.Object) + output_is_lattice = lattice2BaseFeature.isObjectLattice(screen(selfobj.Object)) if 'Auto' in selfobj.isLattice: new_isLattice = 'Auto-On' if output_is_lattice else 'Auto-Off' if selfobj.isLattice != new_isLattice:#check, to not cause onChanged without necessity (onChange messes with colors, it's better to keep user color) @@ -279,7 +279,7 @@ class ViewProviderLatticeParaSeries(lattice2BaseFeature.ViewProviderLatticeFeatu return getIconPath("Lattice2_ParaSeries.svg") def claimChildren(self): - return [self.Object.Object] + return [screen(self.Object.Object)] # -------------------------- /document object -------------------------------------------------- diff --git a/lattice2PolarArray.py b/lattice2PolarArray.py index defbbcd..17604d5 100644 --- a/lattice2PolarArray.py +++ b/lattice2PolarArray.py @@ -89,14 +89,15 @@ class PolarArray(lattice2BaseFeature.LatticeFeature): self.updateReadonlyness(obj) def updateReadonlyness(self, obj): - obj.setEditorMode("AxisDir", 1 if (obj.AxisLink and obj.AxisDirIsDriven) else 0) - obj.setEditorMode("AxisPoint", 1 if (obj.AxisLink and obj.AxisPointIsDriven) else 0) - obj.setEditorMode("AxisDirIsDriven", 0 if obj.AxisLink else 1) - obj.setEditorMode("AxisPointIsDriven", 0 if obj.AxisLink else 1) + axislink = screen(obj.AxisLink) + obj.setEditorMode("AxisDir", 1 if (axislink and obj.AxisDirIsDriven) else 0) + obj.setEditorMode("AxisPoint", 1 if (axislink and obj.AxisPointIsDriven) else 0) + obj.setEditorMode("AxisDirIsDriven", 0 if axislink else 1) + obj.setEditorMode("AxisPointIsDriven", 0 if axislink else 1) self.generator.updateReadonlyness() def assureProperties(self, selfobj): - assureProperty(selfobj, "App::PropertyLinkSub", "AxisSubLink", sublinkFromApart(selfobj.AxisLink, selfobj.AxisLinkSubelement), "Lattice Array", "Mirror of Object+SubNames properties") + assureProperty(selfobj, "App::PropertyLinkSub", "AxisSubLink", sublinkFromApart(screen(selfobj.AxisLink), selfobj.AxisLinkSubelement), "Lattice Array", "Mirror of Object+SubNames properties") def derivedExecute(self,obj): @@ -105,15 +106,15 @@ class PolarArray(lattice2BaseFeature.LatticeFeature): self.updateReadonlyness(obj) # Apply links - if obj.AxisLink: - if lattice2BaseFeature.isObjectLattice(obj.AxisLink): + if screen(obj.AxisLink): + if lattice2BaseFeature.isObjectLattice(screen(obj.AxisLink)): lattice2Executer.warning(obj,"For polar array, axis link is expected to be a regular shape. Lattice objct was supplied instead, it's going to be treated as a generic shape.") #resolve the link if len(obj.AxisLinkSubelement) > 0: - linkedShape = obj.AxisLink.Shape.getElement(obj.AxisLinkSubelement) + linkedShape = screen(obj.AxisLink).Shape.getElement(obj.AxisLinkSubelement) else: - linkedShape = obj.AxisLink.Shape + linkedShape = screen(obj.AxisLink).Shape #Type check if linkedShape.ShapeType != 'Edge': diff --git a/lattice2PopulateChildren.py b/lattice2PopulateChildren.py index 7bc5eb8..15960c6 100644 --- a/lattice2PopulateChildren.py +++ b/lattice2PopulateChildren.py @@ -75,24 +75,24 @@ class LatticePopulateChildren(lattice2BaseFeature.LatticeFeature): self.initNewProperties(obj) - outputIsLattice = lattice2BaseFeature.isObjectLattice(obj.Object) + outputIsLattice = lattice2BaseFeature.isObjectLattice(screen(obj.Object)) - if not lattice2BaseFeature.isObjectLattice(obj.Object): + if not lattice2BaseFeature.isObjectLattice(screen(obj.Object)): if obj.ObjectTraversal == "Direct children only": - objectShapes = obj.Object.Shape.childShapes() - if obj.Object.Shape.ShapeType != "Compound": + objectShapes = screen(obj.Object).Shape.childShapes() + if screen(obj.Object).Shape.ShapeType != "Compound": lattice2Executer.warning(obj,"shape supplied as object is not a compound. It is going to be downgraded one level down (e.g, if it is a wire, the edges are going to be enumerated as children).") elif obj.ObjectTraversal == "Recursive": - objectShapes = LCE.AllLeaves(obj.Object.Shape) + objectShapes = LCE.AllLeaves(screen(obj.Object).Shape) else: raise ValueError("Traversal mode not implemented: "+obj.ObjectTraversal) else: - objectPlms = lattice2BaseFeature.getPlacementsList(obj.Object, obj) - placements = lattice2BaseFeature.getPlacementsList(obj.PlacementsTo, obj) + objectPlms = lattice2BaseFeature.getPlacementsList(screen(obj.Object), obj) + placements = lattice2BaseFeature.getPlacementsList(screen(obj.PlacementsTo), obj) # Precompute referencing - placements = DereferenceArray(obj, placements, obj.PlacementsFrom, obj.Referencing) + placements = DereferenceArray(obj, placements, screen(obj.PlacementsFrom), obj.Referencing) # initialize output containers and loop variables outputShapes = [] #output list of shapes @@ -136,7 +136,7 @@ class LatticePopulateChildren(lattice2BaseFeature.LatticeFeature): class ViewProviderLatticePopulateChildren(lattice2BaseFeature.ViewProviderLatticeFeature): def getIcon(self): - if lattice2BaseFeature.isObjectLattice(self.Object): + if lattice2BaseFeature.isObjectLattice(screen(self.Object)): return getIconPath( {"Origin":"Lattice2_PopulateChildren_Plms_Normal.svg", "First item":"Lattice2_PopulateChildren_Plms_Array.svg", @@ -154,9 +154,9 @@ class ViewProviderLatticePopulateChildren(lattice2BaseFeature.ViewProviderLattic ) def claimChildren(self): - children = [self.Object.Object, self.Object.PlacementsTo] + children = [screen(self.Object.Object), screen(self.Object.PlacementsTo)] if self.Object.Referencing == "Use PlacementsFrom": - children.append(self.Object.PlacementsFrom) + children.append(screen(self.Object.PlacementsFrom)) return children # -------------------------- /document object -------------------------------------------------- diff --git a/lattice2PopulateCopies.py b/lattice2PopulateCopies.py index 7eb17fc..7c1c9f5 100644 --- a/lattice2PopulateCopies.py +++ b/lattice2PopulateCopies.py @@ -109,16 +109,16 @@ class LatticePopulateCopies(lattice2BaseFeature.LatticeFeature): self.assureProperties(obj) # cache stuff - objectShape = obj.Object.Shape - placements = lattice2BaseFeature.getPlacementsList(obj.PlacementsTo, obj) + objectShape = screen(obj.Object).Shape + placements = lattice2BaseFeature.getPlacementsList(screen(obj.PlacementsTo), obj) - outputIsLattice = lattice2BaseFeature.isObjectLattice(obj.Object) + outputIsLattice = lattice2BaseFeature.isObjectLattice(screen(obj.Object)) # Pre-collect base placement list, if base is a lattice. For speed. if outputIsLattice: - objectPlms = lattice2BaseFeature.getPlacementsList(obj.Object,obj) + objectPlms = lattice2BaseFeature.getPlacementsList(screen(obj.Object),obj) - placements = DereferenceArray(obj, placements, obj.PlacementsFrom, obj.Referencing) + placements = DereferenceArray(obj, placements, screen(obj.PlacementsFrom), obj.Referencing) # initialize output containers and loop variables outputShapes = [] #output list of shapes @@ -143,7 +143,7 @@ class LatticePopulateCopies(lattice2BaseFeature.LatticeFeature): # Output shape or compound (complex logic involving OutputCompounding property) #first, autosettle the OutputCompounding. if obj.OutputCompounding == "(autosettle)": - if hasattr(obj.PlacementsTo,"ExposePlacement") and obj.PlacementsTo.ExposePlacement == False: + if hasattr(screen(obj.PlacementsTo),"ExposePlacement") and screen(obj.PlacementsTo).ExposePlacement == False: obj.OutputCompounding = "always" else: obj.OutputCompounding = "only if many" @@ -177,9 +177,9 @@ class ViewProviderLatticePopulateCopies(lattice2BaseFeature.ViewProviderLatticeF ) def claimChildren(self): - children = [self.Object.Object, self.Object.PlacementsTo] + children = [screen(self.Object.Object), screen(self.Object.PlacementsTo)] if self.Object.Referencing == "Use PlacementsFrom": - children.append(self.Object.PlacementsFrom) + children.append(screen(self.Object.PlacementsFrom)) return children # -------------------------- /document object -------------------------------------------------- diff --git a/lattice2ProjectArray.py b/lattice2ProjectArray.py index 838e50e..e709b17 100644 --- a/lattice2ProjectArray.py +++ b/lattice2ProjectArray.py @@ -68,17 +68,17 @@ class LatticeProjectArray(lattice2BaseFeature.LatticeFeature): def derivedExecute(self,obj): #validity check - if not lattice2BaseFeature.isObjectLattice(obj.Base): + if not lattice2BaseFeature.isObjectLattice(screen(obj.Base)): lattice2Executer.warning(obj,"A lattice object is expected as Base, but a generic shape was provided. It will be treated as a lattice object; results may be unexpected.") - toolShape = obj.Tool.Shape - if lattice2BaseFeature.isObjectLattice(obj.Tool): + toolShape = screen(obj.Tool).Shape + if lattice2BaseFeature.isObjectLattice(screen(obj.Tool)): lattice2Executer.warning(obj,"A lattice object was provided as Tool. It will be converted into points; orientations will be ignored.") leaves = LCE.AllLeaves(toolShape) points = [Part.Vertex(leaf.Placement.Base) for leaf in leaves] toolShape = Part.makeCompound(points) - leaves = LCE.AllLeaves(obj.Base.Shape) + leaves = LCE.AllLeaves(screen(obj.Base).Shape) input = [leaf.Placement for leaf in leaves] output = [] #variable to receive the final list of placements @@ -180,7 +180,7 @@ class ViewProviderProjectArray(lattice2BaseFeature.ViewProviderLatticeFeature): return getIconPath("Lattice2_ProjectArray.svg") def claimChildren(self): - return [self.Object.Base] + return [screen(self.Object.Base)] def CreateLatticeProjectArray(name): sel = FreeCADGui.Selection.getSelectionEx() diff --git a/lattice2Resample.py b/lattice2Resample.py index 4e0994d..422ec1f 100644 --- a/lattice2Resample.py +++ b/lattice2Resample.py @@ -69,8 +69,8 @@ class LatticeResample(lattice2BaseFeature.LatticeFeature): def derivedExecute(self,obj): # cache stuff - base = obj.Base.Shape - if not lattice2BaseFeature.isObjectLattice(obj.Base): + base = screen(obj.Base).Shape + if not lattice2BaseFeature.isObjectLattice(screen(obj.Base)): lattice2Executer.warning(obj, "Base is not a lattice, but lattice is expected. Results may be unexpected.\n") input = [leaf.Placement for leaf in LCE.AllLeaves(base)] @@ -142,7 +142,7 @@ class ViewProviderLatticeResample(lattice2BaseFeature.ViewProviderLatticeFeature return getIconPath('Lattice2_Resample.svg') def claimChildren(self): - return [self.Object.Base] + return [screen(self.Object.Base)] # -------------------------- /document object -------------------------------------------------- diff --git a/lattice2ShapeInfoFeature.py b/lattice2ShapeInfoFeature.py index b859f3a..08a0862 100644 --- a/lattice2ShapeInfoFeature.py +++ b/lattice2ShapeInfoFeature.py @@ -53,13 +53,13 @@ class ShapeInfoFeature: self.updatedProperties = set() try: - if LBF.isObjectLattice(selfobj.Object): - plms = LBF.getPlacementsList(selfobj.Object) + if LBF.isObjectLattice(screen(selfobj.Object)): + plms = LBF.getPlacementsList(screen(selfobj.Object)) self.assignProp(selfobj,"App::PropertyInteger","NumberOfPlacements",len(plms)) for i in range( min( len(plms), 10 ) ): self.assignProp(selfobj,"App::PropertyPlacement","Placement"+str(i),plms[i]) else: - sh = selfobj.Object.Shape + sh = screen(selfobj.Object).Shape self.assignProp(selfobj,"App::PropertyString","ShapeType", sh.ShapeType) diff --git a/lattice2ShapeString.py b/lattice2ShapeString.py index 1acbdbf..6d30a48 100644 --- a/lattice2ShapeString.py +++ b/lattice2ShapeString.py @@ -150,7 +150,7 @@ class LatticeShapeString: def execute(self,obj): nOfStrings = len(obj.Strings) - lattice = obj.ArrayLink + lattice = screen(obj.ArrayLink) if lattice is None: plms = [App.Placement() for i in range(0,nOfStrings)] else: diff --git a/lattice2Slice.py b/lattice2Slice.py index 1edbe34..d7c2a52 100644 --- a/lattice2Slice.py +++ b/lattice2Slice.py @@ -53,8 +53,8 @@ class LatticeSlice: def execute(self,obj): rst = [] - pieces = LCE.AllLeaves(obj.Base.Shape) - cutters = LCE.AllLeaves(obj.Tool.Shape) + pieces = LCE.AllLeaves(screen(obj.Base).Shape) + cutters = LCE.AllLeaves(screen(obj.Tool).Shape) # prepare cutter shapes by converting them to solids cutters_solids = [] for cutter in cutters: @@ -125,12 +125,12 @@ class ViewProviderLatticeSlice: return None def claimChildren(self): - return [self.Object.Base, self.Object.Tool] + return [screen(self.Object.Base), screen(self.Object.Tool)] def onDelete(self, feature, subelements): # subelements is a tuple of strings try: - self.Object.Base.ViewObject.show() - self.Object.Tool.ViewObject.show() + screen(self.Object.Base).ViewObject.show() + screen(self.Object.Tool).ViewObject.show() except Exception as err: FreeCAD.Console.PrintError("Error in onDelete: " + err.message) return True diff --git a/lattice2SubLink.py b/lattice2SubLink.py index 5db8b9b..c1f9db7 100644 --- a/lattice2SubLink.py +++ b/lattice2SubLink.py @@ -59,17 +59,17 @@ class LatticeSubLink: def assureProperties(self, selfobj): assureProperty(selfobj, "App::PropertyEnumeration","Looping", ["Single"] + LSS.LOOP_MODES, "Lattice SubLink", "Sets wether to collect just the element, or all similar from array.") assureProperty(selfobj, "App::PropertyEnumeration","CompoundTraversal", LSS.TRAVERSAL_MODES, "Lattice SubLink", "Sets how to unpack compounds if Looping is not 'Single'.") - assureProperty(selfobj, "App::PropertyLinkSub", "SubLink", sublinkFromApart(selfobj.Object, selfobj.SubNames), "Lattice SubLink", "Mirror of Object+SubNames properties") + assureProperty(selfobj, "App::PropertyLinkSub", "SubLink", sublinkFromApart(screen(selfobj.Object), selfobj.SubNames), "Lattice SubLink", "Mirror of Object+SubNames properties") def execute(self,selfobj): self.assureProperties(selfobj) #validity check - if isObjectLattice(selfobj.Object): + if isObjectLattice(screen(selfobj.Object)): import lattice2Executer lattice2Executer.warning(selfobj,"A generic shape is expected, but a placement/array was supplied. It will be treated as a generic shape.") - lnkobj = selfobj.Object + lnkobj = screen(selfobj.Object) sh = lnkobj.Shape # subsequencing @@ -125,8 +125,8 @@ class LatticeSubLink: # no shapes collected, FAIL! scale = 1.0 try: - if selfobj.Object: - scale = selfobj.Object[0].Shape.BoundBox.DiagonalLength/math.sqrt(3) + if screen(selfobj.Object): + scale = screen(selfobj.Object).Shape.BoundBox.DiagonalLength/math.sqrt(3) except Exception as err: App.Console.PrintError(selfobj.Name+": Failed to estimate size of marker shape") if scale < DistConfusion * 100: diff --git a/lattice2TopoSeries.py b/lattice2TopoSeries.py index 1ba685f..57ea558 100644 --- a/lattice2TopoSeries.py +++ b/lattice2TopoSeries.py @@ -132,7 +132,7 @@ class LatticeTopoSeries(lattice2BaseFeature.LatticeFeature): # do the subsequencing in this document first, to verify stuff is set up correctly, and to obtain sequence length if self.isVerbose(): print ("In-place pre-subsequencing, for early check") - n_seq, subs_linkdict = self.makeSubsequence(selfobj, selfobj.ObjectToLoopOver) + n_seq, subs_linkdict = self.makeSubsequence(selfobj, screen(selfobj.ObjectToLoopOver)) bGui = bool(App.GuiUp) and Executer.globalIsCreatingLatticeFeature #disabled for most recomputes, because it causes a crash if property edits are approved by hitting Enter @@ -150,7 +150,7 @@ class LatticeTopoSeries(lattice2BaseFeature.LatticeFeature): if self.isVerbose(): print ("Copying object with dependencies to a temporary document...") - doc2.copyObject(selfobj.ObjectToTake, True) + doc2.copyObject(screen(selfobj.ObjectToTake), True) if self.isVerbose(): print ("Enabling nested para/toposeries, if any...") @@ -163,8 +163,8 @@ class LatticeTopoSeries(lattice2BaseFeature.LatticeFeature): except exception: Executer.warning(selfobj,"Failed to enable recomputing of "+objd2.Name) - object_to_take_in_doc2 = doc2.getObject(selfobj.ObjectToTake.Name) - object_to_loop_in_doc2 = doc2.getObject(selfobj.ObjectToLoopOver.Name) + object_to_take_in_doc2 = doc2.getObject(screen(selfobj.ObjectToTake).Name) + object_to_loop_in_doc2 = doc2.getObject(screen(selfobj.ObjectToLoopOver).Name) if bGui: progress.setValue(1) @@ -191,8 +191,8 @@ class LatticeTopoSeries(lattice2BaseFeature.LatticeFeature): scale = 1.0 try: - if not selfobj.ObjectToTake.Shape.isNull(): - scale = selfobj.ObjectToTake.Shape.BoundBox.DiagonalLength/math.sqrt(3) + if not screen(selfobj.ObjectToTake).Shape.isNull(): + scale = screen(selfobj.ObjectToTake).Shape.BoundBox.DiagonalLength/math.sqrt(3) except Exception: pass if scale < DistConfusion * 100: @@ -224,7 +224,7 @@ class LatticeTopoSeries(lattice2BaseFeature.LatticeFeature): selfobj.Shape = Part.makeCompound(output_shapes) - output_is_lattice = lattice2BaseFeature.isObjectLattice(selfobj.ObjectToTake) + output_is_lattice = lattice2BaseFeature.isObjectLattice(screen(selfobj.ObjectToTake)) if 'Auto' in selfobj.isLattice: new_isLattice = 'Auto-On' if output_is_lattice else 'Auto-Off' if selfobj.isLattice != new_isLattice:#check, to not cause onChanged without necessity (onChange messes with colors, it's better to keep user color) @@ -240,7 +240,7 @@ class ViewProviderLatticeTopoSeries(lattice2BaseFeature.ViewProviderLatticeFeatu return getIconPath("Lattice2_TopoSeries.svg") def claimChildren(self): - return [self.Object.ObjectToTake] + return [screen(self.Object.ObjectToTake)] # -------------------------- /document object -------------------------------------------------- diff --git a/lattice2ValueSeriesGenerator.py b/lattice2ValueSeriesGenerator.py index 041eca8..118fe4b 100644 --- a/lattice2ValueSeriesGenerator.py +++ b/lattice2ValueSeriesGenerator.py @@ -28,7 +28,7 @@ __doc__ = "Value Series generator module: utility module to attach value generat import math import lattice2Executer -from lattice2Common import ParaConfusion +from lattice2Common import ParaConfusion, screen class ValueSeriesGenerator: mode_userfriendly_names = { @@ -253,9 +253,10 @@ class ValueSeriesGenerator: #loop until the value can't be read out values = [] + spsh = screen(obj.SpreadsheetLink) while True: try: - values.append( obj.SpreadsheetLink.get(col+str(row)) ) + values.append( spsh.get(col+str(row)) ) except ValueError: break row += 1