[maya]maya_usd で選択したstageのLayerにPrimXformを追加する、同じ名前がある場合は別の名前で追加

Add a prim to the layer of the stage selected with maya_usd. It has the same name but is added with a different name.

print("add_primxform_for_stage_layer")

import maya.cmds as cmds
from maya import cmds
import mayaUsd.ufe
from pxr import Usd, UsdGeom

def get_stage(stagePath):
    import mayaUsd.ufe
    stage = mayaUsd.ufe.getStage(stagePath)
    print("stage= "+str(stage))
    # レイヤーを取得
    layer = stage.GetRootLayer()
    print("layer= "+str(layer))
    return stage


    
def get_selected_maya_usd_stage():
    selectedlist=cmds.ls(sl=True,long=1)
    print("selectedlist= "+str(selectedlist))
    selectedZero=selectedlist[0]
    selectedZeroType=cmds.objectType( selectedZero )
    print("selectedZeroType= "+str(selectedZeroType))
    usd_stage=""
    stagePath=""
    if(str(selectedZeroType)=="mayaUsdProxyShape"):
        layerPath=selectedZero
        usd_stage=get_stage(layerPath)
    elif(str(selectedZeroType)=="transform"):
        layerPath="|stage"+stageNumStr+"|stageShape"+stageNumStr
        cmds.select(layerPath)
        usd_stage=get_stage(layerPath)
    else:
        print("not stage!!!!")
    return usd_stage,layerPath

def Exist_Prim(prim_path):
    from maya import cmds
    from mayaUsd import ufe, lib
    from pxr import Sdf
    # Primが存在するかどうかを確認
    #primPath = Sdf.Path('/path/to/your/prim')
    primPath = Sdf.Path(prim_path)
    primExist = stage.GetPrimAtPath(primPath)
    if primExist:
        print('Primが存在します')
    else:
        print('Primが存在しません')
    return primExist

def usd_increment_name(name,existing_names):
    new_name = name
    i = 1
    # in演算子 new_name が existing_names に存在する場合はTrueを、そうでない場合はFalseを返します。
    while new_name in existing_names:
        new_name = name+str(i)
        print("存在します。"+str(new_name))
        i += 1
       
    else:
        print("while out")
    return new_name  

print("----start-----")
def add_prim_xform_for_stage_layer():

    stage,layerPath = get_selected_maya_usd_stage()
    
    # レイヤーを取得
    layer = stage.GetRootLayer()
    print("layer= "+str(layer))
    
    # Primを作成
    prim_count=1
    prim_path = "/Xform"+str(prim_count)
    newPrimStagePath=layerPath+","+prim_path
    print("newPrimStagePath= "+newPrimStagePath)

    Exist_Prim(newPrimStagePath)

    # レイヤー内のすべてのPrimを取得
    all_prims = stage.Traverse()
    print("all_prims= "+str(all_prims))
    # Primのリストを出力
    
    all_primName_list=[]
    for prim in all_prims:
        print(prim.GetPath())
        all_primName_list.append(str(prim.GetPath()))
    print("all_primName_list= "+str(all_primName_list))
    
    
    newPrim_path=usd_increment_name("/Xform",all_primName_list)
    print("newPrim_path= "+newPrim_path)
    
    # Primを作成
    prim = UsdGeom.Xform.Define(stage, newPrim_path)
    
    # レイヤーにPrimを追加
    #layer.GetPrimAtPath(newPrim_path)
    
    print("Primが追加されました:", prim.GetPath())


add_prim_xform_for_stage_layer()

[maya] maya_usdのAPIで 「mel mayaUsdCreateStageWithNewLayer」で作ったsceneの中のレイヤーをpythonで取得するには?

How to get the layer in the scene created with “mel mayaUsdCreateStageWithNewLayer” using python with maya_usd API?



# maya_usdのAPIで 「mayaUsdCreateStageWithNewLayer」で作ったsceneの中のレイヤーを取得するには?
print("--------------------get_layers_in_scene -----------------------")

# トップノードだけを検索、意外と使う。
TopNode_01_list=cmds.ls(assemblies=1)
print("TopNode_01_list= "+str(TopNode_01_list))

# mewl で mayaUsdCreateStageWithNewLayer を呼ぶ。
import maya.mel as mel
mel.eval("$StageWithNewLayer=`mayaUsdCreateStageWithNewLayer`")


# トップノードだけを検索、意外と使う。
TopNode_02_list=cmds.ls(assemblies=1)
print("TopNode_02_list= "+str(TopNode_02_list))
# 差分を比較
TopNode_02_set = set(TopNode_02_list)
TopNode_01_set = set(TopNode_01_list)
print("TopNode_01_set= "+str(TopNode_01_set))
print("TopNode_02_set= "+str(TopNode_02_set))

TopNode_diff_set = TopNode_02_set - TopNode_01_set
print("TopNode_diff_set= "+str(TopNode_diff_set))
TopNode_diff_list = list(TopNode_diff_set)
print("TopNode_diff_list= "+str(TopNode_diff_list))
TopNode_new_diff_str=TopNode_diff_list[0]
print("TopNode_new_diff_str= "+str(TopNode_new_diff_str))
# stage1の番号抽出
stageNumStr=TopNode_new_diff_str[5:]
print("stageNumStr="+stageNumStr)
#-------------------------------------------------------

import mayaUsd.ufe
stagePath="|stage"+stageNumStr+"|stageShape"+stageNumStr
#stagePath="|stage1|stageShape1"
#stage = mayaUsd.ufe.getStage("|stage1|stageShape1")
stage = mayaUsd.ufe.getStage(stagePath)
print("stage= "+str(stage))
# レイヤーを取得
layer = stage.GetRootLayer()
print("layer= "+str(layer))

Output

--------------------get_layers_in_scene -----------------------
TopNode_01_list= ['persp', 'top', 'front', 'side']
TopNode_02_list= ['persp', 'top', 'front', 'side', 'stage1']
TopNode_01_set= {'front', 'side', 'persp', 'top'}
TopNode_02_set= {'persp', 'stage1', 'top', 'front', 'side'}
TopNode_diff_set= {'stage1'}
TopNode_diff_list= ['stage1']
TopNode_new_diff_str= stage1
stageNumStr=1
stage= Usd.Stage.Open(rootLayer=Sdf.Find('anon:000002B5C8D87560:anonymousLayer1'), sessionLayer=Sdf.Find('anon:000002B5C8D87160:anonymousLayer1-session.usda'), pathResolverContext=Ar.DefaultResolverContext())
layer= Sdf.Find('anon:000002B5C8D87560:anonymousLayer1')

maya-usd の github Version 0.25.0 をCMakeビルドしてみたい。という勉強。

まずビルドに必要なページはこれだ

https://github.com/Autodesk/maya-usd/blob/dev/doc/build.md

ビルド

コードの取得と構築

プロジェクトをビルドする最も簡単な方法は、提供されているbuild.pyスクリプトを実行することです。このスクリプトはプロジェクトをビルドし、必要なライブラリとプラグインをすべてインストールします。スクリプトの使用方法については、以下の手順に従ってください。

1. ツールとシステムの前提条件

プロジェクトをビルドする前に、次の表を参照して、コンパイラ、オペレーティング システム、cmake などの推奨バージョンを使用していることを確認してください。

必須WindowsMacLinax
オペレーティング·システムWindows 10/11ハイシエラ (10.13)
モハーベ (10.14)
カタリナ (10.15)
ビッグサー (11.2.x)
モントレー (12.6)
CentOS 7/8
RHEL 8.6
Rocky 8.6
コンパイラの要件Maya 2022 (VS 2017/2019)
Maya 2023 (VS 2019)
Maya 2024 (VS 2022)
Maya 2022 (Xcode 10.2.1)
Maya 2023 (Xcode 10.2.1)
Maya 2024 (Xcode 13.4)
Maya 2022 (gcc 6.3.1/9.3.1)
Maya 2023 (gcc 9.3.1)
Maya 2024 (gcc 11.2.1)
CMake バージョン (最小/最大)3.13 – 3.173.13 – 3.173.13 – 3.17
パイソン2.7.15 または 3.7.7 または 3.9.72.7.15 または 3.7.7 または 3.9.72.7.15 または 3.7.7 または 3.9.7
Python パッケージPyYAML、PySide、PyOpenGL、Jinja2PyYAML、PySide2、PyOpenGL、Jinja2PyYAML、PySide、PyOpenGL、Jinja2
ビルドジェネレーターVisual Studio、Ninja (推奨)XCode、Ninja (推奨)忍者(推奨)
コマンドプロセッサVisual Studio X64 {2017/2019/2022} コマンド プロンプトバッシュバッシュ
サポートされている Maya バージョン2022年、2023年、2024年2022年、2023年、2024年2022年、2023年、2024年

