Ejemplo n.º 1
0
def CutRailPieces(curve="", height=1.0, width=1.0):
    mc.delete(curve, ch=True)
    railGeoList = []
    tempCurCurve = [curve]
    mc.rebuildCurve(curve, s=curveLength / trackSegmentLength * 5)

    finalSegmentCurve = mc.detachCurve(
        curve + ".ep[" + str(int(curveLength / trackSegmentLength * 5) - 5) +
        "]",
        rpo=False,
        ch=False)
    finalSegmentGeo = MakeRailPiece(curve=finalSegmentCurve[1],
                                    width=width,
                                    height=height)
    railGeoList.append(finalSegmentGeo)
    mc.delete(finalSegmentCurve[0], finalSegmentCurve[1])
    deleteGroup = []
    for x in range(int(curveLength / trackSegmentLength)):
        tempCurCurve = mc.detachCurve(tempCurCurve[0] + ".ep[5]",
                                      rpo=True,
                                      ch=False)
        curRail = MakeRailPiece(curve=tempCurCurve[1],
                                width=width,
                                height=height)
        railGeoList.append(curRail)
        deleteGroup.append(tempCurCurve[0])
        print "iteration"
    mc.delete(deleteGroup)

    return railGeoList
Ejemplo n.º 2
0
def split(crv,param,deleteHistory=True):
	'''
	Split specified curve based on the parameter value(s) provided.
	@param crv: Curve to split
	@type crv: str
	@param param: Split curve at the parameter(s) provided.
	@type param: float or list
	@param deleteHistory: Delete construction history
	@type deleteHistory: bool
	'''
	# Check Curve
	if not mc.objExists(crv):
		raise Exception('Curve "'+crv+'" does not exist!')
	
	# Split Curve
	detach = mc.detachCurve(crv,p=param,ch=True,replaceOriginal=True)
	detachCrv = mc.ls(detach,transforms=True)
	detachCrv.insert(0, detachCrv.pop(-1))
	for i in range(len(detachCrv)):
		detachCrv[i] = mc.rename(detachCrv[i],crv+'_split'+str(i+1))
	
	# Delete History
	if deleteHistory: mc.delete(detachCrv,ch=True)
	
	# Return Result
	return detachCrv
Ejemplo n.º 3
0
def trimHair(curves, min, percent):
	'''
	random.randomly trim hair curves for more variation in length
	'''
	percentOfCurves = int(len(curves) * percent)
	for i in range(percentOfCurves):
		activeCurve = curves.pop(int(random.random()*len(curves)))
		r = (random.random() * (1.0 - min)) + min
		mc.delete(mc.detachCurve('%s.u[%f]' % (activeCurve, r), ch=False, cos=True, rpo=True)[0])
Ejemplo n.º 4
0
def fromPoint(curve,pnt=[0.0,0.0,0.0],replaceOrig=False,keepHistory=True):
	'''
	'''
	# Get subCurve parameter
	param = glTools.utils.curve.closestPoint(curve,pnt)
	
	# Detach curve
	subCurve = mc.detachCurve(curve,p=param,replaceOriginal=replaceOrig,ch=keepHistory)
	
	# Return result
	return subCurve
Ejemplo n.º 5
0
def fromPoint(curve, pnt=[0.0, 0.0, 0.0], replaceOrig=False, keepHistory=True):
    """
    """
    # Get subCurve parameter
    param = glTools.utils.curve.closestPoint(curve, pnt)

    # Detach curve
    subCurve = cmds.detachCurve(curve,
                                p=param,
                                replaceOriginal=replaceOrig,
                                ch=keepHistory)

    # Return result
    return subCurve
Ejemplo n.º 6
0
def trimFromBeginning(inputCurves, shortestLength):
	newCurves = []
	for obj in inputCurves:
		parent = mc.listRelatives(obj, parent=True)
		r = random.random()*(1-shortestLength)
		obj = mc.rebuildCurve(obj,  ch=0, rpo=1, rt=0, end=1, kr=0, kcp=1, kep=1, kt=0, s = 10, d = 3, tol = 0)[0]
		curves = mc.detachCurve( '%s.u[%f]' % (obj, r), ch=0, cos=True, rpo=1 )
		mc.delete(curves[-1])
		mc.rebuildCurve(curves[0], ch=1, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt= 0, s = 0, d = 3, tol = 0)
		curves[0] = mc.rename(curves[0], obj)
		if parent:
			curves[0] = mc.parent(curves[0], parent)[0]
		
		newCurves.append(curves[0])
	
	return newCurves
Ejemplo n.º 7
0
def fromRefCurve(curve,refCurve,rebuildToRef=True):
	'''
	'''
	# Get start and end reference points
	stRef = mc.pointOnCurve(refCurve,top=True,pr=0.0,p=True)
	enRef = mc.pointOnCurve(refCurve,top=True,pr=1.0,p=True)
	
	# Get boundary parameters
	stParam = glTools.utils.curve.closestPoint(curve,stRef)
	enParam = glTools.utils.curve.closestPoint(curve,enRef)
	
	# SubCurve
	subCurve = mc.detachCurve(curve,p=[stParam,enParam],replaceOriginal=False,ch=False)
	mc.delete(subCurve[0],subCurve[2])
	subCurve = mc.rename(subCurve[1],curve+'_subCurve')
	
	if rebuildToRef:
		degree = mc.getAttr(refCurve+'.degree')
		spans = mc.getAttr(refCurve+'.spans')
		mc.rebuildCurve(subCurve,ch=0,rpo=1,rt=0,end=1,kr=0,kcp=0,kep=1,kt=0,s=spans,d=degree,tol=0)
	
	# Return result
	return subCurve
Ejemplo n.º 8
0
def fromRefCurve(curve, refCurve, rebuildToRef=True):
    """
    """
    # Get start and end reference points
    stRef = cmds.pointOnCurve(refCurve, top=True, pr=0.0, p=True)
    enRef = cmds.pointOnCurve(refCurve, top=True, pr=1.0, p=True)

    # Get boundary parameters
    stParam = glTools.utils.curve.closestPoint(curve, stRef)
    enParam = glTools.utils.curve.closestPoint(curve, enRef)

    # SubCurve
    subCurve = cmds.detachCurve(curve,
                                p=[stParam, enParam],
                                replaceOriginal=False,
                                ch=False)
    cmds.delete(subCurve[0], subCurve[2])
    subCurve = cmds.rename(subCurve[1], curve + '_subCurve')

    if rebuildToRef:
        degree = cmds.getAttr(refCurve + '.degree')
        spans = cmds.getAttr(refCurve + '.spans')
        cmds.rebuildCurve(subCurve,
                          ch=0,
                          rpo=1,
                          rt=0,
                          end=1,
                          kr=0,
                          kcp=0,
                          kep=1,
                          kt=0,
                          s=spans,
                          d=degree,
                          tol=0)

    # Return result
    return subCurve
Ejemplo n.º 9
0
def buildSubCurveDetach(crv):
    """
    """
    # Get Prefix
    prefix = glTools.utils.stringUtils.stripSuffix(crv)

    # Prep Curve
    cmds.rebuildCurve(crv, ch=False, rpo=True, rt=0, end=1, kr=0, kcp=1, kep=1, kt=0, s=0, d=3)
    cmds.delete(crv, ch=True)

    # Detach Curve
    detach = cmds.detachCurve(crv, p=(0.001, 0.999), k=(0, 1, 0), rpo=False)
    detachCrv = detach[1]
    detachNode = detach[-1]
    cmds.delete(detach[0], detach[2])

    # Connect Detach Min/Max
    cmds.addAttr(subCrv, ln='min', min=0, max=0.999, dv=0, k=True)
    cmds.addAttr(subCrv, ln='max', min=0.001, max=1, dv=1, k=True)
    cmds.addAttr(subCrv, ln='offset', min=-1, max=1, dv=1, k=True)
    minAdd = cmds.createNode('addDoubleLinear', n=prefix + '_minAdd_addDoubleLinear')
    maxAdd = cmds.createNode('addDoubleLinear', n=prefix + '_maxAdd_addDoubleLinear')
    minMaxClamp = cmds.createNode('clamp', n=prefix + '_minMax_clamp')
    cmds.connectAttr(subCrv + '.min', minAdd + '.input1', f=True)
    cmds.connectAttr(subCrv + '.offset', minAdd + '.input2', f=True)
    cmds.connectAttr(subCrv + '.max', maxAdd + '.input1', f=True)
    cmds.connectAttr(subCrv + '.offset', maxAdd + '.input2', f=True)
    cmds.connectAttr(minAdd + '.output', minMaxClamp + '.inputR', f=True)
    cmds.connectAttr(maxAdd + '.output', minMaxClamp + '.inputB', f=True)
    cmds.setAttr(minMaxClamp + '.min', 0, 0, 0.0001)
    cmds.setAttr(minMaxClamp + '.max', 0.9999, 0, 0)
    cmds.connectAttr(minMaxClamp + '.outputR', detachNode + '.parameter[0]', f=True)
    cmds.connectAttr(minMaxClamp + '.outputB', detachNode + '.parameter[1]', f=True)

    # Return Result
    return detachCrv
