mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-17 14:02:27 +00:00
You can now add bSDD properties when assigning bSDD classifications
This commit is contained in:
@@ -20,11 +20,13 @@ import bpy
|
|||||||
from . import ui, prop, operator
|
from . import ui, prop, operator
|
||||||
|
|
||||||
classes = (
|
classes = (
|
||||||
|
operator.GetBSDDClassificationProperties,
|
||||||
operator.LoadBSDDDomains,
|
operator.LoadBSDDDomains,
|
||||||
operator.SearchBSDDClassifications,
|
operator.SearchBSDDClassifications,
|
||||||
operator.SetActiveBSDDDomain,
|
operator.SetActiveBSDDDomain,
|
||||||
prop.BSDDDomain,
|
prop.BSDDDomain,
|
||||||
prop.BSDDClassification,
|
prop.BSDDClassification,
|
||||||
|
prop.BSDDPset,
|
||||||
prop.BIMBSDDProperties,
|
prop.BIMBSDDProperties,
|
||||||
ui.BIM_UL_bsdd_domains,
|
ui.BIM_UL_bsdd_domains,
|
||||||
ui.BIM_UL_bsdd_classifications,
|
ui.BIM_UL_bsdd_classifications,
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
import os
|
import os
|
||||||
import bpy
|
import bpy
|
||||||
import bsdd
|
import bsdd
|
||||||
|
import json
|
||||||
import ifcopenshell
|
import ifcopenshell
|
||||||
import blenderbim.tool as tool
|
import blenderbim.tool as tool
|
||||||
|
|
||||||
@@ -83,3 +84,49 @@ class SearchBSDDClassifications(bpy.types.Operator):
|
|||||||
new.domain_name = result["domainName"]
|
new.domain_name = result["domainName"]
|
||||||
new.domain_namespace_uri = result["domainNamespaceUri"]
|
new.domain_namespace_uri = result["domainNamespaceUri"]
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
|
class GetBSDDClassificationProperties(bpy.types.Operator):
|
||||||
|
bl_idname = "bim.get_bsdd_classification_properties"
|
||||||
|
bl_label = "Search bSDD Classifications"
|
||||||
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
bprops = context.scene.BIMBSDDProperties
|
||||||
|
bprops.classification_psets.clear()
|
||||||
|
bsdd_classification = bprops.classifications[bprops.active_classification_index]
|
||||||
|
client = bsdd.Client()
|
||||||
|
data = client.Classification(bsdd_classification.namespace_uri)
|
||||||
|
|
||||||
|
properties = data.get("classificationProperties", None)
|
||||||
|
if not properties:
|
||||||
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
psets = {}
|
||||||
|
|
||||||
|
for prop in properties:
|
||||||
|
if prop.get("propertyDomainName") != "IFC":
|
||||||
|
continue
|
||||||
|
pset = prop.get("propertySet", None)
|
||||||
|
if not pset:
|
||||||
|
continue
|
||||||
|
psets.setdefault(pset, {})
|
||||||
|
|
||||||
|
predefined_value = prop.get("predefinedValue")
|
||||||
|
if predefined_value:
|
||||||
|
possible_values = [predefined_value]
|
||||||
|
else:
|
||||||
|
possible_values = prop.get("possibleValues", []) or []
|
||||||
|
possible_values = [v["value"] for v in possible_values]
|
||||||
|
|
||||||
|
psets[pset][prop["name"]] = possible_values
|
||||||
|
|
||||||
|
for pset_name, pset in psets.items():
|
||||||
|
new = bprops.classification_psets.add()
|
||||||
|
new.name = pset_name
|
||||||
|
for name, values in pset.items():
|
||||||
|
new2 = new.properties.add()
|
||||||
|
new2.name = name
|
||||||
|
new2.enum_items = json.dumps(values)
|
||||||
|
new2.data_type = "enum"
|
||||||
|
return {"FINISHED"}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
import bpy
|
import bpy
|
||||||
from bpy.types import PropertyGroup
|
from bpy.types import PropertyGroup
|
||||||
|
from blenderbim.bim.prop import Attribute, StrProperty
|
||||||
from bpy.props import (
|
from bpy.props import (
|
||||||
PointerProperty,
|
PointerProperty,
|
||||||
StringProperty,
|
StringProperty,
|
||||||
@@ -48,6 +49,11 @@ class BSDDClassification(PropertyGroup):
|
|||||||
domain_namespace_uri: StringProperty(name="Domain Namespace URI")
|
domain_namespace_uri: StringProperty(name="Domain Namespace URI")
|
||||||
|
|
||||||
|
|
||||||
|
class BSDDPset(PropertyGroup):
|
||||||
|
name: StringProperty(name="Name")
|
||||||
|
properties: CollectionProperty(name="Properties", type=Attribute)
|
||||||
|
|
||||||
|
|
||||||
class BIMBSDDProperties(PropertyGroup):
|
class BIMBSDDProperties(PropertyGroup):
|
||||||
active_domain: StringProperty(name="Active Domain")
|
active_domain: StringProperty(name="Active Domain")
|
||||||
active_uri: StringProperty(name="Active URI")
|
active_uri: StringProperty(name="Active URI")
|
||||||
@@ -57,3 +63,4 @@ class BIMBSDDProperties(PropertyGroup):
|
|||||||
active_classification_index: IntProperty(name="Active Classification Index")
|
active_classification_index: IntProperty(name="Active Classification Index")
|
||||||
keyword: StringProperty(name="Keyword")
|
keyword: StringProperty(name="Keyword")
|
||||||
should_filter_ifc_class: BoolProperty(name="Filter Active IFC Class", default=True)
|
should_filter_ifc_class: BoolProperty(name="Filter Active IFC Class", default=True)
|
||||||
|
classification_psets: CollectionProperty(name="Classification Psets", type=BSDDPset)
|
||||||
|
|||||||
@@ -312,16 +312,30 @@ class AddClassificationReferenceFromBSDD(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
ifc_definition_id = blenderbim.bim.helper.get_obj_ifc_definition_id(context, obj, self.obj_type)
|
ifc_definition_id = blenderbim.bim.helper.get_obj_ifc_definition_id(context, obj, self.obj_type)
|
||||||
if not ifc_definition_id:
|
if not ifc_definition_id:
|
||||||
continue
|
continue
|
||||||
|
element = tool.Ifc.get().by_id(ifc_definition_id)
|
||||||
reference = ifcopenshell.api.run(
|
reference = ifcopenshell.api.run(
|
||||||
"classification.add_reference",
|
"classification.add_reference",
|
||||||
tool.Ifc.get(),
|
tool.Ifc.get(),
|
||||||
product=tool.Ifc.get().by_id(ifc_definition_id),
|
product=element,
|
||||||
classification=classification,
|
classification=classification,
|
||||||
identification=bsdd_classification.reference_code,
|
identification=bsdd_classification.reference_code,
|
||||||
name=bsdd_classification.name,
|
name=bsdd_classification.name,
|
||||||
)
|
)
|
||||||
reference.Location = bsdd_classification.namespace_uri
|
reference.Location = bsdd_classification.namespace_uri
|
||||||
|
|
||||||
|
for classification_pset in bprops.classification_psets:
|
||||||
|
pset = ifcopenshell.util.element.get_pset(element, classification_pset.name)
|
||||||
|
if pset:
|
||||||
|
pset = tool.Ifc.get().by_id(pset["id"])
|
||||||
|
else:
|
||||||
|
pset = ifcopenshell.api.run(
|
||||||
|
"pset.add_pset", tool.Ifc.get(), product=element, name=classification_pset.name
|
||||||
|
)
|
||||||
|
properties = {}
|
||||||
|
for prop in classification_pset.properties:
|
||||||
|
properties[prop.name] = prop.get_value()
|
||||||
|
ifcopenshell.api.run("pset.edit_pset", tool.Ifc.get(), pset=pset, properties=properties)
|
||||||
|
|
||||||
|
|
||||||
class ChangeClassificationLevel(bpy.types.Operator):
|
class ChangeClassificationLevel(bpy.types.Operator):
|
||||||
bl_idname = "bim.change_classification_level"
|
bl_idname = "bim.change_classification_level"
|
||||||
|
|||||||
@@ -176,12 +176,20 @@ class ReferenceUI:
|
|||||||
row.label(text="No Search Results")
|
row.label(text="No Search Results")
|
||||||
|
|
||||||
if self.bprops.active_classification_index < len(self.bprops.classifications):
|
if self.bprops.active_classification_index < len(self.bprops.classifications):
|
||||||
row = self.layout.row()
|
row = self.layout.row(align=True)
|
||||||
op = row.operator(
|
op = row.operator(
|
||||||
"bim.add_classification_reference_from_bsdd", text="Add Classification Reference", icon="ADD"
|
"bim.add_classification_reference_from_bsdd", text="Add Classification Reference", icon="ADD"
|
||||||
)
|
)
|
||||||
op.obj = self.obj
|
op.obj = self.obj
|
||||||
op.obj_type = self.obj_type
|
op.obj_type = self.obj_type
|
||||||
|
row.operator("bim.get_bsdd_classification_properties", text="", icon="COPY_ID")
|
||||||
|
|
||||||
|
if len(self.bprops.classification_psets):
|
||||||
|
for pset in self.bprops.classification_psets:
|
||||||
|
box = self.layout.box()
|
||||||
|
row = box.row()
|
||||||
|
row.label(text=pset.name, icon="COPY_ID")
|
||||||
|
blenderbim.bim.helper.draw_attributes(pset.properties, box)
|
||||||
|
|
||||||
def draw_add_file_ui(self, context):
|
def draw_add_file_ui(self, context):
|
||||||
if not self.data.data["active_classification_library"]:
|
if not self.data.data["active_classification_library"]:
|
||||||
|
|||||||
Reference in New Issue
Block a user