Newer
Older
import bpy
from bpy.props import BoolProperty
from bpy.types import Operator, Panel
from . import surfaces
from . import curves
from . import util
class OperatorAutoLoftCurves(Operator):
bl_idname = "curvetools.create_auto_loft"
bl_label = "Loft"
bl_description = "Lofts selected curves"
@classmethod
def poll(cls, context):
return util.Selected2Curves()
def execute(self, context):
#print("### TODO: OperatorLoftcurves.execute()")
mesh = bpy.data.meshes.new("LoftMesh")
curve0 = context.selected_objects[0]
curve1 = context.selected_objects[1]
ls = surfaces.LoftedSurface(curves.Curve(curve0), curves.Curve(curve1), "AutoLoft")
ls.bMesh.to_mesh(mesh)
loftobj = bpy.data.objects.new(self.name, mesh)
context.collection.objects.link(loftobj)
loftobj["autoloft"] = True
if loftobj.get('_RNA_UI') is None:
loftobj['_RNA_UI'] = {}
loftobj['_RNA_UI']["autoloft"] = {
"name": "Auto Loft",
"description": "Auto loft from %s to %s" % (curve0.name, curve1.name),
"curve0": curve0.name,
"curve1": curve1.name}
return {'FINISHED'}
class AutoLoftModalOperator(Operator):
"""Auto Loft"""
bl_idname = "curvetools.update_auto_loft_curves"
bl_label = "Update Auto Loft"
bl_description = "Update Lofts selected curves"
_timer = None
@classmethod
def poll(cls, context):
# two curves selected.
return True
def execute(self, context):
scene = context.scene
lofters = [o for o in scene.objects if "autoloft" in o.keys()]
# quick hack
#print("TIMER", lofters)
for loftmesh in lofters:
rna = loftmesh['_RNA_UI']["autoloft"].to_dict()
curve0 = scene.objects.get(rna["curve0"])
curve1 = scene.objects.get(rna["curve1"])
if curve0 and curve1:
ls = surfaces.LoftedSurface(curves.Curve(curve0), curves.Curve(curve1), loftmesh.name)
ls.bMesh.to_mesh(loftmesh.data)
return {'FINISHED'}
def register():
bpy.utils.register_class(AutoLoftModalOperator)
bpy.utils.register_class(OperatorAutoLoftCurves)
bpy.types.WindowManager.auto_loft = BoolProperty(default=False,
name="Auto Loft")
bpy.context.window_manager.auto_loft = False
def unregister():
bpy.utils.unregister_class(AutoLoftModalOperator)
bpy.utils.unregister_class(OperatorAutoLoftCurves)
if __name__ == "__main__":
register()