fix #4665 - View layerset thicknesses in feet and inches format

This commit is contained in:
Ryan Schultz
2024-07-05 22:26:36 -05:00
parent 24d1a2ee64
commit 2a808318bf
5 changed files with 49 additions and 10 deletions
@@ -121,7 +121,13 @@ class BoundingBox:
# This function stolen from https://github.com/kevancress/MeasureIt_ARCH/blob/dcf607ce0896aa2284463c6b4ae9cd023fc54cbe/measureit_arch_baseclass.py # This function stolen from https://github.com/kevancress/MeasureIt_ARCH/blob/dcf607ce0896aa2284463c6b4ae9cd023fc54cbe/measureit_arch_baseclass.py
# MeasureIt-ARCH is GPL-v3 # MeasureIt-ARCH is GPL-v3
def format_distance( def format_distance(
value, isArea=False, hide_units=True, precision=None, decimal_places=None, suppress_zero_inches=False value,
isArea=False,
hide_units=True,
precision=None,
decimal_places=None,
suppress_zero_inches=False,
in_unit_length = False
): ):
s_code = "\u00b2" # Superscript two THIS IS LEGACY (but being kept for when Area Measurements are re-implimented) s_code = "\u00b2" # Superscript two THIS IS LEGACY (but being kept for when Area Measurements are re-implimented)
@@ -130,17 +136,22 @@ def format_distance(
unit_system = bpy.context.scene.unit_settings.system unit_system = bpy.context.scene.unit_settings.system
unit_length = bpy.context.scene.unit_settings.length_unit unit_length = bpy.context.scene.unit_settings.length_unit
toInches = 39.3700787401574887
inPerFoot = 11.9999
if isArea:
toInches = 1550
inPerFoot = 143.999
value *= scaleFactor value *= scaleFactor
# Imperial Formatting # Imperial Formatting
if unit_system == "IMPERIAL": if unit_system == "IMPERIAL":
if in_unit_length:
if unit_length == 'INCHES':
toInches = 1
if unit_length == 'FEET':
toInches = 11.9999
else:
toInches = 39.3700787401574887
inPerFoot = 11.9999
if isArea:
toInches = 1550
inPerFoot = 143.999
if not precision: if not precision:
precision = 256 precision = 256
elif precision == "1": elif precision == "1":
@@ -210,6 +221,12 @@ def format_distance(
# METRIC FORMATTING # METRIC FORMATTING
elif unit_system == "METRIC": elif unit_system == "METRIC":
if in_unit_length:
if unit_length == 'CENTIMETERS':
value = value/100
if unit_length == 'MILLIMETERS':
value = value/1000
if precision: if precision:
value = precision * round(float(value) / precision) value = precision * round(float(value) / precision)
@@ -371,6 +371,7 @@ class DocProperties(PropertyGroup):
shadingstyle_default: StringProperty(default="Blender Default", name="Default Shading Style") shadingstyle_default: StringProperty(default="Blender Default", name="Default Shading Style")
drawing_font: StringProperty(default="OpenGost Type B TT.ttf", name="Drawing Font") drawing_font: StringProperty(default="OpenGost Type B TT.ttf", name="Drawing Font")
magic_font_scale: bpy.props.FloatProperty(default=0.004118616, name="Font Scale Factor") magic_font_scale: bpy.props.FloatProperty(default=0.004118616, name="Font Scale Factor")
imperial_precision: StringProperty(default="1/32", name="Imperial Precision")
class BIMCameraProperties(PropertyGroup): class BIMCameraProperties(PropertyGroup):
@@ -23,6 +23,7 @@ import ifcopenshell.util.element
import ifcopenshell.util.doc import ifcopenshell.util.doc
import ifcopenshell.util.schema import ifcopenshell.util.schema
import blenderbim.tool as tool import blenderbim.tool as tool
from blenderbim.bim.module.drawing.helper import format_distance
def refresh(): def refresh():
@@ -251,7 +252,14 @@ class ObjectMaterialData:
else: else:
data["name"] = "No Profile" data["name"] = "No Profile"
if item.is_a("IfcMaterialLayer"): if item.is_a("IfcMaterialLayer"):
data["name"] += f" ({item.LayerThickness})" total_thickness = item.LayerThickness
unit_system = bpy.context.scene.unit_settings.system
if unit_system == "IMPERIAL":
precision = bpy.context.scene.DocProperties.imperial_precision
else:
precision = None
formatted_thickness = format_distance(total_thickness, precision=precision, suppress_zero_inches=True, in_unit_length = True)
data["name"] = f"{formatted_thickness} - {data['name']}"
if item.is_a("IfcMaterial"): if item.is_a("IfcMaterial"):
data["material"] = item.Name or "Unnamed" data["material"] = item.Name or "Unnamed"
else: else:
@@ -18,11 +18,13 @@
import blenderbim.bim.helper import blenderbim.bim.helper
import blenderbim.tool as tool import blenderbim.tool as tool
import bpy
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from blenderbim.bim.ifc import IfcStore from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.helper import draw_attributes from blenderbim.bim.helper import draw_attributes
from blenderbim.bim.helper import prop_with_search from blenderbim.bim.helper import prop_with_search
from blenderbim.bim.module.material.data import MaterialsData, ObjectMaterialData from blenderbim.bim.module.material.data import MaterialsData, ObjectMaterialData
from blenderbim.bim.module.drawing.helper import format_distance
class BIM_PT_materials(Panel): class BIM_PT_materials(Panel):
@@ -327,8 +329,16 @@ class BIM_PT_object_material(Panel):
row.label(text=set_item["material"], icon="MATERIAL") row.label(text=set_item["material"], icon="MATERIAL")
if ObjectMaterialData.data["total_thickness"]: if ObjectMaterialData.data["total_thickness"]:
total_thickness = ObjectMaterialData.data["total_thickness"]
unit_system = bpy.context.scene.unit_settings.system
if unit_system == "IMPERIAL":
precision = bpy.context.scene.DocProperties.imperial_precision
else:
precision = None
formatted_thickness = format_distance(total_thickness, precision=precision, suppress_zero_inches=True, in_unit_length = True)
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.label(text=f"Total Thickness: {ObjectMaterialData.data['total_thickness']:.3f}") row.label(text=f"Total Thickness: {formatted_thickness}")
class BIM_UL_materials(UIList): class BIM_UL_materials(UIList):
+3
View File
@@ -349,6 +349,9 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences):
row = self.layout.row() row = self.layout.row()
row.prop(context.scene.DocProperties, "drawing_font") row.prop(context.scene.DocProperties, "drawing_font")
row.prop(context.scene.DocProperties, "magic_font_scale") row.prop(context.scene.DocProperties, "magic_font_scale")
row = self.layout.row()
row.prop(context.scene.DocProperties, "imperial_precision")
# Scene panel groups # Scene panel groups