From f2097c0c5f5cad3099961eda09bd8211f44d03cd Mon Sep 17 00:00:00 2001 From: "Sigma Dimensions (Yass)" <79010126+myoualid@users.noreply.github.com> Date: Fri, 29 Sep 2023 16:10:16 +0100 Subject: [PATCH] importing csv cost schedules now allows using selector queries for effortless product assignments to cost items, and add new ods and csv format templates (in french) --- src/ifc5d/ifc5d/csv2ifc.py | 34 ++++- src/ifc5d/sample_cost_schedule_house_FR.csv | 147 ++++++++++++++++++++ src/ifc5d/sample_cost_schedule_house_FR.ods | Bin 0 -> 20627 bytes 3 files changed, 178 insertions(+), 3 deletions(-) create mode 100644 src/ifc5d/sample_cost_schedule_house_FR.csv create mode 100644 src/ifc5d/sample_cost_schedule_house_FR.ods diff --git a/src/ifc5d/ifc5d/csv2ifc.py b/src/ifc5d/ifc5d/csv2ifc.py index 7632b10f44..11e14365cd 100644 --- a/src/ifc5d/ifc5d/csv2ifc.py +++ b/src/ifc5d/ifc5d/csv2ifc.py @@ -20,6 +20,8 @@ import csv import ifcopenshell import ifcopenshell.api import ifcopenshell.util.unit +import ifcopenshell.util.selector +import ifcopenshell.util.element import locale @@ -67,11 +69,15 @@ class Csv2Ifc: identification = row[self.headers["Identification"]] if "Identification" in self.headers else None quantity = row[self.headers["Quantity"]] unit = row[self.headers["Unit"]] + assignments = { + "PropertyName": row[self.headers["Property"]], + "Query": row[self.headers["Query"]], + } if self.has_categories: cost_values = { k: locale.atof(row[v]) for k, v in self.headers.items() - if k not in ["Hierarchy", "Identification", "Name", "Quantity", "Unit", "Subtotal"] and row[v] + if k not in ["Hierarchy", "Identification", "Name", "Quantity", "Unit", "Subtotal", "Property", "Query"] and row[v] } else: cost_values = row[self.headers["Value"]] @@ -82,6 +88,7 @@ class Csv2Ifc: "Quantity": float(quantity) if quantity else None, "Unit": str(unit) if unit else None, "CostValues": cost_values, + "assignments": assignments, "children": [], } @@ -107,7 +114,7 @@ class Csv2Ifc: cost_item["ifc"].Name = cost_item["Name"] cost_item["ifc"].Identification = cost_item["Identification"] - if not cost_item["CostValues"]: + if not cost_item["CostValues"] and cost_item["children"]: if not self.is_schedule_of_rates: cost_value = ifcopenshell.api.run("cost.add_cost_value", self.file, parent=cost_item["ifc"]) cost_value.Category = "*" @@ -115,7 +122,11 @@ class Csv2Ifc: for category, value in cost_item["CostValues"].items(): cost_value = ifcopenshell.api.run("cost.add_cost_value", self.file, parent=cost_item["ifc"]) cost_value.AppliedValue = self.file.createIfcMonetaryMeasure(value) - cost_value.Category = category + if category != "Rate" or category != "Price": + if "Rate" in category or"Price" in category: + category = category.replace("Rate","") + category = category.strip() + cost_value.Category = category else: cost_value = ifcopenshell.api.run("cost.add_cost_value", self.file, parent=cost_item["ifc"]) cost_value.AppliedValue = self.file.createIfcMonetaryMeasure(cost_item["CostValues"]) @@ -144,6 +155,15 @@ class Csv2Ifc: "cost.add_cost_item_quantity", self.file, cost_item=cost_item["ifc"], ifc_class=quantity_class ) quantity[3] = cost_item["Quantity"] + + if cost_item["assignments"]["PropertyName"] and cost_item["assignments"]["Query"]: + print("for query",cost_item["assignments"]["Query"]) + results = ifcopenshell.util.selector.filter_elements(self.file, cost_item["assignments"]["Query"]) + + results = [r for r in results if has_property(self.file, r, cost_item["assignments"]["PropertyName"])] + if results: + ifcopenshell.api.run("cost.assign_cost_item_quantity", self.file, cost_item=cost_item["ifc"], products=results, prop_name=cost_item["assignments"]["PropertyName"]) + self.create_cost_items(cost_item["children"], cost_item["ifc"]) def create_unit(self, symbol): @@ -158,3 +178,11 @@ class Csv2Ifc: def create_boilerplate_ifc(self): self.file = ifcopenshell.file(schema="IFC4") + +def has_property(self, product, property_name): + qtos = ifcopenshell.util.element.get_psets(product, qtos_only=True) + for qset, quantities in qtos.items(): + for quantity, value in quantities.items(): + if quantity == property_name: + return True + return False \ No newline at end of file diff --git a/src/ifc5d/sample_cost_schedule_house_FR.csv b/src/ifc5d/sample_cost_schedule_house_FR.csv new file mode 100644 index 0000000000..18480f0873 --- /dev/null +++ b/src/ifc5d/sample_cost_schedule_house_FR.csv @@ -0,0 +1,147 @@ +Hierarchy,Identification,Name,Quantity,Unit,Contract,Rate,Material Rate,Labor Rate,Subtotal,Property,Query +1,DB,Design and build,,,,,,,,, +2,DB.1,Design,,,,,,,,, +3,DB.1.1,Architecte,1,unit,40000,,,,40000,, +3,DB.1.2,Bet structure,1,unit,10000,,,,10000,, +3,DB.1.3,Bet lots techniques,1,unit,8000,,,,8000,, +2,DB.2,Construction,,,,,,,,, +3,DB.2.1,Go & etancheite,,,,,,,,, +4,DB.2.1.1,Gros oeuvre,,,,,,,,, +4,DB.2.1.2,Etancheite,,,,,,,,, +5,DB.2.1.2.1,Forme de pente et chape de lissage,,,,97,,,,NetArea,"IfcSlab, location=Roof" +5,DB.2.1.2.2,Ecran pare-vapeur et isolation thermique,,,,47,,,,NetArea,"IfcSlab, location=Roof" +5,DB.2.1.2.3,Systeme d’etancheite bicouche,,,,23,,,,NetArea,"IfcCovering, type=Etancheite_H" +5,DB.2.1.2.4,Reliefs d’etancheite bicouche,,,,7,,,,Length,"IfcWall, type=”BLK150”, location=Roof" +5,DB.2.1.2.5,Protection horizontales d’etancheite par carreaux de ciment,,,,,,,,NetArea,"IfcCovering, type=Etancheite_H" +5,DB.2.1.2.6,Protection des reliefs d’etancheite,,,,,,,,, +5,DB.2.1.2.7,Etancheite legere,,,,,,,,, +5,DB.2.1.2.8,Fourniture et pose de gargouilles y compris crapaudines,3,unit,,,,,,, +,,,,,,,,,,, +4,DB.2.1.3,Gros oeuvre piscine,,,,,,,,, +5,DB.2.1.3.1,Fouilles en pleine masse dans tous terrains y compris rocher,,,,,,,,, +5,DB.2.1.3.2,Remblaiement ou evacuation aux decharges publiques,,,,,,,,, +5,DB.2.1.3.3,Beton de proprete,,,,,,,,, +5,DB.2.1.3.4,Beton hydrofuge pour tous les ouvrages en fondation et elevation,,,,,,,,, +5,DB.2.1.3.5,Aciers a haute limite elastique fe500 pour les ouvrages en fondation et elevation,,,,,,,,, +,,,,,,,,,,, +4,DB.2.1.4,Maconnerie et briquetage en elevation,,,,,,,,, +5,DB.2.1.5.1,Cloisons en briques creuses 7t,,,,,,,,, +5,DB.2.1.5.2,Doubles cloisons en briques creuses 7t+vide10+7t,,,,,,,,, +,,,,,,,,,,, +,,,,,,,,,,, +4,DB.2.1.5,Enduits interieurs et exterieurs,,,,,,,,, +5,DB.2.1.5.1,"Enduit interieur au mortier de ciment sur murs et plafonds y +Compris baguettes d'angles",,,,,,,,, +5,DB.2.1.5.1.1,Enduit interieur au platre,,,,,,,,, +5,DB.2.1.5.1.2,"Enduit projete exterieur au mortier de ciment y compris baguettes +D'angles",,,,,,,,, +5,DB.2.1.5.1.3,Enduit de couronnement d'acroteres y compris facon de larmier,,,,,,,,, +,,,,,,,,,,, +4,DB.2.1.5,Reseaux sous dallage,,,,,,,,, +5,DB.2.1.5.1,Canalisation en buse pvc type assainissement serie i,,,,,,,,, +6,DB.2.1.5.1.1,Tranchee ,,,,,,,,, +6,DB.2.1.5.1.2,P.v.c diametre de 200 mm,,,,,,,,, +,,,,,,,,,,, +5,DB.2.1.5.2,Regards en beton arme ,,,,,,,,, +6,DB.2.1.5.2.1,Regards visitable de 50x50 cm,,,,,,,,, +6,DB.2.1.5.2.2,Regards non visitable de 40x40 cm,,,,,,,,, +4,DB.2.1.5,Divers,,,,,,,,, +5,DB.2.1.5.1,Gaine technique d’aeration et habillage des descentes des eaux ,,,,,,,,, +,,,,,,,,,,, +3,DB.2.2,Fluides,,,,,,,,, +4,DB.2.2.1,Plomberie,,,,,,,,, +4,DB.2.2.2,Climatisation,,,,,,,,, +4,DB.2.2.3,Sanitaire,,,,,,,,, +3,DB.2.3,Electricite,,,,,,,,, +4,DB.2.3.1,Eclairage et appareillage,,,,,,,,, +4,DB.2.3.2,Panneaux solaires,,,,,,,,, +3,DB.2.4,Architecture interieure,,,,,,,,, +4,DB.2.4.1,Menuiserie metallique,,,,,,,,, +5,DB.2.4.1.1,G.c 1 en vitrage bord àbord 10*10*2(1unite) rail en alu encastre,,,,,,,,, +5,DB.2.4.1.2,G.c 2 en vitrage bord àbord 10*10*2(1unite) rail en alu encastre,,,,,,,,, +,,,,,,,,,,, +4,DB.2.4.2,Menuiserie bois,,,,,,,,, +5,DB.2.4.2.1,Portes,,,,,,,,, +6,DB.2.4.2.1.1,P1,,,,,,,,Count,"IfcDoor, type=P1" +6,DB.2.4.2.1.2,P2,,,,,,,,Count,"IfcDoor, type=P2-LEFT + IfcDoor, type=P2-RIGHT" +6,DB.2.4.2.1.3,P3,,,,,,,,Count,"IfcDoor, type=P3-LEFT + IfcDoor, type=P3-RIGHT" +,,,,,,,,,,, +5,DB.2.4.2.2,Placards et habillage,,,,,,,,, +6,DB.2.4.2.2.1,Fourniture placard type 1,,,,,,,,, +6,DB.2.4.2.2.2,Fourniture placard type 2,,,,,,,,, +6,DB.2.4.2.2.3,Fourniture placard type 3 ,,,,,,,,, +6,DB.2.4.2.2.3,Fourniture placard type 4,,,,,,,,, +,,,,,,,,,,, +4,DB.2.4.3,Revetement sol parquet,,,,,,,,, +5,DB.2.4.3.1,Fourniture parquet contrecolle 18mm dont epaisseur noyer americain 3mm,,,,,300,,,NetArea,"IfcCovering, type=RS-2" +5,DB.2.4.3.2,Fournitur basic underlay,,,,,50,,,NetArea,"IfcCovering, type=RS-2" +5,DB.2.4.3.3,"Fourniture profilpas finition laiton 2,5mm",,,,,20,,,Width,IfcDoor +5,DB.2.4.3.4,"Pose du parquet y compris isolant acoustique, chappe de ciment, sous-couche et barre de seuil",,,,,,74,,NetArea,"IfcCovering, type=RS-2" +,,,,,,,,,,, +4,DB.2.4.4,Revetement sol marbre,,,,,,,,, +5,DB.2.4.4.1,Fourniture marbre sols,,,,,,,,NetArea,"IfcCovering, type=RS-5" +5,DB.2.4.4.2,Fourniture marbre- sols sdb,,,,,,,,NetArea,"IfcCovering, type=RS-2" +5,DB.2.4.4.3,Fourniture marbre murs sdb ,,,,,,,,, +5,DB.2.4.4.4,Fourniture marbre marche escalier y/c nez,,,,,,,,, +5,DB.2.4.4.5,Pose marbre sols y compris chappe de ciment,,,,,,,,, +5,DB.2.4.4.6,Pose marbre murs,,,,,,,,, +5,DB.2.4.4.7,Pose marbre marches,,,,,,,,, +,,,,,,,,,,, +4,DB.2.4.5,Revetement carreaux,,,,,,,,, +5,DB.2.4.5.1,Revetements,,,,,,,,, +6,DB.2.4.5.1.1,Revêtement sol: cuisine - carreaux - gres cerame (30*60cm) - choix sous validation d'echantillons par l'architecte et le maitre d'ouvrage,,,,,,,,, +6,DB.2.4.5.1.2,Revêtement sol: salle de jeux - carreaux - gres cerame (30*60cm) - choix sous validation d'echantillons par l'architecte et le maitre d'ouvrage,,,,,,,,, +6,DB.2.4.5.1.3,Revêtement sol: (reserve) - gres cerame (30*60cm) - choix sous validation d'echantillons par l'architecte et le maitre d'ouvrage - ,,,,,,,,, +6,DB.2.4.5.1.4,Revêtement mural cuisine - carreaux - effet vitrage noir,,,,,,,,, +5,DB.2.4.5.2,Plinthes,,,,,,,,, +6,DB.2.4.5.2.1,Plinthes - duropolymer orac decor ref : sx157,,,,,,,,, +6,DB.2.4.5.2.2,Plinthes marches - - duropolymer orac decor ref : sx157,,,,,,,,, +,,,,,,,,,,, +4,DB.2.4.6,Peinture,,,,,,,,, +5,DB.2.4.6.1,Fourniture et pose peinture murs - marmorex astral y/c preparation (5 couches),,,,,,,,, +5,DB.2.4.6.2,Fourniture et pose peinture contremarche escalier - marmorex astral y/c preparation (5 couches,,,,,,,,, +5,DB.2.4.6.3,Fourniture et pose peinture murs cuisine - alpha tacto astral y/c preparation (5 couches),,,,,,,,, +5,DB.2.4.6.4,Foruniture et pose peinture faux-plafond - jotun acrylique mate blanc y/c preparation (5 couches),,,,,,,,, +5,DB.2.4.6.5,Fourniture et pose peinture murs sdb - jotun acrylique semi-brillant blanc special piece humide y/c preparation (5 couches),,,,,,,,, +5,DB.2.4.6.6,Fourniture et pose peinture faux-plafond sdb + cuisine - jotun acrylique semi-brillant blanc special piece humide y/c preparation (5 couches),,,,,,,,, +,,,,,,,,,,, +4,DB.2.4.7,Faux plafonds,,,,,,,,, +5,DB.2.4.7.1,Type 1,,,,,,,,, +5,DB.2.4.7.2,Type 2,,,,,,,,, +5,DB.2.4.7.3,Type 3 – hydrofuge – exterieur,,,,,,,,, +5,DB.2.4.7.4,Trappes d’acces,,,,,,,,, +,,,,,,,,,,, +4,DB.2.4.8,Cuisine,1,unit,,,,,,, +,,,,,,,,,,, +3,DB.2.5,Facade,,,,,,,,, +4,DB.2.5.1,Revetement exterieur ,,,,,,,,, +5,DB.2.5.1.1,Revetement mural: plus value enduit mural hydrofuge (monocouche),,,,,,,,, +5,DB.2.5.1.2,Revetement mural: pierre volcanique grise ,,,,,,,,, +5,DB.2.5.1.3,Revetement mural: bardage en bois iroko ou tole alu section carre ou rectangulaire avec habillage bois technowood (voir detail architecte),,,,,,,,, +5,DB.2.5.1.4,Revêtement sol: terrasses et cour - tech - choix sous validation d'echantillons par l'architecte et le maitre d'ouvrage ,,,,,,,,, +5,DB.2.5.1.5,Revetement sol: seuill entree en pierre de taza,,,,,,,,, +5,DB.2.5.1.6,Revetement sol: sous bassement perimetre villa en pierre de taza ,,,,,,,,, +,,,,,,,,,,, +4,DB.2.5.2,Menuiserie aluminium,,,,,,,,, +5,DB.2.5.2.1,Fenetres,,,,,,,,, +6,DB.2.5.2.1.1,F1,,,,,,,,, +6,DB.2.5.2.1.2,F2,,,,,,,,, +,,,,,,,,,,, +5,DB.2.5.2.2,Chassis ouvrants,,,,,,,,, +6,DB.2.5.2.2.1,Ch1,,,,,,,,, +6,DB.2.5.2.2.2,Ch2,,,,,,,,, +6,DB.2.5.2.2.3,Ch3,,,,,,,,, +,,,,,,,,,,, +5,DB.2.5.2.3,Portes coulissantes/ mur rideau,,,,,,,,, +6,DB.2.5.2.3.1,P4,,,,,,,,, +6,DB.2.5.2.3.2,P5,,,,,,,,, +6,DB.2.5.2.3.3,P6,,,,,,,,, +,,,,,,,,,,, +5,DB.2.5.2.4,Volets roulants,,,,,,,,, +6,DB.2.5.2.4.1,Type 1,,,,,,,,, +6,DB.2.5.2.4.2,Type 2,,,,,,,,, +6,DB.2.5.2.4.3,Type 3,,,,,,,,, +3,DB.2.6,Exterieur,,,,,,,,, +4,DB.2.6.1,Cloture,,,,,,,,, +4,DB.2.6.2,Piscine,,,,,,,,, +4,DB.2.6.3,Jardin,,,,,,,,, diff --git a/src/ifc5d/sample_cost_schedule_house_FR.ods b/src/ifc5d/sample_cost_schedule_house_FR.ods new file mode 100644 index 0000000000000000000000000000000000000000..3d8cb6bb1bd9a88dc312bf960788532ab261323a GIT binary patch literal 20627 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