ventforge 0.1.0__py3-none-any.whl

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.
@@ -0,0 +1,174 @@
1
+ {
2
+ "name": "Voronoi stone",
3
+ "canvas": {
4
+ "width": 140.0,
5
+ "height": 100.0,
6
+ "thickness": 2.0
7
+ },
8
+ "boundary": {
9
+ "type": "rounded_rectangle",
10
+ "corner_radius": 8.0,
11
+ "margin": 4.0,
12
+ "points": [],
13
+ "clip": true
14
+ },
15
+ "dot": {
16
+ "shape": "circle",
17
+ "diameter": 4.0,
18
+ "aspect": 1.0,
19
+ "corner_radius": 0.5,
20
+ "sides": 6,
21
+ "star_points": 5,
22
+ "star_inner": 0.5,
23
+ "rotation": 0.0,
24
+ "custom_points": [],
25
+ "color": "#F7BB3B"
26
+ },
27
+ "pattern": {
28
+ "mode": "voronoi",
29
+ "grid": {
30
+ "arrangement": "diamond",
31
+ "spacing_x": 6.0,
32
+ "spacing_y": 6.0,
33
+ "offset_x": 0.0,
34
+ "offset_y": 0.0,
35
+ "rotation": 0.0,
36
+ "row_rotation": 0.0,
37
+ "rotate_by": "row"
38
+ },
39
+ "random": {
40
+ "count": 300,
41
+ "min_distance": 5.0,
42
+ "seed": 1
43
+ },
44
+ "path": {
45
+ "points": [],
46
+ "closed": true,
47
+ "smooth": true,
48
+ "count": 60,
49
+ "layers": 1,
50
+ "layer_spacing": 6.0,
51
+ "align": true
52
+ },
53
+ "spiral": {
54
+ "radius": 45.0,
55
+ "turns": 5.0,
56
+ "inner_radius": 3.0,
57
+ "count": 300,
58
+ "rotation": 0.0,
59
+ "even_spacing": true,
60
+ "align": true
61
+ },
62
+ "concentric": {
63
+ "ring_spacing": 6.0,
64
+ "dot_spacing": 6.0,
65
+ "inner_radius": 0.0,
66
+ "outer_radius": 0.0,
67
+ "rotation": 0.0,
68
+ "stagger": true,
69
+ "align": true
70
+ },
71
+ "fibonacci": {
72
+ "count": 400,
73
+ "spread": 2.2,
74
+ "inner_radius": 0.0,
75
+ "rotation": 0.0,
76
+ "align": false
77
+ },
78
+ "crosslines": {
79
+ "left_angle": 60.0,
80
+ "right_angle": 120.0,
81
+ "left_spacing": 6.0,
82
+ "right_spacing": 6.0,
83
+ "rotation": 0.0,
84
+ "row_rotation": 0.0,
85
+ "rotate_by": "both"
86
+ },
87
+ "voronoi": {
88
+ "cell_size": 10.0,
89
+ "irregularity": 70.0,
90
+ "crack_width": 1.6,
91
+ "corner_radius": 1.2,
92
+ "rotation": 0.0,
93
+ "seed": 7
94
+ },
95
+ "flowlines": {
96
+ "line_spacing": 5.0,
97
+ "line_width": 2.0,
98
+ "rotation": 0.0,
99
+ "edge_style": "round",
100
+ "follow_boundary": false,
101
+ "invert": false,
102
+ "amplitude": 3.0,
103
+ "wavelength": 30.0,
104
+ "seed": 1
105
+ },
106
+ "custom_points": {
107
+ "points": [],
108
+ "sizes": [],
109
+ "angles": []
110
+ }
111
+ },
112
+ "gradients": {
113
+ "size": {
114
+ "enabled": false,
115
+ "controls": [],
116
+ "edge": 1.0,
117
+ "falloff": "smooth",
118
+ "noise": 0.0,
119
+ "noise_scale": 20.0,
120
+ "noise_seed": 1,
121
+ "image": "",
122
+ "image_min": 0.2,
123
+ "image_max": 1.0,
124
+ "invert_image": false
125
+ },
126
+ "spacing": {
127
+ "enabled": false,
128
+ "controls": [],
129
+ "edge": 1.0,
130
+ "falloff": "smooth",
131
+ "noise": 0.0,
132
+ "noise_scale": 20.0,
133
+ "noise_seed": 1,
134
+ "image": "",
135
+ "image_min": 0.2,
136
+ "image_max": 1.0,
137
+ "invert_image": false
138
+ },
139
+ "angle": {
140
+ "enabled": false,
141
+ "controls": [],
142
+ "edge": 0.0,
143
+ "falloff": "smooth",
144
+ "noise": 0.0,
145
+ "noise_scale": 20.0,
146
+ "noise_seed": 1,
147
+ "image": "",
148
+ "image_min": 0.2,
149
+ "image_max": 1.0,
150
+ "invert_image": false
151
+ },
152
+ "shape": {
153
+ "enabled": false,
154
+ "controls": [],
155
+ "edge": 0.0,
156
+ "falloff": "smooth",
157
+ "noise": 0.0,
158
+ "noise_scale": 20.0,
159
+ "noise_seed": 1,
160
+ "image": "",
161
+ "image_min": 0.2,
162
+ "image_max": 1.0,
163
+ "invert_image": false
164
+ },
165
+ "target_shape": "star",
166
+ "target_sides": 4
167
+ },
168
+ "background": {
169
+ "image": "",
170
+ "opacity": 0.5
171
+ },
172
+ "min_wall": 0.8,
173
+ "version": 1
174
+ }
@@ -0,0 +1,174 @@
1
+ {
2
+ "name": "Wavy flowlines",
3
+ "canvas": {
4
+ "width": 150.0,
5
+ "height": 100.0,
6
+ "thickness": 2.0
7
+ },
8
+ "boundary": {
9
+ "type": "rounded_rectangle",
10
+ "corner_radius": 8.0,
11
+ "margin": 5.0,
12
+ "points": [],
13
+ "clip": false
14
+ },
15
+ "dot": {
16
+ "shape": "circle",
17
+ "diameter": 4.0,
18
+ "aspect": 1.0,
19
+ "corner_radius": 0.5,
20
+ "sides": 6,
21
+ "star_points": 5,
22
+ "star_inner": 0.5,
23
+ "rotation": 0.0,
24
+ "custom_points": [],
25
+ "color": "#F7BB3B"
26
+ },
27
+ "pattern": {
28
+ "mode": "flowlines",
29
+ "grid": {
30
+ "arrangement": "diamond",
31
+ "spacing_x": 6.0,
32
+ "spacing_y": 6.0,
33
+ "offset_x": 0.0,
34
+ "offset_y": 0.0,
35
+ "rotation": 0.0,
36
+ "row_rotation": 0.0,
37
+ "rotate_by": "row"
38
+ },
39
+ "random": {
40
+ "count": 300,
41
+ "min_distance": 5.0,
42
+ "seed": 1
43
+ },
44
+ "path": {
45
+ "points": [],
46
+ "closed": true,
47
+ "smooth": true,
48
+ "count": 60,
49
+ "layers": 1,
50
+ "layer_spacing": 6.0,
51
+ "align": true
52
+ },
53
+ "spiral": {
54
+ "radius": 45.0,
55
+ "turns": 5.0,
56
+ "inner_radius": 3.0,
57
+ "count": 300,
58
+ "rotation": 0.0,
59
+ "even_spacing": true,
60
+ "align": true
61
+ },
62
+ "concentric": {
63
+ "ring_spacing": 6.0,
64
+ "dot_spacing": 6.0,
65
+ "inner_radius": 0.0,
66
+ "outer_radius": 0.0,
67
+ "rotation": 0.0,
68
+ "stagger": true,
69
+ "align": true
70
+ },
71
+ "fibonacci": {
72
+ "count": 400,
73
+ "spread": 2.2,
74
+ "inner_radius": 0.0,
75
+ "rotation": 0.0,
76
+ "align": false
77
+ },
78
+ "crosslines": {
79
+ "left_angle": 60.0,
80
+ "right_angle": 120.0,
81
+ "left_spacing": 6.0,
82
+ "right_spacing": 6.0,
83
+ "rotation": 0.0,
84
+ "row_rotation": 0.0,
85
+ "rotate_by": "both"
86
+ },
87
+ "voronoi": {
88
+ "cell_size": 8.0,
89
+ "irregularity": 60.0,
90
+ "crack_width": 1.2,
91
+ "corner_radius": 0.5,
92
+ "rotation": 0.0,
93
+ "seed": 1
94
+ },
95
+ "flowlines": {
96
+ "line_spacing": 6.0,
97
+ "line_width": 3.0,
98
+ "rotation": 0.0,
99
+ "edge_style": "round",
100
+ "follow_boundary": false,
101
+ "invert": false,
102
+ "amplitude": 4.0,
103
+ "wavelength": 40.0,
104
+ "seed": 3
105
+ },
106
+ "custom_points": {
107
+ "points": [],
108
+ "sizes": [],
109
+ "angles": []
110
+ }
111
+ },
112
+ "gradients": {
113
+ "size": {
114
+ "enabled": false,
115
+ "controls": [],
116
+ "edge": 1.0,
117
+ "falloff": "smooth",
118
+ "noise": 0.0,
119
+ "noise_scale": 20.0,
120
+ "noise_seed": 1,
121
+ "image": "",
122
+ "image_min": 0.2,
123
+ "image_max": 1.0,
124
+ "invert_image": false
125
+ },
126
+ "spacing": {
127
+ "enabled": false,
128
+ "controls": [],
129
+ "edge": 1.0,
130
+ "falloff": "smooth",
131
+ "noise": 0.0,
132
+ "noise_scale": 20.0,
133
+ "noise_seed": 1,
134
+ "image": "",
135
+ "image_min": 0.2,
136
+ "image_max": 1.0,
137
+ "invert_image": false
138
+ },
139
+ "angle": {
140
+ "enabled": false,
141
+ "controls": [],
142
+ "edge": 0.0,
143
+ "falloff": "smooth",
144
+ "noise": 0.0,
145
+ "noise_scale": 20.0,
146
+ "noise_seed": 1,
147
+ "image": "",
148
+ "image_min": 0.2,
149
+ "image_max": 1.0,
150
+ "invert_image": false
151
+ },
152
+ "shape": {
153
+ "enabled": false,
154
+ "controls": [],
155
+ "edge": 0.0,
156
+ "falloff": "smooth",
157
+ "noise": 0.0,
158
+ "noise_scale": 20.0,
159
+ "noise_seed": 1,
160
+ "image": "",
161
+ "image_min": 0.2,
162
+ "image_max": 1.0,
163
+ "invert_image": false
164
+ },
165
+ "target_shape": "star",
166
+ "target_sides": 4
167
+ },
168
+ "background": {
169
+ "image": "",
170
+ "opacity": 0.5
171
+ },
172
+ "min_wall": 0.8,
173
+ "version": 1
174
+ }
@@ -0,0 +1,84 @@
1
+ Metadata-Version: 2.4
2
+ Name: ventforge
3
+ Version: 0.1.0
4
+ Summary: Parametric vent pattern designer with native GUI and MCP server
5
+ License-Expression: GPL-3.0-or-later
6
+ Keywords: vent,pattern,3d-printing,cnc,cad,mcp,parametric
7
+ Classifier: Development Status :: 3 - Alpha
8
+ Classifier: Intended Audience :: Manufacturing
9
+ Classifier: Topic :: Multimedia :: Graphics :: Editors :: Vector-Based
10
+ Classifier: Topic :: Scientific/Engineering
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Operating System :: OS Independent
13
+ Requires-Python: >=3.11
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ Requires-Dist: numpy
17
+ Requires-Dist: shapely>=2
18
+ Requires-Dist: ezdxf
19
+ Requires-Dist: pillow
20
+ Requires-Dist: mcp<3,>=2
21
+ Provides-Extra: gui
22
+ Requires-Dist: PySide6-Essentials>=6.5; extra == "gui"
23
+ Provides-Extra: cad
24
+ Requires-Dist: cadquery-ocp-novtk<8.1,>=8.0; extra == "cad"
25
+ Provides-Extra: all
26
+ Requires-Dist: ventforge[cad,gui]; extra == "all"
27
+ Provides-Extra: dev
28
+ Requires-Dist: ventforge[all]; extra == "dev"
29
+ Requires-Dist: pytest; extra == "dev"
30
+ Dynamic: license-file
31
+
32
+ # VentForge
33
+
34
+ Parametric vent-pattern designer: native desktop editor (PySide6) + MCP server, sharing one geometry core
35
+ (shapely) and OpenCascade exports.
36
+
37
+ ## Install
38
+
39
+ ```
40
+ uv tool install "ventforge[all]" # or: pipx install "ventforge[all]"
41
+ ```
42
+
43
+ Extras: core (no extra) = MCP server + SVG/DXF/PNG export; `gui` = desktop editor; `cad` = STEP/STL export,
44
+ tube wrap and cut into a STEP part (OpenCascade); `all` = both.
45
+
46
+ ## Run
47
+
48
+ ```
49
+ ventforge [design.vent.json] # desktop editor
50
+ ventforge --mcp # MCP server (stdio); `ventforge-mcp` does the same
51
+ ```
52
+
53
+ Register with Claude Code (without installing first, uv fetches it on demand):
54
+
55
+ ```
56
+ claude mcp add ventforge -- uvx --from "ventforge[all]" ventforge --mcp
57
+ ```
58
+
59
+ For Claude Desktop, add the same command to `claude_desktop_config.json` under `mcpServers`.
60
+
61
+ The MCP server edits a `.vent.json` file (default `~/Documents/VentForge/current.vent.json`); an editor window
62
+ with that file open reloads live, so you can watch the AI design. `open_in_gui` opens it.
63
+
64
+ ## Features
65
+
66
+ - 10 layout modes: grid (square/diamond/hexagon), random, path, spiral, concentric, fibonacci, crosslines,
67
+ voronoi stone cracks, flow lines, custom points (AI-written arrangements).
68
+ - Dot shapes: circle, rounded rectangle, hexagon, polygon, star, custom outline.
69
+ - Gradients for size / spacing / angle / shape-morph, driven by point, line and curve controls, noise,
70
+ or a grayscale image.
71
+ - Boundary: none, circle, rounded rectangle, custom drawn outline; margin, clip.
72
+ - Exports: PNG, SVG, DXF, STEP, STL; wrap onto a cylinder; cut into an existing STEP part.
73
+ - Stats: dot count, open-area ratio, min-wall violations. Undo/redo, presets, user library.
74
+
75
+ ## Layout
76
+
77
+ `ventforge/model.py` design schema (all parameters) · `pattern.py` geometry · `export.py` file output ·
78
+ `gui.py` editor · `mcp_server.py` MCP tools · `presets/` (shipped in the package) · `tests/` (`pytest`, 109 tests, including the MCP server over real stdio;
79
+ GUI test needs `QT_QPA_PLATFORM=offscreen`). Development: `pip install -e ".[dev]"`.
80
+ CI (`.github/workflows/ci.yml`) tests Windows/macOS/Linux and publishes to PyPI on a `v*` tag.
81
+
82
+ ## Licence
83
+
84
+ GPL-3.0-or-later, see `LICENSE`. You may use, change and sell VentForge; versions you distribute must stay open source under the same licence.
@@ -0,0 +1,19 @@
1
+ ventforge/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ ventforge/__main__.py,sha256=llCtynJTGk1-GCwK7SvY9QyIGQPF9nUT5krrRSCQPZ4,635
3
+ ventforge/export.py,sha256=HqZTks-bTbT5aYCskxear7fJlhrKgVJmHjzRtfL8fPI,24227
4
+ ventforge/gui.py,sha256=twKnf3uyjahzgOK_rJWgG0KPWnSzgjfmE2lB24VuMvY,73041
5
+ ventforge/mcp_server.py,sha256=_VI0MBU69qe05GPLQUVkDVAxzbjUm66kILKgTETMZT4,8374
6
+ ventforge/model.py,sha256=CQzo1dVcRkfuBQCIrA1J2wQ4B2ME7yh4bXPQ-w3VMXU,11181
7
+ ventforge/pattern.py,sha256=uPUU1B5zrzUUL6jcW8x6W1fJ7okek7t1viusWJwYIXg,32678
8
+ ventforge/presets/halftone_fade.vent.json,sha256=Z8-nXQGZLQzHSuAmukLXG4YpCSZadR_33bmzdICS14w,3713
9
+ ventforge/presets/hex_honeycomb.vent.json,sha256=qi1kfVSVRBajZWP9vKSpNW7FMxaa_25B8bNkNMK8HZ8,3524
10
+ ventforge/presets/spiral_dashes.vent.json,sha256=qn-ce4nB8oSboarEeRaBoW7rG4sHn2SxeAXbhYHf-x4,3525
11
+ ventforge/presets/sunflower.vent.json,sha256=yoy6hvXlbPnsvvuFPxgEk8FwyLN0GLPrNwlyXzMiYMM,3722
12
+ ventforge/presets/voronoi_stone.vent.json,sha256=lODHNg9Rsi-ge-X9yNEH7fdxX1iUxHccoJtE2D9jsME,3525
13
+ ventforge/presets/wavy_flowlines.vent.json,sha256=J_tObpv8x00oGaxEhw6uRX34QT9g9uZiZgStLbUZ-FE,3528
14
+ ventforge-0.1.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
15
+ ventforge-0.1.0.dist-info/METADATA,sha256=oukqGDUQdtkxSfZqk2NLEgvmPMbF_RIZ4qUnxysu3RE,3392
16
+ ventforge-0.1.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
17
+ ventforge-0.1.0.dist-info/entry_points.txt,sha256=s3DwxmjgOBilC8_7BrsjdDvFWm5kXnU8x5v-NSPxuJY,95
18
+ ventforge-0.1.0.dist-info/top_level.txt,sha256=QfmXmKtMKVKJ3uB9-OwFOuucYAHqHysJMiBe2uBBTCg,10
19
+ ventforge-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.2.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ ventforge = ventforge.__main__:run
3
+ ventforge-mcp = ventforge.mcp_server:main