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/
# Provides IFC4D functionality
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
# Provides Mustache templating in construction documentation
@@ -33,6 +33,7 @@ classes = (
operator.CopyCostItemValues,
operator.SelectCostItemProducts,
operator.SelectCostScheduleProducts,
operator.ImportCostScheduleCsv,
prop.CostItem,
prop.BIMCostProperties,
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():
bpy.types.Scene.BIMCostProperties = bpy.props.PointerProperty(type=prop.BIMCostProperties)
bpy.types.TOPBAR_MT_file_import.append(menu_func_import)
def unregister():
del bpy.types.Scene.BIMCostProperties
bpy.types.TOPBAR_MT_file_import.remove(menu_func_import)
@@ -1,10 +1,12 @@
import os
import bpy
import json
import time
import ifcopenshell.api
import blenderbim.bim.helper
from blenderbim.bim.module.cost.prop import purge
from blenderbim.bim.ifc import IfcStore
from bpy_extras.io_utils import ImportHelper
from ifcopenshell.api.cost.data import Data
@@ -650,3 +652,24 @@ class SelectCostScheduleProducts(bpy.types.Operator):
self.related_products.extend(cost_item["Controls"])
for child_id in cost_item["IsNestedBy"]:
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"]:
cost_value = ifcopenshell.api.run("cost.add_cost_value", self.file, parent=cost_item["ifc"])
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"]:
quantity_class = ifcopenshell.util.unit.get_symbol_quantity_class(cost_item["CostQuantitiesUnit"])
quantity = ifcopenshell.api.run(
@@ -69,8 +69,12 @@ class Data:
if cost_item.CostQuantities:
quantity = cost_item.CostQuantities[0]
unit = ifcopenshell.util.unit.get_property_unit(quantity, cls.file)
data["Unit"] = unit.id()
data["UnitSymbol"] = ifcopenshell.util.unit.get_unit_symbol(unit)
if unit:
data["Unit"] = unit.id()
data["UnitSymbol"] = ifcopenshell.util.unit.get_unit_symbol(unit)
else:
data["Unit"] = None
data["UnitSymbol"] = None
@classmethod
def load_cost_item_values(cls, cost_item, data):