diff --git a/src/bonsai/bonsai/bim/module/bsdd/operator.py b/src/bonsai/bonsai/bim/module/bsdd/operator.py index 0dadf3c354..2ca968a602 100644 --- a/src/bonsai/bonsai/bim/module/bsdd/operator.py +++ b/src/bonsai/bonsai/bim/module/bsdd/operator.py @@ -50,6 +50,14 @@ class SearchBSDDClass(bpy.types.Operator): bl_description = "Search for bSDD classes by the provided keyword" bl_options = {"REGISTER", "UNDO"} + @classmethod + def poll(cls, context): + # Requirement by buildingSMART bSDD api. + if len(context.scene.BIMBSDDProperties.keyword) < 3: + cls.poll_message_set("Search query has to be at least 3 characters long.") + return False + return True + def execute(self, context): keyword = context.scene.BIMBSDDProperties.keyword classes_found = core.search_class(keyword, bsdd.Client(), tool.Bsdd) diff --git a/src/bonsai/bonsai/bim/module/bsdd/prop.py b/src/bonsai/bonsai/bim/module/bsdd/prop.py index 0ab20d439b..d7c25898e7 100644 --- a/src/bonsai/bonsai/bim/module/bsdd/prop.py +++ b/src/bonsai/bonsai/bim/module/bsdd/prop.py @@ -60,7 +60,7 @@ class BIMBSDDProperties(PropertyGroup): active_domain_index: IntProperty(name="Active Domain Index") classifications: CollectionProperty(name="Classifications", type=BSDDClassification) active_classification_index: IntProperty(name="Active Classification Index") - keyword: StringProperty(name="Keyword") + keyword: StringProperty(name="Keyword", description="Query for bsdd classes search, case and accent insensitive") should_filter_ifc_class: BoolProperty( name="Filter Active IFC Class", description="Whether to search only for bSDD classes that match active object's IFC class", diff --git a/src/bonsai/bonsai/core/bsdd.py b/src/bonsai/bonsai/core/bsdd.py index 7091beaf17..5f8c287ae7 100644 --- a/src/bonsai/bonsai/core/bsdd.py +++ b/src/bonsai/bonsai/core/bsdd.py @@ -47,7 +47,7 @@ def load_bsdd(client: bsdd.Client, bsdd: tool.Bsdd) -> None: def search_class(keyword: str, client: bsdd.Client, bsdd: tool.Bsdd) -> int: bsdd.clear_classes() - related_entities = bsdd.get_related_ifc_entities(keyword) + related_entities = bsdd.get_related_ifc_entities() active_dictionary_uri = bsdd.get_active_dictionary_uri() classes = bsdd.search_class(client, keyword, [active_dictionary_uri], related_entities) bsdd.create_classes(classes) diff --git a/src/bonsai/bonsai/tool/bsdd.py b/src/bonsai/bonsai/tool/bsdd.py index 12ac7e12f9..527f95e4de 100644 --- a/src/bonsai/bonsai/tool/bsdd.py +++ b/src/bonsai/bonsai/tool/bsdd.py @@ -121,11 +121,9 @@ class Bsdd(bonsai.core.tool.Bsdd): return psets @classmethod - def get_related_ifc_entities(cls, keyword: str) -> list[str]: + def get_related_ifc_entities(cls) -> list[str]: active_object = bpy.context.active_object related_ifc_entities = [] - if len(keyword) < 3: - return [] if cls.should_filter_ifc_class() and active_object: element = tool.Ifc.get_entity(active_object) if element: diff --git a/src/bsdd/bsdd.py b/src/bsdd/bsdd.py index d27eacd0d0..18ee8e65c5 100644 --- a/src/bsdd/bsdd.py +++ b/src/bsdd/bsdd.py @@ -492,6 +492,10 @@ class Client: # deprecated def ClassificationSearchOpen(self, SearchText, version="v1", DomainNamespaceUris=None, RelatedIfcEntities=None): print(f"function 'Client.ClassificationSearchOpen' is deprecated, use 'Client.search_class' instead") + + if len(SearchText) < 3: + raise ValueError("Search text must be at least 3 characters long.") + if DomainNamespaceUris is None: DomainNamespaceUris = [] if RelatedIfcEntities is None: @@ -686,6 +690,10 @@ class Client: So if result consists of 10 classes and 5 properties, TotalCount will be 15. Classes will be listed first, so if you then use Offset=10 and Limit=5, you will get the 5 properties. """ + + if len(search_text) < 2: + raise ValueError("Search text must be at least 2 characters long.") + if dictionary_uris is None: dictionary_uris = [] endpoint = f"TextSearch/v{version}" @@ -697,7 +705,6 @@ class Client: "limit": limit, } return self.get(endpoint, params) - pass def search_in_dictionary( self, @@ -739,6 +746,9 @@ class Client: this API replaces ClassificationSearch """ + if len(search_text) < 3: + raise ValueError("Search text must be at least 3 characters long.") + if related_ifc_entities is None: related_ifc_entities = [] if dictionary_uris is None: