modulor 0.5.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.
- modulor-0.5.0/LICENSE +21 -0
- modulor-0.5.0/PKG-INFO +199 -0
- modulor-0.5.0/README.md +171 -0
- modulor-0.5.0/modulor/__init__.py +43 -0
- modulor-0.5.0/modulor/__main__.py +5 -0
- modulor-0.5.0/modulor/cli.py +264 -0
- modulor-0.5.0/modulor/document.py +248 -0
- modulor-0.5.0/modulor/document.schema.json +330 -0
- modulor-0.5.0/modulor/engine.py +76 -0
- modulor-0.5.0/modulor/errors.py +60 -0
- modulor-0.5.0/modulor/exporters/__init__.py +0 -0
- modulor-0.5.0/modulor/exporters/dxf.py +113 -0
- modulor-0.5.0/modulor/exporters/mesh3d.py +169 -0
- modulor-0.5.0/modulor/exporters/svg.py +115 -0
- modulor-0.5.0/modulor/expr.py +147 -0
- modulor-0.5.0/modulor/geometry.py +549 -0
- modulor-0.5.0/modulor/importers/__init__.py +0 -0
- modulor-0.5.0/modulor/importers/dxf.py +307 -0
- modulor-0.5.0/modulor/mcp_server.py +201 -0
- modulor-0.5.0/modulor/ops/__init__.py +273 -0
- modulor-0.5.0/modulor/ops/arch.py +429 -0
- modulor-0.5.0/modulor/ops/doc_ops.py +314 -0
- modulor-0.5.0/modulor/ops/draw2d.py +512 -0
- modulor-0.5.0/modulor/ops/export_ops.py +151 -0
- modulor-0.5.0/modulor/ops/model3d.py +747 -0
- modulor-0.5.0/modulor/ops/param_ops.py +267 -0
- modulor-0.5.0/modulor/ops/query.py +188 -0
- modulor-0.5.0/modulor/ops/transform.py +345 -0
- modulor-0.5.0/modulor/render/__init__.py +0 -0
- modulor-0.5.0/modulor/render/flatten.py +260 -0
- modulor-0.5.0/modulor/render/font.py +148 -0
- modulor-0.5.0/modulor/render/raster.py +109 -0
- modulor-0.5.0/modulor/render/render2d.py +87 -0
- modulor-0.5.0/modulor/render/render3d.py +247 -0
- modulor-0.5.0/modulor/shapes.py +378 -0
- modulor-0.5.0/modulor/viewer/__init__.py +0 -0
- modulor-0.5.0/modulor/viewer/index.html +482 -0
- modulor-0.5.0/modulor/viewer/server.py +254 -0
- modulor-0.5.0/modulor.egg-info/PKG-INFO +199 -0
- modulor-0.5.0/modulor.egg-info/SOURCES.txt +48 -0
- modulor-0.5.0/modulor.egg-info/dependency_links.txt +1 -0
- modulor-0.5.0/modulor.egg-info/entry_points.txt +2 -0
- modulor-0.5.0/modulor.egg-info/requires.txt +9 -0
- modulor-0.5.0/modulor.egg-info/top_level.txt +1 -0
- modulor-0.5.0/pyproject.toml +41 -0
- modulor-0.5.0/setup.cfg +4 -0
- modulor-0.5.0/tests/test_api_contract.py +242 -0
- modulor-0.5.0/tests/test_format.py +168 -0
- modulor-0.5.0/tests/test_fuzz.py +30 -0
- modulor-0.5.0/tests/test_nativecad.py +596 -0
modulor-0.5.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Modulor contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
modulor-0.5.0/PKG-INFO
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: modulor
|
|
3
|
+
Version: 0.5.0
|
|
4
|
+
Summary: Agent-native 2D drafting + 3D modeling kernel. JSON in, geometry out.
|
|
5
|
+
License: MIT
|
|
6
|
+
Keywords: cad,agent,llm,mcp,geometry,dxf,gltf,drafting
|
|
7
|
+
Classifier: Development Status :: 4 - Beta
|
|
8
|
+
Classifier: Intended Audience :: Developers
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Topic :: Multimedia :: Graphics :: 3D Modeling
|
|
16
|
+
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
17
|
+
Requires-Python: >=3.10
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
License-File: LICENSE
|
|
20
|
+
Requires-Dist: numpy>=1.26
|
|
21
|
+
Requires-Dist: manifold3d>=3.0
|
|
22
|
+
Provides-Extra: check
|
|
23
|
+
Requires-Dist: jsonschema>=4; extra == "check"
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: pytest>=7; extra == "dev"
|
|
26
|
+
Requires-Dist: jsonschema>=4; extra == "dev"
|
|
27
|
+
Dynamic: license-file
|
|
28
|
+
|
|
29
|
+
# Modulor(模度)
|
|
30
|
+
|
|
31
|
+
**Agent-native 的二维绘图 + 三维建模内核。没有 GUI,没有鼠标——JSON 进,几何出。**
|
|
32
|
+
|
|
33
|
+
> **English**: Modulor is an agent-native 2D drafting + 3D modeling kernel —
|
|
34
|
+
> the geometry layer for the agent era. No GUI: the entire tool is a
|
|
35
|
+
> self-describing JSON op protocol (71 ops, contract-tested) over a plain-JSON
|
|
36
|
+
> document format, callable via CLI, JSON-Lines pipe, MCP server or Python.
|
|
37
|
+
> Parametric recipes, architectural semantics, freeform surfaces, DXF/glTF
|
|
38
|
+
> interop, a built-in verification loop (measure / validate / render-and-see),
|
|
39
|
+
> and a conformance checker for the format. Agents read
|
|
40
|
+
> [AGENT_GUIDE.md](AGENT_GUIDE.md); the API contract lives in
|
|
41
|
+
> [docs/API.md](docs/API.md); the file format spec in
|
|
42
|
+
> [docs/FORMAT.md](docs/FORMAT.md). Named after Le Corbusier's *Modulor* —
|
|
43
|
+
> a universal measure for building, this time for machines.
|
|
44
|
+
|
|
45
|
+
传统 CAD(AutoCAD / SketchUp / Rhino)是为人类的眼睛和手设计的:菜单、视口、
|
|
46
|
+
捕捉、快捷键。Agent 调用它们时,要么模拟人类操作,要么穿过厚重的插件层。
|
|
47
|
+
Modulor 反过来:**把 CAD 的几何核心保留下来,把交互层整个换成 Agent 的母语**
|
|
48
|
+
——结构化命令、结构化结果、结构化错误,外加一条"渲染成图、亲眼验证"的反馈回路。
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
┌─────────────────────────────────────────┐
|
|
52
|
+
Agent ──────▶│ CLI batch │ CLI pipe │ MCP │ Python API │
|
|
53
|
+
└──────────────────┬──────────────────────┘
|
|
54
|
+
▼
|
|
55
|
+
JSON 命令(自描述 op 协议)
|
|
56
|
+
▼
|
|
57
|
+
┌─────────────────────────────────────────┐
|
|
58
|
+
│ 几何内核:manifold3d (Clipper2 + Manifold) │
|
|
59
|
+
│ 2D/3D 布尔 · 偏移 · 拉伸 · 旋转体 · 切片 │
|
|
60
|
+
└──────────────────┬──────────────────────┘
|
|
61
|
+
▼
|
|
62
|
+
.json 文档 · SVG · DXF · PNG 渲染 · OBJ / STL / GLB
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 为什么是一个工具而不是两个
|
|
66
|
+
|
|
67
|
+
二维图纸和三维模型共享同一份文档:图层、单位、实体、标签。闭合轮廓 `extrude`
|
|
68
|
+
直接成体,墙体在平面图里是双线+门窗洞口、在 3D 里自动长成带洞口的实体,
|
|
69
|
+
`slice` 把任何实体切回二维剖面。分成两个软件,这条链路就断了。
|
|
70
|
+
|
|
71
|
+
## 核心能力(71 个自描述操作,接口受契约测试保护)
|
|
72
|
+
|
|
73
|
+
标准的两半都已成文并由测试看守:**op 协议**——[docs/API.md](docs/API.md)
|
|
74
|
+
(由注册表生成)+ 机器可读契约 [docs/api.json](docs/api.json),实现与契约
|
|
75
|
+
不一致时测试直接失败;**文档格式**——[docs/FORMAT.md](docs/FORMAT.md) 规格
|
|
76
|
+
+ [docs/document.schema.json](docs/document.schema.json)(JSON Schema),
|
|
77
|
+
每份示例文档都在 CI 里对着 schema 验证。
|
|
78
|
+
|
|
79
|
+
- **参数化(文档 = 数据 + 配方)**:任何数值字段接受表达式
|
|
80
|
+
(`"bay*3"`、`"level_top('L2')"`、`"grid_x('B')"`);`recipe_set` 把生成
|
|
81
|
+
命令存进文档作为**设计意图**,`set_param` + `regenerate` 一条命令全模型
|
|
82
|
+
联动重建——"柱距 4m 改 5m,其他保持联动"就是这两个调用
|
|
83
|
+
- **建筑语义**:轴网 add_grid(平面出轴线+编号气泡,交点可在表达式中引用)、
|
|
84
|
+
标高 add_level、房间 add_room(平面自动标注名称+面积 m²)、
|
|
85
|
+
面积报告 program(按名称/标高/类型汇总)、坡屋顶 add_roof(平/单坡/双坡)、
|
|
86
|
+
楼梯 add_stair(自动按舒适度公式 2R+T=630 排踏步)、幕墙 add_facade
|
|
87
|
+
- **方案迭代**:snapshot / restore 快照,**diff** 对比两个方案
|
|
88
|
+
(参数变更、实体增删改、体积面积增量),recipe 让设计意图跨方案继承
|
|
89
|
+
|
|
90
|
+
- **2D 制图**:线 / 多段线 / 样条曲线 / 圆 / 弧 / 矩形 / 文字、
|
|
91
|
+
对齐·角度·半径标注(自动测量)、圆角 / 倒角、图层、2D 布尔、偏移
|
|
92
|
+
- **建筑墙体**:中心线画墙(直线、闭合环、**样条曲线墙**),门窗洞口按
|
|
93
|
+
沿墙距离定位,平面图出双线+开启线,3D 自动成体
|
|
94
|
+
- **3D 建模**:体块 / 圆柱 / 球 / 拉伸(扭转、收分)/ 旋转体 /
|
|
95
|
+
稳健 3D 布尔(Manifold 内核,不会产生破面)/ 切片 / 平面与立面投影 / 抽壳
|
|
96
|
+
- **自由形态(Agent 的主场)**:断面放样 loft(纵向样条插值出流动曲面)、
|
|
97
|
+
沿空间路径扫掠 sweep、自由变形 deform(扭转/锥化/弯曲)、
|
|
98
|
+
**隐式曲面 add_implicit**(用数学表达式雕塑形体,smin/smax 平滑融合)、
|
|
99
|
+
网格平滑 smooth——Zaha 级别的异形语汇,全部走 JSON 命令
|
|
100
|
+
- **变换**:移动 / 复制 / 旋转 / 缩放 / 镜像 / 网格与环形阵列,2D/3D 通吃
|
|
101
|
+
- **反馈回路**:measure / validate / **find 空间查询** /
|
|
102
|
+
**render labels=true 把实体 id 印在图上** / snapshot·restore 文档快照
|
|
103
|
+
- **互通**:导出 SVG · DXF · OBJ · STL · GLB(PBR);**导入 DXF**
|
|
104
|
+
(LINE/CIRCLE/ARC/POLYLINE 含弧段/TEXT/MTEXT/SPLINE/ELLIPSE + 图层颜色,
|
|
105
|
+
不支持的类型计数报告,绝不静默丢弃)——Agent 可以接手人类的存量图纸
|
|
106
|
+
- **渲染**:纯 numpy 软件光栅器,平面图 PNG 与 3D 着色 PNG(特征边 + 坐标轴),
|
|
107
|
+
多模态 Agent 可直接"看见"自己建的模型——MCP 的 `cad_render` 直接返回图像
|
|
108
|
+
- **实时查看器**:`modulor serve` 起一个**严格只读**的浏览器窗口
|
|
109
|
+
(2D 平面 + WebGL 3D 轨道视图 + 图层开关 + 一键下载),监视文档文件,
|
|
110
|
+
任何 Agent 通过任何通道修改文档,页面自动跟随刷新——人类看,Agent 干
|
|
111
|
+
|
|
112
|
+
## 安装
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
pip install -e . # 依赖仅 numpy + manifold3d
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## 60 秒上手
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
modulor ops # 看所有命令(自描述,无需读文档)
|
|
122
|
+
modulor ops add_wall # 看单个命令的参数/默认值/示例
|
|
123
|
+
|
|
124
|
+
echo [{"op":"add_box","size":[100,60,40]},{"op":"render","path":"a.png"}] > s.json
|
|
125
|
+
modulor run model.json s.json # 批量执行(原子性:失败则不落盘)
|
|
126
|
+
|
|
127
|
+
modulor repl model.json # 长会话:一行 JSON 进,一行 JSON 出
|
|
128
|
+
modulor mcp # MCP stdio 服务器
|
|
129
|
+
modulor serve model.json # 只读查看器:浏览器实时跟随文档变化
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+

