
MaxScriptのgetUserProp関数は、3ds Maxの古いバージョンからエラーが発生しており、オブジェクトのユーザー プロパティに保存された値の取得に影響を与えています。この問題を解決するために、データ抽出を最適化し、より正確な処理を保証する改良版が開発されました。
長年のエラーの解決策
MaxScriptの元の関数の問題は、ブール値、数値、または文字列を扱う際に常に正しい値を返さない点にあります。この欠陥は3ds Max 9から存在し、公式に修正されたことはありません。これらのエラーを回避するために、データ取得の安定性を向上させる新しい実装が設計されました。
getUserProp改良版の主な特徴
- 取得した値における数値コンテンツの検証。
- 変換エラーを避けるためのテキスト形式の修正。
- 3ds Maxの古いバージョンとの互換性、バージョン9を含む。
- ブール値、数値、文字列の最適化された処理。
自動化スクリプトへの応用
このスクリプトは、3ds Maxでカスタムツールを扱う開発者にとって特に有用で、オブジェクトのユーザー プロパティに保存されたデータへのより正確なアクセスを可能にします。その応用範囲は以下の通りです:
- シーン内の3Dモデルからの情報取得。
- プロジェクトの整理を改善するためのメタデータの自動化。
- カスタムスクリプトでの効率的なデータエクスポート。
高度なワークフローの最適化
この新バージョンの実装は、3ds Max環境内で信頼性の高いデータ取得を容易にします。その目的は、ユーザー プロパティの使用における一貫性と安定性を向上させ、情報抽出の一般的な問題を回避することです。
改良されたスクリプトのコード
-- Verifica si una cadena contiene solo números
fn isNumeral txt = (
s= txt as string
for i = 1 to s.count do(
if(findString "0123456789" s[i]) == undefined then(
return false
)
)
return true
)
-- Función mejorada de getUserProp
fn getUserProp2 obj =(
local ss = (getUserPropBuffer obj) as stringStream
if ss != undefined then(
while (eof ss) != true do(
local txt = readline ss
local arr = filterstring txt " = "
if arr[2] != undefined then(
if (arr[2] == "true") or (arr[2] == "false") or ((isNumeral arr[2]) == true ) then(
txt = arr[1] + "=" + arr[2]
execute txt
readline ss
)else(
arr[2] = "@\"" + arr[2]
append arr[2] "\""
txt = arr[1] + "=" + arr[2]
execute txt
readline ss
)
)else(
txt = arr[1] + "=" + "\"\""
execute txt
readline ss
)
)
)else(
return();
)
コードの説明
- isNumeral(txt): 文字列が数字のみを含むかどうかを確認します。
- getUserProp2(obj):
- ユーザー プロパティに保存された値を回復します。
- それらが数値、ブール値、または文字列であるかを検証します。
- 変換エラーを修正し、データを正しく構造化します。
- 値を安全に割り当てを実行します。
このスクリプトは、3ds Maxに保存されたデータを扱う開発者にとって効果的な解決策であり、エラーを排除し、プロジェクト内での情報取得の信頼性を向上させます。