mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-20 23:36:20 +00:00
buildingSMART Data Dictionary module: use pSets from different data dictionary sources (#7764)
* buildingSMART Data Dictionary module: added textfield to change data dictionary url * moved change of bsdd baseurl change to addon settings * Receiving Psets from other dictionary sources has been made available by dynamizing the identifier_url using the client baseurl * Remove unnecessary blank lines in prop.py * Remove unused import of bsdd module
This commit is contained in:
committed by
GitHub
parent
b14da14614
commit
256e4d2191
@@ -83,7 +83,6 @@ class BIM_PT_bsdd(Panel):
|
|||||||
row = self.layout.row()
|
row = self.layout.row()
|
||||||
row.operator("bim.load_bsdd_dictionaries")
|
row.operator("bim.load_bsdd_dictionaries")
|
||||||
|
|
||||||
|
|
||||||
class BIM_UL_bsdd_dictionaries(UIList):
|
class BIM_UL_bsdd_dictionaries(UIList):
|
||||||
def draw_item(
|
def draw_item(
|
||||||
self,
|
self,
|
||||||
|
|||||||
@@ -262,7 +262,7 @@ class BIM_PT_object_psets(Panel):
|
|||||||
|
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
prop_with_search(row, props, "pset_name", text="")
|
prop_with_search(row, props, "pset_name", text="")
|
||||||
if props.pset_name != "BBIM_BSDD" and not props.pset_name.startswith(tool.Bsdd.identifier_url):
|
if props.pset_name != "BBIM_BSDD" and not props.pset_name.startswith(tool.Bsdd.identifier_url()):
|
||||||
op = row.operator("bim.add_pset", icon="ADD", text="")
|
op = row.operator("bim.add_pset", icon="ADD", text="")
|
||||||
op.obj = obj.name
|
op.obj = obj.name
|
||||||
op.obj_type = "Object"
|
op.obj_type = "Object"
|
||||||
|
|||||||
@@ -36,11 +36,23 @@ if TYPE_CHECKING:
|
|||||||
|
|
||||||
|
|
||||||
class Bsdd(bonsai.core.tool.Bsdd):
|
class Bsdd(bonsai.core.tool.Bsdd):
|
||||||
identifier_url = "https://identifier.buildingsmart.org"
|
default_identifier_url = "https://identifier.buildingsmart.org"
|
||||||
|
default_api_url = "https://api.bsdd.buildingsmart.org/api/"
|
||||||
client = bsdd.Client()
|
client = bsdd.Client()
|
||||||
bsdd_classes: dict[str, dict] = {}
|
bsdd_classes: dict[str, dict] = {}
|
||||||
bsdd_properties: dict[str, dict] = {}
|
bsdd_properties: dict[str, dict] = {}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def identifier_url(cls) -> str:
|
||||||
|
"""Derives the identifier base URL from the current client baseurl.
|
||||||
|
Falls back to the standard bSDD identifier URL when using the default API."""
|
||||||
|
if cls.client.baseurl == cls.default_api_url:
|
||||||
|
return cls.default_identifier_url
|
||||||
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
|
parsed = urlparse(cls.client.baseurl)
|
||||||
|
return f"{parsed.scheme}://{parsed.netloc}"
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_bsdd_props(cls) -> BIMBSDDProperties:
|
def get_bsdd_props(cls) -> BIMBSDDProperties:
|
||||||
assert (scene := bpy.context.scene)
|
assert (scene := bpy.context.scene)
|
||||||
@@ -269,7 +281,7 @@ class Bsdd(bonsai.core.tool.Bsdd):
|
|||||||
for obj in tool.Blender.get_selected_objects(include_active=True):
|
for obj in tool.Blender.get_selected_objects(include_active=True):
|
||||||
if element := tool.Ifc.get_entity(obj):
|
if element := tool.Ifc.get_entity(obj):
|
||||||
for reference in ifcopenshell.util.classification.get_references(element):
|
for reference in ifcopenshell.util.classification.get_references(element):
|
||||||
if (uri := reference.Location) and uri.startswith(cls.identifier_url):
|
if (uri := reference.Location) and uri.startswith(cls.identifier_url()):
|
||||||
classes.add((reference[1] or reference[2] or "Unnamed", uri))
|
classes.add((reference[1] or reference[2] or "Unnamed", uri))
|
||||||
|
|
||||||
dictionary_uris = (
|
dictionary_uris = (
|
||||||
@@ -383,7 +395,7 @@ class Bsdd(bonsai.core.tool.Bsdd):
|
|||||||
def get_applicable_psets(cls, element: ifcopenshell.entity_instance):
|
def get_applicable_psets(cls, element: ifcopenshell.entity_instance):
|
||||||
uris = set()
|
uris = set()
|
||||||
for reference in ifcopenshell.util.classification.get_references(element):
|
for reference in ifcopenshell.util.classification.get_references(element):
|
||||||
if (uri := reference.Location) and uri.startswith(cls.identifier_url):
|
if (uri := reference.Location) and uri.startswith(cls.identifier_url()):
|
||||||
uris.add(uri)
|
uris.add(uri)
|
||||||
psets = set()
|
psets = set()
|
||||||
for uri in uris:
|
for uri in uris:
|
||||||
@@ -399,7 +411,7 @@ class Bsdd(bonsai.core.tool.Bsdd):
|
|||||||
def is_applicable(cls, pset_uri: str, element: ifcopenshell.entity_instance) -> bool:
|
def is_applicable(cls, pset_uri: str, element: ifcopenshell.entity_instance) -> bool:
|
||||||
uris = set()
|
uris = set()
|
||||||
for reference in ifcopenshell.util.classification.get_references(element):
|
for reference in ifcopenshell.util.classification.get_references(element):
|
||||||
if (uri := reference.Location) and uri.startswith(cls.identifier_url):
|
if (uri := reference.Location) and uri.startswith(cls.identifier_url()):
|
||||||
uris.add(uri)
|
uris.add(uri)
|
||||||
class_uri, pset_name = pset_uri.rsplit("#", 1)
|
class_uri, pset_name = pset_uri.rsplit("#", 1)
|
||||||
return class_uri in uris
|
return class_uri in uris
|
||||||
|
|||||||
Reference in New Issue
Block a user