|
|
133
|
+
*查看器:左 2D 平面(滚轮缩放/拖拽平移),右 WebGL 3D(轨道相机),
|
|
134
|
+
底部图层开关,顶部 SVG/DXF/GLB/STL 下载。零前端依赖,单文件 HTML,离线可用。*
|
|
135
|
+
|
|
136
|
+
MCP 客户端配置(如 Claude Code):
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{"mcpServers": {"modulor": {"command": "modulor", "args": ["mcp"]}}}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## 示例
|
|
143
|
+
|
|
144
|
+
`modulor run out\studio.json examples\floorplan.json` —— 户型图:
|
|
145
|
+
闭合外墙环 + 隔墙 + 4 门窗 + 标注链 + 房间标签 → SVG/DXF/PNG → 一键长成
|
|
146
|
+
3D(含楼板)→ GLB。
|
|
147
|
+
|
|
148
|
+
`modulor run out\bracket.json examples\bracket.json` —— 机械零件:
|
|
149
|
+
偏移做圆角板 + 孔阵列 + 腰形槽(2D 布尔)→ 拉伸 → 凸台镗孔(3D 布尔)→
|
|
150
|
+
体积测量 → STL/GLB/OBJ + 剖面 DXF。
|
|
151
|
+
|
|
152
|
+
`modulor run out\zaha.json examples\zaha.json` —— 异形建筑:
|
|
153
|
+
三断面样条放样出流线塔楼(loft+twist)+ 飘带天蓬(sweep)+
|
|
154
|
+
样条曲线墙 + 隐式曲面融合展亭(add_implicit smin)→ GLB。
|
|
155
|
+
|
|
156
|
+
`modulor run out\param.json examples\parametric.json --as-recipe` ——
|
|
157
|
+
参数化建筑:5 个参数驱动轴网/标高/柱阵/楼板/幕墙/坡屋顶/楼梯/房间;
|
|
158
|
+
之后 `{"op":"regenerate","params":{"bay":5000,"floors":4}}` 一条命令,
|
|
159
|
+
整栋楼重新协调(OFFICE 面积 76.8m² → 120m²,diff 给出完整对比报告)。
|
|
160
|
+
|
|
161
|
+
| examples/out/studio_plan.png | examples/out/bracket_iso.png | examples/out/zaha_iso.png |
|
|
162
|
+
|---|---|---|
|
|
163
|
+
| 平面图(双线墙、门扇、标注) | 零件(圆角、孔系、凸台) | 异形(放样/扫掠/隐式曲面) |
|
|
164
|
+
|
|
165
|
+
规模参考(scripts/bench.py,20 层塔楼 401 条命令):构建 0.08s、
|
|
166
|
+
文档 0.04MB(墙体参数化存储)、着色渲染 2.2s、GLB 导出 0.05s。
|
|
167
|
+
|
|
168
|
+
## 设计原则(Agent-native 的含义)
|
|
169
|
+
|
|
170
|
+
1. **命令即 API,API 即文档**:每个 op 自带参数 schema、默认值与示例,
|
|
171
|
+
`help` 一个调用拿全;参数拼错会收到 "did you mean ..." 。
|
|
172
|
+
2. **一切皆可验证**:建完就能 `measure`、`validate`、`render`——Agent 不必
|
|
173
|
+
盲信自己的输出。
|
|
174
|
+
3. **原子批处理**:批量命令要么全部成功落盘,要么报出第几条错在哪,文档不脏。
|
|
175
|
+
4. **用标签不用坐标 id**:布尔运算会消耗实体,`tag` 让选择器稳定。
|
|
176
|
+
5. **文档就是纯 JSON**:可 diff、可入库、可手改,没有二进制黑盒。
|
|
177
|
+
|
|
178
|
+
## 项目结构
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
modulor/
|
|
182
|
+
document.py 文档模型(图层/材质/实体/选择器/序列化)
|
|
183
|
+
engine.py 批处理执行器(原子性、结构化错误)
|
|
184
|
+
geometry.py 向量/仿射/弧离散化/墙体轮廓偏移
|
|
185
|
+
shapes.py 实体 <-> 几何内核(CrossSection/Manifold)桥
|
|
186
|
+
ops/ 全部操作:绘图、建模、参数化、建筑语义、变换、查询、导出
|
|
187
|
+
exporters/ SVG · DXF · OBJ · STL · GLB(全部手写,零重依赖)
|
|
188
|
+
render/ 软件光栅器、笔画字体、2D/3D 渲染
|
|
189
|
+
cli.py run / op / repl / ops / new / info / serve / mcp
|
|
190
|
+
mcp_server.py MCP stdio 服务器(手写 JSON-RPC,无 SDK 依赖)
|
|
191
|
+
viewer/ 只读实时查看器(stdlib HTTP + 单文件 HTML + 自写 WebGL)
|
|
192
|
+
tests/ 行为 + 契约 + 模糊测试(pytest)
|
|
193
|
+
examples/ 户型图与机械零件全流程脚本
|
|
194
|
+
AGENT_GUIDE.md 给 Agent 看的完整使用指南
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## License
|
|
198
|
+
|
|
199
|
+
MIT
|
modulor-0.5.0/README.md
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# Modulor(模度)
|
|
2
|
+
|
|
3
|
+
**Agent-native 的二维绘图 + 三维建模内核。没有 GUI,没有鼠标——JSON 进,几何出。**
|
|
4
|
+
|
|
5
|
+
> **English**: Modulor is an agent-native 2D drafting + 3D modeling kernel —
|
|
6
|
+
> the geometry layer for the agent era. No GUI: the entire tool is a
|
|
7
|
+
> self-describing JSON op protocol (71 ops, contract-tested) over a plain-JSON
|
|
8
|
+
> document format, callable via CLI, JSON-Lines pipe, MCP server or Python.
|
|
9
|
+
> Parametric recipes, architectural semantics, freeform surfaces, DXF/glTF
|
|
10
|
+
> interop, a built-in verification loop (measure / validate / render-and-see),
|
|
11
|
+
> and a conformance checker for the format. Agents read
|
|
12
|
+
> [AGENT_GUIDE.md](AGENT_GUIDE.md); the API contract lives in
|
|
13
|
+
> [docs/API.md](docs/API.md); the file format spec in
|
|
14
|
+
> [docs/FORMAT.md](docs/FORMAT.md). Named after Le Corbusier's *Modulor* —
|
|
15
|
+
> a universal measure for building, this time for machines.
|
|
16
|
+
|
|
17
|
+
传统 CAD(AutoCAD / SketchUp / Rhino)是为人类的眼睛和手设计的:菜单、视口、
|
|
18
|
+
捕捉、快捷键。Agent 调用它们时,要么模拟人类操作,要么穿过厚重的插件层。
|
|
19
|
+
Modulor 反过来:**把 CAD 的几何核心保留下来,把交互层整个换成 Agent 的母语**
|
|
20
|
+
——结构化命令、结构化结果、结构化错误,外加一条"渲染成图、亲眼验证"的反馈回路。
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
┌─────────────────────────────────────────┐
|
|
24
|
+
Agent ──────▶│ CLI batch │ CLI pipe │ MCP │ Python API │
|
|
25
|
+
└──────────────────┬──────────────────────┘
|
|
26
|
+
▼
|
|
27
|
+
JSON 命令(自描述 op 协议)
|
|
28
|
+
▼
|
|
29
|
+
┌─────────────────────────────────────────┐
|
|
30
|
+
│ 几何内核:manifold3d (Clipper2 + Manifold) │
|
|
31
|
+
│ 2D/3D 布尔 · 偏移 · 拉伸 · 旋转体 · 切片 │
|
|
32
|
+
└──────────────────┬──────────────────────┘
|
|
33
|
+
▼
|
|
34
|
+
.json 文档 · SVG · DXF · PNG 渲染 · OBJ / STL / GLB
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 为什么是一个工具而不是两个
|
|
38
|
+
|
|
39
|
+
二维图纸和三维模型共享同一份文档:图层、单位、实体、标签。闭合轮廓 `extrude`
|
|
40
|
+
直接成体,墙体在平面图里是双线+门窗洞口、在 3D 里自动长成带洞口的实体,
|
|
41
|
+
`slice` 把任何实体切回二维剖面。分成两个软件,这条链路就断了。
|
|
42
|
+
|
|
43
|
+
## 核心能力(71 个自描述操作,接口受契约测试保护)
|
|
44
|
+
|
|
45
|
+
标准的两半都已成文并由测试看守:**op 协议**——[docs/API.md](docs/API.md)
|
|
46
|
+
(由注册表生成)+ 机器可读契约 [docs/api.json](docs/api.json),实现与契约
|
|
47
|
+
不一致时测试直接失败;**文档格式**——[docs/FORMAT.md](docs/FORMAT.md) 规格
|
|
48
|
+
+ [docs/document.schema.json](docs/document.schema.json)(JSON Schema),
|
|
49
|
+
每份示例文档都在 CI 里对着 schema 验证。
|
|
50
|
+
|
|
51
|
+
- **参数化(文档 = 数据 + 配方)**:任何数值字段接受表达式
|
|
52
|
+
(`"bay*3"`、`"level_top('L2')"`、`"grid_x('B')"`);`recipe_set` 把生成
|
|
53
|
+
命令存进文档作为**设计意图**,`set_param` + `regenerate` 一条命令全模型
|
|
54
|
+
联动重建——"柱距 4m 改 5m,其他保持联动"就是这两个调用
|
|
55
|
+
- **建筑语义**:轴网 add_grid(平面出轴线+编号气泡,交点可在表达式中引用)、
|
|
56
|
+
标高 add_level、房间 add_room(平面自动标注名称+面积 m²)、
|
|
57
|
+
面积报告 program(按名称/标高/类型汇总)、坡屋顶 add_roof(平/单坡/双坡)、
|
|
58
|
+
楼梯 add_stair(自动按舒适度公式 2R+T=630 排踏步)、幕墙 add_facade
|
|
59
|
+
- **方案迭代**:snapshot / restore 快照,**diff** 对比两个方案
|
|
60
|
+
(参数变更、实体增删改、体积面积增量),recipe 让设计意图跨方案继承
|
|
61
|
+
|
|
62
|
+
- **2D 制图**:线 / 多段线 / 样条曲线 / 圆 / 弧 / 矩形 / 文字、
|
|
63
|
+
对齐·角度·半径标注(自动测量)、圆角 / 倒角、图层、2D 布尔、偏移
|
|
64
|
+
- **建筑墙体**:中心线画墙(直线、闭合环、**样条曲线墙**),门窗洞口按
|
|
65
|
+
沿墙距离定位,平面图出双线+开启线,3D 自动成体
|
|
66
|
+
- **3D 建模**:体块 / 圆柱 / 球 / 拉伸(扭转、收分)/ 旋转体 /
|
|
67
|
+
稳健 3D 布尔(Manifold 内核,不会产生破面)/ 切片 / 平面与立面投影 / 抽壳
|
|
68
|
+
- **自由形态(Agent 的主场)**:断面放样 loft(纵向样条插值出流动曲面)、
|
|
69
|
+
沿空间路径扫掠 sweep、自由变形 deform(扭转/锥化/弯曲)、
|
|
70
|
+
**隐式曲面 add_implicit**(用数学表达式雕塑形体,smin/smax 平滑融合)、
|
|
71
|
+
网格平滑 smooth——Zaha 级别的异形语汇,全部走 JSON 命令
|
|
72
|
+
- **变换**:移动 / 复制 / 旋转 / 缩放 / 镜像 / 网格与环形阵列,2D/3D 通吃
|
|
73
|
+
- **反馈回路**:measure / validate / **find 空间查询** /
|
|
74
|
+
**render labels=true 把实体 id 印在图上** / snapshot·restore 文档快照
|
|
75
|
+
- **互通**:导出 SVG · DXF · OBJ · STL · GLB(PBR);**导入 DXF**
|
|
76
|
+
(LINE/CIRCLE/ARC/POLYLINE 含弧段/TEXT/MTEXT/SPLINE/ELLIPSE + 图层颜色,
|
|
77
|
+
不支持的类型计数报告,绝不静默丢弃)——Agent 可以接手人类的存量图纸
|
|
78
|
+
- **渲染**:纯 numpy 软件光栅器,平面图 PNG 与 3D 着色 PNG(特征边 + 坐标轴),
|
|
79
|
+
多模态 Agent 可直接"看见"自己建的模型——MCP 的 `cad_render` 直接返回图像
|
|
80
|
+
- **实时查看器**:`modulor serve` 起一个**严格只读**的浏览器窗口
|
|
81
|
+
(2D 平面 + WebGL 3D 轨道视图 + 图层开关 + 一键下载),监视文档文件,
|
|
82
|
+
任何 Agent 通过任何通道修改文档,页面自动跟随刷新——人类看,Agent 干
|
|
83
|
+
|
|
84
|
+
## 安装
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
pip install -e . # 依赖仅 numpy + manifold3d
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## 60 秒上手
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
modulor ops # 看所有命令(自描述,无需读文档)
|
|
94
|
+
modulor ops add_wall # 看单个命令的参数/默认值/示例
|
|
95
|
+
|
|
96
|
+
echo [{"op":"add_box","size":[100,60,40]},{"op":"render","path":"a.png"}] > s.json
|
|
97
|
+
modulor run model.json s.json # 批量执行(原子性:失败则不落盘)
|
|
98
|
+
|
|
99
|
+
modulor repl model.json # 长会话:一行 JSON 进,一行 JSON 出
|
|
100
|
+
modulor mcp # MCP stdio 服务器
|
|
101
|
+
modulor serve model.json # 只读查看器:浏览器实时跟随文档变化
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+

