PythonAPIとポインタ
私たちが通常使用するいくつかの方法では、渡されるパラメーターがポインターである場合があることを私たちは知っています
たとえば、上の図のresetメソッドでは、MObjectポインターが渡されます。つまり、前にMObjectを定義してから渡す必要があります。つまり、setPositionでは、パラメーターを渡すためにMPointポインターを定義する必要がありますが、MVector、 MVectorArrayなどのMayaのいくつかの基本的なデータタイプへのいくつかのポインタ
もう1つの例はgetUVメソッドです。これはfloat2へのポインターです。Pythonではfloatタイプのみがあり、float2タイプはありません。したがって、この種のfloat2ポインターを定義する必要がありますが、Mayaだけではありません。データタイプなので、MScriptUtilを使用する必要があります。
MScriptUtil
関数:一般的なツールクラス、pythonでポインタと参照を使用するために使用されます
機能:pythonAPIのほとんどのメソッドでは、ポインターパラメーターを渡す必要があり、それらはすべてこれに依存しています
Utilは一般的に一般的なユーティリティ関数であることがわかっているので、それを使用して必要なデータポインタを作成できます。次に、それを使用してポインタの値を読み取ることができます。
次に、ループしてポリゴン内のすべてのポイントのUV値を見つけます:
まず、多角形の球を作成します
pymel、OpenMayaをインポートします
イテレーターを定義する
import pymel.core as pm
import maya.OpenMaya as OpenMaya
#导入pymel、OpenMaya
iterator = OpenMaya.MItMeshVertex(pm.PyNode('pSphereShape1').__apiobject__())
#定义一个迭代器,需要传一个MObject作为参数,使用PyNode传入他的shape类型,转化为API Object
s_util = OpenMaya.MScriptUtil() # 定义一个MScriptUtil实例,每个脚本中定义一个即可
uv_ptr = s_util.asFloat2Ptr() # 定义一个UV的float2的指针,回一次往这个指针里面写入数据,改变它的值,我们在最后访问时,只能访问到它最后一个值,所以写入一次就要访问一次
while not iterator.isDone(): # 使用while循环。来一次访问他的每个元素 条件为有没有结束
print(iterator.index()) # 访问他的索引
iterator.getUV(uv_ptr) # 需要传入一个float2类型的参数,实际上包含了两个浮点数,使用MScriptUtil来创建这种实例
print(s_util.getFloat2ArrayItem(uv_ptr, 0, 0)) # 将UV值取出。将UV的指针传入,第一个元素是固定的0,不用考虑,第二个0,就是U值,1是V值
print(s_util.getFloat2ArrayItem(uv_ptr, 0, 1))
iterator.next() # 依次调用他的每一个元素
Mayaのデータポインタに対するすべての操作はMScriptUtilに配置され、必要なポインタタイプを選択してから、「as type Ptr」を追加して直接検索できます。ポインタで評価すると、それを使用できます。 MScriptUtilを選択し、getの最初にメソッドを使用して、ポインターを渡すと、次のことができます。
上の図で最も一般的に使用されているポインタは、整数、正の整数、ブール値、浮動小数点数などです。必要に応じて他のポインタを確認できます。