mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-26 02:07:36 +00:00
Run black, and add black to a "qa" target to make it a standardised process.
This commit is contained in:
@@ -457,6 +457,10 @@ test-core:
|
|||||||
test-bim:
|
test-bim:
|
||||||
pytest test/bim
|
pytest test/bim
|
||||||
|
|
||||||
|
.PHONY: qa
|
||||||
|
qa:
|
||||||
|
black .
|
||||||
|
|
||||||
.PHONY: coverage
|
.PHONY: coverage
|
||||||
coverage:
|
coverage:
|
||||||
coverage run --source blenderbim.core -m pytest -p no:pytest-blender test/core
|
coverage run --source blenderbim.core -m pytest -p no:pytest-blender test/core
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -158,7 +157,6 @@ class IfcExporter:
|
|||||||
else:
|
else:
|
||||||
parent_collection = obj.users_collection[0]
|
parent_collection = obj.users_collection[0]
|
||||||
|
|
||||||
|
|
||||||
parent_obj = bpy.data.objects.get(parent_collection.name)
|
parent_obj = bpy.data.objects.get(parent_collection.name)
|
||||||
if not parent_obj or not parent_obj.BIMObjectProperties.ifc_definition_id:
|
if not parent_obj or not parent_obj.BIMObjectProperties.ifc_definition_id:
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -456,9 +455,9 @@ class IfcImporter:
|
|||||||
obj.BIMObjectProperties.blender_offset_type = "CARTESIAN_POINT"
|
obj.BIMObjectProperties.blender_offset_type = "CARTESIAN_POINT"
|
||||||
|
|
||||||
if self.ifc_import_settings.should_offset_model:
|
if self.ifc_import_settings.should_offset_model:
|
||||||
matrix[0,3] += self.ifc_import_settings.model_offset_coordinates[0]
|
matrix[0, 3] += self.ifc_import_settings.model_offset_coordinates[0]
|
||||||
matrix[1,3] += self.ifc_import_settings.model_offset_coordinates[1]
|
matrix[1, 3] += self.ifc_import_settings.model_offset_coordinates[1]
|
||||||
matrix[2,3] += self.ifc_import_settings.model_offset_coordinates[2]
|
matrix[2, 3] += self.ifc_import_settings.model_offset_coordinates[2]
|
||||||
|
|
||||||
return mathutils.Matrix(matrix.tolist())
|
return mathutils.Matrix(matrix.tolist())
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -16,4 +15,3 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
|
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -56,7 +55,9 @@ class BIM_PT_aggregate(Panel):
|
|||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
row.prop(props, "relating_object", text="")
|
row.prop(props, "relating_object", text="")
|
||||||
if props.relating_object:
|
if props.relating_object:
|
||||||
row.operator("bim.assign_object", icon="CHECKMARK", text="").relating_object = props.relating_object.name
|
row.operator(
|
||||||
|
"bim.assign_object", icon="CHECKMARK", text=""
|
||||||
|
).relating_object = props.relating_object.name
|
||||||
row.operator("bim.disable_editing_aggregate", icon="CANCEL", text="")
|
row.operator("bim.disable_editing_aggregate", icon="CANCEL", text="")
|
||||||
else:
|
else:
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -119,9 +118,7 @@ class EditAttributes(bpy.types.Operator):
|
|||||||
elif attribute["type"] == "enum":
|
elif attribute["type"] == "enum":
|
||||||
attributes[attribute["name"]] = blender_attribute.enum_value
|
attributes[attribute["name"]] = blender_attribute.enum_value
|
||||||
product = self.file.by_id(oprops.ifc_definition_id)
|
product = self.file.by_id(oprops.ifc_definition_id)
|
||||||
ifcopenshell.api.run(
|
ifcopenshell.api.run("attribute.edit_attributes", self.file, **{"product": product, "attributes": attributes})
|
||||||
"attribute.edit_attributes", self.file, **{"product": product, "attributes": attributes}
|
|
||||||
)
|
|
||||||
Data.load(IfcStore.get_file(), oprops.ifc_definition_id)
|
Data.load(IfcStore.get_file(), oprops.ifc_definition_id)
|
||||||
bpy.ops.bim.disable_editing_attributes(obj=obj.name, obj_type=self.obj_type)
|
bpy.ops.bim.disable_editing_attributes(obj=obj.name, obj_type=self.obj_type)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -32,6 +31,7 @@ from bpy.props import (
|
|||||||
CollectionProperty,
|
CollectionProperty,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class BIMAttributeProperties(PropertyGroup):
|
class BIMAttributeProperties(PropertyGroup):
|
||||||
attributes: CollectionProperty(name="Attributes", type=Attribute)
|
attributes: CollectionProperty(name="Attributes", type=Attribute)
|
||||||
is_editing_attributes: BoolProperty(name="Is Editing Attributes")
|
is_editing_attributes: BoolProperty(name="Is Editing Attributes")
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -68,6 +67,7 @@ class AuginCreateNewModel(bpy.types.Operator):
|
|||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
import boto3
|
import boto3
|
||||||
from botocore.config import Config
|
from botocore.config import Config
|
||||||
|
|
||||||
props = context.scene.AuginProperties
|
props = context.scene.AuginProperties
|
||||||
|
|
||||||
# Create project
|
# Create project
|
||||||
@@ -135,7 +135,6 @@ class AuginCreateNewModel(bpy.types.Operator):
|
|||||||
client.upload_file(context.scene.BIMProperties.ifc_file, result["s3_bucket"], result["model_path"])
|
client.upload_file(context.scene.BIMProperties.ifc_file, result["s3_bucket"], result["model_path"])
|
||||||
client.upload_file(thumb_path, result["s3_bucket"], result["thumb_path"])
|
client.upload_file(thumb_path, result["s3_bucket"], result["thumb_path"])
|
||||||
|
|
||||||
|
|
||||||
# Notify done
|
# Notify done
|
||||||
url = "https://server.auge.pro.br/API/v3/augin_rest.php/files_uploaded"
|
url = "https://server.auge.pro.br/API/v3/augin_rest.php/files_uploaded"
|
||||||
payload = {
|
payload = {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -20,6 +19,7 @@
|
|||||||
import bcf
|
import bcf
|
||||||
import bcf.v2.bcfxml
|
import bcf.v2.bcfxml
|
||||||
|
|
||||||
|
|
||||||
class BcfStore:
|
class BcfStore:
|
||||||
bcfxml = None
|
bcfxml = None
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -31,6 +30,7 @@ from blenderbim.bim.ifc import IfcStore
|
|||||||
from math import radians, degrees, atan, tan, cos, sin
|
from math import radians, degrees, atan, tan, cos, sin
|
||||||
from mathutils import Vector, Matrix, Euler, geometry
|
from mathutils import Vector, Matrix, Euler, geometry
|
||||||
|
|
||||||
|
|
||||||
class NewBcfProject(bpy.types.Operator):
|
class NewBcfProject(bpy.types.Operator):
|
||||||
bl_idname = "bim.new_bcf_project"
|
bl_idname = "bim.new_bcf_project"
|
||||||
bl_label = "New BCF Project"
|
bl_label = "New BCF Project"
|
||||||
@@ -79,7 +79,7 @@ class LoadBcfTopics(bpy.types.Operator):
|
|||||||
context.scene.BCFProperties.topics.clear()
|
context.scene.BCFProperties.topics.clear()
|
||||||
for index, topic_guid in enumerate(bcfxml.topics.keys()):
|
for index, topic_guid in enumerate(bcfxml.topics.keys()):
|
||||||
new = context.scene.BCFProperties.topics.add()
|
new = context.scene.BCFProperties.topics.add()
|
||||||
bpy.ops.bim.load_bcf_topic(topic_guid = topic_guid, topic_index = index)
|
bpy.ops.bim.load_bcf_topic(topic_guid=topic_guid, topic_index=index)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
@@ -107,7 +107,7 @@ class LoadBcfTopic(bpy.types.Operator):
|
|||||||
"modified_author": topic.modified_author,
|
"modified_author": topic.modified_author,
|
||||||
"assigned_to": topic.assigned_to,
|
"assigned_to": topic.assigned_to,
|
||||||
"due_date": topic.due_date,
|
"due_date": topic.due_date,
|
||||||
"description": topic.description
|
"description": topic.description,
|
||||||
}
|
}
|
||||||
for key, value in data_map.items():
|
for key, value in data_map.items():
|
||||||
if value is not None:
|
if value is not None:
|
||||||
@@ -128,7 +128,7 @@ class LoadBcfTopic(bpy.types.Operator):
|
|||||||
"type": topic.bim_snippet.snippet_type,
|
"type": topic.bim_snippet.snippet_type,
|
||||||
"is_external": topic.bim_snippet.is_external,
|
"is_external": topic.bim_snippet.is_external,
|
||||||
"reference": topic.bim_snippet.reference,
|
"reference": topic.bim_snippet.reference,
|
||||||
"schema": topic.bim_snippet.reference_schema
|
"schema": topic.bim_snippet.reference_schema,
|
||||||
}
|
}
|
||||||
for key, value in data_map.items():
|
for key, value in data_map.items():
|
||||||
if value is not None:
|
if value is not None:
|
||||||
@@ -141,7 +141,7 @@ class LoadBcfTopic(bpy.types.Operator):
|
|||||||
"reference": doc.referenced_document,
|
"reference": doc.referenced_document,
|
||||||
"description": doc.description,
|
"description": doc.description,
|
||||||
"guid": doc.guid,
|
"guid": doc.guid,
|
||||||
"is_external": doc.is_external
|
"is_external": doc.is_external,
|
||||||
}
|
}
|
||||||
for key, value in data_map.items():
|
for key, value in data_map.items():
|
||||||
if value is not None:
|
if value is not None:
|
||||||
@@ -152,7 +152,7 @@ class LoadBcfTopic(bpy.types.Operator):
|
|||||||
new_related_topic = new.related_topics.add()
|
new_related_topic = new.related_topics.add()
|
||||||
new_related_topic.name = related_topic.guid
|
new_related_topic.name = related_topic.guid
|
||||||
|
|
||||||
bpy.ops.bim.load_bcf_comments(topic_guid = topic.guid)
|
bpy.ops.bim.load_bcf_comments(topic_guid=topic.guid)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
@@ -287,11 +287,12 @@ class AddBcfBimSnippet(bpy.types.Operator):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def poll(cls, context):
|
def poll(cls, context):
|
||||||
return all((getattr(context.scene.BCFProperties, attr, False) for attr in (
|
return all(
|
||||||
"bim_snippet_reference",
|
(
|
||||||
"bim_snippet_schema",
|
getattr(context.scene.BCFProperties, attr, False)
|
||||||
"bim_snippet_type"
|
for attr in ("bim_snippet_reference", "bim_snippet_schema", "bim_snippet_type")
|
||||||
)))
|
)
|
||||||
|
)
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
bcfxml = bcfstore.BcfStore.get_bcfxml()
|
bcfxml = bcfstore.BcfStore.get_bcfxml()
|
||||||
@@ -303,7 +304,7 @@ class AddBcfBimSnippet(bpy.types.Operator):
|
|||||||
bim_snippet.reference_schema = props.bim_snippet_schema
|
bim_snippet.reference_schema = props.bim_snippet_schema
|
||||||
bim_snippet.snippet_type = props.bim_snippet_type
|
bim_snippet.snippet_type = props.bim_snippet_type
|
||||||
bcfxml.add_bim_snippet(topic, bim_snippet)
|
bcfxml.add_bim_snippet(topic, bim_snippet)
|
||||||
bpy.ops.bim.load_bcf_topic(topic_guid = topic.guid, topic_index = props.active_topic_index)
|
bpy.ops.bim.load_bcf_topic(topic_guid=topic.guid, topic_index=props.active_topic_index)
|
||||||
bim_snippet.reference = ""
|
bim_snippet.reference = ""
|
||||||
bim_snippet.reference_schema = ""
|
bim_snippet.reference_schema = ""
|
||||||
bim_snippet.snippet_type = ""
|
bim_snippet.snippet_type = ""
|
||||||
@@ -316,7 +317,7 @@ class AddBcfRelatedTopic(bpy.types.Operator):
|
|||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def poll(cls, context):
|
def poll(cls, context):
|
||||||
bcfxml = bcfstore.BcfStore.get_bcfxml()
|
bcfxml = bcfstore.BcfStore.get_bcfxml()
|
||||||
props = context.scene.BCFProperties
|
props = context.scene.BCFProperties
|
||||||
blender_topic = props.active_topic
|
blender_topic = props.active_topic
|
||||||
@@ -347,7 +348,7 @@ class AddBcfRelatedTopic(bpy.types.Operator):
|
|||||||
topic = bcfxml.topics[blender_topic.name]
|
topic = bcfxml.topics[blender_topic.name]
|
||||||
topic.related_topics.append(related_topic)
|
topic.related_topics.append(related_topic)
|
||||||
bcfxml.edit_topic(topic)
|
bcfxml.edit_topic(topic)
|
||||||
bpy.ops.bim.load_bcf_topic(topic_guid = topic.guid, topic_index = props.active_topic_index)
|
bpy.ops.bim.load_bcf_topic(topic_guid=topic.guid, topic_index=props.active_topic_index)
|
||||||
props.related_topic = ""
|
props.related_topic = ""
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
@@ -516,7 +517,7 @@ class AddBcfReferenceLink(bpy.types.Operator):
|
|||||||
topic = bcfxml.topics[blender_topic.name]
|
topic = bcfxml.topics[blender_topic.name]
|
||||||
topic.reference_links.append(props.reference_link)
|
topic.reference_links.append(props.reference_link)
|
||||||
bcfxml.edit_topic(topic)
|
bcfxml.edit_topic(topic)
|
||||||
bpy.ops.bim.load_bcf_topic(topic_guid = topic.guid, topic_index = props.active_topic_index)
|
bpy.ops.bim.load_bcf_topic(topic_guid=topic.guid, topic_index=props.active_topic_index)
|
||||||
props.reference_link = ""
|
props.reference_link = ""
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
@@ -539,7 +540,7 @@ class AddBcfDocumentReference(bpy.types.Operator):
|
|||||||
document_reference.referenced_document = props.document_reference
|
document_reference.referenced_document = props.document_reference
|
||||||
document_reference.description = props.document_reference_description or None
|
document_reference.description = props.document_reference_description or None
|
||||||
bcfxml.add_document_reference(topic, document_reference)
|
bcfxml.add_document_reference(topic, document_reference)
|
||||||
bpy.ops.bim.load_bcf_topic(topic_guid = topic.guid, topic_index = props.active_topic_index)
|
bpy.ops.bim.load_bcf_topic(topic_guid=topic.guid, topic_index=props.active_topic_index)
|
||||||
props.document_reference = ""
|
props.document_reference = ""
|
||||||
props.document_reference_description = ""
|
props.document_reference_description = ""
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
@@ -668,7 +669,7 @@ class RemoveBcfDocumentReference(bpy.types.Operator):
|
|||||||
blender_topic = props.active_topic
|
blender_topic = props.active_topic
|
||||||
topic = bcfxml.topics[blender_topic.name]
|
topic = bcfxml.topics[blender_topic.name]
|
||||||
bcfxml.delete_document_reference(topic, self.index)
|
bcfxml.delete_document_reference(topic, self.index)
|
||||||
bpy.ops.bim.load_bcf_topic(topic_guid = topic.guid, topic_index = props.active_topic_index)
|
bpy.ops.bim.load_bcf_topic(topic_guid=topic.guid, topic_index=props.active_topic_index)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
@@ -685,7 +686,7 @@ class RemoveBcfRelatedTopic(bpy.types.Operator):
|
|||||||
topic = bcfxml.topics[blender_topic.name]
|
topic = bcfxml.topics[blender_topic.name]
|
||||||
del topic.related_topics[self.index]
|
del topic.related_topics[self.index]
|
||||||
bcfxml.edit_topic(topic)
|
bcfxml.edit_topic(topic)
|
||||||
bpy.ops.bim.load_bcf_topic(topic_guid = topic.guid, topic_index = props.active_topic_index)
|
bpy.ops.bim.load_bcf_topic(topic_guid=topic.guid, topic_index=props.active_topic_index)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
@@ -701,7 +702,7 @@ class RemoveBcfComment(bpy.types.Operator):
|
|||||||
blender_topic = props.active_topic
|
blender_topic = props.active_topic
|
||||||
topic = bcfxml.topics[blender_topic.name]
|
topic = bcfxml.topics[blender_topic.name]
|
||||||
bcfxml.delete_comment(self.comment_guid, topic)
|
bcfxml.delete_comment(self.comment_guid, topic)
|
||||||
bpy.ops.bim.load_bcf_comments(topic_guid = topic.guid)
|
bpy.ops.bim.load_bcf_comments(topic_guid=topic.guid)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
@@ -720,7 +721,7 @@ class EditBcfComment(bpy.types.Operator):
|
|||||||
comment = topic.comments[self.comment_guid]
|
comment = topic.comments[self.comment_guid]
|
||||||
comment.comment = blender_comment.comment
|
comment.comment = blender_comment.comment
|
||||||
bcfxml.edit_comment(comment, topic)
|
bcfxml.edit_comment(comment, topic)
|
||||||
bpy.ops.bim.load_bcf_comments(topic_guid = topic.guid)
|
bpy.ops.bim.load_bcf_comments(topic_guid=topic.guid)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
@@ -750,7 +751,7 @@ class AddBcfComment(bpy.types.Operator):
|
|||||||
comment.viewpoint = bcf.v2.data.Viewpoint()
|
comment.viewpoint = bcf.v2.data.Viewpoint()
|
||||||
comment.viewpoint.guid = blender_topic.viewpoints
|
comment.viewpoint.guid = blender_topic.viewpoints
|
||||||
bcfxml.add_comment(topic, comment)
|
bcfxml.add_comment(topic, comment)
|
||||||
bpy.ops.bim.load_bcf_comments(topic_guid = topic.guid)
|
bpy.ops.bim.load_bcf_comments(topic_guid=topic.guid)
|
||||||
props.comment = ""
|
props.comment = ""
|
||||||
props.has_related_viewpoint = False
|
props.has_related_viewpoint = False
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
@@ -787,14 +788,12 @@ class ActivateBcfViewpoint(bpy.types.Operator):
|
|||||||
cam_width = context.scene.render.resolution_x
|
cam_width = context.scene.render.resolution_x
|
||||||
cam_height = context.scene.render.resolution_y
|
cam_height = context.scene.render.resolution_y
|
||||||
cam_aspect = cam_width / cam_height
|
cam_aspect = cam_width / cam_height
|
||||||
|
|
||||||
if viewpoint.snapshot:
|
if viewpoint.snapshot:
|
||||||
obj.data.show_background_images = True
|
obj.data.show_background_images = True
|
||||||
obj.data.background_images.clear()
|
obj.data.background_images.clear()
|
||||||
background = obj.data.background_images.new()
|
background = obj.data.background_images.new()
|
||||||
background.image = bpy.data.images.load(
|
background.image = bpy.data.images.load(os.path.join(bcfxml.filepath, topic.guid, viewpoint.snapshot))
|
||||||
os.path.join(bcfxml.filepath, topic.guid, viewpoint.snapshot)
|
|
||||||
)
|
|
||||||
src_width = background.image.size[0]
|
src_width = background.image.size[0]
|
||||||
src_height = background.image.size[1]
|
src_height = background.image.size[1]
|
||||||
src_aspect = src_width / src_height
|
src_aspect = src_width / src_height
|
||||||
@@ -839,19 +838,25 @@ class ActivateBcfViewpoint(bpy.types.Operator):
|
|||||||
obj.data.angle = radians(camera.field_of_view)
|
obj.data.angle = radians(camera.field_of_view)
|
||||||
else:
|
else:
|
||||||
# https://blender.stackexchange.com/questions/23431/how-to-set-camera-horizontal-and-vertical-fov
|
# https://blender.stackexchange.com/questions/23431/how-to-set-camera-horizontal-and-vertical-fov
|
||||||
obj.data.angle = 2 * atan((0.5 * cam_height) / (0.5 * cam_width / tan(radians(camera.field_of_view) / 2)))
|
obj.data.angle = 2 * atan(
|
||||||
|
(0.5 * cam_height) / (0.5 * cam_width / tan(radians(camera.field_of_view) / 2))
|
||||||
|
)
|
||||||
|
|
||||||
z_axis = Vector((-camera.camera_direction.x, -camera.camera_direction.y, -camera.camera_direction.z)).normalized()
|
z_axis = Vector(
|
||||||
|
(-camera.camera_direction.x, -camera.camera_direction.y, -camera.camera_direction.z)
|
||||||
|
).normalized()
|
||||||
y_axis = Vector((camera.camera_up_vector.x, camera.camera_up_vector.y, camera.camera_up_vector.z)).normalized()
|
y_axis = Vector((camera.camera_up_vector.x, camera.camera_up_vector.y, camera.camera_up_vector.z)).normalized()
|
||||||
x_axis = y_axis.cross(z_axis).normalized()
|
x_axis = y_axis.cross(z_axis).normalized()
|
||||||
rotation = Matrix((x_axis, y_axis, z_axis))
|
rotation = Matrix((x_axis, y_axis, z_axis))
|
||||||
rotation.invert()
|
rotation.invert()
|
||||||
matrix = np.matrix((
|
matrix = np.matrix(
|
||||||
[x_axis[0], y_axis[0], z_axis[0], camera.camera_view_point.x],
|
(
|
||||||
[x_axis[1], y_axis[1], z_axis[1], camera.camera_view_point.y],
|
[x_axis[0], y_axis[0], z_axis[0], camera.camera_view_point.x],
|
||||||
[x_axis[2], y_axis[2], z_axis[2], camera.camera_view_point.z],
|
[x_axis[1], y_axis[1], z_axis[1], camera.camera_view_point.y],
|
||||||
[0, 0, 0, 1],
|
[x_axis[2], y_axis[2], z_axis[2], camera.camera_view_point.z],
|
||||||
))
|
[0, 0, 0, 1],
|
||||||
|
)
|
||||||
|
)
|
||||||
props = context.scene.BIMGeoreferenceProperties
|
props = context.scene.BIMGeoreferenceProperties
|
||||||
if props.has_blender_offset:
|
if props.has_blender_offset:
|
||||||
unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file)
|
unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file)
|
||||||
@@ -961,7 +966,9 @@ class ActivateBcfViewpoint(bpy.types.Operator):
|
|||||||
stroke.points.add(len(viewpoint.lines) * 2)
|
stroke.points.add(len(viewpoint.lines) * 2)
|
||||||
coords = []
|
coords = []
|
||||||
for l in viewpoint.lines:
|
for l in viewpoint.lines:
|
||||||
coords.extend([l.start_point.x, l.start_point.y, l.start_point.z, l.end_point.x, l.end_point.y, l.end_point.z])
|
coords.extend(
|
||||||
|
[l.start_point.x, l.start_point.y, l.start_point.z, l.end_point.x, l.end_point.y, l.end_point.z]
|
||||||
|
)
|
||||||
stroke.points.foreach_set("co", coords)
|
stroke.points.foreach_set("co", coords)
|
||||||
|
|
||||||
def create_clipping_planes(self, viewpoint):
|
def create_clipping_planes(self, viewpoint):
|
||||||
@@ -1025,6 +1032,7 @@ class ActivateBcfViewpoint(bpy.types.Operator):
|
|||||||
t = tuple(int(value[i : i + lv // 3], 16) for i in range(0, lv, lv // 3))
|
t = tuple(int(value[i : i + lv // 3], 16) for i in range(0, lv, lv // 3))
|
||||||
return [t[0] / 255.0, t[1] / 255.0, t[2] / 255.0, 1]
|
return [t[0] / 255.0, t[1] / 255.0, t[2] / 255.0, 1]
|
||||||
|
|
||||||
|
|
||||||
class OpenBcfReferenceLink(bpy.types.Operator):
|
class OpenBcfReferenceLink(bpy.types.Operator):
|
||||||
bl_idname = "bim.open_bcf_reference_link"
|
bl_idname = "bim.open_bcf_reference_link"
|
||||||
bl_label = "Open BCF Reference Link"
|
bl_label = "Open BCF Reference Link"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -73,7 +72,7 @@ def updateBcfTopicIsEditable(self, context):
|
|||||||
|
|
||||||
def updateBcfCommentIsEditable(self, context):
|
def updateBcfCommentIsEditable(self, context):
|
||||||
if context.scene.BCFProperties.is_loaded and not self.is_editable:
|
if context.scene.BCFProperties.is_loaded and not self.is_editable:
|
||||||
bpy.ops.bim.edit_bcf_comment(comment_guid = self.name)
|
bpy.ops.bim.edit_bcf_comment(comment_guid=self.name)
|
||||||
|
|
||||||
|
|
||||||
def refreshBcfTopic(self, context):
|
def refreshBcfTopic(self, context):
|
||||||
@@ -91,7 +90,7 @@ class BcfLabel(PropertyGroup):
|
|||||||
|
|
||||||
def getBcfViewpoints(self, context, force_update=False):
|
def getBcfViewpoints(self, context, force_update=False):
|
||||||
global bcfviewpoints_enum
|
global bcfviewpoints_enum
|
||||||
if bcfviewpoints_enum is None or force_update: # Retrieving Viewpoints is slow. Make sure we only do when needed
|
if bcfviewpoints_enum is None or force_update: # Retrieving Viewpoints is slow. Make sure we only do when needed
|
||||||
bcfviewpoints_enum = []
|
bcfviewpoints_enum = []
|
||||||
props = context.scene.BCFProperties
|
props = context.scene.BCFProperties
|
||||||
bcfxml = bcfstore.BcfStore.get_bcfxml()
|
bcfxml = bcfstore.BcfStore.get_bcfxml()
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -22,6 +21,7 @@ import bpy
|
|||||||
from . import bcfstore
|
from . import bcfstore
|
||||||
from bpy.types import Panel
|
from bpy.types import Panel
|
||||||
|
|
||||||
|
|
||||||
class BIM_PT_bcf(Panel):
|
class BIM_PT_bcf(Panel):
|
||||||
bl_label = "BCF Project"
|
bl_label = "BCF Project"
|
||||||
bl_idname = "BIM_PT_bcf"
|
bl_idname = "BIM_PT_bcf"
|
||||||
@@ -231,12 +231,12 @@ class BIM_PT_bcf_metadata(Panel):
|
|||||||
row.operator("bim.add_bcf_document_reference")
|
row.operator("bim.add_bcf_document_reference")
|
||||||
|
|
||||||
layout.label(text="Related Topics:")
|
layout.label(text="Related Topics:")
|
||||||
for index, related_topic in enumerate(topic.related_topics):
|
for index, related_topic in enumerate(topic.related_topics):
|
||||||
try:
|
try:
|
||||||
row = layout.row(align=True)
|
row = layout.row(align=True)
|
||||||
op = row.operator(
|
op = row.operator(
|
||||||
"bim.view_bcf_topic",
|
"bim.view_bcf_topic", text=f"Select {bcfxml.topics[related_topic.name.lower()].title}"
|
||||||
text=f"Select {bcfxml.topics[related_topic.name.lower()].title}")
|
)
|
||||||
op.topic_guid = related_topic.name
|
op.topic_guid = related_topic.name
|
||||||
row.operator("bim.remove_bcf_related_topic", icon="X", text="").index = index
|
row.operator("bim.remove_bcf_related_topic", icon="X", text="").index = index
|
||||||
except KeyError:
|
except KeyError:
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -20,9 +19,7 @@
|
|||||||
import bpy
|
import bpy
|
||||||
from . import ui
|
from . import ui
|
||||||
|
|
||||||
classes = (
|
classes = (ui.BIM_PT_boundary,)
|
||||||
ui.BIM_PT_boundary,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -232,9 +231,7 @@ class ExecuteIfcClash(bpy.types.Operator):
|
|||||||
context.scene.render.resolution_x = 480
|
context.scene.render.resolution_x = 480
|
||||||
context.scene.render.resolution_y = 270
|
context.scene.render.resolution_y = 270
|
||||||
context.scene.render.image_settings.file_format = "PNG"
|
context.scene.render.image_settings.file_format = "PNG"
|
||||||
context.scene.render.filepath = os.path.join(
|
context.scene.render.filepath = os.path.join(context.scene.BIMProperties.data_dir, "snapshot.png")
|
||||||
context.scene.BIMProperties.data_dir, "snapshot.png"
|
|
||||||
)
|
|
||||||
bpy.ops.render.opengl(write_still=True)
|
bpy.ops.render.opengl(write_still=True)
|
||||||
return context.scene.render.filepath
|
return context.scene.render.filepath
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -69,13 +68,14 @@ class ExecuteIfcCobie(bpy.types.Operator):
|
|||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
from cobie import IfcCobieParser
|
from cobie import IfcCobieParser
|
||||||
|
|
||||||
props = context.scene.COBieProperties
|
props = context.scene.COBieProperties
|
||||||
|
|
||||||
if props.should_load_from_memory:
|
if props.should_load_from_memory:
|
||||||
output_dir = tempfile.gettempdir()
|
output_dir = tempfile.gettempdir()
|
||||||
else:
|
else:
|
||||||
output_dir = os.path.dirname(props.cobie_ifc_file)
|
output_dir = os.path.dirname(props.cobie_ifc_file)
|
||||||
|
|
||||||
output = os.path.join(output_dir, "output")
|
output = os.path.join(output_dir, "output")
|
||||||
logger = logging.getLogger("IFCtoCOBie")
|
logger = logging.getLogger("IFCtoCOBie")
|
||||||
fh = logging.FileHandler(os.path.join(output_dir, "cobie.log"))
|
fh = logging.FileHandler(os.path.join(output_dir, "cobie.log"))
|
||||||
@@ -92,10 +92,10 @@ class ExecuteIfcCobie(bpy.types.Operator):
|
|||||||
parser = IfcCobieParser(logger, selector)
|
parser = IfcCobieParser(logger, selector)
|
||||||
|
|
||||||
ifc_file = IfcStore.get_file()
|
ifc_file = IfcStore.get_file()
|
||||||
|
|
||||||
if not (ifc_file and props.should_load_from_memory):
|
if not (ifc_file and props.should_load_from_memory):
|
||||||
ifc_file = props.cobie_ifc_file
|
ifc_file = props.cobie_ifc_file
|
||||||
|
|
||||||
parser.parse(
|
parser.parse(
|
||||||
ifc_file,
|
ifc_file,
|
||||||
props.cobie_types,
|
props.cobie_types,
|
||||||
@@ -122,4 +122,3 @@ class ExecuteIfcCobie(bpy.types.Operator):
|
|||||||
webbrowser.open("file://" + output_dir)
|
webbrowser.open("file://" + output_dir)
|
||||||
webbrowser.open("file://" + output_dir + "/cobie.log")
|
webbrowser.open("file://" + output_dir + "/cobie.log")
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -37,4 +36,3 @@ class COBieProperties(PropertyGroup):
|
|||||||
cobie_components: StringProperty(default=".COBie", name="COBie Components")
|
cobie_components: StringProperty(default=".COBie", name="COBie Components")
|
||||||
cobie_json_file: StringProperty(default="", name="COBie JSON File")
|
cobie_json_file: StringProperty(default="", name="COBie JSON File")
|
||||||
should_load_from_memory: BoolProperty(default=False, name="Load from Memory")
|
should_load_from_memory: BoolProperty(default=False, name="Load from Memory")
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -36,11 +35,10 @@ class BIM_PT_cobie(Panel):
|
|||||||
scene = context.scene
|
scene = context.scene
|
||||||
props = scene.COBieProperties
|
props = scene.COBieProperties
|
||||||
|
|
||||||
|
if IfcStore.get_file():
|
||||||
if IfcStore.get_file():
|
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
row.prop(props, "should_load_from_memory")
|
row.prop(props, "should_load_from_memory")
|
||||||
|
|
||||||
if not IfcStore.get_file() or not props.should_load_from_memory:
|
if not IfcStore.get_file() or not props.should_load_from_memory:
|
||||||
row = layout.row(align=True)
|
row = layout.row(align=True)
|
||||||
row.prop(props, "cobie_ifc_file")
|
row.prop(props, "cobie_ifc_file")
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -105,7 +104,7 @@ class BIM_PT_object_constraints(Panel):
|
|||||||
constraint = Data.objectives[constraint_id]
|
constraint = Data.objectives[constraint_id]
|
||||||
icon = "LIGHT"
|
icon = "LIGHT"
|
||||||
except:
|
except:
|
||||||
pass # Metric not implemented
|
pass # Metric not implemented
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
row.label(text=constraint.get("Name") or "Unnamed")
|
row.label(text=constraint.get("Name") or "Unnamed")
|
||||||
row.operator("bim.unassign_constraint", text="", icon="X").constraint = constraint_id
|
row.operator("bim.unassign_constraint", text="", icon="X").constraint = constraint_id
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -463,6 +463,7 @@ class BIM_PT_cost_item_quantities(Panel):
|
|||||||
row2 = col.row()
|
row2 = col.row()
|
||||||
row2.prop(self.props, "resource_quantity_names", text="")
|
row2.prop(self.props, "resource_quantity_names", text="")
|
||||||
|
|
||||||
|
|
||||||
class BIM_PT_cost_item_rates(Panel):
|
class BIM_PT_cost_item_rates(Panel):
|
||||||
bl_label = "IFC Cost Item Rates"
|
bl_label = "IFC Cost Item Rates"
|
||||||
bl_idname = "BIM_PT_cost_item_rates"
|
bl_idname = "BIM_PT_cost_item_rates"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -32,11 +31,9 @@ classes = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
bpy.types.Scene.CsvProperties = bpy.props.PointerProperty(type=prop.CsvProperties)
|
bpy.types.Scene.CsvProperties = bpy.props.PointerProperty(type=prop.CsvProperties)
|
||||||
|
|
||||||
|
|
||||||
def unregister():
|
def unregister():
|
||||||
del bpy.types.Scene.CsvProperties
|
del bpy.types.Scene.CsvProperties
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -164,9 +163,11 @@ class SelectHighPolygonMeshes(bpy.types.Operator):
|
|||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
[o.select_set(True) for o in context.view_layer.objects
|
[
|
||||||
if o.type == "MESH"
|
o.select_set(True)
|
||||||
and len(o.data.polygons) > context.scene.BIMDebugProperties.number_of_polygons]
|
for o in context.view_layer.objects
|
||||||
|
if o.type == "MESH" and len(o.data.polygons) > context.scene.BIMDebugProperties.number_of_polygons
|
||||||
|
]
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -31,11 +30,9 @@ classes = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
bpy.types.Scene.DiffProperties = bpy.props.PointerProperty(type=prop.DiffProperties)
|
bpy.types.Scene.DiffProperties = bpy.props.PointerProperty(type=prop.DiffProperties)
|
||||||
|
|
||||||
|
|
||||||
def unregister():
|
def unregister():
|
||||||
del bpy.types.Scene.DiffProperties
|
del bpy.types.Scene.DiffProperties
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -24,7 +23,6 @@ import json
|
|||||||
from blenderbim.bim.ifc import IfcStore
|
from blenderbim.bim.ifc import IfcStore
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SelectDiffJsonFile(bpy.types.Operator):
|
class SelectDiffJsonFile(bpy.types.Operator):
|
||||||
bl_idname = "bim.select_diff_json_file"
|
bl_idname = "bim.select_diff_json_file"
|
||||||
bl_label = "Select Diff JSON File"
|
bl_label = "Select Diff JSON File"
|
||||||
@@ -46,8 +44,8 @@ class VisualiseDiff(bpy.types.Operator):
|
|||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
#ifc_file = IfcStore.get_file() # In case we get from Store
|
# ifc_file = IfcStore.get_file() # In case we get from Store
|
||||||
ifc_file = ifcopenshell.open(context.scene.DiffProperties.diff_new_file) # for Now refer to the new file
|
ifc_file = ifcopenshell.open(context.scene.DiffProperties.diff_new_file) # for Now refer to the new file
|
||||||
with open(context.scene.DiffProperties.diff_json_file, "r") as file:
|
with open(context.scene.DiffProperties.diff_json_file, "r") as file:
|
||||||
diff = json.load(file)
|
diff = json.load(file)
|
||||||
for obj in context.visible_objects:
|
for obj in context.visible_objects:
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Maxim Vasilyev <qwiglydee@gmail.com>
|
# Copyright (C) 2020, 2021 Maxim Vasilyev <qwiglydee@gmail.com>
|
||||||
#
|
#
|
||||||
@@ -171,16 +170,14 @@ class Annotator:
|
|||||||
camera = context.scene.camera
|
camera = context.scene.camera
|
||||||
z_offset = camera.matrix_world.to_quaternion() @ Vector((0, 0, -1))
|
z_offset = camera.matrix_world.to_quaternion() @ Vector((0, 0, -1))
|
||||||
if context.scene.render.resolution_x > context.scene.render.resolution_y:
|
if context.scene.render.resolution_x > context.scene.render.resolution_y:
|
||||||
y = (
|
y = camera.data.ortho_scale * (context.scene.render.resolution_y / context.scene.render.resolution_x) / 4
|
||||||
camera.data.ortho_scale
|
|
||||||
* (context.scene.render.resolution_y / context.scene.render.resolution_x)
|
|
||||||
/ 4
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
y = camera.data.ortho_scale / 4
|
y = camera.data.ortho_scale / 4
|
||||||
y_offset = camera.matrix_world.to_quaternion() @ Vector((0, y, 0))
|
y_offset = camera.matrix_world.to_quaternion() @ Vector((0, y, 0))
|
||||||
x_offset = camera.matrix_world.to_quaternion() @ Vector((y/2, 0, 0))
|
x_offset = camera.matrix_world.to_quaternion() @ Vector((y / 2, 0, 0))
|
||||||
return (camera.location + z_offset,
|
return (
|
||||||
camera.location + z_offset + y_offset,
|
camera.location + z_offset,
|
||||||
camera.location + z_offset + x_offset,
|
camera.location + z_offset + y_offset,
|
||||||
camera.location + z_offset + x_offset + y_offset)
|
camera.location + z_offset + x_offset,
|
||||||
|
camera.location + z_offset + x_offset + y_offset,
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Maxim Vasilyev <qwiglydee@gmail.com>
|
# Copyright (C) 2020, 2021 Maxim Vasilyev <qwiglydee@gmail.com>
|
||||||
#
|
#
|
||||||
@@ -35,7 +34,7 @@ from gpu_extras.batch import batch_for_shader
|
|||||||
import blenderbim.bim.module.drawing.helper as helper
|
import blenderbim.bim.module.drawing.helper as helper
|
||||||
|
|
||||||
|
|
||||||
class BaseDecorator():
|
class BaseDecorator:
|
||||||
# base name of objects to decorate
|
# base name of objects to decorate
|
||||||
basename = "IfcAnnotation/Something"
|
basename = "IfcAnnotation/Something"
|
||||||
|
|
||||||
@@ -128,10 +127,12 @@ class BaseDecorator():
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
# NB: libcode param doesn't work
|
# NB: libcode param doesn't work
|
||||||
self.shader = GPUShader(vertexcode=self.VERT_GLSL,
|
self.shader = GPUShader(
|
||||||
fragcode=self.FRAG_GLSL,
|
vertexcode=self.VERT_GLSL,
|
||||||
geocode=self.LIB_GLSL + self.GEOM_GLSL,
|
fragcode=self.FRAG_GLSL,
|
||||||
defines=self.DEF_GLSL)
|
geocode=self.LIB_GLSL + self.GEOM_GLSL,
|
||||||
|
defines=self.DEF_GLSL,
|
||||||
|
)
|
||||||
|
|
||||||
def get_objects(self, collection):
|
def get_objects(self, collection):
|
||||||
"""find relevant objects
|
"""find relevant objects
|
||||||
@@ -172,7 +173,7 @@ class BaseDecorator():
|
|||||||
topology.append(1)
|
topology.append(1)
|
||||||
topology.extend([0] * max(0, cnt - 2))
|
topology.extend([0] * max(0, cnt - 2))
|
||||||
topology.append(2)
|
topology.append(2)
|
||||||
indices.extend((idx+i, idx+i+1) for i in range(cnt-1))
|
indices.extend((idx + i, idx + i + 1) for i in range(cnt - 1))
|
||||||
idx += cnt
|
idx += cnt
|
||||||
|
|
||||||
return vertices, indices, topology
|
return vertices, indices, topology
|
||||||
@@ -192,8 +193,7 @@ class BaseDecorator():
|
|||||||
return vertices, indices
|
return vertices, indices
|
||||||
|
|
||||||
def get_editmesh_geom(self, obj):
|
def get_editmesh_geom(self, obj):
|
||||||
"""Parses editmode mesh geometry into line segments
|
"""Parses editmode mesh geometry into line segments"""
|
||||||
"""
|
|
||||||
mesh = bmesh.from_edit_mesh(obj.data)
|
mesh = bmesh.from_edit_mesh(obj.data)
|
||||||
vertices = []
|
vertices = []
|
||||||
indices = []
|
indices = []
|
||||||
@@ -201,7 +201,7 @@ class BaseDecorator():
|
|||||||
|
|
||||||
for edge in mesh.edges:
|
for edge in mesh.edges:
|
||||||
vertices.extend(edge.verts)
|
vertices.extend(edge.verts)
|
||||||
indices.append((idx, idx+1))
|
indices.append((idx, idx + 1))
|
||||||
idx += 2
|
idx += 2
|
||||||
vertices = [obj.matrix_world @ v.co for v in vertices]
|
vertices = [obj.matrix_world @ v.co for v in vertices]
|
||||||
|
|
||||||
@@ -217,18 +217,18 @@ class BaseDecorator():
|
|||||||
color = context.scene.DocProperties.decorations_colour
|
color = context.scene.DocProperties.decorations_colour
|
||||||
|
|
||||||
fmt = GPUVertFormat()
|
fmt = GPUVertFormat()
|
||||||
fmt.attr_add(id="pos", comp_type='F32', len=3, fetch_mode='FLOAT')
|
fmt.attr_add(id="pos", comp_type="F32", len=3, fetch_mode="FLOAT")
|
||||||
if topology:
|
if topology:
|
||||||
fmt.attr_add(id="topo", comp_type='U8', len=1, fetch_mode='INT')
|
fmt.attr_add(id="topo", comp_type="U8", len=1, fetch_mode="INT")
|
||||||
|
|
||||||
vbo = GPUVertBuf(len=len(vertices), format=fmt)
|
vbo = GPUVertBuf(len=len(vertices), format=fmt)
|
||||||
vbo.attr_fill(id="pos", data=vertices)
|
vbo.attr_fill(id="pos", data=vertices)
|
||||||
if topology:
|
if topology:
|
||||||
vbo.attr_fill(id="topo", data=topology)
|
vbo.attr_fill(id="topo", data=topology)
|
||||||
|
|
||||||
ibo = GPUIndexBuf(type='LINES', seq=indices)
|
ibo = GPUIndexBuf(type="LINES", seq=indices)
|
||||||
|
|
||||||
batch = GPUBatch(type='LINES', buf=vbo, elem=ibo)
|
batch = GPUBatch(type="LINES", buf=vbo, elem=ibo)
|
||||||
|
|
||||||
bgl.glEnable(bgl.GL_LINE_SMOOTH)
|
bgl.glEnable(bgl.GL_LINE_SMOOTH)
|
||||||
bgl.glHint(bgl.GL_LINE_SMOOTH_HINT, bgl.GL_NICEST)
|
bgl.glHint(bgl.GL_LINE_SMOOTH_HINT, bgl.GL_NICEST)
|
||||||
@@ -289,7 +289,7 @@ class BaseDecorator():
|
|||||||
|
|
||||||
def format_value(self, context, value):
|
def format_value(self, context, value):
|
||||||
unit_system = context.scene.unit_settings.system
|
unit_system = context.scene.unit_settings.system
|
||||||
if unit_system == 'IMPERIAL':
|
if unit_system == "IMPERIAL":
|
||||||
precision = context.scene.BIMProperties.imperial_precision
|
precision = context.scene.BIMProperties.imperial_precision
|
||||||
if precision == "NONE":
|
if precision == "NONE":
|
||||||
precision = 256
|
precision = 256
|
||||||
@@ -297,12 +297,12 @@ class BaseDecorator():
|
|||||||
precision = 1
|
precision = 1
|
||||||
elif "/" in precision:
|
elif "/" in precision:
|
||||||
precision = int(precision.split("/")[1])
|
precision = int(precision.split("/")[1])
|
||||||
elif unit_system == 'METRIC':
|
elif unit_system == "METRIC":
|
||||||
precision = 3
|
precision = 3
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
|
|
||||||
return bpy.utils.units.to_string(unit_system, 'LENGTH', value, precision, split_unit=True)
|
return bpy.utils.units.to_string(unit_system, "LENGTH", value, precision, split_unit=True)
|
||||||
|
|
||||||
|
|
||||||
class DimensionDecorator(BaseDecorator):
|
class DimensionDecorator(BaseDecorator):
|
||||||
@@ -310,12 +310,16 @@ class DimensionDecorator(BaseDecorator):
|
|||||||
- each edge of a segment with arrow
|
- each edge of a segment with arrow
|
||||||
- puts metric text next to each segment
|
- puts metric text next to each segment
|
||||||
"""
|
"""
|
||||||
|
|
||||||
basename = "IfcAnnotation/Dimension"
|
basename = "IfcAnnotation/Dimension"
|
||||||
|
|
||||||
DEF_GLSL = BaseDecorator.DEF_GLSL + """
|
DEF_GLSL = (
|
||||||
|
BaseDecorator.DEF_GLSL
|
||||||
|
+ """
|
||||||
#define ARROW_ANGLE PI / 12.0
|
#define ARROW_ANGLE PI / 12.0
|
||||||
#define ARROW_SIZE 16.0
|
#define ARROW_SIZE 16.0
|
||||||
"""
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
GEOM_GLSL = """
|
GEOM_GLSL = """
|
||||||
uniform vec2 winsize;
|
uniform vec2 winsize;
|
||||||
@@ -392,7 +396,7 @@ class DimensionDecorator(BaseDecorator):
|
|||||||
continue
|
continue
|
||||||
length = (v1 - v0).length
|
length = (v1 - v0).length
|
||||||
text = self.format_value(context, length)
|
text = self.format_value(context, length)
|
||||||
self.draw_label(context, text, p0 + (dir) * .5, dir)
|
self.draw_label(context, text, p0 + (dir) * 0.5, dir)
|
||||||
|
|
||||||
|
|
||||||
class EqualityDecorator(DimensionDecorator):
|
class EqualityDecorator(DimensionDecorator):
|
||||||
@@ -401,6 +405,7 @@ class EqualityDecorator(DimensionDecorator):
|
|||||||
- augments with arrows on both sides
|
- augments with arrows on both sides
|
||||||
- puts 'EQ' label
|
- puts 'EQ' label
|
||||||
"""
|
"""
|
||||||
|
|
||||||
basename = "IfcAnnotation/Equal"
|
basename = "IfcAnnotation/Equal"
|
||||||
|
|
||||||
def draw_labels(self, context, obj, vertices, indices):
|
def draw_labels(self, context, obj, vertices, indices):
|
||||||
@@ -414,7 +419,7 @@ class EqualityDecorator(DimensionDecorator):
|
|||||||
dir = p1 - p0
|
dir = p1 - p0
|
||||||
if dir.length < 1:
|
if dir.length < 1:
|
||||||
continue
|
continue
|
||||||
self.draw_label(context, "EQ", p0 + (dir) * .5, dir)
|
self.draw_label(context, "EQ", p0 + (dir) * 0.5, dir)
|
||||||
|
|
||||||
|
|
||||||
class LeaderDecorator(BaseDecorator):
|
class LeaderDecorator(BaseDecorator):
|
||||||
@@ -422,12 +427,16 @@ class LeaderDecorator(BaseDecorator):
|
|||||||
- head point with arrow
|
- head point with arrow
|
||||||
- middle points w/out decorations
|
- middle points w/out decorations
|
||||||
"""
|
"""
|
||||||
|
|
||||||
basename = "IfcAnnotation/Leader"
|
basename = "IfcAnnotation/Leader"
|
||||||
|
|
||||||
DEF_GLSL = BaseDecorator.DEF_GLSL + """
|
DEF_GLSL = (
|
||||||
|
BaseDecorator.DEF_GLSL
|
||||||
|
+ """
|
||||||
#define ARROW_ANGLE PI / 12.0
|
#define ARROW_ANGLE PI / 12.0
|
||||||
#define ARROW_SIZE 16.0
|
#define ARROW_SIZE 16.0
|
||||||
"""
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
GEOM_GLSL = """
|
GEOM_GLSL = """
|
||||||
uniform vec2 winsize;
|
uniform vec2 winsize;
|
||||||
@@ -490,13 +499,17 @@ class StairDecorator(BaseDecorator):
|
|||||||
- tail point with circle
|
- tail point with circle
|
||||||
- middle points w/out decorations
|
- middle points w/out decorations
|
||||||
"""
|
"""
|
||||||
|
|
||||||
basename = "IfcAnnotation/Stair"
|
basename = "IfcAnnotation/Stair"
|
||||||
|
|
||||||
DEF_GLSL = BaseDecorator.DEF_GLSL + """
|
DEF_GLSL = (
|
||||||
|
BaseDecorator.DEF_GLSL
|
||||||
|
+ """
|
||||||
#define CIRCLE_SIZE 8.0
|
#define CIRCLE_SIZE 8.0
|
||||||
#define ARROW_ANGLE PI / 3.0
|
#define ARROW_ANGLE PI / 3.0
|
||||||
#define ARROW_SIZE 24.0
|
#define ARROW_SIZE 24.0
|
||||||
"""
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
GEOM_GLSL = """
|
GEOM_GLSL = """
|
||||||
uniform vec2 winsize;
|
uniform vec2 winsize;
|
||||||
@@ -572,10 +585,13 @@ class StairDecorator(BaseDecorator):
|
|||||||
class HiddenDecorator(BaseDecorator):
|
class HiddenDecorator(BaseDecorator):
|
||||||
basename = "IfcAnnotation/Hidden"
|
basename = "IfcAnnotation/Hidden"
|
||||||
|
|
||||||
DEF_GLSL = BaseDecorator.DEF_GLSL + """
|
DEF_GLSL = (
|
||||||
|
BaseDecorator.DEF_GLSL
|
||||||
|
+ """
|
||||||
#define DASH_SIZE 16.0
|
#define DASH_SIZE 16.0
|
||||||
#define DASH_PATTERN 0x0000FFFFU
|
#define DASH_PATTERN 0x0000FFFFU
|
||||||
"""
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
GEOM_GLSL = """
|
GEOM_GLSL = """
|
||||||
uniform vec2 winsize;
|
uniform vec2 winsize;
|
||||||
@@ -639,7 +655,6 @@ class MiscDecorator(HiddenDecorator):
|
|||||||
|
|
||||||
|
|
||||||
class LevelDecorator(BaseDecorator):
|
class LevelDecorator(BaseDecorator):
|
||||||
|
|
||||||
def get_splines(self, obj):
|
def get_splines(self, obj):
|
||||||
"""Iterates through splines
|
"""Iterates through splines
|
||||||
Args:
|
Args:
|
||||||
@@ -664,10 +679,13 @@ class LevelDecorator(BaseDecorator):
|
|||||||
class PlanLevelDecorator(LevelDecorator):
|
class PlanLevelDecorator(LevelDecorator):
|
||||||
basename = "IfcAnnotation/Plan Level"
|
basename = "IfcAnnotation/Plan Level"
|
||||||
|
|
||||||
DEF_GLSL = BaseDecorator.DEF_GLSL + """
|
DEF_GLSL = (
|
||||||
|
BaseDecorator.DEF_GLSL
|
||||||
|
+ """
|
||||||
#define CIRCLE_SIZE 8.0
|
#define CIRCLE_SIZE 8.0
|
||||||
#define CROSS_SIZE 16.0
|
#define CROSS_SIZE 16.0
|
||||||
"""
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
GEOM_GLSL = """
|
GEOM_GLSL = """
|
||||||
uniform vec2 winsize;
|
uniform vec2 winsize;
|
||||||
@@ -746,10 +764,13 @@ class PlanLevelDecorator(LevelDecorator):
|
|||||||
class SectionLevelDecorator(LevelDecorator):
|
class SectionLevelDecorator(LevelDecorator):
|
||||||
basename = "IfcAnnotation/Section Level"
|
basename = "IfcAnnotation/Section Level"
|
||||||
|
|
||||||
DEF_GLSL = BaseDecorator.DEF_GLSL + """
|
DEF_GLSL = (
|
||||||
|
BaseDecorator.DEF_GLSL
|
||||||
|
+ """
|
||||||
#define CALLOUT_GAP 8.0
|
#define CALLOUT_GAP 8.0
|
||||||
#define CALLOUT_SIZE 64.0
|
#define CALLOUT_SIZE 64.0
|
||||||
"""
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
GEOM_GLSL = """
|
GEOM_GLSL = """
|
||||||
uniform vec2 winsize;
|
uniform vec2 winsize;
|
||||||
@@ -828,12 +849,16 @@ class BreakDecorator(BaseDecorator):
|
|||||||
|
|
||||||
Uses first two vertices in verts list.
|
Uses first two vertices in verts list.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
basename = "IfcAnnotation/Break"
|
basename = "IfcAnnotation/Break"
|
||||||
|
|
||||||
DEF_GLSL = BaseDecorator.DEF_GLSL + """
|
DEF_GLSL = (
|
||||||
|
BaseDecorator.DEF_GLSL
|
||||||
|
+ """
|
||||||
#define BREAK_LENGTH 32.0
|
#define BREAK_LENGTH 32.0
|
||||||
#define BREAK_WIDTH 16.0
|
#define BREAK_WIDTH 16.0
|
||||||
"""
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
GEOM_GLSL = """
|
GEOM_GLSL = """
|
||||||
uniform vec2 winsize;
|
uniform vec2 winsize;
|
||||||
@@ -905,11 +930,14 @@ class BreakDecorator(BaseDecorator):
|
|||||||
class GridDecorator(BaseDecorator):
|
class GridDecorator(BaseDecorator):
|
||||||
basename = "IfcGridAxis/"
|
basename = "IfcGridAxis/"
|
||||||
|
|
||||||
DEF_GLSL = BaseDecorator.DEF_GLSL + """
|
DEF_GLSL = (
|
||||||
|
BaseDecorator.DEF_GLSL
|
||||||
|
+ """
|
||||||
#define CIRCLE_SIZE 16.0
|
#define CIRCLE_SIZE 16.0
|
||||||
#define DASH_SIZE 48.0
|
#define DASH_SIZE 48.0
|
||||||
#define DASH_PATTERN 0x03C0FFFFU
|
#define DASH_PATTERN 0x03C0FFFFU
|
||||||
"""
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
GEOM_GLSL = """
|
GEOM_GLSL = """
|
||||||
uniform vec2 winsize;
|
uniform vec2 winsize;
|
||||||
@@ -1019,11 +1047,14 @@ class GridDecorator(BaseDecorator):
|
|||||||
class SectionViewDecorator(LevelDecorator):
|
class SectionViewDecorator(LevelDecorator):
|
||||||
basename = "IfcAnnotation/Section"
|
basename = "IfcAnnotation/Section"
|
||||||
|
|
||||||
DEF_GLSL = BaseDecorator.DEF_GLSL + """
|
DEF_GLSL = (
|
||||||
|
BaseDecorator.DEF_GLSL
|
||||||
|
+ """
|
||||||
#define CIRCLE_SIZE 8.0
|
#define CIRCLE_SIZE 8.0
|
||||||
#define TRIANGLE_L 32.0
|
#define TRIANGLE_L 32.0
|
||||||
#define TRIANGLE_W 16.0
|
#define TRIANGLE_W 16.0
|
||||||
"""
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
GEOM_GLSL = """
|
GEOM_GLSL = """
|
||||||
uniform vec2 winsize;
|
uniform vec2 winsize;
|
||||||
@@ -1118,7 +1149,7 @@ class SectionViewDecorator(LevelDecorator):
|
|||||||
self.draw_lines(context, obj, verts, [(0, 1)])
|
self.draw_lines(context, obj, verts, [(0, 1)])
|
||||||
|
|
||||||
|
|
||||||
class DecorationsHandler():
|
class DecorationsHandler:
|
||||||
decorators_classes = [
|
decorators_classes = [
|
||||||
DimensionDecorator,
|
DimensionDecorator,
|
||||||
EqualityDecorator,
|
EqualityDecorator,
|
||||||
@@ -1130,7 +1161,7 @@ class DecorationsHandler():
|
|||||||
SectionLevelDecorator,
|
SectionLevelDecorator,
|
||||||
StairDecorator,
|
StairDecorator,
|
||||||
BreakDecorator,
|
BreakDecorator,
|
||||||
SectionViewDecorator
|
SectionViewDecorator,
|
||||||
]
|
]
|
||||||
|
|
||||||
installed = None
|
installed = None
|
||||||
@@ -1140,12 +1171,12 @@ class DecorationsHandler():
|
|||||||
if cls.installed:
|
if cls.installed:
|
||||||
cls.uninstall()
|
cls.uninstall()
|
||||||
handler = cls()
|
handler = cls()
|
||||||
cls.installed = SpaceView3D.draw_handler_add(handler, (context,), 'WINDOW', 'POST_PIXEL')
|
cls.installed = SpaceView3D.draw_handler_add(handler, (context,), "WINDOW", "POST_PIXEL")
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def uninstall(cls):
|
def uninstall(cls):
|
||||||
try:
|
try:
|
||||||
SpaceView3D.draw_handler_remove(cls.installed, 'WINDOW')
|
SpaceView3D.draw_handler_remove(cls.installed, "WINDOW")
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
cls.installed = None
|
cls.installed = None
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Maxim Vasilyev <qwiglydee@gmail.com>
|
# Copyright (C) 2020, 2021 Maxim Vasilyev <qwiglydee@gmail.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -125,15 +124,19 @@ class CreateDrawing(bpy.types.Operator):
|
|||||||
- IFC file is created
|
- IFC file is created
|
||||||
- Camera is in Orthographic mode
|
- Camera is in Orthographic mode
|
||||||
"""
|
"""
|
||||||
|
|
||||||
bl_idname = "bim.create_drawing"
|
bl_idname = "bim.create_drawing"
|
||||||
bl_label = "Create Drawing"
|
bl_label = "Create Drawing"
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def poll(cls, context):
|
def poll(cls, context):
|
||||||
camera = context.scene.camera
|
camera = context.scene.camera
|
||||||
return IfcStore.get_file() \
|
return (
|
||||||
and camera.type == "CAMERA" and camera.data.type == "ORTHO" \
|
IfcStore.get_file()
|
||||||
|
and camera.type == "CAMERA"
|
||||||
|
and camera.data.type == "ORTHO"
|
||||||
and camera.BIMObjectProperties.ifc_definition_id
|
and camera.BIMObjectProperties.ifc_definition_id
|
||||||
|
)
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
self.camera = context.scene.camera
|
self.camera = context.scene.camera
|
||||||
@@ -568,9 +571,7 @@ class OpenSheet(bpy.types.Operator):
|
|||||||
props = context.scene.DocProperties
|
props = context.scene.DocProperties
|
||||||
open_with_user_command(
|
open_with_user_command(
|
||||||
context.preferences.addons["blenderbim"].preferences.svg_command,
|
context.preferences.addons["blenderbim"].preferences.svg_command,
|
||||||
os.path.join(
|
os.path.join(context.scene.BIMProperties.data_dir, "sheets", props.active_sheet.name + ".svg"),
|
||||||
context.scene.BIMProperties.data_dir, "sheets", props.active_sheet.name + ".svg"
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
@@ -661,6 +662,7 @@ class OpenView(bpy.types.Operator):
|
|||||||
|
|
||||||
class OpenViewCamera(bpy.types.Operator):
|
class OpenViewCamera(bpy.types.Operator):
|
||||||
"""Select this drawing's camera object and expand its drawing properties"""
|
"""Select this drawing's camera object and expand its drawing properties"""
|
||||||
|
|
||||||
bl_idname = "bim.open_view_camera"
|
bl_idname = "bim.open_view_camera"
|
||||||
bl_label = "Open View Camera"
|
bl_label = "Open View Camera"
|
||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
@@ -947,9 +949,7 @@ class ActivateDrawingStyle(bpy.types.Operator):
|
|||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
scene = context.scene
|
scene = context.scene
|
||||||
if scene.camera.data.BIMCameraProperties.active_drawing_style_index < len(
|
if scene.camera.data.BIMCameraProperties.active_drawing_style_index < len(scene.DocProperties.drawing_styles):
|
||||||
scene.DocProperties.drawing_styles
|
|
||||||
):
|
|
||||||
self.drawing_style = scene.DocProperties.drawing_styles[
|
self.drawing_style = scene.DocProperties.drawing_styles[
|
||||||
scene.camera.data.BIMCameraProperties.active_drawing_style_index
|
scene.camera.data.BIMCameraProperties.active_drawing_style_index
|
||||||
]
|
]
|
||||||
@@ -1265,7 +1265,7 @@ class AddSectionsAnnotations(bpy.types.Operator):
|
|||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def poll(cls, context):
|
def poll(cls, context):
|
||||||
camera = helper.get_active_drawing(context.scene)[1]
|
camera = helper.get_active_drawing(context.scene)[1]
|
||||||
return camera and camera.data.type == "ORTHO"
|
return camera and camera.data.type == "ORTHO"
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -271,16 +270,17 @@ class DocProperties(PropertyGroup):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def active_schedule(self):
|
def active_schedule(self):
|
||||||
return self.schedules[self.active_schedule_index]
|
return self.schedules[self.active_schedule_index]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def active_drawing(self):
|
def active_drawing(self):
|
||||||
return self.drawings[self.active_drawing_index]
|
return self.drawings[self.active_drawing_index]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def active_sheet(self):
|
def active_sheet(self):
|
||||||
return self.sheets[self.active_sheet_index]
|
return self.sheets[self.active_sheet_index]
|
||||||
|
|
||||||
|
|
||||||
class BIMCameraProperties(PropertyGroup):
|
class BIMCameraProperties(PropertyGroup):
|
||||||
view_name: StringProperty(name="View Name")
|
view_name: StringProperty(name="View Name")
|
||||||
target_view: EnumProperty(
|
target_view: EnumProperty(
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -27,7 +26,11 @@ from odf.style import Style
|
|||||||
|
|
||||||
class Scheduler:
|
class Scheduler:
|
||||||
def schedule(self, infile, outfile):
|
def schedule(self, infile, outfile):
|
||||||
self.svg = svgwrite.Drawing(outfile, debug=False, id="root",)
|
self.svg = svgwrite.Drawing(
|
||||||
|
outfile,
|
||||||
|
debug=False,
|
||||||
|
id="root",
|
||||||
|
)
|
||||||
self.padding = 1
|
self.padding = 1
|
||||||
self.margin = 1
|
self.margin = 1
|
||||||
doc = load(infile)
|
doc = load(infile)
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Maxim Vasilyev <qwiglydee@gmail.com>
|
# Copyright (C) 2020, 2021 Maxim Vasilyev <qwiglydee@gmail.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -45,7 +44,7 @@ class External(svgwrite.container.Group):
|
|||||||
self.xml = xml
|
self.xml = xml
|
||||||
|
|
||||||
# Remove namespace
|
# Remove namespace
|
||||||
ns = u"{http://www.w3.org/2000/svg}"
|
ns = "{http://www.w3.org/2000/svg}"
|
||||||
nsl = len(ns)
|
nsl = len(ns)
|
||||||
for elem in self.xml.iter():
|
for elem in self.xml.iter():
|
||||||
if elem.tag.startswith(ns):
|
if elem.tag.startswith(ns):
|
||||||
@@ -123,12 +122,12 @@ class SvgWriter:
|
|||||||
self.svg.add(
|
self.svg.add(
|
||||||
self.svg.image(
|
self.svg.image(
|
||||||
os.path.join("..", "diagrams", os.path.basename(self.background_image)),
|
os.path.join("..", "diagrams", os.path.basename(self.background_image)),
|
||||||
**{"width": self.width, "height": self.height}
|
**{"width": self.width, "height": self.height},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
def draw_background_elements(self):
|
def draw_background_elements(self):
|
||||||
return # TODO purge?
|
return # TODO purge?
|
||||||
for element in self.ifc_cutter.background_elements:
|
for element in self.ifc_cutter.background_elements:
|
||||||
if element["type"] == "polygon":
|
if element["type"] == "polygon":
|
||||||
self.draw_polygon(element, "background")
|
self.draw_polygon(element, "background")
|
||||||
@@ -180,7 +179,7 @@ class SvgWriter:
|
|||||||
"text-anchor": "middle",
|
"text-anchor": "middle",
|
||||||
"alignment-baseline": "middle",
|
"alignment-baseline": "middle",
|
||||||
"dominant-baseline": "middle",
|
"dominant-baseline": "middle",
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
self.svg.add(
|
self.svg.add(
|
||||||
@@ -193,7 +192,7 @@ class SvgWriter:
|
|||||||
"text-anchor": "middle",
|
"text-anchor": "middle",
|
||||||
"alignment-baseline": "middle",
|
"alignment-baseline": "middle",
|
||||||
"dominant-baseline": "middle",
|
"dominant-baseline": "middle",
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -252,7 +251,7 @@ class SvgWriter:
|
|||||||
"text-anchor": text_anchor,
|
"text-anchor": text_anchor,
|
||||||
"alignment-baseline": "baseline",
|
"alignment-baseline": "baseline",
|
||||||
"dominant-baseline": "baseline",
|
"dominant-baseline": "baseline",
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -294,7 +293,7 @@ class SvgWriter:
|
|||||||
"text-anchor": "start",
|
"text-anchor": "start",
|
||||||
"alignment-baseline": "baseline",
|
"alignment-baseline": "baseline",
|
||||||
"dominant-baseline": "baseline",
|
"dominant-baseline": "baseline",
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -325,7 +324,7 @@ class SvgWriter:
|
|||||||
"text-anchor": "middle",
|
"text-anchor": "middle",
|
||||||
"alignment-baseline": "middle",
|
"alignment-baseline": "middle",
|
||||||
"dominant-baseline": "middle",
|
"dominant-baseline": "middle",
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
self.draw_text_annotations()
|
self.draw_text_annotations()
|
||||||
@@ -473,7 +472,9 @@ class SvgWriter:
|
|||||||
)
|
)
|
||||||
|
|
||||||
transform = "rotate({}, {}, {})".format(
|
transform = "rotate({}, {}, {})".format(
|
||||||
angle, (text_position * self.scale)[0], (text_position * self.scale)[1],
|
angle,
|
||||||
|
(text_position * self.scale)[0],
|
||||||
|
(text_position * self.scale)[1],
|
||||||
)
|
)
|
||||||
|
|
||||||
if text_obj.data.BIMTextProperties.symbol != "None":
|
if text_obj.data.BIMTextProperties.symbol != "None":
|
||||||
@@ -516,7 +517,7 @@ class SvgWriter:
|
|||||||
"alignment-baseline": alignment_baseline,
|
"alignment-baseline": alignment_baseline,
|
||||||
"dominant-baseline": alignment_baseline,
|
"dominant-baseline": alignment_baseline,
|
||||||
"transform": transform,
|
"transform": transform,
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -607,7 +608,7 @@ class SvgWriter:
|
|||||||
"font-size": annotation.Annotator.get_svg_text_size(2.5),
|
"font-size": annotation.Annotator.get_svg_text_size(2.5),
|
||||||
"font-family": "OpenGost Type B TT",
|
"font-family": "OpenGost Type B TT",
|
||||||
"text-anchor": "middle",
|
"text-anchor": "middle",
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -623,7 +624,7 @@ class SvgWriter:
|
|||||||
return spline.bezier_points if spline.bezier_points else spline.points
|
return spline.bezier_points if spline.bezier_points else spline.points
|
||||||
|
|
||||||
def draw_cut_polygons(self):
|
def draw_cut_polygons(self):
|
||||||
return # deprecate?
|
return # deprecate?
|
||||||
for polygon in self.ifc_cutter.cut_polygons:
|
for polygon in self.ifc_cutter.cut_polygons:
|
||||||
self.draw_polygon(polygon, "cut")
|
self.draw_polygon(polygon, "cut")
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -150,7 +149,6 @@ class BIM_PT_drawing_underlay(Panel):
|
|||||||
row.operator("bim.activate_drawing_style")
|
row.operator("bim.activate_drawing_style")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class BIM_PT_drawings(Panel):
|
class BIM_PT_drawings(Panel):
|
||||||
bl_label = "SVG Drawings"
|
bl_label = "SVG Drawings"
|
||||||
bl_idname = "BIM_PT_drawings"
|
bl_idname = "BIM_PT_drawings"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -91,12 +90,12 @@ class BIM_PT_mesh(Panel):
|
|||||||
|
|
||||||
row = layout.row(align=True)
|
row = layout.row(align=True)
|
||||||
op = row.operator("bim.switch_representation", text="Bake Voids", icon="SELECT_SUBTRACT")
|
op = row.operator("bim.switch_representation", text="Bake Voids", icon="SELECT_SUBTRACT")
|
||||||
op.should_switch_all_meshes=True
|
op.should_switch_all_meshes = True
|
||||||
op.should_reload = True
|
op.should_reload = True
|
||||||
op.ifc_definition_id = props.ifc_definition_id
|
op.ifc_definition_id = props.ifc_definition_id
|
||||||
op.disable_opening_subtractions = False
|
op.disable_opening_subtractions = False
|
||||||
op = row.operator("bim.switch_representation", text="Dynamic Voids", icon="SELECT_INTERSECT")
|
op = row.operator("bim.switch_representation", text="Dynamic Voids", icon="SELECT_INTERSECT")
|
||||||
op.should_switch_all_meshes=True
|
op.should_switch_all_meshes = True
|
||||||
op.should_reload = True
|
op.should_reload = True
|
||||||
op.ifc_definition_id = props.ifc_definition_id
|
op.ifc_definition_id = props.ifc_definition_id
|
||||||
op.disable_opening_subtractions = True
|
op.disable_opening_subtractions = True
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
@@ -36,8 +35,8 @@ class BIMGeoreferenceProperties(PropertyGroup):
|
|||||||
is_editing: BoolProperty(name="Is Editing")
|
is_editing: BoolProperty(name="Is Editing")
|
||||||
map_conversion: CollectionProperty(name="Map Conversion", type=Attribute)
|
map_conversion: CollectionProperty(name="Map Conversion", type=Attribute)
|
||||||
projected_crs: CollectionProperty(name="Projected CRS", type=Attribute)
|
projected_crs: CollectionProperty(name="Projected CRS", type=Attribute)
|
||||||
coordinate_input: StringProperty(name="Coordinate Input", description="Formatted \"x,y,z\" (without quotes)")
|
coordinate_input: StringProperty(name="Coordinate Input", description='Formatted "x,y,z" (without quotes)')
|
||||||
coordinate_output: StringProperty(name="Coordinate Output", description="Formatted \"x,y,z\" (without quotes)")
|
coordinate_output: StringProperty(name="Coordinate Output", description='Formatted "x,y,z" (without quotes)')
|
||||||
has_blender_offset: BoolProperty(name="Has Blender Offset")
|
has_blender_offset: BoolProperty(name="Has Blender Offset")
|
||||||
blender_eastings: StringProperty(name="Blender Eastings", default="0")
|
blender_eastings: StringProperty(name="Blender Eastings", default="0")
|
||||||
blender_northings: StringProperty(name="Blender Northings", default="0")
|
blender_northings: StringProperty(name="Blender Northings", default="0")
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
|
||||||
#
|
#
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user