dcc-bridge 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. dcc_bridge-1.0.0/.gitignore +11 -0
  2. dcc_bridge-1.0.0/PKG-INFO +445 -0
  3. dcc_bridge-1.0.0/README.md +420 -0
  4. dcc_bridge-1.0.0/pyproject.toml +60 -0
  5. dcc_bridge-1.0.0/src/dcc_bridge/__init__.py +22 -0
  6. dcc_bridge-1.0.0/src/dcc_bridge/__main__.py +10 -0
  7. dcc_bridge-1.0.0/src/dcc_bridge/adapters/__init__.py +27 -0
  8. dcc_bridge-1.0.0/src/dcc_bridge/adapters/base.py +126 -0
  9. dcc_bridge-1.0.0/src/dcc_bridge/adapters/designer.py +99 -0
  10. dcc_bridge-1.0.0/src/dcc_bridge/adapters/max.py +84 -0
  11. dcc_bridge-1.0.0/src/dcc_bridge/adapters/maya.py +79 -0
  12. dcc_bridge-1.0.0/src/dcc_bridge/adapters/painter.py +82 -0
  13. dcc_bridge-1.0.0/src/dcc_bridge/cli/__init__.py +10 -0
  14. dcc_bridge-1.0.0/src/dcc_bridge/cli/cleanup.py +114 -0
  15. dcc_bridge-1.0.0/src/dcc_bridge/cli/main.py +45 -0
  16. dcc_bridge-1.0.0/src/dcc_bridge/cli/run.py +132 -0
  17. dcc_bridge-1.0.0/src/dcc_bridge/cli/setup.py +63 -0
  18. dcc_bridge-1.0.0/src/dcc_bridge/cli/status.py +102 -0
  19. dcc_bridge-1.0.0/src/dcc_bridge/cli/utils.py +63 -0
  20. dcc_bridge-1.0.0/src/dcc_bridge/client.py +196 -0
  21. dcc_bridge-1.0.0/src/dcc_bridge/dcc_types.py +54 -0
  22. dcc_bridge-1.0.0/src/dcc_bridge/debug.py +117 -0
  23. dcc_bridge-1.0.0/src/dcc_bridge/discovery.py +225 -0
  24. dcc_bridge-1.0.0/src/dcc_bridge/execute.py +190 -0
  25. dcc_bridge-1.0.0/src/dcc_bridge/protocol.py +155 -0
  26. dcc_bridge-1.0.0/src/dcc_bridge/reload.py +41 -0
  27. dcc_bridge-1.0.0/src/dcc_bridge/server.py +407 -0
  28. dcc_bridge-1.0.0/src/dcc_bridge/setup/__init__.py +8 -0
  29. dcc_bridge-1.0.0/src/dcc_bridge/setup/base.py +373 -0
  30. dcc_bridge-1.0.0/src/dcc_bridge/setup/designer.py +113 -0
  31. dcc_bridge-1.0.0/src/dcc_bridge/setup/max.py +90 -0
  32. dcc_bridge-1.0.0/src/dcc_bridge/setup/maya.py +140 -0
  33. dcc_bridge-1.0.0/src/dcc_bridge/setup/painter.py +113 -0
  34. dcc_bridge-1.0.0/src/dcc_bridge/start.py +214 -0
