You can now import cost schedules as CSVs into IFC in Blender

This commit is contained in:
Dion Moult
2021-08-09 17:12:23 +10:00
parent 09098c1bdc
commit d4fc135209
5 changed files with 41 additions and 2 deletions
+2
View File
@@ -118,6 +118,8 @@ endif
cp -r dist/working/IfcOpenShell-0.6.0/src/ifcpatch/ifcpatch dist/blenderbim/libs/site/packages/ cp -r dist/working/IfcOpenShell-0.6.0/src/ifcpatch/ifcpatch dist/blenderbim/libs/site/packages/
# Provides IFC4D functionality # Provides IFC4D functionality
cp -r dist/working/IfcOpenShell-0.6.0/src/ifc4d/ifc4d dist/blenderbim/libs/site/packages/ cp -r dist/working/IfcOpenShell-0.6.0/src/ifc4d/ifc4d dist/blenderbim/libs/site/packages/
# Provides IFC5D functionality
cp -r dist/working/IfcOpenShell-0.6.0/src/ifc5d/ifc5d dist/blenderbim/libs/site/packages/
rm -rf dist/working rm -rf dist/working
# Provides Mustache templating in construction documentation # Provides Mustache templating in construction documentation
@@ -33,6 +33,7 @@ classes = (
operator.CopyCostItemValues, operator.CopyCostItemValues,
operator.SelectCostItemProducts, operator.SelectCostItemProducts,
operator.SelectCostScheduleProducts, operator.SelectCostScheduleProducts,
operator.ImportCostScheduleCsv,
prop.CostItem, prop.CostItem,
prop.BIMCostProperties, prop.BIMCostProperties,
ui.BIM_PT_cost_schedules, ui.BIM_PT_cost_schedules,
@@ -40,9 +41,15 @@ classes = (
) )
def menu_func_import(self, context):
self.layout.operator(operator.ImportCostScheduleCsv.bl_idname, text="Cost Schedule (.csv)")
def register(): def register():
bpy.types.Scene.BIMCostProperties = bpy.props.PointerProperty(type=prop.BIMCostProperties) bpy.types.Scene.BIMCostProperties = bpy.props.PointerProperty(type=prop.BIMCostProperties)
bpy.types.TOPBAR_MT_file_import.append(menu_func_import)
def unregister(): def unregister():
del bpy.types.Scene.BIMCostProperties del bpy.types.Scene.BIMCostProperties
bpy.types.TOPBAR_MT_file_import.remove(menu_func_import)
@@ -1,10 +1,12 @@
import os import os
import bpy import bpy
import json import json
import time
import ifcopenshell.api import ifcopenshell.api
import blenderbim.bim.helper import blenderbim.bim.helper
from blenderbim.bim.module.cost.prop import purge from blenderbim.bim.module.cost.prop import purge
from blenderbim.bim.ifc import IfcStore from blenderbim.bim.ifc import IfcStore
from bpy_extras.io_utils import ImportHelper
from ifcopenshell.api.cost.data import Data from ifcopenshell.api.cost.data import Data
@@ -650,3 +652,24 @@ class SelectCostScheduleProducts(bpy.types.Operator):
self.related_products.extend(cost_item["Controls"]) self.related_products.extend(cost_item["Controls"])
for child_id in cost_item["IsNestedBy"]: for child_id in cost_item["IsNestedBy"]:
self.get_related_products(Data.cost_items[child_id]) self.get_related_products(Data.cost_items[child_id])
class ImportCostScheduleCsv(bpy.types.Operator, ImportHelper):
bl_idname = "import_cost_schedule_csv.bim"
bl_label = "Import Cost Schedule CSV"
bl_options = {"REGISTER", "UNDO"}
filename_ext = ".csv"
filter_glob: bpy.props.StringProperty(default="*.csv", options={"HIDDEN"})
def execute(self, context):
from ifc5d.csv2ifc import Csv2Ifc
self.file = IfcStore.get_file()
start = time.time()
csv2ifc = Csv2Ifc()
csv2ifc.csv = self.filepath
csv2ifc.file = self.file
csv2ifc.execute()
Data.load(IfcStore.get_file())
print("Import finished in {:.2f} seconds".format(time.time() - start))
return {"FINISHED"}
+3
View File
@@ -77,6 +77,9 @@ class Csv2Ifc:
if cost_item["CostValues"]: if cost_item["CostValues"]:
cost_value = ifcopenshell.api.run("cost.add_cost_value", self.file, parent=cost_item["ifc"]) cost_value = ifcopenshell.api.run("cost.add_cost_value", self.file, parent=cost_item["ifc"])
cost_value.AppliedValue = self.file.createIfcReal(cost_item["CostValues"]) cost_value.AppliedValue = self.file.createIfcReal(cost_item["CostValues"])
else:
cost_value = ifcopenshell.api.run("cost.add_cost_value", self.file, parent=cost_item["ifc"])
cost_value.Category = "*"
if cost_item["CostQuantities"]: if cost_item["CostQuantities"]:
quantity_class = ifcopenshell.util.unit.get_symbol_quantity_class(cost_item["CostQuantitiesUnit"]) quantity_class = ifcopenshell.util.unit.get_symbol_quantity_class(cost_item["CostQuantitiesUnit"])
quantity = ifcopenshell.api.run( quantity = ifcopenshell.api.run(
@@ -69,8 +69,12 @@ class Data:
if cost_item.CostQuantities: if cost_item.CostQuantities:
quantity = cost_item.CostQuantities[0] quantity = cost_item.CostQuantities[0]
unit = ifcopenshell.util.unit.get_property_unit(quantity, cls.file) unit = ifcopenshell.util.unit.get_property_unit(quantity, cls.file)
data["Unit"] = unit.id() if unit:
data["UnitSymbol"] = ifcopenshell.util.unit.get_unit_symbol(unit) data["Unit"] = unit.id()
data["UnitSymbol"] = ifcopenshell.util.unit.get_unit_symbol(unit)
else:
data["Unit"] = None
data["UnitSymbol"] = None
@classmethod @classmethod
def load_cost_item_values(cls, cost_item, data): def load_cost_item_values(cls, cost_item, data):