mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-27 02:31:09 +00:00
Add new feature to Load from IFCStore in Cobie (#1253)
Co-authored-by: Ihab El Aghoury <ihab_elaghoury@yahoo.ca>
This commit is contained in:
@@ -1,17 +1,20 @@
|
|||||||
import bpy
|
import bpy
|
||||||
from . import ui, operator
|
from . import ui, prop, operator
|
||||||
|
|
||||||
classes = (
|
classes = (
|
||||||
operator.SelectCobieIfcFile,
|
operator.SelectCobieIfcFile,
|
||||||
operator.SelectCobieJsonFile,
|
operator.SelectCobieJsonFile,
|
||||||
operator.ExecuteIfcCobie,
|
operator.ExecuteIfcCobie,
|
||||||
|
prop.COBieProperties,
|
||||||
ui.BIM_PT_cobie,
|
ui.BIM_PT_cobie,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
pass
|
bpy.types.Scene.COBieProperties = bpy.props.PointerProperty(type=prop.COBieProperties)
|
||||||
|
|
||||||
|
|
||||||
def unregister():
|
def unregister():
|
||||||
pass
|
del bpy.types.Scene.COBieProperties
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,20 @@
|
|||||||
import bpy
|
import bpy
|
||||||
|
import os
|
||||||
|
import logging
|
||||||
|
import ifcopenshell
|
||||||
|
import json
|
||||||
|
import webbrowser
|
||||||
|
import tempfile
|
||||||
from blenderbim.bim.ifc import IfcStore
|
from blenderbim.bim.ifc import IfcStore
|
||||||
|
|
||||||
|
|
||||||
class SelectCobieIfcFile(bpy.types.Operator):
|
class SelectCobieIfcFile(bpy.types.Operator):
|
||||||
bl_idname = "bim.select_cobie_ifc_file"
|
bl_idname = "bim.select_cobie_ifc_file"
|
||||||
bl_label = "Select COBie IFC File"
|
bl_label = "Select COBie IFC File"
|
||||||
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
|
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
bpy.context.scene.BIMProperties.cobie_ifc_file = self.filepath
|
bpy.context.scene.COBieProperties.cobie_ifc_file = self.filepath
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
def invoke(self, context, event):
|
def invoke(self, context, event):
|
||||||
@@ -21,7 +28,7 @@ class SelectCobieJsonFile(bpy.types.Operator):
|
|||||||
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
|
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
bpy.context.scene.BIMProperties.cobie_json_file = self.filepath
|
bpy.context.scene.COBieProperties.cobie_json_file = self.filepath
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
def invoke(self, context, event):
|
def invoke(self, context, event):
|
||||||
@@ -36,8 +43,13 @@ class ExecuteIfcCobie(bpy.types.Operator):
|
|||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
from cobie import IfcCobieParser
|
from cobie import IfcCobieParser
|
||||||
|
props = bpy.context.scene.COBieProperties
|
||||||
output_dir = os.path.dirname(bpy.context.scene.BIMProperties.cobie_ifc_file)
|
|
||||||
|
output_dir = os.path.dirname(props.cobie_ifc_file)
|
||||||
|
|
||||||
|
if props.should_load_from_memory:
|
||||||
|
output_dir = tempfile.gettempdir()
|
||||||
|
|
||||||
output = os.path.join(output_dir, "output")
|
output = os.path.join(output_dir, "output")
|
||||||
logger = logging.getLogger("IFCtoCOBie")
|
logger = logging.getLogger("IFCtoCOBie")
|
||||||
fh = logging.FileHandler(os.path.join(output_dir, "cobie.log"))
|
fh = logging.FileHandler(os.path.join(output_dir, "cobie.log"))
|
||||||
@@ -46,16 +58,22 @@ class ExecuteIfcCobie(bpy.types.Operator):
|
|||||||
logger = logging.getLogger("IFCtoCOBie")
|
logger = logging.getLogger("IFCtoCOBie")
|
||||||
logger.addHandler(fh)
|
logger.addHandler(fh)
|
||||||
selector = ifcopenshell.util.selector.Selector()
|
selector = ifcopenshell.util.selector.Selector()
|
||||||
if bpy.context.scene.BIMProperties.cobie_json_file:
|
if props.cobie_json_file:
|
||||||
with open(bpy.context.scene.BIMProperties.cobie_json_file, "r") as f:
|
with open(props.cobie_json_file, "r") as f:
|
||||||
custom_data = json.load(f)
|
custom_data = json.load(f)
|
||||||
else:
|
else:
|
||||||
custom_data = {}
|
custom_data = {}
|
||||||
parser = IfcCobieParser(logger, selector)
|
parser = IfcCobieParser(logger, selector)
|
||||||
|
|
||||||
|
ifc_file = IfcStore.get_file()
|
||||||
|
|
||||||
|
if not (ifc_file and props.should_load_from_memory):
|
||||||
|
ifc_file = props.cobie_ifc_file
|
||||||
|
|
||||||
parser.parse(
|
parser.parse(
|
||||||
bpy.context.scene.BIMProperties.cobie_ifc_file,
|
ifc_file,
|
||||||
bpy.context.scene.BIMProperties.cobie_types,
|
props.cobie_types,
|
||||||
bpy.context.scene.BIMProperties.cobie_components,
|
props.cobie_components,
|
||||||
custom_data,
|
custom_data,
|
||||||
)
|
)
|
||||||
if self.file_format == "xlsx":
|
if self.file_format == "xlsx":
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import bpy
|
||||||
|
from bpy.types import PropertyGroup
|
||||||
|
from bpy.props import (
|
||||||
|
PointerProperty,
|
||||||
|
StringProperty,
|
||||||
|
EnumProperty,
|
||||||
|
BoolProperty,
|
||||||
|
IntProperty,
|
||||||
|
FloatProperty,
|
||||||
|
FloatVectorProperty,
|
||||||
|
CollectionProperty,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class COBieProperties(PropertyGroup):
|
||||||
|
cobie_ifc_file: StringProperty(default="", name="COBie IFC File")
|
||||||
|
cobie_types: StringProperty(default=".COBieType", name="COBie Types")
|
||||||
|
cobie_components: StringProperty(default=".COBie", name="COBie Components")
|
||||||
|
cobie_json_file: StringProperty(default="", name="COBie JSON File")
|
||||||
|
should_load_from_memory: BoolProperty(default=False, name="Load from Memory")
|
||||||
|
|
||||||
@@ -15,11 +15,17 @@ class BIM_PT_cobie(Panel):
|
|||||||
layout.use_property_split = True
|
layout.use_property_split = True
|
||||||
|
|
||||||
scene = context.scene
|
scene = context.scene
|
||||||
props = scene.BIMProperties
|
props = scene.COBieProperties
|
||||||
|
|
||||||
row = layout.row(align=True)
|
|
||||||
row.prop(props, "cobie_ifc_file")
|
if IfcStore.get_file():
|
||||||
row.operator("bim.select_cobie_ifc_file", icon="FILE_FOLDER", text="")
|
row = layout.row()
|
||||||
|
row.prop(props, "should_load_from_memory")
|
||||||
|
|
||||||
|
if not IfcStore.get_file() or not props.should_load_from_memory:
|
||||||
|
row = layout.row(align=True)
|
||||||
|
row.prop(props, "cobie_ifc_file")
|
||||||
|
row.operator("bim.select_cobie_ifc_file", icon="FILE_FOLDER", text="")
|
||||||
|
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
row.prop(props, "cobie_types")
|
row.prop(props, "cobie_types")
|
||||||
|
|||||||
@@ -1315,10 +1315,6 @@ class BIMProperties(PropertyGroup):
|
|||||||
features_dir: StringProperty(default="", name="Features Directory", update=refreshFeaturesFiles)
|
features_dir: StringProperty(default="", name="Features Directory", update=refreshFeaturesFiles)
|
||||||
features_file: EnumProperty(items=getFeaturesFiles, name="Features File", update=refreshScenarios)
|
features_file: EnumProperty(items=getFeaturesFiles, name="Features File", update=refreshScenarios)
|
||||||
scenario: EnumProperty(items=getScenarios, name="Scenario")
|
scenario: EnumProperty(items=getScenarios, name="Scenario")
|
||||||
cobie_ifc_file: StringProperty(default="", name="COBie IFC File")
|
|
||||||
cobie_types: StringProperty(default=".COBieType", name="COBie Types")
|
|
||||||
cobie_components: StringProperty(default=".COBie", name="COBie Components")
|
|
||||||
cobie_json_file: StringProperty(default="", name="COBie JSON File")
|
|
||||||
diff_json_file: StringProperty(default="", name="Diff JSON File")
|
diff_json_file: StringProperty(default="", name="Diff JSON File")
|
||||||
diff_old_file: StringProperty(default="", name="Diff Old IFC File")
|
diff_old_file: StringProperty(default="", name="Diff Old IFC File")
|
||||||
diff_new_file: StringProperty(default="", name="Diff New IFC File")
|
diff_new_file: StringProperty(default="", name="Diff New IFC File")
|
||||||
|
|||||||
@@ -54,12 +54,17 @@ class IfcCobieParser:
|
|||||||
}
|
}
|
||||||
self.default_date = (datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=-2177452801)).isoformat()
|
self.default_date = (datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=-2177452801)).isoformat()
|
||||||
|
|
||||||
def parse(self, filename, type_query=".COBieType", component_query=".COBie", custom_data={}):
|
def parse(self, file, type_query=".COBieType", component_query=".COBie", custom_data={}):
|
||||||
self.custom_data = custom_data
|
self.custom_data = custom_data
|
||||||
for sheet in self.sheets:
|
for sheet in self.sheets:
|
||||||
if sheet not in self.custom_data:
|
if sheet not in self.custom_data:
|
||||||
self.custom_data[sheet] = {}
|
self.custom_data[sheet] = {}
|
||||||
self.file = ifcopenshell.open(filename)
|
|
||||||
|
if isinstance(file, str):
|
||||||
|
self.file = ifcopenshell.open(file)
|
||||||
|
else:
|
||||||
|
self.file = file
|
||||||
|
|
||||||
self.type_assets = self.selector.parse(self.file, type_query)
|
self.type_assets = self.selector.parse(self.file, type_query)
|
||||||
self.component_assets = self.selector.parse(self.file, component_query)
|
self.component_assets = self.selector.parse(self.file, component_query)
|
||||||
self.get_contacts()
|
self.get_contacts()
|
||||||
|
|||||||
Reference in New Issue
Block a user