feat: clothing lane, character sources, and DCC bridges
Bulk import of the working lanes that were living untracked on the PC. Content: - characters/ Lena/male body lanes, bakes, texture work, run logs - clothing/ garment pipeline, configs, gates, contract docs - garments/ MD-authored garment sources (.zprj/.zpac) - UAL-Lib/ Universal Animation Library 2 source (.blend/.fbx/.glb) - tools/ blender_bridge, iclone_bridge, md_bridge, tailor, glm_agent - docs/, plans/, dev/, .agents/plans/ Repo hygiene: - .gitattributes: LFS now covers .blend, .zprj, .zpac, .obj, .npy and the Reallusion .iAvatar/.ccAvatar/.ccRestore containers. Without this the ~3.8 GB in this commit would land as raw blobs. .png/.jpg are left out on purpose — ~250 are already tracked raw and converting them would rewrite every one without shrinking history. - .gitignore: exclude /accurig/ (~1 GB AccuRig program files, redistributable from Reallusion, nothing authored here) and /dev/null/ (git-lfs hook copies dropped by a `>/dev/null` redirect on Windows). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,269 @@
|
||||
"""TinqsMDBridge -- Marvelous Designer python plug-in (v2, main-loop design).
|
||||
|
||||
Runs a localhost-only TCP socket server inside Marvelous Designer and
|
||||
executes Python source sent to it, giving external tooling (Claude Code)
|
||||
live control of MD's scripting API (pattern_api / import_api / export_api /
|
||||
fabric_api / utility_api / ApiTypes).
|
||||
|
||||
WHY v2 BLOCKS THE UI -- verified 2026-07-30 on MD 2026 Personal (embedded
|
||||
Python 3.11.8): MD's embedded interpreter does NOT schedule Python background
|
||||
threads while MD is idle. A daemon-thread server binds and listens (the OS
|
||||
accepts connections into the backlog) but accept()/recv() never run, so every
|
||||
request times out. No Python Qt binding ships with MD either, so the iClone
|
||||
QTimer trick is unavailable. The only thread Python code reliably runs on is
|
||||
the one the Plug-in Manager calls into -- so the server IS the click:
|
||||
|
||||
- Clicking Plugin > TinqsMDBridge enters a single-threaded serve loop on
|
||||
the main thread. MD's UI freezes ("Not Responding" is NORMAL) while the
|
||||
bridge session is active. All api calls run on the main thread -- the
|
||||
safest place for them.
|
||||
- The loop exits (returning MD to interactive use) when a client sends the
|
||||
literal code "__STOP__" (python tools/md_bridge.py --stop), or after
|
||||
IDLE_TIMEOUT_S with no requests (default 300, env
|
||||
TINQS_MD_BRIDGE_IDLE overrides) -- the escape hatch, since a frozen UI
|
||||
can't be clicked. Each click is a fresh session; the socket is fully
|
||||
closed on exit.
|
||||
|
||||
Install (one-time, manual -- MD has no auto-load plugin folder):
|
||||
1. In MD: Plugin tab > Plug-in Manager > + ADD
|
||||
2. Select this file, name it "TinqsMDBridge", click OK
|
||||
3. Click Plugin > TinqsMDBridge to START A BRIDGE SESSION (UI freezes)
|
||||
4. Verify from a terminal: python tools/md_bridge.py --ping
|
||||
5. End the session: python tools/md_bridge.py --stop
|
||||
NOTE: if MD copies the .py on registration rather than referencing it in
|
||||
place (check --ping's "source" field), edits require remove + re-ADD.
|
||||
|
||||
Wire protocol (identical to the iClone TinqsBridge): newline-delimited JSON
|
||||
over TCP, one request/response pair per connection.
|
||||
|
||||
request: {"id": <int>, "code": "<python source>"}
|
||||
success: {"id": <int>, "ok": true, "result": <json|null>, "stdout": "<str>"}
|
||||
failure: {"id": <int>, "ok": false, "error": "<traceback str>", "stdout": "<str>"}
|
||||
|
||||
Execution semantics (same `result` convention as the iClone bridge):
|
||||
- exec(code, ns, ns) against ONE persistent namespace. It survives across
|
||||
requests AND across serve sessions (module-level dict; the Plug-in
|
||||
Manager re-execs this file per click but the namespace is re-seeded,
|
||||
fresh api module refs, stale user state discarded -- keep long-lived
|
||||
state on your own side).
|
||||
- Setting `result` in submitted code makes it the response result
|
||||
(JSON-encoded, repr() fallback). Cleared before every exec.
|
||||
- stdout/stderr captured and returned; exceptions come back as ok:false
|
||||
with a traceback and the session keeps serving.
|
||||
|
||||
Log file: %TEMP%/tinqs_md_bridge.log
|
||||
"""
|
||||
|
||||
import contextlib
|
||||
import io
|
||||
import json
|
||||
import os
|
||||
import socket
|
||||
import time
|
||||
import traceback
|
||||
from datetime import datetime
|
||||
|
||||
VERSION = 2
|
||||
DEFAULT_PORT = 18900
|
||||
HOST = "127.0.0.1"
|
||||
ACCEPT_POLL_TIMEOUT_S = 1.0
|
||||
CONN_READ_TIMEOUT_S = 30.0
|
||||
DEFAULT_IDLE_TIMEOUT_S = 14400.0 # 4 h -- one click lasts a work session;
|
||||
# --stop from any terminal ends it anytime
|
||||
STOP_SENTINEL = "__STOP__"
|
||||
|
||||
LOG_PATH = os.path.join(
|
||||
os.environ.get("TEMP", os.environ.get("TMP", ".")),
|
||||
"tinqs_md_bridge.log",
|
||||
)
|
||||
|
||||
|
||||
def _log(msg):
|
||||
"""Append a timestamped line to the log file. Must never raise."""
|
||||
try:
|
||||
line = "[{}] {}\n".format(datetime.now().strftime("%Y-%m-%d %H:%M:%S"), msg)
|
||||
with open(LOG_PATH, "a", encoding="utf-8") as f:
|
||||
f.write(line)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
def _env_float(name, default):
|
||||
raw = os.environ.get(name)
|
||||
if raw:
|
||||
try:
|
||||
return float(raw)
|
||||
except ValueError:
|
||||
_log("WARN: {}={!r} not a number, using {}".format(name, raw, default))
|
||||
return default
|
||||
|
||||
|
||||
def _import_md_api():
|
||||
"""Import whatever MD api modules exist in this MD build; report misses."""
|
||||
ns = {}
|
||||
missing = []
|
||||
for name in ("import_api", "export_api", "pattern_api", "fabric_api",
|
||||
"utility_api", "ApiTypes"):
|
||||
try:
|
||||
ns[name] = __import__(name)
|
||||
except Exception:
|
||||
missing.append(name)
|
||||
return ns, missing
|
||||
|
||||
|
||||
def _execute(ns, code):
|
||||
ns["result"] = None
|
||||
out = io.StringIO()
|
||||
try:
|
||||
with contextlib.redirect_stdout(out), contextlib.redirect_stderr(out):
|
||||
exec(code, ns, ns)
|
||||
result = ns.get("result")
|
||||
try:
|
||||
json.dumps(result)
|
||||
except TypeError:
|
||||
result = repr(result)
|
||||
return {"ok": True, "result": result, "stdout": out.getvalue()}
|
||||
except Exception:
|
||||
return {"ok": False, "error": traceback.format_exc(), "stdout": out.getvalue()}
|
||||
|
||||
|
||||
def _read_request(conn):
|
||||
"""Read one newline-terminated JSON request. Returns dict or None."""
|
||||
conn.settimeout(CONN_READ_TIMEOUT_S)
|
||||
buf = b""
|
||||
while not buf.endswith(b"\n"):
|
||||
chunk = conn.recv(4096)
|
||||
if not chunk:
|
||||
break
|
||||
buf += chunk
|
||||
if not buf.strip():
|
||||
return None
|
||||
return json.loads(buf.decode("utf-8"))
|
||||
|
||||
|
||||
def _respond(conn, resp):
|
||||
conn.sendall((json.dumps(resp) + "\n").encode("utf-8"))
|
||||
|
||||
|
||||
def _reclaim_stale_socket():
|
||||
"""v1 of this plugin parked a never-serving socket on builtins. Close it
|
||||
so our bind succeeds without an MD restart."""
|
||||
import builtins
|
||||
old = getattr(builtins, "_tinqs_md_bridge_singleton", None)
|
||||
if old is not None:
|
||||
try:
|
||||
if getattr(old, "server_socket", None) is not None:
|
||||
old.server_socket.close()
|
||||
_log("closed stale v1 socket")
|
||||
except Exception:
|
||||
pass
|
||||
setattr(builtins, "_tinqs_md_bridge_singleton", None)
|
||||
|
||||
|
||||
def _serve():
|
||||
import sys
|
||||
port = int(_env_float("TINQS_MD_BRIDGE_PORT", DEFAULT_PORT))
|
||||
idle_timeout = _env_float("TINQS_MD_BRIDGE_IDLE", DEFAULT_IDLE_TIMEOUT_S)
|
||||
|
||||
_log("=" * 60)
|
||||
_log("TinqsMDBridge v{} session starting, port {}, idle timeout {}s".format(
|
||||
VERSION, port, idle_timeout))
|
||||
|
||||
_reclaim_stale_socket()
|
||||
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
try:
|
||||
sock.bind((HOST, port))
|
||||
except OSError:
|
||||
_log("BIND FAILED on {}:{}:\n{}".format(HOST, port, traceback.format_exc()))
|
||||
print("TinqsMDBridge: port {} busy -- another session active? see {}".format(
|
||||
port, LOG_PATH))
|
||||
return
|
||||
sock.listen(5)
|
||||
sock.settimeout(ACCEPT_POLL_TIMEOUT_S)
|
||||
|
||||
api_ns, missing = _import_md_api()
|
||||
try:
|
||||
source = os.path.abspath(__file__)
|
||||
except NameError:
|
||||
source = "<unknown -- __file__ not set by Plug-in Manager>"
|
||||
|
||||
ns = dict(api_ns)
|
||||
ns["BRIDGE"] = {
|
||||
"version": VERSION,
|
||||
"mode": "mainloop",
|
||||
"port": port,
|
||||
"idle_timeout_s": idle_timeout,
|
||||
"source": source,
|
||||
"api_modules": sorted(api_ns.keys()),
|
||||
"api_missing": missing,
|
||||
"python": sys.version,
|
||||
}
|
||||
|
||||
_log("serving on {}:{} api={} missing={} python={}".format(
|
||||
HOST, port, sorted(api_ns.keys()), missing, sys.version.split()[0]))
|
||||
print("TinqsMDBridge v{}: serving on {}:{}".format(VERSION, HOST, port))
|
||||
print("MD's UI is frozen while the bridge session runs -- this is normal.")
|
||||
print("End the session with: python tools/md_bridge.py --stop")
|
||||
print("(auto-ends after {:.0f}s idle)".format(idle_timeout))
|
||||
|
||||
served = 0
|
||||
deadline = time.monotonic() + idle_timeout
|
||||
try:
|
||||
while True:
|
||||
if time.monotonic() > deadline:
|
||||
_log("idle timeout after {} requests -- session over".format(served))
|
||||
print("TinqsMDBridge: idle timeout, session over (served {})".format(served))
|
||||
return
|
||||
try:
|
||||
conn, _addr = sock.accept()
|
||||
except socket.timeout:
|
||||
continue
|
||||
except OSError:
|
||||
_log("server socket died:\n{}".format(traceback.format_exc()))
|
||||
return
|
||||
try:
|
||||
try:
|
||||
req = _read_request(conn)
|
||||
except Exception:
|
||||
_respond(conn, {"id": None, "ok": False,
|
||||
"error": "invalid JSON request", "stdout": ""})
|
||||
continue
|
||||
if req is None:
|
||||
continue
|
||||
code = req.get("code", "")
|
||||
if code.strip() == STOP_SENTINEL:
|
||||
_respond(conn, {"id": req.get("id"), "ok": True,
|
||||
"result": "stopped", "stdout": ""})
|
||||
_log("stop command -- session over, served {}".format(served))
|
||||
print("TinqsMDBridge: stopped by client (served {})".format(served))
|
||||
return
|
||||
resp = _execute(ns, code)
|
||||
resp["id"] = req.get("id")
|
||||
served += 1
|
||||
deadline = time.monotonic() + idle_timeout
|
||||
if not resp["ok"]:
|
||||
last = resp["error"].strip().splitlines()[-1] if resp["error"] else "?"
|
||||
_log("request id={} ok=false: {}".format(req.get("id"), last))
|
||||
_respond(conn, resp)
|
||||
except Exception:
|
||||
_log("connection error:\n{}".format(traceback.format_exc()))
|
||||
finally:
|
||||
try:
|
||||
conn.close()
|
||||
except Exception:
|
||||
pass
|
||||
finally:
|
||||
try:
|
||||
sock.close()
|
||||
except Exception:
|
||||
pass
|
||||
_log("socket closed, session ended")
|
||||
|
||||
|
||||
try:
|
||||
_serve()
|
||||
except Exception:
|
||||
_log("session CRASHED:\n{}".format(traceback.format_exc()))
|
||||
print("TinqsMDBridge: crashed -- see {}".format(LOG_PATH))
|
||||
@@ -0,0 +1,109 @@
|
||||
{
|
||||
"import_api.ImportAvatar": "ImportAvatar(arg0: str, arg1: Marvelous::ImportExportOption) -> bool\n",
|
||||
"import_api.ImportFBX": "ImportFBX(arg0: str, arg1: Marvelous::ImportExportOption) -> bool\n",
|
||||
"import_api.ImportOBJ": "ImportOBJ(arg0: str, arg1: Marvelous::ImportExportOption) -> bool\n",
|
||||
"import_api.ImportFile": "ImportFile(*args, **kwargs)\nOverloaded function.\n\n1. ImportFile(arg0: str) -> bool\n\n2. ImportFile(arg0: str, arg1: Marvelous::ImportExportOption) -> bool\n",
|
||||
"import_api.ImportZpac": "ImportZpac(arg0: str, arg1: Marvelous::ImportExportOption) -> bool\n",
|
||||
"import_api.ImportPose": "ImportPose(*args, **kwargs)\nOverloaded function.\n\n1. ImportPose(arg0: str) -> bool\n\n2. ImportPose(arg0: str, arg1: bool, arg2: bool) -> bool\n",
|
||||
"export_api.ExportSnapshot3D": "ExportSnapshot3D(*args, **kwargs)\nOverloaded function.\n\n1. ExportSnapshot3D(arg0: str) -> List[List[str]]\n\n2. ExportSnapshot3D() -> List[List[str]]\n",
|
||||
"export_api.ExportCustomViewSnapshot": "ExportCustomViewSnapshot(_targetFolderPath: str, _width: int, _height: int, _outputPrefix: str = '') -> List[str]\n",
|
||||
"export_api.ExportFBX": "ExportFBX(*args, **kwargs)\nOverloaded function.\n\n1. ExportFBX(arg0: Marvelous::ImportExportOption) -> List[str]\n\n2. ExportFBX(arg0: str, arg1: Marvelous::ImportExportOption) -> List[str]\n",
|
||||
"export_api.ExportOBJ": "ExportOBJ(*args, **kwargs)\nOverloaded function.\n\n1. ExportOBJ() -> List[str]\n\n2. ExportOBJ(arg0: str) -> List[str]\n\n3. ExportOBJ(arg0: Marvelous::ImportExportOption) -> List[str]\n\n4. ExportOBJ(arg0: str, arg1: Marvelous::ImportExportOption) -> List[str]\n",
|
||||
"export_api.ExportZPac": "ExportZPac(*args, **kwargs)\nOverloaded function.\n\n1. ExportZPac() -> str\n\n2. ExportZPac(arg0: str) -> str\n",
|
||||
"export_api.ExportTurntableImages": "ExportTurntableImages(*args, **kwargs)\nOverloaded function.\n\n1. ExportTurntableImages(arg0: int) -> List[str]\n\n2. ExportTurntableImages(_filePath: str, _numberOfImages: int, _width: int = 2500, _height: int = 2500, _startIndex: int = 0) -> List[str]\n",
|
||||
"export_api.GetAvatarCount": "GetAvatarCount() -> int\n",
|
||||
"export_api.GetAvatarNameList": "GetAvatarNameList() -> List[str]\n",
|
||||
"pattern_api.CreatePatternWithPoints": "CreatePatternWithPoints(arg0: List[Tuple[float, float, int]]) -> int\n",
|
||||
"pattern_api.CreateInternalShapeWithPoints": "CreateInternalShapeWithPoints(arg0: int, arg1: List[Tuple[float, float, int]], arg2: bool) -> int\n",
|
||||
"pattern_api.AddSeamlinePairGroup": "AddSeamlinePairGroup(*args, **kwargs)\nOverloaded function.\n\n1. AddSeamlinePairGroup(arg0: int, arg1: int, arg2: int, arg3: int, arg4: bool, arg5: bool) -> bool\n\n2. AddSeamlinePairGroup(arg0: int, arg1: int, arg2: int, arg3: int, arg4: int, arg5: bool, arg6: bool) -> bool\n\n3. AddSeamlinePairGroup(arg0: int, arg1: int, arg2: int, arg3: int, arg4: int, arg5: int, arg6: bool, arg7: bool) -> bool\n",
|
||||
"pattern_api.GetSeamlinePairGroupCount": "GetSeamlinePairGroupCount() -> int\n",
|
||||
"pattern_api.SetArrangement": "SetArrangement(arg0: int, arg1: int) -> None\n",
|
||||
"pattern_api.SetArrangementPosition": "SetArrangementPosition(arg0: int, arg1: int, arg2: int, arg3: int) -> None\n",
|
||||
"pattern_api.SetArrangementOrientation": "SetArrangementOrientation(arg0: int, arg1: int) -> None\n",
|
||||
"pattern_api.GetArrangementList": "GetArrangementList() -> List[Dict[str, str]]\n",
|
||||
"pattern_api.GetArrangementOfPattern": "GetArrangementOfPattern(*args, **kwargs)\nOverloaded function.\n\n1. GetArrangementOfPattern() -> List[Dict[str, str]]\n\n2. GetArrangementOfPattern(arg0: int) -> Dict[str, str]\n\n3. GetArrangementOfPattern(arg0: str) -> Dict[str, str]\n",
|
||||
"pattern_api.SetPatternPiecePos": "SetPatternPiecePos(arg0: int, arg1: float, arg2: float) -> None\n",
|
||||
"pattern_api.SetPatternPieceMove": "SetPatternPieceMove(arg0: int, arg1: float, arg2: float) -> None\n",
|
||||
"pattern_api.MovePatternPoint": "MovePatternPoint(arg0: int, arg1: int, arg2: float, arg3: float) -> None\n",
|
||||
"pattern_api.FlipPatternPiece": "FlipPatternPiece(arg0: int, arg1: bool, arg2: bool) -> None\n",
|
||||
"pattern_api.GetPatternIndexList": "<missing>",
|
||||
"pattern_api.GetPatternInformation": "GetPatternInformation(arg0: int) -> str\n",
|
||||
"pattern_api.SetPatternPieceElastic": "SetPatternPieceElastic(arg0: int, arg1: int, arg2: bool) -> None\n",
|
||||
"pattern_api.DeletePatternPiece": "DeletePatternPiece(arg0: int) -> None\n",
|
||||
"fabric_api.GetFabricList": "<missing>",
|
||||
"fabric_api.GetFabricIndexForPattern": "GetFabricIndexForPattern(arg0: int) -> int\n",
|
||||
"fabric_api.SetFabricForPattern": "<missing>",
|
||||
"fabric_api.AddFabric": "AddFabric(arg0: str) -> int\n",
|
||||
"fabric_api.SetFabricColor": "<missing>",
|
||||
"utility_api.Simulate": "Simulate(arg0: int) -> bool\n",
|
||||
"utility_api.NewProject": "NewProject() -> None\n",
|
||||
"utility_api.OpenProject": "<missing>",
|
||||
"utility_api.SaveProjectFile": "<missing>",
|
||||
"utility_api.SetColorwayIndex": "<missing>",
|
||||
"utility_api.DeleteAvatar": "DeleteAvatar(arg0: List[int]) -> bool\n",
|
||||
"utility_api.AlignAvatarsAndGarmentToCenter": "AlignAvatarsAndGarmentToCenter() -> None\n",
|
||||
"utility_api.ResetSimulation": "<missing>",
|
||||
"utility_api.SetSimulationQuality": "SetSimulationQuality(arg0: int, arg1: int) -> None\n",
|
||||
"utility_api.GetCurrentProjectFilePath": "<missing>",
|
||||
"ApiTypes.ImportExportOption": "<missing>",
|
||||
"ApiTypes.ImportExportOption.members": [
|
||||
"ImportObjectType",
|
||||
"axisX",
|
||||
"axisY",
|
||||
"axisZ",
|
||||
"bAdd",
|
||||
"bAddArrangementPoints",
|
||||
"bAutoCreateFittingSuit",
|
||||
"bAutoTranslate",
|
||||
"bAvatarUnifiedUVCoordinates",
|
||||
"bClothUnifiedUVCoordinates",
|
||||
"bCreateAvatarCacheAnimation",
|
||||
"bCreateAvatarJointAnimation",
|
||||
"bCreateCamera",
|
||||
"bCreateClothCacheAnimation",
|
||||
"bCreateMetallicRoughnessMap",
|
||||
"bCreateUnifiedTexture",
|
||||
"bDiffuseColorCombined",
|
||||
"bEmbedded",
|
||||
"bExcludeAmbient",
|
||||
"bExportAvatar",
|
||||
"bExportFabric",
|
||||
"bExportGarment",
|
||||
"bExportLight",
|
||||
"bIncludeAvatarShape",
|
||||
"bIncludeHiddenObject",
|
||||
"bIncludeInnerShape",
|
||||
"bInvertX",
|
||||
"bInvertY",
|
||||
"bInvertZ",
|
||||
"bMetaData",
|
||||
"bMoveGarment",
|
||||
"bOpacityMap",
|
||||
"bSaveColorWays",
|
||||
"bSaveColorWaysSingleFile",
|
||||
"bSaveInZip",
|
||||
"bSingleObject",
|
||||
"bSizeAndPoseFromAvatar",
|
||||
"bThin",
|
||||
"bTrace2DPatternsUVMap",
|
||||
"bUnifiedDiffuseMap",
|
||||
"bUnifiedDisplacementMap",
|
||||
"bUnifiedMetalnessMap",
|
||||
"bUnifiedNormalMap",
|
||||
"bUnifiedOpacityMap",
|
||||
"bUnifiedRoughnessMap",
|
||||
"bUnifiedUVCoordinates",
|
||||
"bUseInifinteSeams",
|
||||
"fbxSdkVersion",
|
||||
"m_AuthenticationKeyForAPI",
|
||||
"scale",
|
||||
"translationValueX",
|
||||
"translationValueY",
|
||||
"translationValueZ",
|
||||
"unifiedTextureBakeMargin",
|
||||
"unifiedTextureBakeRelateive",
|
||||
"unifiedTextureFillSeamSize",
|
||||
"unifiedTextureSize",
|
||||
"weldType"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,702 @@
|
||||
{
|
||||
"ApiTypes": [
|
||||
"AlembicUnit",
|
||||
"AttachFileInfo",
|
||||
"CLOAPI_ANCHOR_CENTER",
|
||||
"CLOAPI_ANCHOR_DOWN",
|
||||
"CLOAPI_ANCHOR_LEFT",
|
||||
"CLOAPI_ANCHOR_LEFT_DOWN",
|
||||
"CLOAPI_ANCHOR_LEFT_UP",
|
||||
"CLOAPI_ANCHOR_RIGHT",
|
||||
"CLOAPI_ANCHOR_RIGHT_DOWN",
|
||||
"CLOAPI_ANCHOR_RIGHT_UP",
|
||||
"CLOAPI_ANCHOR_UP",
|
||||
"CLO_API_TECH_PACK",
|
||||
"CLO_DUMMY",
|
||||
"CLO_SET_SREST",
|
||||
"CLO_SET_TECH_PACK",
|
||||
"CLO_TECH_PACK",
|
||||
"CloApiAnchorPoint",
|
||||
"CloApiGraphicDimensions",
|
||||
"CloApiGraphicPlacementPoints",
|
||||
"CloApiGraphicPosition",
|
||||
"CloApiRestRequest",
|
||||
"CloApiRestResponse",
|
||||
"CloApiRgb",
|
||||
"CloApiRgba",
|
||||
"CloGroundData",
|
||||
"DEFAULT_WELDED",
|
||||
"ExportDxfOption",
|
||||
"ExportTechPackType",
|
||||
"ExportTechpackOption",
|
||||
"ExportUSDOption",
|
||||
"FULLY_UNWELDED",
|
||||
"FULLY_WELDED",
|
||||
"GRAPHIC_REMOVE_BROWSER_ONLY",
|
||||
"GRAPHIC_REMOVE_PATTERN_AND_BROWSER",
|
||||
"GRAPHIC_REMOVE_PATTERN_ONLY",
|
||||
"GraphicRemoveMode",
|
||||
"ImportAlembicOption",
|
||||
"ImportDxfOption",
|
||||
"ImportExportOption",
|
||||
"ImportZPRJOption",
|
||||
"MimeData",
|
||||
"OB_TYPE_BUTTON",
|
||||
"OB_TYPE_BUTTON_HOLE",
|
||||
"OB_TYPE_FABRIC",
|
||||
"OB_TYPE_GRAPHIC",
|
||||
"OB_TYPE_PUCKERING",
|
||||
"OB_TYPE_TRIM",
|
||||
"OB_TYPE_ZIPPER",
|
||||
"ObjRegisterOptions",
|
||||
"ObjectBrowserContextOptions",
|
||||
"ObjectBrowserType",
|
||||
"PatternSnapShotColorwayOption",
|
||||
"PatternSnapShotImageOption",
|
||||
"PatternSnapShotInformationOption",
|
||||
"PatternSnapShotLineOption",
|
||||
"PatternSnapShotLineType",
|
||||
"PatternSnapShotPaperPreset",
|
||||
"PatternSnapShotPaperUnit",
|
||||
"PatternSnapShotPrintType",
|
||||
"PatternSnapShotSizeOption",
|
||||
"PropertyEditorContextOptions",
|
||||
"RenderImageVideoOptions",
|
||||
"RenderPropertyOptions",
|
||||
"SELECTED_WELDED",
|
||||
"TEXTURE_MAP_BASE_COLOR",
|
||||
"TEXTURE_MAP_DISPLACEMENT",
|
||||
"TEXTURE_MAP_METALNESS",
|
||||
"TEXTURE_MAP_NORMAL",
|
||||
"TEXTURE_MAP_OPACITY",
|
||||
"TEXTURE_MAP_ROUGHNESS",
|
||||
"TextureMapTarget",
|
||||
"TransformOptions",
|
||||
"VideoExportOption",
|
||||
"WELD_TYPE",
|
||||
"WindControllerOptions",
|
||||
"ZIPPER_OBJECT_BOTTOM_CLOSED_STOPPER",
|
||||
"ZIPPER_OBJECT_BOTTOM_OPEN_STOPPER",
|
||||
"ZIPPER_OBJECT_PULLER",
|
||||
"ZIPPER_OBJECT_SLIDER",
|
||||
"ZIPPER_OBJECT_SLIDER_PULLER",
|
||||
"ZIPPER_OBJECT_TEETH",
|
||||
"ZIPPER_OBJECT_TOP_STOPPER",
|
||||
"ZIPPER_SCALE_8_6_FEET",
|
||||
"ZIPPER_SCALE_8_FEET",
|
||||
"ZIPPER_SCALE_AUTO",
|
||||
"ZIPPER_SCALE_CM",
|
||||
"ZIPPER_SCALE_FEET",
|
||||
"ZIPPER_SCALE_INCH",
|
||||
"ZIPPER_SCALE_M",
|
||||
"ZIPPER_SCALE_MM",
|
||||
"ZipperObjectType",
|
||||
"ZipperScaleUnit"
|
||||
],
|
||||
"export_api": [
|
||||
"ExportAVT",
|
||||
"ExportAVTW",
|
||||
"ExportAlembic",
|
||||
"ExportAlembicW",
|
||||
"ExportAnimationVideo",
|
||||
"ExportAnimationVideoW",
|
||||
"ExportCustomViewSnapshot",
|
||||
"ExportCustomViewSnapshotW",
|
||||
"ExportFBX",
|
||||
"ExportFBXW",
|
||||
"ExportOBJ",
|
||||
"ExportOBJW",
|
||||
"ExportPose",
|
||||
"ExportPoseW",
|
||||
"ExportSnapshot2D",
|
||||
"ExportSnapshot3D",
|
||||
"ExportSnapshot3DW",
|
||||
"ExportThumbnail3D",
|
||||
"ExportThumbnail3DW",
|
||||
"ExportTopStitchStyle",
|
||||
"ExportTurntableImages",
|
||||
"ExportTurntableImagesW",
|
||||
"ExportTurntableVideo",
|
||||
"ExportTurntableVideoW",
|
||||
"ExportUSD",
|
||||
"ExportUSDW",
|
||||
"ExportZCMR",
|
||||
"ExportZPac",
|
||||
"ExportZPacW",
|
||||
"ExportZPrj",
|
||||
"ExportZPrjW",
|
||||
"GenerateZcmrFrom3DWindow",
|
||||
"GetAvatarCount",
|
||||
"GetAvatarGenderList",
|
||||
"GetAvatarNameList",
|
||||
"GetAvatarNameListW",
|
||||
"~ExportAPIInterface"
|
||||
],
|
||||
"fabric_api": [
|
||||
"AddFabric",
|
||||
"AddFabricW",
|
||||
"AddTextureToPatterns",
|
||||
"AssignFabricToPattern",
|
||||
"AutoGenerateFabricDisplacementMap",
|
||||
"AutoGenerateFabricNormalMap",
|
||||
"AutoGenerateFabricOpacityMap",
|
||||
"AutoGenerateFabricRoughnessMap",
|
||||
"CombineZfab",
|
||||
"CreateZfabFromTextures",
|
||||
"DeleteFabric",
|
||||
"DeleteFabricDisplacementMap",
|
||||
"DeleteFabricNormalMap",
|
||||
"DeleteFabricOpacityMap",
|
||||
"DeleteFabricRoughnessMap",
|
||||
"ExportFabric",
|
||||
"ExportFabricW",
|
||||
"ExportZFab",
|
||||
"ExportZFabW",
|
||||
"GetAPIMetaDataFromFile",
|
||||
"GetAPIMetaDataFromFileW",
|
||||
"GetBaseTextureMapImageFilePath",
|
||||
"GetBaseTextureMapImageFilePathW",
|
||||
"GetCurrentFabricIndex",
|
||||
"GetDisplacementMapImageFilePath",
|
||||
"GetDisplacementMapImageFilePathW",
|
||||
"GetFabricCount",
|
||||
"GetFabricIndex",
|
||||
"GetFabricIndexForPattern",
|
||||
"GetFabricIndexW",
|
||||
"GetFabricInfo",
|
||||
"GetFabricInfoW",
|
||||
"GetFabricInformation",
|
||||
"GetFabricInformationW",
|
||||
"GetFabricItemNo",
|
||||
"GetFabricItemNoW",
|
||||
"GetFabricLength",
|
||||
"GetFabricName",
|
||||
"GetFabricNameW",
|
||||
"GetFabricPBRMaterialBaseColor",
|
||||
"GetFabricStyleNameList",
|
||||
"GetFabricTextureMappingType",
|
||||
"GetFirstFabricTextureName",
|
||||
"GetFirstFabricTextureNameW",
|
||||
"GetMaterialType",
|
||||
"GetMetalness",
|
||||
"GetMetalnessMapImageFilePath",
|
||||
"GetMetalnessMapImageFilePathW",
|
||||
"GetNormalMapImageFilePath",
|
||||
"GetNormalMapImageFilePathW",
|
||||
"GetNormalMapIntensity",
|
||||
"GetOpacityIntensity",
|
||||
"GetOpacityMapImageFilePath",
|
||||
"GetOpacityMapImageFilePathW",
|
||||
"GetPBRMaterialDisplacementMapValue",
|
||||
"GetPrimaryFabric",
|
||||
"GetReflectionIntensity",
|
||||
"GetReflectionRoughness",
|
||||
"GetRoughnessMapImageFilePath",
|
||||
"GetRoughnessMapImageFilePathW",
|
||||
"GetRoughnessType",
|
||||
"GetRoughnessValueIntensity",
|
||||
"GetRoughnessValueMapIntensity",
|
||||
"GetUseSameColorAsFront",
|
||||
"GetUseSameMaterialAsFront",
|
||||
"ImportSubstanceFile",
|
||||
"ImportSubstanceFileAsFaceType",
|
||||
"ImportSubstanceFileAsFaceTypeW",
|
||||
"ImportSubstanceFileW",
|
||||
"IsRoughnessValueMapInvert",
|
||||
"ReplaceFabric",
|
||||
"SetBaseTextureMapImageGivenFilePath",
|
||||
"SetBaseTextureMapImageGivenFilePathW",
|
||||
"SetCurrentFabricIndex",
|
||||
"SetCustomImage",
|
||||
"SetCustomImageW",
|
||||
"SetDisplacementMapImageGivenFilePath",
|
||||
"SetDisplacementMapImageGivenFilePathW",
|
||||
"SetFabricInformation",
|
||||
"SetFabricInformationW",
|
||||
"SetFabricItemNo",
|
||||
"SetFabricItemNoW",
|
||||
"SetFabricName",
|
||||
"SetFabricNameW",
|
||||
"SetFabricPBRMaterialBaseColor",
|
||||
"SetMaterialType",
|
||||
"SetMetalness",
|
||||
"SetMetalnessMapImageGivenFilePath",
|
||||
"SetMetalnessMapImageGivenFilePathW",
|
||||
"SetNormalMapImageGivenFilePath",
|
||||
"SetNormalMapImageGivenFilePathW",
|
||||
"SetNormalMapIntensity",
|
||||
"SetOpacityIntensity",
|
||||
"SetOpacityMapImageGivenFilePath",
|
||||
"SetOpacityMapImageGivenFilePathW",
|
||||
"SetPBRMaterialDisplacementMap",
|
||||
"SetPBRMaterialDisplacementMapValue",
|
||||
"SetReflectionIntensity",
|
||||
"SetReflectionRoughness",
|
||||
"SetRoughnessMapImageGivenFilePath",
|
||||
"SetRoughnessMapImageGivenFilePathW",
|
||||
"SetRoughnessType",
|
||||
"SetRoughnessValueIntensity",
|
||||
"SetRoughnessValueMapIntensity",
|
||||
"SetRoughnessValueMapInvert",
|
||||
"SetSubstancePreset",
|
||||
"SetSubstanceResolution",
|
||||
"SetTextureMapping",
|
||||
"SetUseSameColorAsFront",
|
||||
"SetUseSameMaterialAsFront",
|
||||
"TransformAOPOnFabric",
|
||||
"~FabricAPIInterface"
|
||||
],
|
||||
"import_api": [
|
||||
"ImportAlembic",
|
||||
"ImportAsGraphic",
|
||||
"ImportAsGraphicW",
|
||||
"ImportAvatar",
|
||||
"ImportAvatarMeasurement",
|
||||
"ImportFBX",
|
||||
"ImportFBXW",
|
||||
"ImportFile",
|
||||
"ImportFileW",
|
||||
"ImportGraphicStyleFromImage",
|
||||
"ImportMeasurement",
|
||||
"ImportOBJ",
|
||||
"ImportOBJW",
|
||||
"ImportPose",
|
||||
"ImportPoseW",
|
||||
"ImportSMP",
|
||||
"ImportSMPW",
|
||||
"ImportTrim",
|
||||
"ImportZpac",
|
||||
"ImportZprj",
|
||||
"ImportZprjW",
|
||||
"~ImportAPIInterface"
|
||||
],
|
||||
"pattern_api": [
|
||||
"AddGraphicStyleToPattern",
|
||||
"AddSeamlinePairGroup",
|
||||
"AddSeamlineTopstitch",
|
||||
"AddSegmentTopstitch",
|
||||
"ConvertToBaseLine",
|
||||
"ConvertToInternalLine",
|
||||
"CopyPatternPieceMove",
|
||||
"CopyPatternPiecePos",
|
||||
"CreateBaseShapeWithPoints",
|
||||
"CreateInternalShapeWithPoints",
|
||||
"CreatePatternWithPoints",
|
||||
"DeleteLine",
|
||||
"DeletePatternPiece",
|
||||
"DeletePoint",
|
||||
"DistribueInternalLinesbetweenSegments",
|
||||
"ExportObjectBrowserMaterialsList",
|
||||
"ExportPatternJSON",
|
||||
"FitPatternUVToUDIM",
|
||||
"FlipPatternPiece",
|
||||
"GetAddlThicknessCollisionValue",
|
||||
"GetAllStitchProperty",
|
||||
"GetArrangementList",
|
||||
"GetArrangementOfPattern",
|
||||
"GetArrangementOfPatternW",
|
||||
"GetBackUVExpansion",
|
||||
"GetBoundingBoxOfPattern",
|
||||
"GetBoundingBoxOfPatternW",
|
||||
"GetGradingSizeQuantityMix",
|
||||
"GetGradingSizeTotalQuantity",
|
||||
"GetLineLength",
|
||||
"GetLinkedPatternIndex",
|
||||
"GetLinkedPatternLists",
|
||||
"GetMeshCountByType",
|
||||
"GetMeshCountByTypeW",
|
||||
"GetParticleDistanceOfPattern",
|
||||
"GetParticleDistanceOfPatternW",
|
||||
"GetPatternArchiveState",
|
||||
"GetPatternAssignedTopstitch",
|
||||
"GetPatternAssignedTopstitchCount",
|
||||
"GetPatternAssignedTopstitchCurvedLength",
|
||||
"GetPatternAssignedTopstitchStyle",
|
||||
"GetPatternAssignedTopstitchStyleIndex",
|
||||
"GetPatternAssignedTopstitchZOffset",
|
||||
"GetPatternCount",
|
||||
"GetPatternIndex",
|
||||
"GetPatternIndexFrom2DView",
|
||||
"GetPatternIndexFrom3DView",
|
||||
"GetPatternIndexW",
|
||||
"GetPatternInformation",
|
||||
"GetPatternInformationW",
|
||||
"GetPatternInputInformation",
|
||||
"GetPatternInputInformationW",
|
||||
"GetPatternLayer",
|
||||
"GetPatternPieceArea",
|
||||
"GetPatternPieceCategory",
|
||||
"GetPatternPieceClassification",
|
||||
"GetPatternPieceFabricIndex",
|
||||
"GetPatternPieceGrainDirection",
|
||||
"GetPatternPieceName",
|
||||
"GetPatternPiecePos",
|
||||
"GetPatternPieceSolidifyStrengthen",
|
||||
"GetPatternSize",
|
||||
"GetPatternsAttachedToAvatarMeasures",
|
||||
"GetPinListSize",
|
||||
"GetSeamlinePairGroupCount",
|
||||
"GetSeamlinePairGroupIndexFromName",
|
||||
"GetSeamlinePairGroupIndexFromNameW",
|
||||
"GetSeamlinePairGroupListInPattern",
|
||||
"GetSeamlinePairGroupName",
|
||||
"GetSeamlinePairGroupNameW",
|
||||
"GetSelectedPattern",
|
||||
"GetSelectedPatternViaIndex",
|
||||
"GetShrinkagePercentage",
|
||||
"GetShrinkagePercentageW",
|
||||
"GetSideUVExpansion",
|
||||
"GetTopstitchStyleList",
|
||||
"GetTopstitchStyleModelType",
|
||||
"ImportPatternJSON",
|
||||
"ImportTopStitchStyle",
|
||||
"InstancePatternPiece",
|
||||
"InstancePatternPieceWithPatternName",
|
||||
"IsPatternAssignedTopstitchCurved",
|
||||
"IsPatternAssignedTopstitchCurvedRightAngled",
|
||||
"IsPatternAssignedTopstitchExtendEnd",
|
||||
"IsPatternAssignedTopstitchExtendStart",
|
||||
"IsPatternPieceSolidify",
|
||||
"LayerClonePatternPieceMove",
|
||||
"LayerClonePatternPiecePos",
|
||||
"MovePatternPoint",
|
||||
"OffsetAsInternalLine",
|
||||
"RemoveAllPins",
|
||||
"RemovePin",
|
||||
"SelectPatternViaIndex",
|
||||
"SelectPatternViaName",
|
||||
"SetAddlThicknessCollision",
|
||||
"SetArrangement",
|
||||
"SetArrangementOrientation",
|
||||
"SetArrangementPosition",
|
||||
"SetArrangementShapeStyle",
|
||||
"SetArrangementShapeStyleW",
|
||||
"SetBackUVExpansion",
|
||||
"SetGradingSizeQuantityMix",
|
||||
"SetHeightShrinkagePercentage",
|
||||
"SetMeshType",
|
||||
"SetMeshTypeW",
|
||||
"SetParticleDistanceOfPattern",
|
||||
"SetParticleDistanceOfPatterns",
|
||||
"SetPatternArchiveState",
|
||||
"SetPatternAssignedTopstitchCurved",
|
||||
"SetPatternAssignedTopstitchCurvedLength",
|
||||
"SetPatternAssignedTopstitchCurvedRightAngled",
|
||||
"SetPatternAssignedTopstitchExtendEnd",
|
||||
"SetPatternAssignedTopstitchExtendStart",
|
||||
"SetPatternAssignedTopstitchStyle",
|
||||
"SetPatternAssignedTopstitchZOffset",
|
||||
"SetPatternFreeze",
|
||||
"SetPatternHide3D",
|
||||
"SetPatternLayer",
|
||||
"SetPatternLock",
|
||||
"SetPatternPieceCategory",
|
||||
"SetPatternPieceClassification",
|
||||
"SetPatternPieceElastic",
|
||||
"SetPatternPieceElasticSegmentLength",
|
||||
"SetPatternPieceElasticStrength",
|
||||
"SetPatternPieceElasticStrengthRatio",
|
||||
"SetPatternPieceElasticTotalLength",
|
||||
"SetPatternPieceFabricIndex",
|
||||
"SetPatternPieceGrainDirection",
|
||||
"SetPatternPieceMove",
|
||||
"SetPatternPieceName",
|
||||
"SetPatternPiecePos",
|
||||
"SetPatternPieceSametapingWidth",
|
||||
"SetPatternPieceSeamtaping",
|
||||
"SetPatternPieceShirring",
|
||||
"SetPatternPieceShirringExtend",
|
||||
"SetPatternPieceShirringHeight",
|
||||
"SetPatternPieceShirringInterval",
|
||||
"SetPatternPieceSolidify",
|
||||
"SetPatternPieceSolidifyStrengthen",
|
||||
"SetPatternStrengthen",
|
||||
"SetSideUVExpansion",
|
||||
"SetTopstitchStyleModelType",
|
||||
"SetWidthShrinkagePercentage",
|
||||
"SymmetryPatternPiece",
|
||||
"SymmetryPatternPieceWithPatternName",
|
||||
"UnfoldPatternPiece",
|
||||
"UnfoldPatternPieceWithPatternName"
|
||||
],
|
||||
"utility_api": [
|
||||
"ABPNetworkAuth",
|
||||
"AddBlockTypeToStyle",
|
||||
"AddColorSwatch",
|
||||
"AddColorSwatchW",
|
||||
"AddGraphicStyleFromImageFile",
|
||||
"AddGraphicStyleToPattern",
|
||||
"AddGraphicStyleToPatternV2",
|
||||
"AddLibraryColorSwatchList",
|
||||
"AddLineToCategory",
|
||||
"AddPinsForFabricValidation",
|
||||
"AddStyleToCategory",
|
||||
"AddUserCustomLibraryFolder",
|
||||
"AddUserCustomLibraryFolderW",
|
||||
"AlignAvatarsAndGarmentToCenter",
|
||||
"AutoGenerateGraphicDisplacementMap",
|
||||
"AutoGenerateGraphicNormalMap",
|
||||
"AutoGenerateGraphicOpacityMap",
|
||||
"AutoGenerateGraphicRoughnessMap",
|
||||
"AutoHang",
|
||||
"BakeUVTexture",
|
||||
"BakeUVTextureW",
|
||||
"ChangeMetaDataValueForCurrentGarment",
|
||||
"CheckZPRJForUnsavedChanges",
|
||||
"CopyFromFirstClothCache",
|
||||
"CopyGraphicStyle",
|
||||
"CreateProgressBar",
|
||||
"CreateUserCustomLibrary",
|
||||
"CurrentlyThemeInCLO",
|
||||
"DeleteAvatar",
|
||||
"DeleteColorSwatchLibraryTabByName",
|
||||
"DeleteColorSwatchListItem",
|
||||
"DeleteGraphicDisplacementMap",
|
||||
"DeleteGraphicNormalMap",
|
||||
"DeleteGraphicOpacityMap",
|
||||
"DeleteGraphicRoughnessMap",
|
||||
"DeleteProgressBar",
|
||||
"DeleteUserCustomLibrary",
|
||||
"DeleteUserCustomLibraryFolder",
|
||||
"DeleteWidgets",
|
||||
"DisplayMessageBox",
|
||||
"DisplayMessageBoxW",
|
||||
"FitAllUV",
|
||||
"GenerateZippersFromObj",
|
||||
"Get3DGarmentRenderingStyle",
|
||||
"GetAPIMetaData",
|
||||
"GetAPIMetaDataW",
|
||||
"GetAnimationLayerFrameRange",
|
||||
"GetAvatarOpacityMaps",
|
||||
"GetAvatarProperties",
|
||||
"GetAvatarSoftBodyStiffness",
|
||||
"GetAvatarSubdivisionLevel",
|
||||
"GetAvatarTexureMap",
|
||||
"GetButtonHeadStyleColor",
|
||||
"GetButtonHeadStyleListWithIndex",
|
||||
"GetButtonHoleStyleColor",
|
||||
"GetClothPositions",
|
||||
"GetColorSwatchLibraryTabList",
|
||||
"GetColorSwatchLibraryTabListW",
|
||||
"GetCurrentAnimationFrame",
|
||||
"GetCustomViewInformation",
|
||||
"GetCustomViewInformationW",
|
||||
"GetEndAnimationFrame",
|
||||
"GetGraphicDisplacementMapTexture",
|
||||
"GetGraphicMetalnessMapTexture",
|
||||
"GetGraphicNormalMapTexture",
|
||||
"GetGraphicOpacityMapTexture",
|
||||
"GetGraphicRoughnessMapTexture",
|
||||
"GetGraphicStyleColor",
|
||||
"GetGraphicStyleCount",
|
||||
"GetGraphicStyleDimensions",
|
||||
"GetGraphicStyleDimensionsOnPattern",
|
||||
"GetGraphicStyleListWithIndex",
|
||||
"GetGraphicStyleName",
|
||||
"GetGraphicStylePatternPieceIndices",
|
||||
"GetGraphicStylePlacementPoints",
|
||||
"GetGraphicStylePosition",
|
||||
"GetMajorVersion",
|
||||
"GetMaterialTextureTransformations",
|
||||
"GetMetaDataForCurrentGarment",
|
||||
"GetMetaDataForCurrentGarmentW",
|
||||
"GetMinorVersion",
|
||||
"GetNormalBlendingMethod",
|
||||
"GetPatchVersion",
|
||||
"GetPatternSnapShotImageOption",
|
||||
"GetPatternSnapShotInformationOption",
|
||||
"GetPatternSnapShotLineOption",
|
||||
"GetPatternSnapShotSizeOption",
|
||||
"GetProjectFilePath",
|
||||
"GetProjectFilePathW",
|
||||
"GetProjectName",
|
||||
"GetProjectNameW",
|
||||
"GetQualityRenderStatus",
|
||||
"GetRenderImageVideoProperties",
|
||||
"GetRenderingProperties",
|
||||
"GetSchematicRender",
|
||||
"GetSimulationQuality",
|
||||
"GetStartAnimationFrame",
|
||||
"GetStyleSheetCodeForWidget",
|
||||
"GetStyleSheetCodeForWidgetW",
|
||||
"GetTopStitchColor",
|
||||
"GetTopStitchCount",
|
||||
"GetTopStitchDistanceValue",
|
||||
"GetTopStitchIndex",
|
||||
"GetTopStitchName",
|
||||
"GetTopStitchNumberOfLines",
|
||||
"GetTopStitchOffsetIndex",
|
||||
"GetTopStitchOffsetValue",
|
||||
"GetTopStitchOpacity",
|
||||
"GetTopStitchWidthValue",
|
||||
"GetTotalEndAnimationFrame",
|
||||
"GetTotalGraphicItemQuantity",
|
||||
"GetTrimMaterialProperties",
|
||||
"GetTrimStyleColor",
|
||||
"GetTrimStyleCount",
|
||||
"GetTrimStyleIndex",
|
||||
"GetTrimStyleListWithIndex",
|
||||
"GetTrimStyleName",
|
||||
"GetUserHeadQuarterId",
|
||||
"GetUserHeadQuarterIdW",
|
||||
"GetViewPoint",
|
||||
"GetWindActive",
|
||||
"GetWindControllerSettings",
|
||||
"GetWindPosition",
|
||||
"GetWindRotation",
|
||||
"GetZipperStyleAssetType",
|
||||
"GetZipperStyleFunctionType",
|
||||
"GetZipperStyleName",
|
||||
"GetZipperStyleTapeThickness",
|
||||
"GetZipperStyleTeethType",
|
||||
"GetZipperStyleTeethWidth",
|
||||
"GetZipperStyleWeight",
|
||||
"IsReadableImageFormat",
|
||||
"IsReadableImageFormatW",
|
||||
"IsShowAvatar",
|
||||
"LoadCustomViewIn3DWindow",
|
||||
"LoadLibraryColorSwatchList",
|
||||
"MoveAnimationFrame",
|
||||
"NewProject",
|
||||
"OpenButtonHeadStyleFileByIndex",
|
||||
"OpenGraphicStyleFileByIndex",
|
||||
"OpenTrimStyleFileByIndex",
|
||||
"ReDrape3DArrangement",
|
||||
"Refresh3DWindow",
|
||||
"RegisterPythonScript",
|
||||
"RegisterPythonScriptFolder",
|
||||
"RegisterPythonScriptFolderW",
|
||||
"RegisterPythonScriptW",
|
||||
"RegisterWidget",
|
||||
"RemoveGraphicStyle",
|
||||
"ReplaceGraphicStyleFromImage",
|
||||
"ReplaceGraphicStyleFromImageW",
|
||||
"RepositionGraphicByAnchor",
|
||||
"ResetClothArrangement",
|
||||
"ResetUVTo2DArrangement",
|
||||
"ResetWidgetRegistry",
|
||||
"RunAnimationRecording",
|
||||
"SaveCLOFileThumbnail",
|
||||
"Set3DGarmentRenderingStyle",
|
||||
"Set3DWindowTitle",
|
||||
"Set3DWindowTitleW",
|
||||
"SetAPF",
|
||||
"SetAPIMetaData",
|
||||
"SetAPIMetaDataW",
|
||||
"SetAnimationRecording",
|
||||
"SetAvatarActivation",
|
||||
"SetAvatarMeshTexture",
|
||||
"SetAvatarOpacityMap",
|
||||
"SetAvatarOpacityMapByIndex",
|
||||
"SetAvatarProperties",
|
||||
"SetAvatarSmooth",
|
||||
"SetAvatarSoftBodyStiffness",
|
||||
"SetAvatarTexureMap",
|
||||
"SetBaseTextureMapImageDesaturation",
|
||||
"SetButtonHeadStyleColor",
|
||||
"SetButtonHoleStyleColor",
|
||||
"SetCamViewPoint",
|
||||
"SetColorSwatchLibraryTabName",
|
||||
"SetColorSwatchListItemName",
|
||||
"SetCropBackground",
|
||||
"SetCurrentAnimationFrame",
|
||||
"SetEndAnimationFrame",
|
||||
"SetEnvironmentDisplayProperties",
|
||||
"SetFormat3DBackground",
|
||||
"SetGarmentDisplayProperties",
|
||||
"SetGraphicBaseColorMapTexture",
|
||||
"SetGraphicDisplacementMapTexture",
|
||||
"SetGraphicMetalnessMapTexture",
|
||||
"SetGraphicNormalMapTexture",
|
||||
"SetGraphicOpacityMapTexture",
|
||||
"SetGraphicRoughnessMapTexture",
|
||||
"SetGraphicStyleBaseColorMapTextureDesaturation",
|
||||
"SetGraphicStyleColor",
|
||||
"SetGraphicStyleDimensions",
|
||||
"SetGraphicStyleDimensionsOnPattern",
|
||||
"SetGraphicStyleHeight",
|
||||
"SetGraphicStyleName",
|
||||
"SetGraphicStylePositionOnPattern",
|
||||
"SetGraphicStyleToGraphic",
|
||||
"SetGraphicStyleWidth",
|
||||
"SetMaterialTextureTransformations",
|
||||
"SetMetaDataForCurrentGarment",
|
||||
"SetNormalBlendingMethod",
|
||||
"SetPatternSnapShotImageOption",
|
||||
"SetPatternSnapShotInformationOption",
|
||||
"SetPatternSnapShotLineOption",
|
||||
"SetPatternSnapShotSizeOption",
|
||||
"SetProgress",
|
||||
"SetProgressW",
|
||||
"SetQualityRender",
|
||||
"SetRenderImageVideoProperties",
|
||||
"SetRenderingProperties",
|
||||
"SetSchematicBrightness",
|
||||
"SetSchematicClothColor",
|
||||
"SetSchematicClothRenderType",
|
||||
"SetSchematicInternalLineWidth",
|
||||
"SetSchematicRender",
|
||||
"SetSchematicSeamLineWidth",
|
||||
"SetSchematicSilhouetteLineWidth",
|
||||
"SetSchematicTopstitchLineScalePercent",
|
||||
"SetShowHideAvatar",
|
||||
"SetShowHideColorOptions",
|
||||
"SetShowSchematicInternalLine",
|
||||
"SetShowSchematicSeamLine",
|
||||
"SetShowSchematicSilhouetteLine",
|
||||
"SetShowSchematicTopstitchLine",
|
||||
"SetSimulationAirDamping",
|
||||
"SetSimulationCGFinishCondition",
|
||||
"SetSimulationCGIterationCount",
|
||||
"SetSimulationCGResidual",
|
||||
"SetSimulationGravity",
|
||||
"SetSimulationGroundCollision",
|
||||
"SetSimulationGroundHeight",
|
||||
"SetSimulationLayerBasedCollisionDetection",
|
||||
"SetSimulationNonlinearSimulation",
|
||||
"SetSimulationNumberOfCPUInUse",
|
||||
"SetSimulationNumberOfSimulation",
|
||||
"SetSimulationQuality",
|
||||
"SetSimulationSelfCollisionAvoidanceStiffness",
|
||||
"SetSimulationSelfCollisionIterationCount",
|
||||
"SetSimulationTimeStep",
|
||||
"SetStartAnimationFrame",
|
||||
"SetTopStitchColor",
|
||||
"SetTopStitchDistanceValue",
|
||||
"SetTopStitchName",
|
||||
"SetTopStitchNumberOfLines",
|
||||
"SetTopStitchOffsetIndex",
|
||||
"SetTopStitchOpacity",
|
||||
"SetTopStitchWidthValue",
|
||||
"SetTrimDisplaySettings",
|
||||
"SetTrimMaterialProperties",
|
||||
"SetTrimStyleColor",
|
||||
"SetViewControlDefaults",
|
||||
"SetViewPoint",
|
||||
"SetWindActive",
|
||||
"SetWindControllerSettings",
|
||||
"SetWindPosition",
|
||||
"SetWindRotation",
|
||||
"SetZipperBottomStopperStyle",
|
||||
"SetZipperPullerStyle",
|
||||
"SetZipperSliderStyle",
|
||||
"SetZipperStyleAssetType",
|
||||
"SetZipperStyleFunctionType",
|
||||
"SetZipperStyleName",
|
||||
"SetZipperStyleTapeThickness",
|
||||
"SetZipperStyleTeethType",
|
||||
"SetZipperStyleTeethWidth",
|
||||
"SetZipperStyleWeight",
|
||||
"SetZipperTopStopperStyle",
|
||||
"SetZoomView",
|
||||
"Simulate",
|
||||
"UVPacking",
|
||||
"UnlinkGraphicStyleAllColorways",
|
||||
"UpdateCloStyleForPlugIn",
|
||||
"UpdatePropertyWindow",
|
||||
"ValidateCLOFile",
|
||||
"ValidateCLOFileW",
|
||||
"stringToMD5",
|
||||
"toUtf8"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
# TinqsMDBridge smoke test -- run via:
|
||||
# python tools/md_bridge.py --file tools/md_bridge/smoke_test.py --timeout 120
|
||||
#
|
||||
# Defensive by design: MD's api docs are incomplete and signatures unverified,
|
||||
# so every step is independently try/except'd and the whole thing returns a
|
||||
# step-by-step report instead of dying on the first surprise. Nothing here
|
||||
# should be treated as the "right" calling convention until this has passed
|
||||
# once -- it's a probe, not a recipe.
|
||||
|
||||
import inspect
|
||||
import os
|
||||
import tempfile
|
||||
import traceback
|
||||
|
||||
report = {"steps": []}
|
||||
|
||||
|
||||
def step(name, fn):
|
||||
entry = {"step": name}
|
||||
try:
|
||||
entry["ok"] = True
|
||||
entry["value"] = fn()
|
||||
except Exception:
|
||||
entry["ok"] = False
|
||||
entry["error"] = traceback.format_exc().strip().splitlines()[-1]
|
||||
report["steps"].append(entry)
|
||||
return entry
|
||||
|
||||
|
||||
def docs_of(mod, names):
|
||||
out = {}
|
||||
for n in names:
|
||||
f = getattr(mod, n, None)
|
||||
if f is None:
|
||||
out[n] = "<missing>"
|
||||
continue
|
||||
try:
|
||||
out[n] = str(inspect.signature(f))
|
||||
except (ValueError, TypeError):
|
||||
doc = (getattr(f, "__doc__", "") or "").strip()
|
||||
out[n] = doc.splitlines()[0] if doc else "<no signature/doc>"
|
||||
return out
|
||||
|
||||
|
||||
# 1. what do the key functions actually look like?
|
||||
step("signatures.pattern", lambda: docs_of(pattern_api, [
|
||||
"CreatePatternWithPoints", "AddSeamlinePairGroup", "SetArrangementPosition",
|
||||
"MovePatternPoint", "DeletePatternPiece"]))
|
||||
step("signatures.utility", lambda: docs_of(utility_api, [
|
||||
"NewProject", "Simulate", "GetAvatarCount", "GetAvatarNameList"]))
|
||||
step("signatures.export", lambda: docs_of(export_api, [
|
||||
"ExportSnapshot3D", "ExportCustomViewSnapshot", "ExportGLTF", "ExportFBX"]))
|
||||
|
||||
# 2. fresh project
|
||||
step("NewProject", lambda: utility_api.NewProject())
|
||||
|
||||
# 3. default avatar present?
|
||||
step("avatars", lambda: {
|
||||
"count": utility_api.GetAvatarCount(),
|
||||
"names": utility_api.GetAvatarNameList(),
|
||||
})
|
||||
|
||||
# 4. create a 50cm square pattern (units unverified -- try mm first, the CLO
|
||||
# convention; the snapshot will show which interpretation MD used)
|
||||
SQUARE_MM = [(0.0, 0.0), (500.0, 0.0), (500.0, 500.0), (0.0, 500.0)]
|
||||
|
||||
|
||||
def make_square():
|
||||
return pattern_api.CreatePatternWithPoints(SQUARE_MM)
|
||||
|
||||
|
||||
step("CreatePatternWithPoints(square)", make_square)
|
||||
|
||||
# 5. short drape
|
||||
step("Simulate(30)", lambda: utility_api.Simulate(30))
|
||||
|
||||
# 6. snapshot -- the agent's eyes
|
||||
SNAP = os.path.join(tempfile.gettempdir(), "tinqs_md_smoke.png")
|
||||
|
||||
|
||||
def snap():
|
||||
export_api.ExportSnapshot3D(SNAP)
|
||||
return {"path": SNAP, "exists": os.path.exists(SNAP),
|
||||
"size": os.path.getsize(SNAP) if os.path.exists(SNAP) else 0}
|
||||
|
||||
|
||||
step("ExportSnapshot3D", snap)
|
||||
|
||||
report["passed"] = sum(1 for s in report["steps"] if s["ok"])
|
||||
report["failed"] = sum(1 for s in report["steps"] if not s["ok"])
|
||||
result = report
|
||||
Reference in New Issue
Block a user