Run black

This commit is contained in:
Dion Moult
2022-07-06 18:29:22 +10:00
parent 084823164e
commit 7eac5397cd
25 changed files with 134 additions and 111 deletions
@@ -69,7 +69,7 @@ class BIMBrickProperties(PropertyGroup):
libraries: EnumProperty(name="Libraries", items=get_libraries) libraries: EnumProperty(name="Libraries", items=get_libraries)
namespace: EnumProperty(name="Namespace", items=get_namespaces) namespace: EnumProperty(name="Namespace", items=get_namespaces)
brick_equipment_class: EnumProperty(name="Brick Equipment Class", items=get_brick_equipment_classes) brick_equipment_class: EnumProperty(name="Brick Equipment Class", items=get_brick_equipment_classes)
getter_enum = { getter_enum = {
"libraries": get_libraries, "libraries": get_libraries,
"namespace": get_namespaces, "namespace": get_namespaces,
@@ -112,6 +112,7 @@ class CreateAllShapes(bpy.types.Operator):
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = IfcStore.get_file()
elements = self.file.by_type("IfcElement") + self.file.by_type("IfcSpace") elements = self.file.by_type("IfcElement") + self.file.by_type("IfcSpace")
total = len(elements) total = len(elements)
settings = ifcopenshell.geom.settings() settings = ifcopenshell.geom.settings()
failures = [] failures = []
@@ -152,13 +152,13 @@ class CreateDrawing(bpy.types.Operator):
with profile("Generate underlay"): with profile("Generate underlay"):
underlay_svg = self.generate_underlay(context) underlay_svg = self.generate_underlay(context)
with profile("Generate linework"): with profile("Generate linework"):
linework_svg = self.generate_linework(context) linework_svg = self.generate_linework(context)
with profile("Generate annotation"): with profile("Generate annotation"):
annotation_svg = self.generate_annotation(context) annotation_svg = self.generate_annotation(context)
with profile("Combine SVG layers"): with profile("Combine SVG layers"):
svg_path = self.combine_svgs(context, underlay_svg, linework_svg, annotation_svg) svg_path = self.combine_svgs(context, underlay_svg, linework_svg, annotation_svg)
@@ -392,6 +392,7 @@ class BIMTextProperties(PropertyGroup):
name="Font Size", name="Font Size",
) )
class BIMAssignedProductProperties(PropertyGroup): class BIMAssignedProductProperties(PropertyGroup):
is_editing_product: BoolProperty(name="Is Editing Product", default=False) is_editing_product: BoolProperty(name="Is Editing Product", default=False)
relating_product: PointerProperty(name="Relating Product", type=bpy.types.Object) relating_product: PointerProperty(name="Relating Product", type=bpy.types.Object)
@@ -118,7 +118,7 @@ class SheetBuilder:
sheet_tree = ET.parse(sheet_path) sheet_tree = ET.parse(sheet_path)
sheet_root = sheet_tree.getroot() sheet_root = sheet_tree.getroot()
for g in sheet_root.findall('{http://www.w3.org/2000/svg}g'): for g in sheet_root.findall("{http://www.w3.org/2000/svg}g"):
if g.attrib.get("data-id") == str(reference.id()): if g.attrib.get("data-id") == str(reference.id()):
sheet_root.remove(g) sheet_root.remove(g)
break break
@@ -70,7 +70,7 @@ class SvgWriter:
viewBox=("0 0 {} {}".format(self.width, self.height)), viewBox=("0 0 {} {}".format(self.width, self.height)),
id="root", id="root",
data_scale=self.human_scale, data_scale=self.human_scale,
debug=False, # Disable validation so that we can insert the IFC namespace debug=False, # Disable validation so that we can insert the IFC namespace
) )
self.svg.attribs["xmlns:ifc"] = "http://www.ifcopenshell.org/ns" self.svg.attribs["xmlns:ifc"] = "http://www.ifcopenshell.org/ns"
return self return self
@@ -81,7 +81,9 @@ class SvgWriter:
def draw_underlay(self, image): def draw_underlay(self, image):
self.svg.add( self.svg.add(
self.svg.image( self.svg.image(
os.path.join("..", "diagrams", os.path.basename(image)), width=self.width, height=self.height, os.path.join("..", "diagrams", os.path.basename(image)),
width=self.width,
height=self.height,
) )
) )
return self return self
@@ -252,7 +254,9 @@ class SvgWriter:
end = Vector(((x_offset + v1.x), (y_offset - v1.y))) end = Vector(((x_offset + v1.x), (y_offset - v1.y)))
vector = end - start vector = end - start
line = self.svg.add( line = self.svg.add(
self.svg.line(start=tuple(start * self.svg_scale), end=tuple(end * self.svg_scale), class_=" ".join(classes)) self.svg.line(
start=tuple(start * self.svg_scale), end=tuple(end * self.svg_scale), class_=" ".join(classes)
)
) )
line["stroke-dasharray"] = "12.5, 3, 3, 3" line["stroke-dasharray"] = "12.5, 3, 3, 3"
axis_tag = tool.Ifc.get_entity(obj).Name axis_tag = tool.Ifc.get_entity(obj).Name
@@ -361,7 +365,9 @@ class SvgWriter:
end = Vector(((x_offset + v1.x), (y_offset - v1.y))) end = Vector(((x_offset + v1.x), (y_offset - v1.y)))
vector = end - start vector = end - start
line = self.svg.add( line = self.svg.add(
self.svg.line(start=tuple(start * self.svg_scale), end=tuple(end * self.svg_scale), class_=" ".join(classes)) self.svg.line(
start=tuple(start * self.svg_scale), end=tuple(end * self.svg_scale), class_=" ".join(classes)
)
) )
def draw_leader_annotation(self, obj): def draw_leader_annotation(self, obj):
@@ -427,7 +433,9 @@ class SvgWriter:
(symbol_position * self.svg_scale)[1], (symbol_position * self.svg_scale)[1],
) )
self.svg.add(self.svg.use("#elevation-arrow", insert=tuple(symbol_position * self.svg_scale), transform=transform)) self.svg.add(
self.svg.use("#elevation-arrow", insert=tuple(symbol_position * self.svg_scale), transform=transform)
)
self.svg.add(self.svg.use("#elevation-tag", insert=tuple(symbol_position * self.svg_scale))) self.svg.add(self.svg.use("#elevation-tag", insert=tuple(symbol_position * self.svg_scale)))
reference_id, sheet_id = self.get_reference_and_sheet_id_from_annotation(tool.Ifc.get_entity(obj)) reference_id, sheet_id = self.get_reference_and_sheet_id_from_annotation(tool.Ifc.get_entity(obj))
@@ -666,7 +674,7 @@ class SvgWriter:
dir2 = ((arc_matrix.inverted() @ arc_end_pts[1]) - (arc_matrix.inverted() @ center)).normalized() dir2 = ((arc_matrix.inverted() @ arc_end_pts[1]) - (arc_matrix.inverted() @ center)).normalized()
angle = -dir1.xy.angle_signed(dir2.xy) angle = -dir1.xy.angle_signed(dir2.xy)
#if is_reflex: # if is_reflex:
# angle = angle % (math.pi * 2) # angle = angle % (math.pi * 2)
# Center of gravity of all vertices, used to help position the text # Center of gravity of all vertices, used to help position the text
@@ -680,7 +688,9 @@ class SvgWriter:
arc_midpoint = center + ((cog - center).normalized() * radius) arc_midpoint = center + ((cog - center).normalized() * radius)
text_position = self.project_point_onto_camera(arc_midpoint) text_position = self.project_point_onto_camera(arc_midpoint)
text_position = Vector(((x_offset + text_position.x) * self.svg_scale, (y_offset - text_position.y) * self.svg_scale)) text_position = Vector(
((x_offset + text_position.x) * self.svg_scale, (y_offset - text_position.y) * self.svg_scale)
)
center_projected = self.project_point_onto_camera(center) center_projected = self.project_point_onto_camera(center)
center_position = Vector( center_position = Vector(
@@ -704,8 +714,12 @@ class SvgWriter:
# Draw SVG arc, see for details: http://xahlee.info/js/svg_circle_arc.html # Draw SVG arc, see for details: http://xahlee.info/js/svg_circle_arc.html
arc_proj_end_pts = [self.project_point_onto_camera(v) for v in arc_end_pts] arc_proj_end_pts = [self.project_point_onto_camera(v) for v in arc_end_pts]
p1 = Vector(((x_offset + arc_proj_end_pts[0].x) * self.svg_scale, (y_offset - arc_proj_end_pts[0].y) * self.svg_scale)) p1 = Vector(
p2 = Vector(((x_offset + arc_proj_end_pts[1].x) * self.svg_scale, (y_offset - arc_proj_end_pts[1].y) * self.svg_scale)) ((x_offset + arc_proj_end_pts[0].x) * self.svg_scale, (y_offset - arc_proj_end_pts[0].y) * self.svg_scale)
)
p2 = Vector(
((x_offset + arc_proj_end_pts[1].x) * self.svg_scale, (y_offset - arc_proj_end_pts[1].y) * self.svg_scale)
)
r = radius * self.svg_scale r = radius * self.svg_scale
# reflex = 1 if angle > math.pi else 0 # reflex = 1 if angle > math.pi else 0
reflex = is_reflex reflex = is_reflex
@@ -735,10 +749,16 @@ class SvgWriter:
path = self.svg.add(self.svg.path(d=d, class_=" ".join(classes))) path = self.svg.add(self.svg.path(d=d, class_=" ".join(classes)))
p0 = Vector( p0 = Vector(
((x_offset + projected_points[0].x) * self.svg_scale, (y_offset - projected_points[0].y) * self.svg_scale) (
(x_offset + projected_points[0].x) * self.svg_scale,
(y_offset - projected_points[0].y) * self.svg_scale,
)
) )
p1 = Vector( p1 = Vector(
((x_offset + projected_points[1].x) * self.svg_scale, (y_offset - projected_points[1].y) * self.svg_scale) (
(x_offset + projected_points[1].x) * self.svg_scale,
(y_offset - projected_points[1].y) * self.svg_scale,
)
) )
text_offset = (p0 - p1).xy.normalized() * 5 text_offset = (p0 - p1).xy.normalized() * 5
text_position = projected_points[0] text_position = projected_points[0]
@@ -823,7 +843,9 @@ class SvgWriter:
text_position = (mid * self.svg_scale) + perpendicular text_position = (mid * self.svg_scale) + perpendicular
rotation = math.degrees(vector.angle_signed(Vector((1, 0)))) rotation = math.degrees(vector.angle_signed(Vector((1, 0))))
line = self.svg.add( line = self.svg.add(
self.svg.line(start=tuple(start * self.svg_scale), end=tuple(end * self.svg_scale), class_=" ".join(classes)) self.svg.line(
start=tuple(start * self.svg_scale), end=tuple(end * self.svg_scale), class_=" ".join(classes)
)
) )
if text_override is not None: if text_override is not None:
text = text_override text = text_override
@@ -207,7 +207,10 @@ class UpdateRepresentation(bpy.types.Operator):
new_representation = ifcopenshell.api.run("geometry.add_representation", self.file, **representation_data) new_representation = ifcopenshell.api.run("geometry.add_representation", self.file, **representation_data)
if tool.Geometry.is_body_representation(new_representation): if tool.Geometry.is_body_representation(new_representation):
[tool.Geometry.run_style_add_style(obj=mat) for mat in tool.Geometry.get_object_materials_without_styles(obj)] [
tool.Geometry.run_style_add_style(obj=mat)
for mat in tool.Geometry.get_object_materials_without_styles(obj)
]
ifcopenshell.api.run( ifcopenshell.api.run(
"style.assign_representation_styles", "style.assign_representation_styles",
self.file, self.file,
@@ -84,7 +84,9 @@ class ObjectMaterialData:
@classmethod @classmethod
def materials(cls): def materials(cls):
return sorted([(str(m.id()), m.Name or "Unnamed", "") for m in tool.Ifc.get().by_type("IfcMaterial")], key=lambda x: x[1]) return sorted(
[(str(m.id()), m.Name or "Unnamed", "") for m in tool.Ifc.get().by_type("IfcMaterial")], key=lambda x: x[1]
)
@classmethod @classmethod
def type_material(cls): def type_material(cls):
@@ -138,6 +138,4 @@ class BIMObjectMaterialProperties(PropertyGroup):
items=getParameterizedProfileClasses, name="Parameterized Profile Classes" items=getParameterizedProfileClasses, name="Parameterized Profile Classes"
) )
getter_enum = { getter_enum = {"material": get_materials}
"material": get_materials
}
@@ -65,14 +65,14 @@ class MepGenerator:
def create_rectangle_segment(self): def create_rectangle_segment(self):
verts = [ verts = [
Vector((- self.width / 2, self.height / 2, 0)), Vector((-self.width / 2, self.height / 2, 0)),
Vector((- self.width / 2, - self.height / 2, 0)), Vector((-self.width / 2, -self.height / 2, 0)),
Vector((- self.width / 2, self.height / 2, self.length)), Vector((-self.width / 2, self.height / 2, self.length)),
Vector((- self.width / 2, - self.height / 2, self.length)), Vector((-self.width / 2, -self.height / 2, self.length)),
Vector((self.width / 2, self.height / 2, 0)), Vector((self.width / 2, self.height / 2, 0)),
Vector((self.width / 2, - self.height / 2, 0)), Vector((self.width / 2, -self.height / 2, 0)),
Vector((self.width / 2, self.height / 2, self.length)), Vector((self.width / 2, self.height / 2, self.length)),
Vector((self.width / 2, - self.height / 2, self.length)), Vector((self.width / 2, -self.height / 2, self.length)),
] ]
faces = [ faces = [
[1, 3, 2, 0], [1, 3, 2, 0],
@@ -120,9 +120,7 @@ class AddTypeInstance(bpy.types.Operator):
collection_obj = bpy.data.objects.get(collection.name) collection_obj = bpy.data.objects.get(collection.name)
bpy.ops.bim.assign_class(obj=obj.name, ifc_class=instance_class) bpy.ops.bim.assign_class(obj=obj.name, ifc_class=instance_class)
element = tool.Ifc.get_entity(obj) element = tool.Ifc.get_entity(obj)
blenderbim.core.type.assign_type( blenderbim.core.type.assign_type(tool.Ifc, tool.Type, element=element, type=relating_type)
tool.Ifc, tool.Type, element=element, type=relating_type
)
if building_obj: if building_obj:
if instance_class in ["IfcWindow", "IfcDoor"]: if instance_class in ["IfcWindow", "IfcDoor"]:
@@ -253,10 +253,7 @@ class ObjectActorData:
@classmethod @classmethod
def load(cls): def load(cls):
cls.is_loaded = True cls.is_loaded = True
cls.data = { cls.data = {"actor": cls.actor(), "actors": cls.actors()}
"actor": cls.actor(),
"actors": cls.actors()
}
@classmethod @classmethod
def actor(cls): def actor(cls):
@@ -279,9 +276,9 @@ class ObjectActorData:
roles = cls.get_roles(actor.TheActor.ThePerson) roles = cls.get_roles(actor.TheActor.ThePerson)
roles.extend(cls.get_roles(actor.TheActor.TheOrganization)) roles.extend(cls.get_roles(actor.TheActor.TheOrganization))
role = ", ".join(roles) role = ", ".join(roles)
results.append({ results.append(
"id": actor.id(), "name": actor.Name or "Unnamed", "role": role, "ifc_class": actor.is_a() {"id": actor.id(), "name": actor.Name or "Unnamed", "role": role, "ifc_class": actor.is_a()}
}) )
return results return results
@classmethod @classmethod
@@ -732,7 +732,7 @@ class ToggleLinkVisibility(bpy.types.Operator):
def toggle_wireframe(self, link): def toggle_wireframe(self, link):
objs = filter(lambda obj: "IfcOpeningElement" not in obj.name, link.collection.all_objects) objs = filter(lambda obj: "IfcOpeningElement" not in obj.name, link.collection.all_objects)
for i,obj in enumerate(objs): for i, obj in enumerate(objs):
if i == 0: if i == 0:
if obj.display_type == "WIRE": if obj.display_type == "WIRE":
display_type = "TEXTURED" display_type = "TEXTURED"
@@ -28,31 +28,31 @@ from ifcopenshell.api.pset_template.data import Data
from blenderbim.bim.ifc import IfcStore from blenderbim.bim.ifc import IfcStore
#This is just a temporary operator until # This is just a temporary operator until
#@Moult performs some of his refactor-magic ;) - vulevukusej # @Moult performs some of his refactor-magic ;) - vulevukusej
class RefreshPsetTemplates(bpy.types.Operator): class RefreshPsetTemplates(bpy.types.Operator):
bl_idname = "bim.refresh_psettemplates" bl_idname = "bim.refresh_psettemplates"
bl_label = "Refresh the data for PsetTemplates" bl_label = "Refresh the data for PsetTemplates"
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
def execute(self, context): def execute(self, context):
purge_templates() purge_templates()
purge_psets() purge_psets()
return {"FINISHED"} return {"FINISHED"}
class AddPsetFile(bpy.types.Operator): class AddPsetFile(bpy.types.Operator):
bl_idname = "bim.add_pset_file" bl_idname = "bim.add_pset_file"
bl_label = "Add Pset File" bl_label = "Add Pset File"
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
def invoke(self, context, event): def invoke(self, context, event):
return context.window_manager.invoke_props_dialog(self, width=250) return context.window_manager.invoke_props_dialog(self, width=250)
def draw(self, context): def draw(self, context):
self.props = context.scene.BIMPsetTemplateProperties self.props = context.scene.BIMPsetTemplateProperties
self.layout.prop(self.props, "new_template_filename", text="Filename:") self.layout.prop(self.props, "new_template_filename", text="Filename:")
def execute(self, context): def execute(self, context):
template = ifcopenshell.file() template = ifcopenshell.file()
filepath = os.path.join( filepath = os.path.join(
@@ -60,7 +60,7 @@ class AddPsetFile(bpy.types.Operator):
"pset", "pset",
self.props.new_template_filename + ".ifc", self.props.new_template_filename + ".ifc",
) )
template.create_entity( template.create_entity(
"IFCPROPERTYSETTEMPLATE", "IFCPROPERTYSETTEMPLATE",
**{ **{
@@ -68,14 +68,14 @@ class AddPsetFile(bpy.types.Operator):
"Name": "Name", "Name": "Name",
"Description": "Description", "Description": "Description",
"TemplateType": "PSET_TYPEDRIVENONLY", "TemplateType": "PSET_TYPEDRIVENONLY",
"ApplicableEntity": "IfcTypeObject" "ApplicableEntity": "IfcTypeObject",
} }
) )
template.write(filepath) template.write(filepath)
self.props.new_template_filename = "" self.props.new_template_filename = ""
return {"FINISHED"} return {"FINISHED"}
class AddPsetTemplate(bpy.types.Operator): class AddPsetTemplate(bpy.types.Operator):
bl_idname = "bim.add_pset_template" bl_idname = "bim.add_pset_template"
bl_label = "Add Pset Template" bl_label = "Add Pset Template"
@@ -190,33 +190,35 @@ class EnableEditingPropTemplate(bpy.types.Operator):
props.active_prop_template.primary_measure_type = template["PrimaryMeasureType"] props.active_prop_template.primary_measure_type = template["PrimaryMeasureType"]
props.active_prop_template.template_type = template["TemplateType"] props.active_prop_template.template_type = template["TemplateType"]
props.active_prop_template.enum_values.clear() props.active_prop_template.enum_values.clear()
if template["Enumerators"]: if template["Enumerators"]:
props.active_prop_template.enum_values.clear() props.active_prop_template.enum_values.clear()
data_type = props.active_prop_template.get_value_name() data_type = props.active_prop_template.get_value_name()
for e in template["Enumerators"].EnumerationValues: for e in template["Enumerators"].EnumerationValues:
new = props.active_prop_template.enum_values.add() new = props.active_prop_template.enum_values.add()
setattr(new, data_type, e.wrappedValue) setattr(new, data_type, e.wrappedValue)
return {"FINISHED"} return {"FINISHED"}
class DeletePropEnum(bpy.types.Operator): class DeletePropEnum(bpy.types.Operator):
bl_idname = "bim.delete_prop_enum" bl_idname = "bim.delete_prop_enum"
bl_label = "delete property enumeration" bl_label = "delete property enumeration"
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
index: bpy.props.IntProperty() index: bpy.props.IntProperty()
def execute(self, context): def execute(self, context):
active_prop = context.scene.BIMPsetTemplateProperties.active_prop_template active_prop = context.scene.BIMPsetTemplateProperties.active_prop_template
active_prop.enum_values.remove(self.index) active_prop.enum_values.remove(self.index)
return {"FINISHED"} return {"FINISHED"}
class AddPropEnum(bpy.types.Operator): class AddPropEnum(bpy.types.Operator):
bl_idname = "bim.add_prop_enum" bl_idname = "bim.add_prop_enum"
bl_label = "add property enumeration" bl_label = "add property enumeration"
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
index: bpy.props.IntProperty() index: bpy.props.IntProperty()
def execute(self, context): def execute(self, context):
active_prop = context.scene.BIMPsetTemplateProperties.active_prop_template active_prop = context.scene.BIMPsetTemplateProperties.active_prop_template
active_prop.enum_values.add() active_prop.enum_values.add()
@@ -380,26 +382,27 @@ class EditPropTemplate(bpy.types.Operator):
"Description": props.active_prop_template.description, "Description": props.active_prop_template.description,
"PrimaryMeasureType": props.active_prop_template.primary_measure_type, "PrimaryMeasureType": props.active_prop_template.primary_measure_type,
"TemplateType": props.active_prop_template.template_type, "TemplateType": props.active_prop_template.template_type,
"Enumerators": enumerator "Enumerators": enumerator,
}, },
} }
) )
Data.load(IfcStore.pset_template_file) Data.load(IfcStore.pset_template_file)
bpy.ops.bim.disable_editing_prop_template() bpy.ops.bim.disable_editing_prop_template()
return {"FINISHED"} return {"FINISHED"}
#TODO -This will need to go into the # TODO -This will need to go into the
# api code at some point - vulevukusej # api code at some point - vulevukusej
def generate_prop_enum(self, props): def generate_prop_enum(self, props):
self.file = IfcStore.pset_template_file self.file = IfcStore.pset_template_file
data_type = props.active_prop_template.get_value_name() data_type = props.active_prop_template.get_value_name()
prop = props.active_prop_template prop = props.active_prop_template
prop_enum = self.file.create_entity( prop_enum = self.file.create_entity(
"IFCPROPERTYENUMERATION", "IFCPROPERTYENUMERATION",
Name=prop.name, Name=prop.name,
EnumerationValues=tuple(self.file.create_entity( EnumerationValues=tuple(
prop.primary_measure_type, ev[data_type]) for ev in prop.enum_values) self.file.create_entity(prop.primary_measure_type, ev[data_type]) for ev in prop.enum_values
) ),
)
return prop_enum return prop_enum
def rollback(self, data): def rollback(self, data):
@@ -164,11 +164,8 @@ class PropTemplate(PropertyGroup):
description: StringProperty(name="Description") description: StringProperty(name="Description")
primary_measure_type: EnumProperty(items=get_primary_measure_type, name="Primary Measure Type") primary_measure_type: EnumProperty(items=get_primary_measure_type, name="Primary Measure Type")
template_type: EnumProperty( template_type: EnumProperty(
items=[ items=[("P_SINGLEVALUE", "P_SINGLEVALUE", ""), ("P_ENUMERATEDVALUE", "P_ENUMERATEDVALUE", "")],
("P_SINGLEVALUE","P_SINGLEVALUE",""), name="Template Type",
("P_ENUMERATEDVALUE","P_ENUMERATEDVALUE","")
],
name="Template Type"
) )
enum_values: CollectionProperty(type=EnumerationValues) enum_values: CollectionProperty(type=EnumerationValues)
getter_enum = { getter_enum = {
@@ -38,13 +38,13 @@ class BIM_PT_pset_template(Panel):
def draw(self, context): def draw(self, context):
layout = self.layout layout = self.layout
props = context.scene.BIMPsetTemplateProperties props = context.scene.BIMPsetTemplateProperties
row = layout.row(align=True) row = layout.row(align=True)
prop_with_search(row, props, "pset_template_files", text="") prop_with_search(row, props, "pset_template_files", text="")
row.operator("bim.save_pset_template_file", text="", icon="EXPORT") row.operator("bim.save_pset_template_file", text="", icon="EXPORT")
row.operator("bim.add_pset_file",icon="ADD",text="") row.operator("bim.add_pset_file", icon="ADD", text="")
row.operator("bim.refresh_psettemplates", icon="FILE_REFRESH", text="") row.operator("bim.refresh_psettemplates", icon="FILE_REFRESH", text="")
row = layout.row(align=True) row = layout.row(align=True)
if bool(getPsetTemplates(props, context)): if bool(getPsetTemplates(props, context)):
@@ -75,7 +75,7 @@ class BIM_PT_pset_template(Panel):
prop_with_search(layout, props.active_pset_template, "template_type") prop_with_search(layout, props.active_pset_template, "template_type")
row = layout.row() row = layout.row()
row.prop(props.active_pset_template, "applicable_entity") row.prop(props.active_pset_template, "applicable_entity")
else: else:
pset_template = Data.pset_templates[int(props.pset_templates)] pset_template = Data.pset_templates[int(props.pset_templates)]
for name, value in pset_template.items(): for name, value in pset_template.items():
if name == "id" or name == "type" or name == "HasPropertyTemplates": if name == "id" or name == "type" or name == "HasPropertyTemplates":
@@ -87,7 +87,7 @@ class BIM_PT_pset_template(Panel):
row = layout.row(align=True) row = layout.row(align=True)
row.label(text="Property Templates", icon="COPY_ID") row.label(text="Property Templates", icon="COPY_ID")
row.operator("bim.add_prop_template", icon="ADD", text="") row.operator("bim.add_prop_template", icon="ADD", text="")
row = layout.row() row = layout.row()
row.label(text="Name | Description | PrimaryMeasureType | TemplateType") row.label(text="Name | Description | PrimaryMeasureType | TemplateType")
@@ -100,26 +100,27 @@ class BIM_PT_pset_template(Panel):
row.prop(props.active_prop_template, "description", text="") row.prop(props.active_prop_template, "description", text="")
prop_with_search(row, props.active_prop_template, "primary_measure_type", text="") prop_with_search(row, props.active_prop_template, "primary_measure_type", text="")
row.prop(props.active_prop_template, "template_type", text="") row.prop(props.active_prop_template, "template_type", text="")
if props.active_prop_template.template_type == "P_ENUMERATEDVALUE": if props.active_prop_template.template_type == "P_ENUMERATEDVALUE":
row = layout.row(align=True) row = layout.row(align=True)
split = row.split(factor=0.2) split = row.split(factor=0.2)
c=split.column() c = split.column()
c.label(text="Enumerations:",) c.label(
text="Enumerations:",
c=split.column() )
c = split.column()
box = c.box() box = c.box()
grid = box.column_flow(columns=4) grid = box.column_flow(columns=4)
value_name = props.active_prop_template.get_value_name() value_name = props.active_prop_template.get_value_name()
r = grid.row() r = grid.row()
r.operator("bim.add_prop_enum", text="Add Enum") r.operator("bim.add_prop_enum", text="Add Enum")
for k,v in enumerate(props.active_prop_template.enum_values): for k, v in enumerate(props.active_prop_template.enum_values):
r = grid.row(align=True) r = grid.row(align=True)
r.prop(v, value_name, text="") r.prop(v, value_name, text="")
op = r.operator("bim.delete_prop_enum", icon="X", text="") op = r.operator("bim.delete_prop_enum", icon="X", text="")
op.index = k op.index = k
else: else:
row.label(text=prop_template["Name"]) row.label(text=prop_template["Name"])
row.label(text=prop_template["Description"]) row.label(text=prop_template["Description"])
@@ -624,6 +624,7 @@ class EditTaskTime(bpy.types.Operator):
if prop.is_null: if prop.is_null:
attributes[prop.name] = None attributes[prop.name] = None
return True return True
# TODO make this parse PT32 as P4D
attributes[prop.name] = helper.parse_duration(prop.string_value) attributes[prop.name] = helper.parse_duration(prop.string_value)
return True return True
@@ -54,7 +54,7 @@ class BIM_PT_styles(Panel):
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.alignment = "RIGHT" row.alignment = "RIGHT"
#row.operator("bim.add_presentation_style", text="", icon="ADD") # row.operator("bim.add_presentation_style", text="", icon="ADD")
if self.props.styles and self.props.active_style_index < len(self.props.styles): if self.props.styles and self.props.active_style_index < len(self.props.styles):
style = self.props.styles[self.props.active_style_index] style = self.props.styles[self.props.active_style_index]
op = row.operator("bim.select_by_style", text="", icon="RESTRICT_SELECT_OFF") op = row.operator("bim.select_by_style", text="", icon="RESTRICT_SELECT_OFF")
@@ -37,7 +37,7 @@ class UnitsData:
"unit_classes": cls.unit_classes(), "unit_classes": cls.unit_classes(),
"named_unit_types": cls.named_unit_types(), "named_unit_types": cls.named_unit_types(),
"conversion_unit_types": cls.conversion_unit_types(), "conversion_unit_types": cls.conversion_unit_types(),
"total_units": cls.get_total_units() "total_units": cls.get_total_units(),
} }
cls.is_loaded = True cls.is_loaded = True
+1 -1
View File
@@ -560,5 +560,5 @@ class BIM_OT_enum_property_search(bpy.types.Operator):
def draw(self, context): def draw(self, context):
# Mandatory to access context.data in update : # Mandatory to access context.data in update :
self.layout.context_pointer_set(name="data", data=self.data) self.layout.context_pointer_set(name="data", data=self.data)
self.layout.prop_search(self, "dummy_name", self, "collection_name") self.layout.prop_search(self, "dummy_name", self, "collection_name")
+1
View File
@@ -195,6 +195,7 @@ class Attribute(PropertyGroup):
is_null: BoolProperty(name="Is Null") is_null: BoolProperty(name="Is Null")
is_optional: BoolProperty(name="Is Optional") is_optional: BoolProperty(name="Is Optional")
is_uri: BoolProperty(name="Is Uri", default=False) is_uri: BoolProperty(name="Is Uri", default=False)
is_selected: BoolProperty(name="Is Selected", default=False)
def get_value(self): def get_value(self):
if self.is_null: if self.is_null:
+2 -6
View File
@@ -375,15 +375,11 @@ class Drawing(blenderbim.core.tool.Drawing):
@classmethod @classmethod
def open_spreadsheet(cls, uri): def open_spreadsheet(cls, uri):
cls.open_with_user_command( cls.open_with_user_command(bpy.context.preferences.addons["blenderbim"].preferences.spreadsheet_command, uri)
bpy.context.preferences.addons["blenderbim"].preferences.spreadsheet_command, uri
)
@classmethod @classmethod
def open_svg(cls, uri): def open_svg(cls, uri):
cls.open_with_user_command( cls.open_with_user_command(bpy.context.preferences.addons["blenderbim"].preferences.svg_command, uri)
bpy.context.preferences.addons["blenderbim"].preferences.svg_command, uri
)
@classmethod @classmethod
def run_root_assign_class( def run_root_assign_class(
+3 -1
View File
@@ -75,7 +75,9 @@ class Material(blenderbim.core.tool.Material):
new = props.materials.add() new = props.materials.add()
new.ifc_definition_id = material.id() new.ifc_definition_id = material.id()
new.name = get_name(material) new.name = get_name(material)
new.total_elements = len(ifcopenshell.util.element.get_elements_by_material(tool.Ifc.get(), material)) new.total_elements = len(
ifcopenshell.util.element.get_elements_by_material(tool.Ifc.get(), material)
)
return return
for material in materials: for material in materials:
new = props.materials.add() new = props.materials.add()
-1
View File
@@ -125,7 +125,6 @@ class TestHidePorts:
system.delete_element_objects(["port"]).should_be_called() system.delete_element_objects(["port"]).should_be_called()
subject.hide_ports(ifc, system, element="element") subject.hide_ports(ifc, system, element="element")
def test_syncing_locations_if_objects_moved_prior_to_hiding_ports(self, ifc, system): def test_syncing_locations_if_objects_moved_prior_to_hiding_ports(self, ifc, system):
ifc.get_object("element").should_be_called().will_return("obj") ifc.get_object("element").should_be_called().will_return("obj")
ifc.is_moved("obj").should_be_called().will_return(True) ifc.is_moved("obj").should_be_called().will_return(True)
+17 -16
View File
@@ -163,6 +163,7 @@ class TestGetMapConversionAttributes(NewFile):
"Scale": 6.0, "Scale": 6.0,
} }
class TestGetTrueNorthAttributes(NewFile): class TestGetTrueNorthAttributes(NewFile):
def test_run(self): def test_run(self):
TestImportTrueNorth().test_run() TestImportTrueNorth().test_run()
@@ -185,18 +186,18 @@ class TestDisableEditing(NewFile):
class TestSetCoordinates(NewFile): class TestSetCoordinates(NewFile):
def test_run(self): def test_run(self):
subject.set_coordinates("input", [1., 2., 3.]) subject.set_coordinates("input", [1.0, 2.0, 3.0])
assert bpy.context.scene.BIMGeoreferenceProperties.coordinate_input == "1.0,2.0,3.0" assert bpy.context.scene.BIMGeoreferenceProperties.coordinate_input == "1.0,2.0,3.0"
subject.set_coordinates("output", [4., 5., 6.]) subject.set_coordinates("output", [4.0, 5.0, 6.0])
assert bpy.context.scene.BIMGeoreferenceProperties.coordinate_output == "4.0,5.0,6.0" assert bpy.context.scene.BIMGeoreferenceProperties.coordinate_output == "4.0,5.0,6.0"
class TestGetCoordinates(NewFile): class TestGetCoordinates(NewFile):
def test_run(self): def test_run(self):
bpy.context.scene.BIMGeoreferenceProperties.coordinate_input = "1.0,2.0,3.0" bpy.context.scene.BIMGeoreferenceProperties.coordinate_input = "1.0,2.0,3.0"
assert subject.get_coordinates("input") == [1., 2., 3.] assert subject.get_coordinates("input") == [1.0, 2.0, 3.0]
bpy.context.scene.BIMGeoreferenceProperties.coordinate_output = "4.0,5.0,6.0" bpy.context.scene.BIMGeoreferenceProperties.coordinate_output = "4.0,5.0,6.0"
assert subject.get_coordinates("output") == [4., 5., 6.] assert subject.get_coordinates("output") == [4.0, 5.0, 6.0]
class TestGetCursorLocation(NewFile): class TestGetCursorLocation(NewFile):
@@ -207,8 +208,8 @@ class TestGetCursorLocation(NewFile):
ifcopenshell.api.run("context.add_context", ifc, context_type="Model") ifcopenshell.api.run("context.add_context", ifc, context_type="Model")
unit = ifcopenshell.api.run("unit.add_si_unit", ifc, unit_type="LENGTHUNIT", prefix="MILLI", name="METRE") unit = ifcopenshell.api.run("unit.add_si_unit", ifc, unit_type="LENGTHUNIT", prefix="MILLI", name="METRE")
ifcopenshell.api.run("unit.assign_unit", ifc, units=[unit]) ifcopenshell.api.run("unit.assign_unit", ifc, units=[unit])
bpy.context.scene.cursor.location = (1., 2., 3.) bpy.context.scene.cursor.location = (1.0, 2.0, 3.0)
assert subject.get_cursor_location() == [1000., 2000., 3000.] assert subject.get_cursor_location() == [1000.0, 2000.0, 3000.0]
class TestSetCursorLocation(NewFile): class TestSetCursorLocation(NewFile):
@@ -219,8 +220,8 @@ class TestSetCursorLocation(NewFile):
ifcopenshell.api.run("context.add_context", ifc, context_type="Model") ifcopenshell.api.run("context.add_context", ifc, context_type="Model")
unit = ifcopenshell.api.run("unit.add_si_unit", ifc, unit_type="LENGTHUNIT", prefix="MILLI", name="METRE") unit = ifcopenshell.api.run("unit.add_si_unit", ifc, unit_type="LENGTHUNIT", prefix="MILLI", name="METRE")
ifcopenshell.api.run("unit.assign_unit", ifc, units=[unit]) ifcopenshell.api.run("unit.assign_unit", ifc, units=[unit])
subject.set_cursor_location([1000., 2000., 3000.]) subject.set_cursor_location([1000.0, 2000.0, 3000.0])
assert list(bpy.context.scene.cursor.location) == [1., 2., 3.] assert list(bpy.context.scene.cursor.location) == [1.0, 2.0, 3.0]
class TestSetIfcTrueNorth(NewFile): class TestSetIfcTrueNorth(NewFile):
@@ -258,13 +259,13 @@ class TestGetMapConversion(NewFile):
class TestXyz2Enh(NewFile): class TestXyz2Enh(NewFile):
def test_run(self): def test_run(self):
assert subject.xyz2enh([0., 0., 0.], None) == [0., 0., 0.] assert subject.xyz2enh([0.0, 0.0, 0.0], None) == [0.0, 0.0, 0.0]
def test_using_the_blender_offset(self): def test_using_the_blender_offset(self):
props = bpy.context.scene.BIMGeoreferenceProperties props = bpy.context.scene.BIMGeoreferenceProperties
props.has_blender_offset = True props.has_blender_offset = True
props.blender_eastings = "1.0" props.blender_eastings = "1.0"
assert subject.xyz2enh([0., 0., 0.], None) == (1., 0., 0.) assert subject.xyz2enh([0.0, 0.0, 0.0], None) == (1.0, 0.0, 0.0)
def test_using_the_map_conversion(self): def test_using_the_map_conversion(self):
ifc = ifcopenshell.file() ifc = ifcopenshell.file()
@@ -274,7 +275,7 @@ class TestXyz2Enh(NewFile):
ifcopenshell.api.run("georeference.add_georeferencing", ifc) ifcopenshell.api.run("georeference.add_georeferencing", ifc)
map_conversion = ifc.by_type("IfcMapConversion")[0] map_conversion = ifc.by_type("IfcMapConversion")[0]
map_conversion.Eastings = 1.0 map_conversion.Eastings = 1.0
assert subject.xyz2enh([0., 0., 0.], map_conversion) == (1., 0., 0.) assert subject.xyz2enh([0.0, 0.0, 0.0], map_conversion) == (1.0, 0.0, 0.0)
def test_applying_both_blender_offset_and_map_conversion(self): def test_applying_both_blender_offset_and_map_conversion(self):
props = bpy.context.scene.BIMGeoreferenceProperties props = bpy.context.scene.BIMGeoreferenceProperties
@@ -287,18 +288,18 @@ class TestXyz2Enh(NewFile):
ifcopenshell.api.run("georeference.add_georeferencing", ifc) ifcopenshell.api.run("georeference.add_georeferencing", ifc)
map_conversion = ifc.by_type("IfcMapConversion")[0] map_conversion = ifc.by_type("IfcMapConversion")[0]
map_conversion.Northings = 1.0 map_conversion.Northings = 1.0
assert subject.xyz2enh([0., 0., 0.], map_conversion) == (1., 1., 0.) assert subject.xyz2enh([0.0, 0.0, 0.0], map_conversion) == (1.0, 1.0, 0.0)
class TestEnh2Xyz(NewFile): class TestEnh2Xyz(NewFile):
def test_run(self): def test_run(self):
assert subject.enh2xyz([0., 0., 0.], None) == [0., 0., 0.] assert subject.enh2xyz([0.0, 0.0, 0.0], None) == [0.0, 0.0, 0.0]
def test_using_the_blender_offset(self): def test_using_the_blender_offset(self):
props = bpy.context.scene.BIMGeoreferenceProperties props = bpy.context.scene.BIMGeoreferenceProperties
props.has_blender_offset = True props.has_blender_offset = True
props.blender_eastings = "1.0" props.blender_eastings = "1.0"
assert subject.enh2xyz([0., 0., 0.], None) == (-1., 0., 0.) assert subject.enh2xyz([0.0, 0.0, 0.0], None) == (-1.0, 0.0, 0.0)
def test_using_the_map_conversion(self): def test_using_the_map_conversion(self):
ifc = ifcopenshell.file() ifc = ifcopenshell.file()
@@ -308,7 +309,7 @@ class TestEnh2Xyz(NewFile):
ifcopenshell.api.run("georeference.add_georeferencing", ifc) ifcopenshell.api.run("georeference.add_georeferencing", ifc)
map_conversion = ifc.by_type("IfcMapConversion")[0] map_conversion = ifc.by_type("IfcMapConversion")[0]
map_conversion.Eastings = 1.0 map_conversion.Eastings = 1.0
assert subject.enh2xyz([0., 0., 0.], map_conversion) == (-1., 0., 0.) assert subject.enh2xyz([0.0, 0.0, 0.0], map_conversion) == (-1.0, 0.0, 0.0)
def test_applying_both_blender_offset_and_map_conversion(self): def test_applying_both_blender_offset_and_map_conversion(self):
props = bpy.context.scene.BIMGeoreferenceProperties props = bpy.context.scene.BIMGeoreferenceProperties
@@ -321,7 +322,7 @@ class TestEnh2Xyz(NewFile):
ifcopenshell.api.run("georeference.add_georeferencing", ifc) ifcopenshell.api.run("georeference.add_georeferencing", ifc)
map_conversion = ifc.by_type("IfcMapConversion")[0] map_conversion = ifc.by_type("IfcMapConversion")[0]
map_conversion.Northings = 1.0 map_conversion.Northings = 1.0
assert subject.enh2xyz([0., 0., 0.], map_conversion) == (-1., -1., 0.) assert subject.enh2xyz([0.0, 0.0, 0.0], map_conversion) == (-1.0, -1.0, 0.0)
class TestSetIfcGridNorth(NewFile): class TestSetIfcGridNorth(NewFile):