BIM: ensure the Base has the correct type (#17264)
* BIM: ensure the Base has the correct type - fixes #16409 * BIM: refactor according to chenne's comment
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -195,6 +195,8 @@ class CurtainWall(ArchComponent.Component):
|
||||
|
||||
if self.clone(obj):
|
||||
return
|
||||
if not self.ensureBase(obj):
|
||||
return
|
||||
|
||||
import Part,DraftGeomUtils
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -90,6 +90,8 @@ class _Frame(ArchComponent.Component):
|
||||
|
||||
if self.clone(obj):
|
||||
return
|
||||
if not self.ensureBase(obj):
|
||||
return
|
||||
|
||||
if not obj.Base:
|
||||
return
|
||||
|
||||
@@ -115,6 +115,8 @@ class _Panel(ArchComponent.Component):
|
||||
|
||||
if self.clone(obj):
|
||||
return
|
||||
if not self.ensureBase(obj):
|
||||
return
|
||||
|
||||
layers = []
|
||||
length = 0
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -267,6 +267,8 @@ class _Stairs(ArchComponent.Component):
|
||||
|
||||
if self.clone(obj):
|
||||
return
|
||||
if not self.ensureBase(obj):
|
||||
return
|
||||
|
||||
self.steps = []
|
||||
self.risers = []
|
||||
|
||||
@@ -741,6 +741,8 @@ class _Structure(ArchComponent.Component):
|
||||
|
||||
if self.clone(obj):
|
||||
return
|
||||
if not self.ensureBase(obj):
|
||||
return
|
||||
|
||||
base = None
|
||||
pl = obj.Placement
|
||||
|
||||
@@ -137,6 +137,8 @@ class Truss(ArchComponent.Component):
|
||||
|
||||
if self.clone(obj):
|
||||
return
|
||||
if not self.ensureBase(obj):
|
||||
return
|
||||
|
||||
import Part
|
||||
|
||||
|
||||
@@ -315,6 +315,8 @@ class _Wall(ArchComponent.Component):
|
||||
|
||||
if self.clone(obj):
|
||||
return
|
||||
if not self.ensureBase(obj):
|
||||
return
|
||||
|
||||
import Part
|
||||
import DraftGeomUtils
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user