modoの「頂点位置コンストレイント」を複数アイテムで実行するスクリプトをAIに作ってもらいました。
modoのコンストレイントは Ctrl を押すと、複数のアイテムに一括で適用できて便利です。しかし、ジオメトリ系のコンストレイントは複数アイテムに対応していません。
複数のアイテムにまとめて「頂点位置コンストレイント」を適用するスクリプトをAIに作ってもらいました。
テキストエディターにコードをペーストして、適当なファイル名を付けて保存して使ってください。拡張子は.py、Python 2.7用です。
ユーザースクリプトフォルダにスクリプトを入れると、「@+ファイル名」でスクリプトを実行できます。
@_kai_VertexConstraint_Multi.py
# !/usr/bin/env python
# Foundry modo Script: Apply constraintGeometry vert pos to selected items
# Target: Last selected item
import lx
import modo
try:
# 現在のシーンを取得
scene = modo.Scene()
# 選択されたアイテムを取得
selected_items = scene.selected
selected_item_ids = [item.id for item in selected_items]
if len(selected_item_ids) == 0:
lx.out("Error: No items selected")
elif len(selected_item_ids) < 2:
lx.out("Error: Please select at least 2 items (current: " + str(len(selected_item_ids)) + " items)")
else:
lx.out("=== Constraint Geometry Processing Started ===")
for i, item in enumerate(selected_items):
try:
lx.out("Selected item " + str(i+1) + ": " + item.name)
except:
lx.out("Selected item " + str(i+1) + ": " + str(item.id))
# 最後に選択されたアイテムをターゲットとする
target_item = selected_items[-1]
target_item_id = target_item.id
source_items = selected_items[:-1]
source_item_ids = [item.id for item in source_items]
try:
lx.out("Target: " + target_item.name)
except:
lx.out("Target: " + str(target_item_id))
lx.out("Processing: " + str(len(source_items)) + " items")
success_count = 0
for i, source_item in enumerate(source_items):
try:
lx.eval('select.drop item')
lx.eval('select.item ' + str(source_item.id) + ' set')
lx.eval('select.item ' + str(target_item_id) + ' add')
lx.eval('constraintGeometry vert pos')
success_count += 1
try:
lx.out("Completed (" + str(i+1) + "/" + str(len(source_items)) + "): " + source_item.name)
except:
lx.out("Completed (" + str(i+1) + "/" + str(len(source_items)) + "): " + str(source_item.id))
except Exception as e:
lx.out("Error - Item " + str(source_item.id) + ": " + str(e))
continue
# Restore original selection state
lx.eval('select.drop item')
for item_id in selected_item_ids:
lx.eval('select.item ' + str(item_id) + ' add')
lx.out("=== Processing Complete ===")
lx.out("Success: " + str(success_count) + "/" + str(len(source_items)) + " items")
except Exception as e:
lx.out("Script execution error: " + str(e))
「頂点の位置コンストレイント」は、以前アイテムが粉砕されて別のアイテムに変わる表現で使いましたが、「頂点位置コンストレイント」が複数のアイテムに対応していなくて不便でした。試しにAIにスクリプトを書かせたら、何度か修正を加えて動作する物ができたので公開しておきます。
AIについて
modoのPythonスクリプトはあまり公開されていないためか、一発で動くスクリプトが出てくることは無いです。
Pythonスクリプトの例は多くありますが、modoのコマンドや引数の使用方法などの情報は少ないので動くスクリプトになりません。TD SDKのURLを投げて、これ見てスクリプトのエラーを修正してくださいと指示すると動く物を作ってくれたりします。
https://learn.foundry.com/modo/developers/latest/SDK/index.html
エラーが出た時は何が原因か確認して、別チャットで問題になる部分だけの単純なスクリプト作成を指示すると問題を解決しやすいです。
このスクリプトの大まかな処理は、「選択アイテムの取得」「最後に選択したアイテムをターゲットにする」「選択アイテム1個ずつ位置コンストレイント適用」という流れです。「位置コンストレイント」と指示してもAIには伝わらなそうなので「選択アイテムにコマンド"constraintGeometry vert pos"を適用」のように指示しています。
スクリプトで問題になったのが「最後に選択したアイテムをターゲットにする」です。これはmodoのコマンドの仕様なのですが、最後のアイテムを選択できず困りました。その場合は別チャットで「modo16で最後に選択したアイテムをprintするスクリプト作って」のように指示し、まず最後に選択したアイテムを判別するスクリプトを作成します。その後、元のチャットに戻って「このスクリプトを参考に、最後に選択したアイテムを選択するように修正して」のように指示してスクリプトを完成させました。
今回使用したAIはclaudeです。コーディング向けAIとして凄いと話題になっているらしいので使ってみました。
コーディング向けということで、エラーメッセージを伝えるとエラーの箇所を特定するようにスクリプトを修正したり、最小構成の単純なスクリプトを用意してくれたりして便利です。ただし、無料だと話題になっている最新AIモデルが使えないのと、文字数制限がキツイです。
今回はどんなAIなのか無料で試すついでだったのですが、無料版でmodoのスクリプトを作れました。もしかするとChatGPTなど他のAIでも作れるのかもしれません。