codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
import c4d from c4d import utils def main(): obj = op.GetObject() # get the object hosting the python tag # try to get the data try: traceSpl = op[c4d.ID_USERDATA,1] # the userdata holding the traced spline, the user data type has to be link. minThickness = op[c4d.ID_USERDATA,2] #min thickness, ud type has to be real_percent 0-100% (which is the real default value) scaleSplData = obj[c4d.SWEEPOBJECT_SPLINESCALE] # the sweep nurbs spline data # something went wrong except: traceSpl, scaleSplData = None, None # check if our objects are of the required type if isinstance(traceSpl, c4d.SplineObject) and isinstance(scaleSplData, c4d.SplineData): # make sure thickness value is valid: if not isinstance(minThickness, float): minThickness = 0 else: minThickness = min(minThickness, 1.0) # get the normalized and range mapped velcoity data veldata = getNormalizedVelocity(traceSpl.GetAllPoints(), minThickness) l = len(veldata) # init the SplineData according to our velocity data list length scaleSplData.MakeLinearSplineLinear(l) # write the values: for i, vel in enumerate(veldata): vec = c4d.Vector(float(i)/float(l), vel, 0) scaleSplData.SetKnot(i, vec) # write the splinedata back obj[c4d.SWEEPOBJECT_SPLINESCALE] = scaleSplData def getNormalizedVelocity(pnts, minThickness = None): """ Compute the velcoity vetcors out of an SplineObject control point list. :param pnts : the control point list :param minThickness : the minimum profile radius as a perecentage value (0.0 - 1.0). :return : float(0.0 - 1.0)[] """ l = (len(pnts)) mvel, temp, result = 0, [], [] # build raw velocity data for i in xrange(l - 1): vel = (pnts[i+1] - pnts[i]).GetLength() mvel = max(mvel,vel) # the peak velocity temp.append(vel) # normalize the data for n in temp: val = float(n) * (1.0 / float(mvel)) if minThickness is None: # unclamped result.append(val) else: # clamped (actually range mapped) result.append(utils.RangeMap(val, 0.0, 1.0, minThickness, 1.0, False)) return result
Private
[
?
]
Run code
Submit