@jlcpcb/core 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/CHANGELOG.md +10 -0
- package/README.md +474 -0
- package/package.json +48 -0
- package/src/api/easyeda-community.ts +259 -0
- package/src/api/easyeda.ts +153 -0
- package/src/api/index.ts +7 -0
- package/src/api/jlc.ts +185 -0
- package/src/constants/design-rules.ts +119 -0
- package/src/constants/footprints.ts +68 -0
- package/src/constants/index.ts +7 -0
- package/src/constants/kicad.ts +147 -0
- package/src/converter/category-router.ts +638 -0
- package/src/converter/footprint-mapper.ts +236 -0
- package/src/converter/footprint.ts +949 -0
- package/src/converter/global-lib-table.ts +394 -0
- package/src/converter/index.ts +46 -0
- package/src/converter/lib-table.ts +181 -0
- package/src/converter/svg-arc.ts +179 -0
- package/src/converter/symbol-templates.ts +214 -0
- package/src/converter/symbol.ts +1682 -0
- package/src/converter/value-normalizer.ts +262 -0
- package/src/index.ts +25 -0
- package/src/parsers/easyeda-shapes.ts +628 -0
- package/src/parsers/http-client.ts +96 -0
- package/src/parsers/index.ts +38 -0
- package/src/parsers/utils.ts +29 -0
- package/src/services/component-service.ts +100 -0
- package/src/services/fix-service.ts +50 -0
- package/src/services/index.ts +9 -0
- package/src/services/library-service.ts +696 -0
- package/src/types/component.ts +61 -0
- package/src/types/easyeda-community.ts +78 -0
- package/src/types/easyeda.ts +356 -0
- package/src/types/index.ts +12 -0
- package/src/types/jlc.ts +84 -0
- package/src/types/kicad.ts +136 -0
- package/src/types/mcp.ts +77 -0
- package/src/types/project.ts +60 -0
- package/src/utils/conversion.ts +104 -0
- package/src/utils/file-system.ts +143 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/logger.ts +96 -0
- package/src/utils/validation.ts +110 -0
- package/tsconfig.json +9 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default design rules for common PCB manufacturers
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export interface DesignRules {
|
|
6
|
+
name: string;
|
|
7
|
+
minTraceWidth: number; // mm
|
|
8
|
+
minTraceClearance: number; // mm
|
|
9
|
+
minViaDrill: number; // mm
|
|
10
|
+
minViaPad: number; // mm
|
|
11
|
+
minHoleDrill: number; // mm
|
|
12
|
+
minAnnularRing: number; // mm
|
|
13
|
+
minSilkscreenWidth: number; // mm
|
|
14
|
+
minSilkscreenClearance: number; // mm
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// JLCPCB standard capabilities
|
|
18
|
+
export const JLCPCB_STANDARD: DesignRules = {
|
|
19
|
+
name: 'JLCPCB Standard',
|
|
20
|
+
minTraceWidth: 0.127, // 5 mil
|
|
21
|
+
minTraceClearance: 0.127, // 5 mil
|
|
22
|
+
minViaDrill: 0.3,
|
|
23
|
+
minViaPad: 0.6,
|
|
24
|
+
minHoleDrill: 0.3,
|
|
25
|
+
minAnnularRing: 0.13,
|
|
26
|
+
minSilkscreenWidth: 0.15,
|
|
27
|
+
minSilkscreenClearance: 0.15,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// JLCPCB advanced capabilities (extra cost)
|
|
31
|
+
export const JLCPCB_ADVANCED: DesignRules = {
|
|
32
|
+
name: 'JLCPCB Advanced',
|
|
33
|
+
minTraceWidth: 0.09, // 3.5 mil
|
|
34
|
+
minTraceClearance: 0.09, // 3.5 mil
|
|
35
|
+
minViaDrill: 0.15,
|
|
36
|
+
minViaPad: 0.4,
|
|
37
|
+
minHoleDrill: 0.15,
|
|
38
|
+
minAnnularRing: 0.075,
|
|
39
|
+
minSilkscreenWidth: 0.1,
|
|
40
|
+
minSilkscreenClearance: 0.1,
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// PCBWay standard capabilities
|
|
44
|
+
export const PCBWAY_STANDARD: DesignRules = {
|
|
45
|
+
name: 'PCBWay Standard',
|
|
46
|
+
minTraceWidth: 0.127, // 5 mil
|
|
47
|
+
minTraceClearance: 0.127, // 5 mil
|
|
48
|
+
minViaDrill: 0.3,
|
|
49
|
+
minViaPad: 0.6,
|
|
50
|
+
minHoleDrill: 0.3,
|
|
51
|
+
minAnnularRing: 0.15,
|
|
52
|
+
minSilkscreenWidth: 0.15,
|
|
53
|
+
minSilkscreenClearance: 0.15,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// OSH Park standard capabilities
|
|
57
|
+
export const OSHPARK_STANDARD: DesignRules = {
|
|
58
|
+
name: 'OSH Park',
|
|
59
|
+
minTraceWidth: 0.152, // 6 mil
|
|
60
|
+
minTraceClearance: 0.152, // 6 mil
|
|
61
|
+
minViaDrill: 0.254, // 10 mil
|
|
62
|
+
minViaPad: 0.508,
|
|
63
|
+
minHoleDrill: 0.254,
|
|
64
|
+
minAnnularRing: 0.127,
|
|
65
|
+
minSilkscreenWidth: 0.15,
|
|
66
|
+
minSilkscreenClearance: 0.15,
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// Conservative rules for hobby/hand soldering
|
|
70
|
+
export const HOBBY_RULES: DesignRules = {
|
|
71
|
+
name: 'Hobby/Hand Solder',
|
|
72
|
+
minTraceWidth: 0.3, // 12 mil
|
|
73
|
+
minTraceClearance: 0.3, // 12 mil
|
|
74
|
+
minViaDrill: 0.4,
|
|
75
|
+
minViaPad: 0.8,
|
|
76
|
+
minHoleDrill: 0.4,
|
|
77
|
+
minAnnularRing: 0.2,
|
|
78
|
+
minSilkscreenWidth: 0.2,
|
|
79
|
+
minSilkscreenClearance: 0.2,
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// Standard trace widths for different current levels (1oz copper, 10C rise)
|
|
83
|
+
export const TRACE_WIDTH_CURRENT: Record<string, number> = {
|
|
84
|
+
'0.5A': 0.2,
|
|
85
|
+
'1A': 0.5,
|
|
86
|
+
'2A': 1.0,
|
|
87
|
+
'3A': 1.5,
|
|
88
|
+
'5A': 2.5,
|
|
89
|
+
'10A': 5.0,
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// Default layer stackups
|
|
93
|
+
export const LAYER_STACKUPS = {
|
|
94
|
+
'2-layer': {
|
|
95
|
+
layers: ['F.Cu', 'B.Cu'],
|
|
96
|
+
copperThickness: 0.035, // 1oz = 35um
|
|
97
|
+
boardThickness: 1.6, // mm
|
|
98
|
+
},
|
|
99
|
+
'4-layer': {
|
|
100
|
+
layers: ['F.Cu', 'In1.Cu', 'In2.Cu', 'B.Cu'],
|
|
101
|
+
copperThickness: 0.035,
|
|
102
|
+
boardThickness: 1.6,
|
|
103
|
+
},
|
|
104
|
+
} as const;
|
|
105
|
+
|
|
106
|
+
export function getDesignRulesForManufacturer(manufacturer: string): DesignRules {
|
|
107
|
+
switch (manufacturer.toLowerCase()) {
|
|
108
|
+
case 'jlcpcb':
|
|
109
|
+
return JLCPCB_STANDARD;
|
|
110
|
+
case 'jlcpcb-advanced':
|
|
111
|
+
return JLCPCB_ADVANCED;
|
|
112
|
+
case 'pcbway':
|
|
113
|
+
return PCBWAY_STANDARD;
|
|
114
|
+
case 'oshpark':
|
|
115
|
+
return OSHPARK_STANDARD;
|
|
116
|
+
default:
|
|
117
|
+
return HOBBY_RULES;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard footprint patterns and dimensions
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// Common SMD resistor/capacitor sizes (metric)
|
|
6
|
+
export const SMD_PACKAGE_SIZES: Record<string, { length: number; width: number }> = {
|
|
7
|
+
'0201': { length: 0.6, width: 0.3 },
|
|
8
|
+
'0402': { length: 1.0, width: 0.5 },
|
|
9
|
+
'0603': { length: 1.6, width: 0.8 },
|
|
10
|
+
'0805': { length: 2.0, width: 1.25 },
|
|
11
|
+
'1206': { length: 3.2, width: 1.6 },
|
|
12
|
+
'1210': { length: 3.2, width: 2.5 },
|
|
13
|
+
'1812': { length: 4.5, width: 3.2 },
|
|
14
|
+
'2010': { length: 5.0, width: 2.5 },
|
|
15
|
+
'2512': { length: 6.3, width: 3.2 },
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// Common IC package patterns
|
|
19
|
+
export const IC_PACKAGE_PATTERNS = {
|
|
20
|
+
// SOIC packages
|
|
21
|
+
SOIC8: { pins: 8, pitch: 1.27, width: 3.9 },
|
|
22
|
+
SOIC14: { pins: 14, pitch: 1.27, width: 3.9 },
|
|
23
|
+
SOIC16: { pins: 16, pitch: 1.27, width: 3.9 },
|
|
24
|
+
|
|
25
|
+
// TSSOP packages
|
|
26
|
+
TSSOP8: { pins: 8, pitch: 0.65, width: 3.0 },
|
|
27
|
+
TSSOP14: { pins: 14, pitch: 0.65, width: 4.4 },
|
|
28
|
+
TSSOP16: { pins: 16, pitch: 0.65, width: 4.4 },
|
|
29
|
+
TSSOP20: { pins: 20, pitch: 0.65, width: 4.4 },
|
|
30
|
+
|
|
31
|
+
// QFP packages
|
|
32
|
+
LQFP32: { pins: 32, pitch: 0.8, size: 7.0 },
|
|
33
|
+
LQFP48: { pins: 48, pitch: 0.5, size: 7.0 },
|
|
34
|
+
LQFP64: { pins: 64, pitch: 0.5, size: 10.0 },
|
|
35
|
+
LQFP100: { pins: 100, pitch: 0.5, size: 14.0 },
|
|
36
|
+
LQFP144: { pins: 144, pitch: 0.5, size: 20.0 },
|
|
37
|
+
|
|
38
|
+
// QFN packages
|
|
39
|
+
QFN16: { pins: 16, pitch: 0.5, size: 3.0 },
|
|
40
|
+
QFN20: { pins: 20, pitch: 0.5, size: 4.0 },
|
|
41
|
+
QFN24: { pins: 24, pitch: 0.5, size: 4.0 },
|
|
42
|
+
QFN32: { pins: 32, pitch: 0.5, size: 5.0 },
|
|
43
|
+
QFN48: { pins: 48, pitch: 0.5, size: 7.0 },
|
|
44
|
+
|
|
45
|
+
// BGA packages
|
|
46
|
+
BGA100: { pins: 100, pitch: 0.8 },
|
|
47
|
+
BGA144: { pins: 144, pitch: 0.8 },
|
|
48
|
+
BGA256: { pins: 256, pitch: 0.8 },
|
|
49
|
+
} as const;
|
|
50
|
+
|
|
51
|
+
// Standard connector pitches
|
|
52
|
+
export const CONNECTOR_PITCHES = {
|
|
53
|
+
STANDARD_2_54MM: 2.54, // 100 mil
|
|
54
|
+
STANDARD_2MM: 2.0,
|
|
55
|
+
FINE_1_27MM: 1.27, // 50 mil
|
|
56
|
+
FINE_1MM: 1.0,
|
|
57
|
+
USB_C: 0.5,
|
|
58
|
+
FPC_0_5MM: 0.5,
|
|
59
|
+
FPC_1MM: 1.0,
|
|
60
|
+
} as const;
|
|
61
|
+
|
|
62
|
+
// Mounting hole sizes (M2, M2.5, M3, M4)
|
|
63
|
+
export const MOUNTING_HOLES = {
|
|
64
|
+
M2: { drill: 2.2, pad: 4.0 },
|
|
65
|
+
M2_5: { drill: 2.7, pad: 5.0 },
|
|
66
|
+
M3: { drill: 3.2, pad: 6.0 },
|
|
67
|
+
M4: { drill: 4.3, pad: 8.0 },
|
|
68
|
+
} as const;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KiCad layer names and constants
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// Standard layer names
|
|
6
|
+
export const KICAD_LAYERS = {
|
|
7
|
+
// Copper layers
|
|
8
|
+
F_CU: 'F.Cu',
|
|
9
|
+
B_CU: 'B.Cu',
|
|
10
|
+
IN1_CU: 'In1.Cu',
|
|
11
|
+
IN2_CU: 'In2.Cu',
|
|
12
|
+
IN3_CU: 'In3.Cu',
|
|
13
|
+
IN4_CU: 'In4.Cu',
|
|
14
|
+
|
|
15
|
+
// Technical layers - front
|
|
16
|
+
F_ADHES: 'F.Adhes',
|
|
17
|
+
F_PASTE: 'F.Paste',
|
|
18
|
+
F_SILKS: 'F.SilkS',
|
|
19
|
+
F_MASK: 'F.Mask',
|
|
20
|
+
F_CRTYD: 'F.CrtYd',
|
|
21
|
+
F_FAB: 'F.Fab',
|
|
22
|
+
|
|
23
|
+
// Technical layers - back
|
|
24
|
+
B_ADHES: 'B.Adhes',
|
|
25
|
+
B_PASTE: 'B.Paste',
|
|
26
|
+
B_SILKS: 'B.SilkS',
|
|
27
|
+
B_MASK: 'B.Mask',
|
|
28
|
+
B_CRTYD: 'B.CrtYd',
|
|
29
|
+
B_FAB: 'B.Fab',
|
|
30
|
+
|
|
31
|
+
// Other layers
|
|
32
|
+
EDGE_CUTS: 'Edge.Cuts',
|
|
33
|
+
MARGIN: 'Margin',
|
|
34
|
+
DWGS_USER: 'Dwgs.User',
|
|
35
|
+
CMTS_USER: 'Cmts.User',
|
|
36
|
+
ECO1_USER: 'Eco1.User',
|
|
37
|
+
ECO2_USER: 'Eco2.User',
|
|
38
|
+
} as const;
|
|
39
|
+
|
|
40
|
+
// Layer groups for common operations
|
|
41
|
+
export const KICAD_LAYER_GROUPS = {
|
|
42
|
+
ALL_CU: ['*.Cu'],
|
|
43
|
+
ALL_MASK: ['*.Mask'],
|
|
44
|
+
FRONT_LAYERS: ['F.Cu', 'F.Paste', 'F.Mask'],
|
|
45
|
+
BACK_LAYERS: ['B.Cu', 'B.Paste', 'B.Mask'],
|
|
46
|
+
SMD_FRONT: ['F.Cu', 'F.Paste', 'F.Mask'],
|
|
47
|
+
SMD_BACK: ['B.Cu', 'B.Paste', 'B.Mask'],
|
|
48
|
+
THT: ['*.Cu', '*.Mask'],
|
|
49
|
+
} as const;
|
|
50
|
+
|
|
51
|
+
// Default text sizes
|
|
52
|
+
export const KICAD_DEFAULTS = {
|
|
53
|
+
TEXT_SIZE: 1.27, // mm (standard KiCad 9)
|
|
54
|
+
TEXT_THICKNESS: 0.15, // mm
|
|
55
|
+
WIRE_WIDTH: 0.25, // mm (schematic)
|
|
56
|
+
GRID_SCHEMATIC: 2.54, // mm (100 mil)
|
|
57
|
+
GRID_PCB: 0.25, // mm
|
|
58
|
+
PIN_LENGTH: 1.27, // mm (50 mil - KiCad 9 default)
|
|
59
|
+
PIN_NAME_OFFSET: 0, // mm (0 for hidden names)
|
|
60
|
+
} as const;
|
|
61
|
+
|
|
62
|
+
// Symbol generator version (KiCad 9 format)
|
|
63
|
+
export const KICAD_SYMBOL_VERSION = '20241209';
|
|
64
|
+
export const KICAD_FOOTPRINT_VERSION = '20241209';
|
|
65
|
+
|
|
66
|
+
// Pin electrical types
|
|
67
|
+
export const KICAD_PIN_TYPES = [
|
|
68
|
+
'input',
|
|
69
|
+
'output',
|
|
70
|
+
'bidirectional',
|
|
71
|
+
'tri_state',
|
|
72
|
+
'passive',
|
|
73
|
+
'free',
|
|
74
|
+
'unspecified',
|
|
75
|
+
'power_in',
|
|
76
|
+
'power_out',
|
|
77
|
+
'open_collector',
|
|
78
|
+
'open_emitter',
|
|
79
|
+
'no_connect',
|
|
80
|
+
] as const;
|
|
81
|
+
|
|
82
|
+
// Pad shapes
|
|
83
|
+
export const KICAD_PAD_SHAPES = [
|
|
84
|
+
'circle',
|
|
85
|
+
'rect',
|
|
86
|
+
'oval',
|
|
87
|
+
'trapezoid',
|
|
88
|
+
'roundrect',
|
|
89
|
+
'custom',
|
|
90
|
+
] as const;
|
|
91
|
+
|
|
92
|
+
// Pad types
|
|
93
|
+
export const KICAD_PAD_TYPES = [
|
|
94
|
+
'thru_hole',
|
|
95
|
+
'smd',
|
|
96
|
+
'connect',
|
|
97
|
+
'np_thru_hole',
|
|
98
|
+
] as const;
|
|
99
|
+
|
|
100
|
+
// Global library configuration
|
|
101
|
+
export const KICAD_LIBRARY_NAME = 'EDA-MCP';
|
|
102
|
+
export const KICAD_LIBRARY_DESCRIPTION = 'AI-EDA Component Library (JLC/EasyEDA)';
|
|
103
|
+
|
|
104
|
+
// Supported KiCad versions (newest first)
|
|
105
|
+
export const KICAD_VERSIONS = ['9.0', '8.0'] as const;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Get global KiCad library paths for a specific platform
|
|
109
|
+
* Returns paths in the format that kicad-sch-mcp's search pattern expects:
|
|
110
|
+
* ~/Documents/KiCad/{version}/symbols/*.kicad_sym
|
|
111
|
+
*/
|
|
112
|
+
export function getGlobalKicadLibraryPaths(
|
|
113
|
+
homeDir: string,
|
|
114
|
+
platform: 'darwin' | 'win32' | 'linux',
|
|
115
|
+
version: string = '9.0'
|
|
116
|
+
): {
|
|
117
|
+
base: string;
|
|
118
|
+
symbols: string;
|
|
119
|
+
footprints: string;
|
|
120
|
+
models3d: string;
|
|
121
|
+
} | null {
|
|
122
|
+
let baseDir: string;
|
|
123
|
+
|
|
124
|
+
switch (platform) {
|
|
125
|
+
case 'darwin':
|
|
126
|
+
// macOS: ~/Documents/KiCad/9.0/
|
|
127
|
+
baseDir = `${homeDir}/Documents/KiCad/${version}`;
|
|
128
|
+
break;
|
|
129
|
+
case 'win32':
|
|
130
|
+
// Windows: %USERPROFILE%/Documents/KiCad/9.0/
|
|
131
|
+
baseDir = `${homeDir}/Documents/KiCad/${version}`;
|
|
132
|
+
break;
|
|
133
|
+
case 'linux':
|
|
134
|
+
// Linux: ~/.local/share/kicad/9.0/ or ~/Documents/KiCad/9.0/
|
|
135
|
+
baseDir = `${homeDir}/Documents/KiCad/${version}`;
|
|
136
|
+
break;
|
|
137
|
+
default:
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
base: baseDir,
|
|
143
|
+
symbols: `${baseDir}/symbols`,
|
|
144
|
+
footprints: `${baseDir}/footprints`,
|
|
145
|
+
models3d: `${baseDir}/3dmodels`,
|
|
146
|
+
};
|
|
147
|
+
}
|