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:
Yorik van Havre
2024-12-02 17:44:11 +01:00
committed by GitHub
parent d2b64f8fd6
commit 8ba34888fd
14 changed files with 53 additions and 0 deletions

View File

@@ -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.

View File

@@ -195,6 +195,8 @@ class CurtainWall(ArchComponent.Component):
if self.clone(obj):
return
if not self.ensureBase(obj):
return
import Part,DraftGeomUtils

View File

@@ -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:

View File

@@ -90,6 +90,8 @@ class _Frame(ArchComponent.Component):
if self.clone(obj):
return
if not self.ensureBase(obj):
return
if not obj.Base:
return

View File

@@ -115,6 +115,8 @@ class _Panel(ArchComponent.Component):
if self.clone(obj):
return
if not self.ensureBase(obj):
return
layers = []
length = 0

View File

@@ -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

View File

@@ -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(

View File

@@ -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

View File

@@ -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):

View File

@@ -267,6 +267,8 @@ class _Stairs(ArchComponent.Component):
if self.clone(obj):
return
if not self.ensureBase(obj):
return
self.steps = []
self.risers = []

View File

@@ -741,6 +741,8 @@ class _Structure(ArchComponent.Component):
if self.clone(obj):
return
if not self.ensureBase(obj):
return
base = None
pl = obj.Placement

View File

@@ -137,6 +137,8 @@ class Truss(ArchComponent.Component):
if self.clone(obj):
return
if not self.ensureBase(obj):
return
import Part

View File

@@ -315,6 +315,8 @@ class _Wall(ArchComponent.Component):
if self.clone(obj):
return
if not self.ensureBase(obj):
return
import Part
import DraftGeomUtils

View File

@@ -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