Ejemplo n.º 10
0
    def split_len_crv(self):
        """
        Create two child curves that are half the primary lenCurve to separate
        the upper and lower segments for use in arms and legs
        """
        curve = self.lenCurves[0]

        # Split the curve at the halfway point
        crvs = mc.detachCurve("{}.u[.5]".format(
            curve), ch=True, n="{}_base".format(curve))

        # Name the new curves and add them to a New Curves list
        mc.rename(crvs[1], "{}_tip".format(curve))
        crvs[1] = "{}_tip".format(curve)
        newCrvs = crvs[0:2]

        for crv in newCrvs:
            mc.setAttr("{}.visibility".format(crv), 0)
            # Add each curve to lenCurves cless variable...
            self.lenCurves.append(crv)
            # ...and parent them to the primary curve
            mc.parent(crv, curve)

        return newCrvs
Ejemplo n.º 11
0
def cutCrvOnIntersection():
    '''
	Main method.
	'''

    selList = cmds.ls(sl=True)
    curves = selList[0:-1]
    surface = selList[-1]

    # Define input surface type.
    srfcShp = cmds.listRelatives(surface, s=True)[0]
    if cmds.objectType(srfcShp) == 'mesh':
        cpNodeType = 'closestPointOnMesh'
    elif cmds.objectType(srfcShp) == 'nurbsSurface':
        cpNodeType = 'closestPointOnSurface'

    # Create "closestPointOnMesh" or "closestPointOnSurface" node depend on surface type.
    cpNode = cmds.createNode(cpNodeType, n='temp_cpNode')

    # Connect surface to cpNode(closet point node).
    if cpNodeType == 'closestPointOnMesh':
        cmds.connectAttr('%s.worldMesh[0]' % (srfcShp),
                         '%s.inMesh' % (cpNode),
                         f=True)
    if cpNodeType == 'closestPointOnSurface':
        cmds.connectAttr('%s.worldSpace[0]' % (srfcShp),
                         '%s.inputSurface' % (cpNode),
                         f=True)

    errorCrvList = []

    # Show progress window.
    if cmds.window('progWin', exists=True):
        cmds.deleteUI('progWin')
    cmds.window('progWin', title='Working...')
    cmds.columnLayout()
    cmds.progressBar('progBar',
                     minValue=0,
                     maxValue=len(curves),
                     width=300,
                     isMainProgressBar=True,
                     beginProgress=True,
                     isInterruptable=True)
    cmds.window('progWin', e=True, w=300, h=10)
    cmds.showWindow('progWin')

    for curve in curves:
        # Progress window.
        if cmds.progressBar('progBar', q=True, isCancelled=True):
            print 'Cutting curve job is cancelled.'
            break
        cmds.progressBar('progBar', e=True, step=1)

        # Initialize variables.
        tempCrvPos = 0
        tempCrvPosList = [tempCrvPos]
        increment = 0.5
        tolerance = 0.005
        maxCalNum = 3000
        calCount = 1

        dist = calDist(curve, tempCrvPos, cpNode)

        # While distance is greater than tolerance, increse tempCrvPos and calculate again.
        while dist > tolerance:
            tempCrvPos += increment

            # If already calculate temporary curve point, skip it.
            if tempCrvPos in tempCrvPosList:
                continue
            else:
                # If calulate number reaches to maximun calulate number, break.
                if calCount == maxCalNum:
                    print '%s is not intersecting curve.' % (curve)
                    errorCrvList.append(curve)
                    break
                dist = calDist(curve, tempCrvPos, cpNode)
                tempCrvPosList.append(tempCrvPos)
                calCount += 1

            # If temporary curve position reaches to maxium value at 1, reset the value and decrease increment to more dense searching.
            if tempCrvPos >= 1:
                tempCrvPos = 0
                increment = increment / 2

        if not calCount == maxCalNum:
            # If distance is less than tolerance, cut curve and go to the next curve.
            cmds.select('%s.un[%f]' % (curve, tempCrvPos))
            cmds.detachCurve(rpo=True)

    # Remove progress window.
    cmds.progressBar('progBar', e=True, endProgress=True)
    cmds.deleteUI('progWin')

    cmds.delete(cpNode)
    cmds.select(errorCrvList, r=True)
Ejemplo n.º 12
0
def detachCurve(*args, **kwargs):
    res = cmds.detachCurve(*args, **kwargs)
    if not kwargs.get('query', kwargs.get('q', False)):
        res = _factories.maybeConvert(res, _general.PyNode)
    return res
