Indicate rotated/scaled symbols in viewport

This commit is contained in:
Andrej730
2024-03-14 15:07:28 +05:00
parent c74bfa24d2
commit 858692f3f5
2 changed files with 14 additions and 8 deletions
@@ -300,7 +300,9 @@ class DecoratorData:
return result return result
element = tool.Ifc.get_entity(obj) element = tool.Ifc.get_entity(obj)
if not element or not tool.Drawing.is_annotation_object_type(element, ["TEXT", "TEXT_LEADER"]): if not element or not tool.Drawing.is_annotation_object_type(
element, ["TEXT", "TEXT_LEADER", "SYMBOL"]
):
return None return None
props = obj.BIMTextProperties props = obj.BIMTextProperties
@@ -37,7 +37,7 @@ from blenderbim.bim.module.drawing.shaders import add_verts_sequence, add_offset
from blenderbim.bim.module.drawing.helper import format_distance from blenderbim.bim.module.drawing.helper import format_distance
from timeit import default_timer as timer from timeit import default_timer as timer
from functools import lru_cache from functools import lru_cache
from typing import Optional, Iterator from typing import Optional, Iterator, Type, Union
UNSPECIAL_ELEMENT_COLOR = (0.2, 0.2, 0.2, 1) # GREY UNSPECIAL_ELEMENT_COLOR = (0.2, 0.2, 0.2, 1) # GREY
@@ -487,7 +487,9 @@ class BaseDecorator:
decimal_places = drawing_pset_data.get("DecimalPlaces", None) decimal_places = drawing_pset_data.get("DecimalPlaces", None)
return format_distance(value, precision=precision, decimal_places=decimal_places) return format_distance(value, precision=precision, decimal_places=decimal_places)
def draw_asterisk(self, context: bpy.types.Context, obj: bpy.types.Object, rotation: float = 0.0) -> None: def draw_asterisk(
self, context: bpy.types.Context, obj: bpy.types.Object, rotation: float = 0.0, scale: float = 1.0
) -> None:
""" "`rotation` value in radians""" """ "`rotation` value in radians"""
# gather geometry data and convert to winspace # gather geometry data and convert to winspace
verts = [obj.location] verts = [obj.location]
@@ -495,7 +497,7 @@ class BaseDecorator:
winspace_verts = worldspace_to_winspace(verts, context) winspace_verts = worldspace_to_winspace(verts, context)
# setup geometry parameters # setup geometry parameters
circle_size = viewportDrawingScale * 4 circle_size = viewportDrawingScale * 4 * scale
output_verts = [] output_verts = []
output_edges = [] output_edges = []
@@ -549,9 +551,10 @@ class BaseDecorator:
# draw asterisk symbol to indicate that there is some symbol that's not shown in viewport # draw asterisk symbol to indicate that there is some symbol that's not shown in viewport
if symbol: if symbol:
rotation = -Vector((1, 0)).angle_signed(text_dir) rotation = -Vector((1, 0)).angle_signed(text_dir)
self.draw_asterisk(context, obj, rotation)
# NOTE: for now we assume that scale is uniform # NOTE: for now we assume that scale is uniform
text_scale = obj.scale.x uniform_scale = obj.scale.x
self.draw_asterisk(context, obj, rotation, uniform_scale)
text_scale = uniform_scale
line_i = 0 line_i = 0
font_size_mm = text_data["FontSize"] * text_scale font_size_mm = text_data["FontSize"] * text_scale
@@ -1912,7 +1915,7 @@ class CutDecorator:
class DecorationsHandler: class DecorationsHandler:
decorators_classes = [ decorators_classes: list[Type[BaseDecorator]] = [
DimensionDecorator, DimensionDecorator,
AngleDecorator, AngleDecorator,
GridDecorator, GridDecorator,
@@ -1956,6 +1959,7 @@ class DecorationsHandler:
self.decorators = {cls.objecttype: cls() for cls in self.decorators_classes} self.decorators = {cls.objecttype: cls() for cls in self.decorators_classes}
for object_type in ("SLOPE_ANGLE", "SLOPE_FRACTION", "SLOPE_PERCENT"): for object_type in ("SLOPE_ANGLE", "SLOPE_FRACTION", "SLOPE_PERCENT"):
self.decorators[object_type] = self.decorators["FALL"] self.decorators[object_type] = self.decorators["FALL"]
self.decorators["SYMBOL"] = self.decorators["TEXT"]
def get_objects_and_decorators(self, collection): def get_objects_and_decorators(self, collection):
# TODO: do it in data instead of the handler for performance? # TODO: do it in data instead of the handler for performance?
@@ -1973,7 +1977,7 @@ class DecorationsHandler:
if not element.is_a("IfcAnnotation"): if not element.is_a("IfcAnnotation"):
continue continue
object_type = element.ObjectType object_type: Union[str, None] = element.ObjectType
if object_type == "DRAWING": if object_type == "DRAWING":
continue continue