| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| import xml.etree.ElementTree as ET |
|
|
| FreeCAD_On = False |
| FreeCAD_Doc = None |
| FreeCAD_ObjList = [] |
|
|
|
|
| def ParseUserData(element): |
| res = {} |
| for i in element.findall("{http://www.plmxml.org/Schemas/PLMXMLSchema}UserData"): |
| for value in i.findall("{http://www.plmxml.org/Schemas/PLMXMLSchema}UserValue"): |
| res[value.attrib["title"]] = value.attrib["value"] |
| return res |
|
|
|
|
| def addPart(partElement): |
| global FreeCAD_On, FreeCAD_Doc, FreeCAD_ObjList |
| print("=== Part ======================================================") |
| name = partElement.attrib["name"] |
| id = partElement.attrib["id"] |
| userData = ParseUserData(partElement) |
|
|
| bound = partElement.find("{http://www.plmxml.org/Schemas/PLMXMLSchema}Bound") |
| print(bound.attrib["values"]) |
|
|
| representation = partElement.find("{http://www.plmxml.org/Schemas/PLMXMLSchema}Representation") |
| format = representation.attrib["format"] |
| location = representation.attrib["location"] |
|
|
| print(id, name, userData, format, location) |
| if FreeCAD_On: |
| import FreeCAD, Assembly |
|
|
| print("Create Reference") |
| partObject = FreeCAD_Doc.addObject("App::Part", id) |
| FreeCAD_ObjList.append(partObject) |
| partObject.Label = name |
| partObject.Meta = userData |
|
|
|
|
| def addAssembly(asmElement): |
| global FreeCAD_On, FreeCAD_Doc, FreeCAD_ObjList |
| print("=== Assembly ======================================================") |
| userData = ParseUserData(asmElement) |
| name = asmElement.attrib["name"] |
| id = asmElement.attrib["id"] |
| instanceRefs = asmElement.attrib["instanceRefs"] |
| userData["instanceRefs"] = instanceRefs |
|
|
| print(id, name, instanceRefs, userData) |
| if FreeCAD_On: |
| import FreeCAD, Assembly |
|
|
| print("Create Reference") |
| admObject = FreeCAD_Doc.addObject("Assembly::Product", id) |
| FreeCAD_ObjList.append(admObject) |
| admObject.Label = name |
| admObject.Meta = userData |
|
|
|
|
| def addReference(refElement): |
| global FreeCAD_On, FreeCAD_Doc, FreeCAD_ObjList |
| print("=== Reference ======================================================") |
| userData = ParseUserData(refElement) |
| partRef = refElement.attrib["partRef"][1:] |
| userData["partRef"] = partRef |
| id = refElement.attrib["id"] |
| name = refElement.attrib["name"] |
| transform = refElement.find("{http://www.plmxml.org/Schemas/PLMXMLSchema}Transform") |
| mtrx = [float(i) for i in transform.text.split(" ")] |
| print(mtrx) |
| print(id, name, partRef) |
|
|
| if FreeCAD_On: |
| import FreeCAD, Assembly |
|
|
| print("Create Reference") |
| refObject = FreeCAD_Doc.addObject("Assembly::ProductRef", id) |
| FreeCAD_ObjList.append(refObject) |
| refObject.Label = name |
| refObject.Meta = userData |
|
|
|
|
| def resolveRefs(): |
| global FreeCAD_On, FreeCAD_Doc, FreeCAD_ObjList |
| print("=== Resolve References ======================================================") |
| if FreeCAD_On: |
| for i in FreeCAD_ObjList: |
| if i.TypeId == "Assembly::Product": |
| objectList = [] |
| for l in i.Meta["instanceRefs"].split(" "): |
| objectList.append(FreeCAD_Doc.getObject(l)) |
| i.Items = objectList |
| if i.TypeId == "Assembly::ProductRef": |
| i.Item = FreeCAD_Doc.getObject(i.Meta["partRef"]) |
|
|
|
|
| def open(fileName): |
| """called when freecad opens an PlmXml file""" |
| global FreeCAD_On, FreeCAD_Doc |
| import FreeCAD, os |
|
|
| docname = os.path.splitext(os.path.basename(fileName))[0] |
| doc = FreeCAD.newDocument(docname) |
| message = 'Started with opening of "' + fileName + '" file\n' |
| FreeCAD.Console.PrintMessage(message) |
| FreeCAD_Doc = doc |
| FreeCAD_On = True |
| parse(fileName) |
| resolveRefs() |
|
|
|
|
| def insert(filename, docname): |
| """called when freecad imports an PlmXml file""" |
| global FreeCAD_On, FreeCAD_Doc |
| import FreeCAD |
|
|
| FreeCAD.setActiveDocument(docname) |
| doc = FreeCAD.getDocument(docname) |
| FreeCAD.Console.PrintMessage('Started import of "' + filename + '" file') |
| FreeCAD_Doc = doc |
| FreeCAD_On = True |
| parse(fileName) |
| resolveRefs() |
|
|
|
|
| def main(): |
| parse("../../../../data/tests/Jt/Engine/2_Cylinder_Engine3.plmxml") |
|
|
|
|
| def parse(fileName): |
|
|
| tree = ET.parse(fileName) |
| root = tree.getroot() |
| ProductDef = root.find("{http://www.plmxml.org/Schemas/PLMXMLSchema}ProductDef") |
|
|
| res = ParseUserData(ProductDef.find("{http://www.plmxml.org/Schemas/PLMXMLSchema}UserData")) |
|
|
| InstanceGraph = ProductDef.find("{http://www.plmxml.org/Schemas/PLMXMLSchema}InstanceGraph") |
|
|
| |
| Instances = InstanceGraph.findall("{http://www.plmxml.org/Schemas/PLMXMLSchema}Instance") |
| Parts = InstanceGraph.findall("{http://www.plmxml.org/Schemas/PLMXMLSchema}Part") |
| ProductInstances = InstanceGraph.findall( |
| "{http://www.plmxml.org/Schemas/PLMXMLSchema}ProductInstance" |
| ) |
| ProductRevisionViews = InstanceGraph.findall( |
| "{http://www.plmxml.org/Schemas/PLMXMLSchema}ProductRevisionView" |
| ) |
|
|
| instanceTypesSet = set() |
| for child in InstanceGraph: |
| instanceTypesSet.add(child.tag) |
| print("All types below the InstanceGraph:") |
| for i in instanceTypesSet: |
| print(i) |
| print("") |
|
|
| print(len(Instances), "\t{http://www.plmxml.org/Schemas/PLMXMLSchema}Instance") |
| print(len(Parts), "\t{http://www.plmxml.org/Schemas/PLMXMLSchema}Part") |
| print(len(ProductInstances), "\t{http://www.plmxml.org/Schemas/PLMXMLSchema}ProductInstance") |
| print( |
| len(ProductRevisionViews), |
| "\t{http://www.plmxml.org/Schemas/PLMXMLSchema}ProductRevisionView", |
| ) |
|
|
| |
| for child in Instances: |
| addReference(child) |
|
|
| |
| for child in Parts: |
| if "type" in child.attrib: |
| if child.attrib["type"] == "solid": |
| addPart(child) |
| continue |
| if child.attrib["type"] == "assembly": |
| addAssembly(child) |
| continue |
| print("Unknown Part type:", child) |
| else: |
| print("not Type in Part", child) |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|