Ejemplo n.º 13
0
def cutBirailCurves(inCurve, indexCurve) :
    
    shell = inCurve
    bbox = cmds.exactWorldBoundingBox(shell) 
    closestPoint = cmds.createNode('closestPointOnCurve') 
    tmpShape = cmds.listRelatives(shell, children=True) 
    print tmpShape 
    cmds.setAttr(closestPoint + '.inPositionX', bbox[0] - 5) 
    cmds.setAttr(closestPoint + '.inPositionY', bbox[1] - 5) 
    cmds.setAttr(closestPoint + '.inPositionZ', bbox[2]) 
    cmds.connectAttr((tmpShape[0] + '.worldSpace'), (closestPoint + '.inCurve')) 
    Dcorner =cmds.getAttr(closestPoint + '.paramU') 
    print Dcorner 
    ref = cmds.duplicate(shell) 
    
    #set first cv to first corner
    spans = cmds.getAttr(tmpShape[0] + '.spans') 
    i = Dcorner 
    print Dcorner 
    for k in xrange(spans+1): 
     
        IDA =  cmds.xform('%s.cv[%s]'%(ref[0], str(int(i))), q = True, translation=True, worldSpace=True) 
        print IDA 
        cmds.move(IDA[0] , IDA[1], IDA[2], '%s.cv[%s]'%(shell, str(int(k))), ws = True) 
        i = i + 1 
        print i 
        if i > (spans ) : 
            i = i - spans 
         
    cmds.delete(ref) 
     
    #get other corners
    cmds.setAttr(closestPoint + '.inPositionX', bbox[0] - 5) 
    cmds.setAttr(closestPoint + '.inPositionY', bbox[4] + 5) 
    cmds.setAttr(closestPoint + '.inPositionZ', bbox[2]) 
    Acorner =cmds.getAttr(closestPoint + '.paramU') 
    cmds.setAttr(closestPoint + '.inPositionX', bbox[3] + 5) 
    cmds.setAttr(closestPoint + '.inPositionY', bbox[4] + 5) 
    cmds.setAttr(closestPoint + '.inPositionZ', bbox[2]) 
    Bcorner =cmds.getAttr(closestPoint + '.paramU') 
    cmds.setAttr(closestPoint + '.inPositionX', bbox[3] + 5) 
    cmds.setAttr(closestPoint + '.inPositionY', bbox[1] - 5) 
    cmds.setAttr(closestPoint + '.inPositionZ', bbox[2]) 
    Ccorner =cmds.getAttr(closestPoint + '.paramU') 
     
         
    cmds.select('%s.ep[%s]'%(shell, str(int(Acorner))), replace = True) 
    cmds.select('%s.ep[%s]'%(shell, str(int(Bcorner))), add = True) 
    cmds.select('%s.ep[%s]'%(shell, str(int(Ccorner))), add = True) 
    
    #detach curve
    curvePoints = [ '%s.ep[%s]'%(shell, '0'), '%s.ep[%s]'%(shell, str(int(Acorner))),'%s.ep[%s]'%(shell, str(int(Bcorner))),'%s.ep[%s]'%(shell, str(int(Ccorner))),  '%s.ep[%s]'%(shell, '99999999')] 
    patternCurves = cmds.detachCurve(curvePoints, rpo = True, n = 'cuttedCurve', ch = True) 
    print patternCurves 
    print [patternCurves[0],  patternCurves[2], shell,  patternCurves[2]] 
    
    #create group
    grpBaseEx = cmds.ls('BIRAILS_GRP')
    if len(grpBaseEx)==0 :
        cmds.group(em=True, w=True, n='BIRAILS_GRP')
    
    firstCrvsGrp = cmds.group([patternCurves[0], patternCurves[1], patternCurves[2], patternCurves[3]], n=('birail'+str(indexCurve)+'_GRP'), p='BIRAILS_GRP')
    
    firstCrvs = cmds.listRelatives(firstCrvsGrp)
    
    #highlight group if doesn't contain 4 curves, or contains a curve with 0 span
    if len(firstCrvs)!=4 :
        cmds.setAttr(firstCrvsGrp+'.overrideEnabled', 1)
        cmds.setAttr(firstCrvsGrp+'.overrideColor', 13)
        
    for firstCrv in firstCrvs :
        firstCrvSpans = cmds.getAttr(firstCrv+'.spans')
        if firstCrvSpans==0 :
            cmds.setAttr(firstCrvsGrp+'.overrideEnabled', 1)
            cmds.setAttr(firstCrvsGrp+'.overrideColor', 13)
    
    #delete unused elements
    cmds.delete(closestPoint)
    cmds.delete(shell)
    
    if len(patternCurves)>4 :
        if patternCurves[4]!=shell :
            cmds.delete(patternCurves[4])
