mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-26 18:21:59 +00:00
Allow for wildcard expansion in IFCCSV export
This commit is contained in:
@@ -2815,7 +2815,7 @@ class ExportIfcCsv(bpy.types.Operator):
|
|||||||
ifc_csv = ifccsv.IfcCsv()
|
ifc_csv = ifccsv.IfcCsv()
|
||||||
ifc_csv.output = self.filepath
|
ifc_csv.output = self.filepath
|
||||||
ifc_csv.attributes = [a.name for a in bpy.context.scene.BIMProperties.csv_attributes]
|
ifc_csv.attributes = [a.name for a in bpy.context.scene.BIMProperties.csv_attributes]
|
||||||
ifc_csv.export(ifc_selector_parser.results)
|
ifc_csv.export(ifc_selector_parser.file, ifc_selector_parser.results)
|
||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+25
-5
@@ -176,7 +176,7 @@ class IfcAttributeExtractor():
|
|||||||
return getattr(element, key)
|
return getattr(element, key)
|
||||||
elif '.' not in key:
|
elif '.' not in key:
|
||||||
return None
|
return None
|
||||||
pset_name, prop = key.split('.')
|
pset_name, prop = key.split('.', 1)
|
||||||
pset = IfcAttributeExtractor.get_element_pset(element, pset_name)
|
pset = IfcAttributeExtractor.get_element_pset(element, pset_name)
|
||||||
if pset:
|
if pset:
|
||||||
return IfcAttributeExtractor.get_pset_property(pset, prop)
|
return IfcAttributeExtractor.get_pset_property(pset, prop)
|
||||||
@@ -192,11 +192,11 @@ class IfcAttributeExtractor():
|
|||||||
if '.' not in key:
|
if '.' not in key:
|
||||||
return
|
return
|
||||||
if key[0:3] == 'Qto':
|
if key[0:3] == 'Qto':
|
||||||
qto, prop = key.split('.')
|
qto, prop = key.split('.', 1)
|
||||||
qto = IfcAttributeExtractor.get_element_qto(element, qto_name)
|
qto = IfcAttributeExtractor.get_element_qto(element, qto_name)
|
||||||
if qto:
|
if qto:
|
||||||
return IfcAttributeExtractor.set_qto_property(qto, prop, value)
|
return IfcAttributeExtractor.set_qto_property(qto, prop, value)
|
||||||
pset_name, prop = key.split('.')
|
pset_name, prop = key.split('.', 1)
|
||||||
pset = IfcAttributeExtractor.get_element_pset(element, pset_name)
|
pset = IfcAttributeExtractor.get_element_pset(element, pset_name)
|
||||||
if pset:
|
if pset:
|
||||||
return IfcAttributeExtractor.set_pset_property(pset, prop, value)
|
return IfcAttributeExtractor.set_pset_property(pset, prop, value)
|
||||||
@@ -257,13 +257,20 @@ class IfcCsv():
|
|||||||
self.attributes = []
|
self.attributes = []
|
||||||
self.output = ''
|
self.output = ''
|
||||||
|
|
||||||
def export(self, elements):
|
def export(self, ifc_file, elements):
|
||||||
|
self.ifc_file = ifc_file
|
||||||
for element in elements:
|
for element in elements:
|
||||||
result = []
|
result = []
|
||||||
if hasattr(element, 'GlobalId'):
|
if hasattr(element, 'GlobalId'):
|
||||||
result.append(element.GlobalId)
|
result.append(element.GlobalId)
|
||||||
else:
|
else:
|
||||||
result.append(None)
|
result.append(None)
|
||||||
|
|
||||||
|
for index, attribute in enumerate(self.attributes):
|
||||||
|
if '*' in attribute:
|
||||||
|
self.attributes.extend(self.get_wildcard_attributes(attribute))
|
||||||
|
del(self.attributes[index])
|
||||||
|
|
||||||
for attribute in self.attributes:
|
for attribute in self.attributes:
|
||||||
result.append(IfcAttributeExtractor.get_element_key(element, attribute))
|
result.append(IfcAttributeExtractor.get_element_key(element, attribute))
|
||||||
self.results.append(result)
|
self.results.append(result)
|
||||||
@@ -276,6 +283,19 @@ class IfcCsv():
|
|||||||
for row in self.results:
|
for row in self.results:
|
||||||
writer.writerow(row)
|
writer.writerow(row)
|
||||||
|
|
||||||
|
def get_wildcard_attributes(self, attribute):
|
||||||
|
results = set()
|
||||||
|
pset_qto_name = attribute.split('.', 1)[0]
|
||||||
|
for element in self.ifc_file.by_type('IfcPropertySet') + self.ifc_file.by_type('IfcElementQuantity'):
|
||||||
|
print(element)
|
||||||
|
if element.Name != pset_qto_name:
|
||||||
|
continue
|
||||||
|
if element.is_a('IfcPropertySet'):
|
||||||
|
results.update([p.Name for p in element.HasProperties])
|
||||||
|
else:
|
||||||
|
results.update([p.Name for p in element.Quantities])
|
||||||
|
return ['{}.{}'.format(pset_qto_name, n) for n in results]
|
||||||
|
|
||||||
def Import(self, ifc):
|
def Import(self, ifc):
|
||||||
ifc_file = ifcopenshell.open(ifc)
|
ifc_file = ifcopenshell.open(ifc)
|
||||||
with open(self.output, newline='', encoding='utf-8') as f:
|
with open(self.output, newline='', encoding='utf-8') as f:
|
||||||
@@ -338,7 +358,7 @@ if __name__ == '__main__':
|
|||||||
ifc_csv = IfcCsv()
|
ifc_csv = IfcCsv()
|
||||||
ifc_csv.output = args.csv
|
ifc_csv.output = args.csv
|
||||||
ifc_csv.attributes = args.arguments if args.arguments else []
|
ifc_csv.attributes = args.arguments if args.arguments else []
|
||||||
ifc_csv.export(ifc_selector_parser.results)
|
ifc_csv.export(ifc_selector_parser.file, ifc_selector_parser.results)
|
||||||
elif getattr(args, 'import'):
|
elif getattr(args, 'import'):
|
||||||
ifc_csv = IfcCsv()
|
ifc_csv = IfcCsv()
|
||||||
ifc_csv.output = args.csv
|
ifc_csv.output = args.csv
|
||||||
|
|||||||
Reference in New Issue
Block a user