visual StudioのCMakeはインストールされているようだ。

https://learn.microsoft.com/en-us/cpp/build/cmake-projects-in-visual-studio?view=msvc-170

ところがNinjyaが推奨なので

CMake 3.17.0には、新しいNinjaスクリプトジェネレーター、拡張機能などが付属しています。

https://cmake.org/cmake/help/v3.17/generator/Ninja%20Multi-Config.html#generator:Ninja%20Multi-Config

https://github.com/Kitware/CMake/releases?page=14

https://github.com/Kitware/CMake/releases/download/v3.17.0/cmake-3.17.0-win64-x64.msi

C:\Program Files\CMake\

https://github.com/Kitware/CMake/releases/download/v3.17.0/cmake-3.17.0-win64-x64.zip

をダウンロードする。環境変数はこうだが

E:\ViewOf_maya_usd\cmake-3.17.0-win64-x64\cmake-3.17.0-win64-x64\bin

Python 2.7.15

https://www.python.org/ftp/python/2.7.15/python-2.7.15.amd64.msi

C:\Python27
でパスを通した。

Pythonは3.7.7

https://www.python.org/ftp/python/3.7.7/python-3.7.7-embed-amd64.zip

でパスを通した。

オプションWindowsMacLinax
QtMaya 2022 = 5.15.2
Maya 2023
= 5.15.2 Maya 2024 = 5.15.2
Maya 2022 = 5.15.2
Maya 2023
= 5.15.2 Maya 2024 = 5.15.2
Maya 2022 = 5.15.2
Maya 2023
= 5.15.2 Maya 2024 = 5.15.2

注:さまざまなプラットフォームでの追加のコンパイラ要件については、オンラインの Maya 開発者ヘルプ ドキュメントの「ビルド環境のセットアップ」にアクセスしてください。

2. Pixar USD をダウンロードして構築する