Ejemplo n.º 14
0
def create(piv=[0,0,0],axis=[0,0,-1],rad=1,dilate_ctrl='',prefix='eyeball'):
	
	#------------------------
	# Generate Profile Curve
	
	# sphere
	eye_sphere = mc.sphere(p=piv,ax=axis,r=rad,n=prefix+'_history')
	# curve from sphere
	eye_crv = mc.duplicateCurve(eye_sphere[0]+'.v[0]')
	eye_crv[0] = mc.rename(eye_crv[0],prefix+'_pfl01_crv')
	# rebuild curve 0-1
	mc.rebuildCurve(eye_crv[0],rpo=1,end=1,kcp=1,kr=0,d=3,tol=0.01)
	
	#------------------------
	# Extract Curve Segments
	
	# detach curve
	eye_crv_detach = mc.detachCurve(eye_crv[0]+'.u[0.125]',eye_crv[0]+'.u[0.25]',rpo=0,ch=1)
	eye_crv_detach[0] = mc.rename(eye_crv_detach[0],prefix+'_pl01_crv')
	eye_crv_detach[1] = mc.rename(eye_crv_detach[1],prefix+'_ir01_crv')
	eye_crv_detach[2] = mc.rename(eye_crv_detach[2],prefix+'_sc01_crv')
	eye_crv_detach[3] = mc.rename(eye_crv_detach[3],prefix+'_cr01_dtc')
	# rebuild curve segments
	pupil_rebuild = mc.rebuildCurve(eye_crv_detach[0],rpo=1,end=1,kep=1,kt=1,kr=0,s=2,d=3,tol=0.01)
	iris_rebuild = mc.rebuildCurve(eye_crv_detach[1],rpo=1,end=1,kep=1,kt=1,kr=0,s=2,d=3,tol=0.01)
	sclera_rebuild = mc.rebuildCurve(eye_crv_detach[2],rpo=1,end=1,kep=1,kt=1,kr=0,s=4,d=3,tol=0.01)
	pupil_rebuild[1] = mc.rename(pupil_rebuild[1],prefix+'_pl01_rbc')
	iris_rebuild[1] = mc.rename(iris_rebuild[1],prefix+'_ir01_rbc')
	sclera_rebuild[1] = mc.rename(sclera_rebuild[1],prefix+'_sc01_rbc')
	
	#------------------------
	# Generate Eye Surfaces
	
	# revolve
	pupil_revolve = mc.revolve(eye_crv_detach[0],po=0,rn=0,ut=0,tol=0.01,degree=3,s=8,ulp=1,ax=[0,0,1])
	iris_revolve = mc.revolve(eye_crv_detach[1],po=0,rn=0,ut=0,tol=0.01,degree=3,s=8,ulp=1,ax=[0,0,1])
	sclera_revolve = mc.revolve(eye_crv_detach[2],po=0,rn=0,ut=0,tol=0.01,degree=3,s=8,ulp=1,ax=[0,0,1])
	# rename surfaces
	pupil_revolve[0] = mc.rename(pupil_revolve[0],prefix+'_pl01_srf')
	pupil_revolve[1] = mc.rename(pupil_revolve[1],prefix+'_pl01_rvl')
	iris_revolve[0] = mc.rename(iris_revolve[0],prefix+'_ir01_srf')
	iris_revolve[1] = mc.rename(iris_revolve[1],prefix+'_ir01_rvl')
	sclera_revolve[0] = mc.rename(sclera_revolve[0],prefix+'_sc01_srf')
	sclera_revolve[1] = mc.rename(sclera_revolve[1],prefix+'_sc01_rvl')
	# Connect Revolve Pivot
	mc.connectAttr(eye_sphere[0]+'.t',pupil_revolve[1]+'.pivot',f=1)
	mc.connectAttr(eye_sphere[0]+'.t',iris_revolve[1]+'.pivot',f=1)
	mc.connectAttr(eye_sphere[0]+'.t',sclera_revolve[1]+'.pivot',f=1)
	
	#------------------------
	# Connect Dilate Control
	
	if len(dilate_ctrl):
		
		# Verify Control
		if not mc.objExists(dilate_ctrl):
			raise UserInputError('Object ' + dilate_ctrl + ' does not exist!')
		
		# Check Attributes Exist
		if not mc.objExists(dilate_ctrl+'.iris'):
			mc.addAttr(dilate_ctrl,ln='iris',min=0,max=4,dv=1)
			mc.setAttr(dilate_ctrl+'.iris',k=1)
		if not mc.objExists(dilate_ctrl+'.pupil'):
			mc.addAttr(dilate_ctrl,ln='pupil',min=0,max=1,dv=0.5)
			mc.setAttr(dilate_ctrl+'.pupil',k=1)
		
		# Connect Attributes
		iris_md = mc.createNode('multDoubleLinear',n=prefix+'_irs01_mdl')
		pupil_md = mc.createNode('multDoubleLinear',n=prefix+'_ppl01_mdl')
		mc.connectAttr(dilate_ctrl+'.iris',iris_md+'.input1')
		mc.setAttr(iris_md+'.input2',0.25)
		mc.connectAttr(iris_md+'.output',eye_crv_detach[3]+'.parameter[1]')
		mc.connectAttr(dilate_ctrl+'.pupil',pupil_md+'.input1')
		mc.connectAttr(iris_md+'.output',pupil_md+'.input2')
		mc.connectAttr(pupil_md+'.output',eye_crv_detach[3]+'.parameter[0]')
