Latest revision |
Your text |
Line 1: |
Line 1: |
− | {{Start coding}}
| |
− |
| |
| ==Run a script in blender from command line== | | ==Run a script in blender from command line== |
| Blender can run any Python script headlessly. This allows for a lot of automation, which may run on a scheduled time. On Linux or Mac, you can combine this with cron, or use scheduled tasks on Windows. For example, to run the script <code>script.py</code>, just execute: | | Blender can run any Python script headlessly. This allows for a lot of automation, which may run on a scheduled time. On Linux or Mac, you can combine this with cron, or use scheduled tasks on Windows. For example, to run the script <code>script.py</code>, just execute: |
Line 43: |
Line 41: |
| ifc_exporter = blenderbim.bim.export_ifc.IfcExporter(settings, ifc_parser) | | ifc_exporter = blenderbim.bim.export_ifc.IfcExporter(settings, ifc_parser) |
| ifc_exporter.export(bpy.context.selected_objects) | | ifc_exporter.export(bpy.context.selected_objects) |
− | </syntaxhighlight>
| |
− |
| |
− | =Access IFC objects=
| |
− | Access multiple objects of specific criteria.
| |
− | ==Access Elements==
| |
− | <syntaxhighlight lang="python">
| |
− | import bpy
| |
− |
| |
− | walls = [obj for obj in bpy.context.scene.objects if obj.name.startswith("IfcWall")]
| |
− | voids = [obj for obj in bpy.context.scene.objects if obj.name.startswith("IfcBuildingElementProxy/ProvisionForVoid")]
| |
− | </syntaxhighlight>
| |
− |
| |
− | =Read object IFC data=
| |
− | Examples affect active object only.
| |
− |
| |
− | ==Element IFC Guid / GlobalId==
| |
− | <syntaxhighlight lang="python">
| |
− | import bpy
| |
− | from blenderbim.bim.ifc import IfcStore
| |
− |
| |
− | obj = bpy.context.active_object
| |
− | IfcStore.get_file().by_id(obj.BIMObjectProperties.ifc_definition_id).GlobalId
| |
− | </syntaxhighlight>
| |
− |
| |
− | ==Element Storey==
| |
− | <syntaxhighlight lang="python">
| |
− | import bpy
| |
− |
| |
− | users_collections = bpy.context.active_object.users_collection
| |
− | obj_storey = next(iter([coll for coll in users_collections if "IfcBuildingStorey" in coll.name]))
| |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
Line 112: |
Line 80: |
| prop.string_value = "Hello World !" | | prop.string_value = "Hello World !" |
| </syntaxhighlight> | | </syntaxhighlight> |
− |
| |
− | =Clash Detection=
| |
− | ==Clash Detection on 2 sets of elements==
| |
− | Clash Detection on 3 cubes in two sets in this example:
| |
− | <syntaxhighlight lang="python">
| |
− | import bpy
| |
− | import collision
| |
− | import numpy as np
| |
− | import bmesh
| |
− | import ifcclash
| |
− |
| |
− |
| |
− | def get_collision_results(set_a=None, set_b=None):
| |
− | a_cm = collision.CollisionManager()
| |
− | b_cm = collision.CollisionManager()
| |
− | add_to_cm(a_cm, set_a)
| |
− | add_to_cm(b_cm, set_b)
| |
− | return a_cm.in_collision_other(b_cm, return_data=True)
| |
− |
| |
− |
| |
− | def add_to_cm(cm, object_names):
| |
− | for object_name in object_names:
| |
− | name = object_name.name
| |
− | obj = bpy.data.objects[name]
| |
− | triangulated_mesh = triangulate_mesh(obj)
| |
− | mat = np.array(obj.matrix_world)
| |
− | mesh = ifcclash.Mesh()
| |
− | mesh.vertices = np.array([tuple(v.co) for v in triangulated_mesh.vertices])
| |
− | mesh.faces = np.array([tuple(p.vertices) for p in triangulated_mesh.polygons])
| |
− | cm.add_object(name, mesh, mat)
| |
− |
| |
− |
| |
− | def triangulate_mesh(obj):
| |
− | mesh = obj.evaluated_get(bpy.context.evaluated_depsgraph_get()).to_mesh()
| |
− | bm = bmesh.new()
| |
− | bm.from_mesh(mesh)
| |
− | bmesh.ops.triangulate(bm, faces=bm.faces)
| |
− | bm.to_mesh(mesh)
| |
− | bm.free()
| |
− | del bm
| |
− | return mesh
| |
− |
| |
− |
| |
− | set_a = [
| |
− | bpy.data.scenes['Scene'].objects['Cube'],
| |
− | ]
| |
− | set_b = [
| |
− | bpy.data.scenes['Scene'].objects['Cube.001'],
| |
− | bpy.data.scenes['Scene'].objects['Cube.002'],
| |
− | ]
| |
− |
| |
− |
| |
− | err, results = get_collision_results(set_a=set_a, set_b=set_b)
| |
− |
| |
− | seen_pairs = set()
| |
− | for result in results:
| |
− | result_pair = result.names
| |
− | result_names_str = str(result_pair)
| |
− | if result_names_str in seen_pairs:
| |
− | continue
| |
− | seen_pairs.add(str(result_pair))
| |
− | print(35 * "-")
| |
− | print(result_names_str)
| |
− | </syntaxhighlight>
| |
− |
| |
| | | |
| [[Category:Blender]] [[Category:BlenderBIM Add-on]] | | [[Category:Blender]] [[Category:BlenderBIM Add-on]] |