def initilizeStiffness(self, dataBlock): """ sets up the default stiffness params """ inCurveDataHandle = dataBlock.inputValue(self.inCurve) mCurve = inCurveDataHandle.asNurbsCurveTransformed() if not mCurve: return # stiffness mfnCrv = om.MFnNurbsCurve(mCurve) stiffnessArrayData = dataBlock.outputArrayValue(self.stiffness) stiffnessDataBuilder = om.MArrayDataBuilder(dataBlock, self.stiffness, int(mfnCrv.numCVs)) # outputs outputArrayData = dataBlock.outputArrayValue(self.output) outputDataBuilder = om.MArrayDataBuilder(dataBlock, self.output, int(mfnCrv.numCVs)) for i in xrange(mfnCrv.numCVs): stiffnessHandler = stiffnessDataBuilder.addElement(i) stiffnessHandler.setFloat(0.5) stiffnessHandler.setClean() outputHandler = outputDataBuilder.addElement(i) outputHandler.setMVector(om.MVector(0, 0, 0)) outputHandler.setClean() stiffnessArrayData.set(stiffnessDataBuilder) outputArrayData.set(outputDataBuilder) setInitMode = om.MPlug(self.thisMObject(), self.initilize) setInitMode.setShort(2)
def computeBounds(self, plug, dataBlock): handleMatrix = OpenMaya.MMatrix(dataBlock.inputValue(self.handleMatrix).asMatrix()) handleMatrixInverse = handleMatrix.inverse() projectedPoints = OpenMaya.MPointArray() matrices = dataBlock.inputArrayValue(self.childHandleMatrix) while not matrices.isDone(): dataHandle = matrices.inputValue() idx = matrices.elementLogicalIndex() matrixPlug = OpenMaya.MPlug(plug.node(), self.childHandleMatrix).elementByLogicalIndex(idx) if matrixPlug.isConnected: childMatrix = OpenMaya.MMatrix(dataHandle.asMatrix()) local = childMatrix * handleMatrixInverse pt = OpenMaya.MTransformationMatrix(local).translation(OpenMaya.MSpace.kPostTransform) projectedPoints.append(pt) matrices.next() outputArray = dataBlock.outputArrayValue(self.childPosition) builder = OpenMaya.MArrayDataBuilder(dataBlock, self.childPosition, len(projectedPoints)) for i, pt in enumerate(projectedPoints): handle = builder.addElement(i) handle.set3Double(pt.x, pt.y, pt.z) outputArray.set(builder) dataBlock.setClean(self.childPosition) # Compute Bounding box based on child positions radius = 1 bounds = OpenMaya.MBoundingBox( OpenMaya.MPoint(-radius, -radius, -radius), OpenMaya.MPoint(radius, radius, radius), ) for pt in projectedPoints: bounds.expand(pt) lowerHandle = dataBlock.outputValue(self.boundingBoxCorner1) upperHandle = dataBlock.outputValue(self.boundingBoxCorner2) minPt = bounds.min maxPt = bounds.max lowerHandle.set3Double(minPt.x, minPt.y, minPt.z) upperHandle.set3Double(maxPt.x, maxPt.y, maxPt.z) lowerHandle.setClean() upperHandle.setClean()