From cc3e2204e26f66ddc158aafd1f4de96edadef1de Mon Sep 17 00:00:00 2001 From: "Sigma Dimensions (Yass)" <79010126+myoualid@users.noreply.github.com> Date: Sun, 24 Sep 2023 03:17:39 +0100 Subject: [PATCH] improved template for resource csv imports --- src/ifc4d/ifc4d/csv2ifc.py | 86 ++++++++++------------- src/ifc4d/ifc4d/resource_spreadsheet.csv | 63 +++++++++++++++++ src/ifc4d/ifc4d/resource_spreadsheet.ods | Bin 0 -> 22368 bytes 3 files changed, 102 insertions(+), 47 deletions(-) create mode 100644 src/ifc4d/ifc4d/resource_spreadsheet.csv create mode 100644 src/ifc4d/ifc4d/resource_spreadsheet.ods diff --git a/src/ifc4d/ifc4d/csv2ifc.py b/src/ifc4d/ifc4d/csv2ifc.py index 7ef6a8b6d8..e60d45dd4a 100644 --- a/src/ifc4d/ifc4d/csv2ifc.py +++ b/src/ifc4d/ifc4d/csv2ifc.py @@ -20,6 +20,7 @@ import csv import ifcopenshell import ifcopenshell.api import ifcopenshell.util.unit +import datetime class Csv2Ifc: @@ -28,6 +29,14 @@ class Csv2Ifc: self.file = None self.resources = [] self.units = {} + self.resource_map = { + "CREW": "IfcCrewResource", + "LABOR": "IfcLaborResource", + "EQUIPMENT": "IfcConstructionEquipmentResource", + "SUBCONTRACTOR": "IfcSubContractResource", + "MATERIAL": "IfcConstructionMaterialResource", + "PRODUCT": "IfcConstructionProductResource", + } def execute(self): self.parse_csv() @@ -41,43 +50,46 @@ class Csv2Ifc: for row in reader: if not row[0]: continue - if row[0] == "Hierarchy": + if row[0] == "HIERARCHY": for i, col in enumerate(row): if not col: continue self.headers[col] = i continue - cost_data = self.get_row_resource_data(row) + resource_data = self.get_row_resource_data(row) hierarchy_key = int(row[0]) if hierarchy_key == 1: - self.resources.append(cost_data) + self.resources.append(resource_data) else: - self.parents[hierarchy_key - 1]["children"].append(cost_data) - self.parents[hierarchy_key] = cost_data + self.parents[hierarchy_key - 1]["children"].append(resource_data) + self.parents[hierarchy_key] = resource_data def get_row_resource_data(self, row): - name = row[self.headers["Name"]] - identification = row[self.headers["Identification"]] if "Identification" in self.headers else None + name = row[self.headers["ACTIVITY/RESOURCE NAME"]] + resource_class = self.resource_map[row[self.headers["TYPE"]]] + base_cost_value = row[self.headers["COST"]] + productivity = {} - type = row[self.headers["Type"]] - base_cost_value = row[self.headers["BaseCostValue"]] - base_cost_quantity = row[self.headers["BaseCostQuantity"]] - base_cost_unit = row[self.headers["QuantityUnit"]] + if resource_class in ["IfcConstructionEquipmentResource", "IfcLaborResource"]: + output_ratio = row[self.headers["LABOR OUTPUT"]] + if not output_ratio: + output_ratio = row[self.headers["EQUIPMENT OUTPUT"]] + if output_ratio: + time_consumed = datetime.timedelta(minutes=float(output_ratio) * 60) + time_consumed = ifcopenshell.util.date.datetime2ifc(time_consumed, "IfcDuration") - productivity = { - "BaseQuantityConsumed": row[self.headers["BaseQuantityConsumed"]], - "BaseQuantityProducedName": row[self.headers["BaseQuantityProducedName"]], - "BaseQuantityProducedValue": row[self.headers["BaseQuantityProducedValue"]], - } + productivity = { + "BaseQuantityConsumed": time_consumed, + "BaseQuantityProducedName": row[self.headers["QUANTITY NAME"]], + "BaseQuantityProducedValue": 1, + } return { - "Identification": str(identification).strip() if identification else None, "Name": str(name).strip() if name else None, - "Type": type, + "Description": row[self.headers["DESCRIPTION"]], + "class": resource_class, "BaseCostValue": float(base_cost_value) if base_cost_value else None, - "BaseCostQuantity": float(base_cost_quantity) if base_cost_quantity else None, - "Unit": str(base_cost_unit).strip() if base_cost_unit else None, - "Productivity": productivity if productivity["BaseQuantityProducedName"] else None, + "Productivity": productivity, "children": [], } @@ -92,45 +104,25 @@ class Csv2Ifc: def create_resource(self, resource, parent): if parent is None: - resource["ifc"] = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class=resource["Type"]) + resource["ifc"] = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class=resource["class"]) else: resource["ifc"] = ifcopenshell.api.run( - "resource.add_resource", self.file, parent_resource=parent, ifc_class=resource["Type"] + "resource.add_resource", self.file, parent_resource=parent, ifc_class=resource["class"] ) resource["ifc"].Name = resource["Name"] - resource["ifc"].Identification = resource["Identification"] - productivity = resource["Productivity"] - if productivity: + if resource.get("Description", None): + resource["ifc"].Description = resource.get("Description") + if resource["Productivity"]: pset = ifcopenshell.api.run("pset.add_pset", self.file, product=resource["ifc"], name="EPset_Productivity") ifcopenshell.api.run( "pset.edit_pset", self.file, pset=pset, - properties=productivity, + properties=resource["Productivity"], ) if resource["BaseCostValue"]: cost_value = ifcopenshell.api.run("cost.add_cost_value", self.file, parent=resource["ifc"]) cost_value.AppliedValue = self.file.createIfcMonetaryMeasure(resource["BaseCostValue"]) - if resource["Unit"]: - measure_class = ifcopenshell.util.unit.get_symbol_measure_class(resource["Unit"]) - print(measure_class) - value_component = self.file.create_entity(measure_class, resource["BaseCostQuantity"]) - print(value_component) - unit_component = None - if measure_class == "IfcNumericMeasure": - unit_component = self.create_unit(resource["Unit"]) - else: - unit_type = ifcopenshell.util.unit.get_measure_unit_type(measure_class) - print(unit_type) - unit_assignment = ifcopenshell.util.unit.get_unit_assignment(self.file) - if unit_assignment: - units = [u for u in unit_assignment.Units if getattr(u, "UnitType", None) == unit_type] - if units: - unit_component = units[0] - if not unit_component: - unit_component = self.create_unit(resource["Unit"], unit_type) - print(unit_component) - cost_value.UnitBasis = self.file.createIfcMeasureWithUnit(value_component, unit_component) self.create_resources(resource["children"], resource["ifc"]) def create_unit(self, symbol, unit_type): diff --git a/src/ifc4d/ifc4d/resource_spreadsheet.csv b/src/ifc4d/ifc4d/resource_spreadsheet.csv new file mode 100644 index 0000000000..47fea5d101 --- /dev/null +++ b/src/ifc4d/ifc4d/resource_spreadsheet.csv @@ -0,0 +1,63 @@ +HIERARCHY,TYPE,ACTIVITY/RESOURCE NAME,DESCRIPTION,COST,USAGE,UNIT,QUANTITY NAME,LABOR OUTPUT,EQUIPMENT OUTPUT,Productivity Unit, +1,CREW,CONCRETE WORKS,,,,,,,,, +2,LABOR,BEAMS,,,,,,,,, +3,LABOR,"Beams, 745 kg/m ",3 m span,,,Cubic Meters ,,27.3,8.61,Hr / Meter, +4,LABOR,Foreman,,25,1,Cubic Meters ,Length,27.3,,Hr / Meter, +4,LABOR, Mason,,25,4,Cubic Meters ,Length,109.2,,Hr / Meter, +4,LABOR,Carpenter &Steelman,,25,10,Cubic Meters ,Length,273,,Hr / Meter, +4,LABOR,Laborer,,25,0.25,Cubic Meters ,Length,6.825,,Hr / Meter, +4,EQUIPMENT,Crane,,25,0.125,Cubic Meters ,Length,,1.07625,Hr / Meter, +,,,,,,,,,,, +3,LABOR,"Beams, 745 kg/m ",7.5 m span,,,Cubic Meters ,,22.02,6.94,Hr / Meter, +4,LABOR,Foreman,,25,1,Cubic Meters ,Length,22.02,,Hr / Meter, +4,LABOR, Mason,,25,4,Cubic Meters ,Length,88.08,,Hr / Meter, +4,LABOR,Carpenter &Steelman,,25,10,Cubic Meters ,Length,220.2,,Hr / Meter, +4,LABOR,Laborer,,25,0.25,Cubic Meters ,Length,5.505,,Hr / Meter, +4,EQUIPMENT,Crane,,25,0.125,Cubic Meters ,Length,,0.8675,Hr / Meter, +,,,,,,,,,,, +2,LABOR,SLABS,,,,,,,,, +3,LABOR,In-situ,200 mm thick (concreting & finish only),,,Square Meters ,,0.22,0.2,Hr / Square Meters, +4,LABOR,Foreman,,25,0.5,Square Meters ,GrossArea,0.11,,Hr / Square Meters, +4,LABOR,Laborer,,25,3,Square Meters ,GrossArea,0.66,,Hr / Square Meters, +4,LABOR,Carpenter,,25,4,Square Meters ,GrossArea,0.88,,Hr / Square Meters, +4,LABOR,Steelfixers,,25,2.5,Square Meters ,GrossArea,0.55,,Hr / Square Meters, +4,EQUIPMENT,Crane,,25,0.4,Square Meters ,GrossArea,,0.08,Hr / Square Meters, +,,,,,,,,,,, +2,LABOR,FOUNDATIONS,,,,,,,,, +3,LABOR,Drainage,,25,,Meters,Length,3.5,,Hr / Meter, +,,,,,,,,,,, +,,,,,,,,,,, +2,LABOR,WATERPROOFING,,,,,,,,, +3,LABOR,Drainage,,25,,Square Meters ,GrossArea,0.5,,Hr / Square Meters, +,,,,,,,,,,, +,,,,,,,,,,, +2,LABOR,STAIRS,,,,,,,,, +3,LABOR,STAIRS,"300 mm wide (Incld. forms, rebar, & finish)",,,Cubic Meters ,,102.16,36.89,Hr / Cubic Meters, +4,LABOR,Foreman,,25,0.5,Cubic Meters ,GrossVolume,51.08,,Hr / Cubic Meters, +4,LABOR,Carpenter,,25,6,Cubic Meters ,GrossVolume,612.96,,Hr / Cubic Meters, +4,LABOR,Steelman,,25,2,Cubic Meters ,GrossVolume,204.32,,Hr / Cubic Meters, +4,LABOR,Mason,,25,2,Cubic Meters ,GrossVolume,204.32,,Hr / Cubic Meters, +4,LABOR,Laborer,,25,2.5,Cubic Meters ,GrossVolume,255.4,,Hr / Cubic Meters, +4,EQUIPMENT,Crane,,25,0.375,Cubic Meters ,GrossVolume,,13.83375,Hr / Cubic Meters, +3,LABOR,STAIRS LANDING,"Incld. forms, rebar, & finish",,,Cubic Meters ,,12.76,4.02,Hr / Cubic Meters, +4,LABOR,Foreman,,25,1,Cubic Meters ,GrossVolume,12.76,,Hr / Cubic Meters, +4,LABOR,Carpenter & SteelFixers,,25,10,Cubic Meters ,GrossVolume,127.6,,Hr / Cubic Meters, +4,LABOR,Laborer,,25,4,Cubic Meters ,GrossVolume,51.04,,Hr / Cubic Meters, +4,LABOR,Mason,,25,0.125,Cubic Meters ,GrossVolume,1.595,,Hr / Cubic Meters, +4,EQUIPMENT,Crane,,25,0.125,Cubic Meters ,GrossVolume,,0.5025,Hr / Cubic Meters, +,,,,,,,,,,, +1,CREW,MASONRY,,,,,,,,, +2,LABOR,CONCRETE BLOCKS,,,,,,,,, +3,LABOR,Hollow Blocks 100mm,100mm thick,,,Square Meters ,,1.17,0.29,Hr / Cubic Meters, +4,LABOR,Foreman,,25,0.25,Square Meters ,GrossSideArea,0.2925,,Hr / Cubic Meters, +4,LABOR,Mason,,25,4,Square Meters ,GrossSideArea,4.68,,Hr / Cubic Meters, +4,LABOR,Laborer,,25,2,Square Meters ,GrossSideArea,2.34,,Hr / Cubic Meters, +4,EQUIPMENT,Crane,,25,0.125,Square Meters ,GrossSideArea,,0.03625,Hr / Cubic Meters, +4,EQUIPMENT,Fork Lift,,25,0.125,Square Meters ,GrossSideArea,,0.03625,Hr / Cubic Meters, +4,EQUIPMENT,Truck,,25,0.125,Square Meters ,GrossSideArea,,0.03625,Hr / Cubic Meters, +3,LABOR,Hollow Blocks 200mm,100mm thick,,,Square Meters ,,1.32,0.33,Hr / Cubic Meters, +4,LABOR,Foreman,,25,0.25,Square Meters ,GrossSideArea,0.33,,Hr / Cubic Meters, +4,LABOR,Mason,,25,4,Square Meters ,GrossSideArea,5.28,,Hr / Cubic Meters, +4,LABOR,Laborer,,25,2,Square Meters ,GrossSideArea,2.64,,Hr / Cubic Meters, +4,EQUIPMENT,Crane,,25,0.125,Square Meters ,GrossSideArea,,0.5025,Hr / Cubic Meters, +4,EQUIPMENT,Fork Lift,,25,0.125,Square Meters ,GrossSideArea,,0.5025,Hr / Cubic Meters, diff --git a/src/ifc4d/ifc4d/resource_spreadsheet.ods b/src/ifc4d/ifc4d/resource_spreadsheet.ods new file mode 100644 index 0000000000000000000000000000000000000000..d2deaf274f9f597c12bbe0f91c64ee84cdb7f258 GIT binary patch literal 22368 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 NN1|CicZ8%O`5*IHEerqv literal 0 HcmV?d00001