So, there really was something wrong with the intersection line, (I
did have Echo All and Stack Trace, and Line numbers visible, I only
posted the information that seemed pertinent). I never did figured
out what it was, so I just gave up and went to
MFnMesh.closestIntersection, because I know how to make that work, and
I'll get the same information back. Now, the whole thing seems to be
running great until the very very very end, where I try to "set" the
outMesh just like in qWrap, but it poops... Here's the entire
compute:
def compute( self, plug, data ):
if ( plug != qWrapNode.aOutShape ):
return om.kUnknownParameter
sourceMesh = data.inputValue( qWrapNode.aSourceShape )\
.asMesh()
sourceFnMesh = om.MFnMesh( sourceMesh )
maxParam = data.inputValue ( qWrapNode.aMaxDistance )
maxDist = maxParam.asFloat()
sources = om.MPointArray() # where to shoot rays from
outPoints = om.MPointArray() # where they hit
directions = om.MFloatVectorArray() # direction to shoot rays
sourceFnMesh.getPoints( sources, om.MSpace.kWorld )
sourceFnMesh.getPoints( outPoints, om.MSpace.kWorld )
sourceFnMesh.getNormals( directions, om.MSpace.kWorld )
# create distances table - assign negative distance
distances = om.MDoubleArray()
distances.setLength( directions.length() )
distances = [ -1 for i in range( 0, directions.length() ) ]
targetsArrayHandle = data.inputArrayValue( qWrapNode.aTargetShapes )
for i in range( 0, targetsArrayHandle.elementCount() ):
targetsArrayHandle.jumpToElement( i )
targetMesh = om.MObject( targetsArrayHandle.inputValue()\
.asMesh() )
#targetMesh = targetsArrayHandle.inputValue().asMesh()
targetFnMesh = om.MFnMesh( targetMesh )
intersections = om.MPointArray()
for j in range( 0, directions.length() ):
raySource = om.MFloatPoint( sources[ j ][0],
sources[ j ][1],
sources[ j ][2] )
rayDirection = om.MFloatVector( directions[ j ][0],
directions[ j ][1],
directions[ j ][2] )
hitPoint = om.MFloatPoint()
gotHit = targetFnMesh.closestIntersection(
raySource, rayDirection,
None, None, False,
om.MSpace.kWorld, maxDist,
False, None,
hitPoint,
None, None, None, None, None )
if gotHit:
delly = om.MVector( sources[ j ] - hitPoint )
distance = delly.length().asFloat()
if ( ( distance < distances[ j ] )
or ( distances[ j ] == -1 ) ):
distances[ j ] = distance
outPoints[ j ] = hitPoint
# modify points by "amount" and "maxDistance"
maxDistance = data.inputValue( \
qWrapNode.aMaxDistance )\
.asDouble()
amount = data.inputValue( qWrapNode.aAmount ).asDouble()
for i in range( 0, outPoints.length() ):
delly = om.MVector( sources[ i ] - outPoints[ i ] )
distance = delly.length()
distMix = 1
if ( distance != 0 ):
distMix = min( 1, max( 0, maxDistance / distance ) )
outPoints[ i ] = sources [ i ] \
+ ( outPoints[ i ] - sources[ i ] ) \
* distMix * amount
# create output
outFnMeshData = om.MFnMeshData()
outMeshData = outFnMeshData.create()
outFnMesh = om.MFnMesh()
outFnMesh.copy( sourceMesh, outMeshData )
outFnMesh.setPoints( outPoints )
# store it
data.outputValue( qWrapNode.aOutShape ).set( outMeshData )
data.setClean( qWrapNode.aOutShape )
When I run that, I get this:
# Traceback (most recent call last):
# File "C:/Documents and Settings/Jason Osipa/My Documents/
Production/osipaEntertainment/omen/pyScratch/qWrapNode.py", line 116,
in compute
# data.outputValue( qWrapNode.aOutShape ).set( outMeshData )
# File "C:\engserv\rbuild\194\build\wrk\optim\runTime\Python\Lib
\site-packages\maya\OpenMaya.py", line 8308, in <lambda>
# File "C:\engserv\rbuild\194\build\wrk\optim\runTime\Python\Lib
\site-packages\maya\OpenMaya.py", line 34, in _swig_getattr
# AttributeError: set //
Help? I can't seem to find an example of or documentation on
"setting" mesh data anywhere.
--~--~---------~--~----~------------~-------~--~----~
Yours,
Maya-Python Club Team.
-~----------~----~----~----~------~----~------~--~---