def getLatticePoints(latticePath): selectionList = om.MSelectionList() latticeFn = oma.MFnLattice(latticePath) utilS = om.MScriptUtil() SintPtr = utilS.asUintPtr() utilT = om.MScriptUtil() TintPtr = utilT.asUintPtr() utilU = om.MScriptUtil() UintPtr = utilU.asUintPtr() latticeFn.getDivisions(SintPtr, TintPtr, UintPtr) SVal = utilS.getUint(SintPtr) TVal = utilT.getUint(TintPtr) UVal = utilU.getUint(UintPtr) for s in range(SVal): for u in range(UVal): for t in range(TVal): latticeShapeString = latticePath.fullPathName() component = getMObjectComponent('%s.pt[%i][%i][%i]' % (latticeShapeString, s, t, u)) selectionList.add(latticePath, component, False) return selectionList
def unpackLattice(self, inputHandle): self.inputObject = inputHandle.data() self.shapeUtils = OpenMayaAnim.MFnLattice(self.inputObject) self.collectFfdSettings(self.shapeUtils) pointArray = self.collectFFdPoints() self.writeArray(pointArray)
def compute_outLattice(self, Data, InputData): widthA_Val = Data.inputValue(self.widthA).asDouble() widthB_Val = Data.inputValue(self.widthB).asDouble() uDensity_Val = Data.inputValue(self.uDensity).asShort() vDensity_Val = Data.inputValue(self.vDensity).asShort() surfMFn.setObject(InputData) surfData = self.getPatchInfos(surfMFn) surfMFn.getCVs(pointList, OpenMaya.MSpace.kObject) uCv = surfData[0] vCv = surfData[1] path_knotsU = surfData[6] path_knotsV = surfData[7] startU = surfData[8] endU = surfData[9] startV = surfData[10] endV = surfData[11] uRatio = (endU - startU) / (uCv * uDensity_Val * 1.0) vRatio = (endV - startV) / (vCv * vDensity_Val * 1.0) uRange = [] vRange = [] for k in xrange(uCv * uDensity_Val + 1): uRange.append(k * uRatio) for k in xrange(vCv * vDensity_Val + 1): vRange.append(k * vRatio) widthData = [widthA_Val, widthB_Val] mat = OpenMaya.MMatrix() nurbIntersect.create(InputData, mat) ptON = OpenMaya.MPointOnNurbs() outLattice_Hndle = Data.outputValue(self.outLattice) latDat = OpenMaya.MFnLatticeData() latObj = latDat.create() lafFn = OpenMayaAnim.MFnLattice() divX = len(uRange) divY = len(vRange) divZ = 2 lafFn.create(divX, divY, divZ, latObj) resultPoint = OpenMaya.MPoint() vecList = [widthData[0] * -0.01, widthData[1] * 0.01] for i in range(divX): for j in range(divY): surfMFn.getPointAtParam(uRange[i], vRange[j], resultPoint, OpenMaya.MSpace.kObject) outV = surfMFn.normal(uRange[i], vRange[j], OpenMaya.MSpace.kObject).normal() for k in range(divZ): outPoint = lafFn.point(i, j, k) outPointB = resultPoint + (outV * vecList[k]) outPoint.x = outPointB.x outPoint.y = outPointB.y outPoint.z = outPointB.z outLattice_Hndle.setMObject(latObj) outLattice_Hndle.setClean()
def compute_outCage(self, Data): splineMatrixData = self.composeSplineMatrix(Data) radius_Val = Data.inputValue(self.radius).asDouble() if splineMatrixData == None: return else: knotCount = 8 offsetPoint = OpenMaya.MPoint(0, radius_Val, 0, 1) offsetArray = OpenMaya.MPointArray(knotCount + 1) indexTable = [[5, 4, 3], [6, 8, 2], [7, 0, 1]] shiftVal = OpenMaya.MEulerRotation(0, 0, 0, 0) shftRatio = 360.0 / (knotCount * 1.0) sidenum = int(math.sqrt(knotCount + 1)) for j in range(knotCount): shiftVal.x = math.radians(j * shftRatio) offsetArray.set(offsetPoint * shiftVal.asMatrix(), j) outCage_Hndle = Data.outputValue(self.outCage) latDat = OpenMaya.MFnLatticeData() latObj = latDat.create() lafFn = OpenMayaAnim.MFnLattice() divX = splineMatrixData.length() divY = sidenum divZ = sidenum lafFn.create(divX, divY, divZ, latObj) knotOffset_obj = Data.inputValue(self.knotOffset).data() knotChk = False knotOffsetList = None if knotOffset_obj.isNull() == False: knotOffsetFn = OpenMaya.MFnVectorArrayData(knotOffset_obj) knotOffsetList = knotOffsetFn.array() if knotOffsetList.length() > 0: knotChk = True if knotChk == False: for i in range(divX): for j in range(divY): for k in range(divZ): outPoint = lafFn.point(i, j, k) outPointB = offsetArray[indexTable[j] [k]] * splineMatrixData[i] outPoint.x = outPointB.x outPoint.y = outPointB.y outPoint.z = outPointB.z else: idx = 0 outPointB = OpenMaya.MPoint() tmpPnt = OpenMaya.MPoint() for i in range(divX): for j in range(divY): for k in range(divZ): outPoint = lafFn.point(i, j, k) idx = indexTable[j][k] if idx != 8: outPointB = (tmpPnt + knotOffsetList[idx + (i * knotCount)] ) * splineMatrixData[i] else: outPointB = offsetArray[8] * splineMatrixData[i] outPoint.x = outPointB.x outPoint.y = outPointB.y outPoint.z = outPointB.z outCage_Hndle.setMObject(latObj) outCage_Hndle.setClean()