Arch: Fixed IFC misc export issues, support for objects inside App Parts

This commit is contained in:
Yorik van Havre
2019-03-27 17:34:36 -03:00
parent ddb335cfe0
commit bab0401f98
2 changed files with 23 additions and 9 deletions

View File

@@ -31,7 +31,7 @@ import six
import os,time,tempfile,uuid,FreeCAD,Part,Draft,Arch,math,DraftVecUtils,sys
from DraftGeomUtils import vec
from ArchIFC import ifcProducts
import ArchIFCSchema
## @package importIFC
# \ingroup ARCH
@@ -847,7 +847,7 @@ def insert(filename,docname,skip=[],only=[],root=None):
a = obj.IfcData
a["IfcUID"] = str(guid)
obj.IfcData = a
for attribute in ifcProducts[product.is_a()]["attributes"]:
for attribute in ArchIFCSchema.IfcProducts[product.is_a()]["attributes"]:
if hasattr(product, attribute["name"]) and getattr(product, attribute["name"]):
setattr(obj, attribute["name"], getattr(product, attribute["name"]))
@@ -1744,7 +1744,7 @@ def export(exportList,filename):
count += 1
continue
if ifctype not in ifcProducts.keys():
if ifctype not in ArchIFCSchema.IfcProducts.keys():
ifctype = "IfcBuildingElementProxy"
# getting the "Force BREP" flag
@@ -1771,7 +1771,7 @@ def export(exportList,filename):
"RefElevation":obj.Elevation.Value/1000.0,
"SiteAddress":buildAddress(obj,ifcfile),
"CompositionType": "ELEMENT"})
if ifcopenshell.schema_identifier == "IFC2X3":
if schema == "IFC2X3":
kwargs = exportIFC2X3Attributes(obj, kwargs)
kwargs = exportIfcAttributes(obj, kwargs)
@@ -2367,7 +2367,9 @@ def export(exportList,filename):
print("Compression ratio:",int((float(ifcbin.spared)/(s+ifcbin.spared))*100),"%")
del ifcbin
def getIfcRoleFromObj(obj):
if (Draft.getType(obj) == "BuildingPart") and hasattr(obj,"IfcRole") and (obj.IfcRole == "Undefined"):
ifctype = "IfcBuildingStorey" # export BuildingParts as Storeys if their type wasn't explicitly set
elif hasattr(obj,"IfcRole"):
@@ -2384,7 +2386,9 @@ def getIfcRoleFromObj(obj):
return "Ifc" + ifctype
def exportIFC2X3Attributes(obj, kwargs):
role = getIfcRoleFromObj(obj)
if role in ["IfcSlab", "IfcFooting", "IfcRoof"]:
kwargs.update({"PredefinedType": "NOTDEFINED"})
@@ -2413,6 +2417,7 @@ def exportIFC2X3Attributes(obj, kwargs):
def exportIfcAttributes(obj, kwargs):
for property in obj.PropertiesList:
if obj.getGroupOfProperty(property) == "IFC Attributes" and obj.getPropertyByName(property):
value = obj.getPropertyByName(property)
@@ -2421,6 +2426,7 @@ def exportIfcAttributes(obj, kwargs):
kwargs.update({ property: value })
return kwargs
def buildAddress(obj,ifcfile):
a = obj.Address or None
@@ -2591,7 +2597,9 @@ def createCurve(ifcfile,wire):
def getEdgesAngle(edge1, edge2):
""" getEdgesAngle(edge1, edge2): returns a angle between two edges."""
vec1 = vec(edge1)
vec2 = vec(edge2)
angle = vec1.getAngle(vec2)
@@ -2600,9 +2608,11 @@ def getEdgesAngle(edge1, edge2):
def checkRectangle(edges):
""" checkRectangle(edges=[]): This function checks whether the given form is a rectangle
or not. It will return True when edges form a rectangular shape or return False
when edges do not form a rectangular shape."""
if FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch").GetBool("DisableIfcRectangleProfileDef",False):
return False
if len(edges) != 4:
@@ -2696,7 +2706,7 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
if k in sharedobjects:
# base shape already exists
repmap = sharedobjects[k]
pla = obj.Placement
pla = obj.getGlobalPlacement()
axis1 = ifcbin.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(1,0,0))))
axis2 = ifcbin.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(0,1,0))))
axis3 = ifcbin.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(0,0,1))))
@@ -2771,7 +2781,7 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
#print("evi:",evi)
if not tostore:
# add the object placement to the profile placement. Otherwise it'll be done later at map insert
pl2 = FreeCAD.Placement(obj.Placement)
pl2 = obj.getGlobalPlacement()
pl2.Base = pl2.Base.multiply(0.001)
pli = pl2.multiply(pli)
xvc = ifcbin.createIfcDirection(tuple(pli.Rotation.multVec(FreeCAD.Vector(1,0,0))))
@@ -2814,7 +2824,8 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
if not fcshape:
if obj.Shape:
if not obj.Shape.isNull():
fcshape = obj.Shape
fcshape = obj.Shape.copy()
fcshape.Placement = obj.getGlobalPlacement()
if fcshape:
shapedef = str([v.Point for v in fcshape.Vertexes])
if shapedef in shapedefs:
@@ -2829,6 +2840,7 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
if hasattr(geom,"serialise") and obj.isDerivedFrom("Part::Feature") and SERIALIZE:
if obj.Shape.Faces:
sh = obj.Shape.copy()
sh.Placement = obj.getGlobalPlacement()
sh.scale(0.001) # to meters
p = geom.serialise(sh.exportBrepToString())
if p:
@@ -2951,7 +2963,7 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
ovc = ifcbin.createIfcCartesianPoint((0.0,0.0,0.0))
gpl = ifcbin.createIfcAxis2Placement3D(ovc,zvc,xvc)
repmap = ifcfile.createIfcRepresentationMap(gpl,subrep)
pla = obj.Placement
pla = obj.getGlobalPlacement()
axis1 = ifcbin.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(1,0,0))))
axis2 = ifcbin.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(0,1,0))))
origin = ifcbin.createIfcCartesianPoint(tuple(FreeCAD.Vector(pla.Base).multiply(0.001)))

View File

@@ -198,6 +198,8 @@ def getType(obj):
return "Points"
if (obj.TypeId == "App::DocumentObjectGroup"):
return "Group"
if (obj.TypeId == "App::Part"):
return "App::Part"
return "Unknown"
def getObjectsOfType(objectslist,typ):
@@ -389,7 +391,7 @@ def getGroupContents(objectslist,walls=False,addgroups=False,spaces=False,noarch
objectslist = [objectslist]
for obj in objectslist:
if obj:
if obj.isDerivedFrom("App::DocumentObjectGroup") or ((getType(obj) in ["Building","BuildingPart","Space","Site"]) and hasattr(obj,"Group")):
if obj.isDerivedFrom("App::DocumentObjectGroup") or ((getType(obj) in ["App::Part","Building","BuildingPart","Space","Site"]) and hasattr(obj,"Group")):
if getType(obj) == "Site":
if obj.Shape:
newlist.append(obj)