Ejemplo n.º 15
0
def cutCurve(curve, mesh, loopCheck=False):

    fnMesh = getMFnMesh(mesh)
    fnCurve = getMFnCurve(curve)
    meshIntersector = om.MMeshIntersector()
    meshIntersector.create(fnMesh.object())

    meshMtx = fnMesh.dagPath().inclusiveMatrix()
    curveMtx = fnCurve.dagPath().inclusiveMatrix()
    toMeshLocalMtx = curveMtx * meshMtx.inverse()

    numSpans = fnCurve.numSpans()

    maxParam = fnCurve.findParamFromLength(fnCurve.length())

    paramRate = maxParam / (numSpans - 1)

    point = om.MPoint()
    pointOnMesh = om.MPointOnMesh()

    closestParam = 0.0
    for i in range(numSpans):
        fnCurve.getPointAtParam(paramRate * i, point)
        toMeshPoint = point * toMeshLocalMtx
        meshIntersector.getClosestPoint(toMeshPoint, pointOnMesh)
        closePoint = om.MPoint(pointOnMesh.getPoint())
        normal = om.MVector(pointOnMesh.getNormal())

        closePivVector = om.MVector(toMeshPoint) - om.MVector(closePoint)
        if closePivVector * normal < 0:
            closestParam = paramRate * i
        else:
            if i == 0:
                if loopCheck: return None
                cmds.reverseCurve(curve, ch=0, rpo=1)
                cutCurve(curve, mesh, True)

    i = 0
    addParam = 1
    while i < 100:
        fnCurve.getPointAtParam(closestParam, point)
        toMeshPoint = point * toMeshLocalMtx
        meshIntersector.getClosestPoint(toMeshPoint, pointOnMesh)
        closePoint = om.MPoint(pointOnMesh.getPoint())
        cuDist = closePoint.distanceTo(toMeshPoint)
        if cuDist < 0.0001: break

        normal = om.MVector(pointOnMesh.getNormal())

        closePivVector = om.MVector(toMeshPoint) - om.MVector(closePoint)
        if closePivVector * normal > 0:
            addParam = math.fabs(addParam) * -0.5
        else:
            addParam = math.fabs(addParam) * 0.5

        closestParam += addParam
        i += 1

    fnCurve.getPointAtParam(closestParam, point)
    first, second = cmds.detachCurve("%s.u[%f]" % (curve, closestParam),
                                     ch=0,
                                     cos=True,
                                     rpo=0)
    curveObj = cmds.listRelatives(curve, p=1)[0]
    cmds.delete(first, curveObj)
    second = cmds.rename(second, curveObj)
    cmds.select(second)
    cmds.DeleteHistory()
Ejemplo n.º 16
0
#Start with template curve
leftStrand = cmds.curve(p=[(-1,0,-0.125),(-0.9375,-0.0875,-0.1875),(-0.84375,-0.06375,-0.26),(-0.7578125,-0.0053125,-0.275),(-0.6875,0.0425,-0.26),(-0.625,0.06375,-0.234375),(-0.5625,0.0425,-0.1875),(-0.5,0,-0.125),(-0.4375,-0.0875221,-0.0625),(-0.375,-0.06375,-0.015625),(-0.3125,-0.0425,0),(-0.2421875,0.0053125,0),(-0.15625,0.06375,0),(-0.0625,0.0425,-0.0625),(0,0,-0.125),(0.0625,-0.08752214296547417,-0.1875),(0.15625,-0.06375,-0.26),(0.2421875,-0.0053125,-0.275),(0.3125,0.0425,-0.26),(0.375,0.06375,-0.234375),(0.4375,0.0425,-0.1875),(0.5,0,-0.125),(0.5625,-0.0875221,-0.0625),(0.625,-0.06375,-0.015625),(0.6875,-0.0425,0),(0.7578125,0.0053125,0),(0.84375,0.06375,0),(0.9375,0.0425,-0.0625),(1,0,-0.125)], k=[0,0,0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6,6,6.5,7,7.5,8,8.5,9,9.5,10,10.5,11,11.5,12,12,12], name='leftStrand')
lsTemplate = cmds.duplicate('leftStrand', name='lsTemplate')

#Append length if necessary
cutbottom = 12 #Curve point at which to detach curve
for i in xrange(0, append):
    toAppend = cmds.duplicate('lsTemplate', name='leftStrand2')
    cmds.move(2*(i+1),0,0,'leftStrand2', relative=True)
    cmds.attachCurve('leftStrand', 'leftStrand2')
    cmds.delete('leftStrand2')
    cutbottom = 12*(i+2) - 6*(i+1)

