def drawOnUnevenSurface(tri, ground): """Plot the triangle on the polygon surface This function is depreciated, please see *plotTri* """ cmds.polyProjectCurve(ground, tri, direction=(0, 1, 0))
def motionPathRandom(): # project sel = cmds.ls(sl=1) # select poly and curve to project cmds.polyProjectCurve(sel[0], sel[1], ch=True, direction=(0, 1, 0)) # attach truck sel = cmds.ls(sl=1) # select: control attached to path and new curve moP = cmds.listConnections(sel[0], source=True, destination=False, type='motionPath')[0] cmds.select(sel[1]) shape = cmds.pickWalk(d='down')[0] cmds.connectAttr(shape + '.worldSpace[0]', moP + '.geometryPath', force=True)
def cut_curve(): """ 先选所有曲线,最后选mesh :return: """ sels = mc.ls(sl=True) mesh = sels[-1] for sel in sels[:-1]: try: cur = mc.polyProjectCurve(sel,mesh, ch=0,pointsOnEdges=1,curveSamples=50,automatic=1)[0] cur_chr = mc.listRelatives(cur,c=True)[0] mc.arclen(cur_chr,ch=True) mc.select([sel,cur]) mm.eval('cutCurvePreset(1,1,0.01,6,0,1,0,2,2)') mc.delete(cur) except: pass
def plotTri(vertex, isFlat=True, ground=None): """Plot the triangles When the ground is uneven, the triangle is plotted as a group of three line segments and projected onto the polygon surface. """ if isFlat == True: cmds.curve(d=1, p=[vertex[0], vertex[1], vertex[2], vertex[0]]) cmds.rename('triangle') return vertex else: triShape = [] triVtx = [] for indLine in range(3): lineVtx = [vertex[indLine%3], vertex[(indLine+1)%3]] line = cmds.curve(d=1, p=[lineVtx[0], lineVtx[1]]) lineProj = cmds.polyProjectCurve(ground, line, direction=(0, -1, 0)) startPoint = startOrEnd(lineProj[0], vertex[indLine]) cmds.delete(line) triShape.append(lineProj) triVtx.append(startPoint) cmds.group(triShape[0], triShape[1], triShape[2], name="triangle") return triVtx
def Projection_Curve(Center_Pos_in, Geometry, Align_to_Surface, Expand=0.1, Axis="Y", PositiveAxis=True): # if Align_to_Surface: if True: Curve_init_list = [] # print ( Center_Pos_in ) Center_Pos = Center_Pos_in if Axis == "Y": Axis_1 = 0 Axis_2 = 2 elif Axis == "X": Axis_1 = 1 Axis_2 = 2 elif Axis == "Z": Axis_1 = 0 Axis_2 = 1 Poslist_Start = [ Center_Pos[:], Center_Pos[:], Center_Pos[:], Center_Pos[:], Center_Pos[:] ] Poslist_Start[1][Axis_1] = Poslist_Start[1][Axis_1] + Expand Poslist_Start[2][Axis_1] = Poslist_Start[2][Axis_1] - Expand Poslist_Start[3][Axis_2] = Poslist_Start[3][Axis_2] + Expand Poslist_Start[4][Axis_2] = Poslist_Start[4][Axis_2] - Expand offset_endpos = 30.0 Poslist_End = [] for indpos in Poslist_Start: Poslist_End.append([ indpos[0] + offset_endpos, indpos[1] + offset_endpos, indpos[2] + offset_endpos ]) for indpos_index in range(0, 5): Curve_init_list.append( cmds.curve( p=[Poslist_Start[indpos_index], Poslist_End[indpos_index]], k=[0, 1], d=1)) # print (Poslist_Start) # print (Poslist_End) ProjectResultGRP_list = [] # ProjectResult_list = [] # print ( "=================--------------=============") # if PositiveAxis : # Pointing = -1.0 # else: # Pointing = 1.0 Pointing = 1.0 direction = (0.0, Pointing, 0.0) if Axis == "X": direction = (Pointing, 0.0, 0.0) elif Axis == "Z": direction = (0.0, 0.0, Pointing) #--------------------------------------------- try: Result_Pos_list = [] for indCurve in Curve_init_list: ProjectResultGRP = cmds.polyProjectCurve(indCurve, Geometry, direction=direction, ch=0, automatic=1, curveSamples=50, tolerance=0.001, pointsOnEdges=0)[0] ProjectResultGRP_list.append(ProjectResultGRP) ProjectResult_list = cmds.listRelatives(ProjectResultGRP, c=1) if len(ProjectResult_list) == 1: ProjectResult = ProjectResult_list[0] else: # try find the shortest curve from multiple Result ProjectResult = ProjectResult_list[0] for indProjectResult_index in range( len(ProjectResult_list)): indbb = cmds.xform( ProjectResult_list[indProjectResult_index], query=1, worldSpace=1, bb=1) indCP = [(indbb[3] - indbb[0]) / 2.0 + indbb[0], (indbb[4] - indbb[1]) / 2.0 + indbb[1], (indbb[5] - indbb[2]) / 2.0 + indbb[2]] disX = Center_Pos[0] - indCP[0] disY = Center_Pos[1] - indCP[1] disZ = Center_Pos[2] - indCP[2] distance = pow( (disX * disX + disY * disY + disZ * disZ), 1.0 / 3.0) # print ProjectResult_list[indProjectResult_index] # print distance if indProjectResult_index == 0: initdist = distance else: if distance < initdist: initdist = distance ProjectResult = ProjectResult_list[ indProjectResult_index] # addable: try to get the curve base on Axis? # print ( ProjectResult ) # print ( "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA") cmds.select(cl=1) # cmds.duplicate(ProjectResultGRP) cmds.select(ProjectResult + ".cv[:]", add=1) cv = cmds.ls(selection=True, flatten=True) # print ( cv ) cvpos = [] for indcv in cv: cvpos.append( cmds.xform(indcv, query=1, worldSpace=1, translation=1)) initpos = cvpos[0] found_orginal = "" for indcvnum in range(len(cvpos)): if Axis == "X": if cvpos[indcvnum][1] <= initpos[1] or cvpos[indcvnum][ 2] <= initpos[2]: initpos[1] = cvpos[indcvnum][1] initpos[2] = cvpos[indcvnum][2] found_orginal = cv[indcvnum] if Axis == "Y": if cvpos[indcvnum][0] <= initpos[0] or cvpos[indcvnum][ 2] <= initpos[2]: initpos[0] = cvpos[indcvnum][0] initpos[2] = cvpos[indcvnum][2] found_orginal = cv[indcvnum] if Axis == "Z": if cvpos[indcvnum][0] <= initpos[0] or cvpos[indcvnum][ 1] <= initpos[1]: initpos[0] = cvpos[indcvnum][0] initpos[1] = cvpos[indcvnum][1] found_orginal = cv[indcvnum] Result_Pos = cmds.xform(found_orginal, query=1, worldSpace=1, translation=1) Result_Pos_list.append(Result_Pos) # print (indCurve) # print (found_orginal) # print (Result_Pos) cmds.delete(ProjectResultGRP_list) cmds.delete(Curve_init_list) # print ( "Projection_Curve ------------- Success" ) # print (Result_Pos_list) # print ( "result ====================" ) return Result_Pos_list except: pass cmds.delete(Curve_init_list) try: cmds.delete(ProjectResultGRP_list) return False except: pass return False
def polyProjectCurve(*args, **kwargs): res = cmds.polyProjectCurve(*args, **kwargs) if not kwargs.get('query', kwargs.get('q', False)): res = _factories.maybeConvert(res, _general.PyNode) return res