On Thursday, January 29, 2015 at 9:11:14 AM UTC-5, Enrico Losavio wrote: > So.. thanks everyone for the replies. > > > I managed to acced the data I was looking for. It was just a bit hidden and > not-so-easy to read. > Since I haven't found a solution for this problem on the internet yet, i post > mine here. > > > Given that (as written in the blendShape node documentation) > inputGeomTarget ... stores the The target geometry input ... (type: geometry) > inputPointsTarget ... stores the Delta values for points in a target geometry > ... (type: pointArray) > inputComponentsTarget ... stores the Component list for points in a target > geometry ... (type: componentList) > > and that maya APIs dont have any convenient method to access this data, I > decided to used MPlugs to reach these attributes. > > > If the shape target object is still connected to the blend shape node, you > can simply use the MFnBlendShapeDeformer.getTargets() method > If the shape target object has been deleted or disconnected, then the > inputGeomTarget attribute will be empty, and you will have to find a way to > combine the two remaining attributes. > > > The code below retrieve this data (in this case just for the first target in > the bsNode) and prints it out. I guess that, properly combined together, this > data gives you a lot of control over what's happening inside the node, > especially when dealing with complex rigs! > > > Hope this helps! > > > ps. let me know if you have any comment or suggestion... > > > > Enrico > > > > > > > import maya.cmds as cmds > import maya.OpenMaya as OM > > > # gets the blendShape node MObject > > > bsNodeName = 'blendShape1' > bsNodeObj = OM.MObject() > sel = OM.MSelectionList() > sel.add(bsNodeName, 0) > sel.getDependNode(0, bsNodeObj) > > > # gets the plug for the inputTargetItem[] compound attribute and ... > > > dgFn = OM.MFnDependencyNode(bsNodeObj) > plug = > dgFn.findPlug('inputTarget').elementByPhysicalIndex(0).child(0).elementByPhysicalIndex(0).child(0).elementByPhysicalIndex(0) > > > # if connected, retrieves the input target object and queries his points > > > if plug.child(0).isConnected(): > inputGeomTarget = plug.child(0).asMObject() > targetPoints = OM.MPointArray() > fnMesh = OM.MFnMesh(inputGeomTarget) > fnMesh.getPoints(targetPoints) > > > # if not connected, retrieves the deltas and the affected component list > > > else: > inputPointsTarget = plug.child(1).asMObject() > inputComponentsTarget = plug.child(2).asMObject() > > # to read the offset data, I had to use a MFnPointArrayData > > fnPoints = OM.MFnPointArrayData(inputPointsTarget) > targetPoints = OM.MPointArray() > fnPoints.copyTo(targetPoints) > > # read the component list data was the trickiest part, since I had to use > MFnSingleIndexedComponent to extract (finally), an MIntArray > # with the indices of the affected vertices > > componentList = OM.MFnComponentListData(inputComponentsTarget)[0] > fnIndex = OM.MFnSingleIndexedComponent(componentList) > targetIndices = OM.MIntArray() > fnIndex.getElements(targetIndices) > > > > if targetIndices.length() == targetPoints.length(): > for i in range(targetPoints.length()): > print "vertex %d has offset " %targetIndices[i], > targetPoints[i].x,targetPoints[i].y, targetPoints[i].z
I was wondering why you are not iterating over OM.MFnComponentListData(inputComponentsTarget) but just take the first element with componentList = OM.MFnComponentListData(inputComponentsTarget)[0] For some reason in my case inputComponents is a collection of lists. -- You received this message because you are subscribed to the Google Groups "Python Programming for Autodesk Maya" group. To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_maya+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/python_inside_maya/8c64a036-639c-4fd7-8246-a5d5816648e6%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.