mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 17:58:20 +00:00
Fix ability to create grids which was totally broken
This commit is contained in:
@@ -33,12 +33,14 @@ class IfcStore:
|
||||
@staticmethod
|
||||
def link_element(element, obj):
|
||||
IfcStore.id_map[element.id()] = obj
|
||||
IfcStore.guid_map[element.GlobalId] = obj
|
||||
if hasattr(element, "GlobalId"):
|
||||
IfcStore.guid_map[element.GlobalId] = obj
|
||||
obj.BIMObjectProperties.ifc_definition_id = element.id()
|
||||
|
||||
@staticmethod
|
||||
def unlink_element(element, obj=None):
|
||||
del IfcStore.id_map[element.id()]
|
||||
del IfcStore.guid_map[element.GlobalId]
|
||||
if hasattr(element, "GlobalId"):
|
||||
del IfcStore.guid_map[element.GlobalId]
|
||||
if obj:
|
||||
obj.BIMObjectProperties.ifc_definition_id = 0
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
import ifcopenshell
|
||||
import ifcopenshell.util.unit
|
||||
import ifcopenshell.util.placement
|
||||
from mathutils import Matrix # For now, we depend on Blender
|
||||
from blenderbim.bim.module.owner.api import create_owner_history
|
||||
|
||||
|
||||
class Usecase:
|
||||
def __init__(self, file, settings=None):
|
||||
self.file = file
|
||||
self.settings = {
|
||||
"AxisTag": "A",
|
||||
"AxisCurve": None, # A Blender object
|
||||
"SameSense": True,
|
||||
"UVWAxes": "UAxes", # Choose which axes
|
||||
"Grid": None,
|
||||
}
|
||||
for key, value in settings.items():
|
||||
self.settings[key] = value
|
||||
|
||||
def execute(self):
|
||||
self.settings["unit_scale"] = ifcopenshell.util.unit.calculate_unit_scale(self.file)
|
||||
points = [
|
||||
Matrix(ifcopenshell.util.placement.get_local_placement(self.settings["Grid"].ObjectPlacement)).inverted()
|
||||
@ (self.settings["AxisCurve"].matrix_world @ v.co)
|
||||
for v in self.settings["AxisCurve"].data.vertices[0:2]
|
||||
]
|
||||
self.settings["AxisCurve"] = self.file.createIfcPolyline(
|
||||
[
|
||||
self.create_cartesian_point(points[0][0], points[0][1], points[0][2]),
|
||||
self.create_cartesian_point(points[1][0], points[1][1], points[1][2]),
|
||||
]
|
||||
)
|
||||
element = self.file.create_entity("IfcGridAxis", **{
|
||||
"AxisTag": self.settings["AxisTag"],
|
||||
"AxisCurve": self.settings["AxisCurve"],
|
||||
"SameSense": self.settings["SameSense"]
|
||||
})
|
||||
axes = list(getattr(self.settings["Grid"], self.settings["UVWAxes"]) or [])
|
||||
axes.append(element)
|
||||
setattr(self.settings["Grid"], self.settings["UVWAxes"], axes)
|
||||
return element
|
||||
|
||||
def create_cartesian_point(self, x, y, z=None):
|
||||
x = self.convert_si_to_unit(x)
|
||||
y = self.convert_si_to_unit(y)
|
||||
if z is None:
|
||||
return self.file.createIfcCartesianPoint((x, y))
|
||||
z = self.convert_si_to_unit(z)
|
||||
return self.file.createIfcCartesianPoint((x, y, z))
|
||||
|
||||
def convert_si_to_unit(self, co):
|
||||
return co / self.settings["unit_scale"]
|
||||
@@ -1,19 +1,16 @@
|
||||
import bpy
|
||||
import blenderbim.bim.module.grid.create_grid_axis as create_grid_axis
|
||||
from bpy.types import Operator
|
||||
from bpy.props import FloatProperty, IntProperty
|
||||
from bpy_extras.object_utils import AddObjectHelper, object_data_add
|
||||
from mathutils import Vector
|
||||
from blenderbim.bim.ifc import IfcStore
|
||||
|
||||
|
||||
def add_object(self, context):
|
||||
obj = object_data_add(context, None, operator=self)
|
||||
obj.name = "IfcGrid/Grid"
|
||||
name = obj.name.split("/")[1]
|
||||
obj = bpy.data.objects.new("Grid", None)
|
||||
obj.name = "Grid"
|
||||
|
||||
default_collection = obj.users_collection[0]
|
||||
default_collection.objects.unlink(obj)
|
||||
|
||||
collection = bpy.data.collections.new("IfcGrid/" + name)
|
||||
collection = bpy.data.collections.new(obj.name)
|
||||
has_site_collection = False
|
||||
for child in bpy.context.view_layer.layer_collection.children:
|
||||
if "IfcProject/" not in child.name:
|
||||
@@ -28,6 +25,13 @@ def add_object(self, context):
|
||||
bpy.context.view_layer.active_layer_collection.collection.children.link(collection)
|
||||
collection.objects.link(obj)
|
||||
|
||||
self.file = IfcStore.get_file()
|
||||
if self.file:
|
||||
bpy.ops.bim.assign_class(obj=obj.name, ifc_class="IfcGrid")
|
||||
grid = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)
|
||||
if has_site_collection:
|
||||
bpy.ops.bim.assign_container(relating_structure=grandchild.name, related_element=obj.name)
|
||||
|
||||
axes_collection = bpy.data.collections.new("UAxes")
|
||||
collection.children.link(axes_collection)
|
||||
for i in range(0, self.total_u):
|
||||
@@ -39,14 +43,16 @@ def add_object(self, context):
|
||||
faces = []
|
||||
mesh = bpy.data.meshes.new(name="Grid Axis")
|
||||
mesh.from_pydata(verts, edges, faces)
|
||||
obj = object_data_add(context, mesh, operator=self)
|
||||
tag = chr(ord("A") + i)
|
||||
obj.name = "IfcGridAxis/" + tag
|
||||
default_collection.objects.unlink(obj)
|
||||
obj = bpy.data.objects.new(f"IfcGridAxis/{tag}", mesh)
|
||||
|
||||
axes_collection.objects.link(obj)
|
||||
attribute = obj.BIMObjectProperties.attributes.add()
|
||||
attribute.name = "AxisTag"
|
||||
attribute.string_value = tag
|
||||
|
||||
if self.file:
|
||||
result = create_grid_axis.Usecase(
|
||||
self.file, {"AxisTag": tag, "AxisCurve": obj, "UVWAxes": "UAxes", "Grid": grid}
|
||||
).execute()
|
||||
obj.BIMObjectProperties.ifc_definition_id = result.id()
|
||||
|
||||
axes_collection = bpy.data.collections.new("VAxes")
|
||||
collection.children.link(axes_collection)
|
||||
@@ -59,17 +65,19 @@ def add_object(self, context):
|
||||
faces = []
|
||||
mesh = bpy.data.meshes.new(name="Grid Axis")
|
||||
mesh.from_pydata(verts, edges, faces)
|
||||
obj = object_data_add(context, mesh, operator=self)
|
||||
tag = str(i + 1).zfill(2)
|
||||
obj.name = "IfcGridAxis/" + tag
|
||||
default_collection.objects.unlink(obj)
|
||||
obj = bpy.data.objects.new(f"IfcGridAxis/{tag}", mesh)
|
||||
|
||||
axes_collection.objects.link(obj)
|
||||
attribute = obj.BIMObjectProperties.attributes.add()
|
||||
attribute.name = "AxisTag"
|
||||
attribute.string_value = tag
|
||||
|
||||
if IfcStore.get_file():
|
||||
result = create_grid_axis.Usecase(
|
||||
self.file, {"AxisTag": tag, "AxisCurve": obj, "UVWAxes": "VAxes", "Grid": grid}
|
||||
).execute()
|
||||
obj.BIMObjectProperties.ifc_definition_id = result.id()
|
||||
|
||||
|
||||
class BIM_OT_add_object(Operator, AddObjectHelper):
|
||||
class BIM_OT_add_object(Operator):
|
||||
bl_idname = "mesh.add_grid"
|
||||
bl_label = "Grid"
|
||||
bl_options = {"REGISTER", "UNDO"}
|
||||
|
||||
Reference in New Issue
Block a user