NURBS curves
From DreamsteepWiki
NURBS CURVES
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
import sys, math
kPluginCmdName="keither"
kPitchFlag = "-p"
kPitchLongFlag = "-pitch"
kRadiusFlag = "-r"
kRadiusLongFlag = "-radius"
# command
class scriptedCommand(OpenMayaMPx.MPxCommand):
def __init__(self):
OpenMayaMPx.MPxCommand.__init__(self)
def doIt(self, args):
deg = 3
ncvs = 100
spans = ncvs - deg
nknots = spans+2*deg-1
radius = 4.0
pitch = 0.5
# Parse the arguments.
argData = OpenMaya.MArgDatabase(self.syntax(), args)
if argData.isFlagSet(kPitchFlag):
pitch = argData.flagArgumentDouble(kPitchFlag, 0)
if argData.isFlagSet(kRadiusFlag):
radius = argData.flagArgumentDouble(kRadiusFlag, 0)
controlVertices = OpenMaya.MPointArray()
knotSequences = OpenMaya.MDoubleArray()
# Set up cvs and knots for the helix
#
#for i in range(0, ncvs):
# controlVertices.append( OpenMaya.MPoint( radius * math.cos(i),math.cos(i),radius * math.sin(i) ))
# #controlVertices.append( OpenMaya.MPoint( 0,i ))
POINTS = [ [0,0,0],[1,1,0],[5,5,5],[1,3,0],[0,4,0] ]
#controlVertices.append( OpenMaya.MPoint( 0,0,0) )
for pnt in POINTS:
print pnt
controlVertices.append( OpenMaya.MPoint( pnt[0],pnt[1],pnt[2]) )
for KVINDEX in range( ((len(POINTS)+ deg)-1 ) ):
knotSequences.append( KVINDEX )
# Now create the curve
#
curveFn = OpenMaya.MFnNurbsCurve()
nullObj = OpenMaya.MObject()
try:
# This plugin normally creates the curve by passing in the
# cv's. A function to create curves by passing in the ep's
# has been added. Set this to False to get that behaviour.
#
if True:
curveFn.create( controlVertices,
knotSequences, deg,
OpenMaya.MFnNurbsCurve.kOpen,
0, 0,
nullObj )
else:
curveFn.createWithEditPoints(controlVertices,
3, OpenMaya.MFnNurbsCurve.kOpen,
False, False, False)
except:
sys.stderr.write( "Error creating curve.\n" )
raise
# Creator
def cmdCreator():
# Create the command
return OpenMayaMPx.asMPxPtr( scriptedCommand() )
# Syntax creator
def syntaxCreator():
syntax = OpenMaya.MSyntax()
syntax.addFlag(kPitchFlag, kPitchLongFlag, OpenMaya.MSyntax.kDouble)
syntax.addFlag(kRadiusFlag, kRadiusLongFlag, OpenMaya.MSyntax.kDouble)
return syntax
# Initialize the script plug-in
def initializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject, "Autodesk", "1.0", "Any")
try:
mplugin.registerCommand( kPluginCmdName, cmdCreator, syntaxCreator )
except:
sys.stderr.write( "Failed to register command: %s\n" % kPluginCmdName )
raise
# Uninitialize the script plug-in
def uninitializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterCommand( kPluginCmdName )
except:
sys.stderr.write( "Failed to unregister command: %s\n" % kPluginCmdName )
raise

