diff --git a/src/Mod/Arch/exportIFCStructuralTools.py b/src/Mod/Arch/exportIFCStructuralTools.py index b473afa751..c4f68f81fc 100644 --- a/src/Mod/Arch/exportIFCStructuralTools.py +++ b/src/Mod/Arch/exportIFCStructuralTools.py @@ -32,24 +32,26 @@ structural_nodes = {} # this keeps track of nodes during this session scaling = 1.0 # this keeps track of scaling during this session -def setup(ifcfile,ifcbin,scale): +def setup(ifcfile, ifcbin, scale): """Creates all the needed setup for structural model.""" - global structural_nodes,scaling + global structural_nodes, scaling structural_nodes = {} scaling = scale import ifcopenshell uid = ifcopenshell.guid.new - owh = ifcfile.by_type("IfcOwnerHistory")[0] - prj = ifcfile.by_type("IfcProject")[0] - ctx = createStructuralContext(ifcfile) + ownerHistory = ifcfile.by_type("IfcOwnerHistory")[0] + project = ifcfile.by_type("IfcProject")[0] + structContext = createStructuralContext(ifcfile) if ifcfile.wrapped_data.schema_name() == "IFC2X3": - mod = ifcfile.createIfcStructuralAnalysisModel(uid(),owh,"Structural Analysis Model",None,None,"NOTDEFINED",None,None,None) + mod = ifcfile.createIfcStructuralAnalysisModel( + uid(), ownerHistory, "Structural Analysis Model", None, None, "NOTDEFINED", None, None, None) else: - pla = ifcbin.createIfcLocalPlacement() - mod = ifcfile.createIfcStructuralAnalysisModel(uid(),owh,"Structural Analysis Model",None,None,"NOTDEFINED",None,None,None,pla) - rel = ifcfile.createIfcRelDeclares(uid(),owh,None,None,prj,[mod]) + localPlacement = ifcbin.createIfcLocalPlacement() + structModel = ifcfile.createIfcStructuralAnalysisModel( + uid(), ownerHistory, "Structural Analysis Model", None, None, "NOTDEFINED", None, None, None, localPlacement) + relation = ifcfile.createIfcRelDeclares(uid(), ownerHistory, None, None, project, [structModel]) def createStructuralContext(ifcfile): @@ -59,9 +61,10 @@ def createStructuralContext(ifcfile): contexts = ifcfile.by_type("IfcGeometricRepresentationContext") # filter out subcontexts contexts = [c for c in contexts if c.is_a() == "IfcGeometricRepresentationContext"] - ctx = contexts[0] # arbitrarily take the first one... - structcontext = ifcfile.createIfcGeometricRepresentationSubContext('Analysis','Axis',None,None,None,None,ctx,None,"GRAPH_VIEW",None) - return structcontext + geomContext = contexts[0] # arbitrarily take the first one... + structContext = ifcfile.createIfcGeometricRepresentationSubContext( + 'Analysis', 'Axis', None, None, None, None, geomContext, None, "GRAPH_VIEW", None) + return structContext def getStructuralContext(ifcfile): @@ -72,42 +75,46 @@ def getStructuralContext(ifcfile): return c -def createStructuralNode(ifcfile,ifcbin,point): +def createStructuralNode(ifcfile, ifcbin, point): """Creates a connection node at the given point""" import ifcopenshell uid = ifcopenshell.guid.new - owh = ifcfile.by_type("IfcOwnerHistory")[0] - ctx = getStructuralContext(ifcfile) - cpt = ifcbin.createIfcCartesianPoint(tuple(point)) - vtx = ifcfile.createIfcVertexPoint(cpt) - rep = ifcfile.createIfcTopologyRepresentation(ctx,'Analysis','Vertex',[vtx]) - psh = ifcfile.createIfcProductDefinitionShape(None,None,[rep]) + ownerHistory = ifcfile.by_type("IfcOwnerHistory")[0] + structContext = getStructuralContext(ifcfile) + cartPoint = ifcbin.createIfcCartesianPoint(tuple(point)) + vertPoint = ifcfile.createIfcVertexPoint(cartPoint) + topologyRep = ifcfile.createIfcTopologyRepresentation(structContext, 'Analysis', 'Vertex', [vertPoint]) + prodDefShape = ifcfile.createIfcProductDefinitionShape(None, None, [topologyRep]) # boundary conditions serve for ex. to create fixed nodes - #cnd = ifcfile.createIfcBoundaryNodeCondition("Fixed",ifcfile.createIfcBoolean(True),ifcfile.createIfcBoolean(True),ifcfile.createIfcBoolean(True),ifcfile.createIfcBoolean(True),ifcfile.createIfcBoolean(True),ifcfile.createIfcBoolean(True)) + # appliedCondition = ifcfile.createIfcBoundaryNodeCondition( + # "Fixed",ifcfile.createIfcBoolean(True), ifcfile.createIfcBoolean(True), ifcfile.createIfcBoolean(True), + # ifcfile.createIfcBoolean(True), ifcfile.createIfcBoolean(True), ifcfile.createIfcBoolean(True)) # for now we don't create any boundary condition - cnd = None - pla = ifcbin.createIfcLocalPlacement() + appliedCondition = None + localPlacement = ifcbin.createIfcLocalPlacement() if ifcfile.wrapped_data.schema_name() == "IFC2X3": - prd = ifcfile.createIfcStructuralPointConnection(uid(),owh,'Vertex',None,None,pla,psh,cnd) + structPntConn = ifcfile.createIfcStructuralPointConnection( + uid(), ownerHistory, 'Vertex', None, None, localPlacement, prodDefShape, appliedCondition) else: - prd = ifcfile.createIfcStructuralPointConnection(uid(),owh,'Vertex',None,None,pla,psh,cnd,None) - return prd + structPntConn = ifcfile.createIfcStructuralPointConnection( + uid(), ownerHistory, 'Vertex', None, None, localPlacement, prodDefShape, appliedCondition, None) + return structPntConn -def createStructuralMember(ifcfile,ifcbin,obj): +def createStructuralMember(ifcfile, ifcbin, obj): """Creates a structural member if possible. Returns the member""" global structural_nodes - prd = None + structuralMember = None import Draft import Part import ifcopenshell uid = ifcopenshell.guid.new - owh = ifcfile.by_type("IfcOwnerHistory")[0] - ctx = getStructuralContext(ifcfile) + ownerHistory = ifcfile.by_type("IfcOwnerHistory")[0] + structContext = getStructuralContext(ifcfile) # find edges to convert into structural members edges = None @@ -136,56 +143,59 @@ def createStructuralMember(ifcfile,ifcbin,obj): for edge in edges: if len(edge.Vertexes) > 1: # we don't care about curved edges just now... - v0 = edge.Vertexes[0].Point.multiply(scaling) - v1 = edge.Vertexes[-1].Point.multiply(scaling) - cp1 = ifcbin.createIfcCartesianPoint(tuple(v0)) - cp2 = ifcbin.createIfcCartesianPoint(tuple(v1)) - pla = ifcbin.createIfcLocalPlacement() - vp1 = ifcfile.createIfcVertexPoint(cp1) - vp2 = ifcfile.createIfcVertexPoint(cp2) - edg = ifcfile.createIfcEdge(vp1,vp2) - rep = ifcfile.createIfcTopologyRepresentation(ctx,'Analysis','Edge',[edg]) - psh = ifcfile.createIfcProductDefinitionShape(None,None,[rep]) + vert0 = edge.Vertexes[ 0].Point.multiply(scaling) + vert1 = edge.Vertexes[-1].Point.multiply(scaling) + cartPoint1 = ifcbin.createIfcCartesianPoint(tuple(vert0)) + cartPoint2 = ifcbin.createIfcCartesianPoint(tuple(vert1)) + localPlacement = ifcbin.createIfcLocalPlacement() + vertPoint1 = ifcfile.createIfcVertexPoint(cartPoint1) + vertPoint2 = ifcfile.createIfcVertexPoint(cartPoint2) + newEdge = ifcfile.createIfcEdge(vertPoint1, vertPoint2) + topologyRep = ifcfile.createIfcTopologyRepresentation(structContext, 'Analysis', 'Edge', [newEdge]) + prodDefShape = ifcfile.createIfcProductDefinitionShape(None, None, [topologyRep]) if ifcfile.wrapped_data.schema_name() == "IFC2X3": - prd = ifcfile.createIfcStructuralCurveMember(uid(),owh,obj.Label,None,None,pla,psh,"RIGID_JOINED_MEMBER") + structuralMember = ifcfile.createIfcStructuralCurveMember( + uid(), ownerHistory, obj.Label, None, None, localPlacement, prodDefShape, "RIGID_JOINED_MEMBER") else: - upv = ifcbin.createIfcDirection((0,0,1)) - prd = ifcfile.createIfcStructuralCurveMember(uid(),owh,obj.Label,None,None,pla,psh,"RIGID_JOINED_MEMBER",upv) + localZAxis = ifcbin.createIfcDirection((0, 0, 1)) + structuralMember = ifcfile.createIfcStructuralCurveMember( + uid(), ownerHistory, obj.Label, None, None, localPlacement, prodDefShape, "RIGID_JOINED_MEMBER", localZAxis) # check for existing connection nodes - for v in [v0,v1]: - vk = tuple(v) - if vk in structural_nodes: - if structural_nodes[vk]: + for vert in [vert0, vert1]: + vertCoord = tuple(vert) + if vertCoord in structural_nodes: + if structural_nodes[vertCoord]: # there is already another member using this point - n = structural_nodes[vk] + structPntConn = structural_nodes[vertCoord] else: # there is another member with same point, create a new node - n = createStructuralNode(ifcfile,ifcbin,v) - structural_nodes[vk] = n - ifcfile.createIfcRelConnectsStructuralMember(uid(),owh,None,None,prd,n,None,None,None,None) + structPntConn = createStructuralNode(ifcfile, ifcbin, vert) + structural_nodes[vertCoord] = structPntConn + ifcfile.createIfcRelConnectsStructuralMember( + uid(), ownerHistory, None, None, structuralMember, structPntConn, None, None, None, None) else: # just add the point, no other member using it yet - structural_nodes[vk] = None - return prd + structural_nodes[vertCoord] = None + return structuralMember def createStructuralGroup(ifcfile): - "Assigns all structural objects found in the file to the structural model""" + """Assigns all structural objects found in the file to the structural model""" import ifcopenshell uid = ifcopenshell.guid.new - owh = ifcfile.by_type("IfcOwnerHistory")[0] - edges = ifcfile.by_type("IfcStructuralCurveMember") - verts = ifcfile.by_type("IfcStructuralPointConnection") - model = ifcfile.by_type("IfcStructuralAnalysisModel")[0] - if model: - members = edges + verts + ownerHistory = ifcfile.by_type("IfcOwnerHistory")[0] + structCrvMember = ifcfile.by_type("IfcStructuralCurveMember") + structPntConn = ifcfile.by_type("IfcStructuralPointConnection") + structModel = ifcfile.by_type("IfcStructuralAnalysisModel")[0] + if structModel: + members = structCrvMember + structPntConn if members: - ifcfile.createIfcRelAssignsToGroup(uid(),owh,None,None,members,"PRODUCT",model) + ifcfile.createIfcRelAssignsToGroup(uid(), ownerHistory, None, None, members, "PRODUCT", structModel) -def associates(ifcfile,aobj,sobj): +def associates(ifcfile, aobj, sobj): """Associates an arch object with a struct object""" @@ -194,5 +204,5 @@ def associates(ifcfile,aobj,sobj): import ifcopenshell uid = ifcopenshell.guid.new - owh = ifcfile.by_type("IfcOwnerHistory")[0] - ifcfile.createIfcRelAssignsToProduct(uid(),owh,None,None,[sobj],None,aobj) + ownerHistory = ifcfile.by_type("IfcOwnerHistory")[0] + ifcfile.createIfcRelAssignsToProduct(uid(), ownerHistory, None, None, [sobj], None, aobj)