mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-11 02:02:22 +00:00
ExtractElements - expose assume_asset_uniqueness_by_name option #6243
I'd much rather not expose this option to ifcpatch but I guess models are different and there should be a way to extract elements even if assets name uniqueness is not ensured (since it's not IFC requirement anyway). But it may cause duplicated assets.
This commit is contained in:
@@ -16,10 +16,15 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import annotations
|
||||
import bpy
|
||||
import bonsai.tool as tool
|
||||
from bonsai.bim.helper import prop_with_search
|
||||
from bonsai.bim.helper import draw_attributes
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from bonsai.bim.prop import Attribute
|
||||
|
||||
|
||||
class BIM_PT_patch(bpy.types.Panel):
|
||||
@@ -54,8 +59,8 @@ class BIM_PT_patch(bpy.types.Panel):
|
||||
row.prop(props, "ifc_patch_output")
|
||||
row.operator("bim.select_ifc_patch_output", icon="FILE_FOLDER", text="")
|
||||
|
||||
def draw_callback_(_, row: bpy.types.UILayout) -> None:
|
||||
if props.ifc_patch_recipes == "ExtractElements":
|
||||
def draw_callback_(attribute: Attribute, row: bpy.types.UILayout) -> None:
|
||||
if props.ifc_patch_recipes == "ExtractElements" and attribute.name == "Query":
|
||||
row.operator("bim.patch_query_from_selected", text="", icon="EYEDROPPER")
|
||||
|
||||
if props.ifc_patch_args_attr:
|
||||
|
||||
@@ -26,7 +26,13 @@ from logging import Logger
|
||||
|
||||
|
||||
class Patcher:
|
||||
def __init__(self, file: ifcopenshell.file, logger: Logger, query: str = "IfcWall"):
|
||||
def __init__(
|
||||
self,
|
||||
file: ifcopenshell.file,
|
||||
logger: Logger,
|
||||
query: str = "IfcWall",
|
||||
assume_asset_uniqueness_by_name: bool = True,
|
||||
):
|
||||
"""Extract certain elements into a new model
|
||||
|
||||
Extract a subset of elements from an existing IFC data set and save it
|
||||
@@ -34,7 +40,14 @@ class Patcher:
|
||||
in a model and save it as a new model.
|
||||
|
||||
:param query: A query to select the subset of IFC elements.
|
||||
:type query: str
|
||||
:param assume_asset_uniqueness_by_name: Avoid adding assets (profiles, materials, styles)
|
||||
with the same name multiple times. Which helps in avoiding duplicated assets.
|
||||
-----
|
||||
Note that it assumes different project assets use different names
|
||||
(you can run IFC Assets Validation to confirm).
|
||||
If they're not and this option is enabled, it may lead to confusing results
|
||||
(mixed up profiles, materials, styles).
|
||||
So either need to ensure assets naming is unique or disable this option.
|
||||
|
||||
Example:
|
||||
|
||||
@@ -52,6 +65,7 @@ class Patcher:
|
||||
self.file = file
|
||||
self.logger = logger
|
||||
self.query = query
|
||||
self.assume_asset_uniqueness_by_name = assume_asset_uniqueness_by_name
|
||||
|
||||
def patch(self):
|
||||
self.contained_ins: dict[str, set[ifcopenshell.entity_instance]] = {}
|
||||
@@ -83,7 +97,11 @@ class Patcher:
|
||||
if element.is_a("IfcProject"):
|
||||
return self.new.add(element)
|
||||
return ifcopenshell.api.project.append_asset(
|
||||
self.new, library=self.file, element=element, reuse_identities=self.reuse_identities
|
||||
self.new,
|
||||
library=self.file,
|
||||
element=element,
|
||||
reuse_identities=self.reuse_identities,
|
||||
assume_asset_uniqueness_by_name=self.assume_asset_uniqueness_by_name,
|
||||
)
|
||||
|
||||
def add_spatial_structures(
|
||||
|
||||
Reference in New Issue
Block a user