58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
import bpy
|
|
from .utils import get_bioxels_obj, get_node_by_type
|
|
|
|
|
|
class ConvertToMesh(bpy.types.Operator):
|
|
bl_idname = "bioxelnodes.convert_to_mesh"
|
|
bl_label = "Bioxels To Mesh"
|
|
bl_description = "Convert Bioxels To Mesh"
|
|
bl_options = {'UNDO'}
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
bioxels_obj = None
|
|
for obj in bpy.context.selected_objects:
|
|
bioxels_obj = get_bioxels_obj(obj)
|
|
break
|
|
|
|
return True if bioxels_obj else False
|
|
|
|
def execute(self, context):
|
|
bioxels_objs = []
|
|
|
|
for obj in bpy.context.selected_objects:
|
|
bioxels_obj = get_bioxels_obj(obj)
|
|
if bioxels_obj:
|
|
bioxels_objs.append(bioxels_obj)
|
|
|
|
if len(bioxels_objs) == 0:
|
|
self.report({"WARNING"}, "Cannot find any bioxels.")
|
|
return {'FINISHED'}
|
|
|
|
for bioxels_obj in bioxels_objs:
|
|
bpy.ops.mesh.primitive_cube_add(
|
|
size=2, enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1))
|
|
mesh_obj = bpy.context.active_object
|
|
|
|
mesh_obj.name = f"{bioxels_obj.parent.name}_Mesh"
|
|
bpy.ops.node.new_geometry_nodes_modifier()
|
|
modifier = mesh_obj.modifiers[0]
|
|
nodes = modifier.node_group.nodes
|
|
links = modifier.node_group.links
|
|
|
|
output_node = get_node_by_type(nodes, 'NodeGroupOutput')[0]
|
|
object_node = nodes.new("GeometryNodeObjectInfo")
|
|
realize_nodes = nodes.new("GeometryNodeRealizeInstances")
|
|
object_node.inputs[0].default_value = bioxels_obj
|
|
object_node.transform_space = 'RELATIVE'
|
|
|
|
links.new(object_node.outputs['Geometry'], realize_nodes.inputs[0])
|
|
links.new(realize_nodes.outputs[0], output_node.inputs[0])
|
|
bpy.ops.object.convert(target='MESH')
|
|
bpy.context.object.active_material_index = 1
|
|
bpy.ops.object.material_slot_remove()
|
|
|
|
self.report({"INFO"}, f"Successfully convert to mesh")
|
|
|
|
return {'FINISHED'}
|