mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-09 09:21:46 +00:00
Fix #7206. For convenience, deleted annotation references are marked as excluded and not regenerated.
This commit is contained in:
@@ -13,10 +13,10 @@ DATA;
|
|||||||
#6=IFCSIMPLEPROPERTYTEMPLATE('0AK5C2UpL4$eaac2LszAx$',$,'HasUnderlay','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
|
#6=IFCSIMPLEPROPERTYTEMPLATE('0AK5C2UpL4$eaac2LszAx$',$,'HasUnderlay','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
|
||||||
#7=IFCSIMPLEPROPERTYTEMPLATE('2j2ZEZR8X5tONm7kli5hM6',$,'HasLinework','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
|
#7=IFCSIMPLEPROPERTYTEMPLATE('2j2ZEZR8X5tONm7kli5hM6',$,'HasLinework','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
|
||||||
#8=IFCSIMPLEPROPERTYTEMPLATE('1ttChRysH9UuEX2FeMj5Hu',$,'HasAnnotation','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
|
#8=IFCSIMPLEPROPERTYTEMPLATE('1ttChRysH9UuEX2FeMj5Hu',$,'HasAnnotation','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
|
||||||
#9=IFCSIMPLEPROPERTYTEMPLATE('2NPPxuABv1huDTVh32TFgw',$,'GlobalReferencing','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
|
#9=IFCSIMPLEPROPERTYTEMPLATE('2NPPxuABv1huDTVh32TFgw',$,'GlobalReferencing','Whether or not this drawing can be referenced in other drawings.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
|
||||||
#10=IFCSIMPLEPROPERTYTEMPLATE('10hT_1zrzEbRRKMXYAWvtD',$,'Metadata','Comma separated list of selector expressions to evaluate for each drawing elementand add results to their ''class'' attribute.\X2\000A\X0\E.g. ''Name, id'' would add to ''class'' value similar to ''Name-Wall id-1220''.\X2\000A\X0\Then it can be used to applied css styles based on the resulting class.\X2\000A\X0\If attribute is not present on the element, then it won''t be added to it''s ''class''.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
|
#10=IFCSIMPLEPROPERTYTEMPLATE('10hT_1zrzEbRRKMXYAWvtD',$,'Metadata','Comma separated list of selector expressions to evaluate for each drawing elementand add results to their ''class'' attribute.\X2\000A\X0\E.g. ''Name, id'' would add to ''class'' value similar to ''Name-Wall id-1220''.\X2\000A\X0\Then it can be used to applied css styles based on the resulting class.\X2\000A\X0\If attribute is not present on the element, then it won''t be added to it''s ''class''.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
|
||||||
#11=IFCSIMPLEPROPERTYTEMPLATE('3Z0BXPSG5CWgtI33ioV7aj',$,'Include','Selector expression to include ifc elements in the drawing',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
|
#11=IFCSIMPLEPROPERTYTEMPLATE('3Z0BXPSG5CWgtI33ioV7aj',$,'Include','Selector expression to include elements in the drawing',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
|
||||||
#12=IFCSIMPLEPROPERTYTEMPLATE('1RVts_g3PAw98PJA2yL3bO',$,'Exclude','Selector expression to exclude ifc elements in the drawing',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
|
#12=IFCSIMPLEPROPERTYTEMPLATE('1RVts_g3PAw98PJA2yL3bO',$,'Exclude','Selector expression to exclude elements in the drawing',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
|
||||||
#13=IFCSIMPLEPROPERTYTEMPLATE('0c1$8NpYDEaBiJrj16jHIo',$,'Stylesheet','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
|
#13=IFCSIMPLEPROPERTYTEMPLATE('0c1$8NpYDEaBiJrj16jHIo',$,'Stylesheet','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
|
||||||
#14=IFCSIMPLEPROPERTYTEMPLATE('3mRF52q81FQB$h4oTh7M45',$,'Markers','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
|
#14=IFCSIMPLEPROPERTYTEMPLATE('3mRF52q81FQB$h4oTh7M45',$,'Markers','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
|
||||||
#15=IFCSIMPLEPROPERTYTEMPLATE('1rhr_0N3LDtuORcEJP0KXM',$,'Symbols','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
|
#15=IFCSIMPLEPROPERTYTEMPLATE('1rhr_0N3LDtuORcEJP0KXM',$,'Symbols','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
|
||||||
|
|||||||
@@ -208,6 +208,25 @@ class Drawing(bonsai.core.tool.Drawing):
|
|||||||
|
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_annotation_drawing(cls, element: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance | None:
|
||||||
|
for rel in element.HasAssignments:
|
||||||
|
if rel.is_a("IfcRelAssignsToGroup") and rel.RelatingGroup.ObjectType == "DRAWING":
|
||||||
|
for e in rel.RelatedObjects:
|
||||||
|
if e.ObjectType == "DRAWING":
|
||||||
|
return e
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def exclude_annotation_from_drawing(cls, element: ifcopenshell.entity_instance, drawing: ifcopenshell.entity_instance) -> None:
|
||||||
|
pset = tool.Pset.get_element_pset(drawing, "EPset_Drawing")
|
||||||
|
if not pset:
|
||||||
|
pset = ifcopenshell.api.pset.add_pset(ifc_file, product=drawing, name="EPset_Drawing")
|
||||||
|
exclude = ifcopenshell.util.element.get_property_definition(pset, prop="Exclude") or ""
|
||||||
|
if exclude:
|
||||||
|
exclude += "+"
|
||||||
|
exclude += element.GlobalId
|
||||||
|
ifcopenshell.api.pset.edit_pset(tool.Ifc.get(), pset=pset, properties={"Exclude": exclude})
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def ensure_annotation_in_drawing_plane(
|
def ensure_annotation_in_drawing_plane(
|
||||||
cls, obj: bpy.types.Object, camera: Optional[bpy.types.Object] = None
|
cls, obj: bpy.types.Object, camera: Optional[bpy.types.Object] = None
|
||||||
@@ -218,11 +237,7 @@ class Drawing(bonsai.core.tool.Drawing):
|
|||||||
entity = tool.Ifc.get_entity(obj)
|
entity = tool.Ifc.get_entity(obj)
|
||||||
if not entity:
|
if not entity:
|
||||||
return
|
return
|
||||||
for rel in entity.HasAssignments:
|
return tool.Ifc.get_object(cls.get_annotation_drawing(entity))
|
||||||
if rel.is_a("IfcRelAssignsToGroup"):
|
|
||||||
for e in rel.RelatedObjects:
|
|
||||||
if e.ObjectType == "DRAWING":
|
|
||||||
return tool.Ifc.get_object(e)
|
|
||||||
|
|
||||||
if not camera:
|
if not camera:
|
||||||
camera = get_camera_from_annotation_object(obj) or bpy.context.scene.camera
|
camera = get_camera_from_annotation_object(obj) or bpy.context.scene.camera
|
||||||
@@ -1401,7 +1416,10 @@ class Drawing(bonsai.core.tool.Drawing):
|
|||||||
cls, drawing: ifcopenshell.entity_instance
|
cls, drawing: ifcopenshell.entity_instance
|
||||||
) -> list[ifcopenshell.entity_instance]:
|
) -> list[ifcopenshell.entity_instance]:
|
||||||
elements = []
|
elements = []
|
||||||
existing_references = cls.get_group_elements(cls.get_drawing_group(drawing))
|
existing_references = set(cls.get_group_elements(cls.get_drawing_group(drawing)))
|
||||||
|
if exclude := ifcopenshell.util.element.get_pset(drawing, "EPset_Drawing", "Exclude"):
|
||||||
|
existing_references.update(ifcopenshell.util.selector.filter_elements(tool.Ifc.get(), exclude))
|
||||||
|
|
||||||
for element in tool.Ifc.get().by_type("IfcAnnotation"):
|
for element in tool.Ifc.get().by_type("IfcAnnotation"):
|
||||||
if element in existing_references or element == drawing:
|
if element in existing_references or element == drawing:
|
||||||
continue
|
continue
|
||||||
@@ -1411,8 +1429,13 @@ class Drawing(bonsai.core.tool.Drawing):
|
|||||||
"GlobalReferencing", False
|
"GlobalReferencing", False
|
||||||
):
|
):
|
||||||
elements.append(element)
|
elements.append(element)
|
||||||
for element in tool.Ifc.get().by_type("IfcGridAxis"):
|
for element in tool.Ifc.get().by_type("IfcGrid"):
|
||||||
elements.append(element)
|
if element in existing_references:
|
||||||
|
continue
|
||||||
|
for axis in element.UAxes + element.VAxes + (element.WAxes or tuple()):
|
||||||
|
if axis in existing_references:
|
||||||
|
continue
|
||||||
|
elements.append(element)
|
||||||
target_view = tool.Drawing.get_drawing_target_view(drawing)
|
target_view = tool.Drawing.get_drawing_target_view(drawing)
|
||||||
if target_view in ("SECTION_VIEW", "ELEVATION_VIEW"):
|
if target_view in ("SECTION_VIEW", "ELEVATION_VIEW"):
|
||||||
for element in tool.Ifc.get().by_type("IfcBuildingStorey"):
|
for element in tool.Ifc.get().by_type("IfcBuildingStorey"):
|
||||||
|
|||||||
@@ -233,8 +233,11 @@ class Geometry(bonsai.core.tool.Geometry):
|
|||||||
element = tool.Ifc.get_entity(obj)
|
element = tool.Ifc.get_entity(obj)
|
||||||
if not element:
|
if not element:
|
||||||
return
|
return
|
||||||
elif element.is_a("IfcAnnotation") and element.ObjectType == "DRAWING":
|
elif element.is_a("IfcAnnotation"):
|
||||||
return bonsai.core.drawing.remove_drawing(tool.Ifc, tool.Drawing, drawing=element)
|
if element.ObjectType == "DRAWING":
|
||||||
|
return bonsai.core.drawing.remove_drawing(tool.Ifc, tool.Drawing, drawing=element)
|
||||||
|
elif (referenced_element := tool.Drawing.get_annotation_element(element)) and (drawing := tool.Drawing.get_annotation_drawing(element)):
|
||||||
|
tool.Drawing.exclude_annotation_from_drawing(referenced_element, drawing)
|
||||||
elif element.is_a("IfcRelSpaceBoundary"):
|
elif element.is_a("IfcRelSpaceBoundary"):
|
||||||
ifcopenshell.api.boundary.remove_boundary(ifc_file, boundary=element)
|
ifcopenshell.api.boundary.remove_boundary(ifc_file, boundary=element)
|
||||||
tool.Boundary.undecorate_boundary(obj)
|
tool.Boundary.undecorate_boundary(obj)
|
||||||
|
|||||||
Reference in New Issue
Block a user