#Cut bottom of curve
cmds.detachCurve('leftStrand.u['+str(cutbottom)+']', k=(1,0), replaceOriginal=True)
cmds.delete('leftStranddetachedCurve2')

#Position strand upright, set color to red
cmds.rotate(0, 0, -90, leftStrand)
cmds.move(-0.0072805614748225056, 0.62530322953737649, 0.12630761389650735, leftStrand, relative=True)
cmds.setAttr(leftStrand+'.overrideEnabled', 1)
cmds.setAttr(leftStrand+'.overrideColor', 4)

#Duplicate curves concentrically around template
r = radius
while r > 0:
    theta = 0
    while theta <= 360:
        copyLS = cmds.duplicate('leftStrand', name=leftStrand+'_copy#')
        copyName = 'leftStrand_copy'+str(counter1)
Ejemplo n.º 17
0
def create(piv=[0, 0, 0],
           axis=[0, 0, -1],
           rad=1,
           dilate_ctrl='',
           prefix='eyeball'):
    # ------------------------
    # Generate Profile Curve

    # sphere
    eye_sphere = cmds.sphere(p=piv, ax=axis, r=rad, n=prefix + '_history')
    # curve from sphere
    eye_crv = cmds.duplicateCurve(eye_sphere[0] + '.v[0]')
    eye_crv[0] = cmds.rename(eye_crv[0], prefix + '_pfl01_crv')
    # rebuild curve 0-1
    cmds.rebuildCurve(eye_crv[0], rpo=1, end=1, kcp=1, kr=0, d=3, tol=0.01)

    # ------------------------
    # Extract Curve Segments

    # detach curve
    eye_crv_detach = cmds.detachCurve(eye_crv[0] + '.u[0.125]',
                                      eye_crv[0] + '.u[0.25]',
                                      rpo=0,
                                      ch=1)
    eye_crv_detach[0] = cmds.rename(eye_crv_detach[0], prefix + '_pl01_crv')
    eye_crv_detach[1] = cmds.rename(eye_crv_detach[1], prefix + '_ir01_crv')
    eye_crv_detach[2] = cmds.rename(eye_crv_detach[2], prefix + '_sc01_crv')
    eye_crv_detach[3] = cmds.rename(eye_crv_detach[3], prefix + '_cr01_dtc')
    # rebuild curve segments
    pupil_rebuild = cmds.rebuildCurve(eye_crv_detach[0],
                                      rpo=1,
                                      end=1,
                                      kep=1,
                                      kt=1,
                                      kr=0,
                                      s=2,
                                      d=3,
                                      tol=0.01)
    iris_rebuild = cmds.rebuildCurve(eye_crv_detach[1],
                                     rpo=1,
                                     end=1,
                                     kep=1,
                                     kt=1,
                                     kr=0,
                                     s=2,
                                     d=3,
                                     tol=0.01)
    sclera_rebuild = cmds.rebuildCurve(eye_crv_detach[2],
                                       rpo=1,
                                       end=1,
                                       kep=1,
                                       kt=1,
                                       kr=0,
                                       s=4,
                                       d=3,
                                       tol=0.01)
    pupil_rebuild[1] = cmds.rename(pupil_rebuild[1], prefix + '_pl01_rbc')
    iris_rebuild[1] = cmds.rename(iris_rebuild[1], prefix + '_ir01_rbc')
    sclera_rebuild[1] = cmds.rename(sclera_rebuild[1], prefix + '_sc01_rbc')

    # ------------------------
    # Generate Eye Surfaces

    # revolve
    pupil_revolve = cmds.revolve(eye_crv_detach[0],
                                 po=0,
                                 rn=0,
                                 ut=0,
                                 tol=0.01,
                                 degree=3,
                                 s=8,
                                 ulp=1,
                                 ax=[0, 0, 1])
    iris_revolve = cmds.revolve(eye_crv_detach[1],
                                po=0,
                                rn=0,
                                ut=0,
                                tol=0.01,
                                degree=3,
                                s=8,
                                ulp=1,
                                ax=[0, 0, 1])
    sclera_revolve = cmds.revolve(eye_crv_detach[2],
                                  po=0,
                                  rn=0,
                                  ut=0,
                                  tol=0.01,
                                  degree=3,
                                  s=8,
                                  ulp=1,
                                  ax=[0, 0, 1])
    # rename surfaces
    pupil_revolve[0] = cmds.rename(pupil_revolve[0], prefix + '_pl01_srf')
    pupil_revolve[1] = cmds.rename(pupil_revolve[1], prefix + '_pl01_rvl')
    iris_revolve[0] = cmds.rename(iris_revolve[0], prefix + '_ir01_srf')
    iris_revolve[1] = cmds.rename(iris_revolve[1], prefix + '_ir01_rvl')
    sclera_revolve[0] = cmds.rename(sclera_revolve[0], prefix + '_sc01_srf')
    sclera_revolve[1] = cmds.rename(sclera_revolve[1], prefix + '_sc01_rvl')
    # Connect Revolve Pivot
    cmds.connectAttr(eye_sphere[0] + '.t', pupil_revolve[1] + '.pivot', f=1)
    cmds.connectAttr(eye_sphere[0] + '.t', iris_revolve[1] + '.pivot', f=1)
    cmds.connectAttr(eye_sphere[0] + '.t', sclera_revolve[1] + '.pivot', f=1)

    # ------------------------
    # Connect Dilate Control

    if len(dilate_ctrl):

        # Verify Control
        if not cmds.objExists(dilate_ctrl):
            raise UserInputError('Object ' + dilate_ctrl + ' does not exist!')

        # Check Attributes Exist
        if not cmds.objExists(dilate_ctrl + '.iris'):
            cmds.addAttr(dilate_ctrl, ln='iris', min=0, max=4, dv=1)
            cmds.setAttr(dilate_ctrl + '.iris', k=1)
        if not cmds.objExists(dilate_ctrl + '.pupil'):
            cmds.addAttr(dilate_ctrl, ln='pupil', min=0, max=1, dv=0.5)
            cmds.setAttr(dilate_ctrl + '.pupil', k=1)

        # Connect Attributes
        iris_md = cmds.createNode('multDoubleLinear', n=prefix + '_irs01_mdl')
        pupil_md = cmds.createNode('multDoubleLinear', n=prefix + '_ppl01_mdl')
        cmds.connectAttr(dilate_ctrl + '.iris', iris_md + '.input1')
        cmds.setAttr(iris_md + '.input2', 0.25)
        cmds.connectAttr(iris_md + '.output',
                         eye_crv_detach[3] + '.parameter[1]')
        cmds.connectAttr(dilate_ctrl + '.pupil', pupil_md + '.input1')
        cmds.connectAttr(iris_md + '.output', pupil_md + '.input2')
        cmds.connectAttr(pupil_md + '.output',
                         eye_crv_detach[3] + '.parameter[0]')
