Fix #3420. Fix missing sheet references on drawings and incorrect direction of section references.

This commit is contained in:
Dion Moult
2023-07-12 17:17:43 +10:00
parent 3abd3b1b0d
commit 5a0192c5c4
4 changed files with 36 additions and 14 deletions
@@ -717,15 +717,19 @@ class SvgWriter:
drawing = tool.Drawing.get_annotation_element(element)
reference = tool.Drawing.get_drawing_reference(drawing)
if reference:
sheet = tool.Drawing.get_reference_document(reference)
if sheet:
if tool.Ifc.get_schema() == "IFC2X3":
reference_id = reference.ItemReference or "-"
sheet_id = sheet.DocumentId or "-"
else:
reference_id = reference.Identification or "-"
sheet_id = sheet.Identification or "-"
return (reference_id, sheet_id)
for sheet_reference in tool.Ifc.get().by_type("IfcDocumentReference"):
if sheet_reference.Description != "DRAWING" or sheet_reference.Location != reference.Location:
continue
sheet = tool.Drawing.get_reference_document(sheet_reference)
if sheet:
if tool.Ifc.get_schema() == "IFC2X3":
reference_id = sheet_reference.ItemReference or "-"
sheet_id = sheet.DocumentId or "-"
else:
reference_id = sheet_reference.Identification or "-"
sheet_id = sheet.Identification or "-"
return (reference_id, sheet_id)
break
return ("-", "-")
@staticmethod
+1 -1
View File
@@ -370,7 +370,7 @@ def build_schedule(drawing, schedule=None):
def sync_references(ifc, collector, drawing_tool, drawing=None):
if not drawing_tool.has_linework(drawing):
if not drawing_tool.has_annotation(drawing):
return
context = drawing_tool.get_annotation_context(drawing_tool.get_drawing_target_view(drawing))
+18 -4
View File
@@ -1057,20 +1057,28 @@ class Drawing(blenderbim.core.tool.Drawing):
reference_mesh = cls.get_camera_block(reference_obj)
obj_matrix = to_camera_coords(camera, reference_obj)
# The reference mesh vertices represent a view cube. To convert this into a section line we:
# 1. Select the 4 +Z vertices local to the reference element. This is the cutting plane.
# The reference mesh vertices represent a view cube. To convert
# this into a section line we:
# 1. Select the 4 +Z vertices local to the reference element. This
# is the cutting plane.
verts_local_to_reference = [reference_obj.matrix_world.inverted() @ v for v in reference_mesh["verts"]]
cutting_plane_verts = sorted(verts_local_to_reference, key=lambda x: x.z)[-4:]
global_cutting_plane_verts = [reference_obj.matrix_world @ v for v in cutting_plane_verts]
# 2. Project the cutting plane onto our viewing camera.
verts_local_to_camera = [camera.matrix_world.inverted() @ v for v in global_cutting_plane_verts]
# 3. Collapse verts with the same XY coords, and set Z to be just below the clip_start so it's visible
# 3. Collapse verts with the same XY coords, and set Z to be just
# below the clip_start so it's visible
collapsed_verts = []
for vert in verts_local_to_camera:
if not [True for v in collapsed_verts if (vert.xy - v.xy).length < 1e-2]:
collapsed_verts.append(mathutils.Vector((vert.x, vert.y, -camera.data.clip_start - 0.05)))
# 4. The first two vertices is the section line
section_line = collapsed_verts[0:2]
# 5. Sort the vertices in the +X direction so that the vertices are
# ordered to "point" in the direction of the section cut.
section_line = sorted(
section_line, key=lambda co: (reference_obj.matrix_world.inverted() @ camera.matrix_world @ co).x
)
global_section_line = [camera.matrix_world @ v for v in section_line]
local_section_line = [obj_matrix.inverted() @ v for v in global_section_line]
@@ -1377,6 +1385,10 @@ class Drawing(blenderbim.core.tool.Drawing):
def has_linework(cls, drawing):
return ifcopenshell.util.element.get_psets(drawing).get("EPset_Drawing", {}).get("HasLinework", False)
@classmethod
def has_annotation(cls, drawing):
return ifcopenshell.util.element.get_psets(drawing).get("EPset_Drawing", {}).get("HasAnnotation", False)
@classmethod
def get_drawing_elements(cls, drawing):
"""returns a set of elements that are included in the drawing"""
@@ -1489,7 +1501,9 @@ class Drawing(blenderbim.core.tool.Drawing):
project_collection.children["Views"].children[collection.name].hide_viewport = True
bpy.data.collections.get(collection.name).hide_render = True
project_collection.children["Views"].children[camera.BIMObjectProperties.collection.name].hide_viewport = False
project_collection.children["Views"].children[
camera.BIMObjectProperties.collection.name
].hide_viewport = False
camera.BIMObjectProperties.collection.hide_render = False
tool.Spatial.set_active_object(camera)
@@ -242,6 +242,10 @@ Create a simple model from scratch
# Let's create a new wall
wall = run("root.create_entity", model, ifc_class="IfcWall")
# Give our wall a local origin at (0, 0, 0)
run("geometry.edit_object_placement", model, product=wall)
# Add a new wall-like body geometry, 5 meters long, 3 meters high, and 200mm thick
representation = run("geometry.add_wall_representation", model, context=body, length=5, height=3, thickness=0.2)
# Assign our new body geometry back to our wall