Arch: Fixed IFC export of arch structures with several solids / holes

This commit is contained in:
Yorik van Havre
2018-12-01 12:14:00 -02:00
parent bc53910ace
commit 79ba082c55
2 changed files with 64 additions and 29 deletions

View File

@@ -526,17 +526,41 @@ class _Structure(ArchComponent.Component):
pl = obj.Placement
extdata = self.getExtrusionData(obj)
if extdata:
base = extdata[0]
base.Placement = extdata[2].multiply(base.Placement)
extv = extdata[2].Rotation.multVec(extdata[1])
if obj.Tool:
try:
base = obj.Tool.Shape.copy().makePipe(obj.Base.Shape.copy())
except Part.OCCError:
FreeCAD.Console.PrintError(translate("Arch","Error: The base shape couldn't be extruded along this tool object")+"\n")
return
sh = extdata[0]
if not isinstance(sh,list):
sh = [sh]
ev = extdata[1]
if not isinstance(ev,list):
ev = [ev]
pla = extdata[2]
if not isinstance(pla,list):
pla = [pla]
base = []
for i in range(len(sh)):
shi = sh[i]
if i < len(ev):
evi = ev[i]
else:
evi = FreeCAD.Vector(ev[-1])
if i < len(pla):
pli = pla[i]
else:
pli = pla[-1].copy()
shi.Placement = pli.multiply(shi.Placement)
extv = pli.Rotation.multVec(evi)
if obj.Tool:
try:
shi = obj.Tool.Shape.copy().makePipe(obj.Base.Shape.copy())
except Part.OCCError:
FreeCAD.Console.PrintError(translate("Arch","Error: The base shape couldn't be extruded along this tool object")+"\n")
return
else:
shi = shi.extrude(extv)
base.append(shi)
if len(base) == 1:
base = base[0]
else:
base = base.extrude(extv)
base = Part.makeCompound(base)
if obj.Base:
if obj.Base.isDerivedFrom("Part::Feature"):
if obj.Base.Shape.isNull():
@@ -600,6 +624,16 @@ class _Structure(ArchComponent.Component):
base,placement = self.rebase(obj.Base.Shape)
normal = obj.Base.Shape.Faces[0].normalAt(0,0)
normal = placement.inverse().Rotation.multVec(normal)
if (len(obj.Shape.Solids) > 1) and (len(obj.Shape.Solids) == len(obj.Base.Shape.Faces)):
# multiple extrusions
b = []
p = []
for f in obj.Base.Shape.Faces:
bf,pf = self.rebase(f)
b.append(bf)
p.append(pf)
base = b
placement = p
elif obj.Base.Shape.Wires:
baseface = None
if hasattr(obj,"FaceMaker"):
@@ -683,7 +717,7 @@ class _Structure(ArchComponent.Component):
# ResetNodes is not a property but it allows us to use this function to force reset the nodes
nodes = None
extdata = self.getExtrusionData(obj)
if extdata:
if extdata and not isinstance(extdata[0],list):
nodes = extdata[0]
nodes.Placement = nodes.Placement.multiply(extdata[2])
if role not in ["Slab"]:

View File

@@ -625,7 +625,7 @@ def insert(filename,docname,skip=[],only=[],root=None):
pass # IfcOpenShell will yield an error if a given product has no shape, but we don't care, we're brave enough
if brep:
if DEBUG: print(" "+str(len(brep)/1000)+"k ",end="")
if DEBUG: print(" "+str(int(len(brep)/1000))+"k ",end="")
shape = Part.Shape()
shape.importBrepFromString(brep,False)
@@ -2642,6 +2642,7 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
if hasattr(obj.Proxy,"getExtrusionData"):
extdata = obj.Proxy.getExtrusionData(obj)
if extdata:
#print(extdata)
# convert to meters
p = extdata[0]
if not isinstance(p,list):
@@ -2656,14 +2657,14 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
pi = p[i]
pi.scale(0.001)
if i < len(ev):
evi = ev[i]
evi = FreeCAD.Vector(ev[i])
else:
evi = ev[-1]
evi = FreeCAD.Vector(ev[-1])
evi.multiply(0.001)
if i < len(pl):
pli = pl[i]
pli = pl[i].copy()
else:
pli = pl[-1]
pli = pl[-1].copy()
pli.Base = pli.Base.multiply(0.001)
pstr = str([v.Point for v in p[i].Vertexes])
if pstr in profiledefs:
@@ -2690,19 +2691,19 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
shapes.append(shape)
solidType = "SweptSolid"
shapetype = "extrusion"
elif hasattr(obj.Proxy,"getRebarData"):
# export rebars as IfcSweptDiskSolid
rdata = obj.Proxy.getRebarData(obj)
if rdata:
# convert to meters
r = rdata[1] * 0.001
for w in rdata[0]:
w.scale(0.001)
cur = createCurve(ifcfile,w)
shape = ifcfile.createIfcSweptDiskSolid(cur,r)
shapes.append(shape)
solidType = "SweptSolid"
shapetype = "extrusion"
elif hasattr(obj.Proxy,"getRebarData"):
# export rebars as IfcSweptDiskSolid
rdata = obj.Proxy.getRebarData(obj)
if rdata:
# convert to meters
r = rdata[1] * 0.001
for w in rdata[0]:
w.scale(0.001)
cur = createCurve(ifcfile,w)
shape = ifcfile.createIfcSweptDiskSolid(cur,r)
shapes.append(shape)
solidType = "SweptSolid"
shapetype = "extrusion"
if not shapes: