Skip to content

Commit d3a113b

Browse files
committed
big changes
1 parent 0d3ffc4 commit d3a113b

28 files changed

Lines changed: 31612 additions & 0 deletions

FIXES_SUMMARY.md

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
# pcb2step.py Fixes Summary
2+
3+
## Overview
4+
This document summarizes the fixes applied to make `pcb2step.py` work properly with the `sexp_parser` module.
5+
6+
## Issues Identified and Fixed
7+
8+
### 1. Missing kicad_parser Module
9+
**Problem**: `pcb2step.py` was importing from a non-existent `.kicad_parser` module.
10+
11+
**Solution**: Created a new `kicad_parser.py` file that provides a compatibility layer between `pcb2step.py` and the `sexp_parser` module.
12+
13+
**Files Created**:
14+
- `kicad_parser.py` - Compatibility wrapper around `sexp_parser`
15+
16+
### 2. Import Path Issues
17+
**Problem**: Import statements used relative imports (`.kicad_parser`) but the module structure didn't support this.
18+
19+
**Solution**: Changed imports to absolute imports:
20+
```python
21+
# Before
22+
from .kicad_parser import KicadPCB,SexpList,SexpParser,parseSexp
23+
from .kicad_parser import unquote
24+
25+
# After
26+
from kicad_parser import KicadPCB,SexpList,SexpParser,parseSexp
27+
from kicad_parser import unquote
28+
```
29+
30+
### 3. Missing SexpList Export
31+
**Problem**: `SexpList` class was not exported from `sexp_parser/__init__.py`.
32+
33+
**Solution**: Added `SexpList` to the exports in `sexp_parser/__init__.py`:
34+
```python
35+
from .core import (
36+
# ... existing imports ...
37+
SexpList,
38+
# ... rest of imports ...
39+
)
40+
41+
__all__ = [
42+
# ... existing exports ...
43+
'SexpList',
44+
# ... rest of exports ...
45+
]
46+
```
47+
48+
### 4. Incomplete Function Implementation
49+
**Problem**: `get_mod_Ref()` function was missing return statement in the `fp_text` branch.
50+
51+
**Solution**: Added missing return statement and default fallback:
52+
```python
53+
def get_mod_Ref(m):
54+
if hasattr(m,'property'):
55+
for p in m.property:
56+
if 'reference' in str(p[0]).lower():
57+
Ref = str(p[1]).strip('"')
58+
return Ref
59+
if hasattr(m,'fp_text'):
60+
for p in m.fp_text:
61+
if 'reference' in str(p[0]).lower():
62+
Ref = str(p[1]).strip('"')
63+
return Ref # <- This was missing
64+
return "REF?" # <- Default fallback added
65+
```
66+
67+
### 5. Modern KiCad Format Compatibility
68+
**Problem**: Modern KiCad files use `footprint` instead of `module` which wasn't properly handled.
69+
70+
**Solution**: Enhanced `kicad_parser.py` to provide backward compatibility:
71+
```python
72+
def _fix_legacy_access(self):
73+
# Convert footprint to module for backward compatibility
74+
if hasattr(self, 'footprint') and not hasattr(self, 'module'):
75+
footprints = getattr(self, 'footprint')
76+
if not isinstance(footprints, (list, SexpList)):
77+
footprints = [footprints] if footprints else []
78+
self.module = SexpList(footprints, 'module')
79+
80+
# Ensure lists exist for common elements
81+
for attr in ['segment', 'arc', 'via', 'net', 'zone']:
82+
if not hasattr(self, attr):
83+
setattr(self, attr, SexpList([]))
84+
else:
85+
val = getattr(self, attr)
86+
if not isinstance(val, (list, SexpList)):
87+
setattr(self, attr, SexpList([val]))
88+
```
89+
90+
## Files Modified
91+
92+
### Core Files
93+
1. **pcb2step.py** - Fixed import statements and function implementation
94+
2. **kicad_parser.py** (NEW) - Compatibility layer
95+
3. **sexp_parser/__init__.py** - Added SexpList to exports
96+
97+
### Test Files Created
98+
1. **test_pcb2step.py** - Comprehensive test suite
99+
2. **demo_usage.py** - Demonstration of parameter-based usage
100+
3. **FIXES_SUMMARY.md** - This summary document
101+
102+
## Usage Examples
103+
104+
### Basic Usage
105+
```python
106+
import pcb2step
107+
108+
# Create KicadFcad instance with parameters (no command line args needed)
109+
kf = pcb2step.KicadFcad(
110+
filename='path/to/file.kicad_pcb',
111+
copper_thickness=0.035,
112+
board_thickness=1.6,
113+
debug=False
114+
)
115+
116+
# Generate full 3D model
117+
model = kf.make(
118+
copper_thickness=0.035,
119+
fit_arcs=True,
120+
load_parts=False,
121+
fuseCoppers=False
122+
)
123+
```
124+
125+
### Layer-Specific Processing
126+
```python
127+
# Process specific layer
128+
kf.setLayer(0) # F.Cu layer
129+
copper_layer = kf.makeCopper(
130+
shape_type='solid',
131+
thickness=0.035,
132+
fit_arcs=True
133+
)
134+
```
135+
136+
### Individual Component Processing
137+
```python
138+
# Process individual components
139+
board = kf.makeBoard()
140+
pads = kf.makePads()
141+
tracks = kf.makeTracks()
142+
zones = kf.makeZones()
143+
```
144+
145+
## Testing
146+
147+
Run the comprehensive test suite:
148+
```bash
149+
python test_pcb2step.py [optional_pcb_file]
150+
```
151+
152+
Run the parameter usage demonstration:
153+
```bash
154+
python demo_usage.py
155+
```
156+
157+
Both tests use `examples/test.kicad_pcb` by default and demonstrate that all major functionality is working correctly.
158+
159+
## Results
160+
161+
**All core functionality is working**:
162+
- PCB file loading and parsing
163+
- Board outline generation
164+
- Pad creation and processing
165+
- Track/trace processing
166+
- Zone processing (where applicable)
167+
- 3D model generation
168+
- Layer-specific processing
169+
- Parameter-based usage (no command line arguments needed)
170+
171+
**Compatibility maintained**:
172+
- Works with modern KiCad file formats
173+
- Backward compatible with older formats
174+
- Proper error handling and fallbacks
175+
176+
**Code quality improvements**:
177+
- Fixed missing return statements
178+
- Added proper error handling
179+
- Enhanced compatibility layer
180+
- Comprehensive testing
181+
182+
## Notes
183+
184+
- Some advanced features like copper layer fusing may have FreeCAD-specific limitations
185+
- The implementation focuses on the core PCB processing functionality
186+
- All parameters can be passed as function arguments as requested (no command line arguments needed)
187+
- The sexp_parser integration is fully functional and robust

LICENSE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
The MIT License (MIT)
2+
Copyright (c) 2025 Innovoltive
23
Copyright (c) 2016 Zheng, Lei
34

45
Permission is hereby granted, free of charge, to any person obtaining a copy of

0 commit comments

Comments
 (0)