samlpy 0.2.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.
- samlpy-0.2.0/LIBRARY.md +180 -0
- samlpy-0.2.0/PKG-INFO +207 -0
- samlpy-0.2.0/pyproject.toml +55 -0
- samlpy-0.2.0/setup.cfg +4 -0
- samlpy-0.2.0/src/cadi_saml/__init__.py +57 -0
- samlpy-0.2.0/src/cadi_saml/backend/__init__.py +3 -0
- samlpy-0.2.0/src/cadi_saml/backend/occt_backend.py +1786 -0
- samlpy-0.2.0/src/cadi_saml/core/__init__.py +5 -0
- samlpy-0.2.0/src/cadi_saml/core/assembly.py +1648 -0
- samlpy-0.2.0/src/cadi_saml/core/ports.py +162 -0
- samlpy-0.2.0/src/cadi_saml/core/sketch.py +213 -0
- samlpy-0.2.0/src/cadi_saml/core/text_engine.py +203 -0
- samlpy-0.2.0/src/cadi_saml/ir/__init__.py +24 -0
- samlpy-0.2.0/src/cadi_saml/ir/nodes.py +224 -0
- samlpy-0.2.0/src/cadi_saml/ir/parser.py +113 -0
- samlpy-0.2.0/src/cadi_saml/reverse/__init__.py +3 -0
- samlpy-0.2.0/src/cadi_saml/reverse/step_importer.py +165 -0
- samlpy-0.2.0/src/cadi_saml/std_parts/__init__.py +26 -0
- samlpy-0.2.0/src/cadi_saml/std_parts/bearings.py +96 -0
- samlpy-0.2.0/src/cadi_saml/std_parts/fasteners.py +88 -0
- samlpy-0.2.0/src/cadi_saml/std_parts/gears.py +258 -0
- samlpy-0.2.0/src/cadi_saml/std_parts/motors.py +170 -0
- samlpy-0.2.0/src/cadi_saml/std_parts/motorsport.py +254 -0
- samlpy-0.2.0/src/cadi_saml/std_parts/nuts.py +169 -0
- samlpy-0.2.0/src/cadi_saml/std_parts/profiles.py +138 -0
- samlpy-0.2.0/src/cadi_saml/std_parts/springs.py +249 -0
- samlpy-0.2.0/src/cadi_saml/std_parts/washers.py +93 -0
- samlpy-0.2.0/src/cadi_saml/validation/__init__.py +3 -0
- samlpy-0.2.0/src/cadi_saml/validation/validation_engineer.py +413 -0
- samlpy-0.2.0/src/samlpy/__init__.py +77 -0
- samlpy-0.2.0/src/samlpy.egg-info/PKG-INFO +207 -0
- samlpy-0.2.0/src/samlpy.egg-info/SOURCES.txt +46 -0
- samlpy-0.2.0/src/samlpy.egg-info/dependency_links.txt +1 -0
- samlpy-0.2.0/src/samlpy.egg-info/requires.txt +7 -0
- samlpy-0.2.0/src/samlpy.egg-info/top_level.txt +2 -0
- samlpy-0.2.0/tests/test_advanced_features.py +141 -0
- samlpy-0.2.0/tests/test_advanced_occt_capabilities.py +77 -0
- samlpy-0.2.0/tests/test_advanced_occt_modules.py +143 -0
- samlpy-0.2.0/tests/test_aesthetic_shapes.py +199 -0
- samlpy-0.2.0/tests/test_ai_engine.py +144 -0
- samlpy-0.2.0/tests/test_architectural_improvements.py +218 -0
- samlpy-0.2.0/tests/test_e2e_assembly.py +81 -0
- samlpy-0.2.0/tests/test_extended_capabilities.py +170 -0
- samlpy-0.2.0/tests/test_formula_student_wheel.py +436 -0
- samlpy-0.2.0/tests/test_library_upgrades.py +174 -0
- samlpy-0.2.0/tests/test_reverse_engineering.py +46 -0
- samlpy-0.2.0/tests/test_robustness_and_safety.py +149 -0
- samlpy-0.2.0/tests/test_token_reduction.py +193 -0
samlpy-0.2.0/LIBRARY.md
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# LLM-Dostu CAD Kütüphanesi ve Montaj Mimarisi Özellikleri (LLM CAD Library Specs)
|
|
2
|
+
|
|
3
|
+
Bu doküman, CADi (`Project-CAD-`) projemiz bünyesinde geliştirilecek LLM-dostu özel CAD kütüphanesi, montaj motoru, veri toplama boru hattı ve AI gateway altyapısının temel mimari gereksinimlerini ve tasarım ilkelerini içerir.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Neden Özel Bir LLM CAD Kütüphanesi / DSL?
|
|
8
|
+
|
|
9
|
+
Genel 3D CAD kütüphaneleri (CadQuery, OpenCASCADE, PythonOCC) insan geliştiriciler için tasarlanmıştır ve LLM'ler (Claude, GPT, DeepSeek) tarafından kodlandığında şu sorunlara yol açar:
|
|
10
|
+
* **Yüksek Token Maliyeti**: Basit bir parça veya montaj için yüzlerce satır detay kod üretilmesi.
|
|
11
|
+
* **Sentaks Hataları & Bağlam Kaybı**: Metod zincirleme (fluent API) yapılarının karmaşıklığı nedeniyle LLM'lerin sentaks hatası yapması.
|
|
12
|
+
* **Topolojik Kararsızlık**: Yüzey, delik ve kenarların adreslenmesinde illüzyon (hallucination) oluşması.
|
|
13
|
+
|
|
14
|
+
### 💡 Çözüm: LLM-Dostu Bildirimsel (Declarative) Kütüphane / DSL
|
|
15
|
+
LLM-dostu kütüphanemiz, Python tabanlı yalın bir sözdizimine (SAML - Spatial Assembly Modeling Language) sahip olacak ve doğrudan **OpenCASCADE (OCCT / OCP)** motoru üzerine kurulacaktır:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
[SAML DSL (LLM Arayüzü)]
|
|
19
|
+
↓
|
|
20
|
+
[SAML Compiler & IR (Kural ve İlişki Çözücü)]
|
|
21
|
+
↓
|
|
22
|
+
[CADi OCCT Backend (Saf OpenCASCADE Çekirdeği)]
|
|
23
|
+
├── BRep & Topoloji Katmanı (TopoDS_Shape, Faces, Edges)
|
|
24
|
+
├── Doğrudan Montaj & Eklemler (Joints/Mates Motoru)
|
|
25
|
+
└── Tersine Mühendislik & Import Motoru (STEP/IGES)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Neden Doğrudan OpenCASCADE (OCCT)?**
|
|
29
|
+
* **Doğrudan B-Rep ve Topoloji Kontrolü**: CadQuery veya üçüncü parti wrapper'ların getirdiği adlandırma (naming) ve kararsızlık hataları kökten çözülür.
|
|
30
|
+
* **Tersine Mühendislik (STEP → SAML)**: STEP dosyalarının en saf haliyle okunup yüzey/delik analizi yapılması doğrudan OpenCASCADE API'leri ile kayıpsız çalışır.
|
|
31
|
+
* **Dış Katman Bağımsızlığı**: Gereksiz bağımlılıklar elenir, doğrudan endüstriyel C++ çekirdeği Python üzerinden kontrol edilir.
|
|
32
|
+
|
|
33
|
+
> **Strateji**: `reference_build123d` kaynak kodları incelenmiş olup; montaj eklemleri, B-Rep selektörleri ve STEP import gibi kritik alt yapılar kopyalanıp kendi OpenCASCADE altyapımıza uyarlanacaktır.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 2. Kütüphanede Olması Gereken Temel Özellikler
|
|
38
|
+
|
|
39
|
+
### A. Üst Düzey Montaj ve İlişkilendirme (High-Level Assembly & Mates)
|
|
40
|
+
* Parçaları uzayda $X, Y, Z$ koordinatlarıyla elle yerleştirmek yerine CAD standartlarındaki **Montaj İlişkileri (Mates & Constraints)** kullanılır.
|
|
41
|
+
* **Örnek**:
|
|
42
|
+
```python
|
|
43
|
+
Assembly.connect(partA.face("bottom"), partB.face("top"), mate_type="FLUSH", offset=0)
|
|
44
|
+
Assembly.align_holes(partA.hole("h1"), partB.hole("h1"))
|
|
45
|
+
```
|
|
46
|
+
* **Kazanım**: LLM'in uzamsal matris hesaplama yükünü sıfırlar, token tüketimini %90 düşürür.
|
|
47
|
+
|
|
48
|
+
### B. Dahili Standart Parça Kütüphanesi (Built-in Standard Component Library)
|
|
49
|
+
* Cıvata, somun, rulman, alüminyum profil, motor gibi standart endüstriyel bileşenler LLM tarafından sıfırdan çizilmez, tek satırda çağrılır:
|
|
50
|
+
```python
|
|
51
|
+
bolt1 = Fastener.ISO4762(size="M6", length=20)
|
|
52
|
+
bearing1 = Bearing.SKF("608ZZ")
|
|
53
|
+
motor1 = Component.NEMA17(length=40)
|
|
54
|
+
```
|
|
55
|
+
* **Kazanım**: 1000 token harcanacak standart bileşenler 5-10 token'a düşer.
|
|
56
|
+
|
|
57
|
+
### C. Çapa / Bağlantı Noktaları (Anchor Ports & Interfaces)
|
|
58
|
+
* Parçalar kendi üzerinde montaj portları barındırır:
|
|
59
|
+
```python
|
|
60
|
+
Assembly.attach(motor.port("shaft"), wheel.port("hub"))
|
|
61
|
+
```
|
|
62
|
+
* **Kazanım**: Parçaların iç içe geçme ve çakışma (clash) hataları engellenir.
|
|
63
|
+
|
|
64
|
+
### D. Değişken Bağlamalı Parametrik Mimari (Cascading Parametric Variables)
|
|
65
|
+
* Tüm montaj tek bir ana değişkene (`Master Parameter`) bağlanır:
|
|
66
|
+
```python
|
|
67
|
+
with Assembly("Gearbox") as app:
|
|
68
|
+
app.set_param("box_width", 120)
|
|
69
|
+
# Tüm iç parçalar box_width parametresine göre otomatik ölçeklenir
|
|
70
|
+
```
|
|
71
|
+
* **Kazanım**: Kullanıcı revizyon istediğinde LLM tüm kodu baştan yazmak yerine sadece 1 parametreyi değiştirir (%98 token tasarrufu).
|
|
72
|
+
|
|
73
|
+
### E. Dosyadan Koda Dönüşüm / Tersine Mühendislik (Import & Reverse Engineering)
|
|
74
|
+
* Mevcut endüstriyel CAD dosyaları (STEP, IGES, STL, DXF) doğrudan sisteme aktarılıp SAML koduna dönüştürülür:
|
|
75
|
+
```python
|
|
76
|
+
# Dosyadan SAML kodu üret
|
|
77
|
+
model = Assembly.from_step("gearbox.step")
|
|
78
|
+
dsl_code = model.to_saml() # → LLM-dostu SAML kodu
|
|
79
|
+
params = model.extract_params() # → Parametrik değişkenler
|
|
80
|
+
|
|
81
|
+
# Görsel teknik çizimden (OCR + AI)
|
|
82
|
+
model = Assembly.from_drawing("blueprint.pdf", ocr=True)
|
|
83
|
+
```
|
|
84
|
+
* **Kazanım**:
|
|
85
|
+
* Mevcut endüstriyel miras (legacy) dosyalar sisteme dahil edilebilir
|
|
86
|
+
* `(STEP dosyası → SAML kodu)` çifti → Fine-tuning veri seti
|
|
87
|
+
* Kullanıcı "bu parçayı al ve şu değişikliği yap" diyebilir (edit workflow)
|
|
88
|
+
* DeepCAD transpiling adımını (Bölüm 3.2) otomatikleştirir
|
|
89
|
+
|
|
90
|
+
### F. Geometri Doğrulama Katmanı (Validation Engine)
|
|
91
|
+
* Üretilen veya içe aktarılan tüm geometri çalıştırılmadan önce doğrulanır:
|
|
92
|
+
```python
|
|
93
|
+
validator = ValidationEngineer()
|
|
94
|
+
validator.check_manifold(part) # Su geçirmez kapalı yüzey mi?
|
|
95
|
+
validator.check_tolerances(part) # Üretim toleransları mantıklı mı?
|
|
96
|
+
validator.check_assembly_clash(asm) # Parçalar çakışıyor mu?
|
|
97
|
+
validator.check_units_consistency(asm) # mm/inch karışıklığı var mı?
|
|
98
|
+
```
|
|
99
|
+
* **Kazanım**: Hatalı geometri LLM'e yapılandırılmış doğal dil geri bildirimi olarak döner (stack trace yerine NL açıklama → LLM'in hatayı anlayıp düzeltmesi kolaylaşır).
|
|
100
|
+
|
|
101
|
+
### G. Versiyon Kontrolü ve Kısmi Revizyon (Versioning & Diff-Edit)
|
|
102
|
+
* Her SAML kodu commit'i parametreler + hash ile izlenir; LLM tüm kodu baştan yazmak yerine sadece değişen bloğu günceller:
|
|
103
|
+
```python
|
|
104
|
+
# Parçayı tamamen yeniden yazmak yerine güncelle
|
|
105
|
+
Assembly.update_part("gearbox", "cover", wall_thickness=3.5)
|
|
106
|
+
Assembly.diff(v1, v2) # → Değişen parametreler ve geometri farkı
|
|
107
|
+
```
|
|
108
|
+
* **Kazanım**: %95+ token tasarrufu, revizyon geçmişi izlenebilir, DPO/RLHF için negatif örnek kaydı.
|
|
109
|
+
|
|
110
|
+
### H. Zorunlu Metadata Şeması (Required Metadata)
|
|
111
|
+
* Her SAML dosyası üretim için gereken meta bilgileri içerir:
|
|
112
|
+
```python
|
|
113
|
+
Assembly(
|
|
114
|
+
name="GearboxV2",
|
|
115
|
+
units="mm", # Zorunlu: mm | inch | m
|
|
116
|
+
tolerance_standard="ISO 2768-m", # Zorunlu: üretim toleransı
|
|
117
|
+
material="AlSi10Mg", # Opsiyonel: malzeme
|
|
118
|
+
export=["STEP", "STL", "DXF"], # Çıktı formatları
|
|
119
|
+
)
|
|
120
|
+
```
|
|
121
|
+
* **Kazanım**: mm/inch karışıklığı ve tolerans hatası CAD'de ölümcüldür; DSL'de first-class citizen yapılması zorunludur.
|
|
122
|
+
|
|
123
|
+
### I. build123d'den Alınacak ve OpenCASCADE ile Özelleştirilecek Modüller
|
|
124
|
+
|
|
125
|
+
Proje dizinine indirilen (`library/reference_build123d`) kaynak kodlarından kütüphanemize doğrudan adapte edilecek kritik bileşenler:
|
|
126
|
+
|
|
127
|
+
1. **Montaj ve Eklem Sistemi (`joints.py`):**
|
|
128
|
+
* *Neden gerekli?* `RigidJoint`, `RevoluteJoint`, `LinearJoint` gibi nesnelerin OpenCASCADE matris dönüşümlerine (`gp_Trsf`) nasıl bağlandığı hazır.
|
|
129
|
+
* *Bizim uyarlamamız:* SAML'in `Assembly.connect(mate_type=...)` yapısına doğrudan entegre edilecek.
|
|
130
|
+
|
|
131
|
+
2. **Topoloji ve Yüzey Seçiciler (`topology/` & `geometry.py`):**
|
|
132
|
+
* *Neden gerekli?* `Face.filter_by()`, `Edge.filter_by()`, en üst yüzeyi bulma (`>Z`), silindirik delikleri ayıklama mantığı.
|
|
133
|
+
* *Bizim uyarlamamız:* Hallucination'ı önlemek için yüzeylere deterministik ID/çapa atayan modül olarak sadeleştirilecek.
|
|
134
|
+
|
|
135
|
+
3. **İçe Aktarma ve B-Rep Dönüşümü (`importers.py` & `brep_from_stl.py`):**
|
|
136
|
+
* *Neden gerekli?* STEP ve STL dosyalarını OpenCASCADE nesnelerine (`TopoDS_Shape`, `TopoDS_Compound`) dönüştürme fonksiyonları.
|
|
137
|
+
* *Bizim uyarlamamız:* `Assembly.from_step()` ve Tersine Mühendislik (Dosyadan SAML Koda) boru hattının çekirdeği yapılacak.
|
|
138
|
+
|
|
139
|
+
4. **Dışa Aktarma Motoru (`exporters.py` & `exporters3d.py`):**
|
|
140
|
+
* *Neden gerekli?* Renk, malzeme, montaj hiyerarşisini kaybetmeden STEP/GLTF/STL formatlarına kaydetme algoritmaları.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 3. Veri Toplama ve Fine-Tuning Hazırlık Stratejisi
|
|
145
|
+
|
|
146
|
+
Modeli kendi kütüphanemiz üzerinde eğitmek (Fine-Tune) için gereken `[İstek Metni ──> Bizim DSL Kodu ──> STEP/STL]` verisi 3 kanaldan toplanır:
|
|
147
|
+
|
|
148
|
+
### 1. Sentetik Veri Üretimi (Synthetic Data Pipeline)
|
|
149
|
+
1. **Parametrik Şablon Betikleri**: Python ile 50-100 temel parça ve montaj kategorisi (flanşlar, L-braketler, redüktörler, kasalar) yazılır. Parametreler rastgele değiştirilerek 50.000+ hatasız DSL kodu türetilir.
|
|
150
|
+
2. **Tersine Prompting (Reverse Prompting)**: Bu kodlar büyük bir LLM'e (Claude 3.5 / GPT-4o) verilerek Türkçe ve İngilizce kullanıcı istekleri (*"100x50mm flanş tasarla"*) ürettirilir.
|
|
151
|
+
|
|
152
|
+
### 2. Açık Kaynak Veri Dönüştürme (Transpiling)
|
|
153
|
+
* **DeepCAD (178.000 Onshape Modeli)** veritabanındaki JSON komut dizileri otomatik script ile kendi DSL formatımıza dönüştürülür.
|
|
154
|
+
* GitHub'daki CadQuery ve build123d repoları taranır.
|
|
155
|
+
|
|
156
|
+
### 3. Canlı Sistem Logları (Production Telemetry)
|
|
157
|
+
* **Başarılı Çıktılar (`gold_standard.jsonl`)**: OpenCASCADE doğrulamasından (`ValidationEngineer`) geçen hatasız kodlar otomatik veri setine kaydedilir.
|
|
158
|
+
* **Hatalı Çıktılar**: Hatalı üretilip düzeltilen kodlar modelin olumsuz örnekleri öğrenmesi için **DPO/RLHF** veri setine eklenir.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 4. Altyapı & AI Gateway (OmniRoute Entegrasyonu)
|
|
163
|
+
|
|
164
|
+
* **Kesintisiz Çalışma (Auto-Fallback)**: Kotalar veya hız limitleri dolduğunda otomatik alternatif AI sağlayıcısına yönlendirme.
|
|
165
|
+
* **Token Sıkıştırması (RTK + Caveman)**: Bağlam ve prompt boyutu %15-%95 azaltılarak API maliyetleri düşürülür.
|
|
166
|
+
* **Çoklu Model Desteği**: Basit görevler için ücretsiz/ucuz modeller (Gemini Flash, lokal Ollama), karmaşık montajlar için üst düzey modeller (Claude 3.5 Sonnet) çağrılır.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 5. Yol Haritası (Milestones)
|
|
171
|
+
|
|
172
|
+
1. [x] **Adım 1**: SAML / LLM-DSL sözdizimi ve SAML Compiler IR'ının (`ir/nodes.py`, `ir/parser.py`) netleştirilmesi.
|
|
173
|
+
2. [x] **Adım 2**: Backend Adapter katmanı (`backend/occt_backend.py` — saf OpenCASCADE/OCP çekirdeği ile bağımsız motor).
|
|
174
|
+
3. [x] **Adım 3**: Standart parça kütüphanesi (`Fastener.ISO4762`, `Bearing.SKF`, `Nut.DIN934`, `Washer.DIN125`, `Profile.VSlot`, `Motor.NEMA`).
|
|
175
|
+
4. [x] **Adım 4**: Geometri Doğrulama Motoru (`ValidationEngineer`) — Manifoldluk ve Çakışma (Clash) denetimi.
|
|
176
|
+
5. [x] **Adım 5**: Tersine Mühendislik pipeline'ı — `STEPReverseEngineer` ile STEP dosyasından otomatik SAML kod üretimi.
|
|
177
|
+
6. [ ] **Adım 6**: Sentetik veri üreteci (`scripts/synthetic_generator.py`) — 20k+ `(istek, SAML, STEP)` üçlüsü.
|
|
178
|
+
7. [ ] **Adım 7**: Qwen2.5-Coder veya DeepSeek modelinin LoRA/QLoRA ile eğitilmesi.
|
|
179
|
+
8. [ ] **Adım 8 (Uzun Vade)**: CADi Native Kernel — kendi geometri çekirdeği ile `build123d` bağımlılığının kaldırılması.
|
|
180
|
+
|
samlpy-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: samlpy
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: SamlPy: Semantic Assembly Modeling Language for Python - Deterministic, Zero-Coordinate, LLM-Native CAD Engine built on OpenCASCADE
|
|
5
|
+
Author: CADi Team
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Omerersen/Project-CAD-
|
|
8
|
+
Project-URL: Repository, https://github.com/Omerersen/Project-CAD-
|
|
9
|
+
Keywords: cad,opencascade,brep,llm,ai,parametric,assembly,3d-modeling,saml,samlpy
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Intended Audience :: Manufacturing
|
|
12
|
+
Classifier: Intended Audience :: Science/Research
|
|
13
|
+
Classifier: Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)
|
|
14
|
+
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Requires-Python: >=3.10
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
Requires-Dist: pyyaml>=6.0
|
|
22
|
+
Requires-Dist: numpy>=1.24.0
|
|
23
|
+
Provides-Extra: dev
|
|
24
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
25
|
+
Requires-Dist: build>=1.0.0; extra == "dev"
|
|
26
|
+
Requires-Dist: twine>=5.0.0; extra == "dev"
|
|
27
|
+
|
|
28
|
+
# LLM-Dostu CAD Kütüphanesi ve Montaj Mimarisi Özellikleri (LLM CAD Library Specs)
|
|
29
|
+
|
|
30
|
+
Bu doküman, CADi (`Project-CAD-`) projemiz bünyesinde geliştirilecek LLM-dostu özel CAD kütüphanesi, montaj motoru, veri toplama boru hattı ve AI gateway altyapısının temel mimari gereksinimlerini ve tasarım ilkelerini içerir.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 1. Neden Özel Bir LLM CAD Kütüphanesi / DSL?
|
|
35
|
+
|
|
36
|
+
Genel 3D CAD kütüphaneleri (CadQuery, OpenCASCADE, PythonOCC) insan geliştiriciler için tasarlanmıştır ve LLM'ler (Claude, GPT, DeepSeek) tarafından kodlandığında şu sorunlara yol açar:
|
|
37
|
+
* **Yüksek Token Maliyeti**: Basit bir parça veya montaj için yüzlerce satır detay kod üretilmesi.
|
|
38
|
+
* **Sentaks Hataları & Bağlam Kaybı**: Metod zincirleme (fluent API) yapılarının karmaşıklığı nedeniyle LLM'lerin sentaks hatası yapması.
|
|
39
|
+
* **Topolojik Kararsızlık**: Yüzey, delik ve kenarların adreslenmesinde illüzyon (hallucination) oluşması.
|
|
40
|
+
|
|
41
|
+
### 💡 Çözüm: LLM-Dostu Bildirimsel (Declarative) Kütüphane / DSL
|
|
42
|
+
LLM-dostu kütüphanemiz, Python tabanlı yalın bir sözdizimine (SAML - Spatial Assembly Modeling Language) sahip olacak ve doğrudan **OpenCASCADE (OCCT / OCP)** motoru üzerine kurulacaktır:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
[SAML DSL (LLM Arayüzü)]
|
|
46
|
+
↓
|
|
47
|
+
[SAML Compiler & IR (Kural ve İlişki Çözücü)]
|
|
48
|
+
↓
|
|
49
|
+
[CADi OCCT Backend (Saf OpenCASCADE Çekirdeği)]
|
|
50
|
+
├── BRep & Topoloji Katmanı (TopoDS_Shape, Faces, Edges)
|
|
51
|
+
├── Doğrudan Montaj & Eklemler (Joints/Mates Motoru)
|
|
52
|
+
└── Tersine Mühendislik & Import Motoru (STEP/IGES)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Neden Doğrudan OpenCASCADE (OCCT)?**
|
|
56
|
+
* **Doğrudan B-Rep ve Topoloji Kontrolü**: CadQuery veya üçüncü parti wrapper'ların getirdiği adlandırma (naming) ve kararsızlık hataları kökten çözülür.
|
|
57
|
+
* **Tersine Mühendislik (STEP → SAML)**: STEP dosyalarının en saf haliyle okunup yüzey/delik analizi yapılması doğrudan OpenCASCADE API'leri ile kayıpsız çalışır.
|
|
58
|
+
* **Dış Katman Bağımsızlığı**: Gereksiz bağımlılıklar elenir, doğrudan endüstriyel C++ çekirdeği Python üzerinden kontrol edilir.
|
|
59
|
+
|
|
60
|
+
> **Strateji**: `reference_build123d` kaynak kodları incelenmiş olup; montaj eklemleri, B-Rep selektörleri ve STEP import gibi kritik alt yapılar kopyalanıp kendi OpenCASCADE altyapımıza uyarlanacaktır.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 2. Kütüphanede Olması Gereken Temel Özellikler
|
|
65
|
+
|
|
66
|
+
### A. Üst Düzey Montaj ve İlişkilendirme (High-Level Assembly & Mates)
|
|
67
|
+
* Parçaları uzayda $X, Y, Z$ koordinatlarıyla elle yerleştirmek yerine CAD standartlarındaki **Montaj İlişkileri (Mates & Constraints)** kullanılır.
|
|
68
|
+
* **Örnek**:
|
|
69
|
+
```python
|
|
70
|
+
Assembly.connect(partA.face("bottom"), partB.face("top"), mate_type="FLUSH", offset=0)
|
|
71
|
+
Assembly.align_holes(partA.hole("h1"), partB.hole("h1"))
|
|
72
|
+
```
|
|
73
|
+
* **Kazanım**: LLM'in uzamsal matris hesaplama yükünü sıfırlar, token tüketimini %90 düşürür.
|
|
74
|
+
|
|
75
|
+
### B. Dahili Standart Parça Kütüphanesi (Built-in Standard Component Library)
|
|
76
|
+
* Cıvata, somun, rulman, alüminyum profil, motor gibi standart endüstriyel bileşenler LLM tarafından sıfırdan çizilmez, tek satırda çağrılır:
|
|
77
|
+
```python
|
|
78
|
+
bolt1 = Fastener.ISO4762(size="M6", length=20)
|
|
79
|
+
bearing1 = Bearing.SKF("608ZZ")
|
|
80
|
+
motor1 = Component.NEMA17(length=40)
|
|
81
|
+
```
|
|
82
|
+
* **Kazanım**: 1000 token harcanacak standart bileşenler 5-10 token'a düşer.
|
|
83
|
+
|
|
84
|
+
### C. Çapa / Bağlantı Noktaları (Anchor Ports & Interfaces)
|
|
85
|
+
* Parçalar kendi üzerinde montaj portları barındırır:
|
|
86
|
+
```python
|
|
87
|
+
Assembly.attach(motor.port("shaft"), wheel.port("hub"))
|
|
88
|
+
```
|
|
89
|
+
* **Kazanım**: Parçaların iç içe geçme ve çakışma (clash) hataları engellenir.
|
|
90
|
+
|
|
91
|
+
### D. Değişken Bağlamalı Parametrik Mimari (Cascading Parametric Variables)
|
|
92
|
+
* Tüm montaj tek bir ana değişkene (`Master Parameter`) bağlanır:
|
|
93
|
+
```python
|
|
94
|
+
with Assembly("Gearbox") as app:
|
|
95
|
+
app.set_param("box_width", 120)
|
|
96
|
+
# Tüm iç parçalar box_width parametresine göre otomatik ölçeklenir
|
|
97
|
+
```
|
|
98
|
+
* **Kazanım**: Kullanıcı revizyon istediğinde LLM tüm kodu baştan yazmak yerine sadece 1 parametreyi değiştirir (%98 token tasarrufu).
|
|
99
|
+
|
|
100
|
+
### E. Dosyadan Koda Dönüşüm / Tersine Mühendislik (Import & Reverse Engineering)
|
|
101
|
+
* Mevcut endüstriyel CAD dosyaları (STEP, IGES, STL, DXF) doğrudan sisteme aktarılıp SAML koduna dönüştürülür:
|
|
102
|
+
```python
|
|
103
|
+
# Dosyadan SAML kodu üret
|
|
104
|
+
model = Assembly.from_step("gearbox.step")
|
|
105
|
+
dsl_code = model.to_saml() # → LLM-dostu SAML kodu
|
|
106
|
+
params = model.extract_params() # → Parametrik değişkenler
|
|
107
|
+
|
|
108
|
+
# Görsel teknik çizimden (OCR + AI)
|
|
109
|
+
model = Assembly.from_drawing("blueprint.pdf", ocr=True)
|
|
110
|
+
```
|
|
111
|
+
* **Kazanım**:
|
|
112
|
+
* Mevcut endüstriyel miras (legacy) dosyalar sisteme dahil edilebilir
|
|
113
|
+
* `(STEP dosyası → SAML kodu)` çifti → Fine-tuning veri seti
|
|
114
|
+
* Kullanıcı "bu parçayı al ve şu değişikliği yap" diyebilir (edit workflow)
|
|
115
|
+
* DeepCAD transpiling adımını (Bölüm 3.2) otomatikleştirir
|
|
116
|
+
|
|
117
|
+
### F. Geometri Doğrulama Katmanı (Validation Engine)
|
|
118
|
+
* Üretilen veya içe aktarılan tüm geometri çalıştırılmadan önce doğrulanır:
|
|
119
|
+
```python
|
|
120
|
+
validator = ValidationEngineer()
|
|
121
|
+
validator.check_manifold(part) # Su geçirmez kapalı yüzey mi?
|
|
122
|
+
validator.check_tolerances(part) # Üretim toleransları mantıklı mı?
|
|
123
|
+
validator.check_assembly_clash(asm) # Parçalar çakışıyor mu?
|
|
124
|
+
validator.check_units_consistency(asm) # mm/inch karışıklığı var mı?
|
|
125
|
+
```
|
|
126
|
+
* **Kazanım**: Hatalı geometri LLM'e yapılandırılmış doğal dil geri bildirimi olarak döner (stack trace yerine NL açıklama → LLM'in hatayı anlayıp düzeltmesi kolaylaşır).
|
|
127
|
+
|
|
128
|
+
### G. Versiyon Kontrolü ve Kısmi Revizyon (Versioning & Diff-Edit)
|
|
129
|
+
* Her SAML kodu commit'i parametreler + hash ile izlenir; LLM tüm kodu baştan yazmak yerine sadece değişen bloğu günceller:
|
|
130
|
+
```python
|
|
131
|
+
# Parçayı tamamen yeniden yazmak yerine güncelle
|
|
132
|
+
Assembly.update_part("gearbox", "cover", wall_thickness=3.5)
|
|
133
|
+
Assembly.diff(v1, v2) # → Değişen parametreler ve geometri farkı
|
|
134
|
+
```
|
|
135
|
+
* **Kazanım**: %95+ token tasarrufu, revizyon geçmişi izlenebilir, DPO/RLHF için negatif örnek kaydı.
|
|
136
|
+
|
|
137
|
+
### H. Zorunlu Metadata Şeması (Required Metadata)
|
|
138
|
+
* Her SAML dosyası üretim için gereken meta bilgileri içerir:
|
|
139
|
+
```python
|
|
140
|
+
Assembly(
|
|
141
|
+
name="GearboxV2",
|
|
142
|
+
units="mm", # Zorunlu: mm | inch | m
|
|
143
|
+
tolerance_standard="ISO 2768-m", # Zorunlu: üretim toleransı
|
|
144
|
+
material="AlSi10Mg", # Opsiyonel: malzeme
|
|
145
|
+
export=["STEP", "STL", "DXF"], # Çıktı formatları
|
|
146
|
+
)
|
|
147
|
+
```
|
|
148
|
+
* **Kazanım**: mm/inch karışıklığı ve tolerans hatası CAD'de ölümcüldür; DSL'de first-class citizen yapılması zorunludur.
|
|
149
|
+
|
|
150
|
+
### I. build123d'den Alınacak ve OpenCASCADE ile Özelleştirilecek Modüller
|
|
151
|
+
|
|
152
|
+
Proje dizinine indirilen (`library/reference_build123d`) kaynak kodlarından kütüphanemize doğrudan adapte edilecek kritik bileşenler:
|
|
153
|
+
|
|
154
|
+
1. **Montaj ve Eklem Sistemi (`joints.py`):**
|
|
155
|
+
* *Neden gerekli?* `RigidJoint`, `RevoluteJoint`, `LinearJoint` gibi nesnelerin OpenCASCADE matris dönüşümlerine (`gp_Trsf`) nasıl bağlandığı hazır.
|
|
156
|
+
* *Bizim uyarlamamız:* SAML'in `Assembly.connect(mate_type=...)` yapısına doğrudan entegre edilecek.
|
|
157
|
+
|
|
158
|
+
2. **Topoloji ve Yüzey Seçiciler (`topology/` & `geometry.py`):**
|
|
159
|
+
* *Neden gerekli?* `Face.filter_by()`, `Edge.filter_by()`, en üst yüzeyi bulma (`>Z`), silindirik delikleri ayıklama mantığı.
|
|
160
|
+
* *Bizim uyarlamamız:* Hallucination'ı önlemek için yüzeylere deterministik ID/çapa atayan modül olarak sadeleştirilecek.
|
|
161
|
+
|
|
162
|
+
3. **İçe Aktarma ve B-Rep Dönüşümü (`importers.py` & `brep_from_stl.py`):**
|
|
163
|
+
* *Neden gerekli?* STEP ve STL dosyalarını OpenCASCADE nesnelerine (`TopoDS_Shape`, `TopoDS_Compound`) dönüştürme fonksiyonları.
|
|
164
|
+
* *Bizim uyarlamamız:* `Assembly.from_step()` ve Tersine Mühendislik (Dosyadan SAML Koda) boru hattının çekirdeği yapılacak.
|
|
165
|
+
|
|
166
|
+
4. **Dışa Aktarma Motoru (`exporters.py` & `exporters3d.py`):**
|
|
167
|
+
* *Neden gerekli?* Renk, malzeme, montaj hiyerarşisini kaybetmeden STEP/GLTF/STL formatlarına kaydetme algoritmaları.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 3. Veri Toplama ve Fine-Tuning Hazırlık Stratejisi
|
|
172
|
+
|
|
173
|
+
Modeli kendi kütüphanemiz üzerinde eğitmek (Fine-Tune) için gereken `[İstek Metni ──> Bizim DSL Kodu ──> STEP/STL]` verisi 3 kanaldan toplanır:
|
|
174
|
+
|
|
175
|
+
### 1. Sentetik Veri Üretimi (Synthetic Data Pipeline)
|
|
176
|
+
1. **Parametrik Şablon Betikleri**: Python ile 50-100 temel parça ve montaj kategorisi (flanşlar, L-braketler, redüktörler, kasalar) yazılır. Parametreler rastgele değiştirilerek 50.000+ hatasız DSL kodu türetilir.
|
|
177
|
+
2. **Tersine Prompting (Reverse Prompting)**: Bu kodlar büyük bir LLM'e (Claude 3.5 / GPT-4o) verilerek Türkçe ve İngilizce kullanıcı istekleri (*"100x50mm flanş tasarla"*) ürettirilir.
|
|
178
|
+
|
|
179
|
+
### 2. Açık Kaynak Veri Dönüştürme (Transpiling)
|
|
180
|
+
* **DeepCAD (178.000 Onshape Modeli)** veritabanındaki JSON komut dizileri otomatik script ile kendi DSL formatımıza dönüştürülür.
|
|
181
|
+
* GitHub'daki CadQuery ve build123d repoları taranır.
|
|
182
|
+
|
|
183
|
+
### 3. Canlı Sistem Logları (Production Telemetry)
|
|
184
|
+
* **Başarılı Çıktılar (`gold_standard.jsonl`)**: OpenCASCADE doğrulamasından (`ValidationEngineer`) geçen hatasız kodlar otomatik veri setine kaydedilir.
|
|
185
|
+
* **Hatalı Çıktılar**: Hatalı üretilip düzeltilen kodlar modelin olumsuz örnekleri öğrenmesi için **DPO/RLHF** veri setine eklenir.
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 4. Altyapı & AI Gateway (OmniRoute Entegrasyonu)
|
|
190
|
+
|
|
191
|
+
* **Kesintisiz Çalışma (Auto-Fallback)**: Kotalar veya hız limitleri dolduğunda otomatik alternatif AI sağlayıcısına yönlendirme.
|
|
192
|
+
* **Token Sıkıştırması (RTK + Caveman)**: Bağlam ve prompt boyutu %15-%95 azaltılarak API maliyetleri düşürülür.
|
|
193
|
+
* **Çoklu Model Desteği**: Basit görevler için ücretsiz/ucuz modeller (Gemini Flash, lokal Ollama), karmaşık montajlar için üst düzey modeller (Claude 3.5 Sonnet) çağrılır.
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 5. Yol Haritası (Milestones)
|
|
198
|
+
|
|
199
|
+
1. [x] **Adım 1**: SAML / LLM-DSL sözdizimi ve SAML Compiler IR'ının (`ir/nodes.py`, `ir/parser.py`) netleştirilmesi.
|
|
200
|
+
2. [x] **Adım 2**: Backend Adapter katmanı (`backend/occt_backend.py` — saf OpenCASCADE/OCP çekirdeği ile bağımsız motor).
|
|
201
|
+
3. [x] **Adım 3**: Standart parça kütüphanesi (`Fastener.ISO4762`, `Bearing.SKF`, `Nut.DIN934`, `Washer.DIN125`, `Profile.VSlot`, `Motor.NEMA`).
|
|
202
|
+
4. [x] **Adım 4**: Geometri Doğrulama Motoru (`ValidationEngineer`) — Manifoldluk ve Çakışma (Clash) denetimi.
|
|
203
|
+
5. [x] **Adım 5**: Tersine Mühendislik pipeline'ı — `STEPReverseEngineer` ile STEP dosyasından otomatik SAML kod üretimi.
|
|
204
|
+
6. [ ] **Adım 6**: Sentetik veri üreteci (`scripts/synthetic_generator.py`) — 20k+ `(istek, SAML, STEP)` üçlüsü.
|
|
205
|
+
7. [ ] **Adım 7**: Qwen2.5-Coder veya DeepSeek modelinin LoRA/QLoRA ile eğitilmesi.
|
|
206
|
+
8. [ ] **Adım 8 (Uzun Vade)**: CADi Native Kernel — kendi geometri çekirdeği ile `build123d` bağımlılığının kaldırılması.
|
|
207
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "samlpy"
|
|
7
|
+
version = "0.2.0"
|
|
8
|
+
description = "SamlPy: Semantic Assembly Modeling Language for Python - Deterministic, Zero-Coordinate, LLM-Native CAD Engine built on OpenCASCADE"
|
|
9
|
+
authors = [
|
|
10
|
+
{ name = "CADi Team" }
|
|
11
|
+
]
|
|
12
|
+
readme = "LIBRARY.md"
|
|
13
|
+
license = { text = "MIT" }
|
|
14
|
+
requires-python = ">=3.10"
|
|
15
|
+
keywords = [
|
|
16
|
+
"cad",
|
|
17
|
+
"opencascade",
|
|
18
|
+
"brep",
|
|
19
|
+
"llm",
|
|
20
|
+
"ai",
|
|
21
|
+
"parametric",
|
|
22
|
+
"assembly",
|
|
23
|
+
"3d-modeling",
|
|
24
|
+
"saml",
|
|
25
|
+
"samlpy",
|
|
26
|
+
]
|
|
27
|
+
classifiers = [
|
|
28
|
+
"Development Status :: 4 - Beta",
|
|
29
|
+
"Intended Audience :: Manufacturing",
|
|
30
|
+
"Intended Audience :: Science/Research",
|
|
31
|
+
"Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)",
|
|
32
|
+
"Topic :: Scientific/Engineering :: Mathematics",
|
|
33
|
+
"Programming Language :: Python :: 3",
|
|
34
|
+
"Programming Language :: Python :: 3.10",
|
|
35
|
+
"Programming Language :: Python :: 3.11",
|
|
36
|
+
"Programming Language :: Python :: 3.12",
|
|
37
|
+
]
|
|
38
|
+
dependencies = [
|
|
39
|
+
"pyyaml>=6.0",
|
|
40
|
+
"numpy>=1.24.0",
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
[project.optional-dependencies]
|
|
44
|
+
dev = [
|
|
45
|
+
"pytest>=7.0",
|
|
46
|
+
"build>=1.0.0",
|
|
47
|
+
"twine>=5.0.0",
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
[project.urls]
|
|
51
|
+
Homepage = "https://github.com/Omerersen/Project-CAD-"
|
|
52
|
+
Repository = "https://github.com/Omerersen/Project-CAD-"
|
|
53
|
+
|
|
54
|
+
[tool.setuptools.packages.find]
|
|
55
|
+
where = ["src"]
|
samlpy-0.2.0/setup.cfg
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""
|
|
2
|
+
cadi-saml: Deterministic, LLM-friendly CAD Modeling and Assembly Engine.
|
|
3
|
+
Built natively on OpenCASCADE (OCCT).
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from .core.assembly import Assembly, PartReference, SafeEvaluator, CircularDependencyError
|
|
7
|
+
from .core.ports import PortStatus, StalePortError, OverConstrainedError, ConstraintStatus
|
|
8
|
+
from .core.sketch import Sketch
|
|
9
|
+
from .std_parts.fasteners import Fastener
|
|
10
|
+
from .std_parts.bearings import Bearing
|
|
11
|
+
from .std_parts.nuts import Nut
|
|
12
|
+
from .std_parts.washers import Washer
|
|
13
|
+
from .std_parts.profiles import Profile
|
|
14
|
+
from .std_parts.motors import Motor
|
|
15
|
+
from .std_parts.motorsport import Motorsport
|
|
16
|
+
from .ir.nodes import AssemblyIR, CrossSection, ExportFormat, MateType, PatternType, UnitSystem
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
from .ir.parser import SAMLParser
|
|
22
|
+
from .backend.occt_backend import OCCTBackend
|
|
23
|
+
from .reverse.step_importer import STEPReverseEngineer
|
|
24
|
+
from .validation.validation_engineer import ValidationEngineer, ClashReport
|
|
25
|
+
|
|
26
|
+
__version__ = "0.2.0"
|
|
27
|
+
__all__ = [
|
|
28
|
+
"Assembly",
|
|
29
|
+
"PartReference",
|
|
30
|
+
"SafeEvaluator",
|
|
31
|
+
"CircularDependencyError",
|
|
32
|
+
"PortStatus",
|
|
33
|
+
"StalePortError",
|
|
34
|
+
"OverConstrainedError",
|
|
35
|
+
"ConstraintStatus",
|
|
36
|
+
|
|
37
|
+
"Sketch",
|
|
38
|
+
"CrossSection",
|
|
39
|
+
"PatternType",
|
|
40
|
+
"Fastener",
|
|
41
|
+
"Bearing",
|
|
42
|
+
"Nut",
|
|
43
|
+
"Washer",
|
|
44
|
+
"Profile",
|
|
45
|
+
"Motor",
|
|
46
|
+
"Motorsport",
|
|
47
|
+
"AssemblyIR",
|
|
48
|
+
"MateType",
|
|
49
|
+
"UnitSystem",
|
|
50
|
+
"ExportFormat",
|
|
51
|
+
"SAMLParser",
|
|
52
|
+
"OCCTBackend",
|
|
53
|
+
"STEPReverseEngineer",
|
|
54
|
+
"ValidationEngineer",
|
|
55
|
+
"ClashReport",
|
|
56
|
+
]
|
|
57
|
+
|