USD の構築方法については、Pixar の公式 github ページ ( https://github.com/PixarAnimationStudios/USD ) を参照してください。Pixar は、Github リポジトリおよび で Maya USD ライブラリ/プラグインを構築するためのサポートを削除しましたbuild_usd.pyPixar USDMaya-usd プロジェクトをビルドするときは、以下の表の推奨コミット ID またはタグを使用することが重要です。

PIXERMaya で使用される USD バージョン
コミットID/タグリリース: v21.11またはv22.05bまたはv22.08またはv22.11
またはv23.02またはv23.08
開発: 10b6243 (タグ v23.08)
Maya 2022 = v21.11
Maya 2023 =v21.11
Maya 2024 = v22.11

Maya 2023 =v21.11 なので

https://github.com/PixarAnimationStudios/OpenUSD/archive/refs/tags/v21.11.zip

Pixar USD の構築に関する追加情報については、以下の「追加の構築手順」セクションを参照してください。

注:PATH環境に古い USD の場所がないことを確認してくださいPYTHONPATH。正しい USD の場所を指すようにプロジェクト内で自動的に調整されますPATHPYTHONPATH見るcmake/usd.cmake

3. ユニバーサルフロントエンド (UFE)

ユニバーサル フロント エンド (UFE) は、Maya が複数のデータ モデルのデータを参照および編集できるようにする DCC に依存しないコンポーネントです。これにより、Maya は USD などのパイプライン データを編集できるようになります。UFE は、Maya 2019 以降に組み込みコンポーネントとしてインストールされます。UFE は別個のバイナリ コンポーネントとして開発されるため、Maya とは別にバージョン管理されます。

ユーフェバージョンマヤバージョンUfe ドキュメント (社外)
v1.0.0マヤ 2019.x
v1.0.0マヤ 2020.x
v2.0.0
v2.0.3
v2.1.0
Maya 2022
Maya 2022.1/2022.2/2022.3
Maya 2022.4
https://help.autodesk.com/view/MAYAUL/2022/ENU/?guid=Maya_SDK_ufe_ref_index_html
v3.0.0
v3.2.0
v3.3.0
Maya 2023/2023.1
Maya 2023.2
Maya 2023.3
https://help.autodesk.com/view/MAYAUL/2023/ENU/?guid=MAYA_API_REF_ufe_ref_index_html
v4.0.0
v4.1.0
Maya 2024
Maya 2024.1
https://help.autodesk.com/view/MAYAUL/2024/ENU/?guid=MAYA_API_REF_ufe_ref_index_html
v0.5.xマヤ広報

UFE サポートを使用してプロジェクトをビルドするには、 Maya Devkitに含まれるヘッダーとライブラリを使用する必要があります。

https://www.autodesk.com/developer-network/platform-technologies/maya

注: UFE は Maya 2019 以降でのみサポートされています。

https://qiita.com/aizwellenstan/items/31a6e62aaad7fd234c34

によると こうだが

set PACKAGE_PATH=C:\Autodesk_Maya_2023_3_Update_DEVKIT_Windows\devkitBase

set VS_VERSION=2022
set CMAKE_PATH=C:\Program Files\Microsoft Visual Studio\%VS_VERSION%\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin

setx PATH "%PACKAGE_PATH%;%CMAKE_PATH%;%PATH%" /M

gitがないって言われたので64-bit Git for Windows Portable.

https://github.com/git-for-windows/git/releases/download/v2.43.0.windows.1/PortableGit-2.43.0-64-bit.7z.exe <<自動解凍式

set gitDir=E:\ViewOf_maya_usd\PortableGit\bin

にパスを通した。

今回はこうだった install_devkit_setenv.bat

set PACKAGE_PATH=E:\ViewOf_maya_usd\Autodesk_Maya_2023_3_Update_DEVKIT_Windows\devkitBase

set VS_VERSION=2022
::set CMAKE_PATH=C:\Program Files\Microsoft Visual Studio\%VS_VERSION%\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin
set CMAKE_PATH=C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin

::set MAYA_EXECUTABLE=C:\Program Files\Autodesk\Maya2023\bin\maya.exe
set MAYA_EXECUTABLE=C:\Program Files\Autodesk\Maya2023\bin\mayabatch.exe
set MAYA_PY_EXECUTABLE=C:\Program Files\Autodesk\Maya2023\bin\mayapy.exe
set MayaBinDir=C:\Program Files\Autodesk\Maya2023\bin
set pythonDir=E:\ViewOf_maya_usd\python-3.7.7-embed-amd64
set gitDir=E:\ViewOf_maya_usd\PortableGit\bin
set CMakeDir=E:\ViewOf_maya_usd\cmake-3.17.0-win64-x64\cmake-3.17.0-win64-x64\bin
set MAYA_DEVKIT_INC_DIR=E:\ViewOf_maya_usd\Autodesk_Maya_2023_3_Update_DEVKIT_Windows\devkitBase\devkit\Alembic\include
set MAYA_IMFbase_LIBRARY=E:\ViewOf_maya_usd\Autodesk_Maya_2023_3_Update_DEVKIT_Windows\devkitBase\lib\adskIMF.lib
set OpenUSD_Dir=E:\ViewOf_maya_usd\OpenUSD-21.11\OpenUSD-21.11
::setx PATH "%PACKAGE_PATH%;%CMAKE_PATH%;%PATH%" /M
setx PATH "%PACKAGE_PATH%;%CMAKE_PATH%;%MAYA_EXECUTABLE%;%MAYA_PY_EXECUTABLE%;%MayaBinDir%;%python27Dir%;%python37Dir%;%gitDir%;%CMakeDir%;%MAYA_DEVKIT_INC_DIR%;%MAYA_IMFbase_LIBRARY%;%OpenUSD_Dir%;%PATH%" /M



でこの install_devkit_setenv.bat を管理者として実行した。

現時点でのログはこうだ。

1> CMake generation started for default configuration: 'x64-Debug'.
1> Command line: "C:\WINDOWS\system32\cmd.exe" /c "%SYSTEMROOT%\System32\chcp.com 65001 >NUL && "c:\program files\microsoft visual studio\2022\professional\common7\ide\commonextensions\microsoft\cmake\CMake\bin\cmake.exe"  -G "Ninja"  -DCMAKE_BUILD_TYPE:STRING="Debug" -DCMAKE_INSTALL_PREFIX:PATH="E:\ViewOf_maya_usd\VS2019_Rep\maya_usd\out\install\x64-Debug" -DCMAKE_C_COMPILER:FILEPATH="C:/Program Files/Microsoft Visual Studio/2022/Professional/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe" -DCMAKE_CXX_COMPILER:FILEPATH="C:/Program Files/Microsoft Visual Studio/2022/Professional/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe"   -DCMAKE_MAKE_PROGRAM="c:\program files\microsoft visual studio\2022\professional\common7\ide\commonextensions\microsoft\cmake\Ninja\ninja.exe" "E:\ViewOf_maya_usd\VS2019_Rep\maya_usd" 2>&1"
1> Working directory: E:\ViewOf_maya_usd\VS2019_Rep\maya_usd\out\build\x64-Debug
1> [CMake] -- Using Maya Light API Version 3
1> [CMake] -- Maya has setDefaultMaterialHandling API
1> [CMake] -- Maya has new point snapping API
1> [CMake] -- Maya has getCurrentUfeCameraPath
1> [CMake] -- Maya has isInCrashHandler API
1> [CMake] -- Maya has setUfeIdentifiers API
1> [CMake] -- Maya has updateUfeIdentifiers API
1> [CMake] -- Maya has getDisplayStyleOfAllViewports API
1> [CMake] -- Maya array iterator has difference_type trait
1> [CMake] -- MFnSet has getMemberPaths function
1> [CMake] -- MFnDisplayLayer exists
1> [CMake] -- MDisplayLayerMessage has MDisplayLayerMemberChangedFunction
1> [CMake] -- MRenderItem has HideOnPlayback API
1> [CMake] -- Maya has UFE gizmo drawing
1> [CMake] -- Found Python: C:/Python27/python.exe (found suitable exact version "2.7.15") found components: Interpreter 
1> [CMake] -- _PYTHON_VERSION_LIST: 2.7.15.final.0
1> [CMake] -- PYTHON_PREFIX: C:\Python27
1> [CMake] -- PYTHON_INCLUDE_DIR: C:\Python27\include
1> [CMake] -- PYTHON_SITE_PACKAGES: C:\Python27\Lib\site-packages
1> [CMake] -- PYTHON_MODULE_EXTENSION: .pyd
1> [CMake] -- PYTHON_IS_DEBUG: 0
1> [CMake] -- PYTHON_SIZEOF_VOID_P: 8
1> [CMake] -- PYTHON_LIBRARY_SUFFIX: 27
1> [CMake] -- PYTHON_MULTIARCH: 
1> [CMake] -- PYTHON_LIBDIR: C://lib
1> [CMake] -- Found PythonLibs: C:/Python27/libs/Python27.lib
1> [CMake] -- Build MayaUSD with Python3 = OFF
1> [CMake] --    PYTHON_INCLUDE_DIRS = C:/Python27/include
1> [CMake] --    PYTHON_LIBRARIES    = C:/Python27/libs/Python27.lib
1> [CMake] --    Python_EXECUTABLE   = C:/Python27/python.exe
1> [CMake] CMake Error at cmake/jinja.cmake:27 (message):
1> [CMake]   MARKUPSAFE_LOCATION not set
1> [CMake] Call Stack (most recent call first):
1> [CMake]   cmake/jinja.cmake:55 (init_markupsafe)
1> [CMake]   CMakeLists.txt:118 (include)
1> [CMake] -- Configuring incomplete, errors occurred!
1> 'C:\WINDOWS\system32\cmd.exe' 
'/c "%SYSTEMROOT%\System32\chcp.com 65001 >NUL && 
"c:\program files\microsoft visual studio\2022\professional\common7\ide\commonextensions\microsoft\cmake\CMake\bin\cmake.exe"  
-G "Ninja"  -DCMAKE_BUILD_TYPE:STRING="Debug" 
-DCMAKE_INSTALL_PREFIX:PATH="E:\ViewOf_maya_usd\VS2019_Rep\maya_usd\out\install\x64-Debug" 
-DCMAKE_C_COMPILER:FILEPATH="C:/Program Files/Microsoft Visual Studio/2022/Professional/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe" 
-DCMAKE_CXX_COMPILER:FILEPATH="C:/Program Files/Microsoft Visual Studio/2022/Professional/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe"   
-DCMAKE_MAKE_PROGRAM="c:\program files\microsoft visual studio\2022\professional\common7\ide\commonextensions\microsoft\cmake\Ninja\ninja.exe" 
"E:\ViewOf_maya_usd\VS2019_Rep\maya_usd" 2>&1"' execution failed with error: 
''C:\WINDOWS\system32\cmd.exe' 
'/c "%SYSTEMROOT%\System32\chcp.com 65001 >NUL && 
"c:\program files\microsoft visual studio\2022\professional\common7\ide\commonextensions\microsoft\cmake\CMake\bin\cmake.exe"  
-G "Ninja"  -DCMAKE_BUILD_TYPE:STRING="Debug" -DCMAKE_INSTALL_PREFIX:PATH="E:\ViewOf_maya_usd\VS2019_Rep\maya_usd\out\install\x64-Debug" 
-DCMAKE_C_COMPILER:FILEPATH="C:/Program Files/Microsoft Visual Studio/2022/Professional/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe" 
-DCMAKE_CXX_COMPILER:FILEPATH="C:/Program Files/Microsoft Visual Studio/2022/Professional/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe"   
-DCMAKE_MAKE_PROGRAM="c:\program files\microsoft visual studio\2022\professional\common7\ide\commonextensions\microsoft\cmake\Ninja\ninja.exe" 
"E:\ViewOf_maya_usd\VS2019_Rep\maya_usd" 2>&1"' returned with exit code: 1'.

でいいみたい

Mayaのパスは実行時に渡すみたい

E:\ViewOf_maya_usd\VS2019_Rep\maya_usd\build_mybat.bat で実行

python build.py --maya-location "C:\Program Files\Autodesk\Maya2023" --pxrusd-location E:\ViewOf_maya_usd\OpenUSD-23.08\OpenUSD-23.08 --devkit-location E:\ViewOf_maya_usd\Autodesk_Maya_2023_3_Update_DEVKIT_Windows\devkitBase E:\ViewOf_maya_usd\workspace

cmd /k
E:\ViewOf_maya_usd\VS2019_Rep\maya_usd> .\build_mybat.bat

こうでもなかった

Ninja推奨なので

cmake-gui.exeでやる。

でもこんなエラー MARKUPSAFE_LOCATION not set

Build MayaUSD with Python3 = OFF
   PYTHON_INCLUDE_DIRS = C:/Python27/include
   PYTHON_LIBRARIES    = C:/Python27/libs/Python27.lib
   Python_EXECUTABLE   = C:/Python27/python.exe
CMake Error at cmake/jinja.cmake:27 (message):
  MARKUPSAFE_LOCATION not set
Call Stack (most recent call first):
  cmake/jinja.cmake:55 (init_markupsafe)
  CMakeLists.txt:118 (include)

だからこう  参考>>https://github.com/Autodesk/maya-usd/issues/733

PS  C:\Python27> python -m pip install MarkupSafe
PS C:\Python27> python -m pip install jinja2 MarkupSafe
PS C:\Python27> python -m pip install jinja MarkupSafe

次のエラーは

USD_CONFIG_FILENOTFOUND

CMake Error at cmake/modules/FindUSD.cmake:49 (include):
  include could not find load file:

    USD_CONFIG_FILE-NOTFOUND
Call Stack (most recent call first):
  CMakeLists.txt:121 (find_package)


CMake Error at cmake/modules/FindUSD.cmake:52 (message):
  Expected PXR_VERSION defined in pxrConfig.cmake
Call Stack (most recent call first):
  CMakeLists.txt:121 (find_package)

E:\ViewOf_maya_usd\VS2019_Rep\maya_usd\plugin\pxr に

E:\ViewOf_maya_usd\OpenUSD-21.11\OpenUSD-21.11\pxr を 上書き

したらエラー変わった。

CMake Error at plugin/pxr/pxrConfig.cmake:19 (include):
  include could not find load file:

    E:/ViewOf_maya_usd/VS2019_Rep/maya_usd/plugin/pxr/cmake/pxrTargets.cmake
Call Stack (most recent call first):
  cmake/modules/FindUSD.cmake:49 (include)
  CMakeLists.txt:121 (find_package)


CMake Error at plugin/pxr/pxrConfig.cmake:25 (get_target_property):
  get_target_property() called with non-existent target "@PXR_ALL_LIBS@".
Call Stack (most recent call first):
  cmake/modules/FindUSD.cmake:49 (include)
  CMakeLists.txt:121 (find_package)


CMake Error at C:/Program Files/CMake/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:164 (message):
  Could NOT find USD: Found unsuitable version
  "@PXR_MAJOR_VERSION@.@PXR_MINOR_VERSION@.@PXR_PATCH_VERSION@", but required
  is at least "0.21.11" (found
  E:/ViewOf_maya_usd/VS2019_Rep/maya_usd/plugin/pxr)
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:443 (_FPHSA_FAILURE_MESSAGE)
  cmake/modules/FindUSD.cmake:148 (find_package_handle_standard_args)
  CMakeLists.txt:121 (find_package)

2023年から2024年になった。

依存関係が多すぎる事に足を突っ込んだ事に気が付いたので。止めようと思う。

https://github.com/PixarAnimationStudios/OpenUSD/issues/530

いや、そのコミットは実際にはビルドを完全に破壊します。偶然押し込まれたのです。
先ほども述べたように、pxr ビルド システムは非常に複雑であり、それを 1 つの小さな変更で修正する試みでした。うまくいきませんでした。

うまくいかないが、以下まんま本文続き

リポジトリのレイアウト
位置説明
ライブラリ他のすべてのプラグインが依存するライブラリ。一般的なユーティリティと機能が含まれます。
プラグイン/adskAutodesk Maya プラグイン
プラグイン/pxrPixar Maya プラグイン
プラグイン/アルAnimal Logic Maya プラグイン

5. build.py スクリプトの使用方法

引数

スクリプトに渡す必要がある引数は 4 つあります。

フラグ説明
–マヤの場所Maya がインストールされているディレクトリ。
–pxrusd-場所Pixar USD Core がインストールされているディレクトリ。
–devkit-場所Maya 開発キットがインストールされているディレクトリ。
ワークスペースの場所プロジェクトがプラグイン/ライブラリをビルドおよびインストールするためのワークスペースとして使用するディレクトリ
デフォルトのビルド引数
フラグ説明
–マテリアルxMaterialX 機能を有効にしてビルドする
オプションのビルド引数
フラグ説明
–build-argscmake 変数のカンマ区切りリストをビルド システムに渡すこともできます。
–no-materialxMayaUSD でマテリアル X サポートを構築しないでください。
--build-args="-DBUILD_ADSK_PLUGIN=ON,-DBUILD_PXR_PLUGIN=OFF,-DBUILD_TESTS=OFF"
CMake オプション
名前説明デフォルト
BUILD_MAYAUSD_LIBRARYコア USD ライブラリを構築します。の上
BUILD_ADSK_PLUGINAutodesk USD プラグインを構築します。の上
BUILD_PXR_PLUGINPixar USD プラグインとライブラリを構築します。の上
ビルド_AL_プラグインAnimal Logic USD プラグインとライブラリを構築します。の上
BUILD_HDMAYA従来の Maya-To-Hydra プラグインとシーン デリゲートを構築します。オフ
BUILD_RFM_TRANSLATORSRenderMan for Maya シェーダのトランスレータを構築します。の上
ビルド_テストすべての単体テストをビルドします。の上
ビルド_ストリクト_モードすべての警告をエラーとして強制します。の上
BUILD_WITH_PYTHON_3Python3でビルドします。オフ
BUILD_SHARED_LIBSライブラリを共有または静的としてビルドします。の上
ビルド_UB2ユニバーサル バイナリ 2 (UB2) Intel64+arm64 をビルド (Apple のみ)オフ
CMAKE_WANT_MATERIALX_BUILDMaterialX を使用した構築を有効にします (実験的)。オフ
ステージ
フラグ説明
–段階ステージのカンマ区切りリストをビルド システムに渡すこともできます。この引数が設定されていない場合、デフォルトでは「クリーン、構成、ビルド、インストール」ステージが実行されます。
オプション説明
クリーンクリーンビルド
構成、設定cmake ファイルが変更されるたびにこのステージを呼び出します
建てるプロジェクトをビルドします
インストール必要なプラグインとライブラリをすべてインストールします
テストすべての (PXR、AL、UFE) 単体テストを実行します
パッケージすべてのインストール ファイルをパッケージ ディレクトリ内の zip ファイルとしてバンドルします。
Examples:
--stages=configure,build,install
--stages=test

注:すべてのフラグの後に、spaceまたは=

CMakeジェネレーター

CMake Generator を選択するのはユーザー次第ですが、Ninja ジェネレーターの使用をお勧めします。Ninja Generator を使用するには、まずhttps://ninja-build.org/から Ninja バイナリをインストールする必要があります。

次に、ジェネレーターをダウンロードした Ninja バイナリに設定しNinjaCMAKE_MAKE_PROGRAM変数を Ninja バイナリに設定する必要があります。

python build.py --generator Ninja --build-args=-DCMAKE_MAKE_PROGRAM='path to ninja binary'
ビルドとインストールの場所

デフォルトでは、ビルド ディレクトリとインストール ディレクトリはワークスペースディレクトリ内に作成されます。--build-locationただし、およびフラグを設定することで、これらの場所を変更できます--install-location

ビルドログ

デフォルトでは、ビルド ログはbuild_log.txtビルド ディレクトリ内に書き込まれます。代わりに出力ストリームをコンソールにリダイレクトしたい場合は、--redirect-outstream-fileこれを渡して false に設定します。

追加のフラグとオプション

パラメーターを指定してスクリプトを実行すると、--help考えられるすべてのフラグと短い説明が表示されます。

6. 単体テストの実行方法

単体テストは、設定するか、ビルド ディレクトリから直接--stages=test呼び出すことで実行できます。ctest

たとえば、コマンドラインからすべての Animal Logic のテストを実行するには、 に移動してbuild/<variant>/plugin/alを呼び出しますctest

➜  ctest -j 8
Test project /Users/sabrih/Desktop/workspace/build/Debug/plugin/al
    Start 4: AL_USDMayaTestPlugin
    Start 5: TestUSDMayaPython
    Start 8: TestPxrUsdTranslators
    Start 7: TestAdditionalTranslators
    Start 1: AL_MayaUtilsTests
    Start 3: Python:AL_USDTransactionTests
    Start 2: GTest:AL_USDTransactionTests
    Start 6: testMayaSchemas
1/8 Test #2: GTest:AL_USDTransactionTests .....   Passed    0.06 sec
2/8 Test #6: testMayaSchemas ..................   Passed    0.10 sec
3/8 Test #3: Python:AL_USDTransactionTests ....   Passed    0.73 sec
4/8 Test #1: AL_MayaUtilsTests ................   Passed    6.01 sec
5/8 Test #8: TestPxrUsdTranslators ............   Passed    9.96 sec
6/8 Test #5: TestUSDMayaPython ................   Passed   10.28 sec
7/8 Test #7: TestAdditionalTranslators ........   Passed   12.06 sec
8/8 Test #4: AL_USDMayaTestPlugin .............   Passed   27.43 sec
100% tests passed, 0 tests failed out of 8

追加のビルド手順

パイソン:

MacOS で USD をビルドする場合は、システム バージョンではなく、Maya に付属の Python バージョンを使用することが重要です。これは主に MacOS での問題であり、Maya の Python バージョンがシステムによって提供されるバージョンと競合する可能性があることに注意してください。

MacOS 上で Maya (2022、2023、2024) 用の USD と Maya プラグインをビルドするには、次のコマンドを実行します。

/Applications/Autodesk/maya2024/Maya.app/Contents/bin/mayapy build_usd.py ~/Desktop/BUILD

デフォルトでは、usdviewPyOpenGL に依存するようにビルドされます。Maya の Python バージョンには PyOpenGL が同梱されていないため、次のエラー メッセージが表示されます。

PyOpenGL is not installed. If you have pip installed, run "pip install PyOpenGL" to install it, then re-run this script.
If PyOpenGL is already installed, you may need to update your ```PYTHONPATH``` to indicate where it is located.

このエラーを回避する最も簡単な方法は、PYTHONPATHシステムの Python または PyOpenGL が既にインストールされているサードパーティの Python パッケージ マネージャーを指すように設定することです。例えば

export PYTHONPATH=$PYTHONPATH:Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages

pip listPython のパッケージ マネージャーでインストールされているパッケージのリストを確認するために使用します。

例えば

➜ pip list
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Package    Version
---------- -------
Jinja2     2.10   
MarkupSafe 1.1.0  
pip        19.1.1 
PyOpenGL   3.1.0  
PySide2    5.12.1 
PyYAML     3.13   
setuptools 39.0.1 
shiboken2  5.12.1 
テスト実行時の Linux DSO への依存関係

通常、このライブラリ内の一部の DSO では runpath または rpath のいずれかが使用され、他のライブラリ (USD 自体など) で明示的に指定されます。

何らかの理由でこれらのオプションのいずれも使用したくない場合は、次のようにしてオフに切り替えます。

CMAKE_SKIP_RPATH=TRUE

テストを実行できるようにするには、ADDITIONAL_LD_LIBRARY_PATH cmake 変数を $ENV{LD_LIBRARY_PATH} などに設定することで、MayaUSD_add_test 呼び出しのいずれかに LD_LIBRARY_PATH を挿入できます。

スキーマが標準以外の場所にインストールされている場合に使用できる、関連する ADDITIONAL_PXR_PLUGINPATH_NAME cmake var があります。

開発ツールセット-6:

CentOS 上の GCC 6 を含む Devtoolset-6 はメイン リポジトリから廃止され、ボールトに移動されました。CentOS に devtoolset-6 をインストールするには、以下の手順に従ってください。

# download the packages, install may fail with "no public key found"
sudo yum-config-manager --add-repo=http://vault.centos.org/7.6.1810/sclo/x86_64/rh/

# to fix "no public key found"
cd /etc/pki/rpm-gpg
ls # confirm RPM-GPG-KEY-CentOS-SIG-SCLo exists
sudo rpm --import RPM-GPG-KEY-CentOS-SIG-SCLo
rpm -qa gpg* # confirm key with substring f2ee9d55 exists

# to install devtoolset-6
sudo yum install devtoolset-6

# disable the vault after successful install
sudo yum-config-manager --disable vault.centos.org_7.6.1810_sclo_x86_64_rh_

Maya にプラグインをロードする方法

提供されているモジュール ファイル (*.mod) を使用すると、プラグインやライブラリのさまざまな環境変数を簡単に設定できます。プロジェクトが正常にビルドされたら、mayaUsd.mod/alUSD.mod/pxrUSD.modインストール ディレクトリ内にインストールされます。Maya がこれらの MOD ファイルを検出するには、MAYA_MODULE_PATHMOD ファイルがインストールされている場所を指すように環境変数を設定する必要があります。例:

set MAYA_MODULE_PATH=C:\workspace\install\RelWithDebInfo
export MAYA_MODULE_PATH=/usr/local/workspace/install/RelWithDebInfo

MAYA_MODULE_PATH が設定されたら、Maya を実行し、Windows -> Setting/Preferences -> Plug-in Managerプラグインをロードします。

maya-usd を github Version 0.25.0 にアップグレードしてみた。

maya-usd Version 0.25.0 にアップグレードしてみた。を cmake してみたい。

以下のサイトを参考にした
https://yamahigashi.dev/text/dcc/usdmaya01/

インストール

  1. インストーラの入手
    以下のサイトにmaya2020向けのビルド済バイナリが配布されている。

https://github.com/Autodesk/maya-usd/releases | github.com |

リリースから
https://github.com/Autodesk/maya-usd/releases
Maya2023.3に付属と同バージョンの
二十二番をやってみるのは上書きしそうなのでやめて
maya-usd Version 0.22.0
形跡の残りやすい安定板の二十五番をインストールすることにした。
maya-usd Version 0.25.0

ダウンロード後インストーラを起動し所定の場所へインストール。もしくは自分でビルドする場合は 2022.5, 2023.3, 2024.1 , 2024.2が対応している。

重要な情報
ビルド
Maya 2024 用の USD バージョン 22.11 と MaterialsX 1.38.5 を使用してビルドされました。
Maya 2022/2023 用の USD バージョン 21.11 と MaterialsX 1.38.3 を使用してビルドされました。
Maya 2019/2020 のビルドはサポートされなくなりました。

MayaUSD_0.25.0_forMaya2022.5_Readme.txt
MayaUSD_0.25.0_forMaya2023.3_Readme.txt
MayaUSD_0.25.0_forMaya2024.1_Readme.txt
MayaUSD_0.25.0_forMaya2024.2_Readme.txt

C:\Program Files\Autodesk\MayaUSD\Maya2023
└─Maya2023
└─0.22.0_202302061132-12c3665
がデフォルト

https://github.com/Autodesk/maya-usd/releases/download/v0.25.0/MayaUSD_0.25.0_forMaya2023.3_Readme.txtの内容

  • この 0.25.0 リリース インストーラは Maya 2023 Update 3 に対してビルドされており、Maya 2023 Update 3 でのみ動作すると予想されます。
  • セキュリティ パッチにより、このリリースで使用される USD のバージョンは、USD に依存する以前のバージョンの Maya プラグインと互換性がない可能性があります。
    USD ワークフローとの互換性を確保するために、Arnold と Bifrost を更新することをお勧めします。
  • Linux では、.run インストーラーの一部として抽出専用機能があります。 その使用方法は次のとおりです。
    ./MayaUSD_0.25.0_Maya2023.3_Linux.run –tar xvf (これにより、すべてのファイルが抽出されます。本当に必要なのは rpm だけである可能性があります。)
  • rpm 経由でインストールするには: rpm -iv –force ./.rpm
    – あるいは、rpm2cpio を使用して、この rpm から生ファイルを抽出することもできます。
  • (–force により、プラグインのモジュール *.mod ファイルが新しいインストーラー データで確実に上書きされます。これはセットアップによって重要になる場合とそうでない場合があります。)
  • MayaUSD リリース インストーラは、他のリリースと「並行して」インストールします。 つまり、インストール ディレクトリには次のような名前のフォルダーが含まれます。
  • _-
  • これらのインストール/フォルダー名は常に一意であるため、「並列」でインストールされます。
  • 現在のインストール場所は次のとおりです。
  • Windows: C:\Program Files\Autodesk\MayaUSD\Maya<バージョン>\<日付文字列>-<ハッシュID> – Linux: /usr/autodesk/MayaUSD/Maya<バージョン>/
  • 注: Linux でファイルを手動で抽出する場合、または rpm のみをインストールする場合は、MayaUSD のインストール場所に MAYA_MODULE_PATH 環境変数を指定する必要があります。
  • MacOS: /Applications/Autodesk/MayaUSD/Maya<バージョン>/_-
  • バニラ設定では、Maya は最後にインストールされた MayaUSD プラグインを自動的にロードします。 これは、MayaUSD インストーラが、Maya が検索する共通の .mod ファイルを次の場所で更新するために発生します。
  • Windows: C:\Program Files\Common Files\Autodesk Shared\Modules\Maya
  • Linux: /usr/autodesk/modules/maya
  • macOS: /Users/Shared/Autodesk/modules/maya
  • 何らかの理由で、MayaUSD プラグインの前のバージョンに戻す/ロードする必要がある場合は、ロードする目的のバージョンを指すように MOD ファイルのパス文字列を置き換えます。

使ったインストーラー
https://github.com/Autodesk/maya-usd/releases#:~:text=MayaUSD_0.25.0_Maya2023.3_Windows.exe

  1. mayaモジュールの設定
    インストール完了後(windowsでは) C:\Program Files\Autodesk\MayaUSD\maya2020 以下に展開される

C:\Program Files\Autodesk\MayaUSD\Maya2023
└─Maya2023
└─0.22.0_202302061132-12c3665 がデフォルト
└─0.25.0_202309291138-d6de777 が入った
├─mayausd.mod
├─mayausdcreative.mod
└─mayausd
├─MayaUSD
│ ├─include
│ ├─lib
│ ├─libraries
│ └─plugin
└─USD
├─bin
├─lib
├─libraries
├─plugin
├─resources
(devkit.zip)
├─cmake
├─include
├─lib
└─share

上記フォルダに mayaモジュール定義ファイルである mayausd.mod が含まれるので MAYA_MODULE_PATH を通してやる。

どこに書くか?
設定はどこに書けば良いのでしょう?
だいたい4つ方法があります。 —> https://dftalk.jp/?p=72
とりあえず。個人の場合これでよし。

maya.envファイルに書き込む
(マイドキュメント\maya\mayaバージョン\maya.env)

MAYA_MODULE_PATH = C:\Program Files\Autodesk\MayaUSD\Maya2023\0.25.0_202309291138-d6de777\mayausd.mod

起動
maya起動後プラグインマネージャをひらき、usdプラグインを有効にする mayaUsdPlugin.mllがファイルのIO、mtoh.mll が Hydra render delegate(のうち USD付属の OpenGLレンダである HdStorm)のビューポートプラグインとなっている。

使えるようになるコマンド

mayaUsdStageLoadAll
mayaUsdStageUnloadAll
mayaUSDExport
mayaUSDImport
mayaUsdEditTarget
mayaUsdLayerEditor
mayaUsdLayerEditorWindow
mayaUsdEditAsMaya
mayaUsdMergeToUsd
mayaUsdDiscardEdits
mayaUsdDuplicate
mayaUsdGetMaterialsFromRenderers
mayaUsdGetMaterialsInStage
mayaUsdMaterialBindings
undoBlockCmd
mayaUSDListJobContexts
mayaUSDListShadingModes
usdUndoHelperCmd
usdImportDialog

[Maya][Python3] オブジェクトのメソッド一覧を取得する

from pxr import Usd, UsdGeom

obj = Usd
for x in dir(obj):
    print (str(x)+ ':'+ str(type(eval("obj."+x))))

出力結果

APISchemaBase:<class 'Boost.Python.class'>
AssetInfoKeys:<class 'Boost.Python.class'>
Attribute:<class 'Boost.Python.class'>
AttributeQuery:<class 'Boost.Python.class'>
BlockStageCachePopulation:<class 'pxr.Usd.StageCacheContextBlockType'>
BlockStageCaches:<class 'pxr.Usd.StageCacheContextBlockType'>
ClipsAPI:<class 'Boost.Python.class'>
CollectionAPI:<class 'Boost.Python.class'>
CompositionArc:<class 'Boost.Python.class'>
ComputeIncludedObjectsFromCollection:<class 'Boost.Python.function'>
ComputeIncludedPathsFromCollection:<class 'Boost.Python.function'>
CrateInfo:<class 'Boost.Python.class'>
Describe:<class 'Boost.Python.function'>
EditContext:<class 'Boost.Python.class'>
EditTarget:<class 'Boost.Python.class'>
FlattenLayerStack:<class 'Boost.Python.function'>
FlattenLayerStackResolveAssetPath:<class 'Boost.Python.function'>
GetMajorVersion:<class 'Boost.Python.function'>
GetMinorVersion:<class 'Boost.Python.function'>
GetPatchVersion:<class 'Boost.Python.function'>
GetVersion:<class 'Boost.Python.function'>
Inherits:<class 'Boost.Python.class'>
InterpolationType:<class 'Boost.Python.class'>
InterpolationTypeHeld:<class 'pxr.Usd.InterpolationType'>
InterpolationTypeLinear:<class 'pxr.Usd.InterpolationType'>
ListPosition:<class 'Boost.Python.class'>
ListPositionBackOfAppendList:<class 'pxr.Usd.ListPosition'>
ListPositionBackOfPrependList:<class 'pxr.Usd.ListPosition'>
ListPositionFrontOfAppendList:<class 'pxr.Usd.ListPosition'>
ListPositionFrontOfPrependList:<class 'pxr.Usd.ListPosition'>
LoadPolicy:<class 'Boost.Python.class'>
LoadWithDescendants:<class 'pxr.Usd.LoadPolicy'>
LoadWithoutDescendants:<class 'pxr.Usd.LoadPolicy'>
ModelAPI:<class 'Boost.Python.class'>
Notice:<class 'Boost.Python.class'>
Object:<class 'Boost.Python.class'>
Payloads:<class 'Boost.Python.class'>
Prim:<class 'Boost.Python.class'>
PrimAllPrimsPredicate:<class 'pxr.Usd._PrimFlagsPredicate'>
PrimCompositionQuery:<class 'Boost.Python.class'>
PrimDefaultPredicate:<class 'pxr.Usd._PrimFlagsConjunction'>
PrimDefinition:<class 'Boost.Python.class'>
PrimHasDefiningSpecifier:<class 'pxr.Usd._Term'>
PrimIsAbstract:<class 'pxr.Usd._Term'>
PrimIsActive:<class 'pxr.Usd._Term'>
PrimIsDefined:<class 'pxr.Usd._Term'>
PrimIsGroup:<class 'pxr.Usd._Term'>
PrimIsInstance:<class 'pxr.Usd._Term'>
PrimIsLoaded:<class 'pxr.Usd._Term'>
PrimIsModel:<class 'pxr.Usd._Term'>
PrimRange:<class 'Boost.Python.class'>
PrimTypeInfo:<class 'Boost.Python.class'>
Property:<class 'Boost.Python.class'>
References:<class 'Boost.Python.class'>
Relationship:<class 'Boost.Python.class'>
ResolveInfo:<class 'Boost.Python.class'>
ResolveInfoSource:<class 'Boost.Python.class'>
ResolveInfoSourceDefault:<class 'pxr.Usd.ResolveInfoSource'>
ResolveInfoSourceFallback:<class 'pxr.Usd.ResolveInfoSource'>
ResolveInfoSourceNone:<class 'pxr.Usd.ResolveInfoSource'>
ResolveInfoSourceTimeSamples:<class 'pxr.Usd.ResolveInfoSource'>
ResolveInfoSourceValueClips:<class 'pxr.Usd.ResolveInfoSource'>
SchemaBase:<class 'Boost.Python.class'>
SchemaKind:<class 'type'>
SchemaRegistry:<class 'Boost.Python.class'>
Specializes:<class 'Boost.Python.class'>
Stage:<class 'Boost.Python.class'>
StageCache:<class 'Boost.Python.class'>
StageCacheContext:<class 'Boost.Python.class'>
StageCacheContextBlockType:<class 'Boost.Python.class'>
StageLoadRules:<class 'Boost.Python.class'>
StagePopulationMask:<class 'Boost.Python.class'>
TimeCode:<class 'Boost.Python.class'>
Tokens:<class 'Boost.Python.class'>
TraverseInstanceProxies:<class 'Boost.Python.function'>
Typed:<class 'Boost.Python.class'>
UsdCollectionMembershipQuery:<class 'Boost.Python.class'>
UseButDoNotPopulateCache:<class 'Boost.Python.function'>
VariantSet:<class 'Boost.Python.class'>
VariantSets:<class 'Boost.Python.class'>
ZipFile:<class 'Boost.Python.class'>
ZipFileWriter:<class 'Boost.Python.class'>
_CanApplyAPIResult:<class 'Boost.Python.class'>
_CanApplyResult:<class 'Boost.Python.class'>
_NoBlock:<class 'pxr.Usd.StageCacheContextBlockType'>
_NonPopulatingStageCacheWrapper:<class 'Boost.Python.class'>
_PrimFlagsConjunction:<class 'Boost.Python.class'>
_PrimFlagsDisjunction:<class 'Boost.Python.class'>
_PrimFlagsPredicate:<class 'Boost.Python.class'>
_Term:<class 'Boost.Python.class'>
_TestPrimRangeRoundTrip:<class 'Boost.Python.function'>
_UnsafeGetStageForTesting:<class 'Boost.Python.function'>
__MFB_FULL_PACKAGE_NAME:<class 'str'>
__builtins__:<class 'dict'>
__cached__:<class 'str'>
__doc__:<class 'NoneType'>
__file__:<class 'str'>
__loader__:<class '_frozen_importlib_external.ExtensionFileLoader'>
__name__:<class 'str'>
__package__:<class 'str'>
__path__:<class 'list'>
__spec__:<class '_frozen_importlib.ModuleSpec'>

参考

https://developer.nvidia.com/usd/apinotes

[maya] よくあるtextFieldの入力をchangeCommandで受ける場合に必要なwindow object path のpythonの話

なんか引っかかってしまいがちな

どこにも書いてないウィンドウパスの話
MY_Export_window|MY_layout|pathTxtFld

    
def createWindow():
    MY_window = cmds.window("MY_Export_window", widthHeight=(400, 200))
    MY_layout = cmds.columnLayout("MY_layout",adjustableColumn=True, parent=MY_window)

    cmds.text (label="テキストを変更したら呼ばれるよ", align='left', parent=MY_layout)

    text_Field_id = cmds.textField("pathTxtFld",text=get_lastExportDirPath(),changeCommand=changeTextFld)
    print("text_Field_id= "+text_Field_id)

    cmds.showWindow(MY_window)
    
    return None

def changeTextFld(*arg):
    text_Field_id="MY_Export_window|MY_layout|pathTxtFld"
    print("text_Field_id= "+text_Field_id)
    pathTxtFld_value = cmds.textField(text_Field_id, q=True, text=True)
    print("pathTxtFld_value= "+pathTxtFld_value)
    set_lastExportDirPath(pathTxtFld_value)


createWindow()   

この時出力が

#columnLayoutに名前つけないとパスがこんな不安な感じになる。
text_Field_id= MY_Export_window|columnLayout118|pathTxtFld

#columnLayoutに名前つければとパスがこんな確実な感じになる。
text_Field_id= MY_Export_window|MY_layout|pathTxtFld

text_Field_id= MY_Export_window|MY_layout|pathTxtFld

[maya] カスタム アトリビュート を python で作る場合。

cmds.addAttr(longName=’lastDirPath’,dataType=’string’ )

import maya.cmds as cmds

cmds.select("any")
#custom-attribute-add-python
cmds.addAttr(longName='lastDirPath',dataType='string' )

これをこう使うわけだ

def select_exportDir(self):
    
    filePath = cmds.fileDialog2( cap = '書き出しディレクトリの選択', okc = '書き出しディレクトリを設定',ds = 2, fm = 3,startingDirectory=get_lastExportDirPath())
    if filePath == None:
        return False
    else:
        set_lastExportDirPath(filePath[0]+"/")



def get_lastExportDirPath_ExistBool():
    lastExportDirPath_ExistBool=False
    Attlist=cmds.listAttr( r=True )
    print("Attlist= "+str(Attlist))
    for AttName in Attlist:
        #print("AttName= "+AttName)
        if(AttName=="lastExportDirPath"):
            lastExportDirPath_ExistBool=True
            print("HIT!!!!!!!lastExportDirPath")
    return lastExportDirPath_ExistBool

def addAttr_lastExportDirPath():
    lastExportDirPath_ExistBool= get_lastExportDirPath_ExistBool()
    if(lastExportDirPath_ExistBool==False):
        cmds.addAttr(longName='lastExportDirPath',dataType='string')
        

def set_lastExportDirPath(lastExportDirPath):
    
    selectList=cmds.ls(sl=True)
    if(str(selectList)== "[]"):
        print("なにも選択されていません。0 set_lastExportDirPath")
    else:

        for i in selectList:
            cmds.select(i)
            #---------------------------
            addAttr_lastExportDirPath()
            #---------------------------
            print("i= "+str(i))
            attName=i+"."+'lastExportDirPath'
            print("attName= "+attName)
            cmds.setAttr( attName, lastExportDirPath,type="string")
    cmds.textField("pathTxtFld", edit=True, text=lastExportDirPath)
    cmds.select(selectList)



def get_lastExportDirPath():

    selectList=cmds.ls(sl=True)
    
    lastExportDirPath=""
    if(str(selectList)== "[]"):
        print("なにも選択されていません。3 get_lastExportDirPath")
        lastExportDirPath = get_scenePath()
    else:
        for i in selectList:
            cmds.select(i)
            #---------------------------
            addAttr_lastExportDirPath()
            #---------------------------
            print("i= "+str(i))
            attName=i+"."+'lastExportDirPath'
            print("attName= "+attName)
            lastExportDirPath = cmds.getAttr(attName)
            print("lastExportDirPath="+str(lastExportDirPath))
            if(str(lastExportDirPath)=="None"):
                lastExportDirPath = get_scenePath()
        cmds.select(selectList)
    return lastExportDirPath
       

[maya] MEL To Python2 From pymel For Maya 2016

MEL To Python2

これがシンプルな状態
import pymel.tools.mel2py as mel2py

pyCmd = mel2py.mel2pyStr(melCmd,pymelNamespace=’pm‘)

pyCmd = mel2py.mel2pyStr(melCmd,pymelNamespace=’cmds‘)でいいのかも

# -*- coding: cp932 -*-
import pymel.core as pm
import pymel.tools.mel2py as mel2py
import re
import math
import random
melCmd = """
$value1 = `floatFieldGrp -q -label "Frame range" -v1`;
	"""
pyCmd =  mel2py.mel2pyStr(melCmd,pymelNamespace='pm')

melで改行をしてる「+”¥n”」と「¥n」を けしてから

あと、出力結果がPyMelにならないようにしてみたり。

# -*- coding: cp932 -*-
import pymel.core as pm
import pymel.tools.mel2py as mel2py
import re
import math
import random
melCmd = """
global proc Generic_modelFileOpen()
{
  string $workspaceRoot = `workspace -q -rootDirectory`;
    string $motionFileDir= $workspaceRoot+"scenes/Generic_model_wep.mb";
    file -f -options "v=0;"  -ignoreVersion  -typ "mayaBinary" -o $motionFileDir;
        if(`file -q -writable`==1){
            select `ls -type joint`;
    
    string $joints[] =`ls -type joint`;
   int $jointsLength=size($joints);
    if($jointsLength==0)
    {
      print ("-------------------------joint nothing-----------------------------");
    }else{
        for	($joint in $joints)
        {
            //setKeyframe 0 ,1
            currentTime 0 ;
            setKeyframe -breakdown 0 -hierarchy none -controlPoints 0 -shape 0 -time 0 $joint;
           currentTime 1 ;
            setKeyframe -breakdown 0 -hierarchy none -controlPoints 0 -shape 0 -time 0 $joint;
        }
    }
    print("-------------------------joint-----------------------------");
    print($joint);
    print ("\n-------------------------joint-----------------------------");
    if($joint=="")
    {
    print ("-------------------------joint nothing-----------------------------");
    }
    ////////////////////////////////////////////////////////joint select
            print("TstanceFBXExport()");
           TstanceFBXExport();
    }
}
$value1 = `floatFieldGrp -q -label "Frame range" -v1`;
	"""
		
print "----------------mel code replace----------------------------"
#melCmd = melCmd.replace('$writable_bool','`file -q -writable`')
melCmd = melCmd.replace('"\n--', '"--')
melCmd = melCmd.replace('+"\n"', '')
melCmd = melCmd.replace('\n"', '"')
print("melCmd="+melCmd)
print "------------------------------------------------"
# mel2py.mel2pyStr  
pyCmd =  mel2py.mel2pyStr(melCmd,pymelNamespace='pm')
pyFixed_Dest = ""
#pyFixed_Dest = pyFixed_Dest + "# -*- coding: cp932 -*- \n"
pyFixed_Dest = pyFixed_Dest + "# -*- coding: utf-8 -*- \n"
#pyFixed_Dest = pyFixed_Dest + "# -*- coding: shift-jis -*- \n"
pyFixed_Dest = pyFixed_Dest + "from maya import cmds \n"
pyFixed_Dest = pyFixed_Dest + "from python import Debug \n"
pyFixed = pyCmd.replace("pymel.all","pymel.core")
pyFixed = pyFixed.replace("pm.pm.cmds","cmds")
pyFixed_Dest = pyFixed_Dest + pyFixed+"\n"
print "----------------------python sorce replace----------------------"

pyFixed_Dest = pyFixed_Dest.replace('import pymel.core as pm', 'import pymel.core as pm \nDebug=Debug.Debug')
pyFixed_Dest = pyFixed_Dest.replace('pm.file', 'cmds.file')
pyFixed_Dest = pyFixed_Dest.replace('pm.ls', 'cmds.ls')
pyFixed_Dest = pyFixed_Dest.replace('pm.select', 'cmds.select')
pyFixed_Dest = pyFixed_Dest.replace('pm.internalVar', 'cmds.internalVar')
pyFixed_Dest = pyFixed_Dest.replace('pm.keyframe', 'cmds.keyframe')
pyFixed_Dest = pyFixed_Dest.replace('pm.workspace', 'cmds.workspace')
pyFixed_Dest = pyFixed_Dest.replace('pm.getFileList', 'cmds.getFileList')
pyFixed_Dest = pyFixed_Dest.replace('=="1"', '==1')
pyFixed_Dest = pyFixed_Dest.replace('== "1"', '== 1')
pyFixed_Dest = pyFixed_Dest.replace('print("', 'print(u"')
pyFixed_Dest = pyFixed_Dest.replace('print "', 'print u"')
pyFixed_Dest = pyFixed_Dest.replace('pm.flushUndo()', 'cmds.flushUndo()')
pyFixed_Dest = pyFixed_Dest.replace('pm.parent', 'cmds.parent')
pyFixed_Dest = pyFixed_Dest.replace('pm.objExists', 'cmds.objExists')
pyFixed_Dest = pyFixed_Dest.replace('pm.rename', 'cmds.rename')
pyFixed_Dest = pyFixed_Dest.replace('pm.playbackOptions', 'cmds.playbackOptions')
pyFixed_Dest = pyFixed_Dest.replace('pm.mel.DebugLog', 'self.DebugLog')
pyFixed_Dest = pyFixed_Dest.replace('pm.currentTime', 'cmds.currentTime')
pyFixed_Dest = pyFixed_Dest.replace('pm.setKeyframe', 'cmds.setKeyframe')
#pyFixed_Dest = pyFixed_Dest.replace('maya.mel.eval("listRelatives -pa -ad `ls -sl -l`"', 'cmds.listRelatives(path=True, allDescendents =True,cmds.ls(selection=True, long=True))'))
#for Class
pyFixed_Dest = pyFixed_Dest.replace('():', '(self):')
pyFixed_Dest = pyFixed_Dest.replace('():', '(self):')
regex = r'print+'
#pattern = re.compile(regex)
#matchObj = pattern.match(pyFixed_Dest)
#matchObj = re.search(r'[a-z]+', pyFixed_Dest)

def repl(m):
    inner_word1 = list(m.group(1))  #prin(\w\W)    "prin" "t" " "    real ['t', ' ']
    #print("inner_word1= "+str(inner_word1))   
    inner_word2 = list(m.group(2))    #(.*)     something strings "----1-----" real ['u', '"', '-', '-', '-', '-', '1', '-', '-', '-', '-']
    #print("inner_word2= "+str(inner_word2))
    inner_word3 = list(m.group(3))
    #inner_word4 = list(m.group(4))    #(\")  double cout   real  ['"']
    print("inner_word123= "+str(inner_word1)+str(inner_word2)+str(inner_word3)+""+str(list(m.group(4)))+str(list(m.group(5)))+"")
    #print("inner_word2= "+str(inner_word1)+str(inner_word2)+str(inner_word3))
    #random.shuffle(inner_word)
    #back= m.group(1) + "".join(inner_word) + m.group(3)
    back="00000"+ str(m.end())
    back=m.group(1) +m.group(2)+"("+m.group(3)+m.group(4)+m.group(5)+")" #for print
    back=m.group(1) +"Debug.Log"+"("+m.group(3)+m.group(4)+m.group(5)+")"  #for Debug.Log  Debug Class is https://gist.github.com/whaison/fc625381dce126ca5d88d1f914ce89f0
    
    return back
#text = "Professor Abdolmalek, please report your absences promptly."
text = """
print "----1----"
print "----2----"
print "----3----"
print "----4----"
print "----5----"
print "----6----"
print "----7----"
	"""
#resub=re.sub(r"(\w)(\w+)(\w)", repl, text)
#resub=re.sub(r'(prin\w)', repl, text)
resub=re.sub(r'(.*)(prin\w\W)(.*)(\")(.*)', repl, text)

print("resub    --------------------output  start")
print resub 
#print resub[:m.start()]
#print resub[m.end():]
print("resub    --------------------output  end")
pyFixed_Dest=re.sub(r'(.*)(prin\w\W)(.*)(\")(.*)', repl, pyFixed_Dest)
print("resub  pyFixed_Dest  --------------------output  start")
print pyFixed_Dest 
#print resub[:m.start()]
#print resub[m.end():]
print("resub pyFixed_Dest   --------------------output  end")
print("search    --------------------output  start")
email = "tony@tiremove_thisger.net"
m = re.search(r'print*', text)
print text[:m.start()] +"print("+ text[m.end():]
print("search    --------------------output  end")
print "------------------------------------------------"
print pyFixed_Dest

出力結果

------------------------------------------------
# -*- coding: utf-8 -*- 
from maya import cmds 
from python import Debug 
import pymel.core as pm 
Debug=Debug.Debug

def Generic_modelFileOpen(self):
	
	workspaceRoot=str(cmds.workspace(q=1, rootDirectory=1))
	motionFileDir=workspaceRoot + "scenes/Generic_model_wep.mb"
	cmds.file(motionFileDir, ignoreVersion=1, typ="mayaBinary", options="v=0;", o=1, f=1)
	if cmds.file(q=1, writable=1) == 1:
		cmds.select(cmds.ls(type='joint'))
		joints=cmds.ls(type='joint')
		jointsLength=len(joints)
		if jointsLength == 0:
			Debug.Log(u"-------------------------joint nothing-----------------------------")
			
		
		else:
			for joint in joints:
				cmds.currentTime(0)
				#setKeyframe 0 ,1
				cmds.setKeyframe(joint, breakdown=0, hierarchy='none', shape=0, time=0, controlPoints=0)
				cmds.currentTime(1)
				cmds.setKeyframe(joint, breakdown=0, hierarchy='none', shape=0, time=0, controlPoints=0)
				
			
		Debug.Log(u"-------------------------joint-----------------------------")
		print joint
		Debug.Log(u"-------------------------joint-----------------------------")
		if joint == "":
			Debug.Log(u"-------------------------joint nothing-----------------------------")
			
		Debug.Log(u"TstanceFBXExport()")
		#//////////////////////////////////////////////////////joint select
		pm.mel.TstanceFBXExport()
		
	

value1=pm.floatFieldGrp("Frame range", q=1, v1=1, label=1)

maya ls python のまとめ

このごろサイトが丸ごとなくなったので置いておく

Top Node をとってくる

topNodeList=cmds.ls(assemblies=True)

dagObjects 階層をとってくる

topNodeList=cmds.ls( "root", dagObjects=True, type="transform" )