|
|
105
|
+
*查看器:左 2D 平面(滚轮缩放/拖拽平移),右 WebGL 3D(轨道相机),
|
|
106
|
+
底部图层开关,顶部 SVG/DXF/GLB/STL 下载。零前端依赖,单文件 HTML,离线可用。*
|
|
107
|
+
|
|
108
|
+
MCP 客户端配置(如 Claude Code):
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{"mcpServers": {"modulor": {"command": "modulor", "args": ["mcp"]}}}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## 示例
|
|
115
|
+
|
|
116
|
+
`modulor run out\studio.json examples\floorplan.json` —— 户型图:
|
|
117
|
+
闭合外墙环 + 隔墙 + 4 门窗 + 标注链 + 房间标签 → SVG/DXF/PNG → 一键长成
|
|
118
|
+
3D(含楼板)→ GLB。
|
|
119
|
+
|
|
120
|
+
`modulor run out\bracket.json examples\bracket.json` —— 机械零件:
|
|
121
|
+
偏移做圆角板 + 孔阵列 + 腰形槽(2D 布尔)→ 拉伸 → 凸台镗孔(3D 布尔)→
|
|
122
|
+
体积测量 → STL/GLB/OBJ + 剖面 DXF。
|
|
123
|
+
|
|
124
|
+
`modulor run out\zaha.json examples\zaha.json` —— 异形建筑:
|
|
125
|
+
三断面样条放样出流线塔楼(loft+twist)+ 飘带天蓬(sweep)+
|
|
126
|
+
样条曲线墙 + 隐式曲面融合展亭(add_implicit smin)→ GLB。
|
|
127
|
+
|
|
128
|
+
`modulor run out\param.json examples\parametric.json --as-recipe` ——
|
|
129
|
+
参数化建筑:5 个参数驱动轴网/标高/柱阵/楼板/幕墙/坡屋顶/楼梯/房间;
|
|
130
|
+
之后 `{"op":"regenerate","params":{"bay":5000,"floors":4}}` 一条命令,
|
|
131
|
+
整栋楼重新协调(OFFICE 面积 76.8m² → 120m²,diff 给出完整对比报告)。
|
|
132
|
+
|
|
133
|
+
| examples/out/studio_plan.png | examples/out/bracket_iso.png | examples/out/zaha_iso.png |
|
|
134
|
+
|---|---|---|
|
|
135
|
+
| 平面图(双线墙、门扇、标注) | 零件(圆角、孔系、凸台) | 异形(放样/扫掠/隐式曲面) |
|
|
136
|
+
|
|
137
|
+
规模参考(scripts/bench.py,20 层塔楼 401 条命令):构建 0.08s、
|
|
138
|
+
文档 0.04MB(墙体参数化存储)、着色渲染 2.2s、GLB 导出 0.05s。
|
|
139
|
+
|
|
140
|
+
## 设计原则(Agent-native 的含义)
|
|
141
|
+
|
|
142
|
+
1. **命令即 API,API 即文档**:每个 op 自带参数 schema、默认值与示例,
|
|
143
|
+
`help` 一个调用拿全;参数拼错会收到 "did you mean ..." 。
|
|
144
|
+
2. **一切皆可验证**:建完就能 `measure`、`validate`、`render`——Agent 不必
|
|
145
|
+
盲信自己的输出。
|
|
146
|
+
3. **原子批处理**:批量命令要么全部成功落盘,要么报出第几条错在哪,文档不脏。
|
|
147
|
+
4. **用标签不用坐标 id**:布尔运算会消耗实体,`tag` 让选择器稳定。
|
|
148
|
+
5. **文档就是纯 JSON**:可 diff、可入库、可手改,没有二进制黑盒。
|
|
149
|
+
|
|
150
|
+
## 项目结构
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
modulor/
|
|
154
|
+
document.py 文档模型(图层/材质/实体/选择器/序列化)
|
|
155
|
+
engine.py 批处理执行器(原子性、结构化错误)
|
|
156
|
+
geometry.py 向量/仿射/弧离散化/墙体轮廓偏移
|
|
157
|
+
shapes.py 实体 <-> 几何内核(CrossSection/Manifold)桥
|
|
158
|
+
ops/ 全部操作:绘图、建模、参数化、建筑语义、变换、查询、导出
|
|
159
|
+
exporters/ SVG · DXF · OBJ · STL · GLB(全部手写,零重依赖)
|
|
160
|
+
render/ 软件光栅器、笔画字体、2D/3D 渲染
|
|
161
|
+
cli.py run / op / repl / ops / new / info / serve / mcp
|
|
162
|
+
mcp_server.py MCP stdio 服务器(手写 JSON-RPC,无 SDK 依赖)
|
|
163
|
+
viewer/ 只读实时查看器(stdlib HTTP + 单文件 HTML + 自写 WebGL)
|
|
164
|
+
tests/ 行为 + 契约 + 模糊测试(pytest)
|
|
165
|
+
examples/ 户型图与机械零件全流程脚本
|
|
166
|
+
AGENT_GUIDE.md 给 Agent 看的完整使用指南
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## License
|
|
170
|
+
|
|
171
|
+
MIT
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""Modulor — agent-native 2D drafting + 3D modeling.
|
|
2
|
+
|
|
3
|
+
No GUI. The entire tool is a set of JSON commands ("ops") applied to a
|
|
4
|
+
JSON document, reachable four ways:
|
|
5
|
+
|
|
6
|
+
CLI batch modulor run model.json script.json
|
|
7
|
+
CLI pipe modulor repl model.json (JSON Lines in/out)
|
|
8
|
+
MCP server modulor mcp (for MCP-speaking agents)
|
|
9
|
+
Python from modulor import Cad
|
|
10
|
+
|
|
11
|
+
>>> cad = Cad("house.json", units="mm")
|
|
12
|
+
>>> cad("add_wall", path=[[0, 0], [6000, 0]], thickness=200)
|
|
13
|
+
{'ok': True, 'op': 'add_wall', 'created': ['e1'], 'length': 6000.0}
|
|
14
|
+
>>> cad("render", path="plan.png")
|
|
15
|
+
>>> cad.save()
|
|
16
|
+
"""
|
|
17
|
+
from .document import Document
|
|
18
|
+
from .engine import BatchError, execute, run_batch
|
|
19
|
+
from .errors import CadError
|
|
20
|
+
|
|
21
|
+
__version__ = "0.5.0"
|
|
22
|
+
__all__ = ["Cad", "Document", "CadError", "BatchError",
|
|
23
|
+
"execute", "run_batch", "__version__"]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Cad:
|
|
27
|
+
"""Convenience wrapper for Python-side agents and scripts."""
|
|
28
|
+
|
|
29
|
+
def __init__(self, path: str | None = None, units: str = "mm"):
|
|
30
|
+
if path:
|
|
31
|
+
self.doc = Document.open_or_create(path, units=units)
|
|
32
|
+
else:
|
|
33
|
+
self.doc = Document(units=units)
|
|
34
|
+
|
|
35
|
+
def __call__(self, op: str, **params) -> dict:
|
|
36
|
+
return execute(self.doc, {"op": op, **params})
|
|
37
|
+
|
|
38
|
+
def run(self, commands) -> list[dict]:
|
|
39
|
+
return run_batch(self.doc, commands)
|
|
40
|
+
|
|
41
|
+
def save(self, path: str | None = None):
|
|
42
|
+
self.doc.save(path)
|
|
43
|
+
return self.doc.path
|