Ejemplo n.º 18
0
def cutCurve( curve, mesh, loopCheck = False ):
    
    fnMesh = getMFnMesh( mesh )
    fnCurve = getMFnCurve( curve )
    meshIntersector = om.MMeshIntersector()
    meshIntersector.create( fnMesh.object() )
    
    meshMtx  = fnMesh.dagPath().inclusiveMatrix()
    curveMtx = fnCurve.dagPath().inclusiveMatrix()
    toMeshLocalMtx = curveMtx*meshMtx.inverse()
    
    numSpans = fnCurve.numSpans()
    
    maxParam = fnCurve.findParamFromLength( fnCurve.length() )
    
    paramRate = maxParam / ( numSpans-1 )
    
    point = om.MPoint()
    pointOnMesh = om.MPointOnMesh()
    
    closestParam = 0.0
    for i in range( numSpans ):
        fnCurve.getPointAtParam( paramRate*i, point )
        toMeshPoint = point*toMeshLocalMtx
        meshIntersector.getClosestPoint( toMeshPoint, pointOnMesh )
        closePoint = om.MPoint( pointOnMesh.getPoint() )
        normal  = om.MVector( pointOnMesh.getNormal() )
        
        closePivVector = om.MVector( toMeshPoint )-om.MVector( closePoint )
        if closePivVector*normal < 0:
            closestParam = paramRate*i
        else:
            if i == 0:
                if loopCheck: return None
                cmds.reverseCurve( curve, ch=0, rpo=1 )
                cutCurve( curve, mesh, True )
    
    i = 0
    addParam = 1
    while i < 100:
        fnCurve.getPointAtParam( closestParam, point )
        toMeshPoint = point*toMeshLocalMtx
        meshIntersector.getClosestPoint( toMeshPoint, pointOnMesh )
        closePoint = om.MPoint( pointOnMesh.getPoint() )
        cuDist = closePoint.distanceTo( toMeshPoint )
        if cuDist < 0.0001: break
        
        normal  = om.MVector( pointOnMesh.getNormal() )
        
        closePivVector = om.MVector( toMeshPoint ) - om.MVector( closePoint )
        if closePivVector*normal > 0:
            addParam = math.fabs( addParam ) * -0.5
        else:
            addParam = math.fabs( addParam ) * 0.5
        
        closestParam += addParam
        i+=1
    
    fnCurve.getPointAtParam( closestParam, point )
    first, second = cmds.detachCurve( "%s.u[%f]" %( curve, closestParam ), ch=0, cos=True, rpo=0 )
    curveObj = cmds.listRelatives( curve, p=1 )[0]
    cmds.delete( first, curveObj )
    second = cmds.rename( second, curveObj )
    cmds.select( second )
    cmds.DeleteHistory()