| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- from .node_container_common import *
- from .base_definitions import MantisNode, NodeSocket
- def TellClasses():
- return [
- # Primitives
- CirclePrimitive,
- GeometryLattice,
- ]
- #*#-------------------------------#++#-------------------------------#*#
- # P R I M I T I V E S
- #*#-------------------------------#++#-------------------------------#*#
- class PrimitiveNode(MantisNode):
- def __init__(self, signature, base_tree, socket_templates=[]):
- super().__init__(signature, base_tree, socket_templates)
- self.node_type = "UTILITY"
- self.prepared = True
-
- def reset_execution(self):
- super().reset_execution()
- self.prepared=True
- class CirclePrimitive(PrimitiveNode):
- '''A node representing a Circle Primitive mesh'''
- def __init__(self, signature, base_tree):
- super().__init__(signature, base_tree)
- inputs = [
- "Name",
- "Radius",
- "Number of Points",
- ]
- outputs = [
- "Circle",
- ]
- additional_parameters = {}
- self.inputs.init_sockets(inputs)
- self.outputs.init_sockets(outputs)
- self.init_parameters(additional_parameters=additional_parameters)
- def bGetObject(self):
- from bpy import data
- # first try Curve, then try Mesh
- bObject = data.curves.get(self.evaluate_input("Name"))
- if not bObject:
- bObject = data.meshes.get(self.evaluate_input("Name"))
- return bObject
-
- def bTransformPass(self, bContext = None,):
- # Get the datablock
- data = self.bGetObject()
- import bpy
- if not data:
- data = bpy.data.meshes.new( self.evaluate_input("Name") )
- # make the circle
- import bmesh; bm = bmesh.new()
- bmesh.ops.create_circle( # lazy but easy
- bm,
- cap_ends=False,
- radius=max(self.evaluate_input("Radius"), 0.0001),
- segments=min( max( self.evaluate_input("Number of Points"), 3), 1024),
- )
- # this is rotated 90 degrees, we need Y-up instead of Z-up
- from mathutils import Matrix
- from math import pi
- for v in bm.verts:
- v.co = Matrix.Rotation(pi/2, 4, 'X') @ v.co
- # done with this, push it to the data and free the bmesh.
- bm.to_mesh(data); bm.free()
- self.executed = True
- from .primitives_sockets import LatticeSockets
- class GeometryLattice(PrimitiveNode):
- '''A node representing a Circle Primitive mesh'''
- def __init__(self, signature, base_tree):
- super().__init__(signature, base_tree, LatticeSockets)
- self.init_parameters(additional_parameters= {})
- self.prepared = False
- def reset_execution(self):
- super().reset_execution()
- self.prepared=False
- self.executed=False
- def bGetObject(self):
- from bpy import data
- bObject = data.lattices.get(self.evaluate_input("Name"))
- return bObject
-
- def bPrepare(self, bContext = None,):
- # Get the datablock
- data = self.bGetObject()
- import bpy
- if not data:
- data = bpy.data.lattices.new( self.evaluate_input("Name") )
- props_sockets = self.gen_property_socket_map()
- evaluate_sockets(self, data, props_sockets)
- self.prepared = True; self.executed = True
|