@@ -0,0 +1,11 @@
1
+ node_modules
2
+ dist
3
+ out
4
+ __pycache__
5
+ *.py[cod]
6
+ *.egg-info
7
+ .venv
8
+ venv
9
+ *.vsix
10
+ .trae
11
+ .forgejo
@@ -0,0 +1,445 @@
1
+ Metadata-Version: 2.4
2
+ Name: dcc-bridge
3
+ Version: 1.0.0
4
+ Summary: DCC Python bridge: TCP server, CLI, and VS Code extension core for executing Python in DCC tools like Maya and 3ds Max.
5
+ Project-URL: Homepage, https://github.com/yourusername/dcc-python
6
+ Project-URL: Repository, https://github.com/yourusername/dcc-python
7
+ Author: Jbq
8
+ License: PolyForm-Noncommercial-1.0.0
9
+ Keywords: 3dsmax,cli,dcc,maya,substance-painter,vscode
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.7
14
+ Classifier: Programming Language :: Python :: 3.8
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
+ Requires-Python: >=3.7
21
+ Requires-Dist: click>=8.1.8
22
+ Provides-Extra: dev
23
+ Requires-Dist: pytest; extra == 'dev'
24
+ Description-Content-Type: text/markdown
25
+
26
+ # dcc-bridge
27
+
28
+ DCC Python 桥接核心包,提供 DCC 端 TCP 服务端、通用 TCP 客户端、`dcc` CLI、DCC 适配器、代码执行、模块热重载和调试集成。
29
+
30
+ ## 安装
31
+
32
+ ```bash
33
+ pip install dcc-bridge
34
+ ```
35
+
36
+ 安装后自动获得 `dcc` 全局命令。
37
+
38
+ 开发模式:
39
+
40
+ ```bash
41
+ uv tool install -e packages/dcc-bridge
42
+ ```
43
+
44
+ ## 快速开始
45
+
46
+ ```bash
47
+ # 1. 注入自启动脚本(以 3ds Max 为例)
48
+ dcc setup 3dsmax
49
+
50
+ # 2. 打开 DCC,服务自动启动
51
+
52
+ # 3. 验证连接
53
+ dcc status
54
+ dcc ping
55
+
56
+ # 4. 执行代码
57
+ dcc run code "print('hello from DCC')"
58
+ ```
59
+
60
+ ## `dcc` 命令详细用法
61
+
62
+ ### 命令总览
63
+
64
+ ```
65
+ dcc [--version] {run, setup, unsetup, status, ping} ...
66
+ ```
67
+
68
+ | 子命令 | 功能 |
69
+ |---|---|
70
+ | `run` | 在 DCC 中执行 Python 代码或文件 |
71
+ | `setup` | 注入 DCC 自启动脚本(配置一次,永久生效) |
72
+ | `unsetup` | 移除 DCC 自启动脚本 |
73
+ | `status` | 查看桥接状态(实例列表 + 可选 ping) |
74
+ | `ping` | 测试 DCC 桥接服务是否可达 |
75
+
76
+ ---
77
+
78
+ ### `dcc run` — 执行代码
79
+
80
+ 在 DCC 中执行 Python 代码,支持三种输入方式。
81
+
82
+ #### 语法
83
+
84
+ ```
85
+ dcc run {file, code, stdin} [target] [选项]
86
+ ```
87
+
88
+ #### 子命令
89
+
90
+ | 子命令 | 说明 | `target` 参数 |
91
+ |---|---|---|
92
+ | `file` | 执行本地 Python 文件 | 文件路径(必填) |
93
+ | `code` | 执行代码字符串 | Python 代码字符串(必填) |
94
+ | `stdin` | 从标准输入读取代码并执行 | 无需提供 |
95
+
96
+ #### 选项
97
+
98
+ | 选项 | 类型 | 默认值 | 说明 |
99
+ |---|---|---|---|
100
+ | `--port` | int | 自动发现 | 指定目标 DCC 服务端口 |
101
+ | `--dcc-type` | str | 自动发现 | 指定目标 DCC 类型(`maya`、`3dsmax`、`substance_painter`、`substance_designer` 等) |
102
+ | `-r`, `--reload` | flag | 否 | 执行前先重载模块(`file` 重载文件所在目录,`code`/`stdin` 重载当前工作目录) |
103
+ | `--origin` | str | 自动生成 | 自定义 `exec_origin`,用于标识代码来源 |
104
+ | `--plain` | flag | 否 | 输出纯文本而非 JSON |
105
+ | `--json` | flag | 是 | 输出 JSON 格式(默认行为) |
106
+ | `--timeout` | float | 30.0 | 连接超时(秒) |
107
+
108
+ #### 示例
109
+
110
+ ```bash
111
+ # 执行文件
112
+ dcc run file /path/to/script.py
113
+
114
+ # 执行代码字符串
115
+ dcc run code "print('hello')"
116
+
117
+ # 从管道执行
118
+ echo "print('hello')" | dcc run stdin
119
+
120
+ # 执行前先重载模块
121
+ dcc run file ./my_tool.py --reload
122
+
123
+ # 指定端口和超时
124
+ dcc run code "import pymxs; print(pymxs.rt.maxOps())" --port 7002 --timeout 10
125
+
126
+ # 指定 DCC 类型(多实例同时运行时)
127
+ dcc run code "print('maya')" --dcc-type maya
128
+
129
+ # 纯文本输出(只打印 stdout 内容)
130
+ dcc run code "print(1 + 2)" --plain
131
+ ```
132
+
133
+ #### 输出格式
134
+
135
+ **JSON 模式(默认):**
136
+
137
+ ```json
138
+ {
139
+ "success": true,
140
+ "output": ["hello from DCC"],
141
+ "error": null,
142
+ "traceback": null
143
+ }
144
+ ```
145
+
146
+ **纯文本模式(`--plain`):**
147
+
148
+ ```
149
+ hello from DCC
150
+ ```
151
+
152
+ 执行出错时:
153
+
154
+ ```json
155
+ {
156
+ "success": false,
157
+ "output": [],
158
+ "error": "NameError: name 'x' is not defined",
159
+ "traceback": "Traceback (most recent call last):\n ..."
160
+ }
161
+ ```
162
+
163
+ #### 退出码
164
+
165
+ | 退出码 | 含义 |
166
+ |---|---|
167
+ | 0 | 执行成功 |
168
+ | 1 | 未知错误 |
169
+ | 2 | 执行失败(DCC 端返回错误)或参数错误 |
170
+ | 3 | 文件未找到(仅 `file` 子命令) |
171
+
172
+ ---
173
+
174
+ ### `dcc setup` — 注入自启动脚本
175
+
176
+ 在 DCC 的启动目录中写入 `dcc_bridge_startup.py`,DCC 打开后自动启动桥接服务。
177
+
178
+ #### 语法
179
+
180
+ ```
181
+ dcc setup <dcc_type> [--version <版本号>]
182
+ ```
183
+
184
+ #### 参数
185
+
186
+ | 参数 | 必填 | 说明 |
187
+ |---|---|---|
188
+ | `dcc_type` | 是 | DCC 类型:`maya`、`3dsmax`、`substance_painter`、`substance_designer` |
189
+ | `--version` | 否 | 指定版本号。不指定时自动从注册表发现并注入所有已安装版本 |
190
+
191
+ #### 示例
192
+
193
+ ```bash
194
+ # 注入 3ds Max(自动发现所有已安装版本)
195
+ dcc setup 3dsmax
196
+
197
+ # 注入指定版本的 Maya
198
+ dcc setup maya --version 2024
199
+
200
+ # 注入所有已安装的 Maya
201
+ dcc setup maya
202
+
203
+ # 注入 Substance Painter / Substance Designer
204
+ dcc setup substance_painter
205
+ dcc setup substance_designer
206
+ ```
207
+
208
+ #### 注入位置
209
+
210
+ | DCC | 注入路径 | 额外操作 |
211
+ |---|---|---|
212
+ | Maya | `~/maya/<version>/scripts/dcc_bridge_startup.py` | 在 `userSetup.py` 中追加 `import dcc_bridge_startup` |
213
+ | 3ds Max | `~/AppData/Local/Autodesk/3dsMax/<year> - 64bit/ENU/scripts/startup/dcc_bridge_startup.py` | 无(Max 自动加载 startup 目录) |
214
+ | Substance Painter | 应用脚本目录 | 自动启动入口注入 |
215
+ | Substance Designer | 应用脚本目录 | 自动启动入口注入 |
216
+
217
+ #### 版本发现机制
218
+
219
+ 通过读取 Windows 注册表自动发现已安装版本:
220
+
221
+ | DCC | 注册表路径 | 版本来源 |
222
+ |---|---|---|
223
+ | Maya | `HKLM\SOFTWARE\Autodesk\Maya\<version>` | 子键名(如 `2022`、`2024`) |
224
+ | 3ds Max | `HKLM\SOFTWARE\Autodesk\3dsMax\<internal_version>` | `Installdir` 值中的年份(如 `2019`、`2024`) |
225
+ | Substance Painter | 注册表/安装路径 | 自动发现 |
226
+ | Substance Designer | 注册表/安装路径 | 自动发现 |
227
+
228
+ ---
229
+
230
+ ### `dcc unsetup` — 移除自启动脚本
231
+
232
+ 移除 `dcc setup` 注入的脚本,恢复原始状态。
233
+
234
+ #### 语法
235
+
236
+ ```
237
+ dcc unsetup <dcc_type> [--version <版本号>]
238
+ ```
239
+
240
+ #### 示例
241
+
242
+ ```bash
243
+ # 移除 3ds Max 自启动脚本
244
+ dcc unsetup 3dsmax
245
+
246
+ # 移除指定版本的 Maya
247
+ dcc unsetup maya --version 2024
248
+
249
+ # 移除 Substance Painter / Substance Designer 自启动脚本
250
+ dcc unsetup substance_painter
251
+ dcc unsetup substance_designer
252
+ ```
253
+
254
+ ---
255
+
256
+ ### `dcc status` — 查看桥接状态
257
+
258
+ 扫描 `~/.dcc-bridge/instances/` 目录,列出所有正在运行的 DCC 桥接服务,并可对指定实例执行 ping 测试。
259
+
260
+ #### 语法
261
+
262
+ ```
263
+ dcc status [--port <端口>] [--dcc-type <类型>] [--version <版本号>] [--plain]
264
+ ```
265
+
266
+ #### 示例
267
+
268
+ ```bash
269
+ # 查看所有实例状态
270
+ dcc status
271
+
272
+ # 对指定端口执行 ping
273
+ dcc status --port 7002
274
+
275
+ # 对指定 DCC 类型执行 ping
276
+ dcc status --dcc-type maya
277
+
278
+ # 对指定版本执行 ping
279
+ dcc status --dcc-type maya --version 2024
280
+
281
+ # 纯文本输出
282
+ dcc status --plain
283
+ ```
284
+
285
+ #### 输出格式
286
+
287
+ **JSON 模式(默认):**
288
+
289
+ ```json
290
+ {
291
+ "instances": [
292
+ {
293
+ "pid": 12345,
294
+ "dcc_type": "3dsmax",
295
+ "dcc_version": "2024",
296
+ "host": "127.0.0.1",
297
+ "port": 7002,
298
+ "started_at": "2026-07-15T10:30:00",
299
+ "python_path": "C:\\Program Files\\Autodesk\\3ds Max 2024\\python\\python.exe"
300
+ }
301
+ ],
302
+ "count": 1,
303
+ "ping": {
304
+ "dcc_type": "3dsmax",
305
+ "python_path": "C:\\Program Files\\Autodesk\\3ds Max 2024\\python\\python.exe"
306
+ }
307
+ }
308
+ ```
309
+
310
+ 未指定 `ping` 目标时,`ping` 字段不出现;ping 失败时返回 `ping_error`。
311
+
312
+ **纯文本模式(`--plain`):**
313
+
314
+ ```
315
+ Running DCC instances: 1
316
+ 3dsmax:7002 v2024
317
+ Ping: OK - {'dcc_type': '3dsmax', 'python_path': '...'}
318
+ ```
319
+
320
+ ---
321
+
322
+ ### `dcc ping` — 测试连接
323
+
324
+ 向 DCC 桥接服务发送 ping 请求,验证服务是否可达并获取基础信息。
325
+
326
+ #### 语法
327
+
328
+ ```
329
+ dcc ping [--port <端口>] [--dcc-type <类型>] [--version <版本号>] [--plain]
330
+ ```
331
+
332
+ #### 示例
333
+
334
+ ```bash
335
+ # 自动发现并 ping
336
+ dcc ping
337
+
338
+ # 指定端口
339
+ dcc ping --port 7002
340
+
341
+ # 指定 DCC 类型
342
+ dcc ping --dcc-type maya
343
+
344
+ # 指定版本
345
+ dcc ping --dcc-type maya --version 2024
346
+
347
+ # 纯文本输出
348
+ dcc ping --plain
349
+ ```
350
+
351
+ #### 输出格式
352
+
353
+ **JSON(默认):**
354
+
355
+ ```json
356
+ {
357
+ "success": true,
358
+ "dcc_type": "3dsmax",
359
+ "python_path": "C:\\Program Files\\Autodesk\\3ds Max 2024\\python\\python.exe"
360
+ }
361
+ ```
362
+
363
+ **纯文本(`--plain`):**
364
+
365
+ ```
366
+ DCC bridge server is reachable.
367
+ DCC type: 3dsmax
368
+ Python path: C:\Program Files\Autodesk\3ds Max 2024\python\python.exe
369
+ ```
370
+
371
+ ---
372
+
373
+ ## 目标解析机制
374
+
375
+ 当不指定 `--port` 时,CLI 通过 `~/.dcc-bridge/instances/` 下的发现文件自动解析目标:
376
+
377
+ 1. 若指定 `--dcc-type`,只匹配该类型的实例
378
+ 2. 若指定 `--version`,进一步按版本筛选
379
+ 3. 若只找到一个实例,自动连接
380
+ 4. 若找到多个实例,报错并提示用 `--port` 或 `--dcc-type` 指定
381
+ 5. 若未找到任何实例,报错并提示先启动 DCC
382
+
383
+ ---
384
+
385
+ ## 服务发现与端口分配
386
+
387
+ DCC 端 TCP 服务启动后会自动在 `~/.dcc-bridge/instances/{dcc_type}-{pid}.json` 写入发现文件,CLI 与 VS Code 插件通过读取这些文件零配置发现运行中的实例。
388
+
389
+ - 发现文件命名:`{dcc_type}-{pid}.json`
390
+ - 默认起始端口:`7002`,多实例时自动递增,避免端口冲突
391
+ - 惰性清理:`list_instances` 会检查 PID 是否存活,已退出的 DCC 进程对应文件会被自动删除
392
+
393
+ ---
394
+
395
+ ## 在 DCC 中手动启动服务
396
+
397
+ 正常情况下 `dcc setup` 后 DCC 打开即自动启动服务。如需手动启动:
398
+
399
+ ```python
400
+ from dcc_bridge.start import start_server
401
+ start_server(port=7002)
402
+ ```
403
+
404
+ 服务启动后会自动在 `~/.dcc-bridge/instances/` 写入发现文件,供 CLI 与 VS Code 插件识别。
405
+
406
+ ---
407
+
408
+ ## 作为 Python 包使用
409
+
410
+ ```python
411
+ from dcc_bridge import DCCClient
412
+
413
+ # 直连指定端口
414
+ with DCCClient(port=7002) as client:
415
+ result = client.execute_code("print('hello from DCC')")
416
+ print(result.to_dict())
417
+
418
+ # 自动发现实例
419
+ from dcc_bridge.client import resolve_client
420
+ with resolve_client(dcc_type="maya") as client:
421
+ client.execute_file("/path/to/script.py")
422
+ ```
423
+
424
+ ---
425
+
426
+ ## 支持的 DCC
427
+
428
+ | DCC | 状态 | 版本发现 | 自启动注入 |
429
+ |---|---|---|---|
430
+ | Maya | 完整支持 | 注册表 | `userSetup.py` + `dcc_bridge_startup.py` |
431
+ | 3ds Max | 完整支持 | 注册表 | `scripts/startup/dcc_bridge_startup.py` |
432
+ | Substance Painter | 支持 | 注册表/安装路径 | 自动启动入口注入 |
433
+ | Substance Designer | 支持 | 注册表/安装路径 | 自动启动入口注入 |
434
+
435
+ ---
436
+
437
+ ## 调试集成说明
438
+
439
+ `dcc_bridge.debug.start_debugpy_server` 在启动 debugpy 服务前会调用当前 DCC 适配器的 `configure_debugpy(python_path)` 方法,完成针对各 DCC 的解释器配置。`SubstanceDesignerAdapter` 会跳过默认的 `debugpy.configure` 调用,以避免 Substance Designer 在启动调试服务时触发资源扫描弹窗(该问题目前仍在持续优化中)。
440
+
441
+ ---
442
+
443
+ ## 许可证
444
+
445
+ 本项目采用 [PolyForm Noncommercial License 1.0.0](../../LICENSE) 授权,仅供非商业用途使用。详见根目录 `LICENSE` 文件。