@hybridlabor-api/bdb-hardware-pcb 0.1.0
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.
- package/README.md +116 -0
- package/config/mcp/antigravity.json +22 -0
- package/config/mcp/claude.json +22 -0
- package/config/mcp/codex.toml +25 -0
- package/docs/adr/ADR-001-KICAD-OPENSCAD-MCP-STRATEGY.md +334 -0
- package/docs/review_documentation.md +121 -0
- package/installer.js +358 -0
- package/mcp_servers/kicad-mcp-server/.env.example +22 -0
- package/mcp_servers/kicad-mcp-server/.github/workflows/ci.yml +36 -0
- package/mcp_servers/kicad-mcp-server/CLAUDE.md +487 -0
- package/mcp_servers/kicad-mcp-server/README.md +316 -0
- package/mcp_servers/kicad-mcp-server/docs/DEVICE_TREE.md +416 -0
- package/mcp_servers/kicad-mcp-server/docs/INSTALLATION.md +332 -0
- package/mcp_servers/kicad-mcp-server/docs/PIN_ANALYSIS.md +332 -0
- package/mcp_servers/kicad-mcp-server/docs/README.md +240 -0
- package/mcp_servers/kicad-mcp-server/docs/TESTING.md +613 -0
- package/mcp_servers/kicad-mcp-server/docs/VALIDATION.md +268 -0
- package/mcp_servers/kicad-mcp-server/pyproject.toml +96 -0
- package/mcp_servers/kicad-mcp-server/requirements-dev.txt +16 -0
- package/mcp_servers/kicad-mcp-server/requirements-test.txt +24 -0
- package/mcp_servers/kicad-mcp-server/requirements.txt +13 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__init__.py +3 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__main__.py +17 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/config.py +46 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/types.py +87 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/netlist_parser.py +234 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser.py +375 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser_kicad.py +327 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/schematic_parser.py +902 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/server.py +71 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/arduino/connectivity_test.cpp.j2 +189 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/atmega.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/esp32.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/nrf52.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/stm32f4.dts.j2 +89 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/esp_idf/test_suite.c.j2 +340 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/pytest/test_connectivity.py.j2 +147 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/st_hal/hal_test.c.j2 +313 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_gpio_test.py.j2 +99 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_i2c_test.py.j2 +117 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_pinmux_test.py.j2 +43 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_spi_test.py.j2 +94 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_gpio_test.c.j2 +113 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_i2c_test.c.j2 +101 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_spi_test.c.j2 +94 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/unittest/test_schematic.py.j2 +172 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/__init__.py +36 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/device_tree.py +1187 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/hierarchical_analysis.py +211 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/netlist.py +320 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/parts_registry.py +142 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb.py +955 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb_layout.py +308 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pin_analysis.py +765 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/project.py +196 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic.py +319 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_editor.py +674 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_search.py +158 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/validation.py +866 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/visualization.py +225 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/file_handlers.py +65 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_cli.py +103 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_version.py +103 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/parts_registry.py +197 -0
- package/mcp_servers/kicad-mcp-server/tests/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/examples/ESP32S3_TEST.md +219 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/README.md +65 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/example_pcb.kicad_pcb +177 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/example_schematic.kicad_sch +145 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/child.kicad_sch +24 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/root.kicad_sch +38 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_hierarchical_labels.py +195 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_kicad_cli.py +116 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_netlist_cache_path.py +29 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic.py +189 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic_hierarchy.py +69 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_visualization.py +136 -0
- package/mcp_servers/kicad-mcp-server/uv.lock +2873 -0
- package/mcp_servers/openscad-mcp-server/.dockerignore +9 -0
- package/mcp_servers/openscad-mcp-server/.github/workflows/test.yml +40 -0
- package/mcp_servers/openscad-mcp-server/Dockerfile +29 -0
- package/mcp_servers/openscad-mcp-server/LICENSE +21 -0
- package/mcp_servers/openscad-mcp-server/README.md +154 -0
- package/mcp_servers/openscad-mcp-server/docs/audit.md +56 -0
- package/mcp_servers/openscad-mcp-server/docs/docker.md +66 -0
- package/mcp_servers/openscad-mcp-server/docs/issue-followup.md +19 -0
- package/mcp_servers/openscad-mcp-server/docs/jetson.md +17 -0
- package/mcp_servers/openscad-mcp-server/glama.json +4 -0
- package/mcp_servers/openscad-mcp-server/legacy/README.md +15 -0
- package/mcp_servers/openscad-mcp-server/legacy/README.original.md +294 -0
- package/mcp_servers/openscad-mcp-server/legacy/implementation_plan.md +100 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/download_sam2_checkpoint.py +115 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/ai/sam_segmentation.py +209 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/models/threestudio_generator.py +231 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/workflow/image_to_model_pipeline.py +260 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/test_sam2_segmentation.py +96 -0
- package/mcp_servers/openscad-mcp-server/legacy/requirements.txt +57 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/README.md +39 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/ai-driven-code-generation.md +122 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/export-formats.md +76 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/ai/ai_service.py.md +51 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/main.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/models/code_generator.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/nlp/parameter_extractor.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/ai/natural-language-processing.md +78 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/nlp/parameter-extraction.md +173 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/export-formats.md +91 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/openscad-basics.md +66 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/primitive-testing.md +79 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/ai_service.py +257 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/gemini_api.py +161 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/venice_api.py +203 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/config.py +121 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main.py +1456 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main.py.new +404 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main_remote.py +401 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/code_generator.py +321 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/cuda_mvs.py +209 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/scad_templates/basic_shapes.scad +144 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/nlp/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/nlp/parameter_extractor.py +388 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/wrapper.py +418 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/__init__.py +1 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/printer_discovery.py +471 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/connection_manager.py +537 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_client.py +435 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_server.py +787 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/error_handling.py +415 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/primitive_tester.py +203 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/test_primitives.py +98 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/__init__.py +1 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/cad_exporter.py +241 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/format_validator.py +206 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_exporter.py +140 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_repair.py +91 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_validator.py +123 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/headless_renderer.py +52 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/renderer.py +177 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/web_interface.py +639 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/workflow/image_approval.py +148 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/workflow/multi_view_to_model_pipeline.py +338 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_complete_workflow.py +374 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_cuda_mvs.py +191 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_gemini_api.py +168 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_approval.py +192 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_approval_workflow.py +251 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_to_model_pipeline.py +145 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_model_selection.py +41 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_multi_view_pipeline.py +290 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_primitives.sh +13 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_rabbit_direct.py +71 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_remote_cuda_mvs.py +283 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_venice_example.py +69 -0
- package/mcp_servers/openscad-mcp-server/pyproject.toml +33 -0
- package/mcp_servers/openscad-mcp-server/requirements.txt +2 -0
- package/mcp_servers/openscad-mcp-server/scad/simple_cube.scad +2 -0
- package/mcp_servers/openscad-mcp-server/scripts/test_docker.py +220 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__init__.py +3 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__main__.py +3 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/engine.py +94 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/geometry.py +242 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/server.py +245 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/service.py +190 -0
- package/mcp_servers/openscad-mcp-server/tests/conftest.py +17 -0
- package/mcp_servers/openscad-mcp-server/tests/test_engine.py +37 -0
- package/mcp_servers/openscad-mcp-server/tests/test_geometry.py +106 -0
- package/mcp_servers/openscad-mcp-server/tests/test_integration.py +172 -0
- package/mcp_servers/openscad-mcp-server/tests/test_transports.py +314 -0
- package/mcp_servers/openscad-mcp-server/uv.lock +1123 -0
- package/package.json +44 -0
- package/scripts/install_mcps.sh +86 -0
- package/scripts/openscad_wrapper.sh +62 -0
- package/scripts/run_kicad_mcp.sh +25 -0
- package/scripts/run_openscad_mcp.sh +41 -0
- package/scripts/test_mcp_connection.py +626 -0
- package/scripts/test_mcp_connection.sh +168 -0
- package/skills/code-first-hardware-design/SKILL.md +260 -0
- package/skills/pcb-constraint-definition/SKILL.md +236 -0
- package/skills/pcb-layout-routing-automation/SKILL.md +153 -0
- package/skills/pcb-validation-dfm-signoff/SKILL.md +194 -0
- package/skills/schematic-datasheet-analysis/SKILL.md +202 -0
package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/ai/natural-language-processing.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Natural Language Processing for 3D Modeling
|
|
2
|
+
|
|
3
|
+
<metadata>
|
|
4
|
+
author: devin-ai-integration
|
|
5
|
+
timestamp: 2025-03-21T01:30:00Z
|
|
6
|
+
version: 1.0.0
|
|
7
|
+
tags: [nlp, 3d-modeling, parameter-extraction, pattern-matching]
|
|
8
|
+
</metadata>
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
Natural Language Processing (NLP) techniques can be applied to extract 3D modeling parameters and intentions from user descriptions. This knowledge document outlines approaches for translating natural language into structured data for 3D model generation.
|
|
13
|
+
|
|
14
|
+
## Approaches
|
|
15
|
+
|
|
16
|
+
### Pattern Matching
|
|
17
|
+
|
|
18
|
+
Regular expression pattern matching is effective for identifying:
|
|
19
|
+
|
|
20
|
+
- Dimensions and measurements
|
|
21
|
+
- Shape types and primitives
|
|
22
|
+
- Operations (union, difference, etc.)
|
|
23
|
+
- Transformations (rotate, scale, etc.)
|
|
24
|
+
- Material properties and colors
|
|
25
|
+
|
|
26
|
+
Example patterns:
|
|
27
|
+
```python
|
|
28
|
+
# Dimension pattern
|
|
29
|
+
dimension_pattern = r'(\d+(?:\.\d+)?)\s*(mm|cm|m|inch|in)'
|
|
30
|
+
|
|
31
|
+
# Shape pattern
|
|
32
|
+
shape_pattern = r'\b(cube|box|sphere|ball|cylinder|tube|cone|pyramid)\b'
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Contextual Understanding
|
|
36
|
+
|
|
37
|
+
Beyond simple pattern matching, contextual understanding involves:
|
|
38
|
+
|
|
39
|
+
- Identifying relationships between objects
|
|
40
|
+
- Understanding relative positioning
|
|
41
|
+
- Resolving ambiguous references
|
|
42
|
+
- Maintaining dialog state for multi-turn interactions
|
|
43
|
+
|
|
44
|
+
### Hybrid Approaches
|
|
45
|
+
|
|
46
|
+
Combining pattern matching with contextual rules provides:
|
|
47
|
+
|
|
48
|
+
- Better accuracy than pure pattern matching
|
|
49
|
+
- Lower computational requirements than full ML approaches
|
|
50
|
+
- More maintainable and debuggable systems
|
|
51
|
+
- Flexibility to handle diverse descriptions
|
|
52
|
+
|
|
53
|
+
## Parameter Extraction
|
|
54
|
+
|
|
55
|
+
Key parameters to extract include:
|
|
56
|
+
|
|
57
|
+
- **Dimensions**: Width, height, depth, radius, diameter
|
|
58
|
+
- **Positions**: Coordinates, relative positions
|
|
59
|
+
- **Operations**: Boolean operations, transformations
|
|
60
|
+
- **Features**: Holes, fillets, chamfers, text
|
|
61
|
+
- **Properties**: Color, material, finish
|
|
62
|
+
|
|
63
|
+
## Implementation Considerations
|
|
64
|
+
|
|
65
|
+
- **Ambiguity Resolution**: Handle cases where measurements could apply to multiple dimensions
|
|
66
|
+
- **Default Values**: Provide sensible defaults for unspecified parameters
|
|
67
|
+
- **Unit Conversion**: Convert between different measurement units
|
|
68
|
+
- **Error Handling**: Gracefully handle unparseable or contradictory descriptions
|
|
69
|
+
- **Dialog Management**: Maintain state for multi-turn interactions to refine models
|
|
70
|
+
|
|
71
|
+
## Evaluation Metrics
|
|
72
|
+
|
|
73
|
+
Effective NLP for 3D modeling can be evaluated by:
|
|
74
|
+
|
|
75
|
+
- **Accuracy**: Correctness of extracted parameters
|
|
76
|
+
- **Completeness**: Percentage of required parameters successfully extracted
|
|
77
|
+
- **Robustness**: Ability to handle diverse phrasings and descriptions
|
|
78
|
+
- **User Satisfaction**: Subjective evaluation of the resulting models
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# Parameter Extraction for 3D Modeling
|
|
2
|
+
|
|
3
|
+
<metadata>
|
|
4
|
+
author: devin-ai-integration
|
|
5
|
+
timestamp: 2025-03-21T01:30:00Z
|
|
6
|
+
version: 1.0.0
|
|
7
|
+
tags: [parameter-extraction, nlp, 3d-modeling, regex]
|
|
8
|
+
</metadata>
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
Parameter extraction is the process of identifying and extracting structured data from natural language descriptions of 3D models. This is a critical component in translating user intentions into actionable modeling parameters.
|
|
13
|
+
|
|
14
|
+
## Extraction Techniques
|
|
15
|
+
|
|
16
|
+
### Regular Expression Patterns
|
|
17
|
+
|
|
18
|
+
Regular expressions provide a powerful way to extract parameters:
|
|
19
|
+
|
|
20
|
+
```python
|
|
21
|
+
# Extract dimensions with units
|
|
22
|
+
dimension_pattern = r'(\d+(?:\.\d+)?)\s*(mm|cm|m|inch|in)'
|
|
23
|
+
|
|
24
|
+
# Extract color information
|
|
25
|
+
color_pattern = r'\b(red|green|blue|yellow|black|white|purple|orange|brown)\b'
|
|
26
|
+
|
|
27
|
+
# Extract shape type
|
|
28
|
+
shape_pattern = r'\b(cube|box|sphere|ball|cylinder|tube|cone|pyramid)\b'
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Contextual Parameter Association
|
|
32
|
+
|
|
33
|
+
After extracting raw values, they must be associated with the correct parameter:
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
def associate_dimension(value, description):
|
|
37
|
+
"""Associate a dimension value with the correct parameter based on context."""
|
|
38
|
+
if "width" in description or "wide" in description:
|
|
39
|
+
return ("width", value)
|
|
40
|
+
elif "height" in description or "tall" in description:
|
|
41
|
+
return ("height", value)
|
|
42
|
+
elif "depth" in description or "deep" in description:
|
|
43
|
+
return ("depth", value)
|
|
44
|
+
elif "radius" in description:
|
|
45
|
+
return ("radius", value)
|
|
46
|
+
elif "diameter" in description:
|
|
47
|
+
return ("radius", value / 2) # Convert diameter to radius
|
|
48
|
+
else:
|
|
49
|
+
return ("unknown", value)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Default Parameters
|
|
53
|
+
|
|
54
|
+
Provide sensible defaults for unspecified parameters:
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
default_parameters = {
|
|
58
|
+
"cube": {
|
|
59
|
+
"width": 10,
|
|
60
|
+
"height": 10,
|
|
61
|
+
"depth": 10,
|
|
62
|
+
"center": True
|
|
63
|
+
},
|
|
64
|
+
"sphere": {
|
|
65
|
+
"radius": 10,
|
|
66
|
+
"segments": 32
|
|
67
|
+
},
|
|
68
|
+
"cylinder": {
|
|
69
|
+
"radius": 5,
|
|
70
|
+
"height": 10,
|
|
71
|
+
"center": True,
|
|
72
|
+
"segments": 32
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Parameter Types
|
|
78
|
+
|
|
79
|
+
Common parameter types to extract include:
|
|
80
|
+
|
|
81
|
+
- **Dimensions**: Width, height, depth, radius, diameter
|
|
82
|
+
- **Positions**: X, Y, Z coordinates
|
|
83
|
+
- **Angles**: Rotation angles
|
|
84
|
+
- **Counts**: Number of sides, segments, iterations
|
|
85
|
+
- **Booleans**: Center, solid/hollow
|
|
86
|
+
- **Colors**: RGB values or named colors
|
|
87
|
+
- **Operations**: Union, difference, intersection
|
|
88
|
+
- **Transformations**: Translate, rotate, scale, mirror
|
|
89
|
+
|
|
90
|
+
## Challenges and Solutions
|
|
91
|
+
|
|
92
|
+
### Ambiguity
|
|
93
|
+
|
|
94
|
+
When parameters are ambiguous, use contextual clues or ask clarifying questions:
|
|
95
|
+
|
|
96
|
+
```python
|
|
97
|
+
def resolve_ambiguity(value, possible_parameters, description):
|
|
98
|
+
"""Resolve ambiguity between possible parameters."""
|
|
99
|
+
# Try to resolve using context
|
|
100
|
+
for param in possible_parameters:
|
|
101
|
+
if param in description:
|
|
102
|
+
return param
|
|
103
|
+
|
|
104
|
+
# If still ambiguous, return a question to ask
|
|
105
|
+
return f"Is {value} the {' or '.join(possible_parameters)}?"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Unit Conversion
|
|
109
|
+
|
|
110
|
+
Convert all measurements to a standard unit (millimeters):
|
|
111
|
+
|
|
112
|
+
```python
|
|
113
|
+
def convert_to_mm(value, unit):
|
|
114
|
+
"""Convert a value from the given unit to millimeters."""
|
|
115
|
+
if unit in ["mm", "millimeter", "millimeters"]:
|
|
116
|
+
return value
|
|
117
|
+
elif unit in ["cm", "centimeter", "centimeters"]:
|
|
118
|
+
return value * 10
|
|
119
|
+
elif unit in ["m", "meter", "meters"]:
|
|
120
|
+
return value * 1000
|
|
121
|
+
elif unit in ["in", "inch", "inches"]:
|
|
122
|
+
return value * 25.4
|
|
123
|
+
else:
|
|
124
|
+
return value # Assume mm if unit is unknown
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Dialog State Management
|
|
128
|
+
|
|
129
|
+
Maintain state across multiple interactions:
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
class DialogState:
|
|
133
|
+
def __init__(self):
|
|
134
|
+
self.shape_type = None
|
|
135
|
+
self.parameters = {}
|
|
136
|
+
self.questions = []
|
|
137
|
+
self.confirmed = False
|
|
138
|
+
|
|
139
|
+
def add_parameter(self, name, value):
|
|
140
|
+
self.parameters[name] = value
|
|
141
|
+
|
|
142
|
+
def add_question(self, question):
|
|
143
|
+
self.questions.append(question)
|
|
144
|
+
|
|
145
|
+
def is_complete(self):
|
|
146
|
+
"""Check if all required parameters are present."""
|
|
147
|
+
if not self.shape_type:
|
|
148
|
+
return False
|
|
149
|
+
|
|
150
|
+
required_params = self.get_required_parameters()
|
|
151
|
+
return all(param in self.parameters for param in required_params)
|
|
152
|
+
|
|
153
|
+
def get_required_parameters(self):
|
|
154
|
+
"""Get the required parameters for the current shape type."""
|
|
155
|
+
if self.shape_type == "cube":
|
|
156
|
+
return ["width", "height", "depth"]
|
|
157
|
+
elif self.shape_type == "sphere":
|
|
158
|
+
return ["radius"]
|
|
159
|
+
elif self.shape_type == "cylinder":
|
|
160
|
+
return ["radius", "height"]
|
|
161
|
+
else:
|
|
162
|
+
return []
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Best Practices
|
|
166
|
+
|
|
167
|
+
- Start with simple pattern matching and add complexity as needed
|
|
168
|
+
- Provide sensible defaults for all parameters
|
|
169
|
+
- Use contextual clues to resolve ambiguity
|
|
170
|
+
- Maintain dialog state for multi-turn interactions
|
|
171
|
+
- Convert all measurements to a standard unit
|
|
172
|
+
- Validate extracted parameters for reasonableness
|
|
173
|
+
- Handle errors gracefully with helpful messages
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# OpenSCAD Export Formats
|
|
2
|
+
|
|
3
|
+
<metadata>
|
|
4
|
+
author: devin-ai-integration
|
|
5
|
+
timestamp: 2025-03-21T12:00:00Z
|
|
6
|
+
version: 1.0.0
|
|
7
|
+
tags: [openscad, export-formats, 3d-printing, prusa, bambu]
|
|
8
|
+
</metadata>
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
OpenSCAD supports exporting 3D models in various formats, each with different capabilities for preserving parametric properties and metadata. This document focuses on formats suitable for Prusa and Bambu printers, with an emphasis on alternatives to STL.
|
|
13
|
+
|
|
14
|
+
## Recommended Formats
|
|
15
|
+
|
|
16
|
+
### 3MF (3D Manufacturing Format)
|
|
17
|
+
|
|
18
|
+
3MF is a modern replacement for STL that addresses many of its limitations:
|
|
19
|
+
|
|
20
|
+
- **Metadata Support**: Includes model information, materials, colors
|
|
21
|
+
- **Compact Size**: More efficient encoding than STL
|
|
22
|
+
- **Multiple Objects**: Can contain multiple parts in a single file
|
|
23
|
+
- **Printer Compatibility**: Widely supported by Prusa and Bambu printers
|
|
24
|
+
- **Implementation**: ZIP archive containing XML files
|
|
25
|
+
|
|
26
|
+
```openscad
|
|
27
|
+
// Export to 3MF from command line
|
|
28
|
+
// openscad -o model.3mf model.scad
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### AMF (Additive Manufacturing File Format)
|
|
32
|
+
|
|
33
|
+
AMF is another modern format that supports:
|
|
34
|
+
|
|
35
|
+
- **Material Information**: Material properties and colors
|
|
36
|
+
- **Curved Surfaces**: Better representation than STL's triangles
|
|
37
|
+
- **Metadata**: Design information and parameters
|
|
38
|
+
- **Implementation**: XML-based format
|
|
39
|
+
|
|
40
|
+
```openscad
|
|
41
|
+
// Export to AMF from command line
|
|
42
|
+
// openscad -o model.amf model.scad
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### CSG (Constructive Solid Geometry)
|
|
46
|
+
|
|
47
|
+
CSG is OpenSCAD's native format:
|
|
48
|
+
|
|
49
|
+
- **Fully Parametric**: Preserves all construction operations
|
|
50
|
+
- **Editable**: Can be reopened and modified in OpenSCAD
|
|
51
|
+
- **Implementation**: OpenSCAD's internal representation
|
|
52
|
+
|
|
53
|
+
```openscad
|
|
54
|
+
// Export to CSG from command line
|
|
55
|
+
// openscad -o model.csg model.scad
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### SCAD (OpenSCAD Source Code)
|
|
59
|
+
|
|
60
|
+
The original SCAD file preserves all parametric properties:
|
|
61
|
+
|
|
62
|
+
- **Complete Parameterization**: All variables and relationships
|
|
63
|
+
- **Code Structure**: Modules, functions, and comments
|
|
64
|
+
- **Implementation**: Text file with OpenSCAD code
|
|
65
|
+
|
|
66
|
+
## Printer Compatibility
|
|
67
|
+
|
|
68
|
+
### Prusa Printers
|
|
69
|
+
|
|
70
|
+
Prusa printers work well with:
|
|
71
|
+
|
|
72
|
+
- **3MF**: Full support in PrusaSlicer
|
|
73
|
+
- **AMF**: Good support for materials and colors
|
|
74
|
+
- **STL**: Supported but with limitations
|
|
75
|
+
|
|
76
|
+
### Bambu Printers
|
|
77
|
+
|
|
78
|
+
Bambu printers work best with:
|
|
79
|
+
|
|
80
|
+
- **3MF**: Preferred format for Bambu Lab software
|
|
81
|
+
- **AMF**: Well supported
|
|
82
|
+
- **STL**: Basic support
|
|
83
|
+
|
|
84
|
+
## Implementation Notes
|
|
85
|
+
|
|
86
|
+
When implementing export functionality:
|
|
87
|
+
|
|
88
|
+
1. Use OpenSCAD's command-line interface for reliable exports
|
|
89
|
+
2. Add metadata to 3MF and AMF files for better organization
|
|
90
|
+
3. Test exported files with actual printer software
|
|
91
|
+
4. Validate files before sending to printers
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# OpenSCAD Basics
|
|
2
|
+
|
|
3
|
+
<metadata>
|
|
4
|
+
author: devin-ai-integration
|
|
5
|
+
timestamp: 2025-03-21T01:30:00Z
|
|
6
|
+
version: 1.0.0
|
|
7
|
+
tags: [openscad, 3d-modeling, csg, parametric-design]
|
|
8
|
+
</metadata>
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
OpenSCAD is a programmer's solid 3D CAD modeler that uses a scripting language to define 3D objects. Unlike traditional CAD software that focuses on interactive modeling, OpenSCAD emphasizes programmatic and parametric design.
|
|
13
|
+
|
|
14
|
+
## Key Concepts
|
|
15
|
+
|
|
16
|
+
### Constructive Solid Geometry (CSG)
|
|
17
|
+
|
|
18
|
+
OpenSCAD uses CSG operations to create complex models by combining simpler primitives:
|
|
19
|
+
|
|
20
|
+
- **Union**: Combines multiple objects (`union() { ... }`)
|
|
21
|
+
- **Difference**: Subtracts one object from another (`difference() { ... }`)
|
|
22
|
+
- **Intersection**: Creates an object from the overlapping portions of other objects (`intersection() { ... }`)
|
|
23
|
+
|
|
24
|
+
### Primitive Shapes
|
|
25
|
+
|
|
26
|
+
OpenSCAD provides several built-in primitive shapes:
|
|
27
|
+
|
|
28
|
+
- **Cube**: `cube([width, depth, height], center=true/false)`
|
|
29
|
+
- **Sphere**: `sphere(r=radius, $fn=segments)`
|
|
30
|
+
- **Cylinder**: `cylinder(h=height, r=radius, center=true/false, $fn=segments)`
|
|
31
|
+
- **Polyhedron**: For complex shapes with defined faces
|
|
32
|
+
|
|
33
|
+
### Transformations
|
|
34
|
+
|
|
35
|
+
Objects can be transformed using:
|
|
36
|
+
|
|
37
|
+
- **Translate**: `translate([x, y, z]) { ... }`
|
|
38
|
+
- **Rotate**: `rotate([x_deg, y_deg, z_deg]) { ... }`
|
|
39
|
+
- **Scale**: `scale([x, y, z]) { ... }`
|
|
40
|
+
- **Mirror**: `mirror([x, y, z]) { ... }`
|
|
41
|
+
|
|
42
|
+
### Parametric Design
|
|
43
|
+
|
|
44
|
+
OpenSCAD excels at parametric design:
|
|
45
|
+
|
|
46
|
+
- Variables can define dimensions and relationships
|
|
47
|
+
- Modules can create reusable components with parameters
|
|
48
|
+
- Mathematical expressions can define complex relationships
|
|
49
|
+
|
|
50
|
+
## Command Line Usage
|
|
51
|
+
|
|
52
|
+
OpenSCAD can be run headless using command-line options:
|
|
53
|
+
|
|
54
|
+
- Generate STL: `openscad -o output.stl input.scad`
|
|
55
|
+
- Pass parameters: `openscad -D "width=10" -D "height=20" -o output.stl input.scad`
|
|
56
|
+
- Generate PNG preview: `openscad --camera=0,0,0,0,0,0,50 --imgsize=800,600 -o preview.png input.scad`
|
|
57
|
+
|
|
58
|
+
## Best Practices
|
|
59
|
+
|
|
60
|
+
- Use modules for reusable components
|
|
61
|
+
- Parameterize designs for flexibility
|
|
62
|
+
- Use descriptive variable names
|
|
63
|
+
- Comment code for clarity
|
|
64
|
+
- Organize complex designs hierarchically
|
|
65
|
+
- Use $fn judiciously for performance
|
|
66
|
+
- Ensure models are manifold (watertight) for 3D printing
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Testing OpenSCAD Primitives
|
|
2
|
+
|
|
3
|
+
<metadata>
|
|
4
|
+
author: devin-ai-integration
|
|
5
|
+
timestamp: 2025-03-21T12:00:00Z
|
|
6
|
+
version: 1.0.0
|
|
7
|
+
tags: [openscad, primitives, testing, 3d-modeling]
|
|
8
|
+
</metadata>
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
Testing OpenSCAD primitives is essential to ensure that the MCP server can reliably generate and export 3D models. This document outlines approaches for programmatically testing primitives and validating their exports.
|
|
13
|
+
|
|
14
|
+
## Primitive Types
|
|
15
|
+
|
|
16
|
+
The OpenSCAD MCP Server supports these primitive types:
|
|
17
|
+
|
|
18
|
+
- **Basic Shapes**: cube, sphere, cylinder
|
|
19
|
+
- **Complex Shapes**: cone, torus, hexagonal_prism
|
|
20
|
+
- **Containers**: hollow_box, rounded_box, tube
|
|
21
|
+
- **Text**: 3D text with customizable parameters
|
|
22
|
+
|
|
23
|
+
## Testing Approach
|
|
24
|
+
|
|
25
|
+
### Parameter Testing
|
|
26
|
+
|
|
27
|
+
Each primitive should be tested with:
|
|
28
|
+
|
|
29
|
+
- **Default Parameters**: Ensure the primitive renders correctly with default values
|
|
30
|
+
- **Boundary Values**: Test minimum and maximum reasonable values
|
|
31
|
+
- **Special Cases**: Test cases like zero dimensions, negative values
|
|
32
|
+
|
|
33
|
+
### Export Testing
|
|
34
|
+
|
|
35
|
+
For each primitive and parameter set:
|
|
36
|
+
|
|
37
|
+
- **Export Formats**: Test export to 3MF, AMF, CSG, and SCAD formats
|
|
38
|
+
- **Format Validation**: Ensure exported files meet format specifications
|
|
39
|
+
- **Metadata Preservation**: Verify that parametric properties are preserved
|
|
40
|
+
|
|
41
|
+
### Integration Testing
|
|
42
|
+
|
|
43
|
+
Test the full pipeline:
|
|
44
|
+
|
|
45
|
+
- **Natural Language → Parameters**: Test parameter extraction
|
|
46
|
+
- **Parameters → OpenSCAD Code**: Test code generation
|
|
47
|
+
- **OpenSCAD Code → Export**: Test file export
|
|
48
|
+
- **Export → Printer**: Test compatibility with printer software
|
|
49
|
+
|
|
50
|
+
## Validation Criteria
|
|
51
|
+
|
|
52
|
+
Exported models should meet these criteria:
|
|
53
|
+
|
|
54
|
+
- **Manifold**: Models should be watertight (no holes in the mesh)
|
|
55
|
+
- **Valid Format**: Files should validate against format specifications
|
|
56
|
+
- **Metadata**: Should contain relevant model metadata
|
|
57
|
+
- **Render Performance**: Models should render efficiently
|
|
58
|
+
|
|
59
|
+
## Implementation
|
|
60
|
+
|
|
61
|
+
The `PrimitiveTester` class implements this testing approach:
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
# Example usage
|
|
65
|
+
tester = PrimitiveTester(code_generator, cad_exporter)
|
|
66
|
+
results = tester.test_all_primitives()
|
|
67
|
+
|
|
68
|
+
# Test specific primitives
|
|
69
|
+
cube_results = tester.test_primitive("cube")
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Printer Compatibility Tests
|
|
73
|
+
|
|
74
|
+
Before sending to physical printers:
|
|
75
|
+
|
|
76
|
+
1. Import exports into PrusaSlicer or Bambu Studio
|
|
77
|
+
2. Check for import warnings or errors
|
|
78
|
+
3. Verify that models slice correctly
|
|
79
|
+
4. Test prints with simple examples
|
|
File without changes
|