mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-18 22:33:33 +00:00
Use space's own container for regeneration instead of requiring default
When regenerating an existing IfcSpace, the default container is no longer required. Instead, the space's container is found via get_parent(element), which walks the full spatial hierarchy (aggregation, containment, nesting). For new space creation, the default container is still required. Add optional container parameter to get_space_polygon_from_context_visible_objects so regeneration can pass the resolved container directly. Generated with the assistance of an AI coding tool.
This commit is contained in:
@@ -20,9 +20,10 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from typing import TYPE_CHECKING, Optional, Union
|
from typing import TYPE_CHECKING, Optional, Union
|
||||||
|
|
||||||
|
import ifcopenshell
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
import bpy
|
import bpy
|
||||||
import ifcopenshell
|
|
||||||
|
|
||||||
import bonsai.tool as tool
|
import bonsai.tool as tool
|
||||||
|
|
||||||
@@ -186,9 +187,6 @@ def generate_space(
|
|||||||
"""
|
"""
|
||||||
:return: None if successful, error message string if not.
|
:return: None if successful, error message string if not.
|
||||||
"""
|
"""
|
||||||
if not root.get_default_container():
|
|
||||||
raise SpaceGenerationError("Please set a default container to create the space in.")
|
|
||||||
|
|
||||||
active_obj = spatial.get_active_obj()
|
active_obj = spatial.get_active_obj()
|
||||||
selected_objects = spatial.get_selected_objects()
|
selected_objects = spatial.get_selected_objects()
|
||||||
element = None
|
element = None
|
||||||
@@ -206,7 +204,14 @@ def generate_space(
|
|||||||
else:
|
else:
|
||||||
x, y, z, h, mat = spatial.get_x_y_z_h_mat_from_cursor()
|
x, y, z, h, mat = spatial.get_x_y_z_h_mat_from_cursor()
|
||||||
|
|
||||||
space_polygon, bounding_walls = spatial.get_space_polygon_from_context_visible_objects(x, y)
|
if element and element.is_a("IfcSpace"):
|
||||||
|
container = ifcopenshell.util.element.get_parent(element) or root.get_default_container()
|
||||||
|
else:
|
||||||
|
container = root.get_default_container()
|
||||||
|
if not container:
|
||||||
|
raise SpaceGenerationError("Please set a default container to create the space in.")
|
||||||
|
|
||||||
|
space_polygon, bounding_walls = spatial.get_space_polygon_from_context_visible_objects(x, y, container=container)
|
||||||
|
|
||||||
if isinstance(space_polygon, str):
|
if isinstance(space_polygon, str):
|
||||||
if space_polygon == "NO POLYGONS FOUND":
|
if space_polygon == "NO POLYGONS FOUND":
|
||||||
|
|||||||
@@ -874,13 +874,14 @@ class Spatial(bonsai.core.tool.Spatial):
|
|||||||
return ifcopenshell.util.space.get_boundary_lines(tool.Ifc.get(), cache["shapes"], cut_z)
|
return ifcopenshell.util.space.get_boundary_lines(tool.Ifc.get(), cache["shapes"], cut_z)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_space_polygon_from_context_visible_objects(cls, x: float, y: float) -> tuple[
|
def get_space_polygon_from_context_visible_objects(cls, x: float, y: float, container: Optional[ifcopenshell.entity_instance] = None) -> tuple[
|
||||||
Union[shapely.Polygon, Literal["NO POLYGONS FOUND", "NO POLYGON FOR POINT"]],
|
Union[shapely.Polygon, Literal["NO POLYGONS FOUND", "NO POLYGON FOR POINT"]],
|
||||||
list[ifcopenshell.entity_instance],
|
list[ifcopenshell.entity_instance],
|
||||||
]:
|
]:
|
||||||
props = tool.Model.get_model_props()
|
props = tool.Model.get_model_props()
|
||||||
calculation_rl = props.rl3
|
calculation_rl = props.rl3
|
||||||
container = tool.Root.get_default_container()
|
if container is None:
|
||||||
|
container = tool.Root.get_default_container()
|
||||||
container_obj = tool.Ifc.get_object(container)
|
container_obj = tool.Ifc.get_object(container)
|
||||||
cut_z = container_obj.matrix_world.translation.z + calculation_rl
|
cut_z = container_obj.matrix_world.translation.z + calculation_rl
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user