Python code for create ifcGrid direct on BlenderBIM
"""
#bpy.ops.bim.new_project(preset="metric_mm")
Test_Create_Grid_01.py
"""
import bpy
import blenderbim.tool as tool
import ifcopenshell
from mathutils import Vector
site = tool.Ifc.get().by_type("IfcSite")
site = site[0]
site_obj = tool.Ifc.get_object(site)
obj = bpy.data.objects.new("Grid", None)
obj.name = "Grid"
collection = site_obj.BIMObjectProperties.collection
collection.objects.link(obj)
bpy.ops.bim.assign_class(obj=obj.name, ifc_class="IfcGrid")
grid = tool.Ifc.get_entity(obj)
collection = obj.BIMObjectProperties.collection
GridXList = [ {'id':'1' , 'distance':0.0 } ,
{'id':'2' , 'distance':4 },
{'id':'3' , 'distance':7 }, ]
GridYList = [ {'id':'A' , 'distance':0.0 } ,
{'id':'B' , 'distance':3.5 },
{'id':'C' , 'distance':5.5 },
{'id':'D' , 'distance':9.5},]
common_keys = set.intersection(*map(set, GridXList))
v = {k: [dic[k] for dic in GridXList] for k in common_keys}
maxX = max(v['distance'])
minX = min(v['distance'])
common_keys = set.intersection(*map(set, GridYList))
v = {k: [dic[k] for dic in GridYList] for k in common_keys}
maxY = max(v['distance'])
minY = min(v['distance'])
axes_collection1 = bpy.data.collections.new("UAxes")
collection.children.link(axes_collection1)
for iGrid in GridYList:
id = iGrid['id']
y = iGrid['distance']
verts = [
Vector(( minX-2, y ,0)),
Vector(( maxX+2, y ,0)),
]
print(verts)
edges = [[0, 1]]
faces = []
mesh = bpy.data.meshes.new(name="Grid Axis")
mesh.from_pydata(verts, edges, faces)
tag = id
obj = bpy.data.objects.new(f"IfcGridAxis/{tag}", mesh)
axes_collection1.objects.link(obj)
result = ifcopenshell.api.run(
"grid.create_grid_axis",
tool.Ifc.get(),
**{"axis_tag": tag, "uvw_axes": "UAxes", "grid": grid},
)
tool.Ifc.link(result, obj)
ifcopenshell.api.run("grid.create_axis_curve", tool.Ifc.get(), **{"axis_curve": obj, "grid_axis": result})
obj.BIMObjectProperties.ifc_definition_id = result.id()
axes_collection2 = bpy.data.collections.new("VAxes")
collection.children.link(axes_collection2)
for iGrid in GridXList:
id = iGrid['id']
x = iGrid['distance']
verts = [
Vector(( x , minY-2, 0)),
Vector(( x , maxY+2, 0)),
]
print(verts)
edges = [[0, 1]]
faces = []
mesh = bpy.data.meshes.new(name="Grid Axis")
mesh.from_pydata(verts, edges, faces)
tag = id
obj = bpy.data.objects.new(f"IfcGridAxis/{tag}", mesh)
axes_collection2.objects.link(obj)
result = ifcopenshell.api.run(
"grid.create_grid_axis",
tool.Ifc.get(),
**{"axis_tag": tag, "uvw_axes": "VAxes", "grid": grid},
)
tool.Ifc.link(result, obj)
ifcopenshell.api.run("grid.create_axis_curve", tool.Ifc.get(), **{"axis_curve": obj, "grid_axis": result})
obj.BIMObjectProperties.ifc_definition_id = result.id()