diff --git a/src/Mod/BIM/ArchComponent.py b/src/Mod/BIM/ArchComponent.py index abf57a075a..f2dfac4e77 100644 --- a/src/Mod/BIM/ArchComponent.py +++ b/src/Mod/BIM/ArchComponent.py @@ -263,6 +263,8 @@ class Component(ArchIFC.IfcProduct): if self.clone(obj): return + if not self.ensureBase(obj): + return if obj.Base: shape = self.spread(obj,obj.Base.Shape) if obj.Additions or obj.Subtractions: @@ -1153,6 +1155,24 @@ class Component(ArchIFC.IfcProduct): hosts.append(link) return hosts + def ensureBase(self, obj): + """Returns False if the object has a Base but of the wrong type. + Either returns True""" + + if getattr(obj, "Base", None): + if obj.Base.isDerivedFrom("Part::Feature"): + return True + elif obj.Base.isDerivedFrom("Mesh::Feature"): + return True + else: + import Part + if isinstance(getattr(obj.Base, "Shape", None), Part.Shape): + return True + else: + t = translate("Arch","Wrong base type") + FreeCAD.Console.PrintError(obj.Label+": "+t+"\n") + return False + class ViewProviderComponent: """A default View Provider for Component objects. diff --git a/src/Mod/BIM/ArchCurtainWall.py b/src/Mod/BIM/ArchCurtainWall.py index d883839e92..4d07c26e2b 100644 --- a/src/Mod/BIM/ArchCurtainWall.py +++ b/src/Mod/BIM/ArchCurtainWall.py @@ -195,6 +195,8 @@ class CurtainWall(ArchComponent.Component): if self.clone(obj): return + if not self.ensureBase(obj): + return import Part,DraftGeomUtils diff --git a/src/Mod/BIM/ArchEquipment.py b/src/Mod/BIM/ArchEquipment.py index 8e8d2ab56e..401df591bc 100644 --- a/src/Mod/BIM/ArchEquipment.py +++ b/src/Mod/BIM/ArchEquipment.py @@ -216,6 +216,8 @@ class _Equipment(ArchComponent.Component): if self.clone(obj): return + if not self.ensureBase(obj): + return pl = obj.Placement if obj.Base: diff --git a/src/Mod/BIM/ArchFrame.py b/src/Mod/BIM/ArchFrame.py index 4980271ef0..c7e09460b9 100644 --- a/src/Mod/BIM/ArchFrame.py +++ b/src/Mod/BIM/ArchFrame.py @@ -90,6 +90,8 @@ class _Frame(ArchComponent.Component): if self.clone(obj): return + if not self.ensureBase(obj): + return if not obj.Base: return diff --git a/src/Mod/BIM/ArchPanel.py b/src/Mod/BIM/ArchPanel.py index 1bf0e85b88..971e7ec7c6 100644 --- a/src/Mod/BIM/ArchPanel.py +++ b/src/Mod/BIM/ArchPanel.py @@ -115,6 +115,8 @@ class _Panel(ArchComponent.Component): if self.clone(obj): return + if not self.ensureBase(obj): + return layers = [] length = 0 diff --git a/src/Mod/BIM/ArchPipe.py b/src/Mod/BIM/ArchPipe.py index c2ebd2a458..5a5ceb0e94 100644 --- a/src/Mod/BIM/ArchPipe.py +++ b/src/Mod/BIM/ArchPipe.py @@ -118,6 +118,10 @@ class _ArchPipe(ArchComponent.Component): import math import Part import DraftGeomUtils + if self.clone(obj): + return + if not self.ensureBase(obj): + return pl = obj.Placement w = self.getWire(obj) if not w: @@ -297,6 +301,11 @@ class _ArchPipeConnector(ArchComponent.Component): def execute(self,obj): + if self.clone(obj): + return + if not self.ensureBase(obj): + return + tol = 1 # tolerance for alignment. This is only visual, we can keep it low... ptol = 0.001 # tolerance for coincident points diff --git a/src/Mod/BIM/ArchRebar.py b/src/Mod/BIM/ArchRebar.py index f672994bd8..4674877bec 100644 --- a/src/Mod/BIM/ArchRebar.py +++ b/src/Mod/BIM/ArchRebar.py @@ -215,6 +215,8 @@ class _Rebar(ArchComponent.Component): if self.clone(obj): return + if not self.ensureBase(obj): + return if not obj.Base: # let pass without error so that object can receive a shape directly #FreeCAD.Console.PrintError( diff --git a/src/Mod/BIM/ArchRoof.py b/src/Mod/BIM/ArchRoof.py index 31fb61f8f4..022b886e85 100644 --- a/src/Mod/BIM/ArchRoof.py +++ b/src/Mod/BIM/ArchRoof.py @@ -601,6 +601,8 @@ class _Roof(ArchComponent.Component): if self.clone(obj): return + if not self.ensureBase(obj): + return pl = obj.Placement #self.baseface = None diff --git a/src/Mod/BIM/ArchSpace.py b/src/Mod/BIM/ArchSpace.py index 7da7aab19d..3a3493e550 100644 --- a/src/Mod/BIM/ArchSpace.py +++ b/src/Mod/BIM/ArchSpace.py @@ -262,6 +262,8 @@ class _Space(ArchComponent.Component): if self.clone(obj): return + if not self.ensureBase(obj): + return self.getShape(obj) def onChanged(self,obj,prop): diff --git a/src/Mod/BIM/ArchStairs.py b/src/Mod/BIM/ArchStairs.py index 60c980f234..b3c2082390 100644 --- a/src/Mod/BIM/ArchStairs.py +++ b/src/Mod/BIM/ArchStairs.py @@ -267,6 +267,8 @@ class _Stairs(ArchComponent.Component): if self.clone(obj): return + if not self.ensureBase(obj): + return self.steps = [] self.risers = [] diff --git a/src/Mod/BIM/ArchStructure.py b/src/Mod/BIM/ArchStructure.py index 6ec7998d58..01c560c411 100644 --- a/src/Mod/BIM/ArchStructure.py +++ b/src/Mod/BIM/ArchStructure.py @@ -741,6 +741,8 @@ class _Structure(ArchComponent.Component): if self.clone(obj): return + if not self.ensureBase(obj): + return base = None pl = obj.Placement diff --git a/src/Mod/BIM/ArchTruss.py b/src/Mod/BIM/ArchTruss.py index a1712df84a..51b189b723 100644 --- a/src/Mod/BIM/ArchTruss.py +++ b/src/Mod/BIM/ArchTruss.py @@ -137,6 +137,8 @@ class Truss(ArchComponent.Component): if self.clone(obj): return + if not self.ensureBase(obj): + return import Part diff --git a/src/Mod/BIM/ArchWall.py b/src/Mod/BIM/ArchWall.py index ab0c930a1f..4bb02da578 100644 --- a/src/Mod/BIM/ArchWall.py +++ b/src/Mod/BIM/ArchWall.py @@ -315,6 +315,8 @@ class _Wall(ArchComponent.Component): if self.clone(obj): return + if not self.ensureBase(obj): + return import Part import DraftGeomUtils diff --git a/src/Mod/BIM/ArchWindow.py b/src/Mod/BIM/ArchWindow.py index 4485baea23..15dd2317a3 100644 --- a/src/Mod/BIM/ArchWindow.py +++ b/src/Mod/BIM/ArchWindow.py @@ -429,6 +429,8 @@ class _Window(ArchComponent.Component): if hasattr(clonedProxy, "boxes"): self.boxes = clonedProxy.boxes return + if not self.ensureBase(obj): + return import Part import DraftGeomUtils