From 61a2eb4a435fb6e0a17de6ad26cc18f9e9f28f9e Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 3 May 2020 19:54:27 +1000 Subject: [PATCH] Feature to set and resize text to 1.8, 2.5, 3.5, 5 and 7 sizes --- .../blenderbim/bim/__init__.py | 5 ++++ .../blenderbim/bim/annotation.py | 27 ++++++++++++++++++- .../blenderbim/bim/operator.py | 12 +++++++++ src/ifcblenderexport/blenderbim/bim/prop.py | 15 +++++++++++ src/ifcblenderexport/blenderbim/bim/ui.py | 24 +++++++++++++++++ 5 files changed, 82 insertions(+), 1 deletion(-) diff --git a/src/ifcblenderexport/blenderbim/bim/__init__.py b/src/ifcblenderexport/blenderbim/bim/__init__.py index bbd4d4f397..b62f7eb5e2 100644 --- a/src/ifcblenderexport/blenderbim/bim/__init__.py +++ b/src/ifcblenderexport/blenderbim/bim/__init__.py @@ -121,6 +121,7 @@ if bpy is not None: operator.RemoveIfcFile, operator.SelectDocIfcFile, operator.AddAnnotation, + operator.ResizeText, prop.StrProperty, prop.Classification, prop.ClassificationReference, @@ -151,6 +152,7 @@ if bpy is not None: prop.SweptSolid, prop.BIMMeshProperties, prop.BIMCameraProperties, + prop.BIMTextProperties, ui.BIM_PT_section_plane, ui.BIM_PT_documentation, ui.BIM_PT_bim, @@ -173,6 +175,7 @@ if bpy is not None: ui.BIM_PT_classification_references, ui.BIM_PT_documents, ui.BIM_PT_camera, + ui.BIM_PT_text, ui.BIM_UL_document_information, ui.BIM_UL_document_references, ui.BIM_UL_topics, @@ -210,6 +213,7 @@ if bpy is not None: bpy.types.Material.BIMMaterialProperties = bpy.props.PointerProperty(type=prop.BIMMaterialProperties) bpy.types.Mesh.BIMMeshProperties = bpy.props.PointerProperty(type=prop.BIMMeshProperties) bpy.types.Camera.BIMCameraProperties = bpy.props.PointerProperty(type=prop.BIMCameraProperties) + bpy.types.TextCurve.BIMTextProperties = bpy.props.PointerProperty(type=prop.BIMTextProperties) def unregister(): for cls in reversed(classes): @@ -227,3 +231,4 @@ if bpy is not None: del(bpy.types.Material.BIMMaterialProperties) del(bpy.types.Mesh.BIMMeshProperties) del(bpy.types.Camera.BIMCameraProperties) + del(bpy.types.Camera.BIMTextProperties) diff --git a/src/ifcblenderexport/blenderbim/bim/annotation.py b/src/ifcblenderexport/blenderbim/bim/annotation.py index fa4ebbcf0b..8277d243f1 100644 --- a/src/ifcblenderexport/blenderbim/bim/annotation.py +++ b/src/ifcblenderexport/blenderbim/bim/annotation.py @@ -1,4 +1,5 @@ import bpy +import os from mathutils import Vector class Annotator: @@ -12,9 +13,33 @@ class Annotator: co1, co2 = Annotator.get_placeholder_coords() obj.location = co1 obj.hide_render = True - bpy.context.scene.collection.objects.link(obj) + font = bpy.data.fonts.get('OpenGost TypeB TT') + if not font: + font = bpy.data.fonts.load(os.path.join( + bpy.context.scene.BIMProperties.data_dir, 'fonts', 'OpenGost Type B TT.ttf')) + font.name = 'OpenGost Type B TT' + obj.data.font = font + obj.data.BIMTextProperties.font_size = '2.5' + collection = bpy.context.scene.camera.users_collection[0] + collection.objects.link(obj) + Annotator.resize_text(obj) return obj + @staticmethod + def resize_text(text_obj): + camera = None + for obj in text_obj.users_collection[0].objects: + if isinstance(obj.data, bpy.types.Camera): + camera = obj + break + if not camera: + return + # This is a magic number for OpenGost + font_size = 1.6 / 1000 + font_size *= float(text_obj.data.BIMTextProperties.font_size) + font_size *= float(camera.data.BIMCameraProperties.diagram_scale.split(':')[1]) + text_obj.data.size = font_size + @staticmethod def add_line_to_annotation(obj): co1, co2 = Annotator.get_placeholder_coords() diff --git a/src/ifcblenderexport/blenderbim/bim/operator.py b/src/ifcblenderexport/blenderbim/bim/operator.py index 5b92c679bb..31ba5ce9a9 100644 --- a/src/ifcblenderexport/blenderbim/bim/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/operator.py @@ -1526,6 +1526,7 @@ class CreateView(bpy.types.Operator): views_collection.children.link(view_collection) camera = bpy.data.objects.new(bpy.context.scene.DocProperties.view_name, bpy.data.cameras.new(bpy.context.scene.DocProperties.view_name)) camera.data.type = 'ORTHO' + camera.data.BIMCameraProperties.diagram_scale = '1:100' bpy.context.scene.camera = camera view_collection.objects.link(camera) area = next(area for area in bpy.context.screen.areas if area.type == 'VIEW_3D') @@ -2408,3 +2409,14 @@ class AddAnnotation(bpy.types.Operator): bpy.context.view_layer.objects.active = obj bpy.ops.object.mode_set(mode='EDIT') return {'FINISHED'} + + +class ResizeText(bpy.types.Operator): + bl_idname = 'bim.resize_text' + bl_label = 'Resize Text' + + def execute(self, context): + for obj in bpy.context.scene.camera.users_collection[0].objects: + if isinstance(obj.data, bpy.types.TextCurve): + annotation.Annotator.resize_text(obj) + return {'FINISHED'} diff --git a/src/ifcblenderexport/blenderbim/bim/prop.py b/src/ifcblenderexport/blenderbim/bim/prop.py index 4f0f035d63..f0bcf9d65e 100644 --- a/src/ifcblenderexport/blenderbim/bim/prop.py +++ b/src/ifcblenderexport/blenderbim/bim/prop.py @@ -7,6 +7,7 @@ from . import export_ifc from . import schema from . import bcf from . import ifc +from . import annotation import bpy from bpy.types import PropertyGroup from bpy.app.handlers import persistent @@ -366,6 +367,10 @@ def getSheets(self, context): return sheets_enum +def refreshFontSize(self, context): + annotation.Annotator.resize_text(context.active_object) + + class StrProperty(PropertyGroup): pass @@ -390,6 +395,16 @@ class BIMCameraProperties(PropertyGroup): is_nts: BoolProperty(name='Is NTS') +class BIMTextProperties(PropertyGroup): + font_size: EnumProperty(items=[ + ('1.8', '1.8', ''), + ('2.5', '2.5', ''), + ('3.5', '3.5', ''), + ('5.0', '5.0', ''), + ('7.0', '7.0', ''), + ], update=refreshFontSize, name='Font Size') + + class DocumentInformation(PropertyGroup): name: StringProperty(name='Identification') human_name: StringProperty(name='Name') diff --git a/src/ifcblenderexport/blenderbim/bim/ui.py b/src/ifcblenderexport/blenderbim/bim/ui.py index eed7d87414..8619d42535 100644 --- a/src/ifcblenderexport/blenderbim/bim/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/ui.py @@ -630,11 +630,34 @@ class BIM_PT_camera(Panel): row = layout.row() row.prop(props, 'is_nts') + row = layout.row() + row.operator('bim.resize_text') + row = layout.row(align=True) row.prop(props, 'diagram_scale', text='') row.operator('bim.cut_section') +class BIM_PT_text(Panel): + bl_label = "Text Paper Space" + bl_idname = "BIM_PT_text" + bl_space_type = 'PROPERTIES' + bl_region_type = 'WINDOW' + bl_context = 'data' + + @classmethod + def poll(cls, context): + return (type(context.curve) is bpy.types.TextCurve) + + def draw(self, context): + layout = self.layout + layout.use_property_split = True + props = context.active_object.data.BIMTextProperties + + row = layout.row() + row.prop(props, 'font_size') + + class BIM_PT_owner(Panel): bl_label = "Owner History" bl_idname = "BIM_PT_owner" @@ -655,6 +678,7 @@ class BIM_PT_owner(Panel): row = layout.row() row.prop(props, 'organisation') + class BIM_PT_context(Panel): bl_label = "Geometric Representation Contexts" bl_idname = "BIM_PT_context"