mirror of
https://github.com/bancika/diy-layout-creator
synced 2026-11-07 20:34:55 +10:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a38f1ec5ad | |||
| 53ee3556b9 | |||
| bd585a7a7a | |||
| 21aece2e79 | |||
| 9f557836fa | |||
| 4d04fe8491 | |||
| 36fc5e119c | |||
| 7d296565a9 |
@@ -2,7 +2,7 @@ Switch setup: [ ALL ]
|
||||
|
||||
2K2.+ <-> D1.K <-> D4.K <-> Q1.2
|
||||
2K2.+ <-> D2.A <-> D3.A <-> Q2.2
|
||||
2K2.- <-> 2K2.- <-> C6.- <-> C7.- <-> J1.Tip <-> J2.Tip <-> J3.Tip <-> LM324.12 <-> LM324.3 <-> LM324.5 <-> Q1.1 <-> Q2.1 <-> R5.2 <-> VR1.3 <-> VR2.3
|
||||
2K2.- <-> 2K2.- <-> C6.- <-> C7.- <-> J1.Tip <-> J2.Tip <-> J3.Tip <-> LM324.10 <-> LM324.3 <-> LM324.5 <-> Q1.1 <-> Q2.1 <-> R5.2 <-> VR1.3 <-> VR2.3
|
||||
C1.+ <-> J1.Sleeve
|
||||
C1.- <-> R1.1
|
||||
C2.+ <-> J2.Sleeve
|
||||
@@ -11,15 +11,15 @@ Switch setup: [ ALL ]
|
||||
C3.- <-> VR2.1
|
||||
C4.+ <-> LM324.1 <-> R1.2
|
||||
C4.- <-> VR1.1
|
||||
C5.+ <-> LM324.14 <-> R3.2
|
||||
C5.+ <-> LM324.8 <-> R3.2
|
||||
C5.- <-> J3.Sleeve <-> R5.1
|
||||
C6.+ <-> LM324.11 <-> Q2.3
|
||||
C7.+ <-> LM324.4 <-> Q1.3
|
||||
D1.A <-> D2.K
|
||||
D3.K <-> D4.A
|
||||
LM324.13 <-> R3.1 <-> R3.1 <-> R4.1
|
||||
LM324.2 <-> R1.1 <-> R1.2
|
||||
LM324.6 <-> R1.1 <-> R2.2
|
||||
LM324.9 <-> R3.1 <-> R3.1 <-> R4.1
|
||||
R3.2 <-> VR2.2
|
||||
R4.2 <-> VR1.2
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ Switch setup: [ ALL ]
|
||||
|
||||
2K2.+ <-> D1.K <-> D4.K <-> Q1.2
|
||||
2K2.+ <-> D2.A <-> D3.A <-> Q2.2
|
||||
2K2.- <-> 2K2.- <-> C6.- <-> C7.- <-> J1.Tip <-> J2.Tip <-> J3.Tip <-> LM324.12 <-> LM324.3 <-> LM324.5 <-> Q1.1 <-> Q2.1 <-> R5.2 <-> VR1.3 <-> VR2.3
|
||||
2K2.- <-> 2K2.- <-> C6.- <-> C7.- <-> J1.Tip <-> J2.Tip <-> J3.Tip <-> LM324.10 <-> LM324.3 <-> LM324.5 <-> Q1.1 <-> Q2.1 <-> R5.2 <-> VR1.3 <-> VR2.3
|
||||
C1.+ <-> J1.Sleeve
|
||||
C1.- <-> R1.1
|
||||
C2.+ <-> J2.Sleeve
|
||||
@@ -11,15 +11,15 @@ Switch setup: [ ALL ]
|
||||
C3.- <-> VR2.1
|
||||
C4.+ <-> LM324.1 <-> R1.2
|
||||
C4.- <-> VR1.1
|
||||
C5.+ <-> LM324.14 <-> R3.2
|
||||
C5.+ <-> LM324.8 <-> R3.2
|
||||
C5.- <-> J3.Sleeve <-> R5.1
|
||||
C6.+ <-> LM324.11 <-> Q2.3
|
||||
C7.+ <-> LM324.4 <-> Q1.3
|
||||
D1.A <-> D2.K
|
||||
D3.K <-> D4.A
|
||||
LM324.13 <-> R3.1 <-> R3.1 <-> R4.1
|
||||
LM324.2 <-> R1.1 <-> R1.2
|
||||
LM324.6 <-> R1.1 <-> R2.2
|
||||
LM324.9 <-> R3.1 <-> R3.1 <-> R4.1
|
||||
R3.2 <-> VR2.2
|
||||
R4.2 <-> VR1.2
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
+12V.+ <-> +12V.- <-> Arduino Nano.10 <-> Arduino Nano.11 <-> Arduino Nano.12 <-> Arduino Nano.13 <-> Arduino Nano.14 <-> Arduino Nano.15 <-> Arduino Nano.16 <-> Arduino Nano.17 <-> Arduino Nano.18 <-> Arduino Nano.19 <-> Arduino Nano.20 <-> Arduino Nano.21 <-> Arduino Nano.4 <-> Arduino Nano.5 <-> Arduino Nano.6 <-> Arduino Nano.7 <-> Arduino Nano.8 <-> Arduino Nano.9 <-> C1.1 <-> C1.2 <-> C2.1 <-> C2.2 <-> D1.A <-> D1.K <-> D2.A <-> D2.K <-> LM2902.1 <-> LM2902.1 <-> LM2902.10 <-> LM2902.10 <-> LM2902.11 <-> LM2902.11 <-> LM2902.12 <-> LM2902.12 <-> LM2902.13 <-> LM2902.13 <-> LM2902.14 <-> LM2902.14 <-> LM2902.2 <-> LM2902.2 <-> LM2902.3 <-> LM2902.3 <-> LM2902.4 <-> LM2902.4 <-> LM2902.5 <-> LM2902.5 <-> LM2902.6 <-> LM2902.6 <-> LM2902.7 <-> LM2902.7 <-> LM2902.8 <-> LM2902.8 <-> LM2902.9 <-> LM2902.9 <-> MPSA05.1 <-> MPSA05.1 <-> MPSA05.2 <-> MPSA05.2 <-> MPSA05.3 <-> MPSA05.3 <-> PH1.1 <-> PH1.2 <-> PH1.3 <-> PH2.1 <-> PH2.2 <-> PH2.3 <-> PH3.1 <-> PH3.2 <-> PH4.1 <-> PH4.2 <-> PH4.3 <-> PH5.1 <-> PH5.2 <-> PH5.3 <-> PH6.1 <-> Q3.1 <-> Q3.2 <-> Q3.3 <-> R1.1 <-> R1.1 <-> R1.2 <-> R1.2 <-> R10.1 <-> R10.1 <-> R10.2 <-> R10.2 <-> R11.1 <-> R11.1 <-> R11.2 <-> R11.2 <-> R12.1 <-> R12.1 <-> R12.2 <-> R12.2 <-> R3.1 <-> R3.1 <-> R3.2 <-> R3.2 <-> R4.1 <-> R4.1 <-> R4.2 <-> R4.2 <-> R5.1 <-> R5.1 <-> R5.2 <-> R5.2 <-> R6.1 <-> R6.1 <-> R6.2 <-> R6.2 <-> R8.1 <-> R8.1 <-> R8.2 <-> R8.2 <-> R9.1 <-> R9.1 <-> R9.2 <-> R9.2 <-> VR1.1 <-> VR1.2 <-> VR1.3 <-> VR2.1 <-> VR2.2 <-> VR2.3 <-> VR3.1 <-> VR3.2 <-> VR3.3 <-> VR4.1 <-> VR4.2 <-> VR4.3
|
||||
+12V.+ <-> +12V.- <-> Arduino Nano.10 <-> Arduino Nano.11 <-> Arduino Nano.12 <-> Arduino Nano.13 <-> Arduino Nano.14 <-> Arduino Nano.15 <-> Arduino Nano.25 <-> Arduino Nano.26 <-> Arduino Nano.27 <-> Arduino Nano.28 <-> Arduino Nano.29 <-> Arduino Nano.30 <-> Arduino Nano.4 <-> Arduino Nano.5 <-> Arduino Nano.6 <-> Arduino Nano.7 <-> Arduino Nano.8 <-> Arduino Nano.9 <-> C1.1 <-> C1.2 <-> C2.1 <-> C2.2 <-> D1.A <-> D1.K <-> D2.A <-> D2.K <-> LM2902.1 <-> LM2902.1 <-> LM2902.10 <-> LM2902.10 <-> LM2902.11 <-> LM2902.11 <-> LM2902.12 <-> LM2902.12 <-> LM2902.13 <-> LM2902.13 <-> LM2902.14 <-> LM2902.14 <-> LM2902.2 <-> LM2902.2 <-> LM2902.3 <-> LM2902.3 <-> LM2902.4 <-> LM2902.4 <-> LM2902.5 <-> LM2902.5 <-> LM2902.6 <-> LM2902.6 <-> LM2902.7 <-> LM2902.7 <-> LM2902.8 <-> LM2902.8 <-> LM2902.9 <-> LM2902.9 <-> MPSA05.1 <-> MPSA05.1 <-> MPSA05.2 <-> MPSA05.2 <-> MPSA05.3 <-> MPSA05.3 <-> PH1.1 <-> PH1.2 <-> PH1.3 <-> PH2.1 <-> PH2.2 <-> PH2.3 <-> PH3.1 <-> PH3.2 <-> PH4.1 <-> PH4.2 <-> PH4.3 <-> PH5.1 <-> PH5.2 <-> PH5.3 <-> PH6.1 <-> Q3.1 <-> Q3.2 <-> Q3.3 <-> R1.1 <-> R1.1 <-> R1.2 <-> R1.2 <-> R10.1 <-> R10.1 <-> R10.2 <-> R10.2 <-> R11.1 <-> R11.1 <-> R11.2 <-> R11.2 <-> R12.1 <-> R12.1 <-> R12.2 <-> R12.2 <-> R3.1 <-> R3.1 <-> R3.2 <-> R3.2 <-> R4.1 <-> R4.1 <-> R4.2 <-> R4.2 <-> R5.1 <-> R5.1 <-> R5.2 <-> R5.2 <-> R6.1 <-> R6.1 <-> R6.2 <-> R6.2 <-> R8.1 <-> R8.1 <-> R8.2 <-> R8.2 <-> R9.1 <-> R9.1 <-> R9.2 <-> R9.2 <-> VR1.1 <-> VR1.2 <-> VR1.3 <-> VR2.1 <-> VR2.2 <-> VR2.3 <-> VR3.1 <-> VR3.2 <-> VR3.3 <-> VR4.1 <-> VR4.2 <-> VR4.3
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
+12V.+ <-> +12V.- <-> Arduino Nano.10 <-> Arduino Nano.11 <-> Arduino Nano.12 <-> Arduino Nano.13 <-> Arduino Nano.14 <-> Arduino Nano.15 <-> Arduino Nano.16 <-> Arduino Nano.17 <-> Arduino Nano.18 <-> Arduino Nano.19 <-> Arduino Nano.20 <-> Arduino Nano.21 <-> Arduino Nano.4 <-> Arduino Nano.5 <-> Arduino Nano.6 <-> Arduino Nano.7 <-> Arduino Nano.8 <-> Arduino Nano.9 <-> C1.1 <-> C1.2 <-> C2.1 <-> C2.2 <-> D1.A <-> D1.K <-> D2.A <-> D2.K <-> LM2902.1 <-> LM2902.1 <-> LM2902.10 <-> LM2902.10 <-> LM2902.11 <-> LM2902.11 <-> LM2902.12 <-> LM2902.12 <-> LM2902.13 <-> LM2902.13 <-> LM2902.14 <-> LM2902.14 <-> LM2902.2 <-> LM2902.2 <-> LM2902.3 <-> LM2902.3 <-> LM2902.4 <-> LM2902.4 <-> LM2902.5 <-> LM2902.5 <-> LM2902.6 <-> LM2902.6 <-> LM2902.7 <-> LM2902.7 <-> LM2902.8 <-> LM2902.8 <-> LM2902.9 <-> LM2902.9 <-> MPSA05.1 <-> MPSA05.1 <-> MPSA05.2 <-> MPSA05.2 <-> MPSA05.3 <-> MPSA05.3 <-> PH1.1 <-> PH1.2 <-> PH1.3 <-> PH2.1 <-> PH2.2 <-> PH2.3 <-> PH3.1 <-> PH3.2 <-> PH4.1 <-> PH4.2 <-> PH4.3 <-> PH5.1 <-> PH5.2 <-> PH5.3 <-> PH6.1 <-> Q3.1 <-> Q3.2 <-> Q3.3 <-> R1.1 <-> R1.1 <-> R1.2 <-> R1.2 <-> R10.1 <-> R10.1 <-> R10.2 <-> R10.2 <-> R11.1 <-> R11.1 <-> R11.2 <-> R11.2 <-> R12.1 <-> R12.1 <-> R12.2 <-> R12.2 <-> R3.1 <-> R3.1 <-> R3.2 <-> R3.2 <-> R4.1 <-> R4.1 <-> R4.2 <-> R4.2 <-> R5.1 <-> R5.1 <-> R5.2 <-> R5.2 <-> R6.1 <-> R6.1 <-> R6.2 <-> R6.2 <-> R8.1 <-> R8.1 <-> R8.2 <-> R8.2 <-> R9.1 <-> R9.1 <-> R9.2 <-> R9.2 <-> VR1.1 <-> VR1.2 <-> VR1.3 <-> VR2.1 <-> VR2.2 <-> VR2.3 <-> VR3.1 <-> VR3.2 <-> VR3.3 <-> VR4.1 <-> VR4.2 <-> VR4.3
|
||||
+12V.+ <-> +12V.- <-> Arduino Nano.10 <-> Arduino Nano.11 <-> Arduino Nano.12 <-> Arduino Nano.13 <-> Arduino Nano.14 <-> Arduino Nano.15 <-> Arduino Nano.25 <-> Arduino Nano.26 <-> Arduino Nano.27 <-> Arduino Nano.28 <-> Arduino Nano.29 <-> Arduino Nano.30 <-> Arduino Nano.4 <-> Arduino Nano.5 <-> Arduino Nano.6 <-> Arduino Nano.7 <-> Arduino Nano.8 <-> Arduino Nano.9 <-> C1.1 <-> C1.2 <-> C2.1 <-> C2.2 <-> D1.A <-> D1.K <-> D2.A <-> D2.K <-> LM2902.1 <-> LM2902.1 <-> LM2902.10 <-> LM2902.10 <-> LM2902.11 <-> LM2902.11 <-> LM2902.12 <-> LM2902.12 <-> LM2902.13 <-> LM2902.13 <-> LM2902.14 <-> LM2902.14 <-> LM2902.2 <-> LM2902.2 <-> LM2902.3 <-> LM2902.3 <-> LM2902.4 <-> LM2902.4 <-> LM2902.5 <-> LM2902.5 <-> LM2902.6 <-> LM2902.6 <-> LM2902.7 <-> LM2902.7 <-> LM2902.8 <-> LM2902.8 <-> LM2902.9 <-> LM2902.9 <-> MPSA05.1 <-> MPSA05.1 <-> MPSA05.2 <-> MPSA05.2 <-> MPSA05.3 <-> MPSA05.3 <-> PH1.1 <-> PH1.2 <-> PH1.3 <-> PH2.1 <-> PH2.2 <-> PH2.3 <-> PH3.1 <-> PH3.2 <-> PH4.1 <-> PH4.2 <-> PH4.3 <-> PH5.1 <-> PH5.2 <-> PH5.3 <-> PH6.1 <-> Q3.1 <-> Q3.2 <-> Q3.3 <-> R1.1 <-> R1.1 <-> R1.2 <-> R1.2 <-> R10.1 <-> R10.1 <-> R10.2 <-> R10.2 <-> R11.1 <-> R11.1 <-> R11.2 <-> R11.2 <-> R12.1 <-> R12.1 <-> R12.2 <-> R12.2 <-> R3.1 <-> R3.1 <-> R3.2 <-> R3.2 <-> R4.1 <-> R4.1 <-> R4.2 <-> R4.2 <-> R5.1 <-> R5.1 <-> R5.2 <-> R5.2 <-> R6.1 <-> R6.1 <-> R6.2 <-> R6.2 <-> R8.1 <-> R8.1 <-> R8.2 <-> R8.2 <-> R9.1 <-> R9.1 <-> R9.2 <-> R9.2 <-> VR1.1 <-> VR1.2 <-> VR1.3 <-> VR2.1 <-> VR2.2 <-> VR2.3 <-> VR3.1 <-> VR3.2 <-> VR3.3 <-> VR4.1 <-> VR4.2 <-> VR4.3
|
||||
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
C1.+ <-> R10.2 <-> R2.1 <-> R9.2
|
||||
C1.- <-> C19.1 <-> C2.- <-> C20.2 <-> C21.2 <-> C22.2 <-> C23.2 <-> C28.2 <-> C3.- <-> C4.- <-> C5.- <-> D3.A <-> D5.A <-> IC2.1 <-> IC2.2 <-> IC2.3 <-> IC2.4 <-> IC2.5 <-> IC3.1 <-> IC3.14 <-> IC3.2 <-> IC3.3 <-> IC3.4 <-> IC3.5 <-> IC4.1 <-> IC4.12 <-> IC4.2 <-> IC4.3 <-> IC4.4 <-> IC4.5 <-> R23.2 <-> R24.2 <-> R25.1 <-> R26.1 <-> R27.2 <-> R28.1 <-> R29.2 <-> R30.1 <-> R31.1 <-> R32.1 <-> R33.2 <-> R35.2 <-> R4.2 <-> R5.2 <-> R6.2 <-> R7.2 <-> VR1.3 <-> VR2.3 <-> VR4.1 <-> VR4.2
|
||||
C1.- <-> C19.1 <-> C2.- <-> C20.2 <-> C21.2 <-> C22.2 <-> C23.2 <-> C28.2 <-> C3.- <-> C4.- <-> C5.- <-> D3.A <-> D5.A <-> IC2.1 <-> IC2.2 <-> IC2.3 <-> IC2.4 <-> IC2.5 <-> IC3.1 <-> IC3.11 <-> IC3.2 <-> IC3.3 <-> IC3.4 <-> IC3.5 <-> IC4.1 <-> IC4.13 <-> IC4.2 <-> IC4.3 <-> IC4.4 <-> IC4.5 <-> R23.2 <-> R24.2 <-> R25.1 <-> R26.1 <-> R27.2 <-> R28.1 <-> R29.2 <-> R30.1 <-> R31.1 <-> R32.1 <-> R33.2 <-> R35.2 <-> R4.2 <-> R5.2 <-> R6.2 <-> R7.2 <-> VR1.3 <-> VR2.3 <-> VR4.1 <-> VR4.2
|
||||
C10.1 <-> R22.1 <-> R30.2
|
||||
C10.2 <-> R16.1 <-> V3.7
|
||||
C11.1 <-> IC3.16
|
||||
C11.1 <-> IC3.9
|
||||
C11.2 <-> C14.1 <-> C8.2 <-> R18.1 <-> R25.2
|
||||
C12.1 <-> R11.1 <-> V2.3
|
||||
C12.2 <-> R21.2
|
||||
C13.2 <-> R17.2 <-> V3.6
|
||||
C14.2 <-> C23.1 <-> IC2.16 <-> R18.2 <-> R33.1 <-> V3.2
|
||||
C14.2 <-> C23.1 <-> IC2.9 <-> R18.2 <-> R33.1 <-> V3.2
|
||||
C15.1 <-> C9.1 <-> R19.1
|
||||
C15.2 <-> C22.1 <-> IC2.12 <-> R19.2 <-> R29.1
|
||||
C15.2 <-> C22.1 <-> IC2.13 <-> R19.2 <-> R29.1
|
||||
C16.1 <-> C21.1 <-> R27.1 <-> V2.1
|
||||
C16.2 <-> R32.2 <-> V2.2 <-> VR1.2
|
||||
C17.1 <-> R13.2 <-> V3.3
|
||||
C17.2 <-> R34.1
|
||||
C18.+ <-> IC1.3 <-> Q2.1
|
||||
C18.- <-> C29.- <-> IC1.4 <-> Q2.2 <-> SW1.2
|
||||
C18.+ <-> IC1.4 <-> Q2.1
|
||||
C18.- <-> C29.- <-> IC1.3 <-> Q2.2 <-> SW1.2
|
||||
C19.2 <-> R21.1 <-> R28.2 <-> V2.7
|
||||
C2.+ <-> C6.2 <-> R11.2 <-> R12.2 <-> R2.2 <-> R3.1
|
||||
C20.1 <-> C27.1 <-> R26.2 <-> V1.1
|
||||
@@ -40,11 +40,11 @@ Switch setup: [ ALL ]
|
||||
C8.1 <-> R10.1 <-> V1.8
|
||||
D2.A <-> D3.K
|
||||
D4.A <-> D5.K
|
||||
D6.A <-> D7.A <-> D8.A <-> D9.K <-> IC2.9 <-> IC3.9 <-> IC4.9 <-> SW1.1
|
||||
D6.A <-> D7.A <-> D8.A <-> D9.K <-> IC2.16 <-> IC3.16 <-> IC4.16 <-> SW1.1
|
||||
D9.A <-> R37.2
|
||||
IC3.12 <-> R36.2
|
||||
IC4.14 <-> VR6.2 <-> VR6.3
|
||||
IC4.16 <-> VR7.2 <-> VR7.3
|
||||
IC3.13 <-> R36.2
|
||||
IC4.11 <-> VR6.2 <-> VR6.3
|
||||
IC4.9 <-> VR7.2 <-> VR7.3
|
||||
Q1.3 <-> R1.1 <-> R4.1
|
||||
R16.2 <-> R17.1 <-> R31.2
|
||||
R22.2 <-> R34.2 <-> VR6.1 <-> VR7.1
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
Switch setup: [ SW1.ON1 ]
|
||||
|
||||
C1.+ <-> R10.2 <-> R2.1 <-> R9.2
|
||||
C1.- <-> C19.1 <-> C2.- <-> C20.2 <-> C21.2 <-> C22.2 <-> C23.2 <-> C28.2 <-> C3.- <-> C4.- <-> C5.- <-> D3.A <-> D5.A <-> IC2.1 <-> IC2.2 <-> IC2.3 <-> IC2.4 <-> IC2.5 <-> IC3.1 <-> IC3.14 <-> IC3.2 <-> IC3.3 <-> IC3.4 <-> IC3.5 <-> IC4.1 <-> IC4.12 <-> IC4.2 <-> IC4.3 <-> IC4.4 <-> IC4.5 <-> R23.2 <-> R24.2 <-> R25.1 <-> R26.1 <-> R27.2 <-> R28.1 <-> R29.2 <-> R30.1 <-> R31.1 <-> R32.1 <-> R33.2 <-> R35.2 <-> R4.2 <-> R5.2 <-> R6.2 <-> R7.2 <-> VR1.3 <-> VR2.3 <-> VR4.1 <-> VR4.2
|
||||
C1.- <-> C19.1 <-> C2.- <-> C20.2 <-> C21.2 <-> C22.2 <-> C23.2 <-> C28.2 <-> C3.- <-> C4.- <-> C5.- <-> D3.A <-> D5.A <-> IC2.1 <-> IC2.2 <-> IC2.3 <-> IC2.4 <-> IC2.5 <-> IC3.1 <-> IC3.11 <-> IC3.2 <-> IC3.3 <-> IC3.4 <-> IC3.5 <-> IC4.1 <-> IC4.13 <-> IC4.2 <-> IC4.3 <-> IC4.4 <-> IC4.5 <-> R23.2 <-> R24.2 <-> R25.1 <-> R26.1 <-> R27.2 <-> R28.1 <-> R29.2 <-> R30.1 <-> R31.1 <-> R32.1 <-> R33.2 <-> R35.2 <-> R4.2 <-> R5.2 <-> R6.2 <-> R7.2 <-> VR1.3 <-> VR2.3 <-> VR4.1 <-> VR4.2
|
||||
C10.1 <-> R22.1 <-> R30.2
|
||||
C10.2 <-> R16.1 <-> V3.7
|
||||
C11.1 <-> IC3.16
|
||||
C11.1 <-> IC3.9
|
||||
C11.2 <-> C14.1 <-> C8.2 <-> R18.1 <-> R25.2
|
||||
C12.1 <-> R11.1 <-> V2.3
|
||||
C12.2 <-> R21.2
|
||||
C13.2 <-> R17.2 <-> V3.6
|
||||
C14.2 <-> C23.1 <-> IC2.16 <-> R18.2 <-> R33.1 <-> V3.2
|
||||
C14.2 <-> C23.1 <-> IC2.9 <-> R18.2 <-> R33.1 <-> V3.2
|
||||
C15.1 <-> C9.1 <-> R19.1
|
||||
C15.2 <-> C22.1 <-> IC2.12 <-> R19.2 <-> R29.1
|
||||
C15.2 <-> C22.1 <-> IC2.13 <-> R19.2 <-> R29.1
|
||||
C16.1 <-> C21.1 <-> R27.1 <-> V2.1
|
||||
C16.2 <-> R32.2 <-> V2.2 <-> VR1.2
|
||||
C17.1 <-> R13.2 <-> V3.3
|
||||
C17.2 <-> R34.1
|
||||
C18.+ <-> IC1.3 <-> Q2.1
|
||||
C18.- <-> C29.- <-> D6.A <-> D7.A <-> D8.A <-> D9.K <-> IC1.4 <-> IC2.9 <-> IC3.9 <-> IC4.9 <-> Q2.2
|
||||
C18.+ <-> IC1.4 <-> Q2.1
|
||||
C18.- <-> C29.- <-> D6.A <-> D7.A <-> D8.A <-> D9.K <-> IC1.3 <-> IC2.16 <-> IC3.16 <-> IC4.16 <-> Q2.2
|
||||
C19.2 <-> R21.1 <-> R28.2 <-> V2.7
|
||||
C2.+ <-> C6.2 <-> R11.2 <-> R12.2 <-> R2.2 <-> R3.1
|
||||
C20.1 <-> C27.1 <-> R26.2 <-> V1.1
|
||||
@@ -41,9 +41,9 @@ Switch setup: [ SW1.ON1 ]
|
||||
D2.A <-> D3.K
|
||||
D4.A <-> D5.K
|
||||
D9.A <-> R37.2
|
||||
IC3.12 <-> R36.2
|
||||
IC4.14 <-> VR6.2 <-> VR6.3
|
||||
IC4.16 <-> VR7.2 <-> VR7.3
|
||||
IC3.13 <-> R36.2
|
||||
IC4.11 <-> VR6.2 <-> VR6.3
|
||||
IC4.9 <-> VR7.2 <-> VR7.3
|
||||
Q1.3 <-> R1.1 <-> R4.1
|
||||
R16.2 <-> R17.1 <-> R31.2
|
||||
R22.2 <-> R34.2 <-> VR6.1 <-> VR7.1
|
||||
@@ -53,23 +53,23 @@ Switch setup: [ SW1.ON1 ]
|
||||
Switch setup: [ SW1.ON2 ]
|
||||
|
||||
C1.+ <-> R10.2 <-> R2.1 <-> R9.2
|
||||
C1.- <-> C19.1 <-> C2.- <-> C20.2 <-> C21.2 <-> C22.2 <-> C23.2 <-> C28.2 <-> C3.- <-> C4.- <-> C5.- <-> D3.A <-> D5.A <-> IC2.1 <-> IC2.2 <-> IC2.3 <-> IC2.4 <-> IC2.5 <-> IC3.1 <-> IC3.14 <-> IC3.2 <-> IC3.3 <-> IC3.4 <-> IC3.5 <-> IC4.1 <-> IC4.12 <-> IC4.2 <-> IC4.3 <-> IC4.4 <-> IC4.5 <-> R23.2 <-> R24.2 <-> R25.1 <-> R26.1 <-> R27.2 <-> R28.1 <-> R29.2 <-> R30.1 <-> R31.1 <-> R32.1 <-> R33.2 <-> R35.2 <-> R4.2 <-> R5.2 <-> R6.2 <-> R7.2 <-> VR1.3 <-> VR2.3 <-> VR4.1 <-> VR4.2
|
||||
C1.- <-> C19.1 <-> C2.- <-> C20.2 <-> C21.2 <-> C22.2 <-> C23.2 <-> C28.2 <-> C3.- <-> C4.- <-> C5.- <-> D3.A <-> D5.A <-> IC2.1 <-> IC2.2 <-> IC2.3 <-> IC2.4 <-> IC2.5 <-> IC3.1 <-> IC3.11 <-> IC3.2 <-> IC3.3 <-> IC3.4 <-> IC3.5 <-> IC4.1 <-> IC4.13 <-> IC4.2 <-> IC4.3 <-> IC4.4 <-> IC4.5 <-> R23.2 <-> R24.2 <-> R25.1 <-> R26.1 <-> R27.2 <-> R28.1 <-> R29.2 <-> R30.1 <-> R31.1 <-> R32.1 <-> R33.2 <-> R35.2 <-> R4.2 <-> R5.2 <-> R6.2 <-> R7.2 <-> VR1.3 <-> VR2.3 <-> VR4.1 <-> VR4.2
|
||||
C10.1 <-> R22.1 <-> R30.2
|
||||
C10.2 <-> R16.1 <-> V3.7
|
||||
C11.1 <-> IC3.16
|
||||
C11.1 <-> IC3.9
|
||||
C11.2 <-> C14.1 <-> C8.2 <-> R18.1 <-> R25.2
|
||||
C12.1 <-> R11.1 <-> V2.3
|
||||
C12.2 <-> R21.2
|
||||
C13.2 <-> R17.2 <-> V3.6
|
||||
C14.2 <-> C23.1 <-> IC2.16 <-> R18.2 <-> R33.1 <-> V3.2
|
||||
C14.2 <-> C23.1 <-> IC2.9 <-> R18.2 <-> R33.1 <-> V3.2
|
||||
C15.1 <-> C9.1 <-> R19.1
|
||||
C15.2 <-> C22.1 <-> IC2.12 <-> R19.2 <-> R29.1
|
||||
C15.2 <-> C22.1 <-> IC2.13 <-> R19.2 <-> R29.1
|
||||
C16.1 <-> C21.1 <-> R27.1 <-> V2.1
|
||||
C16.2 <-> R32.2 <-> V2.2 <-> VR1.2
|
||||
C17.1 <-> R13.2 <-> V3.3
|
||||
C17.2 <-> R34.1
|
||||
C18.+ <-> IC1.3 <-> Q2.1
|
||||
C18.- <-> C29.- <-> IC1.4 <-> Q2.2
|
||||
C18.+ <-> IC1.4 <-> Q2.1
|
||||
C18.- <-> C29.- <-> IC1.3 <-> Q2.2
|
||||
C19.2 <-> R21.1 <-> R28.2 <-> V2.7
|
||||
C2.+ <-> C6.2 <-> R11.2 <-> R12.2 <-> R2.2 <-> R3.1
|
||||
C20.1 <-> C27.1 <-> R26.2 <-> V1.1
|
||||
@@ -92,11 +92,11 @@ Switch setup: [ SW1.ON2 ]
|
||||
C8.1 <-> R10.1 <-> V1.8
|
||||
D2.A <-> D3.K
|
||||
D4.A <-> D5.K
|
||||
D6.A <-> D7.A <-> D8.A <-> D9.K <-> IC2.9 <-> IC3.9 <-> IC4.9
|
||||
D6.A <-> D7.A <-> D8.A <-> D9.K <-> IC2.16 <-> IC3.16 <-> IC4.16
|
||||
D9.A <-> R37.2
|
||||
IC3.12 <-> R36.2
|
||||
IC4.14 <-> VR6.2 <-> VR6.3
|
||||
IC4.16 <-> VR7.2 <-> VR7.3
|
||||
IC3.13 <-> R36.2
|
||||
IC4.11 <-> VR6.2 <-> VR6.3
|
||||
IC4.9 <-> VR7.2 <-> VR7.3
|
||||
Q1.3 <-> R1.1 <-> R4.1
|
||||
R16.2 <-> R17.1 <-> R31.2
|
||||
R22.2 <-> R34.2 <-> VR6.1 <-> VR7.1
|
||||
|
||||
@@ -2,15 +2,15 @@ Switch setup: [ ALL ]
|
||||
|
||||
C1.1 <-> Q1.2 <-> R2.1
|
||||
C1.2 <-> VR2.3
|
||||
C2.+ <-> IC1.5 <-> R3.1
|
||||
C2.+ <-> IC1.8 <-> R3.1
|
||||
C2.- <-> R4.2 <-> SW1.2
|
||||
C3.1 <-> IC1.7
|
||||
C3.1 <-> IC1.6
|
||||
C3.2 <-> C4.- <-> C5.2 <-> IC1.3 <-> IC1.4 <-> J1.Sleeve <-> J2.Sleeve <-> J3.Center <-> R1.1 <-> R2.2 <-> VR2.1
|
||||
C4.+ <-> IC1.6 <-> J3.Sleeve <-> Q1.1
|
||||
C4.+ <-> IC1.7 <-> J3.Sleeve <-> Q1.1
|
||||
C5.1 <-> R3.2
|
||||
IC1.1 <-> VR1.3
|
||||
IC1.2 <-> VR2.2
|
||||
IC1.8 <-> VR1.2
|
||||
IC1.5 <-> VR1.2
|
||||
J1.Tip <-> R4.1 <-> R5.1 <-> SW1.1
|
||||
J2.Tip <-> Q1.3 <-> R1.2
|
||||
R5.2 <-> SW1.3
|
||||
|
||||
@@ -1,47 +1,47 @@
|
||||
Switch setup: [ SW1.ON1 ]
|
||||
|
||||
C1.1 <-> Q1.2 <-> R2.1
|
||||
C1.2 <-> VR2.3
|
||||
C2.+ <-> IC1.5 <-> R3.1
|
||||
C2.- <-> J1.Tip <-> R4.1 <-> R4.2 <-> R5.1
|
||||
C3.1 <-> IC1.7
|
||||
C3.2 <-> C4.- <-> C5.2 <-> IC1.3 <-> IC1.4 <-> J1.Sleeve <-> J2.Sleeve <-> J3.Center <-> R1.1 <-> R2.2 <-> VR2.1
|
||||
C4.+ <-> IC1.6 <-> J3.Sleeve <-> Q1.1
|
||||
C5.1 <-> R3.2
|
||||
IC1.1 <-> VR1.3
|
||||
IC1.2 <-> VR2.2
|
||||
IC1.8 <-> VR1.2
|
||||
J2.Tip <-> Q1.3 <-> R1.2
|
||||
|
||||
Switch setup: [ SW1.OFF ]
|
||||
|
||||
C1.1 <-> Q1.2 <-> R2.1
|
||||
C1.2 <-> VR2.3
|
||||
C2.+ <-> IC1.5 <-> R3.1
|
||||
C2.+ <-> IC1.8 <-> R3.1
|
||||
C2.- <-> R4.2
|
||||
C3.1 <-> IC1.7
|
||||
C3.1 <-> IC1.6
|
||||
C3.2 <-> C4.- <-> C5.2 <-> IC1.3 <-> IC1.4 <-> J1.Sleeve <-> J2.Sleeve <-> J3.Center <-> R1.1 <-> R2.2 <-> VR2.1
|
||||
C4.+ <-> IC1.6 <-> J3.Sleeve <-> Q1.1
|
||||
C4.+ <-> IC1.7 <-> J3.Sleeve <-> Q1.1
|
||||
C5.1 <-> R3.2
|
||||
IC1.1 <-> VR1.3
|
||||
IC1.2 <-> VR2.2
|
||||
IC1.8 <-> VR1.2
|
||||
IC1.5 <-> VR1.2
|
||||
J1.Tip <-> R4.1 <-> R5.1
|
||||
J2.Tip <-> Q1.3 <-> R1.2
|
||||
|
||||
Switch setup: [ SW1.ON1 ]
|
||||
|
||||
C1.1 <-> Q1.2 <-> R2.1
|
||||
C1.2 <-> VR2.3
|
||||
C2.+ <-> IC1.8 <-> R3.1
|
||||
C2.- <-> J1.Tip <-> R4.1 <-> R4.2 <-> R5.1
|
||||
C3.1 <-> IC1.6
|
||||
C3.2 <-> C4.- <-> C5.2 <-> IC1.3 <-> IC1.4 <-> J1.Sleeve <-> J2.Sleeve <-> J3.Center <-> R1.1 <-> R2.2 <-> VR2.1
|
||||
C4.+ <-> IC1.7 <-> J3.Sleeve <-> Q1.1
|
||||
C5.1 <-> R3.2
|
||||
IC1.1 <-> VR1.3
|
||||
IC1.2 <-> VR2.2
|
||||
IC1.5 <-> VR1.2
|
||||
J2.Tip <-> Q1.3 <-> R1.2
|
||||
|
||||
Switch setup: [ SW1.ON2 ]
|
||||
|
||||
C1.1 <-> Q1.2 <-> R2.1
|
||||
C1.2 <-> VR2.3
|
||||
C2.+ <-> IC1.5 <-> R3.1
|
||||
C2.+ <-> IC1.8 <-> R3.1
|
||||
C2.- <-> R4.2 <-> R5.2
|
||||
C3.1 <-> IC1.7
|
||||
C3.1 <-> IC1.6
|
||||
C3.2 <-> C4.- <-> C5.2 <-> IC1.3 <-> IC1.4 <-> J1.Sleeve <-> J2.Sleeve <-> J3.Center <-> R1.1 <-> R2.2 <-> VR2.1
|
||||
C4.+ <-> IC1.6 <-> J3.Sleeve <-> Q1.1
|
||||
C4.+ <-> IC1.7 <-> J3.Sleeve <-> Q1.1
|
||||
C5.1 <-> R3.2
|
||||
IC1.1 <-> VR1.3
|
||||
IC1.2 <-> VR2.2
|
||||
IC1.8 <-> VR1.2
|
||||
IC1.5 <-> VR1.2
|
||||
J1.Tip <-> R4.1 <-> R5.1
|
||||
J2.Tip <-> Q1.3 <-> R1.2
|
||||
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
C1.1 <-> IC1.8 <-> IC2.9 <-> IC3.2 <-> R3.2 <-> VR1.3
|
||||
C1.2 <-> D14.A <-> D7.K <-> IC1.1 <-> IC2.16 <-> IC3.1 <-> R1.2 <-> VR1.1 <-> VR4.2 <-> VR4.3
|
||||
C2.1 <-> IC3.7 <-> R2.2
|
||||
C1.1 <-> IC1.8 <-> IC2.16 <-> IC3.2 <-> R3.2 <-> VR1.3
|
||||
C1.2 <-> D14.A <-> D7.K <-> IC1.1 <-> IC2.9 <-> IC3.1 <-> R1.2 <-> VR1.1 <-> VR4.2 <-> VR4.3
|
||||
C2.1 <-> IC3.6 <-> R2.2
|
||||
C2.2 <-> VR2.3
|
||||
C3.1 <-> R3.1 <-> VR3.2
|
||||
C3.2 <-> C6.2 <-> C8.+ <-> R4.1 <-> R5.2 <-> R7.2 <-> R9.1
|
||||
C4.1 <-> C7.- <-> C8.- <-> D16.A <-> IC3.4 <-> R7.1 <-> R8.1 <-> VR2.1
|
||||
C4.2 <-> IC3.5 <-> R6.1
|
||||
C4.2 <-> IC3.8 <-> R6.1
|
||||
C5.1 <-> IC3.3 <-> R4.2
|
||||
C5.2 <-> R8.2
|
||||
C6.1 <-> VR3.3
|
||||
C7.+ <-> D16.K <-> IC3.8 <-> R9.2
|
||||
D1.A <-> IC1.10 <-> IC1.9
|
||||
C7.+ <-> D16.K <-> IC3.5 <-> R9.2
|
||||
D1.A <-> IC1.15 <-> IC1.16
|
||||
D1.K <-> D2.A <-> IC1.6 <-> IC1.7
|
||||
D10.A <-> D11.K <-> IC2.12 <-> IC2.13
|
||||
D10.K <-> D9.A <-> IC2.5 <-> IC2.6
|
||||
D11.A <-> D12.K <-> IC2.3 <-> IC2.4
|
||||
D12.A <-> D13.K <-> IC2.14 <-> IC2.15
|
||||
D12.A <-> D13.K <-> IC2.10 <-> IC2.11
|
||||
D13.A <-> D14.K <-> IC2.1 <-> IC2.2
|
||||
D15.K <-> Q1.1
|
||||
D2.K <-> D3.A <-> IC1.11 <-> IC1.12
|
||||
D2.K <-> D3.A <-> IC1.13 <-> IC1.14
|
||||
D3.K <-> D4.A <-> IC1.4 <-> IC1.5
|
||||
D4.K <-> D5.A <-> IC1.13 <-> IC1.14
|
||||
D4.K <-> D5.A <-> IC1.11 <-> IC1.12
|
||||
D5.K <-> D6.A <-> IC1.2 <-> IC1.3
|
||||
D6.K <-> D7.A <-> IC1.15 <-> IC1.16
|
||||
D8.A <-> D9.K <-> IC2.10 <-> IC2.11
|
||||
D6.K <-> D7.A <-> IC1.10 <-> IC1.9
|
||||
D8.A <-> D9.K <-> IC2.14 <-> IC2.15
|
||||
D8.K <-> IC2.7 <-> IC2.8
|
||||
IC3.6 <-> R2.1 <-> R5.1
|
||||
IC3.7 <-> R2.1 <-> R5.1
|
||||
Q1.2 <-> Q1.3
|
||||
R1.1 <-> VR1.2
|
||||
R6.2 <-> VR4.1
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
C1.1 <-> IC1.8 <-> IC2.9 <-> IC3.2 <-> R3.2 <-> VR1.3
|
||||
C1.2 <-> D14.A <-> D7.K <-> IC1.1 <-> IC2.16 <-> IC3.1 <-> R1.2 <-> VR1.1 <-> VR4.2 <-> VR4.3
|
||||
C2.1 <-> IC3.7 <-> R2.2
|
||||
C1.1 <-> IC1.8 <-> IC2.16 <-> IC3.2 <-> R3.2 <-> VR1.3
|
||||
C1.2 <-> D14.A <-> D7.K <-> IC1.1 <-> IC2.9 <-> IC3.1 <-> R1.2 <-> VR1.1 <-> VR4.2 <-> VR4.3
|
||||
C2.1 <-> IC3.6 <-> R2.2
|
||||
C2.2 <-> VR2.3
|
||||
C3.1 <-> R3.1 <-> VR3.2
|
||||
C3.2 <-> C6.2 <-> C8.+ <-> R4.1 <-> R5.2 <-> R7.2 <-> R9.1
|
||||
C4.1 <-> C7.- <-> C8.- <-> D16.A <-> IC3.4 <-> R7.1 <-> R8.1 <-> VR2.1
|
||||
C4.2 <-> IC3.5 <-> R6.1
|
||||
C4.2 <-> IC3.8 <-> R6.1
|
||||
C5.1 <-> IC3.3 <-> R4.2
|
||||
C5.2 <-> R8.2
|
||||
C6.1 <-> VR3.3
|
||||
C7.+ <-> D16.K <-> IC3.8 <-> R9.2
|
||||
D1.A <-> IC1.10 <-> IC1.9
|
||||
C7.+ <-> D16.K <-> IC3.5 <-> R9.2
|
||||
D1.A <-> IC1.15 <-> IC1.16
|
||||
D1.K <-> D2.A <-> IC1.6 <-> IC1.7
|
||||
D10.A <-> D11.K <-> IC2.12 <-> IC2.13
|
||||
D10.K <-> D9.A <-> IC2.5 <-> IC2.6
|
||||
D11.A <-> D12.K <-> IC2.3 <-> IC2.4
|
||||
D12.A <-> D13.K <-> IC2.14 <-> IC2.15
|
||||
D12.A <-> D13.K <-> IC2.10 <-> IC2.11
|
||||
D13.A <-> D14.K <-> IC2.1 <-> IC2.2
|
||||
D15.K <-> Q1.1
|
||||
D2.K <-> D3.A <-> IC1.11 <-> IC1.12
|
||||
D2.K <-> D3.A <-> IC1.13 <-> IC1.14
|
||||
D3.K <-> D4.A <-> IC1.4 <-> IC1.5
|
||||
D4.K <-> D5.A <-> IC1.13 <-> IC1.14
|
||||
D4.K <-> D5.A <-> IC1.11 <-> IC1.12
|
||||
D5.K <-> D6.A <-> IC1.2 <-> IC1.3
|
||||
D6.K <-> D7.A <-> IC1.15 <-> IC1.16
|
||||
D8.A <-> D9.K <-> IC2.10 <-> IC2.11
|
||||
D6.K <-> D7.A <-> IC1.10 <-> IC1.9
|
||||
D8.A <-> D9.K <-> IC2.14 <-> IC2.15
|
||||
D8.K <-> IC2.7 <-> IC2.8
|
||||
IC3.6 <-> R2.1 <-> R5.1
|
||||
IC3.7 <-> R2.1 <-> R5.1
|
||||
Q1.2 <-> Q1.3
|
||||
R1.1 <-> VR1.2
|
||||
R6.2 <-> VR4.1
|
||||
|
||||
+5
-5
@@ -1,7 +1,7 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
C1.1 <-> C2.1 <-> C3.1 <-> C4.1 <-> IC1.10 <-> IC1.11 <-> IC1.20 <-> IC1.21 <-> IC1.22 <-> IC1.3 <-> IC1.4 <-> IC1.40 <-> IC1.42 <-> IC1.43 <-> IC1.44 <-> IC1.45 <-> IC2.10 <-> IC2.11 <-> IC2.20 <-> IC2.21 <-> IC2.22 <-> IC2.3 <-> IC2.4 <-> IC2.40 <-> IC2.42 <-> IC2.43 <-> IC2.44 <-> IC2.45 <-> IC3.4 <-> IC3.8 <-> IC4.8
|
||||
C1.2 <-> C2.2 <-> C3.2 <-> C4.2 <-> IC1.31 <-> IC1.41 <-> IC1.5 <-> IC1.6 <-> IC1.8 <-> IC2.31 <-> IC2.41 <-> IC2.5 <-> IC2.6 <-> IC2.8 <-> IC3.16 <-> IC4.16 <-> IC4.6
|
||||
C1.1 <-> C2.1 <-> C3.1 <-> C4.1 <-> IC1.10 <-> IC1.11 <-> IC1.20 <-> IC1.21 <-> IC1.22 <-> IC1.28 <-> IC1.29 <-> IC1.3 <-> IC1.30 <-> IC1.31 <-> IC1.33 <-> IC1.4 <-> IC2.10 <-> IC2.11 <-> IC2.20 <-> IC2.21 <-> IC2.22 <-> IC2.28 <-> IC2.29 <-> IC2.3 <-> IC2.30 <-> IC2.31 <-> IC2.33 <-> IC2.4 <-> IC3.4 <-> IC3.8 <-> IC4.8
|
||||
C1.2 <-> C2.2 <-> C3.2 <-> C4.2 <-> IC1.32 <-> IC1.42 <-> IC1.5 <-> IC1.6 <-> IC1.8 <-> IC2.32 <-> IC2.42 <-> IC2.5 <-> IC2.6 <-> IC2.8 <-> IC3.9 <-> IC4.6 <-> IC4.9
|
||||
IC1.1 <-> IC2.1
|
||||
IC1.12 <-> IC2.12
|
||||
IC1.13 <-> IC2.13
|
||||
@@ -12,9 +12,9 @@ Switch setup: [ ALL ]
|
||||
IC1.18 <-> IC2.18
|
||||
IC1.19 <-> IC2.19
|
||||
IC1.2 <-> IC2.2
|
||||
IC1.46 <-> IC2.46 <-> IC3.5 <-> IC4.5
|
||||
IC1.47 <-> IC2.47
|
||||
IC1.48 <-> IC2.48
|
||||
IC1.25 <-> IC2.25
|
||||
IC1.26 <-> IC2.26
|
||||
IC1.27 <-> IC2.27 <-> IC3.5 <-> IC4.5
|
||||
IC3.1 <-> IC4.1
|
||||
IC3.2 <-> IC4.2
|
||||
IC3.3 <-> IC4.3
|
||||
|
||||
+5
-5
@@ -1,7 +1,7 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
C1.1 <-> C2.1 <-> C3.1 <-> C4.1 <-> IC1.10 <-> IC1.11 <-> IC1.20 <-> IC1.21 <-> IC1.22 <-> IC1.3 <-> IC1.4 <-> IC1.40 <-> IC1.42 <-> IC1.43 <-> IC1.44 <-> IC1.45 <-> IC2.10 <-> IC2.11 <-> IC2.20 <-> IC2.21 <-> IC2.22 <-> IC2.3 <-> IC2.4 <-> IC2.40 <-> IC2.42 <-> IC2.43 <-> IC2.44 <-> IC2.45 <-> IC3.4 <-> IC3.8 <-> IC4.8
|
||||
C1.2 <-> C2.2 <-> C3.2 <-> C4.2 <-> IC1.31 <-> IC1.41 <-> IC1.5 <-> IC1.6 <-> IC1.8 <-> IC2.31 <-> IC2.41 <-> IC2.5 <-> IC2.6 <-> IC2.8 <-> IC3.16 <-> IC4.16 <-> IC4.6
|
||||
C1.1 <-> C2.1 <-> C3.1 <-> C4.1 <-> IC1.10 <-> IC1.11 <-> IC1.20 <-> IC1.21 <-> IC1.22 <-> IC1.28 <-> IC1.29 <-> IC1.3 <-> IC1.30 <-> IC1.31 <-> IC1.33 <-> IC1.4 <-> IC2.10 <-> IC2.11 <-> IC2.20 <-> IC2.21 <-> IC2.22 <-> IC2.28 <-> IC2.29 <-> IC2.3 <-> IC2.30 <-> IC2.31 <-> IC2.33 <-> IC2.4 <-> IC3.4 <-> IC3.8 <-> IC4.8
|
||||
C1.2 <-> C2.2 <-> C3.2 <-> C4.2 <-> IC1.32 <-> IC1.42 <-> IC1.5 <-> IC1.6 <-> IC1.8 <-> IC2.32 <-> IC2.42 <-> IC2.5 <-> IC2.6 <-> IC2.8 <-> IC3.9 <-> IC4.6 <-> IC4.9
|
||||
IC1.1 <-> IC2.1
|
||||
IC1.12 <-> IC2.12
|
||||
IC1.13 <-> IC2.13
|
||||
@@ -12,9 +12,9 @@ Switch setup: [ ALL ]
|
||||
IC1.18 <-> IC2.18
|
||||
IC1.19 <-> IC2.19
|
||||
IC1.2 <-> IC2.2
|
||||
IC1.46 <-> IC2.46 <-> IC3.5 <-> IC4.5
|
||||
IC1.47 <-> IC2.47
|
||||
IC1.48 <-> IC2.48
|
||||
IC1.25 <-> IC2.25
|
||||
IC1.26 <-> IC2.26
|
||||
IC1.27 <-> IC2.27 <-> IC3.5 <-> IC4.5
|
||||
IC3.1 <-> IC4.1
|
||||
IC3.2 <-> IC4.2
|
||||
IC3.3 <-> IC4.3
|
||||
|
||||
+6
-6
@@ -3,21 +3,21 @@ Switch setup: [ ALL ]
|
||||
C1.1 <-> IC1.2 <-> R1.1
|
||||
C1.2 <-> C3.- <-> C7.- <-> C8.+ <-> D3.K <-> IC1.4 <-> R3.2
|
||||
C10.+ <-> D5.K <-> D6.A
|
||||
C10.- <-> C9.+ <-> IC2.5
|
||||
C10.- <-> C9.+ <-> IC2.8
|
||||
C12.+ <-> D6.K
|
||||
C12.- <-> C14.- <-> C2.2 <-> IC2.4 <-> R4.2
|
||||
C14.+ <-> D5.A <-> IC2.6
|
||||
C14.+ <-> D5.A <-> IC2.7
|
||||
C2.1 <-> IC2.2 <-> R5.1
|
||||
C3.+ <-> D1.A <-> IC1.6
|
||||
C4.+ <-> C5.- <-> C6.+ <-> IC1.5
|
||||
C3.+ <-> D1.A <-> IC1.7
|
||||
C4.+ <-> C5.- <-> C6.+ <-> IC1.8
|
||||
C4.- <-> R1.2 <-> R2.2
|
||||
C5.+ <-> D1.K <-> D2.A
|
||||
C6.- <-> D3.A <-> D4.K
|
||||
C7.+ <-> D2.K
|
||||
C8.- <-> D4.A
|
||||
C9.- <-> R5.2 <-> R6.2
|
||||
IC1.1 <-> IC1.8
|
||||
IC1.1 <-> IC1.5
|
||||
IC1.3 <-> R2.1 <-> R3.1
|
||||
IC2.1 <-> IC2.8
|
||||
IC2.1 <-> IC2.5
|
||||
IC2.3 <-> R4.1 <-> R6.1
|
||||
|
||||
|
||||
+6
-6
@@ -3,21 +3,21 @@ Switch setup: [ ALL ]
|
||||
C1.1 <-> IC1.2 <-> R1.1
|
||||
C1.2 <-> C3.- <-> C7.- <-> C8.+ <-> D3.K <-> IC1.4 <-> R3.2
|
||||
C10.+ <-> D5.K <-> D6.A
|
||||
C10.- <-> C9.+ <-> IC2.5
|
||||
C10.- <-> C9.+ <-> IC2.8
|
||||
C12.+ <-> D6.K
|
||||
C12.- <-> C14.- <-> C2.2 <-> IC2.4 <-> R4.2
|
||||
C14.+ <-> D5.A <-> IC2.6
|
||||
C14.+ <-> D5.A <-> IC2.7
|
||||
C2.1 <-> IC2.2 <-> R5.1
|
||||
C3.+ <-> D1.A <-> IC1.6
|
||||
C4.+ <-> C5.- <-> C6.+ <-> IC1.5
|
||||
C3.+ <-> D1.A <-> IC1.7
|
||||
C4.+ <-> C5.- <-> C6.+ <-> IC1.8
|
||||
C4.- <-> R1.2 <-> R2.2
|
||||
C5.+ <-> D1.K <-> D2.A
|
||||
C6.- <-> D3.A <-> D4.K
|
||||
C7.+ <-> D2.K
|
||||
C8.- <-> D4.A
|
||||
C9.- <-> R5.2 <-> R6.2
|
||||
IC1.1 <-> IC1.8
|
||||
IC1.1 <-> IC1.5
|
||||
IC1.3 <-> R2.1 <-> R3.1
|
||||
IC2.1 <-> IC2.8
|
||||
IC2.1 <-> IC2.5
|
||||
IC2.3 <-> R4.1 <-> R6.1
|
||||
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
C1.1 <-> C2.1 <-> C3.1 <-> IC1.10 <-> IC2.10 <-> IC5.10
|
||||
C1.2 <-> C10.2 <-> C2.2 <-> C3.2 <-> C4.1 <-> C5.1 <-> C6.1 <-> C7.1 <-> C8.1 <-> C9.2 <-> IC1.20 <-> IC10.19 <-> IC10.20 <-> IC11.20 <-> IC2.20 <-> IC3.20 <-> IC4.32 <-> IC5.20 <-> IC6.13 <-> IC6.16 <-> IC6.6 <-> IC7.20 <-> IC9.20
|
||||
C10.1 <-> C4.2 <-> C5.2 <-> C6.2 <-> C7.2 <-> C8.2 <-> C9.1 <-> IC10.1 <-> IC10.10 <-> IC11.1 <-> IC11.10 <-> IC3.1 <-> IC3.10 <-> IC4.16 <-> IC4.22 <-> IC6.8 <-> IC7.1 <-> IC7.10 <-> IC9.1 <-> IC9.10
|
||||
C1.2 <-> C10.2 <-> C2.2 <-> C3.2 <-> C4.1 <-> C5.1 <-> C6.1 <-> C7.1 <-> C8.1 <-> C9.2 <-> IC1.11 <-> IC10.11 <-> IC10.12 <-> IC11.11 <-> IC2.11 <-> IC3.11 <-> IC4.17 <-> IC5.11 <-> IC6.12 <-> IC6.6 <-> IC6.9 <-> IC7.11 <-> IC9.11
|
||||
C10.1 <-> C4.2 <-> C5.2 <-> C6.2 <-> C7.2 <-> C8.2 <-> C9.1 <-> IC10.1 <-> IC10.10 <-> IC11.1 <-> IC11.10 <-> IC3.1 <-> IC3.10 <-> IC4.16 <-> IC4.27 <-> IC6.8 <-> IC7.1 <-> IC7.10 <-> IC9.1 <-> IC9.10
|
||||
IC1.1 <-> IC2.1 <-> IC5.1
|
||||
IC1.2 <-> IC10.18 <-> IC11.18 <-> IC2.2 <-> IC3.11 <-> IC4.13 <-> IC4.27 <-> IC5.2 <-> IC7.12 <-> IC9.18
|
||||
IC1.3 <-> IC10.17 <-> IC11.17 <-> IC2.3 <-> IC3.12 <-> IC4.14 <-> IC4.26 <-> IC5.3 <-> IC7.13 <-> IC9.17
|
||||
IC1.4 <-> IC10.16 <-> IC11.16 <-> IC2.4 <-> IC3.13 <-> IC4.15 <-> IC4.23 <-> IC5.4 <-> IC7.14 <-> IC9.16
|
||||
IC1.5 <-> IC10.15 <-> IC11.15 <-> IC2.5 <-> IC3.14 <-> IC4.17 <-> IC5.5 <-> IC7.15 <-> IC9.15
|
||||
IC1.6 <-> IC10.14 <-> IC11.14 <-> IC2.6 <-> IC3.15 <-> IC4.18 <-> IC5.6 <-> IC7.16 <-> IC9.14
|
||||
IC1.7 <-> IC10.13 <-> IC11.13 <-> IC2.7 <-> IC3.16 <-> IC4.19 <-> IC5.7 <-> IC7.17 <-> IC9.13
|
||||
IC1.8 <-> IC10.12 <-> IC11.12 <-> IC2.8 <-> IC3.17 <-> IC4.20 <-> IC5.8 <-> IC7.18 <-> IC9.12
|
||||
IC1.9 <-> IC10.11 <-> IC11.11 <-> IC2.9 <-> IC3.18 <-> IC4.21 <-> IC5.9 <-> IC7.11 <-> IC9.11
|
||||
IC11.19 <-> IC6.14
|
||||
IC3.19 <-> IC6.11
|
||||
IC4.24 <-> IC6.4 <-> IC6.5
|
||||
IC6.10 <-> IC7.19
|
||||
IC6.12 <-> IC9.19
|
||||
IC1.2 <-> IC10.13 <-> IC11.13 <-> IC2.2 <-> IC3.20 <-> IC4.13 <-> IC4.22 <-> IC5.2 <-> IC7.19 <-> IC9.13
|
||||
IC1.3 <-> IC10.14 <-> IC11.14 <-> IC2.3 <-> IC3.19 <-> IC4.14 <-> IC4.23 <-> IC5.3 <-> IC7.18 <-> IC9.14
|
||||
IC1.4 <-> IC10.15 <-> IC11.15 <-> IC2.4 <-> IC3.18 <-> IC4.15 <-> IC4.26 <-> IC5.4 <-> IC7.17 <-> IC9.15
|
||||
IC1.5 <-> IC10.16 <-> IC11.16 <-> IC2.5 <-> IC3.17 <-> IC4.32 <-> IC5.5 <-> IC7.16 <-> IC9.16
|
||||
IC1.6 <-> IC10.17 <-> IC11.17 <-> IC2.6 <-> IC3.16 <-> IC4.31 <-> IC5.6 <-> IC7.15 <-> IC9.17
|
||||
IC1.7 <-> IC10.18 <-> IC11.18 <-> IC2.7 <-> IC3.15 <-> IC4.30 <-> IC5.7 <-> IC7.14 <-> IC9.18
|
||||
IC1.8 <-> IC10.19 <-> IC11.19 <-> IC2.8 <-> IC3.14 <-> IC4.29 <-> IC5.8 <-> IC7.13 <-> IC9.19
|
||||
IC1.9 <-> IC10.20 <-> IC11.20 <-> IC2.9 <-> IC3.13 <-> IC4.28 <-> IC5.9 <-> IC7.20 <-> IC9.20
|
||||
IC11.12 <-> IC6.11
|
||||
IC3.12 <-> IC6.14
|
||||
IC4.25 <-> IC6.4 <-> IC6.5
|
||||
IC6.13 <-> IC9.12
|
||||
IC6.15 <-> IC7.12
|
||||
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
C1.1 <-> C2.1 <-> C3.1 <-> IC1.10 <-> IC2.10 <-> IC5.10
|
||||
C1.2 <-> C10.2 <-> C2.2 <-> C3.2 <-> C4.1 <-> C5.1 <-> C6.1 <-> C7.1 <-> C8.1 <-> C9.2 <-> IC1.20 <-> IC10.19 <-> IC10.20 <-> IC11.20 <-> IC2.20 <-> IC3.20 <-> IC4.32 <-> IC5.20 <-> IC6.13 <-> IC6.16 <-> IC6.6 <-> IC7.20 <-> IC9.20
|
||||
C10.1 <-> C4.2 <-> C5.2 <-> C6.2 <-> C7.2 <-> C8.2 <-> C9.1 <-> IC10.1 <-> IC10.10 <-> IC11.1 <-> IC11.10 <-> IC3.1 <-> IC3.10 <-> IC4.16 <-> IC4.22 <-> IC6.8 <-> IC7.1 <-> IC7.10 <-> IC9.1 <-> IC9.10
|
||||
C1.2 <-> C10.2 <-> C2.2 <-> C3.2 <-> C4.1 <-> C5.1 <-> C6.1 <-> C7.1 <-> C8.1 <-> C9.2 <-> IC1.11 <-> IC10.11 <-> IC10.12 <-> IC11.11 <-> IC2.11 <-> IC3.11 <-> IC4.17 <-> IC5.11 <-> IC6.12 <-> IC6.6 <-> IC6.9 <-> IC7.11 <-> IC9.11
|
||||
C10.1 <-> C4.2 <-> C5.2 <-> C6.2 <-> C7.2 <-> C8.2 <-> C9.1 <-> IC10.1 <-> IC10.10 <-> IC11.1 <-> IC11.10 <-> IC3.1 <-> IC3.10 <-> IC4.16 <-> IC4.27 <-> IC6.8 <-> IC7.1 <-> IC7.10 <-> IC9.1 <-> IC9.10
|
||||
IC1.1 <-> IC2.1 <-> IC5.1
|
||||
IC1.2 <-> IC10.18 <-> IC11.18 <-> IC2.2 <-> IC3.11 <-> IC4.13 <-> IC4.27 <-> IC5.2 <-> IC7.12 <-> IC9.18
|
||||
IC1.3 <-> IC10.17 <-> IC11.17 <-> IC2.3 <-> IC3.12 <-> IC4.14 <-> IC4.26 <-> IC5.3 <-> IC7.13 <-> IC9.17
|
||||
IC1.4 <-> IC10.16 <-> IC11.16 <-> IC2.4 <-> IC3.13 <-> IC4.15 <-> IC4.23 <-> IC5.4 <-> IC7.14 <-> IC9.16
|
||||
IC1.5 <-> IC10.15 <-> IC11.15 <-> IC2.5 <-> IC3.14 <-> IC4.17 <-> IC5.5 <-> IC7.15 <-> IC9.15
|
||||
IC1.6 <-> IC10.14 <-> IC11.14 <-> IC2.6 <-> IC3.15 <-> IC4.18 <-> IC5.6 <-> IC7.16 <-> IC9.14
|
||||
IC1.7 <-> IC10.13 <-> IC11.13 <-> IC2.7 <-> IC3.16 <-> IC4.19 <-> IC5.7 <-> IC7.17 <-> IC9.13
|
||||
IC1.8 <-> IC10.12 <-> IC11.12 <-> IC2.8 <-> IC3.17 <-> IC4.20 <-> IC5.8 <-> IC7.18 <-> IC9.12
|
||||
IC1.9 <-> IC10.11 <-> IC11.11 <-> IC2.9 <-> IC3.18 <-> IC4.21 <-> IC5.9 <-> IC7.11 <-> IC9.11
|
||||
IC11.19 <-> IC6.14
|
||||
IC3.19 <-> IC6.11
|
||||
IC4.24 <-> IC6.4 <-> IC6.5
|
||||
IC6.10 <-> IC7.19
|
||||
IC6.12 <-> IC9.19
|
||||
IC1.2 <-> IC10.13 <-> IC11.13 <-> IC2.2 <-> IC3.20 <-> IC4.13 <-> IC4.22 <-> IC5.2 <-> IC7.19 <-> IC9.13
|
||||
IC1.3 <-> IC10.14 <-> IC11.14 <-> IC2.3 <-> IC3.19 <-> IC4.14 <-> IC4.23 <-> IC5.3 <-> IC7.18 <-> IC9.14
|
||||
IC1.4 <-> IC10.15 <-> IC11.15 <-> IC2.4 <-> IC3.18 <-> IC4.15 <-> IC4.26 <-> IC5.4 <-> IC7.17 <-> IC9.15
|
||||
IC1.5 <-> IC10.16 <-> IC11.16 <-> IC2.5 <-> IC3.17 <-> IC4.32 <-> IC5.5 <-> IC7.16 <-> IC9.16
|
||||
IC1.6 <-> IC10.17 <-> IC11.17 <-> IC2.6 <-> IC3.16 <-> IC4.31 <-> IC5.6 <-> IC7.15 <-> IC9.17
|
||||
IC1.7 <-> IC10.18 <-> IC11.18 <-> IC2.7 <-> IC3.15 <-> IC4.30 <-> IC5.7 <-> IC7.14 <-> IC9.18
|
||||
IC1.8 <-> IC10.19 <-> IC11.19 <-> IC2.8 <-> IC3.14 <-> IC4.29 <-> IC5.8 <-> IC7.13 <-> IC9.19
|
||||
IC1.9 <-> IC10.20 <-> IC11.20 <-> IC2.9 <-> IC3.13 <-> IC4.28 <-> IC5.9 <-> IC7.20 <-> IC9.20
|
||||
IC11.12 <-> IC6.11
|
||||
IC3.12 <-> IC6.14
|
||||
IC4.25 <-> IC6.4 <-> IC6.5
|
||||
IC6.13 <-> IC9.12
|
||||
IC6.15 <-> IC7.12
|
||||
|
||||
|
||||
+12
-12
@@ -1,7 +1,7 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
C1.1 <-> C10.2 <-> C2.1 <-> C3.1 <-> C4.1 <-> C5.1 <-> C6.2 <-> C9.2 <-> IC1.1 <-> IC1.10 <-> IC10.19 <-> IC11.19 <-> IC2.1 <-> IC2.10 <-> IC3.1 <-> IC3.10 <-> IC4.8 <-> IC5.1 <-> IC5.10 <-> IC6.8 <-> IC8.1 <-> IC8.10 <-> IC9.10 <-> IC9.19
|
||||
C1.2 <-> C10.1 <-> C2.2 <-> C3.2 <-> C4.2 <-> C5.2 <-> C6.1 <-> C7.1 <-> C8.1 <-> C9.1 <-> IC1.20 <-> IC10.20 <-> IC11.20 <-> IC2.20 <-> IC3.20 <-> IC4.16 <-> IC5.20 <-> IC6.16 <-> IC8.20 <-> IC9.20
|
||||
C1.1 <-> C10.2 <-> C2.1 <-> C3.1 <-> C4.1 <-> C5.1 <-> C6.2 <-> C9.2 <-> IC1.1 <-> IC1.10 <-> IC10.12 <-> IC11.12 <-> IC2.1 <-> IC2.10 <-> IC3.1 <-> IC3.10 <-> IC4.8 <-> IC5.1 <-> IC5.10 <-> IC6.8 <-> IC8.1 <-> IC8.10 <-> IC9.10 <-> IC9.12
|
||||
C1.2 <-> C10.1 <-> C2.2 <-> C3.2 <-> C4.2 <-> C5.2 <-> C6.1 <-> C7.1 <-> C8.1 <-> C9.1 <-> IC1.11 <-> IC10.11 <-> IC11.11 <-> IC2.11 <-> IC3.11 <-> IC4.9 <-> IC5.11 <-> IC6.9 <-> IC8.11 <-> IC9.11
|
||||
C7.2 <-> C8.2 <-> IC10.10 <-> IC11.10
|
||||
IC1.2 <-> IC2.2 <-> IC3.2 <-> IC5.2 <-> IC6.3 <-> IC8.2
|
||||
IC1.3 <-> IC2.3 <-> IC3.3 <-> IC5.3 <-> IC6.2 <-> IC8.3
|
||||
@@ -11,16 +11,16 @@ Switch setup: [ ALL ]
|
||||
IC1.7 <-> IC2.7 <-> IC3.7 <-> IC4.2 <-> IC5.7 <-> IC8.7
|
||||
IC1.8 <-> IC2.8 <-> IC3.8 <-> IC4.6 <-> IC5.8 <-> IC8.8
|
||||
IC1.9 <-> IC2.9 <-> IC3.9 <-> IC4.7 <-> IC5.9 <-> IC8.9
|
||||
IC10.11 <-> IC11.11 <-> IC4.9 <-> IC9.11
|
||||
IC10.12 <-> IC11.12 <-> IC4.10 <-> IC9.12
|
||||
IC10.13 <-> IC11.13 <-> IC4.1 <-> IC9.13
|
||||
IC10.14 <-> IC11.14 <-> IC4.15 <-> IC9.14
|
||||
IC10.15 <-> IC11.15 <-> IC6.9 <-> IC9.15
|
||||
IC10.16 <-> IC11.16 <-> IC6.10 <-> IC9.16
|
||||
IC10.17 <-> IC11.17 <-> IC6.1 <-> IC9.17
|
||||
IC10.18 <-> IC11.18 <-> IC6.15 <-> IC9.18
|
||||
IC10.13 <-> IC11.13 <-> IC6.10 <-> IC9.13
|
||||
IC10.14 <-> IC11.14 <-> IC6.1 <-> IC9.14
|
||||
IC10.15 <-> IC11.15 <-> IC6.15 <-> IC9.15
|
||||
IC10.16 <-> IC11.16 <-> IC6.16 <-> IC9.16
|
||||
IC10.17 <-> IC11.17 <-> IC4.10 <-> IC9.17
|
||||
IC10.18 <-> IC11.18 <-> IC4.1 <-> IC9.18
|
||||
IC10.19 <-> IC11.19 <-> IC4.15 <-> IC9.19
|
||||
IC10.20 <-> IC11.20 <-> IC4.16 <-> IC9.20
|
||||
IC4.11 <-> IC6.11
|
||||
IC4.14 <-> IC6.14
|
||||
IC4.4 <-> IC6.13
|
||||
IC4.5 <-> IC6.12
|
||||
IC4.4 <-> IC6.12
|
||||
IC4.5 <-> IC6.13
|
||||
|
||||
|
||||
+12
-12
@@ -1,7 +1,7 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
C1.1 <-> C10.2 <-> C2.1 <-> C3.1 <-> C4.1 <-> C5.1 <-> C6.2 <-> C9.2 <-> IC1.1 <-> IC1.10 <-> IC10.19 <-> IC11.19 <-> IC2.1 <-> IC2.10 <-> IC3.1 <-> IC3.10 <-> IC4.8 <-> IC5.1 <-> IC5.10 <-> IC6.8 <-> IC8.1 <-> IC8.10 <-> IC9.10 <-> IC9.19
|
||||
C1.2 <-> C10.1 <-> C2.2 <-> C3.2 <-> C4.2 <-> C5.2 <-> C6.1 <-> C7.1 <-> C8.1 <-> C9.1 <-> IC1.20 <-> IC10.20 <-> IC11.20 <-> IC2.20 <-> IC3.20 <-> IC4.16 <-> IC5.20 <-> IC6.16 <-> IC8.20 <-> IC9.20
|
||||
C1.1 <-> C10.2 <-> C2.1 <-> C3.1 <-> C4.1 <-> C5.1 <-> C6.2 <-> C9.2 <-> IC1.1 <-> IC1.10 <-> IC10.12 <-> IC11.12 <-> IC2.1 <-> IC2.10 <-> IC3.1 <-> IC3.10 <-> IC4.8 <-> IC5.1 <-> IC5.10 <-> IC6.8 <-> IC8.1 <-> IC8.10 <-> IC9.10 <-> IC9.12
|
||||
C1.2 <-> C10.1 <-> C2.2 <-> C3.2 <-> C4.2 <-> C5.2 <-> C6.1 <-> C7.1 <-> C8.1 <-> C9.1 <-> IC1.11 <-> IC10.11 <-> IC11.11 <-> IC2.11 <-> IC3.11 <-> IC4.9 <-> IC5.11 <-> IC6.9 <-> IC8.11 <-> IC9.11
|
||||
C7.2 <-> C8.2 <-> IC10.10 <-> IC11.10
|
||||
IC1.2 <-> IC2.2 <-> IC3.2 <-> IC5.2 <-> IC6.3 <-> IC8.2
|
||||
IC1.3 <-> IC2.3 <-> IC3.3 <-> IC5.3 <-> IC6.2 <-> IC8.3
|
||||
@@ -11,16 +11,16 @@ Switch setup: [ ALL ]
|
||||
IC1.7 <-> IC2.7 <-> IC3.7 <-> IC4.2 <-> IC5.7 <-> IC8.7
|
||||
IC1.8 <-> IC2.8 <-> IC3.8 <-> IC4.6 <-> IC5.8 <-> IC8.8
|
||||
IC1.9 <-> IC2.9 <-> IC3.9 <-> IC4.7 <-> IC5.9 <-> IC8.9
|
||||
IC10.11 <-> IC11.11 <-> IC4.9 <-> IC9.11
|
||||
IC10.12 <-> IC11.12 <-> IC4.10 <-> IC9.12
|
||||
IC10.13 <-> IC11.13 <-> IC4.1 <-> IC9.13
|
||||
IC10.14 <-> IC11.14 <-> IC4.15 <-> IC9.14
|
||||
IC10.15 <-> IC11.15 <-> IC6.9 <-> IC9.15
|
||||
IC10.16 <-> IC11.16 <-> IC6.10 <-> IC9.16
|
||||
IC10.17 <-> IC11.17 <-> IC6.1 <-> IC9.17
|
||||
IC10.18 <-> IC11.18 <-> IC6.15 <-> IC9.18
|
||||
IC10.13 <-> IC11.13 <-> IC6.10 <-> IC9.13
|
||||
IC10.14 <-> IC11.14 <-> IC6.1 <-> IC9.14
|
||||
IC10.15 <-> IC11.15 <-> IC6.15 <-> IC9.15
|
||||
IC10.16 <-> IC11.16 <-> IC6.16 <-> IC9.16
|
||||
IC10.17 <-> IC11.17 <-> IC4.10 <-> IC9.17
|
||||
IC10.18 <-> IC11.18 <-> IC4.1 <-> IC9.18
|
||||
IC10.19 <-> IC11.19 <-> IC4.15 <-> IC9.19
|
||||
IC10.20 <-> IC11.20 <-> IC4.16 <-> IC9.20
|
||||
IC4.11 <-> IC6.11
|
||||
IC4.14 <-> IC6.14
|
||||
IC4.4 <-> IC6.13
|
||||
IC4.5 <-> IC6.12
|
||||
IC4.4 <-> IC6.12
|
||||
IC4.5 <-> IC6.13
|
||||
|
||||
|
||||
+8
-8
@@ -1,20 +1,20 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
C1.1 <-> C2.1 <-> C3.1 <-> C4.1 <-> C5.2 <-> C6.2 <-> C7.2 <-> C8.2 <-> IC1.10 <-> IC1.11 <-> IC1.15 <-> IC1.16 <-> IC1.9 <-> IC2.1 <-> IC2.10 <-> IC2.11 <-> IC2.15 <-> IC2.16 <-> IC2.9 <-> IC3.10 <-> IC3.11 <-> IC3.15 <-> IC3.16 <-> IC3.9 <-> IC4.10 <-> IC4.11 <-> IC4.15 <-> IC4.16 <-> IC4.9 <-> IC5.20 <-> IC6.20 <-> IC7.20 <-> IC8.20
|
||||
C1.1 <-> C2.1 <-> C3.1 <-> C4.1 <-> C5.2 <-> C6.2 <-> C7.2 <-> C8.2 <-> IC1.10 <-> IC1.14 <-> IC1.15 <-> IC1.16 <-> IC1.9 <-> IC2.1 <-> IC2.10 <-> IC2.14 <-> IC2.15 <-> IC2.16 <-> IC2.9 <-> IC3.10 <-> IC3.14 <-> IC3.15 <-> IC3.16 <-> IC3.9 <-> IC4.10 <-> IC4.14 <-> IC4.15 <-> IC4.16 <-> IC4.9 <-> IC5.11 <-> IC6.11 <-> IC7.11 <-> IC8.11
|
||||
C1.2 <-> C2.2 <-> C3.2 <-> C4.2 <-> C5.1 <-> C6.1 <-> C7.1 <-> C8.1 <-> IC1.1 <-> IC1.8 <-> IC2.8 <-> IC3.1 <-> IC3.8 <-> IC4.1 <-> IC4.8 <-> IC5.1 <-> IC5.10 <-> IC6.1 <-> IC6.10 <-> IC7.1 <-> IC7.10 <-> IC8.1 <-> IC8.10
|
||||
IC1.12 <-> IC3.5
|
||||
IC1.13 <-> IC3.4
|
||||
IC1.14 <-> IC2.14 <-> IC3.14 <-> IC4.14
|
||||
IC1.11 <-> IC2.11 <-> IC3.11 <-> IC4.11
|
||||
IC1.12 <-> IC3.4
|
||||
IC1.13 <-> IC3.5
|
||||
IC1.2 <-> IC5.3 <-> IC8.3
|
||||
IC1.3 <-> IC5.2 <-> IC8.2
|
||||
IC1.4 <-> IC2.13
|
||||
IC1.5 <-> IC2.12
|
||||
IC1.4 <-> IC2.12
|
||||
IC1.5 <-> IC2.13
|
||||
IC1.6 <-> IC5.4 <-> IC8.4
|
||||
IC1.7 <-> IC5.5 <-> IC8.5
|
||||
IC2.2 <-> IC6.7 <-> IC7.7
|
||||
IC2.3 <-> IC6.6 <-> IC7.6
|
||||
IC2.4 <-> IC4.13
|
||||
IC2.5 <-> IC4.12
|
||||
IC2.4 <-> IC4.12
|
||||
IC2.5 <-> IC4.13
|
||||
IC2.6 <-> IC6.8 <-> IC7.8
|
||||
IC2.7 <-> IC6.9 <-> IC7.9
|
||||
IC3.2 <-> IC5.7 <-> IC8.7
|
||||
|
||||
+8
-8
@@ -1,20 +1,20 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
C1.1 <-> C2.1 <-> C3.1 <-> C4.1 <-> C5.2 <-> C6.2 <-> C7.2 <-> C8.2 <-> IC1.10 <-> IC1.11 <-> IC1.15 <-> IC1.16 <-> IC1.9 <-> IC2.1 <-> IC2.10 <-> IC2.11 <-> IC2.15 <-> IC2.16 <-> IC2.9 <-> IC3.10 <-> IC3.11 <-> IC3.15 <-> IC3.16 <-> IC3.9 <-> IC4.10 <-> IC4.11 <-> IC4.15 <-> IC4.16 <-> IC4.9 <-> IC5.20 <-> IC6.20 <-> IC7.20 <-> IC8.20
|
||||
C1.1 <-> C2.1 <-> C3.1 <-> C4.1 <-> C5.2 <-> C6.2 <-> C7.2 <-> C8.2 <-> IC1.10 <-> IC1.14 <-> IC1.15 <-> IC1.16 <-> IC1.9 <-> IC2.1 <-> IC2.10 <-> IC2.14 <-> IC2.15 <-> IC2.16 <-> IC2.9 <-> IC3.10 <-> IC3.14 <-> IC3.15 <-> IC3.16 <-> IC3.9 <-> IC4.10 <-> IC4.14 <-> IC4.15 <-> IC4.16 <-> IC4.9 <-> IC5.11 <-> IC6.11 <-> IC7.11 <-> IC8.11
|
||||
C1.2 <-> C2.2 <-> C3.2 <-> C4.2 <-> C5.1 <-> C6.1 <-> C7.1 <-> C8.1 <-> IC1.1 <-> IC1.8 <-> IC2.8 <-> IC3.1 <-> IC3.8 <-> IC4.1 <-> IC4.8 <-> IC5.1 <-> IC5.10 <-> IC6.1 <-> IC6.10 <-> IC7.1 <-> IC7.10 <-> IC8.1 <-> IC8.10
|
||||
IC1.12 <-> IC3.5
|
||||
IC1.13 <-> IC3.4
|
||||
IC1.14 <-> IC2.14 <-> IC3.14 <-> IC4.14
|
||||
IC1.11 <-> IC2.11 <-> IC3.11 <-> IC4.11
|
||||
IC1.12 <-> IC3.4
|
||||
IC1.13 <-> IC3.5
|
||||
IC1.2 <-> IC5.3 <-> IC8.3
|
||||
IC1.3 <-> IC5.2 <-> IC8.2
|
||||
IC1.4 <-> IC2.13
|
||||
IC1.5 <-> IC2.12
|
||||
IC1.4 <-> IC2.12
|
||||
IC1.5 <-> IC2.13
|
||||
IC1.6 <-> IC5.4 <-> IC8.4
|
||||
IC1.7 <-> IC5.5 <-> IC8.5
|
||||
IC2.2 <-> IC6.7 <-> IC7.7
|
||||
IC2.3 <-> IC6.6 <-> IC7.6
|
||||
IC2.4 <-> IC4.13
|
||||
IC2.5 <-> IC4.12
|
||||
IC2.4 <-> IC4.12
|
||||
IC2.5 <-> IC4.13
|
||||
IC2.6 <-> IC6.8 <-> IC7.8
|
||||
IC2.7 <-> IC6.9 <-> IC7.9
|
||||
IC3.2 <-> IC5.7 <-> IC8.7
|
||||
|
||||
+30
-30
@@ -1,31 +1,31 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
BC548.1 <-> C1.1 <-> D1.K <-> IC1.13 <-> IC2.12
|
||||
BC548.1 <-> C2.2 <-> D2.K <-> IC1.11 <-> IC5.12
|
||||
BC548.1 <-> C3.1 <-> D4.K <-> IC1.1 <-> IC4.12
|
||||
BC548.1 <-> C4.1 <-> D3.K <-> IC1.3 <-> IC6.10
|
||||
BC548.1 <-> C1.1 <-> D1.K <-> IC1.9 <-> IC2.10
|
||||
BC548.1 <-> C2.2 <-> D2.K <-> IC1.11 <-> IC5.10
|
||||
BC548.1 <-> C3.1 <-> D4.K <-> IC1.1 <-> IC4.10
|
||||
BC548.1 <-> C4.1 <-> D3.K <-> IC1.3 <-> IC6.12
|
||||
BC548.2 <-> BC558.3 <-> R13.1
|
||||
BC548.2 <-> BC558.3 <-> R17.1
|
||||
BC548.2 <-> BC558.3 <-> R2.1
|
||||
BC548.2 <-> BC558.3 <-> R36.1
|
||||
BC548.3 <-> BC548.3 <-> BC548.3 <-> BC548.3 <-> C1.2 <-> C2.1 <-> C3.2 <-> C4.2 <-> IC1.5 <-> IC1.7 <-> IC1.9 <-> IC2.5 <-> IC5.5 <-> R11.2 <-> R14.2 <-> R18.1 <-> R22.2 <-> R23.2 <-> R24.2 <-> R26.2 <-> R27.2 <-> R28.2 <-> R3.2 <-> R30.2 <-> R37.2 <-> R39.2 <-> R40.2 <-> R5.1 <-> R8.2 <-> R9.2 <-> VR13.2 <-> VR2.2 <-> VR7.2 <-> VR8.2
|
||||
BC548.3 <-> BC548.3 <-> BC548.3 <-> BC548.3 <-> C1.2 <-> C2.1 <-> C3.2 <-> C4.2 <-> IC1.13 <-> IC1.5 <-> IC1.7 <-> IC2.5 <-> IC5.5 <-> R11.2 <-> R14.2 <-> R18.1 <-> R22.2 <-> R23.2 <-> R24.2 <-> R26.2 <-> R27.2 <-> R28.2 <-> R3.2 <-> R30.2 <-> R37.2 <-> R39.2 <-> R40.2 <-> R5.1 <-> R8.2 <-> R9.2 <-> VR13.2 <-> VR2.2 <-> VR7.2 <-> VR8.2
|
||||
BC558.1 <-> BC558.1 <-> IC2.11 <-> IC3.11 <-> IC4.11 <-> IC5.11 <-> IC6.11 <-> IC7.11 <-> R21.2 <-> R7.2
|
||||
BC558.2 <-> NTC.2 <-> NTC.2 <-> NTC.2 <-> NTC.2 <-> R1.1
|
||||
BC558.2 <-> NTC.2 <-> NTC.2 <-> NTC.2 <-> NTC.2 <-> R12.1
|
||||
BC558.2 <-> NTC.2 <-> NTC.2 <-> NTC.2 <-> NTC.2 <-> R16.1
|
||||
BC558.2 <-> R31.2 <-> R32.2 <-> R33.2 <-> R34.2 <-> R35.1
|
||||
C10.1 <-> IC6.12 <-> IC6.3 <-> R37.1
|
||||
C10.2 <-> IC6.8 <-> IC6.9
|
||||
C5.1 <-> IC2.13 <-> IC2.14
|
||||
C5.2 <-> IC2.10 <-> IC2.3 <-> R3.1
|
||||
C10.1 <-> IC6.10 <-> IC6.3 <-> R37.1
|
||||
C10.2 <-> IC6.13 <-> IC6.14
|
||||
C5.1 <-> IC2.8 <-> IC2.9
|
||||
C5.2 <-> IC2.12 <-> IC2.3 <-> R3.1
|
||||
C6.1 <-> D5.K <-> D6.K <-> R7.1
|
||||
C6.2 <-> R8.1 <-> Square/Triangle 1.3
|
||||
C7.1 <-> IC5.13 <-> IC5.14
|
||||
C7.2 <-> IC5.10 <-> IC5.3 <-> R24.1
|
||||
C7.1 <-> IC5.8 <-> IC5.9
|
||||
C7.2 <-> IC5.12 <-> IC5.3 <-> R24.1
|
||||
C8.1 <-> D12.K <-> D7.K <-> R21.1
|
||||
C8.2 <-> R22.1 <-> Square/Triangle 2.3
|
||||
C9.1 <-> IC4.10 <-> IC4.5 <-> R14.1
|
||||
C9.2 <-> IC4.13 <-> IC4.14
|
||||
C9.1 <-> IC4.12 <-> IC4.5 <-> R14.1
|
||||
C9.2 <-> IC4.8 <-> IC4.9
|
||||
Coarse 1.2 <-> NTC.1
|
||||
Coarse 2.2 <-> NTC.1
|
||||
Coarse 3.2 <-> NTC.1
|
||||
@@ -34,13 +34,13 @@ Switch setup: [ ALL ]
|
||||
CV In 2.Tip <-> NTC.1
|
||||
CV In 3.Tip <-> NTC.1
|
||||
CV In 4.Tip <-> R33.1
|
||||
D1.A <-> IC1.12
|
||||
D12.A <-> IC5.8 <-> R19.2 <-> R20.1
|
||||
D2.A <-> IC1.10
|
||||
D1.A <-> IC1.10
|
||||
D12.A <-> IC5.14 <-> R19.2 <-> R20.1
|
||||
D2.A <-> IC1.12
|
||||
D3.A <-> IC1.4
|
||||
D4.A <-> IC1.2
|
||||
D5.A <-> IC2.7 <-> Slope Shift 1.3
|
||||
D6.A <-> IC2.8 <-> R4.2 <-> R6.1
|
||||
D6.A <-> IC2.14 <-> R4.2 <-> R6.1
|
||||
D7.A <-> IC5.7 <-> Slope Shift 2.3
|
||||
Fine 1.2 <-> NTC.1
|
||||
Fine 2.2 <-> NTC.1
|
||||
@@ -50,38 +50,38 @@ Switch setup: [ ALL ]
|
||||
FM In 2.Tip <-> VR4.2
|
||||
FM In 3.Tip <-> VR6.2
|
||||
FM In 4.Tip <-> VR10.2
|
||||
IC1.14 <-> IC2.4 <-> IC3.4 <-> IC4.4 <-> IC5.4 <-> IC6.4 <-> IC7.4 <-> R13.2 <-> R17.2 <-> R2.2 <-> R36.2 <-> R42.2
|
||||
IC1.8 <-> IC2.4 <-> IC3.4 <-> IC4.4 <-> IC5.4 <-> IC6.4 <-> IC7.4 <-> R13.2 <-> R17.2 <-> R2.2 <-> R36.2 <-> R42.2
|
||||
IC2.1 <-> R10.1
|
||||
IC2.13 <-> R4.1 <-> R5.2
|
||||
IC2.2 <-> Pulsewidth 1.2 <-> R9.1 <-> VR3.1
|
||||
IC2.6 <-> R6.2 <-> Slope Shift 1.2
|
||||
IC2.9 <-> R4.1 <-> R5.2
|
||||
IC3.1 <-> IC3.2 <-> Square/Triangle 2.1
|
||||
IC3.10 <-> R10.2 <-> R11.1
|
||||
IC3.12 <-> Square/Triangle 1.2
|
||||
IC3.13 <-> IC3.14 <-> Output 1.Tip
|
||||
IC3.10 <-> Square/Triangle 1.2
|
||||
IC3.12 <-> R10.2 <-> R11.1
|
||||
IC3.13 <-> IC3.14 <-> Square/Triangle 1.1
|
||||
IC3.3 <-> R25.2 <-> R26.1
|
||||
IC3.5 <-> Square/Triangle 2.2
|
||||
IC3.6 <-> IC3.7 <-> Output 2.Tip
|
||||
IC3.8 <-> IC3.9 <-> Square/Triangle 1.1
|
||||
IC3.8 <-> IC3.9 <-> Output 1.Tip
|
||||
IC4.1 <-> IC4.2 <-> Square/Sawtooth 3.1
|
||||
IC4.13 <-> R15.1 <-> R27.1
|
||||
IC4.14 <-> R15.2 <-> Square/Sawtooth 3.3
|
||||
IC4.3 <-> R29.2 <-> R30.1
|
||||
IC4.6 <-> Pulsewidth 3.2 <-> R28.1 <-> VR9.1
|
||||
IC4.7 <-> R29.1
|
||||
IC4.8 <-> R15.2 <-> Square/Sawtooth 3.3
|
||||
IC4.9 <-> R15.1 <-> R27.1
|
||||
IC5.1 <-> R25.1
|
||||
IC5.13 <-> R18.2 <-> R19.1
|
||||
IC5.2 <-> Pulsewidth 2.2 <-> R23.1 <-> VR5.1
|
||||
IC5.6 <-> R20.2 <-> Slope Shift 2.2
|
||||
IC5.9 <-> R18.2 <-> R19.1
|
||||
IC6.1 <-> R41.1
|
||||
IC6.13 <-> R38.1 <-> R39.1
|
||||
IC6.14 <-> R38.2 <-> Square/Sawtooth 4.3
|
||||
IC6.2 <-> Pulsewidth 4.2 <-> R40.1 <-> VR16.3
|
||||
IC6.5 <-> IC7.10 <-> R41.2 <-> R42.1 <-> Square/Sawtooth 4.2
|
||||
IC6.5 <-> IC7.12 <-> R41.2 <-> R42.1 <-> Square/Sawtooth 4.2
|
||||
IC6.6 <-> IC6.7 <-> Square/Sawtooth 4.1
|
||||
IC6.8 <-> R38.2 <-> Square/Sawtooth 4.3
|
||||
IC6.9 <-> R38.1 <-> R39.1
|
||||
IC7.13 <-> IC7.14 <-> Output 4.Tip
|
||||
IC7.5 <-> Square/Sawtooth 3.2
|
||||
IC7.6 <-> IC7.7 <-> Output 3.Tip
|
||||
IC7.8 <-> IC7.9 <-> Output 4.Tip
|
||||
NTC.1 <-> VR1.1
|
||||
NTC.1 <-> VR4.1
|
||||
PWM In 1.Tip <-> VR3.2
|
||||
|
||||
+30
-30
@@ -1,31 +1,31 @@
|
||||
Switch setup: [ ALL ]
|
||||
|
||||
BC548.1 <-> C1.1 <-> D1.K <-> IC1.13 <-> IC2.12
|
||||
BC548.1 <-> C2.2 <-> D2.K <-> IC1.11 <-> IC5.12
|
||||
BC548.1 <-> C3.1 <-> D4.K <-> IC1.1 <-> IC4.12
|
||||
BC548.1 <-> C4.1 <-> D3.K <-> IC1.3 <-> IC6.10
|
||||
BC548.1 <-> C1.1 <-> D1.K <-> IC1.9 <-> IC2.10
|
||||
BC548.1 <-> C2.2 <-> D2.K <-> IC1.11 <-> IC5.10
|
||||
BC548.1 <-> C3.1 <-> D4.K <-> IC1.1 <-> IC4.10
|
||||
BC548.1 <-> C4.1 <-> D3.K <-> IC1.3 <-> IC6.12
|
||||
BC548.2 <-> BC558.3 <-> R13.1
|
||||
BC548.2 <-> BC558.3 <-> R17.1
|
||||
BC548.2 <-> BC558.3 <-> R2.1
|
||||
BC548.2 <-> BC558.3 <-> R36.1
|
||||
BC548.3 <-> BC548.3 <-> BC548.3 <-> BC548.3 <-> C1.2 <-> C2.1 <-> C3.2 <-> C4.2 <-> IC1.5 <-> IC1.7 <-> IC1.9 <-> IC2.5 <-> IC5.5 <-> R11.2 <-> R14.2 <-> R18.1 <-> R22.2 <-> R23.2 <-> R24.2 <-> R26.2 <-> R27.2 <-> R28.2 <-> R3.2 <-> R30.2 <-> R37.2 <-> R39.2 <-> R40.2 <-> R5.1 <-> R8.2 <-> R9.2 <-> VR13.2 <-> VR2.2 <-> VR7.2 <-> VR8.2
|
||||
BC548.3 <-> BC548.3 <-> BC548.3 <-> BC548.3 <-> C1.2 <-> C2.1 <-> C3.2 <-> C4.2 <-> IC1.13 <-> IC1.5 <-> IC1.7 <-> IC2.5 <-> IC5.5 <-> R11.2 <-> R14.2 <-> R18.1 <-> R22.2 <-> R23.2 <-> R24.2 <-> R26.2 <-> R27.2 <-> R28.2 <-> R3.2 <-> R30.2 <-> R37.2 <-> R39.2 <-> R40.2 <-> R5.1 <-> R8.2 <-> R9.2 <-> VR13.2 <-> VR2.2 <-> VR7.2 <-> VR8.2
|
||||
BC558.1 <-> BC558.1 <-> IC2.11 <-> IC3.11 <-> IC4.11 <-> IC5.11 <-> IC6.11 <-> IC7.11 <-> R21.2 <-> R7.2
|
||||
BC558.2 <-> NTC.2 <-> NTC.2 <-> NTC.2 <-> NTC.2 <-> R1.1
|
||||
BC558.2 <-> NTC.2 <-> NTC.2 <-> NTC.2 <-> NTC.2 <-> R12.1
|
||||
BC558.2 <-> NTC.2 <-> NTC.2 <-> NTC.2 <-> NTC.2 <-> R16.1
|
||||
BC558.2 <-> R31.2 <-> R32.2 <-> R33.2 <-> R34.2 <-> R35.1
|
||||
C10.1 <-> IC6.12 <-> IC6.3 <-> R37.1
|
||||
C10.2 <-> IC6.8 <-> IC6.9
|
||||
C5.1 <-> IC2.13 <-> IC2.14
|
||||
C5.2 <-> IC2.10 <-> IC2.3 <-> R3.1
|
||||
C10.1 <-> IC6.10 <-> IC6.3 <-> R37.1
|
||||
C10.2 <-> IC6.13 <-> IC6.14
|
||||
C5.1 <-> IC2.8 <-> IC2.9
|
||||
C5.2 <-> IC2.12 <-> IC2.3 <-> R3.1
|
||||
C6.1 <-> D5.K <-> D6.K <-> R7.1
|
||||
C6.2 <-> R8.1 <-> Square/Triangle 1.3
|
||||
C7.1 <-> IC5.13 <-> IC5.14
|
||||
C7.2 <-> IC5.10 <-> IC5.3 <-> R24.1
|
||||
C7.1 <-> IC5.8 <-> IC5.9
|
||||
C7.2 <-> IC5.12 <-> IC5.3 <-> R24.1
|
||||
C8.1 <-> D12.K <-> D7.K <-> R21.1
|
||||
C8.2 <-> R22.1 <-> Square/Triangle 2.3
|
||||
C9.1 <-> IC4.10 <-> IC4.5 <-> R14.1
|
||||
C9.2 <-> IC4.13 <-> IC4.14
|
||||
C9.1 <-> IC4.12 <-> IC4.5 <-> R14.1
|
||||
C9.2 <-> IC4.8 <-> IC4.9
|
||||
Coarse 1.2 <-> NTC.1
|
||||
Coarse 2.2 <-> NTC.1
|
||||
Coarse 3.2 <-> NTC.1
|
||||
@@ -34,13 +34,13 @@ Switch setup: [ ALL ]
|
||||
CV In 2.Tip <-> NTC.1
|
||||
CV In 3.Tip <-> NTC.1
|
||||
CV In 4.Tip <-> R33.1
|
||||
D1.A <-> IC1.12
|
||||
D12.A <-> IC5.8 <-> R19.2 <-> R20.1
|
||||
D2.A <-> IC1.10
|
||||
D1.A <-> IC1.10
|
||||
D12.A <-> IC5.14 <-> R19.2 <-> R20.1
|
||||
D2.A <-> IC1.12
|
||||
D3.A <-> IC1.4
|
||||
D4.A <-> IC1.2
|
||||
D5.A <-> IC2.7 <-> Slope Shift 1.3
|
||||
D6.A <-> IC2.8 <-> R4.2 <-> R6.1
|
||||
D6.A <-> IC2.14 <-> R4.2 <-> R6.1
|
||||
D7.A <-> IC5.7 <-> Slope Shift 2.3
|
||||
Fine 1.2 <-> NTC.1
|
||||
Fine 2.2 <-> NTC.1
|
||||
@@ -50,38 +50,38 @@ Switch setup: [ ALL ]
|
||||
FM In 2.Tip <-> VR4.2
|
||||
FM In 3.Tip <-> VR6.2
|
||||
FM In 4.Tip <-> VR10.2
|
||||
IC1.14 <-> IC2.4 <-> IC3.4 <-> IC4.4 <-> IC5.4 <-> IC6.4 <-> IC7.4 <-> R13.2 <-> R17.2 <-> R2.2 <-> R36.2 <-> R42.2
|
||||
IC1.8 <-> IC2.4 <-> IC3.4 <-> IC4.4 <-> IC5.4 <-> IC6.4 <-> IC7.4 <-> R13.2 <-> R17.2 <-> R2.2 <-> R36.2 <-> R42.2
|
||||
IC2.1 <-> R10.1
|
||||
IC2.13 <-> R4.1 <-> R5.2
|
||||
IC2.2 <-> Pulsewidth 1.2 <-> R9.1 <-> VR3.1
|
||||
IC2.6 <-> R6.2 <-> Slope Shift 1.2
|
||||
IC2.9 <-> R4.1 <-> R5.2
|
||||
IC3.1 <-> IC3.2 <-> Square/Triangle 2.1
|
||||
IC3.10 <-> R10.2 <-> R11.1
|
||||
IC3.12 <-> Square/Triangle 1.2
|
||||
IC3.13 <-> IC3.14 <-> Output 1.Tip
|
||||
IC3.10 <-> Square/Triangle 1.2
|
||||
IC3.12 <-> R10.2 <-> R11.1
|
||||
IC3.13 <-> IC3.14 <-> Square/Triangle 1.1
|
||||
IC3.3 <-> R25.2 <-> R26.1
|
||||
IC3.5 <-> Square/Triangle 2.2
|
||||
IC3.6 <-> IC3.7 <-> Output 2.Tip
|
||||
IC3.8 <-> IC3.9 <-> Square/Triangle 1.1
|
||||
IC3.8 <-> IC3.9 <-> Output 1.Tip
|
||||
IC4.1 <-> IC4.2 <-> Square/Sawtooth 3.1
|
||||
IC4.13 <-> R15.1 <-> R27.1
|
||||
IC4.14 <-> R15.2 <-> Square/Sawtooth 3.3
|
||||
IC4.3 <-> R29.2 <-> R30.1
|
||||
IC4.6 <-> Pulsewidth 3.2 <-> R28.1 <-> VR9.1
|
||||
IC4.7 <-> R29.1
|
||||
IC4.8 <-> R15.2 <-> Square/Sawtooth 3.3
|
||||
IC4.9 <-> R15.1 <-> R27.1
|
||||
IC5.1 <-> R25.1
|
||||
IC5.13 <-> R18.2 <-> R19.1
|
||||
IC5.2 <-> Pulsewidth 2.2 <-> R23.1 <-> VR5.1
|
||||
IC5.6 <-> R20.2 <-> Slope Shift 2.2
|
||||
IC5.9 <-> R18.2 <-> R19.1
|
||||
IC6.1 <-> R41.1
|
||||
IC6.13 <-> R38.1 <-> R39.1
|
||||
IC6.14 <-> R38.2 <-> Square/Sawtooth 4.3
|
||||
IC6.2 <-> Pulsewidth 4.2 <-> R40.1 <-> VR16.3
|
||||
IC6.5 <-> IC7.10 <-> R41.2 <-> R42.1 <-> Square/Sawtooth 4.2
|
||||
IC6.5 <-> IC7.12 <-> R41.2 <-> R42.1 <-> Square/Sawtooth 4.2
|
||||
IC6.6 <-> IC6.7 <-> Square/Sawtooth 4.1
|
||||
IC6.8 <-> R38.2 <-> Square/Sawtooth 4.3
|
||||
IC6.9 <-> R38.1 <-> R39.1
|
||||
IC7.13 <-> IC7.14 <-> Output 4.Tip
|
||||
IC7.5 <-> Square/Sawtooth 3.2
|
||||
IC7.6 <-> IC7.7 <-> Output 3.Tip
|
||||
IC7.8 <-> IC7.9 <-> Output 4.Tip
|
||||
NTC.1 <-> VR1.1
|
||||
NTC.1 <-> VR4.1
|
||||
PWM In 1.Tip <-> VR3.2
|
||||
|
||||
@@ -4,17 +4,17 @@ Switch setup: [ ALL ]
|
||||
1k.2 <-> 3PDT.5
|
||||
3PDT.1 <-> C1.1
|
||||
3PDT.3 <-> 3PDT.9
|
||||
3PDT.4 <-> IC1.8 <-> IC2.8 <-> R2.1
|
||||
3PDT.4 <-> IC1.5 <-> IC2.5 <-> R2.1
|
||||
3PDT.7 <-> Volume.2
|
||||
Blend.1 <-> C3.+ <-> C6.1
|
||||
Blend.2 <-> C5.2
|
||||
Blend.3 <-> C8.+
|
||||
C1.2 <-> IC1.3 <-> IC2.3 <-> R1.1
|
||||
C2.+ <-> IC2.4 <-> LED.K <-> R3.1 <-> R4.2 <-> Volume.1
|
||||
C2.- <-> C3.- <-> C5.1 <-> IC1.1 <-> IC1.2 <-> IC1.5 <-> R1.2 <-> R2.2 <-> R3.2 <-> R5.1 <-> R5.2 <-> R6.2
|
||||
C2.- <-> C3.- <-> C5.1 <-> IC1.1 <-> IC1.2 <-> IC1.8 <-> R1.2 <-> R2.2 <-> R3.2 <-> R5.1 <-> R5.2 <-> R6.2
|
||||
C4.+ <-> R4.1
|
||||
C4.- <-> IC2.1 <-> IC2.2
|
||||
C6.2 <-> IC2.5 <-> R6.1
|
||||
C6.2 <-> IC2.8 <-> R6.1
|
||||
C7.+ <-> Volume.3
|
||||
C7.- <-> IC1.6 <-> IC1.7
|
||||
C8.- <-> IC2.6 <-> IC2.7
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
Switch setup: [ 3PDT.ON1 ]
|
||||
|
||||
1k.1 <-> LED.A
|
||||
1k.2 <-> IC1.8 <-> IC2.8 <-> R2.1
|
||||
1k.2 <-> IC1.5 <-> IC2.5 <-> R2.1
|
||||
Blend.1 <-> C3.+ <-> C6.1
|
||||
Blend.2 <-> C5.2
|
||||
Blend.3 <-> C8.+
|
||||
C1.2 <-> IC1.3 <-> IC2.3 <-> R1.1
|
||||
C2.+ <-> IC2.4 <-> LED.K <-> R3.1 <-> R4.2 <-> Volume.1
|
||||
C2.- <-> C3.- <-> C5.1 <-> IC1.1 <-> IC1.2 <-> IC1.5 <-> R1.2 <-> R2.2 <-> R3.2 <-> R5.1 <-> R5.2 <-> R6.2
|
||||
C2.- <-> C3.- <-> C5.1 <-> IC1.1 <-> IC1.2 <-> IC1.8 <-> R1.2 <-> R2.2 <-> R3.2 <-> R5.1 <-> R5.2 <-> R6.2
|
||||
C4.+ <-> R4.1
|
||||
C4.- <-> IC2.1 <-> IC2.2
|
||||
C6.2 <-> IC2.5 <-> R6.1
|
||||
C6.2 <-> IC2.8 <-> R6.1
|
||||
C7.+ <-> Volume.3
|
||||
C7.- <-> IC1.6 <-> IC1.7
|
||||
C8.- <-> IC2.6 <-> IC2.7
|
||||
@@ -23,12 +23,12 @@ Switch setup: [ 3PDT.ON2 ]
|
||||
Blend.3 <-> C8.+
|
||||
C1.2 <-> IC1.3 <-> IC2.3 <-> R1.1
|
||||
C2.+ <-> IC2.4 <-> LED.K <-> R3.1 <-> R4.2 <-> Volume.1
|
||||
C2.- <-> C3.- <-> C5.1 <-> IC1.1 <-> IC1.2 <-> IC1.5 <-> R1.2 <-> R2.2 <-> R3.2 <-> R5.1 <-> R5.2 <-> R6.2
|
||||
C2.- <-> C3.- <-> C5.1 <-> IC1.1 <-> IC1.2 <-> IC1.8 <-> R1.2 <-> R2.2 <-> R3.2 <-> R5.1 <-> R5.2 <-> R6.2
|
||||
C4.+ <-> R4.1
|
||||
C4.- <-> IC2.1 <-> IC2.2
|
||||
C6.2 <-> IC2.5 <-> R6.1
|
||||
C6.2 <-> IC2.8 <-> R6.1
|
||||
C7.+ <-> Volume.3
|
||||
C7.- <-> IC1.6 <-> IC1.7
|
||||
C8.- <-> IC2.6 <-> IC2.7
|
||||
IC1.8 <-> IC2.8 <-> R2.1
|
||||
IC1.5 <-> IC2.5 <-> R2.1
|
||||
|
||||
|
||||
@@ -7,28 +7,28 @@ Switch setup: [ ALL ]
|
||||
C11.2 <-> C14.- <-> C5.1 <-> C8.- <-> C9.- <-> D2.A <-> D3.K <-> IC1.4 <-> IC2.4 <-> IC3.4 <-> R15.2 <-> R19.2 <-> R2.2 <-> R21.2
|
||||
C12.2 <-> R11.1
|
||||
C13.1 <-> C14.+ <-> C15.- <-> IC1.3 <-> IC3.3 <-> R12.2 <-> R19.1 <-> R20.1 <-> R3.1
|
||||
C13.2 <-> D1.K <-> IC3.5 <-> R12.1
|
||||
C15.+ <-> IC1.7 <-> IC2.7 <-> IC3.8 <-> R13.2 <-> R20.2
|
||||
C13.2 <-> D1.K <-> IC3.8 <-> R12.1
|
||||
C15.+ <-> IC1.6 <-> IC2.6 <-> IC3.5 <-> R13.2 <-> R20.2
|
||||
C16.+ <-> IC3.1 <-> LEVEL.2
|
||||
C16.- <-> R21.1
|
||||
C2.1 <-> IC1.1
|
||||
C2.2 <-> IC1.8
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.6
|
||||
C2.2 <-> IC1.5
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.7
|
||||
C3.- <-> C4.1 <-> R2.1
|
||||
C4.2 <-> R3.2 <-> R4.2
|
||||
C5.2 <-> IC2.3 <-> R4.1
|
||||
C6.1 <-> IC2.2 <-> LDR.1 <-> R5.2 <-> R6.2 <-> spst1.1 <-> spst2.1
|
||||
C6.2 <-> IC2.6 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C6.2 <-> IC2.7 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C7.1 <-> IC2.1
|
||||
C7.2 <-> IC2.8
|
||||
C7.2 <-> IC2.5
|
||||
C8.+ <-> R5.1
|
||||
C9.+ <-> R6.1
|
||||
D4.A <-> R14.1
|
||||
D4.K <-> R13.1
|
||||
GAIN.1 <-> IC1.2 <-> R1.2
|
||||
IC3.2 <-> LEVEL.1 <-> R11.2
|
||||
IC3.6 <-> R15.1 <-> R18.2
|
||||
IC3.7 <-> R17.2
|
||||
IC3.6 <-> R17.2
|
||||
IC3.7 <-> R15.1 <-> R18.2
|
||||
Q1.1 <-> Q1.2 <-> R14.2 <-> R16.2 <-> R17.1 <-> R18.1
|
||||
Q1.3 <-> R16.1
|
||||
R10.1 <-> TONE.2
|
||||
|
||||
@@ -7,28 +7,28 @@ Switch setup: [ spst1.ON1:spst2.ON1 ]
|
||||
C11.2 <-> C14.- <-> C5.1 <-> C8.- <-> C9.- <-> D2.A <-> D3.K <-> IC1.4 <-> IC2.4 <-> IC3.4 <-> R15.2 <-> R19.2 <-> R2.2 <-> R21.2
|
||||
C12.2 <-> R11.1
|
||||
C13.1 <-> C14.+ <-> C15.- <-> IC1.3 <-> IC3.3 <-> R12.2 <-> R19.1 <-> R20.1 <-> R3.1
|
||||
C13.2 <-> D1.K <-> IC3.5 <-> R12.1
|
||||
C15.+ <-> IC1.7 <-> IC2.7 <-> IC3.8 <-> R13.2 <-> R20.2
|
||||
C13.2 <-> D1.K <-> IC3.8 <-> R12.1
|
||||
C15.+ <-> IC1.6 <-> IC2.6 <-> IC3.5 <-> R13.2 <-> R20.2
|
||||
C16.+ <-> IC3.1 <-> LEVEL.2
|
||||
C16.- <-> R21.1
|
||||
C2.1 <-> IC1.1
|
||||
C2.2 <-> IC1.8
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.6
|
||||
C2.2 <-> IC1.5
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.7
|
||||
C3.- <-> C4.1 <-> R2.1
|
||||
C4.2 <-> R3.2 <-> R4.2
|
||||
C5.2 <-> IC2.3 <-> R4.1
|
||||
C6.1 <-> IC2.2 <-> LDR.1 <-> R5.2 <-> R6.2 <-> R7.2 <-> R8.2
|
||||
C6.2 <-> IC2.6 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C6.2 <-> IC2.7 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C7.1 <-> IC2.1
|
||||
C7.2 <-> IC2.8
|
||||
C7.2 <-> IC2.5
|
||||
C8.+ <-> R5.1
|
||||
C9.+ <-> R6.1
|
||||
D4.A <-> R14.1
|
||||
D4.K <-> R13.1
|
||||
GAIN.1 <-> IC1.2 <-> R1.2
|
||||
IC3.2 <-> LEVEL.1 <-> R11.2
|
||||
IC3.6 <-> R15.1 <-> R18.2
|
||||
IC3.7 <-> R17.2
|
||||
IC3.6 <-> R17.2
|
||||
IC3.7 <-> R15.1 <-> R18.2
|
||||
Q1.1 <-> Q1.2 <-> R14.2 <-> R16.2 <-> R17.1 <-> R18.1
|
||||
Q1.3 <-> R16.1
|
||||
R10.1 <-> TONE.2
|
||||
@@ -42,28 +42,28 @@ Switch setup: [ spst1.ON1:spst2.ON2 ]
|
||||
C11.2 <-> C14.- <-> C5.1 <-> C8.- <-> C9.- <-> D2.A <-> D3.K <-> IC1.4 <-> IC2.4 <-> IC3.4 <-> R15.2 <-> R19.2 <-> R2.2 <-> R21.2
|
||||
C12.2 <-> R11.1
|
||||
C13.1 <-> C14.+ <-> C15.- <-> IC1.3 <-> IC3.3 <-> R12.2 <-> R19.1 <-> R20.1 <-> R3.1
|
||||
C13.2 <-> D1.K <-> IC3.5 <-> R12.1
|
||||
C15.+ <-> IC1.7 <-> IC2.7 <-> IC3.8 <-> R13.2 <-> R20.2
|
||||
C13.2 <-> D1.K <-> IC3.8 <-> R12.1
|
||||
C15.+ <-> IC1.6 <-> IC2.6 <-> IC3.5 <-> R13.2 <-> R20.2
|
||||
C16.+ <-> IC3.1 <-> LEVEL.2
|
||||
C16.- <-> R21.1
|
||||
C2.1 <-> IC1.1
|
||||
C2.2 <-> IC1.8
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.6
|
||||
C2.2 <-> IC1.5
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.7
|
||||
C3.- <-> C4.1 <-> R2.1
|
||||
C4.2 <-> R3.2 <-> R4.2
|
||||
C5.2 <-> IC2.3 <-> R4.1
|
||||
C6.1 <-> IC2.2 <-> LDR.1 <-> R5.2 <-> R6.2 <-> R7.2
|
||||
C6.2 <-> IC2.6 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C6.2 <-> IC2.7 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C7.1 <-> IC2.1
|
||||
C7.2 <-> IC2.8
|
||||
C7.2 <-> IC2.5
|
||||
C8.+ <-> R5.1
|
||||
C9.+ <-> R6.1
|
||||
D4.A <-> R14.1
|
||||
D4.K <-> R13.1
|
||||
GAIN.1 <-> IC1.2 <-> R1.2
|
||||
IC3.2 <-> LEVEL.1 <-> R11.2
|
||||
IC3.6 <-> R15.1 <-> R18.2
|
||||
IC3.7 <-> R17.2
|
||||
IC3.6 <-> R17.2
|
||||
IC3.7 <-> R15.1 <-> R18.2
|
||||
Q1.1 <-> Q1.2 <-> R14.2 <-> R16.2 <-> R17.1 <-> R18.1
|
||||
Q1.3 <-> R16.1
|
||||
R10.1 <-> TONE.2
|
||||
@@ -77,28 +77,28 @@ Switch setup: [ spst1.ON2:spst2.ON1 ]
|
||||
C11.2 <-> C14.- <-> C5.1 <-> C8.- <-> C9.- <-> D2.A <-> D3.K <-> IC1.4 <-> IC2.4 <-> IC3.4 <-> R15.2 <-> R19.2 <-> R2.2 <-> R21.2
|
||||
C12.2 <-> R11.1
|
||||
C13.1 <-> C14.+ <-> C15.- <-> IC1.3 <-> IC3.3 <-> R12.2 <-> R19.1 <-> R20.1 <-> R3.1
|
||||
C13.2 <-> D1.K <-> IC3.5 <-> R12.1
|
||||
C15.+ <-> IC1.7 <-> IC2.7 <-> IC3.8 <-> R13.2 <-> R20.2
|
||||
C13.2 <-> D1.K <-> IC3.8 <-> R12.1
|
||||
C15.+ <-> IC1.6 <-> IC2.6 <-> IC3.5 <-> R13.2 <-> R20.2
|
||||
C16.+ <-> IC3.1 <-> LEVEL.2
|
||||
C16.- <-> R21.1
|
||||
C2.1 <-> IC1.1
|
||||
C2.2 <-> IC1.8
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.6
|
||||
C2.2 <-> IC1.5
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.7
|
||||
C3.- <-> C4.1 <-> R2.1
|
||||
C4.2 <-> R3.2 <-> R4.2
|
||||
C5.2 <-> IC2.3 <-> R4.1
|
||||
C6.1 <-> IC2.2 <-> LDR.1 <-> R5.2 <-> R6.2 <-> R8.2
|
||||
C6.2 <-> IC2.6 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C6.2 <-> IC2.7 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C7.1 <-> IC2.1
|
||||
C7.2 <-> IC2.8
|
||||
C7.2 <-> IC2.5
|
||||
C8.+ <-> R5.1
|
||||
C9.+ <-> R6.1
|
||||
D4.A <-> R14.1
|
||||
D4.K <-> R13.1
|
||||
GAIN.1 <-> IC1.2 <-> R1.2
|
||||
IC3.2 <-> LEVEL.1 <-> R11.2
|
||||
IC3.6 <-> R15.1 <-> R18.2
|
||||
IC3.7 <-> R17.2
|
||||
IC3.6 <-> R17.2
|
||||
IC3.7 <-> R15.1 <-> R18.2
|
||||
Q1.1 <-> Q1.2 <-> R14.2 <-> R16.2 <-> R17.1 <-> R18.1
|
||||
Q1.3 <-> R16.1
|
||||
R10.1 <-> TONE.2
|
||||
@@ -112,28 +112,28 @@ Switch setup: [ spst1.ON2:spst2.ON2 ]
|
||||
C11.2 <-> C14.- <-> C5.1 <-> C8.- <-> C9.- <-> D2.A <-> D3.K <-> IC1.4 <-> IC2.4 <-> IC3.4 <-> R15.2 <-> R19.2 <-> R2.2 <-> R21.2
|
||||
C12.2 <-> R11.1
|
||||
C13.1 <-> C14.+ <-> C15.- <-> IC1.3 <-> IC3.3 <-> R12.2 <-> R19.1 <-> R20.1 <-> R3.1
|
||||
C13.2 <-> D1.K <-> IC3.5 <-> R12.1
|
||||
C15.+ <-> IC1.7 <-> IC2.7 <-> IC3.8 <-> R13.2 <-> R20.2
|
||||
C13.2 <-> D1.K <-> IC3.8 <-> R12.1
|
||||
C15.+ <-> IC1.6 <-> IC2.6 <-> IC3.5 <-> R13.2 <-> R20.2
|
||||
C16.+ <-> IC3.1 <-> LEVEL.2
|
||||
C16.- <-> R21.1
|
||||
C2.1 <-> IC1.1
|
||||
C2.2 <-> IC1.8
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.6
|
||||
C2.2 <-> IC1.5
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.7
|
||||
C3.- <-> C4.1 <-> R2.1
|
||||
C4.2 <-> R3.2 <-> R4.2
|
||||
C5.2 <-> IC2.3 <-> R4.1
|
||||
C6.1 <-> IC2.2 <-> LDR.1 <-> R5.2 <-> R6.2
|
||||
C6.2 <-> IC2.6 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C6.2 <-> IC2.7 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C7.1 <-> IC2.1
|
||||
C7.2 <-> IC2.8
|
||||
C7.2 <-> IC2.5
|
||||
C8.+ <-> R5.1
|
||||
C9.+ <-> R6.1
|
||||
D4.A <-> R14.1
|
||||
D4.K <-> R13.1
|
||||
GAIN.1 <-> IC1.2 <-> R1.2
|
||||
IC3.2 <-> LEVEL.1 <-> R11.2
|
||||
IC3.6 <-> R15.1 <-> R18.2
|
||||
IC3.7 <-> R17.2
|
||||
IC3.6 <-> R17.2
|
||||
IC3.7 <-> R15.1 <-> R18.2
|
||||
Q1.1 <-> Q1.2 <-> R14.2 <-> R16.2 <-> R17.1 <-> R18.1
|
||||
Q1.3 <-> R16.1
|
||||
R10.1 <-> TONE.2
|
||||
|
||||
@@ -13,10 +13,10 @@ Switch setup: [ ALL ]
|
||||
C14.2 <-> R21.1
|
||||
C15.2 <-> D3.K <-> Q3.2 <-> Q3.3 <-> R18.2
|
||||
C16.+ <-> Q5.3 <-> R20.1
|
||||
C3.1 <-> IC1.6 <-> Q2.3 <-> R3.2
|
||||
C3.1 <-> IC1.7 <-> Q2.3 <-> R3.2
|
||||
C3.2 <-> C4.+ <-> R2.1 <-> R3.1 <-> R4.1 <-> R5.1
|
||||
C5.+ <-> C6.1 <-> D1.K <-> IC1.7 <-> R10.1 <-> R16.2 <-> R20.2 <-> R4.2
|
||||
IC1.5 <-> R19.1
|
||||
C5.+ <-> C6.1 <-> D1.K <-> IC1.6 <-> R10.1 <-> R16.2 <-> R20.2 <-> R4.2
|
||||
IC1.8 <-> R19.1
|
||||
Q1.3 <-> R5.2 <-> R6.2
|
||||
Q5.1 <-> Q5.2
|
||||
R10.2 <-> VR1.2
|
||||
|
||||
@@ -13,10 +13,10 @@ Switch setup: [ ALL ]
|
||||
C14.2 <-> R21.1
|
||||
C15.2 <-> D3.K <-> Q3.2 <-> Q3.3 <-> R18.2
|
||||
C16.+ <-> Q5.3 <-> R20.1
|
||||
C3.1 <-> IC1.6 <-> Q2.3 <-> R3.2
|
||||
C3.1 <-> IC1.7 <-> Q2.3 <-> R3.2
|
||||
C3.2 <-> C4.+ <-> R2.1 <-> R3.1 <-> R4.1 <-> R5.1
|
||||
C5.+ <-> C6.1 <-> D1.K <-> IC1.7 <-> R10.1 <-> R16.2 <-> R20.2 <-> R4.2
|
||||
IC1.5 <-> R19.1
|
||||
C5.+ <-> C6.1 <-> D1.K <-> IC1.6 <-> R10.1 <-> R16.2 <-> R20.2 <-> R4.2
|
||||
IC1.8 <-> R19.1
|
||||
Q1.3 <-> R5.2 <-> R6.2
|
||||
Q5.1 <-> Q5.2
|
||||
R10.2 <-> VR1.2
|
||||
|
||||
@@ -2,42 +2,42 @@ Switch setup: [ ALL ]
|
||||
|
||||
Bass Switch.1 <-> C8.1 <-> R13.2 <-> R14.1
|
||||
Bass Switch.2 <-> Blend.3
|
||||
Bass Switch.3 <-> C10.2 <-> C11.2 <-> IC1.8 <-> R15.1 <-> R16.2
|
||||
Bass Switch.3 <-> C10.2 <-> C11.2 <-> IC1.14 <-> R15.1 <-> R16.2
|
||||
Blend.1 <-> C5.2 <-> C6.2 <-> Q1.2 <-> Q1.3 <-> R12.1
|
||||
Blend.2 <-> C17.1
|
||||
C1.2 <-> IC1.3 <-> IC1.5 <-> R1.1
|
||||
C10.1 <-> Lo Filter.2 <-> R14.2
|
||||
C11.1 <-> IC1.9 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.10 <-> Lo Filter.1
|
||||
C11.1 <-> IC1.13 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.12 <-> Lo Filter.1
|
||||
C12.2 <-> C13.1 <-> C9.2 <-> D1.K <-> Q1.1 <-> R11.2 <-> R12.2 <-> R17.2
|
||||
C13.2 <-> D1.A <-> R20.1 <-> R21.1
|
||||
C14.1 <-> D3.K <-> IC3.2 <-> IC3.6 <-> R24.1
|
||||
C14.2 <-> C15.1 <-> R23.1
|
||||
C15.2 <-> D2.A <-> IC3.12 <-> IC3.9 <-> R24.2
|
||||
C16.1 <-> IC3.10
|
||||
C15.2 <-> D2.A <-> IC3.10 <-> IC3.13 <-> R24.2
|
||||
C16.1 <-> IC3.12
|
||||
C16.2 <-> C18.+ <-> C19.- <-> C2.2 <-> Hi Filter.1 <-> IC3.11 <-> R1.2 <-> R22.1 <-> R23.2 <-> R26.1 <-> R27.1 <-> R5.2
|
||||
C17.2 <-> R25.1
|
||||
C18.- <-> C20.+ <-> IC1.11 <-> IC2.10 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> IC2.8 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
C18.- <-> C20.+ <-> IC1.11 <-> IC2.12 <-> IC2.14 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
C19.+ <-> C20.- <-> R27.2
|
||||
C2.1 <-> R4.2
|
||||
C3.1 <-> IC1.6 <-> R2.2 <-> R4.1
|
||||
C3.2 <-> C4.1 <-> R5.1
|
||||
C4.2 <-> R6.1 <-> Range.2
|
||||
C5.1 <-> IC1.1 <-> IC1.2 <-> R3.1 <-> R9.2
|
||||
C6.1 <-> IC1.12
|
||||
C6.1 <-> IC1.10
|
||||
C7.1 <-> R10.2 <-> R13.1
|
||||
C7.2 <-> C8.2 <-> C9.1 <-> Hi Filter.2
|
||||
D2.K <-> IC3.8
|
||||
D2.K <-> IC3.14
|
||||
D3.A <-> IC3.7
|
||||
IC1.13 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC1.14 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.4 <-> IC2.14 <-> IC3.4
|
||||
IC1.4 <-> IC2.8 <-> IC3.4
|
||||
IC1.7 <-> R18.1 <-> R19.1 <-> R2.1 <-> R6.2
|
||||
IC1.8 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.9 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC2.10 <-> IC2.13 <-> R20.2
|
||||
IC2.11 <-> IC2.2
|
||||
IC2.12 <-> IC2.9 <-> R20.2
|
||||
IC2.4 <-> IC3.1
|
||||
IC2.6 <-> IC3.14
|
||||
IC3.13 <-> IC3.3 <-> R19.2 <-> R22.2
|
||||
IC2.6 <-> IC3.8
|
||||
IC3.3 <-> IC3.9 <-> R19.2 <-> R22.2
|
||||
IC3.5 <-> R18.2
|
||||
R28.2 <-> Range.1
|
||||
|
||||
|
||||
@@ -5,38 +5,38 @@ Switch setup: [ Bass Switch.ON1:Range.ON1 ]
|
||||
Blend.3 <-> C8.1 <-> R13.2 <-> R14.1
|
||||
C1.2 <-> IC1.3 <-> IC1.5 <-> R1.1
|
||||
C10.1 <-> Lo Filter.2 <-> R14.2
|
||||
C10.2 <-> C11.2 <-> IC1.8 <-> R15.1 <-> R16.2
|
||||
C11.1 <-> IC1.9 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.10 <-> Lo Filter.1
|
||||
C10.2 <-> C11.2 <-> IC1.14 <-> R15.1 <-> R16.2
|
||||
C11.1 <-> IC1.13 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.12 <-> Lo Filter.1
|
||||
C12.2 <-> C13.1 <-> C9.2 <-> D1.K <-> Q1.1 <-> R11.2 <-> R12.2 <-> R17.2
|
||||
C13.2 <-> D1.A <-> R20.1 <-> R21.1
|
||||
C14.1 <-> D3.K <-> IC3.2 <-> IC3.6 <-> R24.1
|
||||
C14.2 <-> C15.1 <-> R23.1
|
||||
C15.2 <-> D2.A <-> IC3.12 <-> IC3.9 <-> R24.2
|
||||
C16.1 <-> IC3.10
|
||||
C15.2 <-> D2.A <-> IC3.10 <-> IC3.13 <-> R24.2
|
||||
C16.1 <-> IC3.12
|
||||
C16.2 <-> C18.+ <-> C19.- <-> C2.2 <-> Hi Filter.1 <-> IC3.11 <-> R1.2 <-> R22.1 <-> R23.2 <-> R26.1 <-> R27.1 <-> R5.2
|
||||
C17.2 <-> R25.1
|
||||
C18.- <-> C20.+ <-> IC1.11 <-> IC2.10 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> IC2.8 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
C18.- <-> C20.+ <-> IC1.11 <-> IC2.12 <-> IC2.14 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
C19.+ <-> C20.- <-> R27.2
|
||||
C2.1 <-> R4.2
|
||||
C3.1 <-> IC1.6 <-> R2.2 <-> R4.1
|
||||
C3.2 <-> C4.1 <-> R5.1
|
||||
C4.2 <-> R28.2 <-> R6.1
|
||||
C5.1 <-> IC1.1 <-> IC1.2 <-> R3.1 <-> R9.2
|
||||
C6.1 <-> IC1.12
|
||||
C6.1 <-> IC1.10
|
||||
C7.1 <-> R10.2 <-> R13.1
|
||||
C7.2 <-> C8.2 <-> C9.1 <-> Hi Filter.2
|
||||
D2.K <-> IC3.8
|
||||
D2.K <-> IC3.14
|
||||
D3.A <-> IC3.7
|
||||
IC1.13 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC1.14 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.4 <-> IC2.14 <-> IC3.4
|
||||
IC1.4 <-> IC2.8 <-> IC3.4
|
||||
IC1.7 <-> R18.1 <-> R19.1 <-> R2.1 <-> R6.2
|
||||
IC1.8 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.9 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC2.10 <-> IC2.13 <-> R20.2
|
||||
IC2.11 <-> IC2.2
|
||||
IC2.12 <-> IC2.9 <-> R20.2
|
||||
IC2.4 <-> IC3.1
|
||||
IC2.6 <-> IC3.14
|
||||
IC3.13 <-> IC3.3 <-> R19.2 <-> R22.2
|
||||
IC2.6 <-> IC3.8
|
||||
IC3.3 <-> IC3.9 <-> R19.2 <-> R22.2
|
||||
IC3.5 <-> R18.2
|
||||
|
||||
Switch setup: [ Bass Switch.ON1:Range.ON2 ]
|
||||
@@ -46,119 +46,119 @@ Switch setup: [ Bass Switch.ON1:Range.ON2 ]
|
||||
Blend.3 <-> C8.1 <-> R13.2 <-> R14.1
|
||||
C1.2 <-> IC1.3 <-> IC1.5 <-> R1.1
|
||||
C10.1 <-> Lo Filter.2 <-> R14.2
|
||||
C10.2 <-> C11.2 <-> IC1.8 <-> R15.1 <-> R16.2
|
||||
C11.1 <-> IC1.9 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.10 <-> Lo Filter.1
|
||||
C10.2 <-> C11.2 <-> IC1.14 <-> R15.1 <-> R16.2
|
||||
C11.1 <-> IC1.13 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.12 <-> Lo Filter.1
|
||||
C12.2 <-> C13.1 <-> C9.2 <-> D1.K <-> Q1.1 <-> R11.2 <-> R12.2 <-> R17.2
|
||||
C13.2 <-> D1.A <-> R20.1 <-> R21.1
|
||||
C14.1 <-> D3.K <-> IC3.2 <-> IC3.6 <-> R24.1
|
||||
C14.2 <-> C15.1 <-> R23.1
|
||||
C15.2 <-> D2.A <-> IC3.12 <-> IC3.9 <-> R24.2
|
||||
C16.1 <-> IC3.10
|
||||
C15.2 <-> D2.A <-> IC3.10 <-> IC3.13 <-> R24.2
|
||||
C16.1 <-> IC3.12
|
||||
C16.2 <-> C18.+ <-> C19.- <-> C2.2 <-> Hi Filter.1 <-> IC3.11 <-> R1.2 <-> R22.1 <-> R23.2 <-> R26.1 <-> R27.1 <-> R5.2
|
||||
C17.2 <-> R25.1
|
||||
C18.- <-> C20.+ <-> IC1.11 <-> IC2.10 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> IC2.8 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
C18.- <-> C20.+ <-> IC1.11 <-> IC2.12 <-> IC2.14 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
C19.+ <-> C20.- <-> R27.2
|
||||
C2.1 <-> R4.2
|
||||
C3.1 <-> IC1.6 <-> R2.2 <-> R4.1
|
||||
C3.2 <-> C4.1 <-> R5.1
|
||||
C4.2 <-> R6.1
|
||||
C5.1 <-> IC1.1 <-> IC1.2 <-> R3.1 <-> R9.2
|
||||
C6.1 <-> IC1.12
|
||||
C6.1 <-> IC1.10
|
||||
C7.1 <-> R10.2 <-> R13.1
|
||||
C7.2 <-> C8.2 <-> C9.1 <-> Hi Filter.2
|
||||
D2.K <-> IC3.8
|
||||
D2.K <-> IC3.14
|
||||
D3.A <-> IC3.7
|
||||
IC1.13 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC1.14 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.4 <-> IC2.14 <-> IC3.4
|
||||
IC1.4 <-> IC2.8 <-> IC3.4
|
||||
IC1.7 <-> R18.1 <-> R19.1 <-> R2.1 <-> R6.2
|
||||
IC1.8 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.9 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC2.10 <-> IC2.13 <-> R20.2
|
||||
IC2.11 <-> IC2.2
|
||||
IC2.12 <-> IC2.9 <-> R20.2
|
||||
IC2.4 <-> IC3.1
|
||||
IC2.6 <-> IC3.14
|
||||
IC3.13 <-> IC3.3 <-> R19.2 <-> R22.2
|
||||
IC2.6 <-> IC3.8
|
||||
IC3.3 <-> IC3.9 <-> R19.2 <-> R22.2
|
||||
IC3.5 <-> R18.2
|
||||
|
||||
Switch setup: [ Bass Switch.ON2:Range.ON1 ]
|
||||
|
||||
Blend.1 <-> C5.2 <-> C6.2 <-> Q1.2 <-> Q1.3 <-> R12.1
|
||||
Blend.2 <-> C17.1
|
||||
Blend.3 <-> C10.2 <-> C11.2 <-> IC1.8 <-> R15.1 <-> R16.2
|
||||
Blend.3 <-> C10.2 <-> C11.2 <-> IC1.14 <-> R15.1 <-> R16.2
|
||||
C1.2 <-> IC1.3 <-> IC1.5 <-> R1.1
|
||||
C10.1 <-> Lo Filter.2 <-> R14.2
|
||||
C11.1 <-> IC1.9 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.10 <-> Lo Filter.1
|
||||
C11.1 <-> IC1.13 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.12 <-> Lo Filter.1
|
||||
C12.2 <-> C13.1 <-> C9.2 <-> D1.K <-> Q1.1 <-> R11.2 <-> R12.2 <-> R17.2
|
||||
C13.2 <-> D1.A <-> R20.1 <-> R21.1
|
||||
C14.1 <-> D3.K <-> IC3.2 <-> IC3.6 <-> R24.1
|
||||
C14.2 <-> C15.1 <-> R23.1
|
||||
C15.2 <-> D2.A <-> IC3.12 <-> IC3.9 <-> R24.2
|
||||
C16.1 <-> IC3.10
|
||||
C15.2 <-> D2.A <-> IC3.10 <-> IC3.13 <-> R24.2
|
||||
C16.1 <-> IC3.12
|
||||
C16.2 <-> C18.+ <-> C19.- <-> C2.2 <-> Hi Filter.1 <-> IC3.11 <-> R1.2 <-> R22.1 <-> R23.2 <-> R26.1 <-> R27.1 <-> R5.2
|
||||
C17.2 <-> R25.1
|
||||
C18.- <-> C20.+ <-> IC1.11 <-> IC2.10 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> IC2.8 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
C18.- <-> C20.+ <-> IC1.11 <-> IC2.12 <-> IC2.14 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
C19.+ <-> C20.- <-> R27.2
|
||||
C2.1 <-> R4.2
|
||||
C3.1 <-> IC1.6 <-> R2.2 <-> R4.1
|
||||
C3.2 <-> C4.1 <-> R5.1
|
||||
C4.2 <-> R28.2 <-> R6.1
|
||||
C5.1 <-> IC1.1 <-> IC1.2 <-> R3.1 <-> R9.2
|
||||
C6.1 <-> IC1.12
|
||||
C6.1 <-> IC1.10
|
||||
C7.1 <-> R10.2 <-> R13.1
|
||||
C7.2 <-> C8.2 <-> C9.1 <-> Hi Filter.2
|
||||
C8.1 <-> R13.2 <-> R14.1
|
||||
D2.K <-> IC3.8
|
||||
D2.K <-> IC3.14
|
||||
D3.A <-> IC3.7
|
||||
IC1.13 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC1.14 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.4 <-> IC2.14 <-> IC3.4
|
||||
IC1.4 <-> IC2.8 <-> IC3.4
|
||||
IC1.7 <-> R18.1 <-> R19.1 <-> R2.1 <-> R6.2
|
||||
IC1.8 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.9 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC2.10 <-> IC2.13 <-> R20.2
|
||||
IC2.11 <-> IC2.2
|
||||
IC2.12 <-> IC2.9 <-> R20.2
|
||||
IC2.4 <-> IC3.1
|
||||
IC2.6 <-> IC3.14
|
||||
IC3.13 <-> IC3.3 <-> R19.2 <-> R22.2
|
||||
IC2.6 <-> IC3.8
|
||||
IC3.3 <-> IC3.9 <-> R19.2 <-> R22.2
|
||||
IC3.5 <-> R18.2
|
||||
|
||||
Switch setup: [ Bass Switch.ON2:Range.ON2 ]
|
||||
|
||||
Blend.1 <-> C5.2 <-> C6.2 <-> Q1.2 <-> Q1.3 <-> R12.1
|
||||
Blend.2 <-> C17.1
|
||||
Blend.3 <-> C10.2 <-> C11.2 <-> IC1.8 <-> R15.1 <-> R16.2
|
||||
Blend.3 <-> C10.2 <-> C11.2 <-> IC1.14 <-> R15.1 <-> R16.2
|
||||
C1.2 <-> IC1.3 <-> IC1.5 <-> R1.1
|
||||
C10.1 <-> Lo Filter.2 <-> R14.2
|
||||
C11.1 <-> IC1.9 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.10 <-> Lo Filter.1
|
||||
C11.1 <-> IC1.13 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.12 <-> Lo Filter.1
|
||||
C12.2 <-> C13.1 <-> C9.2 <-> D1.K <-> Q1.1 <-> R11.2 <-> R12.2 <-> R17.2
|
||||
C13.2 <-> D1.A <-> R20.1 <-> R21.1
|
||||
C14.1 <-> D3.K <-> IC3.2 <-> IC3.6 <-> R24.1
|
||||
C14.2 <-> C15.1 <-> R23.1
|
||||
C15.2 <-> D2.A <-> IC3.12 <-> IC3.9 <-> R24.2
|
||||
C16.1 <-> IC3.10
|
||||
C15.2 <-> D2.A <-> IC3.10 <-> IC3.13 <-> R24.2
|
||||
C16.1 <-> IC3.12
|
||||
C16.2 <-> C18.+ <-> C19.- <-> C2.2 <-> Hi Filter.1 <-> IC3.11 <-> R1.2 <-> R22.1 <-> R23.2 <-> R26.1 <-> R27.1 <-> R5.2
|
||||
C17.2 <-> R25.1
|
||||
C18.- <-> C20.+ <-> IC1.11 <-> IC2.10 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> IC2.8 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
C18.- <-> C20.+ <-> IC1.11 <-> IC2.12 <-> IC2.14 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
C19.+ <-> C20.- <-> R27.2
|
||||
C2.1 <-> R4.2
|
||||
C3.1 <-> IC1.6 <-> R2.2 <-> R4.1
|
||||
C3.2 <-> C4.1 <-> R5.1
|
||||
C4.2 <-> R6.1
|
||||
C5.1 <-> IC1.1 <-> IC1.2 <-> R3.1 <-> R9.2
|
||||
C6.1 <-> IC1.12
|
||||
C6.1 <-> IC1.10
|
||||
C7.1 <-> R10.2 <-> R13.1
|
||||
C7.2 <-> C8.2 <-> C9.1 <-> Hi Filter.2
|
||||
C8.1 <-> R13.2 <-> R14.1
|
||||
D2.K <-> IC3.8
|
||||
D2.K <-> IC3.14
|
||||
D3.A <-> IC3.7
|
||||
IC1.13 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC1.14 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.4 <-> IC2.14 <-> IC3.4
|
||||
IC1.4 <-> IC2.8 <-> IC3.4
|
||||
IC1.7 <-> R18.1 <-> R19.1 <-> R2.1 <-> R6.2
|
||||
IC1.8 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.9 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC2.10 <-> IC2.13 <-> R20.2
|
||||
IC2.11 <-> IC2.2
|
||||
IC2.12 <-> IC2.9 <-> R20.2
|
||||
IC2.4 <-> IC3.1
|
||||
IC2.6 <-> IC3.14
|
||||
IC3.13 <-> IC3.3 <-> R19.2 <-> R22.2
|
||||
IC2.6 <-> IC3.8
|
||||
IC3.3 <-> IC3.9 <-> R19.2 <-> R22.2
|
||||
IC3.5 <-> R18.2
|
||||
|
||||
|
||||
@@ -2,14 +2,14 @@ Switch setup: [ ALL ]
|
||||
|
||||
C1.+ <-> Q1.3
|
||||
C1.- <-> C4.2 <-> R2.2 <-> R3.2 <-> VR2.1
|
||||
C2.+ <-> IC1.6 <-> VR1.3
|
||||
C2.+ <-> IC1.7 <-> VR1.3
|
||||
C2.- <-> IC1.3 <-> IC1.4
|
||||
C3.1 <-> Q1.1 <-> VR1.1 <-> VR1.2
|
||||
C3.2 <-> VR2.3
|
||||
C4.1 <-> IC1.7
|
||||
C5.+ <-> IC1.5
|
||||
C4.1 <-> IC1.6
|
||||
C5.+ <-> IC1.8
|
||||
IC1.1 <-> VR3.1 <-> VR3.2
|
||||
IC1.2 <-> VR2.2
|
||||
IC1.8 <-> VR3.3
|
||||
IC1.5 <-> VR3.3
|
||||
R1.2 <-> R3.1
|
||||
|
||||
|
||||
@@ -2,14 +2,14 @@ Switch setup: [ ALL ]
|
||||
|
||||
C1.+ <-> Q1.3
|
||||
C1.- <-> C4.2 <-> R2.2 <-> R3.2 <-> VR2.1
|
||||
C2.+ <-> IC1.6 <-> VR1.3
|
||||
C2.+ <-> IC1.7 <-> VR1.3
|
||||
C2.- <-> IC1.3 <-> IC1.4
|
||||
C3.1 <-> Q1.1 <-> VR1.1 <-> VR1.2
|
||||
C3.2 <-> VR2.3
|
||||
C4.1 <-> IC1.7
|
||||
C5.+ <-> IC1.5
|
||||
C4.1 <-> IC1.6
|
||||
C5.+ <-> IC1.8
|
||||
IC1.1 <-> VR3.1 <-> VR3.2
|
||||
IC1.2 <-> VR2.2
|
||||
IC1.8 <-> VR3.3
|
||||
IC1.5 <-> VR3.3
|
||||
R1.2 <-> R3.1
|
||||
|
||||
|
||||
@@ -4,39 +4,39 @@ Switch setup: [ ALL ]
|
||||
C10.1 <-> C9.1 <-> R22.1
|
||||
C10.2 <-> IC3.3 <-> R23.1
|
||||
C11.1 <-> C12.1 <-> R27.2
|
||||
C11.2 <-> IC3.13 <-> R28.2
|
||||
C12.2 <-> IC3.14 <-> R28.1 <-> R31.1
|
||||
C11.2 <-> IC3.9 <-> R28.2
|
||||
C12.2 <-> IC3.8 <-> R28.1 <-> R31.1
|
||||
C2.1 <-> IC1.7 <-> R5.1
|
||||
C2.2 <-> R6.1
|
||||
C3.1 <-> IC1.8 <-> IC1.9 <-> R8.1
|
||||
C3.1 <-> IC1.13 <-> IC1.14 <-> R8.1
|
||||
C3.2 <-> R12.1
|
||||
C4.1 <-> IC2.1 <-> R14.1
|
||||
C4.2 <-> R15.2
|
||||
C5.1 <-> IC2.7 <-> R18.2
|
||||
C5.2 <-> R19.1
|
||||
C6.1 <-> IC2.8 <-> IC2.9 <-> R21.1
|
||||
C6.1 <-> IC2.13 <-> IC2.14 <-> R21.1
|
||||
C7.1 <-> C8.1 <-> R21.2
|
||||
C9.2 <-> IC2.13 <-> IC2.14
|
||||
D1.A <-> D2.K <-> IC2.10 <-> R19.2
|
||||
C9.2 <-> IC2.8 <-> IC2.9
|
||||
D1.A <-> D2.K <-> IC2.12 <-> R19.2
|
||||
D1.K <-> D2.A <-> IC2.3 <-> IC3.10 <-> IC3.12 <-> IC4.3 <-> R1.2 <-> R10.2 <-> R16.1 <-> R17.2 <-> R2.2 <-> R20.1 <-> R23.2 <-> R25.2 <-> R4.1 <-> R7.2 <-> R9.2 <-> VR1.3
|
||||
IC1.10 <-> R7.1
|
||||
IC1.10 <-> R8.2 <-> R9.1
|
||||
IC1.11 <-> IC2.11 <-> IC3.11 <-> IC4.4
|
||||
IC1.12 <-> R8.2 <-> R9.1
|
||||
IC1.13 <-> R10.1 <-> R11.2
|
||||
IC1.14 <-> R11.1
|
||||
IC1.12 <-> R7.1
|
||||
IC1.2 <-> R2.1 <-> R3.1
|
||||
IC1.3 <-> R1.1
|
||||
IC1.4 <-> IC2.4 <-> IC3.4 <-> IC4.8
|
||||
IC1.4 <-> IC2.4 <-> IC3.4 <-> IC4.5
|
||||
IC1.6 <-> R4.2 <-> R5.2
|
||||
IC2.12 <-> R20.2
|
||||
IC1.8 <-> R11.1
|
||||
IC1.9 <-> R10.1 <-> R11.2
|
||||
IC2.10 <-> R20.2
|
||||
IC2.2 <-> R12.2 <-> R13.1 <-> R14.2
|
||||
IC2.5 <-> R15.1 <-> R16.2
|
||||
IC2.6 <-> R17.1 <-> R18.1
|
||||
IC3.1 <-> R22.2 <-> R24.1
|
||||
IC3.13 <-> R26.2 <-> R29.1
|
||||
IC3.14 <-> R29.2 <-> R30.2
|
||||
IC3.2 <-> IC3.5 <-> R24.2
|
||||
IC3.6 <-> IC3.7 <-> R26.1 <-> R27.1
|
||||
IC3.8 <-> R29.2 <-> R30.2
|
||||
IC3.9 <-> R26.2 <-> R29.1
|
||||
IC4.1 <-> R32.1 <-> VR1.1
|
||||
IC4.2 <-> R30.1 <-> R32.2
|
||||
IC4.6 <-> IC4.7
|
||||
|
||||
@@ -4,39 +4,39 @@ Switch setup: [ ALL ]
|
||||
C10.1 <-> C9.1 <-> R22.1
|
||||
C10.2 <-> IC3.3 <-> R23.1
|
||||
C11.1 <-> C12.1 <-> R27.2
|
||||
C11.2 <-> IC3.13 <-> R28.2
|
||||
C12.2 <-> IC3.14 <-> R28.1 <-> R31.1
|
||||
C11.2 <-> IC3.9 <-> R28.2
|
||||
C12.2 <-> IC3.8 <-> R28.1 <-> R31.1
|
||||
C2.1 <-> IC1.7 <-> R5.1
|
||||
C2.2 <-> R6.1
|
||||
C3.1 <-> IC1.8 <-> IC1.9 <-> R8.1
|
||||
C3.1 <-> IC1.13 <-> IC1.14 <-> R8.1
|
||||
C3.2 <-> R12.1
|
||||
C4.1 <-> IC2.1 <-> R14.1
|
||||
C4.2 <-> R15.2
|
||||
C5.1 <-> IC2.7 <-> R18.2
|
||||
C5.2 <-> R19.1
|
||||
C6.1 <-> IC2.8 <-> IC2.9 <-> R21.1
|
||||
C6.1 <-> IC2.13 <-> IC2.14 <-> R21.1
|
||||
C7.1 <-> C8.1 <-> R21.2
|
||||
C9.2 <-> IC2.13 <-> IC2.14
|
||||
D1.A <-> D2.K <-> IC2.10 <-> R19.2
|
||||
C9.2 <-> IC2.8 <-> IC2.9
|
||||
D1.A <-> D2.K <-> IC2.12 <-> R19.2
|
||||
D1.K <-> D2.A <-> IC2.3 <-> IC3.10 <-> IC3.12 <-> IC4.3 <-> R1.2 <-> R10.2 <-> R16.1 <-> R17.2 <-> R2.2 <-> R20.1 <-> R23.2 <-> R25.2 <-> R4.1 <-> R7.2 <-> R9.2 <-> VR1.3
|
||||
IC1.10 <-> R7.1
|
||||
IC1.10 <-> R8.2 <-> R9.1
|
||||
IC1.11 <-> IC2.11 <-> IC3.11 <-> IC4.4
|
||||
IC1.12 <-> R8.2 <-> R9.1
|
||||
IC1.13 <-> R10.1 <-> R11.2
|
||||
IC1.14 <-> R11.1
|
||||
IC1.12 <-> R7.1
|
||||
IC1.2 <-> R2.1 <-> R3.1
|
||||
IC1.3 <-> R1.1
|
||||
IC1.4 <-> IC2.4 <-> IC3.4 <-> IC4.8
|
||||
IC1.4 <-> IC2.4 <-> IC3.4 <-> IC4.5
|
||||
IC1.6 <-> R4.2 <-> R5.2
|
||||
IC2.12 <-> R20.2
|
||||
IC1.8 <-> R11.1
|
||||
IC1.9 <-> R10.1 <-> R11.2
|
||||
IC2.10 <-> R20.2
|
||||
IC2.2 <-> R12.2 <-> R13.1 <-> R14.2
|
||||
IC2.5 <-> R15.1 <-> R16.2
|
||||
IC2.6 <-> R17.1 <-> R18.1
|
||||
IC3.1 <-> R22.2 <-> R24.1
|
||||
IC3.13 <-> R26.2 <-> R29.1
|
||||
IC3.14 <-> R29.2 <-> R30.2
|
||||
IC3.2 <-> IC3.5 <-> R24.2
|
||||
IC3.6 <-> IC3.7 <-> R26.1 <-> R27.1
|
||||
IC3.8 <-> R29.2 <-> R30.2
|
||||
IC3.9 <-> R26.2 <-> R29.1
|
||||
IC4.1 <-> R32.1 <-> VR1.1
|
||||
IC4.2 <-> R30.1 <-> R32.2
|
||||
IC4.6 <-> IC4.7
|
||||
|
||||
@@ -5,24 +5,24 @@ Switch setup: [ ALL ]
|
||||
C1.1 <-> R2.2
|
||||
C1.2 <-> R1.2 <-> S1.3
|
||||
C10.- <-> C12.1 <-> C3.- <-> C5.- <-> C6.1 <-> C7.- <-> IC1.4 <-> IC2.4 <-> Level.1 <-> R1.1 <-> R10.2 <-> R11.2 <-> R12.1 <-> R15.1 <-> R4.1
|
||||
C11.1 <-> IC2.5 <-> Q2.1 <-> R15.2
|
||||
C11.1 <-> IC2.8 <-> Q2.1 <-> R15.2
|
||||
C11.2 <-> R14.2
|
||||
C12.2 <-> C6.2 <-> C7.+ <-> IC1.8 <-> IC2.8 <-> Q2.2 <-> Q2.3 <-> R3.2 <-> VR1.1 <-> VR1.2
|
||||
C12.2 <-> C6.2 <-> C7.+ <-> IC1.5 <-> IC2.5 <-> Q2.2 <-> Q2.3 <-> R3.2 <-> VR1.1 <-> VR1.2
|
||||
C2.1 <-> Q1.1 <-> R14.1 <-> R2.1
|
||||
C2.2 <-> IC1.3 <-> R3.1 <-> R4.2
|
||||
C3.+ <-> R5.1
|
||||
C4.1 <-> C8.+ <-> IC1.1 <-> R6.2 <-> R7.1 <-> R8.1
|
||||
C4.2 <-> Level.3
|
||||
C5.+ <-> IC1.5 <-> R8.2
|
||||
C5.+ <-> IC1.8 <-> R8.2
|
||||
C8.- <-> D1.A <-> R10.1
|
||||
C9.+ <-> IC1.7 <-> R9.2
|
||||
C9.+ <-> IC1.6 <-> R9.2
|
||||
C9.- <-> D2.A <-> R11.1
|
||||
IC1.2 <-> R5.2 <-> R6.1
|
||||
IC1.6 <-> R7.2 <-> R9.1
|
||||
IC1.7 <-> R7.2 <-> R9.1
|
||||
IC2.1 <-> IC2.2 <-> R13.1
|
||||
IC2.3 <-> Ratio.2
|
||||
IC2.6 <-> R13.2 <-> R16.1
|
||||
IC2.7 <-> Q1.2 <-> Q1.3 <-> R16.2
|
||||
IC2.6 <-> Q1.2 <-> Q1.3 <-> R16.2
|
||||
IC2.7 <-> R13.2 <-> R16.1
|
||||
Level.2 <-> S1.8
|
||||
R12.2 <-> Ratio.1
|
||||
S1.1 <-> S1.9
|
||||
|
||||
@@ -5,24 +5,24 @@ Switch setup: [ ALL ]
|
||||
C1.1 <-> R2.2
|
||||
C1.2 <-> R1.2
|
||||
C10.- <-> C12.1 <-> C3.- <-> C5.- <-> C6.1 <-> C7.- <-> IC1.4 <-> IC2.4 <-> Level.1 <-> R1.1 <-> R10.2 <-> R11.2 <-> R12.1 <-> R15.1 <-> R4.1
|
||||
C11.1 <-> IC2.5 <-> Q2.1 <-> R15.2
|
||||
C11.1 <-> IC2.8 <-> Q2.1 <-> R15.2
|
||||
C11.2 <-> R14.2
|
||||
C12.2 <-> C6.2 <-> C7.+ <-> IC1.8 <-> IC2.8 <-> Q2.2 <-> Q2.3 <-> R3.2 <-> VR1.1 <-> VR1.2
|
||||
C12.2 <-> C6.2 <-> C7.+ <-> IC1.5 <-> IC2.5 <-> Q2.2 <-> Q2.3 <-> R3.2 <-> VR1.1 <-> VR1.2
|
||||
C2.1 <-> Q1.1 <-> R14.1 <-> R2.1
|
||||
C2.2 <-> IC1.3 <-> R3.1 <-> R4.2
|
||||
C3.+ <-> R5.1
|
||||
C4.1 <-> C8.+ <-> IC1.1 <-> R6.2 <-> R7.1 <-> R8.1
|
||||
C4.2 <-> Level.3
|
||||
C5.+ <-> IC1.5 <-> R8.2
|
||||
C5.+ <-> IC1.8 <-> R8.2
|
||||
C8.- <-> D1.A <-> R10.1
|
||||
C9.+ <-> IC1.7 <-> R9.2
|
||||
C9.+ <-> IC1.6 <-> R9.2
|
||||
C9.- <-> D2.A <-> R11.1
|
||||
IC1.2 <-> R5.2 <-> R6.1
|
||||
IC1.6 <-> R7.2 <-> R9.1
|
||||
IC1.7 <-> R7.2 <-> R9.1
|
||||
IC2.1 <-> IC2.2 <-> R13.1
|
||||
IC2.3 <-> Ratio.2
|
||||
IC2.6 <-> R13.2 <-> R16.1
|
||||
IC2.7 <-> Q1.2 <-> Q1.3 <-> R16.2
|
||||
IC2.6 <-> Q1.2 <-> Q1.3 <-> R16.2
|
||||
IC2.7 <-> R13.2 <-> R16.1
|
||||
R12.2 <-> Ratio.1
|
||||
Thres.1 <-> Thres.2
|
||||
Thres.3 <-> VR1.3
|
||||
|
||||
@@ -2,14 +2,14 @@ Switch setup: [ ALL ]
|
||||
|
||||
C1.+ <-> C3.1 <-> P1.1 <-> P2B.1 <-> P2B.2 <-> R1.1 <-> R2.2 <-> R3.2
|
||||
C1.- <-> IC1.4 <-> R2.1
|
||||
C2.1 <-> C3.2 <-> IC1.5 <-> R7.1
|
||||
C2.1 <-> C3.2 <-> IC1.8 <-> R7.1
|
||||
C2.2 <-> P2A.1 <-> P2A.2
|
||||
D1.A <-> D2.K <-> R4.2 <-> R5.1
|
||||
D1.K <-> D2.A <-> IC1.7 <-> P1.3 <-> R5.2 <-> R6.1
|
||||
D1.K <-> D2.A <-> IC1.6 <-> P1.3 <-> R5.2 <-> R6.1
|
||||
IC1.1 <-> IC1.2
|
||||
IC1.3 <-> P1.2
|
||||
IC1.6 <-> R3.1 <-> R4.1
|
||||
IC1.8 <-> R1.2 <-> S1.1
|
||||
IC1.5 <-> R1.2 <-> S1.1
|
||||
IC1.7 <-> R3.1 <-> R4.1
|
||||
P2A.3 <-> R6.2
|
||||
P2B.3 <-> R7.2
|
||||
|
||||
|
||||
@@ -2,14 +2,14 @@ Switch setup: [ ALL ]
|
||||
|
||||
C1.+ <-> C3.1 <-> P1.1 <-> P2B.1 <-> P2B.2 <-> R1.1 <-> R2.2 <-> R3.2
|
||||
C1.- <-> IC1.4 <-> R2.1
|
||||
C2.1 <-> C3.2 <-> IC1.5 <-> R7.1
|
||||
C2.1 <-> C3.2 <-> IC1.8 <-> R7.1
|
||||
C2.2 <-> P2A.1 <-> P2A.2
|
||||
D1.A <-> D2.K <-> R4.2 <-> R5.1
|
||||
D1.K <-> D2.A <-> IC1.7 <-> P1.3 <-> R5.2 <-> R6.1
|
||||
D1.K <-> D2.A <-> IC1.6 <-> P1.3 <-> R5.2 <-> R6.1
|
||||
IC1.1 <-> IC1.2
|
||||
IC1.3 <-> P1.2
|
||||
IC1.6 <-> R3.1 <-> R4.1
|
||||
IC1.8 <-> R1.2
|
||||
IC1.5 <-> R1.2
|
||||
IC1.7 <-> R3.1 <-> R4.1
|
||||
P2A.3 <-> R6.2
|
||||
P2B.3 <-> R7.2
|
||||
|
||||
|
||||
@@ -11,9 +11,6 @@
|
||||
<option name="ENABLED" value="true" />
|
||||
</pattern>
|
||||
</extension>
|
||||
<RunnerSettings RunnerId="Profile ">
|
||||
<option name="yk-options-v2" value="<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="advanced-options">on_exit=snapshot</entry> <entry key="jfr">Off</entry> <entry key="cpu">Sampling</entry> <entry key="monitor">Off</entry> <entry key="telemetry">On</entry> <entry key="thread">States and stacks</entry> <entry key="time">Wall time</entry> <entry key="alloc">Off</entry> <entry key="launch-ui">true</entry> <entry key="exceptions">On</entry> </properties> " />
|
||||
</RunnerSettings>
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
+255
-459
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"version" : "6.9.0",
|
||||
"version" : "6.10.0",
|
||||
"components" : [ {
|
||||
"name" : "Blank Board",
|
||||
"className" : "boards.BlankBoard",
|
||||
@@ -7142,6 +7142,45 @@
|
||||
"label" : "-"
|
||||
} ]
|
||||
}
|
||||
}, {
|
||||
"name" : "Chassis Panel",
|
||||
"className" : "chassis.ChassisPanel",
|
||||
"category" : "Electro-Mechanical",
|
||||
"namePrefix" : "CP",
|
||||
"description" : "One side of a chassis, with or withouth rounded edges",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"notes" : [ "Each instance is one side of the chassis: an exploded view of a whole chassis takes five panels, while the top, front and back alone take three, which is typical for pedals and amplifiers. The top panel goes in the centre with the front panel against its upper edge and the back panel against its lower edge; in the five-panel view the left side panel goes against its left edge and the right side panel against its right edge", "The panel is not conductive in the netlist: jacks, pots and lugs drawn on it are not joined through it, so chassis ground points must be connected explicitly" ],
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
"format" : "number without the % sign, e.g. 100",
|
||||
"defaultValue" : "100"
|
||||
}, {
|
||||
"name" : "Border",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#A6A6A6"
|
||||
}, {
|
||||
"name" : "Border Thickness",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0.2mm"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#EEEEEE"
|
||||
}, {
|
||||
"name" : "Name",
|
||||
"type" : "String"
|
||||
}, {
|
||||
"name" : "Radius",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0mm"
|
||||
} ]
|
||||
}, {
|
||||
"name" : "Cliff 1/4\" Jack",
|
||||
"className" : "electromechanical.CliffJack1_4",
|
||||
@@ -7633,6 +7672,66 @@
|
||||
}
|
||||
} ]
|
||||
}
|
||||
}, {
|
||||
"name" : "Drill Hole",
|
||||
"className" : "electromechanical.DrillHole",
|
||||
"category" : "Electro-Mechanical",
|
||||
"namePrefix" : "Hole",
|
||||
"description" : "Drill hole marker for PCB, chassis or faceplate",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
"format" : "number without the % sign, e.g. 100",
|
||||
"defaultValue" : "100"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#000000"
|
||||
}, {
|
||||
"name" : "Diameter",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "3mm"
|
||||
} ],
|
||||
"pinout" : {
|
||||
"pinCount" : 1,
|
||||
"labels" : "none"
|
||||
}
|
||||
}, {
|
||||
"name" : "Elliptical Cutout",
|
||||
"className" : "chassis.EllipticalCutout",
|
||||
"category" : "Electro-Mechanical",
|
||||
"namePrefix" : "ELC",
|
||||
"description" : "Elliptical chassis cutout",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
"format" : "number without the % sign, e.g. 100",
|
||||
"defaultValue" : "100"
|
||||
}, {
|
||||
"name" : "Border",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#A6A6A6"
|
||||
}, {
|
||||
"name" : "Border Thickness",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0.2mm"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#FFFFFF"
|
||||
}, {
|
||||
"name" : "Name",
|
||||
"type" : "String"
|
||||
} ]
|
||||
}, {
|
||||
"name" : "Fuse Holder (Panel)",
|
||||
"className" : "electromechanical.FuseHolderPanel",
|
||||
@@ -7738,7 +7837,7 @@
|
||||
"className" : "electromechanical.MiniRelay",
|
||||
"category" : "Electro-Mechanical",
|
||||
"namePrefix" : "RY",
|
||||
"description" : "Miniature PCB mount relay, like Omron G5V-1/G5V-2 or Fujitsu FTR-B3",
|
||||
"description" : "Miniature PCB mount relay, like Omron G5V-1 or G5V-2",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"notes" : [ "The first control point is the anchor; with 'Orientation' DEFAULT the first column of pins runs down from it, the second column sits to the right and the indent is at the anchor's end. The other orientations rotate this around the anchor", "Pin offsets down each column from the anchor: Miniature DPDT 0, 0.3, 0.5 and 0.7in, SPDT 0, 0.5 and 0.7in, columns 0.3in apart; Ultra_miniature DPDT 0, 0.2, 0.3 and 0.4in, SPDT 0, 0.3 and 0.4in, columns 0.2in apart" ],
|
||||
"properties" : [ {
|
||||
@@ -7895,7 +7994,7 @@
|
||||
}, {
|
||||
"name" : "Type",
|
||||
"type" : "ToggleSwitchType",
|
||||
"possibleValues" : [ "SPST", "SPDT", "SPDT_off", "DPDT", "DPDT_off", "DPDT_ononon_1", "DPDT_ononon_2", "_3PDT", "_3PDT_off", "_4PDT", "_4PDT_off", "_4PDT_ononon_1", "_4PDT_ononon_2", "_5PDT", "_5PDT_off", "_6PDT", "_6PDT_off" ],
|
||||
"possibleValues" : [ "SPST", "SPDT", "SPDT_off", "DPDT", "DPDT_off", "DPDT_ononon_1", "DPDT_ononon_2", "_3PDT", "_3PDT_off", "_4PDT", "_4PDT_off", "_4PDT_ononon_1", "_4PDT_ononon_2", "_5PDT", "_5PDT_off" ],
|
||||
"defaultValue" : "DPDT"
|
||||
} ],
|
||||
"pinout" : {
|
||||
@@ -8167,41 +8266,6 @@
|
||||
"connected" : [ [ 1, 2 ], [ 4, 5 ], [ 7, 8 ], [ 10, 11 ], [ 13, 14 ] ]
|
||||
} ]
|
||||
}
|
||||
}, {
|
||||
"when" : {
|
||||
"Type" : "_6PDT"
|
||||
},
|
||||
"pinCount" : 18,
|
||||
"labels" : "sequential",
|
||||
"switching" : {
|
||||
"positionCount" : 2,
|
||||
"positions" : [ {
|
||||
"name" : "ON1",
|
||||
"connected" : [ [ 0, 1 ], [ 3, 4 ], [ 6, 7 ], [ 9, 10 ], [ 12, 13 ], [ 15, 16 ] ]
|
||||
}, {
|
||||
"name" : "ON2",
|
||||
"connected" : [ [ 1, 2 ], [ 4, 5 ], [ 7, 8 ], [ 10, 11 ], [ 13, 14 ], [ 16, 17 ] ]
|
||||
} ]
|
||||
}
|
||||
}, {
|
||||
"when" : {
|
||||
"Type" : "_6PDT_off"
|
||||
},
|
||||
"pinCount" : 18,
|
||||
"labels" : "sequential",
|
||||
"switching" : {
|
||||
"positionCount" : 3,
|
||||
"positions" : [ {
|
||||
"name" : "ON1",
|
||||
"connected" : [ [ 0, 1 ], [ 3, 4 ], [ 6, 7 ], [ 9, 10 ], [ 12, 13 ], [ 15, 16 ] ]
|
||||
}, {
|
||||
"name" : "OFF",
|
||||
"connected" : [ ]
|
||||
}, {
|
||||
"name" : "ON2",
|
||||
"connected" : [ [ 1, 2 ], [ 4, 5 ], [ 7, 8 ], [ 10, 11 ], [ 13, 14 ], [ 16, 17 ] ]
|
||||
} ]
|
||||
}
|
||||
} ]
|
||||
}
|
||||
}, {
|
||||
@@ -8533,6 +8597,43 @@
|
||||
"label" : "Center"
|
||||
} ]
|
||||
}
|
||||
}, {
|
||||
"name" : "Polygonal Cutout",
|
||||
"className" : "chassis.PolygonalCutout",
|
||||
"category" : "Electro-Mechanical",
|
||||
"namePrefix" : "POLYC",
|
||||
"description" : "Polygonal chassis cutout",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
"format" : "number without the % sign, e.g. 100",
|
||||
"defaultValue" : "100"
|
||||
}, {
|
||||
"name" : "Border",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#A6A6A6"
|
||||
}, {
|
||||
"name" : "Border Thickness",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0.2mm"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#FFFFFF"
|
||||
}, {
|
||||
"name" : "Edges",
|
||||
"type" : "PointCount",
|
||||
"possibleValues" : [ "_3", "_4", "_5", "_6", "_7", "_8" ],
|
||||
"defaultValue" : "_4"
|
||||
}, {
|
||||
"name" : "Name",
|
||||
"type" : "String"
|
||||
} ]
|
||||
}, {
|
||||
"name" : "RCA Jack",
|
||||
"className" : "electromechanical.RCAJack",
|
||||
@@ -8564,6 +8665,44 @@
|
||||
"label" : "Sleeve"
|
||||
} ]
|
||||
}
|
||||
}, {
|
||||
"name" : "Rectangular Cutout",
|
||||
"className" : "chassis.RectangularCutout",
|
||||
"category" : "Electro-Mechanical",
|
||||
"namePrefix" : "RECTC",
|
||||
"description" : "Rectangular chassis cutout, with or without rounded edges",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
"format" : "number without the % sign, e.g. 100",
|
||||
"defaultValue" : "100"
|
||||
}, {
|
||||
"name" : "Border",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#A6A6A6"
|
||||
}, {
|
||||
"name" : "Border Thickness",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0.2mm"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#FFFFFF"
|
||||
}, {
|
||||
"name" : "Name",
|
||||
"type" : "String"
|
||||
}, {
|
||||
"name" : "Radius",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0mm"
|
||||
} ]
|
||||
}, {
|
||||
"name" : "Rotary Selector Switch",
|
||||
"className" : "electromechanical.RotarySelectorSwitch",
|
||||
@@ -11413,242 +11552,6 @@
|
||||
"label" : "South Start"
|
||||
} ]
|
||||
}
|
||||
}, {
|
||||
"name" : "Dial Scale",
|
||||
"className" : "chassis.DialScale",
|
||||
"category" : "Hardware",
|
||||
"namePrefix" : "DS",
|
||||
"description" : "Control panel dial scale",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"properties" : [ {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#000000"
|
||||
}, {
|
||||
"name" : "Diameter",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "1in"
|
||||
}, {
|
||||
"name" : "Font",
|
||||
"type" : "Font"
|
||||
}, {
|
||||
"name" : "Marker Size",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0.1in"
|
||||
}, {
|
||||
"name" : "Tick Width",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0.5mm"
|
||||
}, {
|
||||
"name" : "Type",
|
||||
"type" : "DialScaleType",
|
||||
"possibleValues" : [ "Ticks_Mixed", "Ticks", "Ticks_0_5_5_11", "Dots", "Dots_Gradual", "Numeric_0_10", "Numeric_1_11", "Numeric_1_10", "Numeric_1_12", "Numeric_Even", "Numeric_Even_Ticks" ],
|
||||
"defaultValue" : "Ticks"
|
||||
}, {
|
||||
"name" : "Value",
|
||||
"type" : "String"
|
||||
} ],
|
||||
"pinout" : {
|
||||
"pinCount" : 1,
|
||||
"labels" : "none"
|
||||
}
|
||||
}, {
|
||||
"name" : "Drill Hole",
|
||||
"className" : "electromechanical.DrillHole",
|
||||
"category" : "Hardware",
|
||||
"namePrefix" : "Hole",
|
||||
"description" : "Drill hole marker for PCB, chassis or faceplate",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
"format" : "number without the % sign, e.g. 100",
|
||||
"defaultValue" : "100"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#000000"
|
||||
}, {
|
||||
"name" : "Diameter",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "3mm"
|
||||
} ],
|
||||
"pinout" : {
|
||||
"pinCount" : 1,
|
||||
"labels" : "none"
|
||||
}
|
||||
}, {
|
||||
"name" : "Elliptical Cutout",
|
||||
"className" : "chassis.EllipticalCutout",
|
||||
"category" : "Hardware",
|
||||
"namePrefix" : "ELC",
|
||||
"description" : "Elliptical chassis cutout",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
"format" : "number without the % sign, e.g. 100",
|
||||
"defaultValue" : "100"
|
||||
}, {
|
||||
"name" : "Border",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#A6A6A6"
|
||||
}, {
|
||||
"name" : "Border Thickness",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "1px"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#FFFFFF"
|
||||
}, {
|
||||
"name" : "Name",
|
||||
"type" : "String"
|
||||
} ]
|
||||
}, {
|
||||
"name" : "Enclosure",
|
||||
"className" : "chassis.ChassisPanel",
|
||||
"category" : "Hardware",
|
||||
"namePrefix" : "ENC",
|
||||
"description" : "Top panel of an enclosure or chassis, optionally with its sides unfolded",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"notes" : [ "The two control points are opposite corners of the enclosure's top panel. With 'Height' above zero the sides are unfolded around it as an exploded view, each as tall as 'Height' and set 'Spacing' apart from it: the front against the top panel's upper edge, the back against its lower edge and, when 'Sides' is All, the left and right sides against its left and right edges. The bottom is never drawn. With 'Sides' set to None, or 'Height' at zero, it is a single flat panel of any size, such as one side of a chassis drawn on its own", "The enclosure is not conductive in the netlist: jacks, pots and lugs drawn on it are not joined through it, so chassis ground points must be connected explicitly", "A datasheet model is a Hammond enclosure part number such as 1590BB, 1550B or 1444-32, or a generic size such as 125B, and is stored as 'Value'; it sets the top panel to the enclosure's length and width, upright for pedal-sized die-cast boxes up to 125 mm long and horizontal for bigger boxes and amplifier chassis and 'Height' to its wall height. 125B is a generic size sold by several makers; its Hammond equivalent is 1590N1" ],
|
||||
"datasheetModels" : [ "1590LLB", "1590LB", "1590H", "1590Y", "1590A", "1590G", "1590G2", "1590S", "1590B", "1590B2", "1590BS", "1590B3", "1590BB", "1590BB2", "1590BBS", "1590Q", "1590U", "1590V", "1590C", "1590T", "1590CE", "1590N1", "1590KK", "1590K", "1590J", "1590XX", "1590X", "1590P1", "1590D", "1590DD", "1590E", "1590F", "1590R1", "1590DE", "1590EE", "1590BX2", "1590BX", "1550Q", "1550P", "1550A", "1550B", "1550D", "1550C", "1550M", "1550K", "1550L", "1550E", "1550F", "1550G", "1550H", "1550N", "1550J", "125B", "1441-9", "1441-15", "1441-6", "1441-8", "1441-12", "1441-10", "1441-14", "1441-16", "1441-22", "1441-29", "1441-18", "1441-26", "1441-30", "1441-34", "1441-24", "1441-28", "1441-20", "1441-32", "1441-36", "1441-38", "1441-33", "1441-40", "1441-42", "1444-45351", "1444-9", "1444-15", "1444-6415", "1444-84515", "1444-6", "1444-542", "1444-8", "1444-12", "1444-772", "1444-10", "1444-862", "1444-14", "1444-972", "1444-9552", "1444-16", "1444-1172", "1444-22", "1444-29", "1444-1372", "1444-18", "1444-26", "1444-30", "1444-17132", "1444-95525", "1444-10825", "1444-12825", "1444-643", "1444-753", "1444-9553", "1444-1053", "1444-1273", "1444-24", "1444-12103", "1444-12123", "1444-1463", "1444-14103", "1444-1573", "1444-1593", "1444-28", "1444-20", "1444-1763", "1444-1773", "1444-1783", "1444-32", "1444-17123", "1444-17133", "1444-17143", "1444-17173", "1444-33", "1444-17134", "1444-17154", "1444-17174", "1444-17105", "1444-17135", "1444-17156" ],
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
"format" : "number without the % sign, e.g. 100",
|
||||
"defaultValue" : "100"
|
||||
}, {
|
||||
"name" : "Border",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#A6A6A6"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#EEEEEE"
|
||||
}, {
|
||||
"name" : "Height",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "36mm"
|
||||
}, {
|
||||
"name" : "Name",
|
||||
"type" : "String"
|
||||
}, {
|
||||
"name" : "Radius",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0mm"
|
||||
}, {
|
||||
"name" : "Sides",
|
||||
"type" : "Sides",
|
||||
"possibleValues" : [ "ALL", "FRONT_AND_BACK", "NONE" ],
|
||||
"defaultValue" : "ALL"
|
||||
}, {
|
||||
"name" : "Spacing",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0mm"
|
||||
}, {
|
||||
"name" : "Value",
|
||||
"type" : "String",
|
||||
"defaultValue" : "125B"
|
||||
} ]
|
||||
}, {
|
||||
"name" : "Polygonal Cutout",
|
||||
"className" : "chassis.PolygonalCutout",
|
||||
"category" : "Hardware",
|
||||
"namePrefix" : "POLYC",
|
||||
"description" : "Polygonal chassis cutout",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
"format" : "number without the % sign, e.g. 100",
|
||||
"defaultValue" : "100"
|
||||
}, {
|
||||
"name" : "Border",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#A6A6A6"
|
||||
}, {
|
||||
"name" : "Border Thickness",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "1px"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#FFFFFF"
|
||||
}, {
|
||||
"name" : "Edges",
|
||||
"type" : "PointCount",
|
||||
"possibleValues" : [ "_3", "_4", "_5", "_6", "_7", "_8" ],
|
||||
"defaultValue" : "_4"
|
||||
}, {
|
||||
"name" : "Name",
|
||||
"type" : "String"
|
||||
} ]
|
||||
}, {
|
||||
"name" : "Rectangular Cutout",
|
||||
"className" : "chassis.RectangularCutout",
|
||||
"category" : "Hardware",
|
||||
"namePrefix" : "RECTC",
|
||||
"description" : "Rectangular chassis cutout, with or without rounded edges",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
"format" : "number without the % sign, e.g. 100",
|
||||
"defaultValue" : "100"
|
||||
}, {
|
||||
"name" : "Border",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#A6A6A6"
|
||||
}, {
|
||||
"name" : "Border Thickness",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "1px"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#FFFFFF"
|
||||
}, {
|
||||
"name" : "Name",
|
||||
"type" : "String"
|
||||
}, {
|
||||
"name" : "Radius",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0mm"
|
||||
} ]
|
||||
}, {
|
||||
"name" : "Auto-Wrap Label",
|
||||
"className" : "misc.WrapLabel",
|
||||
@@ -11750,6 +11653,52 @@
|
||||
"type" : "String",
|
||||
"defaultValue" : "X"
|
||||
} ]
|
||||
}, {
|
||||
"name" : "Dial Scale",
|
||||
"className" : "chassis.DialScale",
|
||||
"category" : "Misc",
|
||||
"namePrefix" : "DS",
|
||||
"description" : "Control panel dial scale",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"properties" : [ {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
"format" : "hex",
|
||||
"defaultValue" : "#000000"
|
||||
}, {
|
||||
"name" : "Diameter",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "1in"
|
||||
}, {
|
||||
"name" : "Font",
|
||||
"type" : "Font"
|
||||
}, {
|
||||
"name" : "Marker Size",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0.1in"
|
||||
}, {
|
||||
"name" : "Tick Width",
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0.5mm"
|
||||
}, {
|
||||
"name" : "Type",
|
||||
"type" : "DialScaleType",
|
||||
"possibleValues" : [ "Ticks_Mixed", "Ticks", "Ticks_0_5_5_11", "Dots", "Dots_Gradual", "Numeric_0_10", "Numeric_1_11", "Numeric_1_10", "Numeric_1_12", "Numeric_Even", "Numeric_Even_Ticks" ],
|
||||
"defaultValue" : "Ticks"
|
||||
}, {
|
||||
"name" : "Value",
|
||||
"type" : "String"
|
||||
} ],
|
||||
"pinout" : {
|
||||
"pinCount" : 1,
|
||||
"labels" : "none"
|
||||
}
|
||||
}, {
|
||||
"name" : "Image",
|
||||
"className" : "misc.Image",
|
||||
@@ -12245,7 +12194,6 @@
|
||||
"description" : "Axial electrolytic capacitor, similar to Sprague Atom, F&T, etc",
|
||||
"creationMethod" : "POINT_BY_POINT",
|
||||
"notes" : [ "The two control points are the holes the leads go into and the body is centred between them; 'Length' is the body length, not the hole spacing", "It has no standing mode: keep the control points at least 'Length' apart, or the body is drawn past the holes" ],
|
||||
"datasheetModels" : [ "F&T Typ A", "Illinois TTA", "JJ ANH", "Sprague TVA Atom" ],
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
@@ -12360,7 +12308,6 @@
|
||||
"description" : "Vertically mounted electrolytic capacitor, polarized or bipolar",
|
||||
"creationMethod" : "POINT_BY_POINT",
|
||||
"notes" : [ "The two control points are the holes; the body's own leads are 'Lead Spacing' apart and centred between them, with lead wire drawn out to each hole. Place the points exactly 'Lead Spacing' apart for straight leads", "'Diameter' is the can as seen from above; 'Height' is drawn only when 'Folded' lays the can on its side" ],
|
||||
"datasheetModels" : [ "Elna Silmic II", "Nichicon FG", "Nichicon FW", "Nichicon KZ", "Panasonic FC", "Panasonic FM", "Panasonic NHG" ],
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
@@ -12485,7 +12432,6 @@
|
||||
"description" : "Axial film capacitor, similar to Mallory 150s",
|
||||
"creationMethod" : "POINT_BY_POINT",
|
||||
"notes" : [ "The two control points are the holes the leads go into and the body is centred between them; 'Length' is the body length, not the hole spacing", "If the control points are closer together than 'Length' (0.5in by default) the part is drawn standing, its body over the first point, or over the second with 'Reverse (standing)'; to keep it lying on a tighter footprint, reduce 'Length'" ],
|
||||
"datasheetModels" : [ "Mallory 150", "Solen Fast" ],
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
@@ -12582,7 +12528,6 @@
|
||||
"description" : "Radial film capacitor, similar to Sprague Orange Drop",
|
||||
"creationMethod" : "POINT_BY_POINT",
|
||||
"notes" : [ "The two control points are the holes; the body's own leads are 'Lead Spacing' apart and centred between them, with lead wire drawn out to each hole. Place the points exactly 'Lead Spacing' apart for straight leads", "'Length' and 'Width' are the body as seen from above: 'Length' runs along the line between the leads and 'Width' across it, i.e. the datasheet width and thickness; body height is not drawn" ],
|
||||
"datasheetModels" : [ "Epcos MKT (5mm)", "Epcos MKT (7.5mm)", "Epcos MKT (10mm)", "Orange Drop 225P", "Orange Drop 715P", "Orange Drop 716P", "WIMA FKP-02 (2.5mm)", "WIMA FKP-2 (5mm)", "WIMA FKS-2 (5mm)", "WIMA MKP-2 (5mm)", "WIMA MKP-4", "WIMA MKS-02 (2.5mm)", "WIMA MKS-2 (5mm)", "WIMA MKS-4" ],
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
@@ -12985,7 +12930,6 @@
|
||||
"description" : "Standard radial mica capacitor",
|
||||
"creationMethod" : "POINT_BY_POINT",
|
||||
"notes" : [ "The two control points are the holes; the body's own leads are 'Lead Spacing' apart and centred between them, with lead wire drawn out to each hole. Place the points exactly 'Lead Spacing' apart for straight leads" ],
|
||||
"datasheetModels" : [ "Cornell Dubilier CD10 (3.6mm)", "Cornell Dubilier CD15 (5.9mm)", "Cornell Dubilier CD19 (8.7mm)", "Cornell Dubilier CDV19 (8.7mm)", "Cornell Dubilier CD30 (11.1mm)", "Cornell Dubilier CDV30 (11.1mm)", "Cornell Dubilier CD42 (27mm)" ],
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
@@ -13517,8 +13461,7 @@
|
||||
"namePrefix" : "R",
|
||||
"description" : "Resistor layout symbol",
|
||||
"creationMethod" : "POINT_BY_POINT",
|
||||
"notes" : [ "The two control points are the holes the leads go into and the body is centred between them; 'Length' is the body length, not the hole spacing", "If the control points are closer together than 'Length' (0.5in by default) the part is drawn standing, its body over the first point; to keep it lying on a tighter footprint, reduce 'Length'", "A datasheet model sets the body size, shape and colors of a resistor family at one power rating but never the resistance; set 'Power Rating' together with the model to pick the matching size" ],
|
||||
"datasheetModels" : [ "Carbon Comp", "Carbon Film", "Metal Film", "Metal Oxide", "Ceramic", "Dale CMF55", "Dale CMF60" ],
|
||||
"notes" : [ "The two control points are the holes the leads go into and the body is centred between them; 'Length' is the body length, not the hole spacing", "If the control points are closer together than 'Length' (0.5in by default) the part is drawn standing, its body over the first point; to keep it lying on a tighter footprint, reduce 'Length'" ],
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
@@ -16564,8 +16507,7 @@
|
||||
"namePrefix" : "IC",
|
||||
"description" : "Dual-in-line package IC",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"notes" : [ "The first control point is the anchor; with 'Orientation' DEFAULT the first row of pins runs down from it 'Pin Spacing' apart, the second row sits 'Row Spacing' to the right and the notch is at the anchor's end. The other orientations rotate this around the anchor", "'Pin Names' is a comma-separated list of pin names in pin-number order, starting with pin 1 next to the notch; a pin without a name is called by its number. Pins named alike up to a trailing '_1', '_2' are one net inside the package, e.g. GND_1 and GND_2, while 1IN- and 2IN- are inputs of two separate sections", "A datasheet model is a part number such as TL072 or NE555 and sets 'Pins', 'Row Spacing', 'Pin Names' and 'Value'. Set 'Value' to the same part number together with the model" ],
|
||||
"datasheetModels" : [ "TL061", "TL071", "TL081", "LM741", "LF356", "OPA134", "NE5534", "LF351", "UA741", "OP07", "LM308", "TL062", "TL072", "TL082", "NE5532", "JRC4558", "RC4580", "OPA2134", "OPA2604", "LM4562", "LM358", "LF353", "MC1458", "RC4558", "LM833", "TL022", "OP275", "LME49720", "OPA2132", "OPA2227", "TL074", "TL084", "OPA4134", "LM324", "TL064", "NE555", "ICM7555", "TLC555", "NE556", "ICM7556", "LM555", "LM13700", "CA3080", "SSM2164", "V2164", "LM13600", "AS3080", "AS2164", "LM386", "LM380", "TDA7052", "TDA2822", "MN3007", "MN3207", "BL3207", "BL3208A", "V3207", "MN3008", "MN3005", "BL3208B", "MN3101", "MN3102", "V3102", "PT2399", "NE570", "NE571", "SA571", "ICL7660", "TC1044", "MAX1044", "LT1054", "CD4049", "CD4069", "CD40106", "CD4011", "CD4013", "CD4017", "CD4066", "CD4051", "CD4053", "CD4016", "74HC14", "74HC4051", "PC817", "4N35", "6N138", "H11L1", "6N139", "ATtiny85", "ATmega328P", "ATtiny13A", "LM393" ],
|
||||
"notes" : [ "The first control point is the anchor; with 'Orientation' DEFAULT the first row of pins runs down from it 'Pin Spacing' apart, the second row sits 'Row Spacing' to the right and the notch is at the anchor's end. The other orientations rotate this around the anchor" ],
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
@@ -16586,6 +16528,11 @@
|
||||
"type" : "Display",
|
||||
"possibleValues" : [ "NAME", "VALUE", "NONE", "BOTH" ],
|
||||
"defaultValue" : "BOTH"
|
||||
}, {
|
||||
"name" : "Display Pin #s",
|
||||
"type" : "DisplayNumbers",
|
||||
"possibleValues" : [ "NO", "DIP", "CONNECTOR", "DIP_MIRROR", "CONNECTOR_MIRROR" ],
|
||||
"defaultValue" : "NO"
|
||||
}, {
|
||||
"name" : "Font Size Override",
|
||||
"type" : "Integer"
|
||||
@@ -16607,14 +16554,6 @@
|
||||
"type" : "Orientation",
|
||||
"possibleValues" : [ "DEFAULT", "_90", "_180", "_270" ],
|
||||
"defaultValue" : "DEFAULT"
|
||||
}, {
|
||||
"name" : "Pin Labels",
|
||||
"type" : "DisplayNumbers",
|
||||
"possibleValues" : [ "NO", "NAMES", "DIP", "CONNECTOR", "DIP_MIRROR", "CONNECTOR_MIRROR" ],
|
||||
"defaultValue" : "NAMES"
|
||||
}, {
|
||||
"name" : "Pin Names",
|
||||
"type" : "String"
|
||||
}, {
|
||||
"name" : "Pin Spacing",
|
||||
"type" : "Size",
|
||||
@@ -16637,10 +16576,22 @@
|
||||
"type" : "String"
|
||||
} ],
|
||||
"pinout" : {
|
||||
"drivers" : [ "Pin Labels", "Pins" ],
|
||||
"drivers" : [ "Display Pin #s", "Pins" ],
|
||||
"variants" : [ {
|
||||
"when" : {
|
||||
"Pin Labels" : "NO"
|
||||
"Display Pin #s" : "NO"
|
||||
},
|
||||
"pinCountExpression" : "Pins",
|
||||
"labels" : "sequential",
|
||||
"pinCountSamples" : {
|
||||
"_4" : 4,
|
||||
"_16" : 16,
|
||||
"_28" : 28,
|
||||
"_40" : 40
|
||||
}
|
||||
}, {
|
||||
"when" : {
|
||||
"Display Pin #s" : "DIP"
|
||||
},
|
||||
"pinCountExpression" : "Pins",
|
||||
"labels" : "custom",
|
||||
@@ -16670,67 +16621,7 @@
|
||||
}
|
||||
}, {
|
||||
"when" : {
|
||||
"Pin Labels" : "NAMES"
|
||||
},
|
||||
"pinCountExpression" : "Pins",
|
||||
"labels" : "custom",
|
||||
"pinCountSamples" : {
|
||||
"_4" : 4,
|
||||
"_16" : 16,
|
||||
"_28" : 28,
|
||||
"_40" : 40
|
||||
},
|
||||
"example" : {
|
||||
"when" : {
|
||||
"Pins" : "_4"
|
||||
},
|
||||
"pins" : [ {
|
||||
"i" : 0,
|
||||
"label" : "1"
|
||||
}, {
|
||||
"i" : 1,
|
||||
"label" : "2"
|
||||
}, {
|
||||
"i" : 2,
|
||||
"label" : "4"
|
||||
}, {
|
||||
"i" : 3,
|
||||
"label" : "3"
|
||||
} ]
|
||||
}
|
||||
}, {
|
||||
"when" : {
|
||||
"Pin Labels" : "DIP"
|
||||
},
|
||||
"pinCountExpression" : "Pins",
|
||||
"labels" : "custom",
|
||||
"pinCountSamples" : {
|
||||
"_4" : 4,
|
||||
"_16" : 16,
|
||||
"_28" : 28,
|
||||
"_40" : 40
|
||||
},
|
||||
"example" : {
|
||||
"when" : {
|
||||
"Pins" : "_4"
|
||||
},
|
||||
"pins" : [ {
|
||||
"i" : 0,
|
||||
"label" : "1"
|
||||
}, {
|
||||
"i" : 1,
|
||||
"label" : "2"
|
||||
}, {
|
||||
"i" : 2,
|
||||
"label" : "4"
|
||||
}, {
|
||||
"i" : 3,
|
||||
"label" : "3"
|
||||
} ]
|
||||
}
|
||||
}, {
|
||||
"when" : {
|
||||
"Pin Labels" : "CONNECTOR"
|
||||
"Display Pin #s" : "CONNECTOR"
|
||||
},
|
||||
"pinCountExpression" : "Pins",
|
||||
"labels" : "custom",
|
||||
@@ -16760,7 +16651,7 @@
|
||||
}
|
||||
}, {
|
||||
"when" : {
|
||||
"Pin Labels" : "DIP_MIRROR"
|
||||
"Display Pin #s" : "DIP_MIRROR"
|
||||
},
|
||||
"pinCountExpression" : "Pins",
|
||||
"labels" : "custom",
|
||||
@@ -16790,7 +16681,7 @@
|
||||
}
|
||||
}, {
|
||||
"when" : {
|
||||
"Pin Labels" : "CONNECTOR_MIRROR"
|
||||
"Display Pin #s" : "CONNECTOR_MIRROR"
|
||||
},
|
||||
"pinCountExpression" : "Pins",
|
||||
"labels" : "custom",
|
||||
@@ -17090,8 +16981,6 @@
|
||||
"namePrefix" : "IC",
|
||||
"description" : "Multiwatt package IC typically used for audio amplifiers of high power applications",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"notes" : [ "The leads are staggered in two rows and numbered alternately along the package: pin 1 is the first control point, pins 1, 3, 5, ... form the row bent forward in front of the body, away from the heatsink tab, and pins 2, 4, ... the row that leaves the body from underneath. 'Type' picks the package: Multiwatt 11 for LM3886 or TDA7265, Multiwatt 15 for TDA7293 or TDA7294", "'Pin Names' is a comma-separated list of pin names in pin-number order; a pin without a name is called by its number. Pins named alike up to a trailing '_1', '_2' are one net inside the package", "A datasheet model is a part number such as LM3886 and sets 'Type', 'Pin Names' and 'Value'. Set 'Value' to the same part number together with the model" ],
|
||||
"datasheetModels" : [ "LM3886", "TDA7265", "TDA7293", "TDA7294" ],
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
@@ -17125,14 +17014,6 @@
|
||||
"type" : "Orientation",
|
||||
"possibleValues" : [ "DEFAULT", "_90", "_180", "_270" ],
|
||||
"defaultValue" : "DEFAULT"
|
||||
}, {
|
||||
"name" : "Pin Labels",
|
||||
"type" : "PinLabels",
|
||||
"possibleValues" : [ "NONE", "NAMES", "NUMBERS" ],
|
||||
"defaultValue" : "NAMES"
|
||||
}, {
|
||||
"name" : "Pin Names",
|
||||
"type" : "String"
|
||||
}, {
|
||||
"name" : "Tab",
|
||||
"type" : "Color",
|
||||
@@ -17158,90 +17039,14 @@
|
||||
"when" : {
|
||||
"Type" : "MULTIWATT_11"
|
||||
},
|
||||
"pins" : [ {
|
||||
"i" : 0,
|
||||
"label" : "1"
|
||||
}, {
|
||||
"i" : 1,
|
||||
"label" : "3"
|
||||
}, {
|
||||
"i" : 2,
|
||||
"label" : "5"
|
||||
}, {
|
||||
"i" : 3,
|
||||
"label" : "7"
|
||||
}, {
|
||||
"i" : 4,
|
||||
"label" : "9"
|
||||
}, {
|
||||
"i" : 5,
|
||||
"label" : "11"
|
||||
}, {
|
||||
"i" : 6,
|
||||
"label" : "2"
|
||||
}, {
|
||||
"i" : 7,
|
||||
"label" : "4"
|
||||
}, {
|
||||
"i" : 8,
|
||||
"label" : "6"
|
||||
}, {
|
||||
"i" : 9,
|
||||
"label" : "8"
|
||||
}, {
|
||||
"i" : 10,
|
||||
"label" : "10"
|
||||
} ]
|
||||
"pinCount" : 11,
|
||||
"labels" : "sequential"
|
||||
}, {
|
||||
"when" : {
|
||||
"Type" : "MULTIWATT_15"
|
||||
},
|
||||
"pins" : [ {
|
||||
"i" : 0,
|
||||
"label" : "1"
|
||||
}, {
|
||||
"i" : 1,
|
||||
"label" : "3"
|
||||
}, {
|
||||
"i" : 2,
|
||||
"label" : "5"
|
||||
}, {
|
||||
"i" : 3,
|
||||
"label" : "7"
|
||||
}, {
|
||||
"i" : 4,
|
||||
"label" : "9"
|
||||
}, {
|
||||
"i" : 5,
|
||||
"label" : "11"
|
||||
}, {
|
||||
"i" : 6,
|
||||
"label" : "13"
|
||||
}, {
|
||||
"i" : 7,
|
||||
"label" : "15"
|
||||
}, {
|
||||
"i" : 8,
|
||||
"label" : "2"
|
||||
}, {
|
||||
"i" : 9,
|
||||
"label" : "4"
|
||||
}, {
|
||||
"i" : 10,
|
||||
"label" : "6"
|
||||
}, {
|
||||
"i" : 11,
|
||||
"label" : "8"
|
||||
}, {
|
||||
"i" : 12,
|
||||
"label" : "10"
|
||||
}, {
|
||||
"i" : 13,
|
||||
"label" : "12"
|
||||
}, {
|
||||
"i" : 14,
|
||||
"label" : "14"
|
||||
} ]
|
||||
"pinCount" : 15,
|
||||
"labels" : "sequential"
|
||||
} ]
|
||||
}
|
||||
}, {
|
||||
@@ -17251,8 +17056,7 @@
|
||||
"namePrefix" : "IC",
|
||||
"description" : "Single-in-line package IC",
|
||||
"creationMethod" : "SINGLE_CLICK",
|
||||
"notes" : [ "The first control point is the anchor; with 'Orientation' DEFAULT the pins run straight down from it 'Pin Spacing' apart and the indent is at the anchor's end of the body. The other orientations rotate this around the anchor", "The first control point is pin 1. 'Pin Names' is a comma-separated list of pin names in pin-number order; a pin without a name is called by its number. Pins named alike up to a trailing '_1', '_2' are one net inside the package, while 1IN and 2IN are separate channels", "A datasheet model is a part number such as LA4440 and sets 'Pins', 'Pin Spacing', 'Pin Names' and 'Value'. Set 'Value' to the same part number together with the model" ],
|
||||
"datasheetModels" : [ "LA4440", "LA4485", "LA4425A", "TA7205AP", "TDA1013B", "TDA1010A", "TDA1521A", "TDA7056", "TDA7056A", "BA5406", "BA5417", "BA3121N" ],
|
||||
"notes" : [ "The first control point is the anchor; with 'Orientation' DEFAULT the pins run straight down from it 'Pin Spacing' apart and the indent is at the anchor's end of the body. The other orientations rotate this around the anchor" ],
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
@@ -17291,14 +17095,6 @@
|
||||
"type" : "Orientation",
|
||||
"possibleValues" : [ "DEFAULT", "_90", "_180", "_270" ],
|
||||
"defaultValue" : "DEFAULT"
|
||||
}, {
|
||||
"name" : "Pin Labels",
|
||||
"type" : "PinLabels",
|
||||
"possibleValues" : [ "NONE", "NAMES", "NUMBERS" ],
|
||||
"defaultValue" : "NAMES"
|
||||
}, {
|
||||
"name" : "Pin Names",
|
||||
"type" : "String"
|
||||
}, {
|
||||
"name" : "Pin Spacing",
|
||||
"type" : "Size",
|
||||
@@ -18735,7 +18531,7 @@
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "1px"
|
||||
"defaultValue" : "0.2mm"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
@@ -18836,7 +18632,7 @@
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "1px"
|
||||
"defaultValue" : "0.2mm"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
@@ -18873,7 +18669,7 @@
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "1px"
|
||||
"defaultValue" : "0.2mm"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
|
||||
+19
-20
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"version" : "6.9.0",
|
||||
"version" : "6.10.0",
|
||||
"categories" : {
|
||||
"Boards" : [ {
|
||||
"name" : "Blank Board",
|
||||
@@ -174,6 +174,9 @@
|
||||
}, {
|
||||
"name" : "9V Battery Snap",
|
||||
"className" : "electromechanical.BatterySnap9V"
|
||||
}, {
|
||||
"name" : "Chassis Panel",
|
||||
"className" : "chassis.ChassisPanel"
|
||||
}, {
|
||||
"name" : "Cliff 1/4\" Jack",
|
||||
"className" : "electromechanical.CliffJack1_4"
|
||||
@@ -186,6 +189,12 @@
|
||||
}, {
|
||||
"name" : "DIP Switch",
|
||||
"className" : "electromechanical.DIPSwitch"
|
||||
}, {
|
||||
"name" : "Drill Hole",
|
||||
"className" : "electromechanical.DrillHole"
|
||||
}, {
|
||||
"name" : "Elliptical Cutout",
|
||||
"className" : "chassis.EllipticalCutout"
|
||||
}, {
|
||||
"name" : "Fuse Holder (Panel)",
|
||||
"className" : "electromechanical.FuseHolderPanel"
|
||||
@@ -216,9 +225,15 @@
|
||||
}, {
|
||||
"name" : "Plastic DC Jack",
|
||||
"className" : "electromechanical.PlasticDCJack"
|
||||
}, {
|
||||
"name" : "Polygonal Cutout",
|
||||
"className" : "chassis.PolygonalCutout"
|
||||
}, {
|
||||
"name" : "RCA Jack",
|
||||
"className" : "electromechanical.RCAJack"
|
||||
}, {
|
||||
"name" : "Rectangular Cutout",
|
||||
"className" : "chassis.RectangularCutout"
|
||||
}, {
|
||||
"name" : "Rotary Selector Switch",
|
||||
"className" : "electromechanical.RotarySelectorSwitch"
|
||||
@@ -278,25 +293,6 @@
|
||||
"name" : "Stingray Bass Pickup",
|
||||
"className" : "guitar.StingrayBassPickup"
|
||||
} ],
|
||||
"Hardware" : [ {
|
||||
"name" : "Dial Scale",
|
||||
"className" : "chassis.DialScale"
|
||||
}, {
|
||||
"name" : "Drill Hole",
|
||||
"className" : "electromechanical.DrillHole"
|
||||
}, {
|
||||
"name" : "Elliptical Cutout",
|
||||
"className" : "chassis.EllipticalCutout"
|
||||
}, {
|
||||
"name" : "Enclosure",
|
||||
"className" : "chassis.ChassisPanel"
|
||||
}, {
|
||||
"name" : "Polygonal Cutout",
|
||||
"className" : "chassis.PolygonalCutout"
|
||||
}, {
|
||||
"name" : "Rectangular Cutout",
|
||||
"className" : "chassis.RectangularCutout"
|
||||
} ],
|
||||
"Misc" : [ {
|
||||
"name" : "Auto-Wrap Label",
|
||||
"className" : "misc.WrapLabel"
|
||||
@@ -306,6 +302,9 @@
|
||||
}, {
|
||||
"name" : "Common Node",
|
||||
"className" : "misc.CommonNode"
|
||||
}, {
|
||||
"name" : "Dial Scale",
|
||||
"className" : "chassis.DialScale"
|
||||
}, {
|
||||
"name" : "Image",
|
||||
"className" : "misc.Image"
|
||||
|
||||
@@ -25,7 +25,6 @@ import java.awt.geom.Point2D;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
public class Template {
|
||||
|
||||
@@ -36,8 +35,6 @@ public class Template {
|
||||
@Deprecated
|
||||
private boolean defaultFlag;
|
||||
private LocalDateTime createdOn;
|
||||
// set only on a factory variant that has been withdrawn, which then carries nothing but its name
|
||||
private LocalDateTime deletedOn;
|
||||
|
||||
public Template() {
|
||||
}
|
||||
@@ -85,20 +82,11 @@ public class Template {
|
||||
this.createdOn = createdOn;
|
||||
}
|
||||
|
||||
public LocalDateTime getDeletedOn() {
|
||||
return deletedOn;
|
||||
}
|
||||
|
||||
public void setDeletedOn(LocalDateTime deletedOn) {
|
||||
this.deletedOn = deletedOn;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((createdOn == null) ? 0 : createdOn.hashCode());
|
||||
result = prime * result + ((deletedOn == null) ? 0 : deletedOn.hashCode());
|
||||
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
||||
result = prime * result + ((points == null) ? 0 : points.hashCode());
|
||||
result = prime * result + ((values == null) ? 0 : values.hashCode());
|
||||
@@ -119,9 +107,6 @@ public class Template {
|
||||
return false;
|
||||
} else if (!createdOn.equals(other.createdOn))
|
||||
return false;
|
||||
if (!Objects.equals(deletedOn, other.deletedOn)) {
|
||||
return false;
|
||||
}
|
||||
if (name == null) {
|
||||
if (other.name != null)
|
||||
return false;
|
||||
|
||||
@@ -129,14 +129,6 @@ public @interface ComponentDescriptor {
|
||||
*/
|
||||
int datasheetCreationStepCount() default 0;
|
||||
|
||||
/**
|
||||
* If datasheet is enabled, the column that names the part a row describes. It is what the AI
|
||||
* refers to a model by, while the columns before it only group rows in the toolbox.
|
||||
*
|
||||
* @return index of the model name column
|
||||
*/
|
||||
int datasheetModelColumn() default 0;
|
||||
|
||||
/**
|
||||
* @return true if the component type should not be listed in the palette (toolbox and
|
||||
* component tree), while still being resolvable via
|
||||
|
||||
+1
-1
@@ -142,7 +142,7 @@ public class ChatbotService {
|
||||
plugInPort.getCloudService().getMachineId(), fileName, circuitFile, clientAnalysisFile, prompt);
|
||||
|
||||
// TODO: comment out before the release, responses are logged for testing only
|
||||
// LOG.debug("Raw chatbot response: " + rawResponse);
|
||||
LOG.debug("Raw chatbot response: " + rawResponse);
|
||||
|
||||
if (rawResponse == null || rawResponse.isBlank()) {
|
||||
throw new CloudException(SERVER_ERROR_PLEASE_TRY_AGAIN);
|
||||
|
||||
-13
@@ -52,7 +52,6 @@ import org.diylc.plugins.chatbot.model.AiCatalogIndexEntry;
|
||||
import org.diylc.plugins.chatbot.model.pinout.AiPinout;
|
||||
import org.diylc.presenter.ComparatorFactory;
|
||||
import org.diylc.presenter.ComponentProcessor;
|
||||
import org.diylc.presenter.DatasheetService;
|
||||
import org.diylc.presenter.ReleaseHistory;
|
||||
|
||||
/**
|
||||
@@ -176,18 +175,6 @@ public class ComponentCatalogGenerator {
|
||||
comp.put("notes", notes);
|
||||
}
|
||||
|
||||
// a datasheet lists one row per part, so the model names are the distinct values of its model
|
||||
// column
|
||||
List<String[]> datasheet = ct.getDatasheet();
|
||||
if (datasheet != null) {
|
||||
int column = DatasheetService.getInstance().getModelColumn(ct.getInstanceClass());
|
||||
List<String> models = datasheet.stream()
|
||||
.map(row -> row[column].trim())
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
comp.put("datasheetModels", models);
|
||||
}
|
||||
|
||||
// Extract editable properties
|
||||
try {
|
||||
List<PropertyWrapper> properties = processor.extractProperties(ct.getInstanceClass());
|
||||
|
||||
@@ -118,10 +118,16 @@ public class ComparatorFactory {
|
||||
if (componentZOrderComparator == null) {
|
||||
componentZOrderComparator = new Comparator<IDIYComponent<?>>() {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public int compare(IDIYComponent<?> o1, IDIYComponent<?> o2) {
|
||||
return Double.compare(ComponentProcessor.getInstance().getZOrder(o1),
|
||||
ComponentProcessor.getInstance().getZOrder(o2));
|
||||
ComponentType type1 =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) o1.getClass());
|
||||
ComponentType type2 =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) o2.getClass());
|
||||
return Double.valueOf(type1.getZOrder()).compareTo(type2.getZOrder());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -409,31 +409,6 @@ public class ComponentProcessor {
|
||||
return type.getName();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the z-order (layer) of the component. A {@link CompositeComponent} sits on the lowest
|
||||
* layer among its children rather than the one its class declares: it is drawn as a
|
||||
* single unit, so it takes one place in the stack, and that place has to be under
|
||||
* whatever is later put on top of it. A block of chassis panels therefore stays on the
|
||||
* chassis layer, and a block built from a board, pads and silkscreen text on the board
|
||||
* layer.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public double getZOrder(IDIYComponent<?> component) {
|
||||
if (component instanceof CompositeComponent) {
|
||||
double zOrder = Double.MAX_VALUE;
|
||||
for (IDIYComponent<?> child : ((CompositeComponent) component).getChildComponents()) {
|
||||
zOrder = Math.min(zOrder, getZOrder(child));
|
||||
}
|
||||
if (zOrder < Double.MAX_VALUE) {
|
||||
return zOrder;
|
||||
}
|
||||
}
|
||||
ComponentType type =
|
||||
extractComponentTypeFrom((Class<? extends IDIYComponent<?>>) component.getClass());
|
||||
// internal types without a descriptor do not take part in layering
|
||||
return type == null ? Double.MAX_VALUE : type.getZOrder();
|
||||
}
|
||||
|
||||
public static boolean hasStickyPoint(IDIYComponent<?> c) {
|
||||
for (int i = 0; i < c.getControlPointCount(); i++)
|
||||
if (c.isControlPointSticky(0))
|
||||
|
||||
@@ -31,7 +31,6 @@ import org.apache.log4j.Logger;
|
||||
import org.diylc.common.PropertyWrapper;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.IDatasheetSupport;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
import org.diylc.core.measures.AbstractMeasure;
|
||||
import org.diylc.core.measures.Unit;
|
||||
|
||||
@@ -129,16 +128,6 @@ public class DatasheetService {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param clazz
|
||||
* @return the datasheet column that names the model a row describes, see
|
||||
* {@link ComponentDescriptor#datasheetModelColumn()}.
|
||||
*/
|
||||
public int getModelColumn(Class<?> clazz) {
|
||||
ComponentDescriptor descriptor = clazz.getAnnotation(ComponentDescriptor.class);
|
||||
return descriptor == null ? 0 : descriptor.datasheetModelColumn();
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the rows of a datasheet series by its name, ignoring case. When no series has exactly
|
||||
* that name, every series whose name contains it is returned instead.
|
||||
@@ -152,16 +141,14 @@ public class DatasheetService {
|
||||
if (datasheet == null || series == null || series.isBlank()) {
|
||||
return new ArrayList<String[]>();
|
||||
}
|
||||
int column = getModelColumn(clazz);
|
||||
String name = series.trim();
|
||||
List<String[]> rows = datasheet.stream()
|
||||
.filter(row -> row.length > column && row[column].trim().equalsIgnoreCase(name))
|
||||
.filter(row -> row.length > 0 && row[0].trim().equalsIgnoreCase(name))
|
||||
.collect(Collectors.toList());
|
||||
if (rows.isEmpty()) {
|
||||
String lowerName = name.toLowerCase();
|
||||
rows = datasheet.stream()
|
||||
.filter(row -> row.length > column
|
||||
&& row[column].trim().toLowerCase().contains(lowerName))
|
||||
.filter(row -> row.length > 0 && row[0].trim().toLowerCase().contains(lowerName))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
return rows;
|
||||
@@ -183,7 +170,7 @@ public class DatasheetService {
|
||||
return null;
|
||||
}
|
||||
Object value = component.getValue();
|
||||
if (value == null || (value instanceof String text && text.isBlank())) {
|
||||
if (value == null) {
|
||||
// nothing to preserve, but nothing to choose by either
|
||||
return rows.size() == 1 ? rows.get(0) : null;
|
||||
}
|
||||
|
||||
@@ -94,8 +94,7 @@ public class GroupAndLockIndex {
|
||||
if (componentType == null) {
|
||||
return false;
|
||||
}
|
||||
return project.getLockedLayers()
|
||||
.contains((int) Math.round(ComponentProcessor.getInstance().getZOrder(component)))
|
||||
return project.getLockedLayers().contains((int) Math.round(componentType.getZOrder()))
|
||||
|| project.getLockedComponents().contains(component);
|
||||
}
|
||||
|
||||
|
||||
@@ -494,8 +494,7 @@ public class Presenter implements IPlugInPort {
|
||||
// for internal types
|
||||
if (componentType == null)
|
||||
return true;
|
||||
return !currentProject.getHiddenLayers()
|
||||
.contains((int) Math.round(ComponentProcessor.getInstance().getZOrder(component)));
|
||||
return !currentProject.getHiddenLayers().contains((int) Math.round(componentType.getZOrder()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1077,9 +1076,10 @@ public class Presenter implements IPlugInPort {
|
||||
Iterator<IDIYComponent<?>> i = newSelection.iterator();
|
||||
while (i.hasNext()) {
|
||||
IDIYComponent<?> c = i.next();
|
||||
if ((int) ComponentProcessor.getInstance().getZOrder(c) != layer) {
|
||||
ComponentType type =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom((Class<? extends IDIYComponent<?>>) c.getClass());
|
||||
if ((int) type.getZOrder() != layer)
|
||||
i.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
updateSelection(newSelection);
|
||||
@@ -2229,7 +2229,6 @@ public class Presenter implements IPlugInPort {
|
||||
ComponentType componentType =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) component.getClass());
|
||||
long layer = Math.round(ComponentProcessor.getInstance().getZOrder(component));
|
||||
int index = currentProject.getComponents().indexOf(component);
|
||||
if (index < 0) {
|
||||
LOG.warn("Component not found in the project: " + component.getName());
|
||||
@@ -2237,8 +2236,11 @@ public class Presenter implements IPlugInPort {
|
||||
while (index > 0) {
|
||||
IDIYComponent<?> componentBefore = currentProject.getComponents().get(index - 1);
|
||||
if (!selectedComponents.contains(componentBefore)) {
|
||||
ComponentType componentBeforeType =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) componentBefore.getClass());
|
||||
if (!componentType.isFlexibleZOrder()
|
||||
&& Math.round(ComponentProcessor.getInstance().getZOrder(componentBefore)) < layer
|
||||
&& Math.round(componentBeforeType.getZOrder()) < Math.round(componentType.getZOrder())
|
||||
&& forceConfirmation != IView.YES_OPTION
|
||||
&& (forceConfirmation =
|
||||
this.view
|
||||
@@ -2276,7 +2278,6 @@ public class Presenter implements IPlugInPort {
|
||||
ComponentType componentType =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) component.getClass());
|
||||
long layer = Math.round(ComponentProcessor.getInstance().getZOrder(component));
|
||||
int index = currentProject.getComponents().indexOf(component);
|
||||
if (index < 0) {
|
||||
LOG.warn("Component not found in the project: " + component.getName());
|
||||
@@ -2284,8 +2285,11 @@ public class Presenter implements IPlugInPort {
|
||||
while (index < currentProject.getComponents().size() - 1) {
|
||||
IDIYComponent<?> componentAfter = currentProject.getComponents().get(index + 1);
|
||||
if (!selectedComponents.contains(componentAfter)) {
|
||||
ComponentType componentAfterType =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) componentAfter.getClass());
|
||||
if (!componentType.isFlexibleZOrder()
|
||||
&& Math.round(ComponentProcessor.getInstance().getZOrder(componentAfter)) > layer
|
||||
&& Math.round(componentAfterType.getZOrder()) > Math.round(componentType.getZOrder())
|
||||
&& forceConfirmation != IView.YES_OPTION
|
||||
&& (forceConfirmation =
|
||||
this.view
|
||||
@@ -2680,9 +2684,13 @@ public class Presenter implements IPlugInPort {
|
||||
@SuppressWarnings("unchecked")
|
||||
private void addComponent(IDIYComponent<?> component, boolean allowAutoCreate) {
|
||||
int index = currentProject.getComponents().size();
|
||||
double zOrder = ComponentProcessor.getInstance().getZOrder(component);
|
||||
while (index > 0 && zOrder < ComponentProcessor.getInstance()
|
||||
.getZOrder(currentProject.getComponents().get(index - 1))) {
|
||||
while (index > 0
|
||||
&& ComponentProcessor.getInstance()
|
||||
.extractComponentTypeFrom((Class<? extends IDIYComponent<?>>) component.getClass()).getZOrder() < ComponentProcessor
|
||||
.getInstance()
|
||||
.extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) currentProject.getComponents().get(index - 1).getClass())
|
||||
.getZOrder()) {
|
||||
index--;
|
||||
}
|
||||
if (index < currentProject.getComponents().size()) {
|
||||
@@ -2716,9 +2724,12 @@ public class Presenter implements IPlugInPort {
|
||||
int maxIndex = 0;
|
||||
for (IDIYComponent<?> component : components) {
|
||||
int index = currentProject.getComponents().size();
|
||||
double zOrder = ComponentProcessor.getInstance().getZOrder(component);
|
||||
while (index > maxIndex && zOrder < ComponentProcessor.getInstance()
|
||||
.getZOrder(currentProject.getComponents().get(index - 1))) {
|
||||
while (index > maxIndex && ComponentProcessor.getInstance()
|
||||
.extractComponentTypeFrom((Class<? extends IDIYComponent<?>>) component.getClass())
|
||||
.getZOrder() < ComponentProcessor.getInstance()
|
||||
.extractComponentTypeFrom((Class<? extends IDIYComponent<?>>) currentProject
|
||||
.getComponents().get(index - 1).getClass())
|
||||
.getZOrder()) {
|
||||
index--;
|
||||
}
|
||||
|
||||
@@ -3121,9 +3132,12 @@ public class Presenter implements IPlugInPort {
|
||||
return GroupAndLockIndex.isLocked(currentProject, component);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private boolean isComponentLayerLocked(IDIYComponent<?> component) {
|
||||
return currentProject.getLockedLayers()
|
||||
.contains((int) Math.round(ComponentProcessor.getInstance().getZOrder(component)));
|
||||
ComponentType componentType =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) component.getClass());
|
||||
return currentProject.getLockedLayers().contains((int) Math.round(componentType.getZOrder()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -65,7 +65,6 @@ public class VariantManager {
|
||||
.readObject(IPlugInPort.DEFAULT_TEMPLATES_IMPORT_DATE_KEY, LocalDateTime.MIN);
|
||||
|
||||
int importCount = 0;
|
||||
int deleteCount = 0;
|
||||
|
||||
try {
|
||||
InputStream inputStream = Presenter.class.getResourceAsStream("/" + VARIANTS_FILE_NAME);
|
||||
@@ -90,20 +89,7 @@ public class VariantManager {
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
for (Template variant : entry.getValue()) {
|
||||
// a deletion stub keeps nothing but its name, so a missing createdOn only means an old
|
||||
// entry when the variant has not been deleted
|
||||
boolean created = variant.getCreatedOn() == null ? variant.getDeletedOn() == null
|
||||
: importDate.compareTo(variant.getCreatedOn()) < 0;
|
||||
boolean deleted =
|
||||
variant.getDeletedOn() != null && importDate.compareTo(variant.getDeletedOn()) < 0;
|
||||
// a variant created and deleted since the last import never reached the user, and a
|
||||
// deletion older than the last import was applied then, so a variant the user has since
|
||||
// created under the same name stays
|
||||
if (deleted && !created) {
|
||||
if (existingVariants.removeIf(x -> variant.getName().equals(x.getName()))) {
|
||||
deleteCount++;
|
||||
}
|
||||
} else if (created && variant.getDeletedOn() == null
|
||||
if ((variant.getCreatedOn() == null || importDate.compareTo(variant.getCreatedOn()) < 0)
|
||||
&& !existingNames.contains(variant.getName())) {
|
||||
existingVariants.add(variant);
|
||||
importCount++;
|
||||
@@ -118,9 +104,6 @@ public class VariantManager {
|
||||
if (importCount > 0) {
|
||||
LOG.info(String.format("Imported default %d variants", importCount));
|
||||
}
|
||||
if (deleteCount > 0) {
|
||||
LOG.info(String.format("Deleted %d withdrawn default variants", deleteCount));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
LOG.error("Could not load default variants", e);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,253 @@
|
||||
<java.util.Arrays_-ArrayList>
|
||||
<a class="org.diylc.appframework.update.Version-array">
|
||||
<org.diylc.appframework.update.Version>
|
||||
<versionNumber>
|
||||
<major>5</major>
|
||||
<minor>10</minor>
|
||||
<build>0</build>
|
||||
</versionNumber>
|
||||
<releaseDate>2026-01-20 00:00:00.000 CET</releaseDate>
|
||||
<name></name>
|
||||
<changes>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added 'M' and 'N' potentiometer taper options (thank you mm-rnd)</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added E-C-B BJT pinout to TO-92 transistor package</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Fixed the performance issue that happens when groups of components are copy-pasted and the project size grows uncontrollably</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>All building blocks of the same type get added to the same group</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>'Tactile Micro Switch' editor doesn't show up on double click</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
<org.diylc.appframework.update.Version>
|
||||
<versionNumber>
|
||||
<major>5</major>
|
||||
<minor>11</minor>
|
||||
<build>0</build>
|
||||
</versionNumber>
|
||||
<releaseDate>2026-02-15 00:00:00.000 CET</releaseDate>
|
||||
<name></name>
|
||||
<changes>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added ability to export chat history from 'AI Assistant' to a HTML file</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Upgraded AI models for AI-powered tools and improved overall quality of the responses</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Windows installer prompts for installation folder instead of forcing one</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Shape components shouldn't appear in the BOM</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Improved rendering of 'Switch (Latching)' symbol to clearly make visual contact between the terminals</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Consolidate a few keyboard shortcuts for consistency</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Using "Duplicate Selection" results in duplicates of component ids, breaking Project Explorer panel and causing other issues downstream</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Calculated length disappeared from Hookup Wire and similar curved components</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Resize dimensions do not show for 'Chassis Panel' component when dragging a corner point</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
<org.diylc.appframework.update.Version>
|
||||
<versionNumber>
|
||||
<major>5</major>
|
||||
<minor>12</minor>
|
||||
<build>0</build>
|
||||
</versionNumber>
|
||||
<releaseDate>2026-03-26 00:00:00.000 CET</releaseDate>
|
||||
<name></name>
|
||||
<changes>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added 'Auto-Unit Conversion' configuration which automatically converts between metric and imperial units based on the ruler unit preference</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added a new section in the output of 'AI Circuit Analyzer' which provides insights into the operation of the circuit and individual components</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Better error handling for AI tools</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Pressing the 'Esc' key closes selection editor dialog</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Right click (or two finger tap on mac) after selecting a component with a regular click opens editor dialog in addition to the context menu</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Clicking on a component type in the left-hand component tree sometimes does not register and does not instantiate the component</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
<org.diylc.appframework.update.Version>
|
||||
<versionNumber>
|
||||
<major>5</major>
|
||||
<minor>13</minor>
|
||||
<build>0</build>
|
||||
</versionNumber>
|
||||
<releaseDate>2026-04-07 00:00:00.000 CET</releaseDate>
|
||||
<name></name>
|
||||
<changes>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added new 'Heat Sink Resistor' component with a bunch of factory variants covering the most common types</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added new 'Dial Scale' variations - 'Ticks + Numeric (0/5.5/11)' a'la Friedman and another variation of 'Ticks' with more pronounced 9/12/3 o'clock indices</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added 'Core' property to 'Radial Inductor' component that allows selection between Ferrite and Air core inductor models'</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added 'Envelope' property to tube symbol components which can be used to display one side of the outer envelope dashed indicating section A or section B of a tube</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added more ceramic resistor variants to 'Resistor' component</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Uniformized rendering of components while being dragged</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Ability to blank-out previously populated values for unit-type measures, e.g. resistance, capacitance, dimensions, etc</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Improved data model for storing transparency alpha and other properties that are edited using a slider widget; as a result, the editing is more precise and does not randomly change to neighboring values</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Improved editing experience of integer properties (e.g. number of terminals on a tag strip) by using the spinner text field</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Improved logic when moving component(s) that have other components stuck with them; in case there are non-sticky control points within the included components, they will be moved along retaining component shape (e.g. wires or curved traces)</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Decommission 'Loadline Editor' option from the File menu</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
<org.diylc.appframework.update.Version>
|
||||
<versionNumber>
|
||||
<major>5</major>
|
||||
<minor>14</minor>
|
||||
<build>0</build>
|
||||
</versionNumber>
|
||||
<releaseDate>2026-06-03 00:00:00.000 CET</releaseDate>
|
||||
<name></name>
|
||||
<changes>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added 'Potentiometer (Miniature)' component with two variations - right-angled and vertically mounted</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added 'Thonk 3.5mm Jack' component with two variations - mono switched and stereo</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Enable all types of potentiometers and jacks for guitar diagram analysis</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Increase maximum number of switch combination for analysis to 1024</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>'Line' component set to px used to render slightly thicker than 1px, appearing thicker than schematic symbols; changed to match the thickenss of schematic symbols</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
<org.diylc.appframework.update.Version>
|
||||
<versionNumber>
|
||||
<major>5</major>
|
||||
<minor>15</minor>
|
||||
<build>0</build>
|
||||
</versionNumber>
|
||||
<releaseDate>2026-06-13 00:00:00.000 CET</releaseDate>
|
||||
<name></name>
|
||||
<changes>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Add Freeway Blade switches 3B3-01, 5B5-01, 5B5-02 (thank you Martin Morell)</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>IEC variations of fuse and potentiometer symbols</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Detect the style of a treble bleed based on the topology and component values (e.g. Fender, DiMarzio, Kinman, etc)</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Improved quality of AI Assistant responses in some cases</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Improved precision of rendering, in some cases there was a sub-pixel misalignment between the lines that should meet exactly</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Tone capacitor mistaken for treble bleed when connected to the input lug of the volume pot</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Dragging a component from the component tree to the canvas sometimes does not work as expected without clicking on it first and then dragging it</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>'Schaller Megaswitch' not rendered correctly when rotated for 90 or 270 degrees</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
<org.diylc.appframework.update.Version>
|
||||
<versionNumber>
|
||||
<major>6</major>
|
||||
@@ -414,7 +662,7 @@
|
||||
<minor>9</minor>
|
||||
<build>0</build>
|
||||
</versionNumber>
|
||||
<releaseDate>2026-10-30 00:00:00.000 CET</releaseDate>
|
||||
<releaseDate>2026-10-17 00:00:00.000 CET</releaseDate>
|
||||
<name></name>
|
||||
<changes>
|
||||
<org.diylc.appframework.update.Change>
|
||||
@@ -496,65 +744,5 @@
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
<org.diylc.appframework.update.Version>
|
||||
<versionNumber>
|
||||
<major>6</major>
|
||||
<minor>10</minor>
|
||||
<build>0</build>
|
||||
</versionNumber>
|
||||
<releaseDate>2026-10-30 00:00:00.000 CET</releaseDate>
|
||||
<name></name>
|
||||
<changes>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added 'Pin Names' property to 'DIP IC', 'SIP IC' and 'Multiwatt IC' to name each pin, e.g. 1OUT, 1IN-, VCC+; the names are drawn on the component and used in node tooltips, netlists and AI analysis</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added 'Pin Labels' property to 'SIP IC' and 'Multiwatt IC' to show pin names or pin numbers next to the pins</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Re-modeled factory variants of Resistor component type as datasheet in order to make them available to the AI; this will produce more accurate AI-driven edits</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Derive the z-order of a building blocks placed as a single component based on its child components</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added datasheets to 'DIP IC', 'SIP IC' and 'Multiwatt IC' - pick a part by its number from the component's submenu to set its pin count, spacing and pin names at once - more than 100 chips in total; the AI Assistant can place these parts by part number too</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>'Chassis Panel' is now 'Enclosure' and can draw an exploded view of the whole box; set 'Height' and choose which 'Sides' to unfold</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added a datasheet to 'Enclosure' with Hammond 1590, 1550, 1441 and 1444 enclosures and the 125B size - more than 130 variations</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Moved 'Enclosure', cutouts, 'Drill Hole' and 'Dial Scale' to the new 'Hardware' category</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>'DIP IC' with 'Display Pin #s' set to 'No' numbered its pins in the wrong order in netlists and AI analysis, e.g. pin 8 of an 8-pin IC was reported as pin 5</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>'Multiwatt IC' numbered its pins row by row instead of alternating between the two rows as on the real package</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>'Multiwatt IC' in the Multiwatt 11 package had its leads 1.27mm apart instead of 1.7mm; existing Multiwatt 11 parts change shape when the project is opened</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>'SIP IC' body was drawn too short when 'Pin Spacing' is not a multiple of 0.1 inch, leaving the last pin outside the body</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
</a>
|
||||
</java.util.Arrays_-ArrayList>
|
||||
|
||||
@@ -5325,253 +5325,5 @@
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
<org.diylc.appframework.update.Version>
|
||||
<versionNumber>
|
||||
<major>5</major>
|
||||
<minor>10</minor>
|
||||
<build>0</build>
|
||||
</versionNumber>
|
||||
<releaseDate>2026-01-20 00:00:00.000 CET</releaseDate>
|
||||
<name></name>
|
||||
<changes>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added 'M' and 'N' potentiometer taper options (thank you mm-rnd)</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added E-C-B BJT pinout to TO-92 transistor package</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Fixed the performance issue that happens when groups of components are copy-pasted and the project size grows uncontrollably</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>All building blocks of the same type get added to the same group</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>'Tactile Micro Switch' editor doesn't show up on double click</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
<org.diylc.appframework.update.Version>
|
||||
<versionNumber>
|
||||
<major>5</major>
|
||||
<minor>11</minor>
|
||||
<build>0</build>
|
||||
</versionNumber>
|
||||
<releaseDate>2026-02-15 00:00:00.000 CET</releaseDate>
|
||||
<name></name>
|
||||
<changes>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added ability to export chat history from 'AI Assistant' to a HTML file</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Upgraded AI models for AI-powered tools and improved overall quality of the responses</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Windows installer prompts for installation folder instead of forcing one</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Shape components shouldn't appear in the BOM</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Improved rendering of 'Switch (Latching)' symbol to clearly make visual contact between the terminals</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Consolidate a few keyboard shortcuts for consistency</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Using "Duplicate Selection" results in duplicates of component ids, breaking Project Explorer panel and causing other issues downstream</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Calculated length disappeared from Hookup Wire and similar curved components</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Resize dimensions do not show for 'Chassis Panel' component when dragging a corner point</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
<org.diylc.appframework.update.Version>
|
||||
<versionNumber>
|
||||
<major>5</major>
|
||||
<minor>12</minor>
|
||||
<build>0</build>
|
||||
</versionNumber>
|
||||
<releaseDate>2026-03-26 00:00:00.000 CET</releaseDate>
|
||||
<name></name>
|
||||
<changes>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added 'Auto-Unit Conversion' configuration which automatically converts between metric and imperial units based on the ruler unit preference</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added a new section in the output of 'AI Circuit Analyzer' which provides insights into the operation of the circuit and individual components</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Better error handling for AI tools</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Pressing the 'Esc' key closes selection editor dialog</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Right click (or two finger tap on mac) after selecting a component with a regular click opens editor dialog in addition to the context menu</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Clicking on a component type in the left-hand component tree sometimes does not register and does not instantiate the component</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
<org.diylc.appframework.update.Version>
|
||||
<versionNumber>
|
||||
<major>5</major>
|
||||
<minor>13</minor>
|
||||
<build>0</build>
|
||||
</versionNumber>
|
||||
<releaseDate>2026-04-07 00:00:00.000 CET</releaseDate>
|
||||
<name></name>
|
||||
<changes>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added new 'Heat Sink Resistor' component with a bunch of factory variants covering the most common types</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added new 'Dial Scale' variations - 'Ticks + Numeric (0/5.5/11)' a'la Friedman and another variation of 'Ticks' with more pronounced 9/12/3 o'clock indices</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added 'Core' property to 'Radial Inductor' component that allows selection between Ferrite and Air core inductor models'</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added 'Envelope' property to tube symbol components which can be used to display one side of the outer envelope dashed indicating section A or section B of a tube</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added more ceramic resistor variants to 'Resistor' component</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Uniformized rendering of components while being dragged</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Ability to blank-out previously populated values for unit-type measures, e.g. resistance, capacitance, dimensions, etc</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Improved data model for storing transparency alpha and other properties that are edited using a slider widget; as a result, the editing is more precise and does not randomly change to neighboring values</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Improved editing experience of integer properties (e.g. number of terminals on a tag strip) by using the spinner text field</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Improved logic when moving component(s) that have other components stuck with them; in case there are non-sticky control points within the included components, they will be moved along retaining component shape (e.g. wires or curved traces)</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Decommission 'Loadline Editor' option from the File menu</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
<org.diylc.appframework.update.Version>
|
||||
<versionNumber>
|
||||
<major>5</major>
|
||||
<minor>14</minor>
|
||||
<build>0</build>
|
||||
</versionNumber>
|
||||
<releaseDate>2026-06-03 00:00:00.000 CET</releaseDate>
|
||||
<name></name>
|
||||
<changes>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added 'Potentiometer (Miniature)' component with two variations - right-angled and vertically mounted</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added 'Thonk 3.5mm Jack' component with two variations - mono switched and stereo</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Enable all types of potentiometers and jacks for guitar diagram analysis</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Increase maximum number of switch combination for analysis to 1024</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>'Line' component set to px used to render slightly thicker than 1px, appearing thicker than schematic symbols; changed to match the thickenss of schematic symbols</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
<org.diylc.appframework.update.Version>
|
||||
<versionNumber>
|
||||
<major>5</major>
|
||||
<minor>15</minor>
|
||||
<build>0</build>
|
||||
</versionNumber>
|
||||
<releaseDate>2026-06-13 00:00:00.000 CET</releaseDate>
|
||||
<name></name>
|
||||
<changes>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Add Freeway Blade switches 3B3-01, 5B5-01, 5B5-02 (thank you Martin Morell)</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>IEC variations of fuse and potentiometer symbols</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Detect the style of a treble bleed based on the topology and component values (e.g. Fender, DiMarzio, Kinman, etc)</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Improved quality of AI Assistant responses in some cases</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>IMPROVEMENT</changeType>
|
||||
<description>Improved precision of rendering, in some cases there was a sub-pixel misalignment between the lines that should meet exactly</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Tone capacitor mistaken for treble bleed when connected to the input lug of the volume pot</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>Dragging a component from the component tree to the canvas sometimes does not work as expected without clicking on it first and then dragging it</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>BUG_FIX</changeType>
|
||||
<description>'Schaller Megaswitch' not rendered correctly when rotated for 90 or 270 degrees</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
</changes>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</org.diylc.appframework.update.Version>
|
||||
</a>
|
||||
</java.util.Arrays_-ArrayList>
|
||||
|
||||
-78
@@ -35,12 +35,7 @@ import java.util.UUID;
|
||||
|
||||
import org.diylc.common.Percentage;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
import org.diylc.netlist.Node;
|
||||
import org.diylc.presenter.ComparatorFactory;
|
||||
import org.diylc.presenter.ComponentProcessor;
|
||||
import org.diylc.presenter.GroupAndLockIndex;
|
||||
import org.diylc.serialization.ProjectFileManager;
|
||||
import org.diylc.testcomponents.OnePointTestComponent;
|
||||
import org.diylc.testcomponents.TwoPointTestComponent;
|
||||
@@ -331,77 +326,4 @@ public class CompositeComponentTest {
|
||||
assertNotNull(blank.getChildComponents());
|
||||
assertTrue(blank.getChildComponents().isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void layerOfAChassisOnlyCompositeIsTheChassisLayer() {
|
||||
CompositeComponent composite = customBoard(new ChassisTestComponent(),
|
||||
new ChassisTestComponent());
|
||||
|
||||
assertEquals(IDIYComponent.CHASSIS, ComponentProcessor.getInstance().getZOrder(composite), 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void layerOfAMixedCompositeIsItsLowestChildLayer() {
|
||||
CompositeComponent composite = customBoard(new TextTestComponent(), twoPoint("R1"),
|
||||
new BoardTestComponent());
|
||||
|
||||
assertEquals(IDIYComponent.BOARD, ComponentProcessor.getInstance().getZOrder(composite), 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void layerOfANestedCompositeLooksThroughTheInnerComposite() {
|
||||
CompositeComponent inner = customBoard(new ChassisTestComponent());
|
||||
CompositeComponent outer = customBoard(twoPoint("R1"), inner);
|
||||
|
||||
assertEquals(IDIYComponent.CHASSIS, ComponentProcessor.getInstance().getZOrder(outer), 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void layerOfAChildlessCompositeIsTheDeclaredOne() {
|
||||
assertEquals(IDIYComponent.COMPONENT,
|
||||
ComponentProcessor.getInstance().getZOrder(new CompositeComponent()), 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lockingTheChildLayerLocksTheComposite() {
|
||||
Project project = new Project();
|
||||
CompositeComponent chassis = customBoard(new ChassisTestComponent());
|
||||
project.getComponents().add(chassis);
|
||||
|
||||
project.getLockedLayers().add(IDIYComponent.COMPONENT);
|
||||
assertFalse(GroupAndLockIndex.isLocked(project, chassis));
|
||||
|
||||
project.getLockedLayers().add(IDIYComponent.CHASSIS);
|
||||
assertTrue(GroupAndLockIndex.isLocked(project, chassis));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void compositeSortsByItsChildLayer() {
|
||||
CompositeComponent chassis = customBoard(new ChassisTestComponent());
|
||||
BoardTestComponent board = new BoardTestComponent();
|
||||
|
||||
assertTrue(ComparatorFactory.getInstance().getComponentZOrderComparator().compare(chassis,
|
||||
board) < 0);
|
||||
}
|
||||
|
||||
@ComponentDescriptor(name = "Chassis Test", category = "Test", author = "Test",
|
||||
description = "test", instanceNamePrefix = "CT", zOrder = IDIYComponent.CHASSIS)
|
||||
public static class ChassisTestComponent extends TwoPointTestComponent {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
||||
|
||||
@ComponentDescriptor(name = "Board Test", category = "Test", author = "Test",
|
||||
description = "test", instanceNamePrefix = "BT", zOrder = IDIYComponent.BOARD)
|
||||
public static class BoardTestComponent extends TwoPointTestComponent {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
||||
|
||||
@ComponentDescriptor(name = "Text Test", category = "Test", author = "Test",
|
||||
description = "test", instanceNamePrefix = "TT", zOrder = IDIYComponent.TEXT)
|
||||
public static class TextTestComponent extends TwoPointTestComponent {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,21 +21,17 @@
|
||||
*/
|
||||
package org.diylc.components.chassis;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.AlphaComposite;
|
||||
import java.awt.Composite;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
|
||||
import org.diylc.common.ObjectCache;
|
||||
import org.diylc.components.AbstractTransparentComponent;
|
||||
import org.diylc.components.shapes.AbstractShape;
|
||||
import org.diylc.components.transform.SimpleComponentTransformer;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.IDatasheetSupport;
|
||||
import org.diylc.core.IDrawingObserver;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.VisibilityPolicy;
|
||||
import org.diylc.core.annotations.AiNote;
|
||||
import org.diylc.core.annotations.BomPolicy;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
@@ -43,206 +39,60 @@ import org.diylc.core.annotations.EditableProperty;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
|
||||
@AiNote("The two control points are opposite corners of the enclosure's top panel. With 'Height' above zero the sides are unfolded around it as an exploded view, each as tall as 'Height' and set 'Spacing' apart from it: the front against the top panel's upper edge, the back against its lower edge and, when 'Sides' is All, the left and right sides against its left and right edges. The bottom is never drawn. With 'Sides' set to None, or 'Height' at zero, it is a single flat panel of any size, such as one side of a chassis drawn on its own")
|
||||
@AiNote("The enclosure is not conductive in the netlist: jacks, pots and lugs drawn on it are not joined through it, so chassis ground points must be connected explicitly")
|
||||
@AiNote("A datasheet model is a Hammond enclosure part number such as 1590BB, 1550B or 1444-32, or a generic size such as 125B, and is stored as 'Value'; it sets the top panel to the enclosure's length and width, upright for pedal-sized die-cast boxes up to 125 mm long and horizontal for bigger boxes and amplifier chassis and 'Height' to its wall height. 125B is a generic size sold by several makers; its Hammond equivalent is 1590N1")
|
||||
@ComponentDescriptor(name = "Enclosure", author = "Branislav Stojkovic", category = "Hardware",
|
||||
instanceNamePrefix = "ENC",
|
||||
description = "Top panel of an enclosure or chassis, optionally with its sides unfolded",
|
||||
@AiNote("Each instance is one side of the chassis: an exploded view of a whole chassis takes five panels, while the top, front and back alone take three, which is typical for pedals and amplifiers. The top panel goes in the centre with the front panel against its upper edge and the back panel against its lower edge; in the five-panel view the left side panel goes against its left edge and the right side panel against its right edge")
|
||||
@AiNote("The panel is not conductive in the netlist: jacks, pots and lugs drawn on it are not joined through it, so chassis ground points must be connected explicitly")
|
||||
@ComponentDescriptor(name = "Chassis Panel", author = "Branislav Stojkovic", category = "Electro-Mechanical",
|
||||
instanceNamePrefix = "CP", description = "One side of a chassis, with or withouth rounded edges",
|
||||
zOrder = IDIYComponent.CHASSIS, bomPolicy = BomPolicy.SHOW_ONLY_TYPE_NAME, autoEdit = false,
|
||||
transformer = SimpleComponentTransformer.class, enableDatasheet = true,
|
||||
datasheetCreationStepCount = 2, datasheetModelColumn = 1)
|
||||
public class ChassisPanel extends AbstractTransparentComponent<String>
|
||||
implements IDatasheetSupport {
|
||||
transformer = SimpleComponentTransformer.class)
|
||||
public class ChassisPanel extends AbstractShape {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public static Color COLOR = LIGHT_METAL_COLOR;
|
||||
public static Color BORDER_COLOR = LIGHT_METAL_COLOR.darker();
|
||||
// a new enclosure is a 125B, the most common pedal enclosure, upright as in its datasheet row
|
||||
public static String DEFAULT_MODEL = "125B";
|
||||
public static Size DEFAULT_TOP_WIDTH = new Size(66d, SizeUnit.mm);
|
||||
public static Size DEFAULT_TOP_LENGTH = new Size(122d, SizeUnit.mm);
|
||||
public static Size DEFAULT_WALL_HEIGHT = new Size(36d, SizeUnit.mm);
|
||||
public static Size DEFAULT_RADIUS = new Size(0d, SizeUnit.mm);
|
||||
public static Size DEFAULT_SPACING = new Size(0d, SizeUnit.mm);
|
||||
|
||||
// the fields below up to borderThickness carry the names they had when this class extended
|
||||
// AbstractShape, because old files store them under those names
|
||||
private String value = DEFAULT_MODEL;
|
||||
private Point2D[] controlPoints = new Point2D[] {new Point2D.Double(0, 0), new Point2D.Double(
|
||||
DEFAULT_TOP_WIDTH.convertToPixels(), DEFAULT_TOP_LENGTH.convertToPixels())};
|
||||
private Point2D.Double firstPoint = new Point2D.Double();
|
||||
private Point2D.Double secondPoint = new Point2D.Double();
|
||||
private Color color = COLOR;
|
||||
private Color borderColor = BORDER_COLOR;
|
||||
// no longer used; kept so that old files that store it still load
|
||||
@Deprecated
|
||||
private Size borderThickness;
|
||||
protected Size edgeRadius = DEFAULT_RADIUS;
|
||||
private Size height = DEFAULT_WALL_HEIGHT;
|
||||
private Sides sides = Sides.ALL;
|
||||
private Size spacing = DEFAULT_SPACING;
|
||||
|
||||
protected Size edgeRadius = new Size(0d, SizeUnit.mm);
|
||||
|
||||
public ChassisPanel() {
|
||||
updateCorners();
|
||||
}
|
||||
|
||||
public ChassisPanel(String[] model) {
|
||||
this();
|
||||
|
||||
applyModel(model);
|
||||
}
|
||||
|
||||
// columns: group, model, top panel size along x and along y, wall height. The wall height leaves
|
||||
// out the lid, which is the bottom left out of the view. Pedal-sized boxes are listed upright,
|
||||
// as pedals use them, and the bigger ones horizontal
|
||||
@Override
|
||||
public void applyModel(String[] model) {
|
||||
setValue(model[1]);
|
||||
setHeight(Size.parseSize(model[4]));
|
||||
// the first control point stays put and the top panel keeps the direction it is drawn in
|
||||
Point2D first = controlPoints[0];
|
||||
Point2D second = controlPoints[1];
|
||||
double x = Size.parseSize(model[2]).convertToPixels();
|
||||
double y = Size.parseSize(model[3]).convertToPixels();
|
||||
setControlPoint(new Point2D.Double(first.getX() + (second.getX() < first.getX() ? -x : x),
|
||||
first.getY() + (second.getY() < first.getY() ? -y : y)), 1);
|
||||
}
|
||||
|
||||
private void updateCorners() {
|
||||
firstPoint.setLocation(Math.min(controlPoints[0].getX(), controlPoints[1].getX()),
|
||||
Math.min(controlPoints[0].getY(), controlPoints[1].getY()));
|
||||
secondPoint.setLocation(Math.max(controlPoints[0].getX(), controlPoints[1].getX()),
|
||||
Math.max(controlPoints[0].getY(), controlPoints[1].getY()));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the side panels of the exploded view, folded out from the edges of the top panel:
|
||||
* front, back and then, when all sides are shown, left and right. Empty when no sides are
|
||||
* shown or the enclosure has no height.
|
||||
*/
|
||||
Rectangle2D[] getSidePanels() {
|
||||
double h = getHeight() == null ? 0 : getHeight().convertToPixels();
|
||||
if (h <= 0 || getSides() == Sides.NONE) {
|
||||
return new Rectangle2D[0];
|
||||
}
|
||||
double s = getSpacing() == null ? 0 : getSpacing().convertToPixels();
|
||||
double x = firstPoint.getX();
|
||||
double y = firstPoint.getY();
|
||||
double w = secondPoint.getX() - x;
|
||||
double d = secondPoint.getY() - y;
|
||||
Rectangle2D front = new Rectangle2D.Double(x, y - s - h, w, h);
|
||||
Rectangle2D back = new Rectangle2D.Double(x, y + d + s, w, h);
|
||||
if (getSides() == Sides.FRONT_AND_BACK) {
|
||||
return new Rectangle2D[] {front, back};
|
||||
}
|
||||
return new Rectangle2D[] {front, back, new Rectangle2D.Double(x - s - h, y, h, d),
|
||||
new Rectangle2D.Double(x + w + s, y, h, d)};
|
||||
this.color = LIGHT_METAL_COLOR;
|
||||
this.borderColor = LIGHT_METAL_COLOR.darker();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode,
|
||||
Project project, IDrawingObserver drawingObserver) {
|
||||
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1));
|
||||
int x = (int) Math.round(firstPoint.getX());
|
||||
int y = (int) Math.round(firstPoint.getY());
|
||||
int width = (int) (secondPoint.getX() - firstPoint.getX());
|
||||
int length = (int) (secondPoint.getY() - firstPoint.getY());
|
||||
int radius = (int) getEdgeRadius().convertToPixels();
|
||||
Rectangle2D[] sidePanels = getSidePanels();
|
||||
public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project,
|
||||
IDrawingObserver drawingObserver) {
|
||||
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke((int) borderThickness.convertToPixels()));
|
||||
int radius = (int) edgeRadius.convertToPixels();
|
||||
if (componentState != ComponentState.DRAGGING) {
|
||||
Composite oldComposite = applyAlpha(g2d, componentState);
|
||||
g2d.setColor(color);
|
||||
if (radius == 0) {
|
||||
g2d.fillRect(x, y, width, length);
|
||||
g2d.fillRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
|
||||
(int) (secondPoint.getX() - firstPoint.getX()),
|
||||
(int) (secondPoint.getY() - firstPoint.getY()));
|
||||
} else {
|
||||
g2d.fillRoundRect(x, y, width, length, radius, radius);
|
||||
}
|
||||
for (Rectangle2D panel : sidePanels) {
|
||||
g2d.fill(panel);
|
||||
g2d.fillRoundRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
|
||||
(int) (secondPoint.getX() - firstPoint.getX()),
|
||||
(int) (secondPoint.getY() - firstPoint.getY()), radius, radius);
|
||||
}
|
||||
g2d.setComposite(oldComposite);
|
||||
// the panels drawn so far are the whole area of the enclosure
|
||||
drawingObserver.stopTracking();
|
||||
}
|
||||
g2d.setColor(componentState == ComponentState.SELECTED
|
||||
|| componentState == ComponentState.DRAGGING ? SELECTION_COLOR : borderColor);
|
||||
// Do not track any changes that follow because the whole rect has been
|
||||
// tracked so far.
|
||||
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
|
||||
: borderColor);
|
||||
if (radius == 0) {
|
||||
g2d.drawRect(x, y, width, length);
|
||||
g2d.drawRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
|
||||
(int) (secondPoint.getX() - firstPoint.getX()),
|
||||
(int) (secondPoint.getY() - firstPoint.getY()));
|
||||
} else {
|
||||
g2d.drawRoundRect(x, y, width, length, radius, radius);
|
||||
g2d.drawRoundRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
|
||||
(int) (secondPoint.getX() - firstPoint.getX()),
|
||||
(int) (secondPoint.getY() - firstPoint.getY()), radius, radius);
|
||||
}
|
||||
for (Rectangle2D panel : sidePanels) {
|
||||
g2d.draw(panel);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getControlPointCount() {
|
||||
return controlPoints.length;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Point2D getControlPoint(int index) {
|
||||
return controlPoints[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setControlPoint(Point2D point, int index) {
|
||||
controlPoints[index].setLocation(point);
|
||||
updateCorners();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isControlPointSticky(int index) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VisibilityPolicy getControlPointVisibilityPolicy(int index) {
|
||||
return VisibilityPolicy.WHEN_SELECTED;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getControlPointNodeName(int index) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@EditableProperty
|
||||
@Override
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValue(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Color")
|
||||
public Color getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
public void setColor(Color color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Border")
|
||||
public Color getBorderColor() {
|
||||
return borderColor;
|
||||
}
|
||||
|
||||
public void setBorderColor(Color borderColor) {
|
||||
this.borderColor = borderColor;
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Radius")
|
||||
public Size getEdgeRadius() {
|
||||
if (edgeRadius == null) {
|
||||
edgeRadius = DEFAULT_RADIUS;
|
||||
}
|
||||
return edgeRadius;
|
||||
}
|
||||
|
||||
@@ -250,70 +100,12 @@ public class ChassisPanel extends AbstractTransparentComponent<String>
|
||||
this.edgeRadius = edgeRadius;
|
||||
}
|
||||
|
||||
@EditableProperty
|
||||
public Size getHeight() {
|
||||
return height;
|
||||
}
|
||||
|
||||
public void setHeight(Size height) {
|
||||
this.height = height;
|
||||
}
|
||||
|
||||
@EditableProperty
|
||||
public Sides getSides() {
|
||||
if (sides == null) {
|
||||
sides = Sides.ALL;
|
||||
}
|
||||
return sides;
|
||||
}
|
||||
|
||||
public void setSides(Sides sides) {
|
||||
this.sides = sides;
|
||||
}
|
||||
|
||||
@EditableProperty
|
||||
public Size getSpacing() {
|
||||
if (spacing == null) {
|
||||
spacing = DEFAULT_SPACING;
|
||||
}
|
||||
return spacing;
|
||||
}
|
||||
|
||||
public void setSpacing(Size spacing) {
|
||||
this.spacing = spacing;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawIcon(Graphics2D g2d, int width, int height) {
|
||||
int factor = 32 / width;
|
||||
int flap = 6 / factor;
|
||||
int left = 2 / factor + flap;
|
||||
int top = 2 / factor + flap;
|
||||
int topWidth = width - 2 * left;
|
||||
int topHeight = height - 2 * top;
|
||||
int[][] panels = {{left, top, topWidth, topHeight}, {left, top - flap, topWidth, flap},
|
||||
{left, top + topHeight, topWidth, flap}, {left - flap, top, flap, topHeight},
|
||||
{left + topWidth, top, flap, topHeight}};
|
||||
for (int[] panel : panels) {
|
||||
g2d.setColor(LIGHT_METAL_COLOR);
|
||||
g2d.fillRect(panel[0], panel[1], panel[2], panel[3]);
|
||||
g2d.setColor(LIGHT_METAL_COLOR.darker());
|
||||
g2d.drawRect(panel[0], panel[1], panel[2], panel[3]);
|
||||
}
|
||||
}
|
||||
|
||||
public enum Sides {
|
||||
ALL("All"), FRONT_AND_BACK("Front and Back"), NONE("None");
|
||||
|
||||
private final String label;
|
||||
|
||||
Sides(String label) {
|
||||
this.label = label;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return label;
|
||||
}
|
||||
g2d.setColor(LIGHT_METAL_COLOR);
|
||||
g2d.fillRect(2 / factor, 4 / factor, width - 4 / factor, height - 8 / factor);
|
||||
g2d.setColor(LIGHT_METAL_COLOR.darker());
|
||||
g2d.drawRect(2 / factor, 4 / factor, width - 4 / factor, height - 8 / factor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ import org.diylc.core.annotations.EditableProperty;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
|
||||
@ComponentDescriptor(name = "Dial Scale", author = "Branislav Stojkovic", category = "Hardware",
|
||||
@ComponentDescriptor(name = "Dial Scale", author = "Branislav Stojkovic", category = "Misc",
|
||||
instanceNamePrefix = "DS", description = "Control panel dial scale", zOrder = IDIYComponent.CHASSIS + 0.1,
|
||||
bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, transformer = SimpleComponentTransformer.class)
|
||||
public class DialScale extends AbstractComponent<String> {
|
||||
|
||||
+1
-1
@@ -31,7 +31,7 @@ import org.diylc.core.Project;
|
||||
import org.diylc.core.annotations.BomPolicy;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
|
||||
@ComponentDescriptor(name = "Elliptical Cutout", author = "Branislav Stojkovic", category = "Hardware",
|
||||
@ComponentDescriptor(name = "Elliptical Cutout", author = "Branislav Stojkovic", category = "Electro-Mechanical",
|
||||
instanceNamePrefix = "ELC", description = "Elliptical chassis cutout", zOrder = IDIYComponent.CHASSIS + 0.1,
|
||||
bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, transformer = SimpleComponentTransformer.class)
|
||||
public class EllipticalCutout extends AbstractShape {
|
||||
|
||||
@@ -35,7 +35,7 @@ import org.diylc.core.annotations.BomPolicy;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
import org.diylc.core.annotations.EditableProperty;
|
||||
|
||||
@ComponentDescriptor(name = "Polygonal Cutout", author = "Branislav Stojkovic", category = "Hardware",
|
||||
@ComponentDescriptor(name = "Polygonal Cutout", author = "Branislav Stojkovic", category = "Electro-Mechanical",
|
||||
instanceNamePrefix = "POLYC", description = "Polygonal chassis cutout", zOrder = IDIYComponent.CHASSIS + 0.1,
|
||||
bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, transformer = SimpleComponentTransformer.class)
|
||||
public class PolygonalCutout extends AbstractShape {
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ import org.diylc.core.annotations.EditableProperty;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
|
||||
@ComponentDescriptor(name = "Rectangular Cutout", author = "Branislav Stojkovic", category = "Hardware",
|
||||
@ComponentDescriptor(name = "Rectangular Cutout", author = "Branislav Stojkovic", category = "Electro-Mechanical",
|
||||
instanceNamePrefix = "RECTC", description = "Rectangular chassis cutout, with or without rounded edges",
|
||||
zOrder = IDIYComponent.CHASSIS + 0.1, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false,
|
||||
transformer = SimpleComponentTransformer.class)
|
||||
|
||||
+1
-1
@@ -43,7 +43,7 @@ import org.diylc.core.gerber.IGerberDrawingObserver;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
|
||||
@ComponentDescriptor(name = "Drill Hole", category = "Hardware", author = "Branislav Stojkovic",
|
||||
@ComponentDescriptor(name = "Drill Hole", category = "Electro-Mechanical", author = "Branislav Stojkovic",
|
||||
description = "Drill hole marker for PCB, chassis or faceplate", instanceNamePrefix = "Hole",
|
||||
zOrder = IDIYComponent.BOARD + 0.1, bomPolicy = BomPolicy.NEVER_SHOW,
|
||||
keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "PCB",
|
||||
|
||||
@@ -37,7 +37,6 @@ import org.diylc.components.AbstractLeadedComponent;
|
||||
import org.diylc.components.transform.SimpleComponentTransformer;
|
||||
import org.diylc.core.CreationMethod;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.IDatasheetSupport;
|
||||
import org.diylc.core.annotations.AiNote;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
import org.diylc.core.annotations.EditableProperty;
|
||||
@@ -49,13 +48,10 @@ import org.diylc.core.measures.SizeUnit;
|
||||
|
||||
@AiNote("The two control points are the holes the leads go into and the body is centred between them; 'Length' is the body length, not the hole spacing")
|
||||
@AiNote("If the control points are closer together than 'Length' (0.5in by default) the part is drawn standing, its body over the first point; to keep it lying on a tighter footprint, reduce 'Length'")
|
||||
@AiNote("A datasheet model sets the body size, shape and colors of a resistor family at one power rating but never the resistance; set 'Power Rating' together with the model to pick the matching size")
|
||||
@ComponentDescriptor(name = "Resistor", author = "Branislav Stojkovic", category = "Passive",
|
||||
creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "R", description = "Resistor layout symbol",
|
||||
zOrder = IDIYComponent.COMPONENT, transformer = SimpleComponentTransformer.class, enableCache = true,
|
||||
enableDatasheet = true, datasheetCreationStepCount = 2)
|
||||
public class Resistor extends AbstractLeadedComponent<Resistance>
|
||||
implements IGerberComponentSimple, IDatasheetSupport {
|
||||
zOrder = IDIYComponent.COMPONENT, transformer = SimpleComponentTransformer.class, enableCache = true)
|
||||
public class Resistor extends AbstractLeadedComponent<Resistance> implements IGerberComponentSimple {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -79,41 +75,6 @@ public class Resistor extends AbstractLeadedComponent<Resistance>
|
||||
this.borderColor = BORDER_COLOR;
|
||||
}
|
||||
|
||||
public Resistor(String[] model) {
|
||||
this();
|
||||
|
||||
applyModel(model);
|
||||
}
|
||||
|
||||
// columns: family, power, body length, body width, shape, color code, body color, border color;
|
||||
// the resistance is not part of a row because the body size depends only on family and power
|
||||
@Override
|
||||
public void applyModel(String[] model) {
|
||||
setPowerNew(org.diylc.core.measures.Power.parseCapacitance(model[1]));
|
||||
setLength(parseDatasheetSize(model[2]));
|
||||
setWidth(parseDatasheetSize(model[3]));
|
||||
setShape(parseDatasheetEnum(ResistorShape.values(), model[4]));
|
||||
setColorCode(parseDatasheetEnum(ResistorColorCode.values(), model[5]));
|
||||
setBodyColor(Color.decode(model[6]));
|
||||
setBorderColor(Color.decode(model[7]));
|
||||
}
|
||||
|
||||
// sizes are in mm unless a unit follows the number, as some families are specified in inches
|
||||
private static Size parseDatasheetSize(String value) {
|
||||
String[] parts = value.split(" ");
|
||||
SizeUnit unit = parts.length > 1 ? SizeUnit.valueOf(parts[1]) : SizeUnit.mm;
|
||||
return new Size(Double.parseDouble(parts[0]), unit);
|
||||
}
|
||||
|
||||
private static <E extends Enum<E>> E parseDatasheetEnum(E[] values, String name) {
|
||||
for (E value : values) {
|
||||
if (value.toString().equalsIgnoreCase(name)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("Unknown datasheet value: " + name);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean supportsStandingMode() {
|
||||
return true;
|
||||
|
||||
+39
-136
@@ -30,22 +30,16 @@ import java.awt.geom.Ellipse2D;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.geom.RoundRectangle2D;
|
||||
import java.util.Arrays;
|
||||
import org.diylc.appframework.miscutils.ConfigurationManager;
|
||||
|
||||
import org.diylc.awt.StringUtils;
|
||||
import org.diylc.common.Display;
|
||||
import org.diylc.common.HorizontalAlignment;
|
||||
import org.diylc.common.IPlugInPort;
|
||||
import org.diylc.common.ObjectCache;
|
||||
import org.diylc.common.Orientation;
|
||||
import org.diylc.common.VerticalAlignment;
|
||||
import org.diylc.components.AbstractLabeledComponent;
|
||||
import org.diylc.components.AbstractMakerBoard;
|
||||
import org.diylc.components.transform.DIL_ICTransformer;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.IDatasheetSupport;
|
||||
import org.diylc.core.IDrawingObserver;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.Theme;
|
||||
@@ -61,15 +55,11 @@ import org.diylc.core.measures.SizeUnit;
|
||||
import org.diylc.utils.Constants;
|
||||
|
||||
@AiNote("The first control point is the anchor; with 'Orientation' DEFAULT the first row of pins runs down from it 'Pin Spacing' apart, the second row sits 'Row Spacing' to the right and the notch is at the anchor's end. The other orientations rotate this around the anchor")
|
||||
@AiNote("'Pin Names' is a comma-separated list of pin names in pin-number order, starting with pin 1 next to the notch; a pin without a name is called by its number. Pins named alike up to a trailing '_1', '_2' are one net inside the package, e.g. GND_1 and GND_2, while 1IN- and 2IN- are inputs of two separate sections")
|
||||
@AiNote("A datasheet model is a part number such as TL072 or NE555 and sets 'Pins', 'Row Spacing', 'Pin Names' and 'Value'. Set 'Value' to the same part number together with the model")
|
||||
@ComponentDescriptor(name = "DIP IC", author = "Branislav Stojkovic", category = "Semiconductors",
|
||||
instanceNamePrefix = "IC", description = "Dual-in-line package IC",
|
||||
zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE,
|
||||
transformer = DIL_ICTransformer.class, enableCache = true, enableDatasheet = true,
|
||||
datasheetCreationStepCount = 2, datasheetModelColumn = 1)
|
||||
public class DIL_IC extends AbstractLabeledComponent<String>
|
||||
implements IGerberComponentSimple, IDatasheetSupport {
|
||||
transformer = DIL_ICTransformer.class, enableCache = true)
|
||||
public class DIL_IC extends AbstractLabeledComponent<String> implements IGerberComponentSimple {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -82,9 +72,7 @@ public class DIL_IC extends AbstractLabeledComponent<String>
|
||||
public static int EDGE_RADIUS = 6;
|
||||
public static Size PIN_SIZE = new Size(0.04d, SizeUnit.in);
|
||||
public static Size INDENT_SIZE = new Size(0.07d, SizeUnit.in);
|
||||
public static DisplayNumbers DISPLAY_NUMBERS = DisplayNumbers.NAMES;
|
||||
// the smaller font lets names sit closer to their pins than on a maker board
|
||||
public static Size PIN_NAME_OFFSET = new Size(1.35d, SizeUnit.mm);
|
||||
public static DisplayNumbers DISPLAY_NUMBERS = DisplayNumbers.NO;
|
||||
|
||||
private String value = "";
|
||||
private Orientation orientation = Orientation.DEFAULT;
|
||||
@@ -98,7 +86,6 @@ public class DIL_IC extends AbstractLabeledComponent<String>
|
||||
private Color labelColor = LABEL_COLOR;
|
||||
private Color indentColor = INDENT_COLOR;
|
||||
private DisplayNumbers displayNumbers = DISPLAY_NUMBERS;
|
||||
private String pinNames = null;
|
||||
// new Point(0, pinSpacing.convertToPixels()),
|
||||
// new Point(0, 2 * pinSpacing.convertToPixels()),
|
||||
// new Point(0, 3 * pinSpacing.convertToPixels()),
|
||||
@@ -110,29 +97,12 @@ public class DIL_IC extends AbstractLabeledComponent<String>
|
||||
// new Point(3 * pinSpacing.convertToPixels(), 3 *
|
||||
// pinSpacing.convertToPixels()) };
|
||||
transient private Area[] body;
|
||||
transient private String[] parsedPinNames;
|
||||
|
||||
public DIL_IC() {
|
||||
super();
|
||||
updateControlPoints();
|
||||
}
|
||||
|
||||
public DIL_IC(String[] model) {
|
||||
this();
|
||||
|
||||
applyModel(model);
|
||||
}
|
||||
|
||||
// columns: group, part number, row spacing, then one name per pin in pin-number order, so the
|
||||
// pin count is the number of names
|
||||
@Override
|
||||
public void applyModel(String[] model) {
|
||||
setValue(model[1]);
|
||||
setRowSpacing(Size.parseSize(model[2]));
|
||||
setPinCount(PinCount.valueOf("_" + (model.length - 3)));
|
||||
setPinNames(String.join(",", Arrays.copyOfRange(model, 3, model.length)));
|
||||
}
|
||||
|
||||
@EditableProperty
|
||||
public String getValue() {
|
||||
return value;
|
||||
@@ -455,14 +425,9 @@ public class DIL_IC extends AbstractLabeledComponent<String>
|
||||
}
|
||||
}
|
||||
|
||||
if (getDisplayNumbers() == DisplayNumbers.NAMES) {
|
||||
drawPinNames(g2d);
|
||||
}
|
||||
|
||||
// draw pin numbers
|
||||
if (getDisplayNumbers() != DisplayNumbers.NO && getDisplayNumbers() != DisplayNumbers.NAMES) {
|
||||
if (getDisplayNumbers() != DisplayNumbers.NO) {
|
||||
int pinSize = (int) PIN_SIZE.convertToPixels();
|
||||
g2d.setFont(project.getFont().deriveFont((float) (project.getFont().getSize2D() * 0.66)));
|
||||
|
||||
for (int i = 0; i < controlPoints.length; i++) {
|
||||
Point2D point = controlPoints[i];
|
||||
@@ -489,68 +454,16 @@ public class DIL_IC extends AbstractLabeledComponent<String>
|
||||
textY2 = textY2 - pinSize;
|
||||
}
|
||||
|
||||
String pinNumber = Integer.toString(getPinNumber(i));
|
||||
g2d.setFont(project.getFont().deriveFont((float) (project.getFont().getSize2D() * 0.66)));
|
||||
if (i >= pinCount.getValue() / 2) {
|
||||
g2d.drawString(pinNumber, textX1, textY1);
|
||||
g2d.drawString(getControlPointNodeName(i), textX1, textY1);
|
||||
} else {
|
||||
g2d.drawString(pinNumber, textX2, textY2);
|
||||
g2d.drawString(getControlPointNodeName(i), textX2, textY2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Names are printed the way maker boards print theirs: centred just inside the body from their
|
||||
// pin and running along the row, which leaves the middle of even a 0.3 in body to the name/value
|
||||
// label. Each name has one pin pitch along the row, so a name that would touch the previous one
|
||||
// in its row or run past the end of the body is left out rather than overprinted.
|
||||
private void drawPinNames(Graphics2D g2d) {
|
||||
g2d.setFont(ICPinNames.PIN_NAME_FONT);
|
||||
FontMetrics fontMetrics = g2d.getFontMetrics(ICPinNames.PIN_NAME_FONT);
|
||||
double labelOffset = PIN_NAME_OFFSET.convertToPixels();
|
||||
double pitch = pinSpacing.convertToPixels();
|
||||
int half = pinCount.getValue() / 2;
|
||||
Point2D firstRow = controlPoints[0];
|
||||
Point2D secondRow = controlPoints[half];
|
||||
double rowDistance = firstRow.distance(secondRow);
|
||||
double acrossX = (secondRow.getX() - firstRow.getX()) / rowDistance;
|
||||
double acrossY = (secondRow.getY() - firstRow.getY()) / rowDistance;
|
||||
boolean rowsVertical = Math.abs(acrossX) > Math.abs(acrossY);
|
||||
// along the row the body reaches half a pitch past the first and the last pin
|
||||
double bodyStart = -pitch / 2 + 1;
|
||||
double bodyEnd = (half - 0.5) * pitch - 1;
|
||||
double previousEnd = bodyStart - ICPinNames.PIN_NAME_GAP;
|
||||
|
||||
for (int i = 0; i < controlPoints.length; i++) {
|
||||
if (i == half) {
|
||||
previousEnd = bodyStart - ICPinNames.PIN_NAME_GAP;
|
||||
}
|
||||
String name = getPinName(getPinNumber(i));
|
||||
if (name == null) {
|
||||
continue;
|
||||
}
|
||||
String label = AbstractMakerBoard.getDisplayPinLabel(name);
|
||||
double alongRow = (i % half) * pitch;
|
||||
double halfWidth = fontMetrics.stringWidth(label) / 2d;
|
||||
if (alongRow - halfWidth < previousEnd + ICPinNames.PIN_NAME_GAP || alongRow + halfWidth > bodyEnd) {
|
||||
continue;
|
||||
}
|
||||
previousEnd = alongRow + halfWidth;
|
||||
double dirX = i < half ? acrossX : -acrossX;
|
||||
double dirY = i < half ? acrossY : -acrossY;
|
||||
double x = controlPoints[i].getX() + dirX * labelOffset;
|
||||
double y = controlPoints[i].getY() + dirY * labelOffset;
|
||||
AffineTransform oldTransform = g2d.getTransform();
|
||||
// the two rows are mirrored so each name reads away from its pin, as on a maker board; rows
|
||||
// that run horizontally keep their names level so that neither reads upside down
|
||||
if (rowsVertical) {
|
||||
g2d.rotate(dirX > 0 ? Math.PI / 2 : -Math.PI / 2, x, y);
|
||||
}
|
||||
StringUtils.drawCenteredText(g2d, label, x, y, HorizontalAlignment.CENTER,
|
||||
VerticalAlignment.CENTER);
|
||||
g2d.setTransform(oldTransform);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawIcon(Graphics2D g2d, int width, int height) {
|
||||
int radius = 6 * width / 32;
|
||||
@@ -614,7 +527,7 @@ public class DIL_IC extends AbstractLabeledComponent<String>
|
||||
this.indentColor = indentColor;
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Pin Labels")
|
||||
@EditableProperty(name = "Display Pin #s")
|
||||
public DisplayNumbers getDisplayNumbers() {
|
||||
if (displayNumbers == null) {
|
||||
displayNumbers = DisplayNumbers.NO;
|
||||
@@ -626,42 +539,6 @@ public class DIL_IC extends AbstractLabeledComponent<String>
|
||||
this.displayNumbers = numbers;
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Pin Names")
|
||||
public String getPinNames() {
|
||||
return pinNames;
|
||||
}
|
||||
|
||||
public void setPinNames(String pinNames) {
|
||||
this.pinNames = pinNames;
|
||||
parsedPinNames = null;
|
||||
}
|
||||
|
||||
// the physical pin number of a control point; control points run down the first row and then
|
||||
// down the second, whereas DIP numbering comes back up the second row
|
||||
private int getPinNumber(int index) {
|
||||
int pinCount = this.pinCount.getValue();
|
||||
int half = pinCount / 2;
|
||||
int position = index + 1;
|
||||
boolean secondRow = position > half;
|
||||
switch (getDisplayNumbers()) {
|
||||
case CONNECTOR:
|
||||
return secondRow ? 2 * (position - half) : 2 * position - 1;
|
||||
case DIP_MIRROR:
|
||||
return secondRow ? position - half : pinCount - position + 1;
|
||||
case CONNECTOR_MIRROR:
|
||||
return secondRow ? 2 * (position - half) - 1 : 2 * position;
|
||||
default:
|
||||
return secondRow ? pinCount + half - position + 1 : position;
|
||||
}
|
||||
}
|
||||
|
||||
private String getPinName(int pinNumber) {
|
||||
if (parsedPinNames == null) {
|
||||
parsedPinNames = ICPinNames.parse(getPinNames());
|
||||
}
|
||||
return ICPinNames.get(parsedPinNames, pinNumber);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPointMoveFreely(int pointIndex) {
|
||||
return false;
|
||||
@@ -692,9 +569,35 @@ public class DIL_IC extends AbstractLabeledComponent<String>
|
||||
|
||||
@Override
|
||||
public String getControlPointNodeName(int index) {
|
||||
int pinNumber = getPinNumber(index);
|
||||
String name = getPinName(pinNumber);
|
||||
return name == null ? Integer.toString(pinNumber) : name;
|
||||
index++;
|
||||
|
||||
if (displayNumbers == DisplayNumbers.DIP) {
|
||||
if (index > pinCount.getValue() / 2) {
|
||||
return Integer.toString(pinCount.getValue() * 3 / 2 - index + 1);
|
||||
} else {
|
||||
return Integer.toString(index);
|
||||
}
|
||||
} else if (displayNumbers == DisplayNumbers.CONNECTOR) {
|
||||
if (index > pinCount.getValue() / 2) {
|
||||
return Integer.toString(index - pinCount.getValue() + index);
|
||||
} else {
|
||||
return Integer.toString(index * 2 - 1);
|
||||
}
|
||||
} else if (displayNumbers == DisplayNumbers.DIP_MIRROR) {
|
||||
if (index > pinCount.getValue() / 2) {
|
||||
return Integer.toString((index - pinCount.getValue() / 2));
|
||||
} else {
|
||||
return Integer.toString(pinCount.getValue() - index + 1);
|
||||
}
|
||||
} else if (displayNumbers == DisplayNumbers.CONNECTOR_MIRROR) {
|
||||
if (index > pinCount.getValue() / 2) {
|
||||
return Integer.toString(index - pinCount.getValue() + index - 1);
|
||||
} else {
|
||||
return Integer.toString(2 * index);
|
||||
}
|
||||
}
|
||||
|
||||
return Integer.toString(index);
|
||||
}
|
||||
|
||||
public static enum PinCount {
|
||||
@@ -713,8 +616,8 @@ public class DIL_IC extends AbstractLabeledComponent<String>
|
||||
|
||||
public enum DisplayNumbers {
|
||||
|
||||
NO("None"), NAMES("Names"), DIP("DIP"), CONNECTOR("Connector"), DIP_MIRROR("DIP (Mirrored)"),
|
||||
CONNECTOR_MIRROR("Connector (Mirrored)");
|
||||
NO("No"), DIP("DIP"), CONNECTOR("Connector"), DIP_MIRROR("DIP (Mirrored)"), CONNECTOR_MIRROR(
|
||||
"Connector (Mirrored)");
|
||||
|
||||
private String label;
|
||||
|
||||
|
||||
-100
@@ -1,100 +0,0 @@
|
||||
/*
|
||||
|
||||
DIY Layout Creator (DIYLC).
|
||||
Copyright (c) 2009-2025 held jointly by the individual authors.
|
||||
|
||||
This file is part of DIYLC.
|
||||
|
||||
DIYLC is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
DIYLC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
package org.diylc.components.semiconductors;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.FontMetrics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
|
||||
import org.diylc.components.AbstractMakerBoard;
|
||||
|
||||
/**
|
||||
* Pin names shared by the IC packages. A package keeps its names as one comma-separated string in
|
||||
* pin-number order, pin 1 first, so the names survive a change of pin count and read back as typed.
|
||||
*/
|
||||
public final class ICPinNames {
|
||||
|
||||
// a size below the maker boards' pin font, as IC pin names are longer than a board's silkscreen
|
||||
// and get only one pin pitch each
|
||||
public static Font PIN_NAME_FONT = new Font(AbstractMakerBoard.SILK_FONT_FAMILY, Font.PLAIN, 6);
|
||||
public static int PIN_NAME_GAP = 2;
|
||||
|
||||
private ICPinNames() {}
|
||||
|
||||
public static String[] parse(String pinNames) {
|
||||
return pinNames == null ? new String[0] : pinNames.split(",", -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param names names as returned by {@link #parse(String)}
|
||||
* @param pinNumber 1-based pin number
|
||||
* @return the trimmed name of the pin, or null if it has none
|
||||
*/
|
||||
public static String get(String[] names, int pinNumber) {
|
||||
if (pinNumber < 1 || pinNumber > names.length) {
|
||||
return null;
|
||||
}
|
||||
String name = names[pinNumber - 1].trim();
|
||||
return name.isEmpty() ? null : name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a pin label outside the package, starting just beyond whichever reaches further in the
|
||||
* given direction, the body or the pin itself, and reading away from the package. The direction
|
||||
* is one of the four axis directions; text pointing left or down is right-aligned so that it never
|
||||
* reads upside down.
|
||||
*
|
||||
* @param pin the pin the label belongs to
|
||||
* @param dirX x component of the unit direction away from the package
|
||||
* @param dirY y component of the unit direction away from the package
|
||||
* @param bodyBounds bounds of the package body
|
||||
* @param pinRadius half the drawn pin size
|
||||
*/
|
||||
public static void drawOutside(Graphics2D g2d, String text, Point2D pin, double dirX, double dirY,
|
||||
Rectangle2D bodyBounds, double pinRadius) {
|
||||
boolean horizontal = Math.abs(dirX) > Math.abs(dirY);
|
||||
double pinReach = (horizontal ? pin.getX() * dirX : pin.getY() * dirY) + pinRadius;
|
||||
double bodyReach = horizontal ? (dirX > 0 ? bodyBounds.getMaxX() : -bodyBounds.getMinX())
|
||||
: (dirY > 0 ? bodyBounds.getMaxY() : -bodyBounds.getMinY());
|
||||
double start = Math.max(pinReach, bodyReach) + PIN_NAME_GAP;
|
||||
double x = horizontal ? start * dirX : pin.getX();
|
||||
double y = horizontal ? pin.getY() : start * dirY;
|
||||
|
||||
FontMetrics fontMetrics = g2d.getFontMetrics();
|
||||
int width = fontMetrics.stringWidth(text);
|
||||
float baseline = (fontMetrics.getAscent() - fontMetrics.getDescent()) / 2f;
|
||||
AffineTransform oldTransform = g2d.getTransform();
|
||||
g2d.translate(x, y);
|
||||
double forward;
|
||||
if (horizontal) {
|
||||
forward = dirX;
|
||||
} else {
|
||||
g2d.rotate(-Math.PI / 2);
|
||||
forward = -dirY;
|
||||
}
|
||||
g2d.drawString(text, forward > 0 ? 0 : -width, baseline);
|
||||
g2d.setTransform(oldTransform);
|
||||
}
|
||||
}
|
||||
+113
-220
@@ -30,20 +30,16 @@ import java.awt.Rectangle;
|
||||
import java.awt.geom.Area;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.util.Arrays;
|
||||
import org.diylc.appframework.miscutils.ConfigurationManager;
|
||||
|
||||
import org.diylc.common.*;
|
||||
import org.diylc.components.AbstractMakerBoard;
|
||||
import org.diylc.components.AbstractTransparentComponent;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.IDatasheetSupport;
|
||||
import org.diylc.core.IDrawingObserver;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.Theme;
|
||||
import org.diylc.core.VisibilityPolicy;
|
||||
import org.diylc.core.annotations.AiNote;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
import org.diylc.core.annotations.EditableProperty;
|
||||
import org.diylc.core.annotations.KeywordPolicy;
|
||||
@@ -52,16 +48,11 @@ import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
import org.diylc.utils.Constants;
|
||||
|
||||
@AiNote("The leads are staggered in two rows and numbered alternately along the package: pin 1 is the first control point, pins 1, 3, 5, ... form the row bent forward in front of the body, away from the heatsink tab, and pins 2, 4, ... the row that leaves the body from underneath. 'Type' picks the package: Multiwatt 11 for LM3886 or TDA7265, Multiwatt 15 for TDA7293 or TDA7294")
|
||||
@AiNote("'Pin Names' is a comma-separated list of pin names in pin-number order; a pin without a name is called by its number. Pins named alike up to a trailing '_1', '_2' are one net inside the package")
|
||||
@AiNote("A datasheet model is a part number such as LM3886 and sets 'Type', 'Pin Names' and 'Value'. Set 'Value' to the same part number together with the model")
|
||||
@ComponentDescriptor(name = "Multiwatt IC", author = "Branislav Stojkovic", category = "Semiconductors",
|
||||
instanceNamePrefix = "IC", description = "Multiwatt package IC typically used for audio amplifiers of high power applications",
|
||||
zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE,
|
||||
enableCache = true, enableDatasheet = true, datasheetCreationStepCount = 2,
|
||||
datasheetModelColumn = 1)
|
||||
public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
implements IGerberComponentSimple, IDatasheetSupport {
|
||||
enableCache = true)
|
||||
public class MultiwattIC extends AbstractTransparentComponent<String> implements IGerberComponentSimple {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -76,11 +67,12 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
public static Size PIN_SIZE = new Size(0.7d, SizeUnit.mm);
|
||||
public static Size THICKNESS = new Size(5d, SizeUnit.mm);
|
||||
public static Size TAB_THICKNESS = new Size(1.6d, SizeUnit.mm);
|
||||
// from the back of the tab to the lead row that leaves the body from underneath; the other row is
|
||||
// bent forward clear of the body
|
||||
public static Size BACK_TO_NEAR_ROW = new Size(4.55d, SizeUnit.mm);
|
||||
// Multiwatt packages use 0.1 inch (2.54mm) spacing between pins in the same row
|
||||
public static Size PIN_SPACING = new Size(0.1d, SizeUnit.in);
|
||||
// Multiwatt packages have staggered pins with 0.2 inch (5.08mm) row spacing
|
||||
public static Size ROW_SPACING = new Size(0.2d, SizeUnit.in);
|
||||
// Lead offset due to bent leads
|
||||
public static Size LEAD_OFFSET = new Size(4d, SizeUnit.mm);
|
||||
|
||||
private String value = "";
|
||||
private Orientation orientation = Orientation.DEFAULT;
|
||||
@@ -92,10 +84,7 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
private Color labelColor = LABEL_COLOR;
|
||||
private Color tabColor = TAB_COLOR;
|
||||
private Color tabBorderColor = TAB_BORDER_COLOR;
|
||||
private String pinNames = null;
|
||||
private PinLabels pinLabels = null;
|
||||
transient private Area[] body;
|
||||
transient private String[] parsedPinNames;
|
||||
|
||||
public MultiwattIC() {
|
||||
super();
|
||||
@@ -103,27 +92,6 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
this.alphaPercent = new Percentage(100);
|
||||
}
|
||||
|
||||
public MultiwattIC(String[] model) {
|
||||
this();
|
||||
|
||||
applyModel(model);
|
||||
}
|
||||
|
||||
// columns: group, part number, then one name per pin in pin-number order; the pin count picks
|
||||
// the package type
|
||||
@Override
|
||||
public void applyModel(String[] model) {
|
||||
int pinCount = model.length - 2;
|
||||
MultiwattType modelType = Arrays.stream(MultiwattType.values())
|
||||
.filter(t -> t.getPinCount() == pinCount)
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new IllegalArgumentException("No Multiwatt package with " + pinCount
|
||||
+ " pins"));
|
||||
setValue(model[1]);
|
||||
setType(modelType);
|
||||
setPinNames(String.join(",", Arrays.copyOfRange(model, 2, model.length)));
|
||||
}
|
||||
|
||||
@EditableProperty
|
||||
public String getValue() {
|
||||
return value;
|
||||
@@ -207,7 +175,7 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
int pinsRight = type.getPinsRight();
|
||||
controlPoints = new Point2D.Double[pinCount];
|
||||
controlPoints[0] = firstPoint;
|
||||
double pinSpacing = type.getRowPitch().convertToPixels();
|
||||
double pinSpacing = PIN_SPACING.convertToPixels();
|
||||
double rowSpacing = ROW_SPACING.convertToPixels();
|
||||
// Update control points for staggered layout
|
||||
double dx1, dy1, dx2, dy2;
|
||||
@@ -266,68 +234,91 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
public Area[] getBody() {
|
||||
if (body == null) {
|
||||
body = new Area[2];
|
||||
double pinSpacing = type.getRowPitch().convertToPixels();
|
||||
double x = controlPoints[0].getX();
|
||||
double y = controlPoints[0].getY();
|
||||
double pinSize = PIN_SIZE.convertToPixels();
|
||||
double pinSpacing = PIN_SPACING.convertToPixels();
|
||||
double rowSpacing = ROW_SPACING.convertToPixels();
|
||||
double tabThickness = TAB_THICKNESS.convertToPixels();
|
||||
double leadOffset = LEAD_OFFSET.convertToPixels();
|
||||
int pinsLeft = type.getPinsLeft();
|
||||
int pinsRight = type.getPinsRight();
|
||||
// Calculate height accounting for staggered pins (right row offset by half spacing)
|
||||
double leftRowHeight = (pinsLeft - 1) * pinSpacing;
|
||||
double rightRowHeight = (pinsRight - 1 + 0.5) * pinSpacing;
|
||||
double length = Math.max(leftRowHeight, rightRowHeight) + pinSpacing;
|
||||
double start = -pinSpacing / 2;
|
||||
double back = ROW_SPACING.convertToPixels() + BACK_TO_NEAR_ROW.convertToPixels();
|
||||
body[0] = new Area(
|
||||
toDrawing(start, start + length, back - THICKNESS.convertToPixels(), back));
|
||||
body[1] = new Area(
|
||||
toDrawing(start, start + length, back - TAB_THICKNESS.convertToPixels(), back));
|
||||
double rightRowHeight = (pinsRight - 1 + 0.5) * pinSpacing; // Account for half-spacing offset
|
||||
double maxHeight = Math.max(leftRowHeight, rightRowHeight) + pinSpacing; // Add spacing for last pin
|
||||
double bodyX, bodyY, bodyWidth, bodyHeight;
|
||||
double tabX, tabY, tabWidth, tabHeight;
|
||||
|
||||
switch (orientation) {
|
||||
case DEFAULT:
|
||||
bodyWidth = rowSpacing - pinSize;
|
||||
bodyHeight = maxHeight;
|
||||
// Offset body to the left by lead offset (bent leads)
|
||||
bodyX = x + pinSize / 2 - leadOffset;
|
||||
bodyY = y - pinSpacing / 2;
|
||||
// Tab on the left side (where there are more pins) inside the body bounds
|
||||
tabX = bodyX;
|
||||
tabY = bodyY;
|
||||
tabWidth = tabThickness;
|
||||
tabHeight = bodyHeight;
|
||||
break;
|
||||
case _90:
|
||||
bodyWidth = maxHeight;
|
||||
bodyHeight = rowSpacing - pinSize;
|
||||
// Body positioned between the two pin rows
|
||||
// Left pins extend to negative X, body starts from leftmost pin
|
||||
// For _90: left pins go left (negative X), so leftmost is at x - (pinsLeft-1)*pinSpacing
|
||||
// Offset body upward by lead offset (bent leads)
|
||||
bodyX = x - (pinsLeft - 1) * pinSpacing - pinSpacing / 2;
|
||||
bodyY = y + pinSize / 2 - leadOffset;
|
||||
// Tab on the top side (where there are more pins - left row at y) inside the body bounds
|
||||
tabX = bodyX;
|
||||
tabY = bodyY;
|
||||
tabWidth = bodyWidth;
|
||||
tabHeight = tabThickness;
|
||||
break;
|
||||
case _180:
|
||||
bodyWidth = rowSpacing - pinSize;
|
||||
bodyHeight = maxHeight;
|
||||
// Body positioned between the two pin rows
|
||||
// For _180: left pins go up (negative Y), right pins at x - rowSpacing
|
||||
// Left row is at x, right row is at x - rowSpacing
|
||||
// Pins extend upward from y, so body should start from top of pin array
|
||||
// Offset body to the right by lead offset (bent leads)
|
||||
bodyX = x - rowSpacing + pinSize / 2 + leadOffset;
|
||||
bodyY = y - (pinsLeft - 1) * pinSpacing - pinSpacing / 2;
|
||||
// Tab on the right side (where there are more pins - left row at x) inside the body bounds
|
||||
tabX = bodyX + bodyWidth - tabThickness;
|
||||
tabY = bodyY;
|
||||
tabWidth = tabThickness;
|
||||
tabHeight = bodyHeight;
|
||||
break;
|
||||
case _270:
|
||||
bodyWidth = maxHeight;
|
||||
bodyHeight = rowSpacing - pinSize;
|
||||
// Body positioned between the two pin rows
|
||||
// For _270: left pins go right (positive X), so leftmost is at x
|
||||
// Left row is at y, right row is at y - rowSpacing
|
||||
// Similar to _90 but mirrored
|
||||
// Offset body downward by lead offset (bent leads)
|
||||
bodyX = x - pinSpacing / 2;
|
||||
bodyY = y - rowSpacing + pinSize / 2 + leadOffset;
|
||||
// Tab on the bottom side (where there are more pins - left row at y) inside the body bounds
|
||||
tabX = bodyX;
|
||||
tabY = bodyY + bodyHeight - tabThickness;
|
||||
tabWidth = bodyWidth;
|
||||
tabHeight = tabThickness;
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Unexpected orientation: " + orientation);
|
||||
}
|
||||
body[0] = new Area(new Rectangle2D.Double(bodyX, bodyY, bodyWidth, bodyHeight));
|
||||
body[1] = new Area(new Rectangle2D.Double(tabX, tabY, tabWidth, tabHeight));
|
||||
}
|
||||
return body;
|
||||
}
|
||||
|
||||
// The rectangle spanning the given distances along the rows and across them, measured from the
|
||||
// first pin with the second row on the positive side, turned to the orientation.
|
||||
private Rectangle2D toDrawing(double alongFrom, double alongTo, double acrossFrom,
|
||||
double acrossTo) {
|
||||
double alongX;
|
||||
double alongY;
|
||||
double acrossX;
|
||||
double acrossY;
|
||||
switch (orientation) {
|
||||
case DEFAULT:
|
||||
alongX = 0;
|
||||
alongY = 1;
|
||||
acrossX = 1;
|
||||
acrossY = 0;
|
||||
break;
|
||||
case _90:
|
||||
alongX = -1;
|
||||
alongY = 0;
|
||||
acrossX = 0;
|
||||
acrossY = 1;
|
||||
break;
|
||||
case _180:
|
||||
alongX = 0;
|
||||
alongY = -1;
|
||||
acrossX = -1;
|
||||
acrossY = 0;
|
||||
break;
|
||||
case _270:
|
||||
alongX = 1;
|
||||
alongY = 0;
|
||||
acrossX = 0;
|
||||
acrossY = -1;
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Unexpected orientation: " + orientation);
|
||||
}
|
||||
Point2D first = controlPoints[0];
|
||||
double x1 = first.getX() + alongX * alongFrom + acrossX * acrossFrom;
|
||||
double y1 = first.getY() + alongY * alongFrom + acrossY * acrossFrom;
|
||||
double x2 = first.getX() + alongX * alongTo + acrossX * acrossTo;
|
||||
double y2 = first.getY() + alongY * alongTo + acrossY * acrossTo;
|
||||
return new Rectangle2D.Double(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1),
|
||||
Math.abs(y2 - y1));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project,
|
||||
IDrawingObserver drawingObserver) {
|
||||
@@ -346,8 +337,20 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
double pinX = point.getX();
|
||||
double pinY = point.getY();
|
||||
|
||||
// pins under the body are drawn on top of it further down
|
||||
if (!mainArea.contains(pinX, pinY)) {
|
||||
// Check if pin is inside the body
|
||||
boolean insideBody = mainArea.contains(pinX, pinY);
|
||||
|
||||
if (insideBody) {
|
||||
// Draw pin as square inside body
|
||||
Rectangle2D rect = new Rectangle2D.Double(pinX - pinSize / 2,
|
||||
pinY - pinSize / 2, pinSize, pinSize);
|
||||
g2d.setColor(PIN_COLOR);
|
||||
drawingObserver.startTracking();
|
||||
g2d.fill(rect);
|
||||
drawingObserver.stopTracking();
|
||||
g2d.setColor(PIN_BORDER_COLOR);
|
||||
g2d.draw(rect);
|
||||
} else {
|
||||
// Draw rectangular lead from body edge to pin position
|
||||
double bodyX = bodyBounds.getX();
|
||||
double bodyY = bodyBounds.getY();
|
||||
@@ -457,25 +460,6 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
g2d.setColor(finalBorderColor);
|
||||
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1));
|
||||
g2d.draw(mainArea);
|
||||
|
||||
// the near row leaves through the bottom of the body, so its pins are drawn over the body to
|
||||
// stay visible whatever its alpha
|
||||
if (!outlineMode) {
|
||||
int pinSize = (int) PIN_SIZE.convertToPixels() / 2 * 2;
|
||||
for (Point2D point : controlPoints) {
|
||||
if (mainArea.contains(point.getX(), point.getY())) {
|
||||
Rectangle2D rect = new Rectangle2D.Double(point.getX() - pinSize / 2,
|
||||
point.getY() - pinSize / 2, pinSize, pinSize);
|
||||
g2d.setColor(PIN_COLOR);
|
||||
drawingObserver.startTracking();
|
||||
g2d.fill(rect);
|
||||
drawingObserver.stopTracking();
|
||||
g2d.setColor(PIN_BORDER_COLOR);
|
||||
g2d.draw(rect);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Draw label.
|
||||
g2d.setFont(project.getFont());
|
||||
Color finalLabelColor;
|
||||
@@ -508,44 +492,6 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
int x = (int) (bounds.getX() + (bounds.width - textWidth) / 2);
|
||||
int y = (int) (bounds.getY() + (bounds.height - textHeight) / 2 + fontMetrics.getAscent());
|
||||
g2d.drawString(label, x, y);
|
||||
|
||||
if (getPinLabels() != PinLabels.NONE) {
|
||||
g2d.setColor(finalBorderColor);
|
||||
drawPinLabels(g2d, mainArea.getBounds2D());
|
||||
}
|
||||
}
|
||||
|
||||
// Labels read forward, square to the rows, away from the tab. A pin under the body is labelled
|
||||
// from the front edge of the body, in the gap between the two forward leads either side of it;
|
||||
// a forward pin past the end of its lead. The stagger keeps the two sets apart.
|
||||
private void drawPinLabels(Graphics2D g2d, Rectangle2D bodyBounds) {
|
||||
g2d.setFont(ICPinNames.PIN_NAME_FONT);
|
||||
int pinsLeft = type.getPinsLeft();
|
||||
double acrossX = controlPoints[pinsLeft].getX() - controlPoints[0].getX();
|
||||
double acrossY = controlPoints[pinsLeft].getY() - controlPoints[0].getY();
|
||||
// the stagger adds half a pitch along the row, so the row offset is the larger component
|
||||
if (Math.abs(acrossX) > Math.abs(acrossY)) {
|
||||
acrossX = Math.signum(acrossX);
|
||||
acrossY = 0;
|
||||
} else {
|
||||
acrossX = 0;
|
||||
acrossY = Math.signum(acrossY);
|
||||
}
|
||||
double pinRadius = PIN_SIZE.convertToPixels() / 2;
|
||||
for (int i = 0; i < controlPoints.length; i++) {
|
||||
String label;
|
||||
if (getPinLabels() == PinLabels.NUMBERS) {
|
||||
label = Integer.toString(getPinNumber(i));
|
||||
} else {
|
||||
String name = getPinName(getPinNumber(i));
|
||||
if (name == null) {
|
||||
continue;
|
||||
}
|
||||
label = AbstractMakerBoard.getDisplayPinLabel(name);
|
||||
}
|
||||
ICPinNames.drawOutside(g2d, label, controlPoints[i], -acrossX, -acrossY, bodyBounds,
|
||||
pinRadius);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -554,7 +500,7 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
int pinSize = 2 * width / 32;
|
||||
int leftPinX = width / 6 + 9; // Move left pins 9px to the right (4px + 3px + 2px)
|
||||
int rightPinX = 5 * width / 6;
|
||||
int leadOffset = (int) (BACK_TO_NEAR_ROW.convertToPixels() * width / 100); // Scale lead offset for icon
|
||||
int leadOffset = (int) (LEAD_OFFSET.convertToPixels() * width / 100); // Scale lead offset for icon
|
||||
int bodyX = leftPinX + pinSize - leadOffset + 2; // Offset body to the left, then move 2px to the right
|
||||
int bodyWidth = (rightPinX - bodyX - pinSize) / 2 + 2; // Thinner body, make 2px thicker
|
||||
int bodyHeight = height - 2 * margin;
|
||||
@@ -562,13 +508,13 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
|
||||
// Calculate pin spacing to use all vertical space
|
||||
// Use same spacing for both rows, with front row offset by half spacing
|
||||
// the forward row, bent clear of the body, is the one with more pins
|
||||
int backPins = 3;
|
||||
int frontPins = 4;
|
||||
int pinSpacing = (bodyHeight - pinSize) / (frontPins - 1);
|
||||
int frontStartY = margin + pinSize / 2 + 1; // Move pins 1px down
|
||||
// Back pins start with half spacing offset for staggered effect
|
||||
int backStartY = margin + pinSize / 2 + pinSpacing / 2 + 1; // Move pins 1px down
|
||||
int backPins = 4;
|
||||
int frontPins = 3;
|
||||
// Use the spacing that fits the back row (more pins)
|
||||
int pinSpacing = (bodyHeight - pinSize) / (backPins - 1);
|
||||
int backStartY = margin + pinSize / 2 + 1; // Move pins 1px down
|
||||
// Front pins start with half spacing offset for staggered effect
|
||||
int frontStartY = margin + pinSize / 2 + pinSpacing / 2 + 1; // Move pins 1px down
|
||||
|
||||
// Draw thin body between pin rows
|
||||
g2d.setColor(BODY_COLOR);
|
||||
@@ -576,14 +522,14 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
g2d.setColor(BORDER_COLOR);
|
||||
g2d.drawRect(bodyX, bodyY, bodyWidth, bodyHeight);
|
||||
|
||||
// Draw heat sink tab on left side, away from the forward row
|
||||
// Draw heat sink tab on left side (where there are more pins)
|
||||
int tabWidth = pinSize * 2;
|
||||
g2d.setColor(TAB_COLOR);
|
||||
g2d.fillRect(bodyX, bodyY, tabWidth, bodyHeight);
|
||||
g2d.setColor(TAB_BORDER_COLOR);
|
||||
g2d.drawRect(bodyX, bodyY, tabWidth, bodyHeight);
|
||||
|
||||
// Draw 3 pins in the back as squares - inside body
|
||||
// Draw 4 pins in the back (left row, more pins) as squares - inside body
|
||||
g2d.setColor(PIN_COLOR);
|
||||
for (int i = 0; i < backPins; i++) {
|
||||
int pinY = backStartY + i * pinSpacing - pinSize / 2;
|
||||
@@ -593,7 +539,7 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
g2d.setColor(PIN_COLOR);
|
||||
}
|
||||
|
||||
// Draw 4 pins in the front with leads going left to body
|
||||
// Draw 3 pins in the front (right row, fewer pins) with leads going left to body
|
||||
// Use same spacing as back row, just offset by half spacing
|
||||
g2d.setColor(PIN_COLOR);
|
||||
for (int i = 0; i < frontPins; i++) {
|
||||
@@ -682,49 +628,6 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
this.tabBorderColor = tabBorderColor;
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Pin Names")
|
||||
public String getPinNames() {
|
||||
return pinNames;
|
||||
}
|
||||
|
||||
public void setPinNames(String pinNames) {
|
||||
this.pinNames = pinNames;
|
||||
parsedPinNames = null;
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Pin Labels")
|
||||
public PinLabels getPinLabels() {
|
||||
if (pinLabels == null) {
|
||||
pinLabels = PinLabels.NAMES;
|
||||
}
|
||||
return pinLabels;
|
||||
}
|
||||
|
||||
public void setPinLabels(PinLabels pinLabels) {
|
||||
this.pinLabels = pinLabels;
|
||||
}
|
||||
|
||||
// the leads alternate between the rows along the package, so the forward row holds the odd pin
|
||||
// numbers and the row under the body the even ones
|
||||
private int getPinNumber(int index) {
|
||||
int pinsLeft = type.getPinsLeft();
|
||||
return index < pinsLeft ? 2 * index + 1 : 2 * (index - pinsLeft) + 2;
|
||||
}
|
||||
|
||||
private String getPinName(int pinNumber) {
|
||||
if (parsedPinNames == null) {
|
||||
parsedPinNames = ICPinNames.parse(getPinNames());
|
||||
}
|
||||
return ICPinNames.get(parsedPinNames, pinNumber);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getControlPointNodeName(int index) {
|
||||
int pinNumber = getPinNumber(index);
|
||||
String name = getPinName(pinNumber);
|
||||
return name == null ? Integer.toString(pinNumber) : name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Rectangle2D getCachingBounds() {
|
||||
double minX = Integer.MAX_VALUE;
|
||||
@@ -749,28 +652,18 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
|
||||
public static enum MultiwattType {
|
||||
// Multiwatt-11: 6 pins on left, 5 pins on right (staggered)
|
||||
MULTIWATT_11(11, 6, 5, new Size(1.7d, SizeUnit.mm), "Multiwatt 11"),
|
||||
MULTIWATT_11(11, 6, 5),
|
||||
// Multiwatt-15: 8 pins on left, 7 pins on right (staggered)
|
||||
MULTIWATT_15(15, 8, 7, new Size(1.27d, SizeUnit.mm), "Multiwatt 15");
|
||||
MULTIWATT_15(15, 8, 7);
|
||||
|
||||
private final int pinCount;
|
||||
private final int pinsLeft;
|
||||
private final int pinsRight;
|
||||
// distance between consecutive leads along the package, i.e. from one row to the other
|
||||
private final Size leadPitch;
|
||||
private final String title;
|
||||
|
||||
MultiwattType(int pinCount, int pinsLeft, int pinsRight, Size leadPitch, String title) {
|
||||
MultiwattType(int pinCount, int pinsLeft, int pinsRight) {
|
||||
this.pinCount = pinCount;
|
||||
this.pinsLeft = pinsLeft;
|
||||
this.pinsRight = pinsRight;
|
||||
this.leadPitch = leadPitch;
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
// neighbouring leads of the same row are two lead pitches apart
|
||||
public Size getRowPitch() {
|
||||
return leadPitch.scale(2);
|
||||
}
|
||||
|
||||
public int getPinCount() {
|
||||
@@ -787,7 +680,7 @@ public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return title;
|
||||
return "Multiwatt " + pinCount;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
/*
|
||||
|
||||
DIY Layout Creator (DIYLC).
|
||||
Copyright (c) 2009-2025 held jointly by the individual authors.
|
||||
|
||||
This file is part of DIYLC.
|
||||
|
||||
DIYLC is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
DIYLC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
package org.diylc.components.semiconductors;
|
||||
|
||||
public enum PinLabels {
|
||||
NONE("None"), NAMES("Names"), NUMBERS("Numbers");
|
||||
|
||||
private String title;
|
||||
|
||||
private PinLabels(String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return title;
|
||||
}
|
||||
}
|
||||
@@ -32,16 +32,13 @@ import java.awt.geom.Ellipse2D;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.geom.RoundRectangle2D;
|
||||
import java.util.Arrays;
|
||||
import org.diylc.appframework.miscutils.ConfigurationManager;
|
||||
|
||||
import org.diylc.common.*;
|
||||
import org.diylc.components.AbstractMakerBoard;
|
||||
import org.diylc.components.AbstractTransparentComponent;
|
||||
import org.diylc.components.transform.SIL_ICTransformer;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.IDatasheetSupport;
|
||||
import org.diylc.core.IDrawingObserver;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.Theme;
|
||||
@@ -57,15 +54,11 @@ import org.diylc.core.measures.SizeUnit;
|
||||
import org.diylc.utils.Constants;
|
||||
|
||||
@AiNote("The first control point is the anchor; with 'Orientation' DEFAULT the pins run straight down from it 'Pin Spacing' apart and the indent is at the anchor's end of the body. The other orientations rotate this around the anchor")
|
||||
@AiNote("The first control point is pin 1. 'Pin Names' is a comma-separated list of pin names in pin-number order; a pin without a name is called by its number. Pins named alike up to a trailing '_1', '_2' are one net inside the package, while 1IN and 2IN are separate channels")
|
||||
@AiNote("A datasheet model is a part number such as LA4440 and sets 'Pins', 'Pin Spacing', 'Pin Names' and 'Value'. Set 'Value' to the same part number together with the model")
|
||||
@ComponentDescriptor(name = "SIP IC", author = "Branislav Stojkovic", category = "Semiconductors",
|
||||
instanceNamePrefix = "IC", description = "Single-in-line package IC",
|
||||
zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = SIL_ICTransformer.class,
|
||||
enableCache = true, enableDatasheet = true, datasheetCreationStepCount = 2,
|
||||
datasheetModelColumn = 1)
|
||||
public class SIL_IC extends AbstractTransparentComponent<String>
|
||||
implements IGerberComponentSimple, IDatasheetSupport {
|
||||
enableCache = true)
|
||||
public class SIL_IC extends AbstractTransparentComponent<String> implements IGerberComponentSimple {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -90,8 +83,6 @@ public class SIL_IC extends AbstractTransparentComponent<String>
|
||||
private Color borderColor = BORDER_COLOR;
|
||||
private Color labelColor = LABEL_COLOR;
|
||||
private Color indentColor = INDENT_COLOR;
|
||||
private String pinNames = null;
|
||||
private PinLabels pinLabels = null;
|
||||
// new Point(0, pinSpacing.convertToPixels()),
|
||||
// new Point(0, 2 * pinSpacing.convertToPixels()),
|
||||
// new Point(0, 3 * pinSpacing.convertToPixels()),
|
||||
@@ -103,7 +94,6 @@ public class SIL_IC extends AbstractTransparentComponent<String>
|
||||
// new Point(3 * pinSpacing.convertToPixels(), 3 *
|
||||
// pinSpacing.convertToPixels()) };
|
||||
transient private Area[] body;
|
||||
transient private String[] parsedPinNames;
|
||||
|
||||
public SIL_IC() {
|
||||
super();
|
||||
@@ -111,22 +101,6 @@ public class SIL_IC extends AbstractTransparentComponent<String>
|
||||
this.alphaPercent = new Percentage(100);
|
||||
}
|
||||
|
||||
public SIL_IC(String[] model) {
|
||||
this();
|
||||
|
||||
applyModel(model);
|
||||
}
|
||||
|
||||
// columns: group, part number, pin spacing, then one name per pin in pin-number order, so the
|
||||
// pin count is the number of names
|
||||
@Override
|
||||
public void applyModel(String[] model) {
|
||||
setValue(model[1]);
|
||||
setPinSpacing(Size.parseSize(model[2]));
|
||||
setPinCount(PinCount.valueOf("_" + (model.length - 3)));
|
||||
setPinNames(String.join(",", Arrays.copyOfRange(model, 3, model.length)));
|
||||
}
|
||||
|
||||
@EditableProperty
|
||||
public String getValue() {
|
||||
return value;
|
||||
@@ -256,7 +230,7 @@ public class SIL_IC extends AbstractTransparentComponent<String>
|
||||
int thickness = getClosestOdd(THICKNESS.convertToPixels());
|
||||
double width;
|
||||
double height;
|
||||
double pinSpacing = this.pinSpacing.convertToPixels();
|
||||
double pinSpacing = (int) this.pinSpacing.convertToPixels();
|
||||
Area indentation = null;
|
||||
int indentationSize = getClosestOdd(INDENT_SIZE.convertToPixels());
|
||||
switch (orientation) {
|
||||
@@ -390,40 +364,6 @@ public class SIL_IC extends AbstractTransparentComponent<String>
|
||||
int x = (int) (bounds.getX() + (bounds.width - textWidth) / 2);
|
||||
int y = (int) (bounds.getY() + (bounds.height - textHeight) / 2 + fontMetrics.getAscent());
|
||||
g2d.drawString(label, x, y);
|
||||
|
||||
if (getPinLabels() != PinLabels.NONE) {
|
||||
g2d.setColor(finalBorderColor);
|
||||
drawPinLabels(g2d, mainArea.getBounds2D());
|
||||
}
|
||||
}
|
||||
|
||||
// Labels sit beside the body, square to the row and reading away from it, on the side the row
|
||||
// turns to clockwise: right of a row running down, below one running left.
|
||||
private void drawPinLabels(Graphics2D g2d, Rectangle2D bodyBounds) {
|
||||
if (controlPoints.length < 2) {
|
||||
return;
|
||||
}
|
||||
g2d.setFont(ICPinNames.PIN_NAME_FONT);
|
||||
if (g2d.getFontMetrics().getAscent() > pinSpacing.convertToPixels()) {
|
||||
return;
|
||||
}
|
||||
double rowDistance = controlPoints[0].distance(controlPoints[1]);
|
||||
double alongX = (controlPoints[1].getX() - controlPoints[0].getX()) / rowDistance;
|
||||
double alongY = (controlPoints[1].getY() - controlPoints[0].getY()) / rowDistance;
|
||||
double pinRadius = PIN_SIZE.convertToPixels() / 2;
|
||||
for (int i = 0; i < controlPoints.length; i++) {
|
||||
String label;
|
||||
if (getPinLabels() == PinLabels.NUMBERS) {
|
||||
label = Integer.toString(i + 1);
|
||||
} else {
|
||||
String name = getPinName(i + 1);
|
||||
if (name == null) {
|
||||
continue;
|
||||
}
|
||||
label = AbstractMakerBoard.getDisplayPinLabel(name);
|
||||
}
|
||||
ICPinNames.drawOutside(g2d, label, controlPoints[i], alongY, -alongX, bodyBounds, pinRadius);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -489,41 +429,6 @@ public class SIL_IC extends AbstractTransparentComponent<String>
|
||||
public void setIndentColor(Color indentColor) {
|
||||
this.indentColor = indentColor;
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Pin Names")
|
||||
public String getPinNames() {
|
||||
return pinNames;
|
||||
}
|
||||
|
||||
public void setPinNames(String pinNames) {
|
||||
this.pinNames = pinNames;
|
||||
parsedPinNames = null;
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Pin Labels")
|
||||
public PinLabels getPinLabels() {
|
||||
if (pinLabels == null) {
|
||||
pinLabels = PinLabels.NAMES;
|
||||
}
|
||||
return pinLabels;
|
||||
}
|
||||
|
||||
public void setPinLabels(PinLabels pinLabels) {
|
||||
this.pinLabels = pinLabels;
|
||||
}
|
||||
|
||||
private String getPinName(int pinNumber) {
|
||||
if (parsedPinNames == null) {
|
||||
parsedPinNames = ICPinNames.parse(getPinNames());
|
||||
}
|
||||
return ICPinNames.get(parsedPinNames, pinNumber);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getControlPointNodeName(int index) {
|
||||
String name = getPinName(index + 1);
|
||||
return name == null ? Integer.toString(index + 1) : name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Rectangle2D getCachingBounds() {
|
||||
|
||||
@@ -48,7 +48,7 @@ public abstract class AbstractShape extends AbstractTransparentComponent<Void> {
|
||||
|
||||
protected Color color = COLOR;
|
||||
protected Color borderColor = BORDER_COLOR;
|
||||
protected Size borderThickness = new Size(1.0, SizeUnit.px);
|
||||
protected Size borderThickness = new Size(0.2d, SizeUnit.mm);
|
||||
|
||||
@EditableProperty(name = "Color")
|
||||
public Color getColor() {
|
||||
|
||||
@@ -1,132 +0,0 @@
|
||||
Diecast (1590),1590LLB,50.5 mm,50.5 mm,21 mm
|
||||
Diecast (1590),1590LB,50.6 mm,50.55 mm,27 mm
|
||||
Diecast (1590),1590H,38 mm,53 mm,27 mm
|
||||
Diecast (1590),1590Y,92 mm,92 mm,38 mm
|
||||
Diecast (1590),1590A,38.5 mm,92.6 mm,27 mm
|
||||
Diecast (1590),1590G,50 mm,100 mm,21.5 mm
|
||||
Diecast (1590),1590G2,50 mm,100 mm,27 mm
|
||||
Diecast (1590),1590S,82.4 mm,110.5 mm,40 mm
|
||||
Diecast (1590),1590B,60.5 mm,112.4 mm,27 mm
|
||||
Diecast (1590),1590B2,60.5 mm,112.4 mm,33.5 mm
|
||||
Diecast (1590),1590BS,60.5 mm,112 mm,38 mm
|
||||
Diecast (1590),1590B3,77 mm,116 mm,33.5 mm
|
||||
Diecast (1590),1590BB,94 mm,119.5 mm,30 mm
|
||||
Diecast (1590),1590BB2,94 mm,119.5 mm,33.75 mm
|
||||
Diecast (1590),1590BBS,94 mm,119.5 mm,38.1 mm
|
||||
Diecast (1590),1590Q,120 mm,120 mm,30 mm
|
||||
Diecast (1590),1590U,120 mm,120 mm,55 mm
|
||||
Diecast (1590),1590V,120 mm,120 mm,90 mm
|
||||
Diecast (1590),1590C,94 mm,119.5 mm,52.5 mm
|
||||
Diecast (1590),1590T,80 mm,120 mm,55 mm
|
||||
Diecast (1590),1590CE,100 mm,120 mm,61 mm
|
||||
Diecast (1590),1590N1,65.5 mm,121.2 mm,35.8 mm
|
||||
Diecast (1590),1590KK,125 mm,125 mm,53 mm
|
||||
Diecast (1590),1590K,125 mm,125 mm,75 mm
|
||||
Diecast (1590),1590J,145 mm,95 mm,45.1 mm
|
||||
Diecast (1590),1590XX,145.2 mm,121.2 mm,35.2 mm
|
||||
Diecast (1590),1590X,145.2 mm,121.2 mm,52.3 mm
|
||||
Diecast (1590),1590P1,153 mm,83.1 mm,46.4 mm
|
||||
Diecast (1590),1590D,187.75 mm,119.5 mm,52 mm
|
||||
Diecast (1590),1590DD,188 mm,120 mm,33 mm
|
||||
Diecast (1590),1590E,188 mm,120 mm,78 mm
|
||||
Diecast (1590),1590F,188 mm,188 mm,63 mm
|
||||
Diecast (1590),1590R1,192 mm,112 mm,57 mm
|
||||
Diecast (1590),1590DE,200 mm,120 mm,60 mm
|
||||
Diecast (1590),1590EE,200 mm,120 mm,81 mm
|
||||
Diecast (1590),1590BX2,254 mm,70 mm,31 mm
|
||||
Diecast (1590),1590BX,254 mm,70 mm,46 mm
|
||||
Diecast (1550),1550Q,55 mm,60 mm,26 mm
|
||||
Diecast (1550),1550P,55 mm,80 mm,21 mm
|
||||
Diecast (1550),1550A,35 mm,89 mm,26 mm
|
||||
Diecast (1550),1550B,64 mm,114.5 mm,26 mm
|
||||
Diecast (1550),1550D,64 mm,115 mm,51 mm
|
||||
Diecast (1550),1550C,90 mm,115 mm,51 mm
|
||||
Diecast (1550),1550M,100 mm,120 mm,31 mm
|
||||
Diecast (1550),1550K,140 mm,102 mm,73 mm
|
||||
Diecast (1550),1550L,165 mm,127 mm,73 mm
|
||||
Diecast (1550),1550E,171 mm,121 mm,51 mm
|
||||
Diecast (1550),1550F,171 mm,121 mm,101 mm
|
||||
Diecast (1550),1550G,222 mm,146 mm,51 mm
|
||||
Diecast (1550),1550H,222 mm,146 mm,101 mm
|
||||
Diecast (1550),1550N,250 mm,250 mm,97 mm
|
||||
Diecast (1550),1550J,275 mm,175 mm,63 mm
|
||||
Others,125B,66 mm,122 mm,36 mm
|
||||
Chassis - Steel (1441),1441-9,8 in,4 in,1 in
|
||||
Chassis - Steel (1441),1441-15,10 in,6 in,1 in
|
||||
Chassis - Steel (1441),1441-6,4 in,4 in,2 in
|
||||
Chassis - Steel (1441),1441-8,6 in,4 in,2 in
|
||||
Chassis - Steel (1441),1441-12,7 in,5 in,2 in
|
||||
Chassis - Steel (1441),1441-10,8 in,4 in,2 in
|
||||
Chassis - Steel (1441),1441-14,9 in,5 in,2 in
|
||||
Chassis - Steel (1441),1441-16,10 in,6 in,2 in
|
||||
Chassis - Steel (1441),1441-22,12 in,8 in,2 in
|
||||
Chassis - Steel (1441),1441-29,12 in,10 in,2 in
|
||||
Chassis - Steel (1441),1441-18,13.5 in,5 in,2 in
|
||||
Chassis - Steel (1441),1441-26,16 in,8 in,2 in
|
||||
Chassis - Steel (1441),1441-30,17 in,10 in,2 in
|
||||
Chassis - Steel (1441),1441-34,17 in,12 in,2 in
|
||||
Chassis - Steel (1441),1441-24,12 in,8 in,3 in
|
||||
Chassis - Steel (1441),1441-28,16 in,8 in,3 in
|
||||
Chassis - Steel (1441),1441-20,17 in,4 in,3 in
|
||||
Chassis - Steel (1441),1441-32,17 in,10 in,3 in
|
||||
Chassis - Steel (1441),1441-36,17 in,12 in,3 in
|
||||
Chassis - Steel (1441),1441-38,17 in,14 in,3 in
|
||||
Chassis - Steel (1441),1441-33,17 in,10 in,4 in
|
||||
Chassis - Steel (1441),1441-40,17 in,14 in,4 in
|
||||
Chassis - Steel (1441),1441-42,17 in,14 in,5 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-45351,4.5 in,3.5 in,1 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-9,8 in,4 in,1 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-15,10 in,6 in,1 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-6415,6 in,4 in,1.5 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-84515,8 in,4.5 in,1.5 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-6,4 in,4 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-542,5 in,4 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-8,6 in,4 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-12,7 in,5 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-772,7 in,7 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-10,8 in,4 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-862,8 in,6 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-14,9 in,5 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-972,9 in,7 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-9552,9.5 in,5 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-16,10 in,6 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-1172,11 in,7 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-22,12 in,8 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-29,12 in,10 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-1372,13 in,7 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-18,13.5 in,5 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-26,16 in,8 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-30,17 in,10 in,2 in
|
||||
Chassis - Aluminium (1444) 1-2 in,1444-17132,17 in,13 in,2 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-95525,9.5 in,5 in,2.5 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-10825,10 in,8 in,2.5 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-12825,12 in,8 in,2.5 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-643,6 in,4 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-753,7 in,5 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-9553,9.5 in,5 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-1053,10 in,5 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-1273,12 in,7 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-24,12 in,8 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-12103,12 in,10 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-12123,12 in,12 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-1463,14 in,6 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-14103,14 in,10 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-1573,15 in,7 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-1593,15 in,9 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-28,16 in,8 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-20,17 in,4 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-1763,17 in,6 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-1773,17 in,7 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-1783,17 in,8 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-32,17 in,10 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-17123,17 in,12 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-17133,17 in,13 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-17143,17 in,14 in,3 in
|
||||
Chassis - Aluminium (1444) 2.5-3 in,1444-17173,17 in,17 in,3 in
|
||||
Chassis - Aluminium (1444) 4-6 in,1444-33,17 in,10 in,4 in
|
||||
Chassis - Aluminium (1444) 4-6 in,1444-17134,17 in,13 in,4 in
|
||||
Chassis - Aluminium (1444) 4-6 in,1444-17154,17 in,15 in,4 in
|
||||
Chassis - Aluminium (1444) 4-6 in,1444-17174,17 in,17 in,4 in
|
||||
Chassis - Aluminium (1444) 4-6 in,1444-17105,17 in,10 in,5 in
|
||||
Chassis - Aluminium (1444) 4-6 in,1444-17135,17 in,13 in,5 in
|
||||
Chassis - Aluminium (1444) 4-6 in,1444-17156,17 in,15 in,6 in
|
||||
@@ -1,92 +0,0 @@
|
||||
Op-Amp (Single),TL061,0.3 in,N1 (OFFSET),IN-,IN+,VCC-,N2 (OFFSET),OUT,VCC+,NC
|
||||
Op-Amp (Single),TL071,0.3 in,N1 (OFFSET),IN-,IN+,VCC-,N2 (OFFSET),OUT,VCC+,NC
|
||||
Op-Amp (Single),TL081,0.3 in,N1 (OFFSET),IN-,IN+,VCC-,N2 (OFFSET),OUT,VCC+,NC
|
||||
Op-Amp (Single),LM741,0.3 in,N1 (OFFSET),IN-,IN+,VCC-,N2 (OFFSET),OUT,VCC+,NC
|
||||
Op-Amp (Single),LF356,0.3 in,N1 (OFFSET),IN-,IN+,VCC-,N2 (OFFSET),OUT,VCC+,NC
|
||||
Op-Amp (Single),OPA134,0.3 in,NC,IN-,IN+,VCC-,NC,OUT,VCC+,NC
|
||||
Op-Amp (Single),NE5534,0.3 in,BALANCE,IN-,IN+,VCC-,COMP,OUT,VCC+,COMP/BAL
|
||||
Op-Amp (Single),LF351,0.3 in,N1 (OFFSET),IN-,IN+,VCC-,N2 (OFFSET),OUT,VCC+,NC
|
||||
Op-Amp (Single),UA741,0.3 in,N1 (OFFSET),IN-,IN+,VCC-,N2 (OFFSET),OUT,VCC+,NC
|
||||
Op-Amp (Single),OP07,0.3 in,N1 (OFFSET),IN-,IN+,VCC-,NC,OUT,VCC+,N2 (OFFSET)
|
||||
Op-Amp (Single),LM308,0.3 in,COMP1 (BALANCE/COMP),IN-,IN+,VCC-,BAL (BALANCE),OUT,VCC+,COMP2 (COMP)
|
||||
Op-Amp (Dual),TL062,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),TL072,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),TL082,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),NE5532,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),JRC4558,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),RC4580,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),OPA2134,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),OPA2604,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),LM4562,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),LM358,0.3 in,1OUT,1IN-,1IN+,GND,2IN+,2IN-,2OUT,VCC
|
||||
Op-Amp (Dual),LF353,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),MC1458,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),RC4558,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),LM833,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),TL022,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),OP275,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),LME49720,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),OPA2132,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Dual),OPA2227,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+
|
||||
Op-Amp (Quad),TL074,0.3 in,1OUT,1IN-,1IN+,VCC+,2IN+,2IN-,2OUT,3OUT,3IN-,3IN+,VCC-,4IN+,4IN-,4OUT
|
||||
Op-Amp (Quad),TL084,0.3 in,1OUT,1IN-,1IN+,VCC+,2IN+,2IN-,2OUT,3OUT,3IN-,3IN+,VCC-,4IN+,4IN-,4OUT
|
||||
Op-Amp (Quad),OPA4134,0.3 in,1OUT,1IN-,1IN+,VCC+,2IN+,2IN-,2OUT,3OUT,3IN-,3IN+,VCC-,4IN+,4IN-,4OUT
|
||||
Op-Amp (Quad),LM324,0.3 in,1OUT,1IN-,1IN+,VCC,2IN+,2IN-,2OUT,3OUT,3IN-,3IN+,GND,4IN+,4IN-,4OUT
|
||||
Op-Amp (Quad),TL064,0.3 in,1OUT,1IN-,1IN+,VCC+,2IN+,2IN-,2OUT,3OUT,3IN-,3IN+,VCC-,4IN+,4IN-,4OUT
|
||||
Timer,NE555,0.3 in,GND,TRIG,OUT,RESET,CONT,THRES,DISCH,VCC
|
||||
Timer,ICM7555,0.3 in,GND,TRIG,OUT,RESET,CONT,THRES,DISCH,VCC
|
||||
Timer,TLC555,0.3 in,GND,TRIG,OUT,RESET,CONT,THRES,DISCH,VCC
|
||||
Timer,NE556,0.3 in,1DISCH,1THRES,1CONT,1RESET,1OUT,1TRIG,GND,2TRIG,2OUT,2RESET,2CONT,2THRES,2DISCH,VCC
|
||||
Timer,ICM7556,0.3 in,1DISCH,1THRES,1CONT,1RESET,1OUT,1TRIG,GND,2TRIG,2OUT,2RESET,2CONT,2THRES,2DISCH,VCC
|
||||
Timer,LM555,0.3 in,GND,TRIG,OUT,RESET,CONT,THRES,DISCH,VCC
|
||||
OTA / VCA,LM13700,0.3 in,1IABC (AMP BIAS),1DBIAS (DIODE BIAS),1IN+,1IN-,1OUT,VCC-,1BUFIN,1BUFOUT,2BUFOUT,2BUFIN,VCC+,2OUT,2IN-,2IN+,2DBIAS (DIODE BIAS),2IABC (AMP BIAS)
|
||||
OTA / VCA,CA3080,0.3 in,NC,IN-,IN+,VCC-,IABC (AMP BIAS),OUT,VCC+,NC
|
||||
OTA / VCA,SSM2164,0.3 in,MODE,1IIN,1VC (CONTROL),1IOUT,2IOUT,2VC (CONTROL),2IIN,GND,VCC-,3IIN,3VC (CONTROL),3IOUT,4IOUT,4VC (CONTROL),4IIN,VCC+
|
||||
OTA / VCA,V2164,0.3 in,MODE,1IIN,1VC (CONTROL),1IOUT,2IOUT,2VC (CONTROL),2IIN,GND,VCC-,3IIN,3VC (CONTROL),3IOUT,4IOUT,4VC (CONTROL),4IIN,VCC+
|
||||
OTA / VCA,LM13600,0.3 in,1IABC (AMP BIAS),1DBIAS (DIODE BIAS),1IN+,1IN-,1OUT,VCC-,1BUFIN,1BUFOUT,2BUFOUT,2BUFIN,VCC+,2OUT,2IN-,2IN+,2DBIAS (DIODE BIAS),2IABC (AMP BIAS)
|
||||
OTA / VCA,AS3080,0.3 in,NC,IN-,IN+,VCC-,IABC (AMP BIAS),OUT,VCC+,NC
|
||||
OTA / VCA,AS2164,0.3 in,MODE,1IIN,1VC (CONTROL),1IOUT,2IOUT,2VC (CONTROL),2IIN,GND,VCC-,3IIN,3VC (CONTROL),3IOUT,4IOUT,4VC (CONTROL),4IIN,VCC+
|
||||
Power Amp,LM386,0.3 in,GAIN1,IN-,IN+,GND,VOUT,VS,BYP (BYPASS),GAIN8
|
||||
Power Amp,LM380,0.3 in,BYP (BYPASS),IN+,GND_1,GND_2,GND_3,IN-,GND_4,VOUT,NC,GND_5,GND_6,GND_7,NC,VS
|
||||
Power Amp,TDA7052,0.3 in,VP,IN,GND1 (SIGNAL GND),NC,OUT1,GND2 (POWER GND),NC,OUT2
|
||||
Power Amp,TDA2822,0.3 in,1OUT,VS,2OUT,GND,2IN-,2IN+,1IN+,1IN-
|
||||
BBD,MN3007,0.3 in,GND,CP1 (CLOCK 1),IN,VGG,VDD,CP2 (CLOCK 2),OUT1,OUT2
|
||||
BBD,MN3207,0.3 in,GND,CP1 (CLOCK 1),IN,VGG,VDD,CP2 (CLOCK 2),OUT1,OUT2
|
||||
BBD,BL3207,0.3 in,GND,CP1 (CLOCK 1),IN,VGG,VDD,CP2 (CLOCK 2),OUT1,OUT2
|
||||
BBD,BL3208A,0.3 in,GND,CP1 (CLOCK 1),IN,VGG,VDD,CP2 (CLOCK 2),OUT1,OUT2
|
||||
BBD,V3207,0.3 in,GND,CP1 (CLOCK 1),IN,VGG,VDD,CP2 (CLOCK 2),OUT1,OUT2
|
||||
BBD,MN3008,0.3 in,GND,CP2 (CLOCK 2),NC,NC,NC,OUT1,OUT2,VDD,CP1 (CLOCK 1),NC,NC,NC,IN,VGG
|
||||
BBD,MN3005,0.3 in,GND,CP2 (CLOCK 2),NC,NC,NC,OUT1,OUT2,VDD,CP1 (CLOCK 1),NC,NC,NC,IN,VGG
|
||||
BBD,BL3208B,0.3 in,GND,CP2 (CLOCK 2),NC,NC,NC,OUT1,OUT2,VDD,CP1 (CLOCK 1),NC,NC,NC,IN,VGG
|
||||
BBD Clock,MN3101,0.3 in,GND,CP1 (CLOCK 1),VDD,CP2 (CLOCK 2),OX3,OX2,OX1,VGG (OUTPUT)
|
||||
BBD Clock,MN3102,0.3 in,VDD,CP1 (CLOCK 1),GND,CP2 (CLOCK 2),OX3,OX2,OX1,VGG (OUTPUT)
|
||||
BBD Clock,V3102,0.3 in,VDD,CP1 (CLOCK 1),VSS,CP2 (CLOCK 2),RCEXT3,RCEXT2,RCEXT1,VGG (OUTPUT)
|
||||
Delay / Compander,PT2399,0.3 in,VCC,REF,AGND,DGND,CLKO (CLOCK OUT),VCO,CC1,CC0,OP1-OUT,OP1-IN,OP2-IN,OP2-OUT,LPF2-IN,LPF2-OUT,LPF1-OUT,LPF1-IN
|
||||
Delay / Compander,NE570,0.3 in,1RECTCAP,1RECTIN,1DGIN (DELTA G CELL IN),GND,1INVIN,1R3,1OUT,1THDTRIM,2THDTRIM,2OUT,2R3,2INVIN,VCC,2DGIN (DELTA G CELL IN),2RECTIN,2RECTCAP
|
||||
Delay / Compander,NE571,0.3 in,1RECTCAP,1RECTIN,1DGIN (DELTA G CELL IN),GND,1INVIN,1R3,1OUT,1THDTRIM,2THDTRIM,2OUT,2R3,2INVIN,VCC,2DGIN (DELTA G CELL IN),2RECTIN,2RECTCAP
|
||||
Delay / Compander,SA571,0.3 in,1RECTCAP,1RECTIN,1DGIN (DELTA G CELL IN),GND,1INVIN,1R3,1OUT,1THDTRIM,2THDTRIM,2OUT,2R3,2INVIN,VCC,2DGIN (DELTA G CELL IN),2RECTIN,2RECTCAP
|
||||
Charge Pump,ICL7660,0.3 in,NC,CAP+,GND,CAP-,VOUT,LV,OSC,V+
|
||||
Charge Pump,TC1044,0.3 in,BOOST,CAP+,GND,CAP-,VOUT,LV,OSC,V+
|
||||
Charge Pump,MAX1044,0.3 in,BOOST,CAP+,GND,CAP-,VOUT,LV,OSC,V+
|
||||
Charge Pump,LT1054,0.3 in,FB/SD,CAP+,GND,CAP-,VOUT,VREF,OSC,VCC
|
||||
CMOS Logic / Switch,CD4049,0.3 in,VDD,1Y,1A,2Y,2A,3Y,3A,VSS,4A,4Y,5A,5Y,NC,6A,6Y,NC
|
||||
CMOS Logic / Switch,CD4069,0.3 in,1A,1Y,2A,2Y,3A,3Y,VSS,4Y,4A,5Y,5A,6Y,6A,VDD
|
||||
CMOS Logic / Switch,CD40106,0.3 in,1A,1Y,2A,2Y,3A,3Y,VSS,4Y,4A,5Y,5A,6Y,6A,VDD
|
||||
CMOS Logic / Switch,CD4011,0.3 in,1A,1B,1Y,2Y,2A,2B,VSS,3A,3B,3Y,4Y,4A,4B,VDD
|
||||
CMOS Logic / Switch,CD4013,0.3 in,1Q,1QN,1CLK,1R,1D,1S,VSS,2S,2D,2R,2CLK,2QN,2Q,VDD
|
||||
CMOS Logic / Switch,CD4017,0.3 in,Q5,Q1,Q0,Q2,Q6,Q7,Q3,VSS,Q8,Q4,Q9,CO,CLKINH,CLK,RST,VDD
|
||||
CMOS Logic / Switch,CD4066,0.3 in,1A,1B,2B,2A,2C,3C,VSS,3A,3B,4B,4A,4C,1C,VDD
|
||||
CMOS Logic / Switch,CD4051,0.3 in,CH4,CH6,COM,CH7,CH5,INH,VEE,VSS,C,B,A,CH3,CH0,CH1,CH2,VDD
|
||||
CMOS Logic / Switch,CD4053,0.3 in,2Y,2X,3Y,3COM,3X,INH,VEE,VSS,C,B,A,1X,1Y,1COM,2COM,VDD
|
||||
CMOS Logic / Switch,CD4016,0.3 in,1A,1B,2B,2A,2C,3C,VSS,3A,3B,4B,4A,4C,1C,VDD
|
||||
CMOS Logic / Switch,74HC14,0.3 in,1A,1Y,2A,2Y,3A,3Y,GND,4Y,4A,5Y,5A,6Y,6A,VCC
|
||||
CMOS Logic / Switch,74HC4051,0.3 in,CH4,CH6,COM,CH7,CH5,INH,VEE,GND,C,B,A,CH3,CH0,CH1,CH2,VCC
|
||||
Optocoupler,PC817,0.3 in,A,K,E,C
|
||||
Optocoupler,4N35,0.3 in,A,K,NC,E,C,B
|
||||
Optocoupler,6N138,0.3 in,NC,A,K,NC,GND,VO,B (VB),VCC
|
||||
Optocoupler,H11L1,0.3 in,A,K,NC,VO,GND,VCC
|
||||
Optocoupler,6N139,0.3 in,NC,A,K,NC,GND,VO,B (VB),VCC
|
||||
MCU,ATtiny85,0.3 in,PB5 (RESET/ADC0),PB3 (XTAL1/ADC3),PB4 (XTAL2/ADC2),GND,PB0 (MOSI/SDA),PB1 (MISO),PB2 (SCK/SCL/ADC1),VCC
|
||||
MCU,ATmega328P,0.3 in,PC6 (RESET),PD0 (RXD),PD1 (TXD),PD2 (INT0),PD3 (INT1/OC2B),PD4 (T0/XCK),VCC,GND_1,PB6 (XTAL1),PB7 (XTAL2),PD5 (T1/OC0B),PD6 (AIN0/OC0A),PD7 (AIN1),PB0 (ICP1/CLKO),PB1 (OC1A),PB2 (SS/OC1B),PB3 (MOSI/OC2A),PB4 (MISO),PB5 (SCK),AVCC,AREF,GND_2,PC0 (ADC0),PC1 (ADC1),PC2 (ADC2),PC3 (ADC3),PC4 (ADC4/SDA),PC5 (ADC5/SCL)
|
||||
MCU,ATtiny13A,0.3 in,PB5 (RESET/ADC0),PB3 (CLKI/ADC3),PB4 (ADC2),GND,PB0 (MOSI/AIN0/OC0A),PB1 (MISO/AIN1/OC0B/INT0),PB2 (SCK/ADC1/T0),VCC
|
||||
Comparator,LM393,0.3 in,1OUT,1IN-,1IN+,GND,2IN+,2IN-,2OUT,VCC
|
||||
@@ -1,4 +0,0 @@
|
||||
Power Amp,LM3886,VCC+1,NC,OUT,VCC-,VCC+5,NC,GND,MUTE,IN-,IN+,NC
|
||||
Power Amp,TDA7265,VS-1,1OUT,VS+,2OUT,MUTE (MUTE/STBY),VS-6,2IN+,2IN-,GND,1IN-,1IN+
|
||||
Power Amp,TDA7293,STBY-GND,IN-,IN+,GND (SIGNAL),CLIP (CLIP/SC DETECTOR),BOOT,VS+SIG,VS-SIG,STBY,MUTE,BUF (BUFFER DRIVER),BOOTL (BOOTSTRAP LOADER),VS+PWR,OUT,VS-PWR
|
||||
Power Amp,TDA7294,STBY-GND,IN-,IN+,SVR,NC,BOOT,VS+SIG,VS-SIG,STBY,MUTE,NC,NC,VS+PWR,OUT,VS-PWR
|
||||
@@ -1,22 +0,0 @@
|
||||
Carbon Comp,0.25 W,0.3 in,0.1 in,Tubular,5 band,#8A5E20,#735832
|
||||
Carbon Comp,0.5 W,0.41 in,0.15 in,Tubular,5 band,#8A5E20,#735832
|
||||
Carbon Film,0.25 W,7,2.5,Standard,5 band,#E0C68B,#A59268
|
||||
Carbon Film,0.5 W,9,3.2,Standard,5 band,#E0C68B,#A59268
|
||||
Metal Film,0.25 W,7,2.5,Standard,5 band,#82CFFD,#5B90B1
|
||||
Metal Film,0.5 W,9,3.2,Standard,5 band,#82CFFD,#5B90B1
|
||||
Metal Oxide,1 W,9,3,Standard,5 band,#D2D7DB,#B2B7BB
|
||||
Metal Oxide,2 W,12,4,Standard,5 band,#D2D7DB,#B2B7BB
|
||||
Metal Oxide,3 W,16,6,Standard,5 band,#D2D7DB,#B2B7BB
|
||||
Ceramic,2 W,18,7,Tubular,None,#F6F5F5,#CCCCCC
|
||||
Ceramic,3 W,22,8,Tubular,None,#F6F5F5,#CCCCCC
|
||||
Ceramic,5 W,22,9.5,Tubular,None,#F6F5F5,#CCCCCC
|
||||
Ceramic,7 W,35,9.5,Tubular,None,#F6F5F5,#CCCCCC
|
||||
Ceramic,10 W,48,9.5,Tubular,None,#F6F5F5,#CCCCCC
|
||||
Ceramic,15 W,48,13,Tubular,None,#F6F5F5,#CCCCCC
|
||||
Ceramic,20 W,63,13,Tubular,None,#F6F5F5,#CCCCCC
|
||||
Ceramic,30 W,75,19,Tubular,None,#F6F5F5,#CCCCCC
|
||||
Ceramic,50 W,90,19,Tubular,None,#F6F5F5,#CCCCCC
|
||||
Ceramic,80 W,109,19,Tubular,None,#F6F5F5,#CCCCCC
|
||||
Ceramic,100 W,135,22,Tubular,None,#F6F5F5,#CCCCCC
|
||||
Dale CMF55,0.5 W,6.22,2.29,Tubular Beveled,5 band,#D37D5B,#A04C2B
|
||||
Dale CMF60,1 W,8.75,3.53,Tubular Beveled,5 band,#D37D5B,#A04C2B
|
||||
@@ -1,12 +0,0 @@
|
||||
Power Amp,LA4440,2.54 mm,1NF,1IN,PREGND,MUTE (AC),RIPPLE (DC MUTE),2IN,2NF,2PGND,2BS,2OUT,VCC,1OUT,1BS,1PGND
|
||||
Power Amp,LA4485,2 mm,1IN,2IN,GND,BTLIN (BTL FEEDBACK),BTLOUT (BTL FEEDBACK),RIPPLE (FILTER),PVCC,VCC,STBY,MUTE,2OUT,PGND,1OUT
|
||||
Power Amp,LA4425A,2 mm,IN,GND,PGND (TAB),OUT,VCC
|
||||
Power Amp,TA7205AP,2.54 mm,VCC,BS,RIPPLE,PC1 (PHASE COMP),PC2 (PHASE COMP),IN,NF,PC3 (PHASE COMP),GND,OUT
|
||||
Power Amp,TDA1013B,2.54 mm,PGND,OUT,VCC,RIPPLE (ELECTRONIC FILTER),IN,CTLOUT (CONTROL UNIT OUTPUT),VC (DC VOLUME CONTROL),CTLIN (CONTROL UNIT INPUT),GND (SUBSTRATE)
|
||||
Power Amp,TDA1010A,2.54 mm,PGND,OUT,VCC,BS,RIPPLE,IN (POWER AMP),PREOUT,PREIN,GND (SUBSTRATE)
|
||||
Power Amp,TDA1521A,2.54 mm,1IN+,1IN-,GND (VCC/2 IN SINGLE SUPPLY),1OUT,VEE (GND IN SINGLE SUPPLY),2OUT,VCC,2IN-,2IN+
|
||||
Power Amp,TDA7056,2.54 mm,NC,VCC,IN,GND,NC,OUT+,PGND,OUT-,NC
|
||||
Power Amp,TDA7056A,2.54 mm,NC,VCC,IN,GND,VC (DC VOLUME CONTROL),OUT+,PGND,OUT-,NC
|
||||
Power Amp,BA5406,2.54 mm,VCC,1OUT,1BS,1NF,1IN,RIPPLE (FILTER MUTE),FILTER,2IN,2NF,2BS,2OUT,GND
|
||||
Power Amp,BA5417,2 mm,NC,2BS,2OUT,VCC,1OUT,1BS,PGND,STBY,RIPPLE (FILTER),1NF,1IN,2IN,2NF,1PREGND,2PREGND
|
||||
Preamp,BA3121N,2.54 mm,1OUT,1VM (GROUND SENSE),1IN,GND,2IN,2VM (GROUND SENSE),2OUT,VCC
|
||||
@@ -1,196 +0,0 @@
|
||||
/*
|
||||
|
||||
DIY Layout Creator (DIYLC).
|
||||
Copyright (c) 2009-2025 held jointly by the individual authors.
|
||||
|
||||
This file is part of DIYLC.
|
||||
|
||||
DIYLC is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
DIYLC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
package org.diylc.components;
|
||||
|
||||
import java.awt.geom.Point2D;
|
||||
import java.io.InputStream;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.diylc.appframework.miscutils.ConfigurationManager;
|
||||
import org.diylc.appframework.miscutils.IConfigListener;
|
||||
import org.diylc.appframework.miscutils.IConfigurationManager;
|
||||
import org.diylc.common.IPlugInPort;
|
||||
import org.diylc.core.Template;
|
||||
import org.diylc.presenter.VariantManager;
|
||||
import org.diylc.serialization.ProjectFileManager;
|
||||
import org.junit.Assert;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* Checks that a factory variant marked {@code deletedOn} in {@code import-defaults/variants.xml} is
|
||||
* taken out of the user's configuration only when the last import predates the deletion, and is
|
||||
* never imported.
|
||||
*/
|
||||
public class DeletedVariantsTest {
|
||||
|
||||
private static final String RESISTOR = "org.diylc.components.passive.Resistor";
|
||||
|
||||
@BeforeClass
|
||||
public static void setUp() {
|
||||
try {
|
||||
ConfigurationManager.getInstance().initialize("diylc");
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private static Map<String, List<Template>> loadVariants() {
|
||||
InputStream in = DeletedVariantsTest.class.getClassLoader()
|
||||
.getResourceAsStream("import-defaults/variants.xml");
|
||||
Assert.assertNotNull("variants.xml is not on the classpath", in);
|
||||
return (Map<String, List<Template>>) ProjectFileManager.xStreamSerializer.fromXML(in);
|
||||
}
|
||||
|
||||
private static Template deletedResistor() {
|
||||
return loadVariants().get(RESISTOR).stream().filter(t -> t.getDeletedOn() != null)
|
||||
.findFirst().get();
|
||||
}
|
||||
|
||||
private static InMemoryConfigurationManager configWith(List<Template> userResistors,
|
||||
LocalDateTime importDate) {
|
||||
Map<String, List<Template>> variantMap = new HashMap<String, List<Template>>();
|
||||
variantMap.put(RESISTOR, userResistors);
|
||||
InMemoryConfigurationManager config = new InMemoryConfigurationManager();
|
||||
config.writeValue(IPlugInPort.TEMPLATES_KEY, variantMap);
|
||||
config.writeValue(IPlugInPort.DEFAULT_TEMPLATES_IMPORT_DATE_KEY, importDate);
|
||||
return config;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private static List<Template> importInto(InMemoryConfigurationManager config) {
|
||||
new VariantManager(config, null).importDefaultVariants();
|
||||
return ((Map<String, List<Template>>) config.readObject(IPlugInPort.TEMPLATES_KEY, null))
|
||||
.get(RESISTOR);
|
||||
}
|
||||
|
||||
private static Template userVariant(String name) {
|
||||
List<Point2D> points = new ArrayList<Point2D>();
|
||||
points.add(new Point2D.Double(0, 0));
|
||||
return new Template(name, new HashMap<String, Object>(), points);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void deletedVariantsCarryOnlyTheirName() {
|
||||
for (Map.Entry<String, List<Template>> entry : loadVariants().entrySet()) {
|
||||
for (Template variant : entry.getValue()) {
|
||||
if (variant.getDeletedOn() != null) {
|
||||
String where = entry.getKey() + " / " + variant.getName();
|
||||
Assert.assertNotNull(where, variant.getName());
|
||||
Assert.assertNull(where, variant.getValues());
|
||||
Assert.assertNull(where, variant.getPoints());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void deletedWhenTheLastImportWasEarlier() {
|
||||
Template deleted = deletedResistor();
|
||||
Template own = userVariant("My Resistor");
|
||||
List<Template> userResistors = new ArrayList<Template>();
|
||||
userResistors.add(userVariant(deleted.getName()));
|
||||
userResistors.add(own);
|
||||
|
||||
List<Template> remaining =
|
||||
importInto(configWith(userResistors, deleted.getDeletedOn().minusDays(1)));
|
||||
|
||||
Assert.assertEquals(1, remaining.size());
|
||||
Assert.assertSame(own, remaining.get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void recreatedByTheUserAfterTheDeletionIsKept() {
|
||||
Template deleted = deletedResistor();
|
||||
List<Template> userResistors = new ArrayList<Template>();
|
||||
userResistors.add(userVariant(deleted.getName()));
|
||||
|
||||
List<Template> remaining =
|
||||
importInto(configWith(userResistors, deleted.getDeletedOn().plusDays(1)));
|
||||
|
||||
Assert.assertEquals(1, remaining.size());
|
||||
Assert.assertEquals(deleted.getName(), remaining.get(0).getName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void neverImported() {
|
||||
List<Template> remaining =
|
||||
importInto(configWith(new ArrayList<Template>(), LocalDateTime.MIN));
|
||||
|
||||
Assert.assertTrue(remaining.stream().noneMatch(t -> t.getDeletedOn() != null));
|
||||
}
|
||||
|
||||
private static class InMemoryConfigurationManager implements IConfigurationManager<Object> {
|
||||
|
||||
private final Map<String, Object> values = new HashMap<String, Object>();
|
||||
|
||||
@Override
|
||||
public void addConfigListener(String key, IConfigListener listener) {}
|
||||
|
||||
@Override
|
||||
public boolean readBoolean(String key, boolean defaultValue) {
|
||||
return (Boolean) values.getOrDefault(key, defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String readString(String key, String defaultValue) {
|
||||
return (String) values.getOrDefault(key, defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int readInt(String key, int defaultValue) {
|
||||
return (Integer) values.getOrDefault(key, defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float readFloat(String key, float defaultValue) {
|
||||
return (Float) values.getOrDefault(key, defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double readDouble(String key, double defaultValue) {
|
||||
return (Double) values.getOrDefault(key, defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object readObject(String key, Object defaultValue) {
|
||||
return values.getOrDefault(key, defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeValue(String key, Object value) {
|
||||
values.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getSerializer() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize(String appName) {}
|
||||
}
|
||||
}
|
||||
@@ -93,9 +93,6 @@ public class FactoryVariantsTest {
|
||||
|
||||
for (Template variant : entry.getValue()) {
|
||||
String where = type.getSimpleName() + " / " + variant.getName();
|
||||
if (variant.getDeletedOn() != null) {
|
||||
continue;
|
||||
}
|
||||
if (variant.getValues() == null || variant.getValues().isEmpty()) {
|
||||
problems.add(where + ": sets nothing");
|
||||
continue;
|
||||
|
||||
-241
@@ -1,241 +0,0 @@
|
||||
/*
|
||||
|
||||
DIY Layout Creator (DIYLC).
|
||||
Copyright (c) 2009-2025 held jointly by the individual authors.
|
||||
|
||||
This file is part of DIYLC.
|
||||
|
||||
DIYLC is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
DIYLC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
package org.diylc.components.chassis;
|
||||
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.diylc.components.chassis.ChassisPanel.Sides;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
import org.diylc.presenter.DatasheetService;
|
||||
import org.diylc.serialization.ProjectFileManager;
|
||||
import org.diylc.utils.BomEntry;
|
||||
import org.diylc.utils.BomMaker;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
public class ChassisPanelDatasheetTest {
|
||||
|
||||
private static final double TOLERANCE = 1e-6;
|
||||
|
||||
private static String[] row(String model) {
|
||||
return DatasheetService.getInstance().loadDatasheet(ChassisPanel.class).stream()
|
||||
.filter(row -> row[1].equals(model)).findFirst().get();
|
||||
}
|
||||
|
||||
private static double mm(double value) {
|
||||
return new Size(value, SizeUnit.mm).convertToPixels();
|
||||
}
|
||||
|
||||
private static void assertRect(Rectangle2D expected, Rectangle2D actual) {
|
||||
Assert.assertEquals(expected.getX(), actual.getX(), TOLERANCE);
|
||||
Assert.assertEquals(expected.getY(), actual.getY(), TOLERANCE);
|
||||
Assert.assertEquals(expected.getWidth(), actual.getWidth(), TOLERANCE);
|
||||
Assert.assertEquals(expected.getHeight(), actual.getHeight(), TOLERANCE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void everyRowApplies() {
|
||||
List<String[]> datasheet = DatasheetService.getInstance().loadDatasheet(ChassisPanel.class);
|
||||
Assert.assertNotNull(datasheet);
|
||||
Assert.assertFalse(datasheet.isEmpty());
|
||||
for (String[] row : datasheet) {
|
||||
Assert.assertEquals(String.join(",", row), 5, row.length);
|
||||
ChassisPanel enclosure = new ChassisPanel(row);
|
||||
Assert.assertEquals(row[1], enclosure.getValue());
|
||||
Assert.assertEquals(row[1], Size.parseSize(row[4]), enclosure.getHeight());
|
||||
Point2D first = enclosure.getControlPoint(0);
|
||||
Point2D second = enclosure.getControlPoint(1);
|
||||
Assert.assertEquals(row[1], Size.parseSize(row[2]).convertToPixels(),
|
||||
second.getX() - first.getX(), TOLERANCE);
|
||||
Assert.assertEquals(row[1], Size.parseSize(row[3]).convertToPixels(),
|
||||
second.getY() - first.getY(), TOLERANCE);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void aNewEnclosureIsA125BWithAllSides() {
|
||||
ChassisPanel enclosure = new ChassisPanel();
|
||||
ChassisPanel fromDatasheet = new ChassisPanel(row("125B"));
|
||||
|
||||
Assert.assertEquals(fromDatasheet.getValue(), enclosure.getValue());
|
||||
Assert.assertEquals(fromDatasheet.getHeight(), enclosure.getHeight());
|
||||
Assert.assertEquals(fromDatasheet.getEdgeRadius(), enclosure.getEdgeRadius());
|
||||
Assert.assertEquals(fromDatasheet.getControlPoint(1), enclosure.getControlPoint(1));
|
||||
Assert.assertEquals(Sides.ALL, enclosure.getSides());
|
||||
Assert.assertEquals(4, enclosure.getSidePanels().length);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void pedalSizedBoxesAreUprightAndBiggerOnesHorizontal() {
|
||||
for (String model : new String[] {"125B", "1590A", "1590B", "1590BB", "1550B"}) {
|
||||
Point2D second = new ChassisPanel(row(model)).getControlPoint(1);
|
||||
Assert.assertTrue(model, second.getY() > second.getX());
|
||||
}
|
||||
for (String model : new String[] {"1590XX", "1590DD", "1441-10", "1444-32"}) {
|
||||
Point2D second = new ChassisPanel(row(model)).getControlPoint(1);
|
||||
Assert.assertTrue(model, second.getX() > second.getY());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void modelNamesAreUnique() {
|
||||
List<String[]> datasheet = DatasheetService.getInstance().loadDatasheet(ChassisPanel.class);
|
||||
Assert.assertEquals(datasheet.size(),
|
||||
datasheet.stream().map(row -> row[1]).distinct().count());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void modelLeavesTheRadiusAlone() {
|
||||
ChassisPanel enclosure = new ChassisPanel();
|
||||
enclosure.setEdgeRadius(new Size(3d, SizeUnit.mm));
|
||||
|
||||
enclosure.applyModel(row("1590BB"));
|
||||
|
||||
Assert.assertEquals(new Size(3d, SizeUnit.mm), enclosure.getEdgeRadius());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void inchRowsKeepTheirUnit() {
|
||||
ChassisPanel enclosure = new ChassisPanel(row("1444-32"));
|
||||
Assert.assertEquals(new Size(3d, SizeUnit.in), enclosure.getHeight());
|
||||
Point2D first = enclosure.getControlPoint(0);
|
||||
Point2D second = enclosure.getControlPoint(1);
|
||||
Assert.assertEquals(new Size(17d, SizeUnit.in).convertToPixels(),
|
||||
second.getX() - first.getX(), TOLERANCE);
|
||||
Assert.assertEquals(new Size(10d, SizeUnit.in).convertToPixels(),
|
||||
second.getY() - first.getY(), TOLERANCE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sidesUnfoldAroundTheTopPanel() {
|
||||
ChassisPanel enclosure = new ChassisPanel(row("1590BB"));
|
||||
|
||||
Rectangle2D[] panels = enclosure.getSidePanels();
|
||||
|
||||
Assert.assertEquals(4, panels.length);
|
||||
assertRect(new Rectangle2D.Double(0, -mm(30), mm(94), mm(30)), panels[0]);
|
||||
assertRect(new Rectangle2D.Double(0, mm(119.5), mm(94), mm(30)), panels[1]);
|
||||
assertRect(new Rectangle2D.Double(-mm(30), 0, mm(30), mm(119.5)), panels[2]);
|
||||
assertRect(new Rectangle2D.Double(mm(94), 0, mm(30), mm(119.5)), panels[3]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void spacingSetsTheSidesApart() {
|
||||
ChassisPanel enclosure = new ChassisPanel(row("1590BB"));
|
||||
enclosure.setSpacing(new Size(2d, SizeUnit.mm));
|
||||
|
||||
Rectangle2D[] panels = enclosure.getSidePanels();
|
||||
|
||||
assertRect(new Rectangle2D.Double(0, -mm(32), mm(94), mm(30)), panels[0]);
|
||||
assertRect(new Rectangle2D.Double(0, mm(121.5), mm(94), mm(30)), panels[1]);
|
||||
assertRect(new Rectangle2D.Double(-mm(32), 0, mm(30), mm(119.5)), panels[2]);
|
||||
assertRect(new Rectangle2D.Double(mm(96), 0, mm(30), mm(119.5)), panels[3]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void frontAndBackOnly() {
|
||||
ChassisPanel enclosure = new ChassisPanel(row("1590BB"));
|
||||
enclosure.setSides(Sides.FRONT_AND_BACK);
|
||||
|
||||
Rectangle2D[] panels = enclosure.getSidePanels();
|
||||
|
||||
Assert.assertEquals(2, panels.length);
|
||||
assertRect(new Rectangle2D.Double(0, -mm(30), mm(94), mm(30)), panels[0]);
|
||||
assertRect(new Rectangle2D.Double(0, mm(119.5), mm(94), mm(30)), panels[1]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void noSidesKeepsTheModelButDrawsOnePanel() {
|
||||
ChassisPanel enclosure = new ChassisPanel(row("1590BB"));
|
||||
enclosure.setSides(Sides.NONE);
|
||||
|
||||
Assert.assertEquals(0, enclosure.getSidePanels().length);
|
||||
Assert.assertEquals(new Size(30d, SizeUnit.mm), enclosure.getHeight());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sidesFollowTheTopPanelWhenItIsStretched() {
|
||||
ChassisPanel enclosure = new ChassisPanel(row("1590BB"));
|
||||
enclosure.setControlPoint(new Point2D.Double(mm(200), mm(100)), 1);
|
||||
|
||||
Rectangle2D[] panels = enclosure.getSidePanels();
|
||||
|
||||
assertRect(new Rectangle2D.Double(0, mm(100), mm(200), mm(30)), panels[1]);
|
||||
assertRect(new Rectangle2D.Double(mm(200), 0, mm(30), mm(100)), panels[3]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void withoutHeightItIsASinglePanel() {
|
||||
ChassisPanel enclosure = new ChassisPanel();
|
||||
enclosure.setHeight(new Size(0d, SizeUnit.mm));
|
||||
Assert.assertEquals(0, enclosure.getSidePanels().length);
|
||||
|
||||
enclosure.setHeight(null);
|
||||
Assert.assertEquals(0, enclosure.getSidePanels().length);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void panelFromAnOldFileIsASinglePanel() {
|
||||
// a panel from before the datasheet: no model, a radius of 0 and a free-form size
|
||||
ChassisPanel original = new ChassisPanel();
|
||||
original.setValue("");
|
||||
original.setEdgeRadius(new Size(0d, SizeUnit.mm));
|
||||
original.setControlPoint(new Point2D.Double(20, 30), 1);
|
||||
String xml = ProjectFileManager.xStreamSerializer.toXML(original)
|
||||
.replaceAll("\\s*<height[^>]*/>", "").replaceAll("\\s*<height>.*?</height>", "")
|
||||
.replaceAll("\\s*<sides>[^<]*</sides>", "")
|
||||
.replaceAll("\\s*<spacing[^>]*/>", "").replaceAll("\\s*<spacing>.*?</spacing>", "");
|
||||
Assert.assertFalse(xml, xml.contains("<height"));
|
||||
Assert.assertFalse(xml, xml.contains("<sides>"));
|
||||
Assert.assertFalse(xml, xml.contains("<spacing"));
|
||||
|
||||
ChassisPanel reloaded = (ChassisPanel) ProjectFileManager.xStreamSerializer.fromXML(xml);
|
||||
|
||||
Assert.assertNull(reloaded.getHeight());
|
||||
Assert.assertEquals(Sides.ALL, reloaded.getSides());
|
||||
Assert.assertEquals(new Size(0d, SizeUnit.mm), reloaded.getSpacing());
|
||||
Assert.assertEquals(0, reloaded.getSidePanels().length);
|
||||
Assert.assertEquals("", reloaded.getValueForDisplay());
|
||||
Assert.assertEquals(new Size(0d, SizeUnit.mm), reloaded.getEdgeRadius());
|
||||
Assert.assertEquals(new Point2D.Double(20, 30), reloaded.getControlPoint(1));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bomListsEnclosuresByModel() {
|
||||
List<IDIYComponent<?>> components = new ArrayList<IDIYComponent<?>>();
|
||||
components.add(new ChassisPanel(row("1590BB")));
|
||||
components.add(new ChassisPanel(row("1590BB")));
|
||||
components.add(new ChassisPanel(row("1590B")));
|
||||
|
||||
List<BomEntry> bom = BomMaker.getInstance().createBom(components);
|
||||
|
||||
Assert.assertEquals(2, bom.size());
|
||||
BomEntry bb = bom.stream().filter(e -> "1590BB".equals(e.getValue())).findFirst().get();
|
||||
Assert.assertEquals("Enclosure", bb.getType());
|
||||
Assert.assertEquals(Integer.valueOf(2), bb.getQuantity());
|
||||
}
|
||||
}
|
||||
-88
@@ -1,88 +0,0 @@
|
||||
/*
|
||||
|
||||
DIY Layout Creator (DIYLC).
|
||||
Copyright (c) 2009-2025 held jointly by the individual authors.
|
||||
|
||||
This file is part of DIYLC.
|
||||
|
||||
DIYLC is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
DIYLC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
package org.diylc.components.passive;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.util.List;
|
||||
|
||||
import org.diylc.common.ResistorColorCode;
|
||||
import org.diylc.components.passive.Resistor.ResistorShape;
|
||||
import org.diylc.core.measures.Power;
|
||||
import org.diylc.core.measures.PowerUnit;
|
||||
import org.diylc.core.measures.Resistance;
|
||||
import org.diylc.core.measures.ResistanceUnit;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
import org.diylc.presenter.DatasheetService;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
public class ResistorDatasheetTest {
|
||||
|
||||
@Test
|
||||
public void everyRowApplies() {
|
||||
List<String[]> datasheet = DatasheetService.getInstance().loadDatasheet(Resistor.class);
|
||||
Assert.assertNotNull(datasheet);
|
||||
Assert.assertFalse(datasheet.isEmpty());
|
||||
for (String[] row : datasheet) {
|
||||
Resistor resistor = new Resistor(row);
|
||||
Assert.assertNotNull(String.join(",", row), resistor.getPowerNew());
|
||||
Assert.assertNull("a row must not set the resistance", resistor.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void appliesAllColumns() {
|
||||
Resistor resistor = new Resistor(DatasheetService.getInstance().findSeries(Resistor.class,
|
||||
"Ceramic").stream().filter(row -> row[1].equals("10 W")).findFirst().get());
|
||||
Assert.assertEquals(new Power(10d, PowerUnit.W), resistor.getPowerNew());
|
||||
Assert.assertEquals(new Size(48d, SizeUnit.mm), resistor.getLength());
|
||||
Assert.assertEquals(new Size(9.5d, SizeUnit.mm), resistor.getWidth());
|
||||
Assert.assertEquals(ResistorShape.Tubular, resistor.getShape());
|
||||
Assert.assertEquals(ResistorColorCode.NONE, resistor.getColorCode());
|
||||
Assert.assertEquals(Color.decode("#F6F5F5"), resistor.getBodyColor());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sizeKeepsItsUnit() {
|
||||
Resistor resistor = new Resistor(new String[] {"Carbon Comp", "0.5 W", "0.41 in", "0.15 in",
|
||||
"Tubular", "5 band", "#8A5E20", "#735832"});
|
||||
Assert.assertEquals(new Size(0.41d, SizeUnit.in), resistor.getLength());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void modelFollowsPowerRatingAndKeepsValue() {
|
||||
Resistor resistor = new Resistor();
|
||||
resistor.setValue(new Resistance(10d, ResistanceUnit.K));
|
||||
resistor.setPowerNew(new Power(0.5d, PowerUnit.W));
|
||||
|
||||
DatasheetService service = DatasheetService.getInstance();
|
||||
String[] model =
|
||||
service.findModel(resistor, service.findSeries(Resistor.class, "carbon comp"));
|
||||
Assert.assertNotNull(model);
|
||||
Assert.assertEquals("0.5 W", model[1]);
|
||||
|
||||
resistor.applyModel(model);
|
||||
Assert.assertEquals(new Resistance(10d, ResistanceUnit.K), resistor.getValue());
|
||||
Assert.assertEquals(new Size(0.41d, SizeUnit.in), resistor.getLength());
|
||||
}
|
||||
}
|
||||
-123
@@ -1,123 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* DIY Layout Creator (DIYLC).
|
||||
* Copyright (c) 2009-2025 held jointly by the individual authors.
|
||||
*
|
||||
* This file is part of DIYLC.
|
||||
*
|
||||
* DIYLC is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DIYLC is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package org.diylc.components.semiconductors;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.diylc.components.semiconductors.DIL_IC.PinCount;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
import org.diylc.netlist.Node;
|
||||
import org.diylc.presenter.DatasheetService;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
public class DIL_ICDatasheetTest {
|
||||
|
||||
private static final int FIRST_PIN_COLUMN = 3;
|
||||
|
||||
@Test
|
||||
public void everyRowApplies() {
|
||||
for (String[] row : datasheet()) {
|
||||
DIL_IC ic = new DIL_IC(row);
|
||||
String context = String.join(",", row);
|
||||
Assert.assertEquals(context, row[1], ic.getValue());
|
||||
Assert.assertEquals(context, row.length - FIRST_PIN_COLUMN, ic.getControlPointCount());
|
||||
for (int i = 0; i < ic.getControlPointCount(); i++) {
|
||||
Assert.assertFalse(context, ic.getControlPointNodeName(i).matches("\\d+"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void partNumbersAreUnique() {
|
||||
Set<String> parts = new HashSet<String>();
|
||||
for (String[] row : datasheet()) {
|
||||
Assert.assertTrue("repeated part " + row[1], parts.add(row[1].toUpperCase()));
|
||||
}
|
||||
}
|
||||
|
||||
/** Two pins share a net only when both say so with a numbered suffix, like GND_1 and GND_2. */
|
||||
@Test
|
||||
public void pinsShareANetOnlyThroughTheSuffix() {
|
||||
for (String[] row : datasheet()) {
|
||||
for (int i = FIRST_PIN_COLUMN; i < row.length; i++) {
|
||||
for (int j = i + 1; j < row.length; j++) {
|
||||
String rail = Node.railName(row[i]);
|
||||
if (rail != null && rail.equals(Node.railName(row[j]))) {
|
||||
Assert.assertTrue(row[1] + " pins " + row[i] + " and " + row[j],
|
||||
row[i].matches(".*_\\d+") && row[j].matches(".*_\\d+"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void partIsFoundByNumberNotByGroup() {
|
||||
DatasheetService service = DatasheetService.getInstance();
|
||||
Assert.assertEquals(1, service.findSeries(DIL_IC.class, "tl072").size());
|
||||
Assert.assertTrue(service.findSeries(DIL_IC.class, "Op-Amp (Dual)").isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void appliesAllColumns() {
|
||||
DIL_IC ic = new DIL_IC(DatasheetService.getInstance().findSeries(DIL_IC.class, "TL074").get(0));
|
||||
Assert.assertEquals("TL074", ic.getValue());
|
||||
Assert.assertEquals(PinCount._14, ic.getPinCount());
|
||||
Assert.assertEquals(new Size(0.3d, SizeUnit.in), ic.getRowSpacing());
|
||||
Assert.assertEquals("1OUT", ic.getControlPointNodeName(0));
|
||||
Assert.assertEquals("4OUT", ic.getControlPointNodeName(7));
|
||||
}
|
||||
|
||||
/** A new part has a blank value, which must not count as a value the model would change. */
|
||||
@Test
|
||||
public void modelAppliesToNewPart() {
|
||||
DIL_IC ic = new DIL_IC();
|
||||
DatasheetService service = DatasheetService.getInstance();
|
||||
String[] model = service.findModel(ic, service.findSeries(DIL_IC.class, "NE555"));
|
||||
Assert.assertNotNull(model);
|
||||
ic.applyModel(model);
|
||||
Assert.assertEquals("GND", ic.getControlPointNodeName(0));
|
||||
Assert.assertEquals("VCC", ic.getControlPointNodeName(4));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void modelMustMatchTheValue() {
|
||||
DatasheetService service = DatasheetService.getInstance();
|
||||
List<String[]> rows = service.findSeries(DIL_IC.class, "TL072");
|
||||
DIL_IC ic = new DIL_IC();
|
||||
ic.setValue("TL072");
|
||||
Assert.assertNotNull(service.findModel(ic, rows));
|
||||
ic.setValue("NE5532");
|
||||
Assert.assertNull(service.findModel(ic, rows));
|
||||
}
|
||||
|
||||
private static List<String[]> datasheet() {
|
||||
List<String[]> datasheet = DatasheetService.getInstance().loadDatasheet(DIL_IC.class);
|
||||
Assert.assertNotNull(datasheet);
|
||||
Assert.assertFalse(datasheet.isEmpty());
|
||||
return datasheet;
|
||||
}
|
||||
}
|
||||
-137
@@ -1,137 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* DIY Layout Creator (DIYLC).
|
||||
* Copyright (c) 2009-2025 held jointly by the individual authors.
|
||||
*
|
||||
* This file is part of DIYLC.
|
||||
*
|
||||
* DIYLC is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DIYLC is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package org.diylc.components.semiconductors;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.diylc.components.semiconductors.DIL_IC.DisplayNumbers;
|
||||
import org.diylc.components.semiconductors.DIL_IC.PinCount;
|
||||
import org.diylc.netlist.Node;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* Pin numbering and pin names of the DIP IC. Control points run down the first row and then down
|
||||
* the second, so on an 8-pin part control point 4 is pin 8.
|
||||
*/
|
||||
public class DIL_ICTest {
|
||||
|
||||
private static final String TL072 = "1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+";
|
||||
|
||||
@Test
|
||||
public void unnumberedPartReportsDipPinNumbers() {
|
||||
DIL_IC ic = ic(PinCount._8, DisplayNumbers.NO, null);
|
||||
assertNodeNames(ic, "1", "2", "3", "4", "8", "7", "6", "5");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void numberingSchemes() {
|
||||
assertNodeNames(ic(PinCount._8, DisplayNumbers.NAMES, null), "1", "2", "3", "4", "8", "7", "6",
|
||||
"5");
|
||||
assertNodeNames(ic(PinCount._8, DisplayNumbers.DIP, null), "1", "2", "3", "4", "8", "7", "6",
|
||||
"5");
|
||||
assertNodeNames(ic(PinCount._8, DisplayNumbers.DIP_MIRROR, null), "8", "7", "6", "5", "1",
|
||||
"2", "3", "4");
|
||||
assertNodeNames(ic(PinCount._8, DisplayNumbers.CONNECTOR, null), "1", "3", "5", "7", "2", "4",
|
||||
"6", "8");
|
||||
assertNodeNames(ic(PinCount._8, DisplayNumbers.CONNECTOR_MIRROR, null), "2", "4", "6", "8",
|
||||
"1", "3", "5", "7");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void everySchemeNumbersEachPinOnce() {
|
||||
for (PinCount pinCount : PinCount.values()) {
|
||||
for (DisplayNumbers numbers : DisplayNumbers.values()) {
|
||||
DIL_IC ic = ic(pinCount, numbers, null);
|
||||
Set<String> seen = new HashSet<String>();
|
||||
for (int i = 0; i < ic.getControlPointCount(); i++) {
|
||||
String name = ic.getControlPointNodeName(i);
|
||||
int number = Integer.parseInt(name);
|
||||
Assert.assertTrue(pinCount + " " + numbers + " pin " + name,
|
||||
number >= 1 && number <= pinCount.getValue());
|
||||
Assert.assertTrue(pinCount + " " + numbers + " repeats " + name, seen.add(name));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newPartShowsNames() {
|
||||
Assert.assertEquals(DisplayNumbers.NAMES, new DIL_IC().getDisplayNumbers());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void namesFollowPinNumbers() {
|
||||
assertNodeNames(ic(PinCount._8, DisplayNumbers.NO, TL072), "1OUT", "1IN-", "1IN+", "VCC-",
|
||||
"VCC+", "2OUT", "2IN-", "2IN+");
|
||||
}
|
||||
|
||||
/** Names belong to pins, so drawing the part from the solder side moves them with the numbers. */
|
||||
@Test
|
||||
public void namesFollowMirroredNumbering() {
|
||||
assertNodeNames(ic(PinCount._8, DisplayNumbers.DIP_MIRROR, TL072), "VCC+", "2OUT", "2IN-",
|
||||
"2IN+", "1OUT", "1IN-", "1IN+", "VCC-");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void missingAndBlankNamesFallBackToNumbers() {
|
||||
assertNodeNames(ic(PinCount._8, DisplayNumbers.NO, " TRIG , ,OUT"), "TRIG", "2", "OUT", "4",
|
||||
"8", "7", "6", "5");
|
||||
assertNodeNames(ic(PinCount._4, DisplayNumbers.NO, ""), "1", "2", "4", "3");
|
||||
}
|
||||
|
||||
/** Surplus names are kept, so going back to the larger package restores them. */
|
||||
@Test
|
||||
public void surplusNamesSurvivePinCountChange() {
|
||||
DIL_IC ic = ic(PinCount._8, DisplayNumbers.NO, TL072);
|
||||
ic.setPinCount(PinCount._4);
|
||||
assertNodeNames(ic, "1OUT", "1IN-", "VCC-", "1IN+");
|
||||
ic.setPinCount(PinCount._8);
|
||||
Assert.assertEquals("VCC+", ic.getControlPointNodeName(4));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void numberedSuffixNamesOneNet() {
|
||||
DIL_IC ic = ic(PinCount._4, DisplayNumbers.NO, "GND_1,GND_2,1IN-,2IN-");
|
||||
Assert.assertEquals(Node.railName(ic.getControlPointNodeName(0)),
|
||||
Node.railName(ic.getControlPointNodeName(1)));
|
||||
Assert.assertNotEquals(Node.railName(ic.getControlPointNodeName(2)),
|
||||
Node.railName(ic.getControlPointNodeName(3)));
|
||||
}
|
||||
|
||||
private static DIL_IC ic(PinCount pinCount, DisplayNumbers numbers, String pinNames) {
|
||||
DIL_IC ic = new DIL_IC();
|
||||
ic.setPinCount(pinCount);
|
||||
ic.setDisplayNumbers(numbers);
|
||||
ic.setPinNames(pinNames);
|
||||
return ic;
|
||||
}
|
||||
|
||||
private static void assertNodeNames(DIL_IC ic, String... expected) {
|
||||
String[] actual = new String[ic.getControlPointCount()];
|
||||
for (int i = 0; i < actual.length; i++) {
|
||||
actual[i] = ic.getControlPointNodeName(i);
|
||||
}
|
||||
Assert.assertArrayEquals(expected, actual);
|
||||
}
|
||||
}
|
||||
-87
@@ -1,87 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* DIY Layout Creator (DIYLC).
|
||||
* Copyright (c) 2009-2025 held jointly by the individual authors.
|
||||
*
|
||||
* This file is part of DIYLC.
|
||||
*
|
||||
* DIYLC is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DIYLC is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package org.diylc.components.semiconductors;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.diylc.netlist.Node;
|
||||
import org.diylc.presenter.DatasheetService;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
public class MultiwattICDatasheetTest {
|
||||
|
||||
private static final int FIRST_PIN_COLUMN = 2;
|
||||
|
||||
@Test
|
||||
public void everyRowApplies() {
|
||||
for (String[] row : datasheet()) {
|
||||
MultiwattIC ic = new MultiwattIC(row);
|
||||
String context = String.join(",", row);
|
||||
Assert.assertEquals(context, row[1], ic.getValue());
|
||||
Assert.assertEquals(context, row.length - FIRST_PIN_COLUMN, ic.getControlPointCount());
|
||||
for (int i = 0; i < ic.getControlPointCount(); i++) {
|
||||
Assert.assertFalse(context, ic.getControlPointNodeName(i).matches("\\d+"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void partNumbersAreUnique() {
|
||||
Set<String> parts = new HashSet<String>();
|
||||
for (String[] row : datasheet()) {
|
||||
Assert.assertTrue("repeated part " + row[1], parts.add(row[1].toUpperCase()));
|
||||
}
|
||||
}
|
||||
|
||||
/** Two pins share a net only when both say so with a numbered suffix, like GND_1 and GND_2. */
|
||||
@Test
|
||||
public void pinsShareANetOnlyThroughTheSuffix() {
|
||||
for (String[] row : datasheet()) {
|
||||
for (int i = FIRST_PIN_COLUMN; i < row.length; i++) {
|
||||
for (int j = i + 1; j < row.length; j++) {
|
||||
String rail = Node.railName(row[i]);
|
||||
if (rail != null && rail.equals(Node.railName(row[j]))) {
|
||||
Assert.assertTrue(row[1] + " pins " + row[i] + " and " + row[j],
|
||||
row[i].matches(".*_\\d+") && row[j].matches(".*_\\d+"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void partIsFoundByNumberNotByGroup() {
|
||||
DatasheetService service = DatasheetService.getInstance();
|
||||
Assert.assertEquals(1, service.findSeries(MultiwattIC.class, "LM3886").size());
|
||||
Assert.assertTrue(service.findSeries(MultiwattIC.class, "Power Amp").isEmpty());
|
||||
}
|
||||
|
||||
private static List<String[]> datasheet() {
|
||||
List<String[]> datasheet = DatasheetService.getInstance().loadDatasheet(MultiwattIC.class);
|
||||
Assert.assertNotNull(datasheet);
|
||||
Assert.assertFalse(datasheet.isEmpty());
|
||||
return datasheet;
|
||||
}
|
||||
}
|
||||
-95
@@ -1,95 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* DIY Layout Creator (DIYLC).
|
||||
* Copyright (c) 2009-2025 held jointly by the individual authors.
|
||||
*
|
||||
* This file is part of DIYLC.
|
||||
*
|
||||
* DIYLC is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DIYLC is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package org.diylc.components.semiconductors;
|
||||
|
||||
import org.diylc.components.semiconductors.MultiwattIC.MultiwattType;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* Pin numbering, pin names and lead pitch of the staggered power packages. Control points run down
|
||||
* the forward row and then down the row under the body, while the pins are numbered alternately
|
||||
* between them.
|
||||
*/
|
||||
public class MultiwattICTest {
|
||||
|
||||
@Test
|
||||
public void pinsAreNumberedAlternatelyBetweenRows() {
|
||||
assertNodeNames(ic(MultiwattType.MULTIWATT_11, null), "1", "3", "5", "7", "9", "11", "2", "4",
|
||||
"6", "8", "10");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void namesFollowPinNumbers() {
|
||||
assertNodeNames(ic(MultiwattType.MULTIWATT_11, "A,B,C,D,E,F,G,H,I,J,K"), "A", "C", "E", "G",
|
||||
"I", "K", "B", "D", "F", "H", "J");
|
||||
}
|
||||
|
||||
/** Consecutive leads alternate rows, so pin 2 sits one lead pitch along from pin 1. */
|
||||
@Test
|
||||
public void leadPitchFollowsThePackage() {
|
||||
assertLeadPitch(MultiwattType.MULTIWATT_11, new Size(1.7d, SizeUnit.mm));
|
||||
assertLeadPitch(MultiwattType.MULTIWATT_15, new Size(1.27d, SizeUnit.mm));
|
||||
}
|
||||
|
||||
/** Multiwatt 15 keeps the 0.1 in row pitch it always had, so existing layouts do not move. */
|
||||
@Test
|
||||
public void multiwatt15KeepsItsRowPitch() {
|
||||
MultiwattIC ic = ic(MultiwattType.MULTIWATT_15, null);
|
||||
Assert.assertEquals(new Size(0.1d, SizeUnit.in).convertToPixels(),
|
||||
ic.getControlPoint(1).getY() - ic.getControlPoint(0).getY(), 1d);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void modelPicksThePackageByPinCount() {
|
||||
MultiwattIC ic = new MultiwattIC(new String[] {"Power Amp", "TEST", "A", "B", "C", "D", "E",
|
||||
"F", "G", "H", "I", "J", "K"});
|
||||
Assert.assertEquals(MultiwattType.MULTIWATT_11, ic.getType());
|
||||
Assert.assertEquals("TEST", ic.getValue());
|
||||
// control point 6 opens the second row, which holds pin 2
|
||||
Assert.assertEquals("B", ic.getControlPointNodeName(6));
|
||||
}
|
||||
|
||||
private static void assertLeadPitch(MultiwattType type, Size expected) {
|
||||
MultiwattIC ic = ic(type, null);
|
||||
// with the default orientation the rows run down, so the lead pitch is a y distance
|
||||
double pitch = ic.getControlPoint(type.getPinsLeft()).getY() - ic.getControlPoint(0).getY();
|
||||
Assert.assertEquals(type.toString(), expected.convertToPixels(), pitch, 1d);
|
||||
}
|
||||
|
||||
private static MultiwattIC ic(MultiwattType type, String pinNames) {
|
||||
MultiwattIC ic = new MultiwattIC();
|
||||
ic.setType(type);
|
||||
ic.setPinNames(pinNames);
|
||||
return ic;
|
||||
}
|
||||
|
||||
private static void assertNodeNames(MultiwattIC ic, String... expected) {
|
||||
String[] actual = new String[ic.getControlPointCount()];
|
||||
for (int i = 0; i < actual.length; i++) {
|
||||
actual[i] = ic.getControlPointNodeName(i);
|
||||
}
|
||||
Assert.assertArrayEquals(expected, actual);
|
||||
}
|
||||
}
|
||||
-87
@@ -1,87 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* DIY Layout Creator (DIYLC).
|
||||
* Copyright (c) 2009-2025 held jointly by the individual authors.
|
||||
*
|
||||
* This file is part of DIYLC.
|
||||
*
|
||||
* DIYLC is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DIYLC is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package org.diylc.components.semiconductors;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.diylc.netlist.Node;
|
||||
import org.diylc.presenter.DatasheetService;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
public class SIL_ICDatasheetTest {
|
||||
|
||||
private static final int FIRST_PIN_COLUMN = 3;
|
||||
|
||||
@Test
|
||||
public void everyRowApplies() {
|
||||
for (String[] row : datasheet()) {
|
||||
SIL_IC ic = new SIL_IC(row);
|
||||
String context = String.join(",", row);
|
||||
Assert.assertEquals(context, row[1], ic.getValue());
|
||||
Assert.assertEquals(context, row.length - FIRST_PIN_COLUMN, ic.getControlPointCount());
|
||||
for (int i = 0; i < ic.getControlPointCount(); i++) {
|
||||
Assert.assertFalse(context, ic.getControlPointNodeName(i).matches("\\d+"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void partNumbersAreUnique() {
|
||||
Set<String> parts = new HashSet<String>();
|
||||
for (String[] row : datasheet()) {
|
||||
Assert.assertTrue("repeated part " + row[1], parts.add(row[1].toUpperCase()));
|
||||
}
|
||||
}
|
||||
|
||||
/** Two pins share a net only when both say so with a numbered suffix, like GND_1 and GND_2. */
|
||||
@Test
|
||||
public void pinsShareANetOnlyThroughTheSuffix() {
|
||||
for (String[] row : datasheet()) {
|
||||
for (int i = FIRST_PIN_COLUMN; i < row.length; i++) {
|
||||
for (int j = i + 1; j < row.length; j++) {
|
||||
String rail = Node.railName(row[i]);
|
||||
if (rail != null && rail.equals(Node.railName(row[j]))) {
|
||||
Assert.assertTrue(row[1] + " pins " + row[i] + " and " + row[j],
|
||||
row[i].matches(".*_\\d+") && row[j].matches(".*_\\d+"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void partIsFoundByNumberNotByGroup() {
|
||||
DatasheetService service = DatasheetService.getInstance();
|
||||
Assert.assertEquals(1, service.findSeries(SIL_IC.class, "LA4440").size());
|
||||
Assert.assertTrue(service.findSeries(SIL_IC.class, "Power Amp").isEmpty());
|
||||
}
|
||||
|
||||
private static List<String[]> datasheet() {
|
||||
List<String[]> datasheet = DatasheetService.getInstance().loadDatasheet(SIL_IC.class);
|
||||
Assert.assertNotNull(datasheet);
|
||||
Assert.assertFalse(datasheet.isEmpty());
|
||||
return datasheet;
|
||||
}
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* DIY Layout Creator (DIYLC).
|
||||
* Copyright (c) 2009-2025 held jointly by the individual authors.
|
||||
*
|
||||
* This file is part of DIYLC.
|
||||
*
|
||||
* DIYLC is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DIYLC is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package org.diylc.components.semiconductors;
|
||||
|
||||
import org.diylc.components.semiconductors.SIL_IC.PinCount;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
public class SIL_ICTest {
|
||||
|
||||
@Test
|
||||
public void unnamedPinsAreNumberedFromTheAnchor() {
|
||||
SIL_IC ic = new SIL_IC();
|
||||
ic.setPinCount(PinCount._4);
|
||||
assertNodeNames(ic, "1", "2", "3", "4");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void missingAndBlankNamesFallBackToNumbers() {
|
||||
SIL_IC ic = new SIL_IC();
|
||||
ic.setPinCount(PinCount._4);
|
||||
ic.setPinNames("1IN, ,GND");
|
||||
assertNodeNames(ic, "1IN", "2", "GND", "4");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void modelSetsPitchCountAndNames() {
|
||||
SIL_IC ic = new SIL_IC(new String[] {"Power Amp", "TEST", "2 mm", "IN", "GND", "OUT"});
|
||||
Assert.assertEquals("TEST", ic.getValue());
|
||||
Assert.assertEquals(PinCount._3, ic.getPinCount());
|
||||
Assert.assertEquals(new Size(2d, SizeUnit.mm), ic.getPinSpacing());
|
||||
assertNodeNames(ic, "IN", "GND", "OUT");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newPartShowsNames() {
|
||||
Assert.assertEquals(PinLabels.NAMES, new SIL_IC().getPinLabels());
|
||||
}
|
||||
|
||||
private static void assertNodeNames(SIL_IC ic, String... expected) {
|
||||
String[] actual = new String[ic.getControlPointCount()];
|
||||
for (int i = 0; i < actual.length; i++) {
|
||||
actual[i] = ic.getControlPointNodeName(i);
|
||||
}
|
||||
Assert.assertArrayEquals(expected, actual);
|
||||
}
|
||||
}
|
||||
@@ -135,7 +135,7 @@ passive.TransformerCore = none
|
||||
passive.TrimmerPotentiometer = fixed
|
||||
semiconductors.BJTSymbol = fixed
|
||||
semiconductors.BridgeRectifier = fixed
|
||||
semiconductors.DIL_IC = Pin Labels, Pins
|
||||
semiconductors.DIL_IC = Display Pin #s, Pins
|
||||
semiconductors.DiodeGlass = fixed
|
||||
semiconductors.DiodePlastic = fixed
|
||||
semiconductors.DiodeSymbol = fixed
|
||||
|
||||
+16
-10
@@ -37,11 +37,11 @@ import javax.swing.SwingUtilities;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
|
||||
import org.diylc.common.ComponentType;
|
||||
import org.diylc.common.IPlugInPort;
|
||||
import org.diylc.core.ComponentGroup;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.lang.LangUtil;
|
||||
import org.diylc.presenter.ComponentProcessor;
|
||||
import org.diylc.swing.ISwingUI;
|
||||
import org.diylc.swing.gui.ComponentPopupMenu;
|
||||
import org.diylc.swing.gui.DragDropList;
|
||||
@@ -257,7 +257,7 @@ public class ExplorerPane extends JPanel {
|
||||
0, false, false)
|
||||
.getPreferredSize().height);
|
||||
componentList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
|
||||
componentList.setCellRenderer(new ComponentListCellRenderer());
|
||||
componentList.setCellRenderer(new ComponentListCellRenderer(plugInPort.getComponentTypes()));
|
||||
selectionListener = new ListSelectionListener() {
|
||||
|
||||
@Override
|
||||
@@ -586,6 +586,13 @@ public class ExplorerPane extends JPanel {
|
||||
|
||||
protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
|
||||
|
||||
private Map<String, ComponentType> componentTypes;
|
||||
|
||||
public ComponentListCellRenderer(Map<String, List<ComponentType>> componentTypeMap) {
|
||||
this.componentTypes = componentTypeMap.values().stream().flatMap(x -> x.stream())
|
||||
.collect(Collectors.toMap(x -> x.getInstanceClass().getCanonicalName(), x -> x));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getListCellRendererComponent(JList<? extends ComponentGroupItem> list,
|
||||
ComponentGroupItem value, int index, boolean isSelected, boolean cellHasFocus) {
|
||||
@@ -598,15 +605,14 @@ public class ExplorerPane extends JPanel {
|
||||
if (groupItem.getComponentCount() == 1) {
|
||||
// Render as individual component (ungrouped)
|
||||
IDIYComponent<?> component = groupItem.getGroup().iterator().next();
|
||||
double zOrder = ComponentProcessor.getInstance().getZOrder(component);
|
||||
|
||||
// internal types without a descriptor have no layer
|
||||
if (zOrder == Double.MAX_VALUE) {
|
||||
ComponentType componentType = componentTypes.get(component.getClass().getCanonicalName());
|
||||
|
||||
if (componentType == null) {
|
||||
renderer.setText(component.toString());
|
||||
return renderer;
|
||||
}
|
||||
|
||||
int layerId = (int) Math.round(zOrder);
|
||||
int layerId = (int) Math.round(componentType.getZOrder());
|
||||
|
||||
String valueForDisplay = component.getValueForDisplay();
|
||||
if (isSelected) {
|
||||
@@ -631,9 +637,9 @@ public class ExplorerPane extends JPanel {
|
||||
// Calculate maximum layer from components in the group
|
||||
int maxLayerId = 0;
|
||||
for (IDIYComponent<?> component : groupItem.getGroup()) {
|
||||
double zOrder = ComponentProcessor.getInstance().getZOrder(component);
|
||||
if (zOrder != Double.MAX_VALUE) {
|
||||
int layerId = (int) Math.round(zOrder);
|
||||
ComponentType componentType = componentTypes.get(component.getClass().getCanonicalName());
|
||||
if (componentType != null) {
|
||||
int layerId = (int) Math.round(componentType.getZOrder());
|
||||
if (layerId > maxLayerId) {
|
||||
maxLayerId = layerId;
|
||||
}
|
||||
|
||||
@@ -117,6 +117,7 @@ Diameter|Durchmesser
|
||||
Directional|Direktionell
|
||||
Directly heated|Direkt geheizt
|
||||
Display|Anzeigen
|
||||
Display Pin #s|Stiftnummern anzeigen
|
||||
Dog Ear|‘Dog Ear’
|
||||
Dot Spacing|Punktabstand
|
||||
Dotted|Gepunktet
|
||||
@@ -713,10 +714,3 @@ Reconnect %s to %s|%s mit %s neu verbinden
|
||||
Editing your circuit:|Der Bearbeitung Ihrer Schaltung:
|
||||
Generating new layouts:|Der Erstellung neuer Layouts:
|
||||
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|Der KI-Schaltungsanalysator erfordert ein DIYLC-Cloud-Konto. Möchten Sie sich jetzt anmelden?
|
||||
Pin Names|Pinnamen
|
||||
Pin Labels|Pin-Beschriftungen
|
||||
Names|Namen
|
||||
Hardware|Hardware
|
||||
Sides|Seiten
|
||||
All|Alle
|
||||
Front and Back|Vorne und hinten
|
||||
|
||||
@@ -117,6 +117,7 @@ Diameter
|
||||
Directional
|
||||
Directly heated
|
||||
Display
|
||||
Display Pin #s
|
||||
Dog Ear
|
||||
Dot Spacing
|
||||
Donate
|
||||
@@ -706,10 +707,3 @@ Reconnect %s to %s
|
||||
Editing your circuit:
|
||||
Generating new layouts:
|
||||
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?
|
||||
Pin Names
|
||||
Pin Labels
|
||||
Names
|
||||
Hardware
|
||||
Sides
|
||||
All
|
||||
Front and Back
|
||||
|
||||
@@ -114,6 +114,7 @@ Diameter|Diámetro
|
||||
Directional|Direccional
|
||||
Directly heated|Caldeo Directo
|
||||
Display|Mostrar
|
||||
Display Pin #s|Mostrar Numeración de Pines
|
||||
Dog Ear|Dog Ear
|
||||
Dot Spacing|Espaciado de puntos
|
||||
Dotted|Punteado
|
||||
@@ -709,10 +710,3 @@ Reconnect %s to %s|Reconectar %s a %s
|
||||
Editing your circuit:|Edición de su circuito:
|
||||
Generating new layouts:|Generación de nuevos diseños:
|
||||
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|El Analizador de Circuitos IA requiere una cuenta de DIYLC Cloud. ¿Desea iniciar sesión ahora?
|
||||
Pin Names|Nombres de Pines
|
||||
Pin Labels|Etiquetas de Pines
|
||||
Names|Nombres
|
||||
Hardware|Herrajes
|
||||
Sides|Lados
|
||||
All|Todos
|
||||
Front and Back|Frente y parte trasera
|
||||
|
||||
@@ -114,6 +114,7 @@ Diameter|Diamètre
|
||||
Directional|Directionnel
|
||||
Directly heated|Directement chauffé
|
||||
Display|Affichage
|
||||
Display Pin #s|Afficher broche #s
|
||||
Dog Ear|Dog Ear
|
||||
Dot Spacing|Espacement des points
|
||||
Dotted|Pointillé (tiret)
|
||||
@@ -708,10 +709,3 @@ Reconnect %s to %s|Reconnecter %s à %s
|
||||
Editing your circuit:|La modification de votre circuit :
|
||||
Generating new layouts:|La génération de nouvelles implantations :
|
||||
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|L'analyseur de circuit IA nécessite un compte DIYLC Cloud. Voulez-vous vous connecter maintenant ?
|
||||
Pin Names|Noms des broches
|
||||
Pin Labels|Étiquettes des broches
|
||||
Names|Noms
|
||||
Hardware|Quincaillerie
|
||||
Sides|Côtés
|
||||
All|Tous
|
||||
Front and Back|Avant et arrière
|
||||
|
||||
@@ -117,6 +117,7 @@ Diameter|Diametro
|
||||
Directional|Direzionale
|
||||
Directly heated|Riscaldato Diretto
|
||||
Display|Display
|
||||
Display Pin #s|Mostra i Pin #s
|
||||
Dog Ear|Dog Ear
|
||||
Dot Spacing|Spaziatura Punti
|
||||
Dotted|Tratteggiato
|
||||
@@ -710,10 +711,3 @@ Reconnect %s to %s|Ricollega %s a %s
|
||||
Editing your circuit:|Modifica del tuo circuito:
|
||||
Generating new layouts:|Generazione di nuovi layout:
|
||||
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|L'Analizzatore di Circuiti IA richiede un account DIYLC Cloud. Vuoi accedere ora?
|
||||
Pin Names|Nomi dei Pin
|
||||
Pin Labels|Etichette dei Pin
|
||||
Names|Nomi
|
||||
Hardware|Minuteria
|
||||
Sides|Lati
|
||||
All|Tutti
|
||||
Front and Back|Fronte e retro
|
||||
|
||||
@@ -117,6 +117,7 @@ Diameter|Diameter
|
||||
Directional|Directioneel
|
||||
Directly heated|Direct verwarmd
|
||||
Display|Weergeven
|
||||
Display Pin #s|Pin #s weergeven
|
||||
Dog Ear|Dog Ear
|
||||
Dot Spacing|Spatiëring
|
||||
Dotted|Gestippeld
|
||||
@@ -714,10 +715,3 @@ Reconnect %s to %s|%s opnieuw verbinden met %s
|
||||
Editing your circuit:|Uw schakeling bewerken:
|
||||
Generating new layouts:|Nieuwe layouts genereren:
|
||||
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|De AI Circuit Analysator vereist een DIYLC Cloud-account. Wilt u nu inloggen?
|
||||
Pin Names|Pinnamen
|
||||
Pin Labels|Pinlabels
|
||||
Names|Namen
|
||||
Hardware|Hardware
|
||||
Sides|Zijden
|
||||
All|Alle
|
||||
Front and Back|Voor- en achterkant
|
||||
|
||||
@@ -114,6 +114,7 @@ Diameter|Diâmetro
|
||||
Directional|Direcional
|
||||
Directly heated|Aquecido diretamente
|
||||
Display|Mostrar
|
||||
Display Pin #s|Mostrar Numeracão dos Pinos
|
||||
Dog Ear|Dog Ear
|
||||
Dot Spacing|Espaçamento de Pontos
|
||||
Dotted|Pontilhado
|
||||
@@ -709,10 +710,3 @@ Reconnect %s to %s|Reconectar %s a %s
|
||||
Editing your circuit:|Edição do seu circuito:
|
||||
Generating new layouts:|Geração de novos layouts:
|
||||
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|O Analisador de Circuito IA requer uma conta DIYLC Cloud. Deseja entrar agora?
|
||||
Pin Names|Nomes dos Pinos
|
||||
Pin Labels|Rótulos dos Pinos
|
||||
Names|Nomes
|
||||
Hardware|Ferragens
|
||||
Sides|Lados
|
||||
All|Todos
|
||||
Front and Back|Frente e traseira
|
||||
|
||||
@@ -114,6 +114,7 @@ Diameter|Prečnik
|
||||
Directional|Usmereni
|
||||
Directly heated|Direktno grejanje
|
||||
Display|Prikaz
|
||||
Display Pin #s|Prikaz Brojeva Pinova
|
||||
Dog Ear
|
||||
Dot Spacing|Razmak Između Tačaka
|
||||
Dotted|Tačkasta
|
||||
@@ -705,10 +706,3 @@ Reconnect %s to %s|Ponovo poveži %s sa %s
|
||||
Editing your circuit:|Izmenama vašeg kola:
|
||||
Generating new layouts:|Generisanju novih rasporeda:
|
||||
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|AI Analizator Kola zahteva DIYLC Cloud nalog. Da li želite da se prijavite sada?
|
||||
Pin Names|Nazivi Pinova
|
||||
Pin Labels|Oznake Pinova
|
||||
Names|Nazivi
|
||||
Hardware|Mehanički delovi
|
||||
Sides|Strane
|
||||
All|Sve
|
||||
Front and Back|Prednja i zadnja
|
||||
|
||||
@@ -117,6 +117,7 @@ Diameter|व्यास
|
||||
Directional|दिशात्मक
|
||||
Directly heated|सीधे गर्म
|
||||
Display|डिस्प्ले
|
||||
Display Pin #s|पिन #s दिखाएं
|
||||
Dog Ear|डॉग ईयर
|
||||
Dot Spacing|डॉट स्पेसिंग
|
||||
Donate|दान करें
|
||||
@@ -707,10 +708,3 @@ Reconnect %s to %s|%s को %s से फिर से जोड़ें
|
||||
Editing your circuit:|आपके सर्किट को संपादित करना:
|
||||
Generating new layouts:|नए लेआउट बनाना:
|
||||
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|AI सर्किट विश्लेषक के लिए DIYLC Cloud खाते की आवश्यकता है। क्या आप अभी लॉग इन करना चाहेंगे?
|
||||
Pin Names|पिन नाम
|
||||
Pin Labels|पिन लेबल
|
||||
Names|नाम
|
||||
Hardware|हार्डवेयर
|
||||
Sides|भुजाएं
|
||||
All|सभी
|
||||
Front and Back|आगे और पीछे
|
||||
|
||||
@@ -117,6 +117,7 @@ Diameter|直径
|
||||
Directional|定向
|
||||
Directly heated|直接加热
|
||||
Display|显示
|
||||
Display Pin #s|显示引脚编号
|
||||
Dog Ear|狗耳
|
||||
Dot Spacing|点间距
|
||||
Donate|捐赠
|
||||
@@ -707,10 +708,3 @@ Reconnect %s to %s|将 %s 重新连接到 %s
|
||||
Editing your circuit:|编辑您的电路:
|
||||
Generating new layouts:|生成新的布局:
|
||||
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|AI电路分析器需要 DIYLC Cloud 账户。是否立即登录?
|
||||
Pin Names|引脚名称
|
||||
Pin Labels|引脚标签
|
||||
Names|名称
|
||||
Hardware|五金件
|
||||
Sides|侧面
|
||||
All|全部
|
||||
Front and Back|前后
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package org.diylc;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
@@ -15,13 +14,10 @@ import org.junit.Test;
|
||||
|
||||
import org.diylc.appframework.miscutils.ConfigurationManager;
|
||||
import org.diylc.appframework.miscutils.InMemoryConfigurationManager;
|
||||
import org.diylc.clipboard.ComponentTransferable;
|
||||
import org.diylc.common.ComponentType;
|
||||
import org.diylc.common.EventType;
|
||||
import org.diylc.common.IPlugIn;
|
||||
import org.diylc.common.IPlugInPort;
|
||||
import org.diylc.components.chassis.ChassisPanel;
|
||||
import org.diylc.components.composite.CompositeComponent;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.Template;
|
||||
import org.diylc.presenter.Presenter;
|
||||
@@ -49,24 +45,6 @@ public class PresenterTests extends TestBase {
|
||||
Assert.assertEquals(1, presenter.getCurrentProject().getComponents().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChassisCompositeIsPlacedUnderExistingComponents() {
|
||||
instantiateTwoClick("Passive", "Resistor", new Point(1000, 1000), new Point(1200, 1000));
|
||||
|
||||
CompositeComponent chassis = new CompositeComponent();
|
||||
chassis.initBlockName("Chassis");
|
||||
chassis.getChildComponents().add(new ChassisPanel());
|
||||
chassis.getChildComponents().add(new ChassisPanel());
|
||||
List<IDIYComponent<?>> clipboard = new ArrayList<IDIYComponent<?>>();
|
||||
clipboard.add(chassis);
|
||||
presenter.pasteComponents(new ComponentTransferable(clipboard, "Chassis"), false, true);
|
||||
presenter.mouseClicked(new Point(500, 500), MouseEvent.BUTTON1, false, false, false, 1);
|
||||
|
||||
List<IDIYComponent<?>> components = presenter.getCurrentProject().getComponents();
|
||||
Assert.assertEquals(2, components.size());
|
||||
Assert.assertTrue(components.get(0) instanceof CompositeComponent);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNodeNameHover() {
|
||||
final String[] receivedTooltip = new String[1];
|
||||
|
||||
@@ -1,128 +0,0 @@
|
||||
# Chassis and Enclosures
|
||||
|
||||
The Hammond die-cast and amplifier chassis lineup as a datasheet on a single `Enclosure`
|
||||
component that draws either one panel or an exploded view of the whole box.
|
||||
|
||||
## 1. Current state
|
||||
|
||||
- `ChassisPanel` (`diylc-library`, `org.diylc.components.chassis`) is shown as **Enclosure** in the
|
||||
new **Hardware** category, with instance prefix `ENC`. The class name is unchanged, so files,
|
||||
favourites, recent components and variants, all keyed by class, are unaffected. The three
|
||||
cutouts, Drill Hole and Dial Scale moved to Hardware with it.
|
||||
- It is a two-point `AbstractTransparentComponent<String>` (no longer an `AbstractShape`) on the
|
||||
`CHASSIS` layer. The control points are the top panel.
|
||||
With `Height` > 0 the sides are unfolded around it (front above, back below, left and right to
|
||||
the sides; never the bottom), per `Sides`: `All`, `Front and Back` or `None`, set `Spacing`
|
||||
(default 0, edge to edge) apart from the top.
|
||||
- A new enclosure is an upright 125B with all sides, square corners and no spacing (`DEFAULT_*`
|
||||
constants; the size matches its datasheet row).
|
||||
Old files are unaffected: XStream runs no constructor or initializer, so their saved size,
|
||||
radius and empty value stay and their missing `height` keeps them a single panel. `Height` null
|
||||
(old files) or 0, or `Sides = None`, draws a single panel, as `ChassisPanel` always did.
|
||||
- A datasheet of 132 Hammond and generic models (§4) sets `Value` (the model), the top panel size
|
||||
and `Height`; it leaves `Radius` alone. One component is one enclosure, so the BOM lists `Enclosure / 1590BB`.
|
||||
- The four old factory variants (`125B`, `A`, `B`, `BB`) are withdrawn as `deletedOn` stubs.
|
||||
- Composites take the lowest layer of their children (`ComponentProcessor.getZOrder`), so a
|
||||
building block made of chassis parts sits on the Chassis layer and hides and locks with it.
|
||||
|
||||
## 2. Design decisions
|
||||
|
||||
| # | Decision | Rationale |
|
||||
|---|---|---|
|
||||
| D1 | One component draws the whole enclosure; no per-side panels and no exploded building blocks | Every datasheet model is an exploded enclosure in one click, the BOM gets one line per box, stretching the top drags the sides along, rotation needs no special code, and the component sits on the Chassis layer natively. Building blocks would have needed import tracking, a flat toolbar of ~10 buttons, and a per-panel BOM workaround. |
|
||||
| D2 | Row format `Group,Model,X,Y,Height`: the top panel's size as placed, then the wall height, every size with its unit (`119.5 mm`, `17 in`), parsed with `Size.parseSize` like `DIL_IC` | Pedal drawings are metric, Hammond chassis are nominal inches; writing each in its native unit keeps the file checkable against the drawings. |
|
||||
| D3 | `ChassisPanel` no longer extends `AbstractShape`; it is an `AbstractTransparentComponent<String>` whose value is the model. It keeps every field name it inherited (`value`, `controlPoints`, `firstPoint`, `secondPoint`, `color`, `borderColor`), and `borderThickness` stays as a `@Deprecated` unused field; `edgeRadius`, `height`, `sides` and `spacing` read `null` from old files and default in their getters | XStream fails on unknown fields, so a name an old file stores must stay. The border is a fixed 1 px line; old panels drawn with a thicker border now draw with 1 px. |
|
||||
| D4 | Die-cast boxes up to 125 mm long (1590, 1550, 125B) are listed upright, with Hammond's length along Y; longer boxes and all 1441/1444 chassis horizontal. A new enclosure is an upright 125B. `applyModel` sets `Value`, `Height` and the top panel size, keeping the first control point and the direction the panel is drawn in | Pedals use the small boxes upright, with the jacks and DC socket on the short ends, which the front and back panels then show; bigger boxes and amp chassis are used lying down. |
|
||||
| D5 | The datasheet carries no corner radius; `Radius` defaults to 0 and only the top panel uses it, the sides are drawn square | Hammond does not publish the die-cast corner radius (§5), so rounded corners are set by hand when wanted. |
|
||||
| D6 | Length/Width are Hammond's outside dimensions; Height is the drillable wall: box height without the lid for die-cast boxes, outside height for 1441/1444 | The lid of a 1590 is the pedal's bottom, which the exploded view leaves out. |
|
||||
| D7 | Die-cast taper is ignored: the top uses the outer size at the lid opening and the sides are rectangles | Hammond does not publish the floor size; the walls slope at most 2 deg, so the floor is 0.7-1.9 mm smaller per side (§5). |
|
||||
| D8 | A composite's z-order is the minimum of its children's, computed per instance | A composite is drawn as a unit, so it should sit under what is placed on it afterwards; a maker board built from a board, pads and silkscreen text belongs on the Board layer, not the Text layer. |
|
||||
| D9 | Die-cast boxes come from the 1590 and 1550 series only, natural finish only, plus generic sizes such as 125B under `Others`. HWCHAS walnut chassis and rack cases are out | Painted and black versions share the natural part's dimensions, and the shaped 1590 STOMP boxes (TRPB, TRPC, STPC) are sold painted only. |
|
||||
|
||||
## 3. Implementation
|
||||
|
||||
### 3.1 Composite z-order (core) - done
|
||||
|
||||
- `ComponentProcessor.getZOrder(IDIYComponent<?>)`: for a `CompositeComponent`, the minimum over
|
||||
its children, recursing into nested composites; a childless composite and any other component
|
||||
use the type's z-order. Not cached: a type lookup is a map hit and composites are few.
|
||||
- Every class-level layer read goes through it: `Presenter` insertion, hidden and locked layers,
|
||||
`selectAll(layer)`, send to back / bring to front; `GroupAndLockIndex.isLocked`;
|
||||
`ComparatorFactory.getComponentZOrderComparator`; the `[L#]` tag in `ExplorerPane`.
|
||||
- Tests: `CompositeComponentTest` and
|
||||
`PresenterTests.testChassisCompositeIsPlacedUnderExistingComponents`.
|
||||
|
||||
### 3.2 Enclosure (library) - done
|
||||
|
||||
- `ChassisPanel` implements `IDatasheetSupport` (two creation steps, model column 1) with a
|
||||
`ChassisPanel(String[] model)` constructor; rows in `datasheets/ChassisPanel.datasheet`.
|
||||
- `getSidePanels()` derives the side rectangles from the top panel's normalized corners and
|
||||
`Spacing` (a new field; `null` from files reads as 0); `draw()`
|
||||
fills them before `stopTracking()` so they take part in hit-testing, and outlines them with the
|
||||
top. `getValueForDisplay()` returns the model.
|
||||
- Category `Hardware` for `ChassisPanel`, the three cutouts, `DrillHole` and `DialScale`. New
|
||||
language keys in every `lang/` file: `Hardware`, `Sides`, `All`, `Front and Back` (`Height`
|
||||
and `None` existed). `catalog_full.json` and `catalog_index.json` regenerated.
|
||||
- Tests: `ChassisPanelDatasheetTest` (every row applies, unique model names, inch rows,
|
||||
radius left alone by a model, side layout for All / Front and Back / None, spacing, sides follow a stretched top, no height, old-file
|
||||
panel, BOM).
|
||||
|
||||
### 3.3 Verify
|
||||
|
||||
`mvn -q test`, then the regression suite: the z-order change alters hide/lock of existing
|
||||
composites, and `ChassisPanel` gained serialized fields and a new category.
|
||||
|
||||
## 4. Datasheet rows
|
||||
|
||||
Sources: Hammond per-part drawings, `https://www.hammfg.com/files/parts/pdf/<PART>.pdf`; series
|
||||
tables on hammfg.com (1590, 1590-STOMP, 1441, 1444). Die-cast sizes are drawing outside dimensions
|
||||
at the lid opening; heights are the box without the 4 mm lid. Chassis sizes are Hammond's nominal
|
||||
outside W x D x H. Rows of die-cast boxes up to 125 mm long have their two top sizes swapped so
|
||||
they place upright (D4). There is no radius column (D5).
|
||||
|
||||
Die-cast boxes are grouped by series only (1590, 1550), in Hammond's catalogue order, and only
|
||||
natural-finish (unpainted) part numbers are rows. Chassis are grouped by family, then height. The
|
||||
1590 group has 37 rows; the toolbox already splits a datasheet submenu longer than
|
||||
`MAX_MENU_ITEMS` (30) into ranged submenus, so it needs no further split.
|
||||
|
||||
The rows are in `diylc-library/src/main/resources/datasheets/ChassisPanel.datasheet`.
|
||||
|
||||
|
||||
Group sizes: 37 (1590), 15 (1550), 1 (Others); 23 / 24 / 25 / 7 chassis (132 rows). `Others`
|
||||
holds generic sizes sold by several makers under one name, currently only 125B (122 x 66 x 40 mm
|
||||
with the backplate, per a maker's listing). The other 1590 rows were read from the per-part
|
||||
drawings, except 1590H, U, V, CE, KK, K, E, F, R1, DE, EE, BX2 and BX, which come from Hammond's
|
||||
series table (whole mm, lid included) like all 1550 rows but 1550B.
|
||||
|
||||
Finish and option suffixes are not rows: `BK3` (black 1441), `BK` (black 1550), colour codes on
|
||||
1590 (`RD`, `CB`, ...), `W` prefix (watertight; IP66/IP67 gaskets on the 1550), `F`/`FL`
|
||||
(flanged), `CWW` (walnut sides on sizes 12/16/22/24/32/33, which shorten the usable front, back and
|
||||
top by about 22 mm).
|
||||
|
||||
## 5. Unsourced or conflicting figures
|
||||
|
||||
| Item | Status |
|
||||
|---|---|
|
||||
| Die-cast corner radius (top view) and top-to-side edge fillet | Not published, so not in the datasheet (D5). Measure from Hammond STEP models or a box if it is ever wanted. |
|
||||
| Die-cast floor size (pedal top face) | Not published; between the outer size and outer minus 2 x (box height x tan 2 deg). |
|
||||
| 1590DD box height | Drawing gives 37.00 both overall and box; 33 assumes the usual 4 mm lid. |
|
||||
| 1590D box height | ~52, same assumption. |
|
||||
| Box heights of the table-only 1590 rows (H, U, V, CE, KK, K, E, F, R1, DE, EE, BX2, BX) | Table height minus the 4 mm lid; length and width are the table's rounded figures. Read the drawings to firm them up. |
|
||||
| 125B box height | 40 mm with the backplate minus an assumed 4 mm backplate (the 1590 lid); makers do not state the plate thickness. |
|
||||
| 1550 box heights (all but 1550B) | Series table height (lid included) minus 4 mm, the overall-to-box difference on the 1550B drawing (30.10 / 26.00). |
|
||||
| 1590BS / 1590B2 height | Web table 38 for both; drawings 42.00 overall / 38.00 box and 37.50 overall. Drawings used. |
|
||||
| 1444-10/-12/-14 height | Drawings say 49.78 mm; catalogue and inner height fit 50.80 (2 in). 2 in used. |
|
||||
| 1441-42 sheet | Drawing 0.057", product page 18 ga. Irrelevant to the outline. |
|
||||
|
||||
## 6. Later
|
||||
|
||||
- HWCHAS walnut-frame chassis (HWCHAS1310 / 1710; aluminium top 298.45 x 222.25 / 400.05 x
|
||||
222.25 mm on a 19.05 mm walnut frame): a different construction from the folded sheet metal.
|
||||
- Hammond rack cases (RM, RMCS) and the 1458 instrument enclosure.
|
||||
- Factory building blocks are still imported once, behind the boolean
|
||||
`DEFAULT_BLOCKS_IMPORTED_KEY`, so a block added to `blocks.xml` later never reaches existing
|
||||
users. Fix by giving factory blocks `createdOn`/`deletedOn` and an import date, as `VariantManager`
|
||||
does, when a new factory block is next needed.
|
||||
- Configs older than class-keyed variants store keys like `Electro-Mechanical.Chassis Panel`;
|
||||
`VariantManager`'s upgrade maps them by the current category and name, so such variants would
|
||||
not carry over. Map the legacy name if it turns out to matter.
|
||||
@@ -1,205 +0,0 @@
|
||||
# DIP IC Pin Names and Datasheet Models
|
||||
|
||||
Naming every pin of a `DIL_IC`, and applying a known part's pinout from a datasheet.
|
||||
|
||||
## 1. Goal
|
||||
|
||||
A DIP IC today is anonymous: its pins carry numbers only, so the netlist, the AI and the schematic
|
||||
view cannot tell an op-amp output from a supply pin. This plan gives every pin an optional name, the
|
||||
way `TubeSocket.electrodeLabels` already does, and then adds a datasheet of common parts (op-amps,
|
||||
timers, power amps, BBDs, ...) that fills those names in. Named pins make an IC identifiable, give
|
||||
the AI an accurate picture of the circuit, and are the prerequisite for converting between layout
|
||||
and schematic.
|
||||
|
||||
Every consumer already reads names through `getControlPointNodeName`: the netlist (`Node`,
|
||||
`NetlistBuilder`), hover tooltips (`Presenter`), the AI project context (`AiProjectBuilder`,
|
||||
`AiEditContext`, `ReplaceHandler`, `PinoutAnalyzer`) and, on the `schem-view` branch,
|
||||
`GenericBoxSchematicFactory`, which turns them into a labelled box. Changing `DIL_IC` alone is
|
||||
enough for names to reach all of them.
|
||||
|
||||
## 2. Design decisions
|
||||
|
||||
| # | Decision | Choice | Rationale |
|
||||
|---|---|---|---|
|
||||
| D1 | Storage | New `String pinNames` field, comma-separated, in pin-number order (pin 1 first), editable as "Pin Names". `null` means unnamed | Same shape as `TubeSocket.electrodeLabels`; a plain string needs no new editor, serializes trivially and is one property for the AI to set. Old files deserialize with `null` and behave exactly as before. |
|
||||
| D2 | Pin numbering | A private `getPinNumber(int index)` returns the physical pin number under the active "Pin Labels" scheme. `NO` and `NAMES` mean DIP numbering, not control-point order | Under `NO` the node name used to be `index + 1`, so on an 8-pin part the top-right pin reported `5` while it is pin `8`. That fed wrong pins to the AI and the netlist. Fixing it changes netlist text for every existing project with an IC, hence a regression run (§6). `DIP_MIRROR` and both `CONNECTOR` schemes keep their current meaning. |
|
||||
| D3 | Name lookup | Node name = the name at `getPinNumber(i) - 1` if present and not blank, otherwise the pin number | Fewer names than pins leaves the rest numbered; extra names are ignored but kept in the string, so changing the pin count back restores them. Rotation and mirroring need no change because names follow pin numbers. |
|
||||
| D4 | Rails and sections | The maker-board convention, already implemented by `Node.railName`: a trailing `_<digits>` marks pins of one net, anything else is a separate net. `GND_1`, `GND_2` are the same ground; `1IN-`, `2IN-` are inputs of two sections | `NetlistBuilder` joins pins of one component that share a rail name, so the name is the electrical statement. Names stay unique per pin, which keeps the netlist able to say which pad a connection reached. `NC` and `RSV` are never joined. |
|
||||
| D5 | Naming style | TI style, as printed in the manufacturer datasheet: section number first (`1OUT`, `1IN-`, `1IN+`, `2IN+`, ...), supplies `VCC+`/`VCC-` on op-amps and `VCC`/`GND` elsewhere. No spaces, no commas. Parenthesized notes are allowed and stripped by `Node.sanitizeNodeName` (`CONT (CV)`) | One consistent scheme across groups; the leading digit separates sections without an underscore, so it can never collide with the rail suffix of D4. |
|
||||
| D6 | Drawing | Maker-board style: each name is centred `DIL_IC.PIN_NAME_OFFSET` (1.35 mm, 2 px closer than the maker boards' offset) inside the body from its pin and runs along the row, rotated like `AbstractMakerBoard.drawPinLabels` (rows running horizontally keep names level). Formatted by `AbstractMakerBoard.getDisplayPinLabel` (`GND_1` renders `GND`, annotations dropped). Font is `DIL_IC.PIN_NAME_FONT`, 6 px. A name that would touch the previous one in its row, or run past the end of the body, is left out | Running along the row costs only the font height across the body, so the middle of a 0.3 in body stays free for the name/value label. The pitch is the limit: 0.1 in is 20 px, the maker 8 px font makes `1OUT` 22 px, 6 px fits every op-amp, timer and quad name. Longer names (`COMP/BAL`, `1THRES`) are dropped individually, as maker boards drop labels with no room. |
|
||||
| D7 | What a pin shows | One property, "Pin Labels" (formerly "Display Pin #s"; field and enum `displayNumbers`/`DisplayNumbers` unchanged for file compatibility): `NO` (shown as None) draws nothing, `NAMES` draws the pin names, the four numbering schemes draw numbers outside the body. Names and numbers are never drawn together. `NAMES` is the default for new parts and the factory DIP8/DIP16 variants | A pin carries one label at a time; drawing both cluttered a 0.3 in body. Saved user variants keyed by the old property name lose only this setting and fall back to `NAMES`. Names under `NAMES` follow DIP numbering, so a part drawn from the solder side (`DIP_MIRROR`) shows numbers, not names. |
|
||||
| D8 | Datasheet row | `group, part, row spacing, name1, ..., nameN`, e.g. `Op-Amp (Dual),TL072,0.3 in,1OUT,1IN-,1IN+,VCC-,2IN+,2IN-,2OUT,VCC+`. The pin count is the number of name columns | Names are trailing columns, so the comma split in `DatasheetService.loadDatasheet` needs no second separator. Row spacing covers 0.6 in parts. |
|
||||
| D9 | Model identity | New `@ComponentDescriptor` attribute `datasheetModelColumn` (default `0`); `DatasheetService.findSeries` and `ComponentCatalogGenerator` use it instead of hard-coding column 0. `DIL_IC` sets it to `1` | ICs need a data model in which the toolbox groups by family while the AI names the part. Putting the part number first would flatten the toolbox into one long menu. Existing datasheets keep the default and are unaffected. Core stays free of concrete types. |
|
||||
| D10 | Value preservation | `DatasheetService.findModel` treats a blank value like `null` | `DIL_IC.value` defaults to `""`, which otherwise makes every row look like a value change and the AI's model lookup fail. |
|
||||
| D11 | `applyModel` | Sets pin count, row spacing, pin names and value (the part number). Leaves pin spacing, colours, orientation and display settings alone | The datasheet states what the part is, not how the user chose to draw it. |
|
||||
| D12 | One row per part | Parts sharing a pinout each get their own row (TL072, NE5532, JRC4558, OPA2134) | Readable and greppable; a pinout-reference indirection is not worth its complexity at this size. |
|
||||
| D13 | AI catalog | Part numbers reach the catalog through D9. Per-part pinouts are not emitted; the AI sees names in the project context once a part is placed | Smallest change. If single-shot "add a TL072 and wire it" prompts prove unreliable, emit a compact `part -> names` map for `DIL_IC` (~100 parts, a few KB). |
|
||||
|
||||
### Explicitly out of scope
|
||||
|
||||
- `SIL_IC` and `MultiwattIC`. Power amps in TO-220/Multiwatt packages (LM1875, TDA2030, TDA2050,
|
||||
LM3886) belong there and follow once the DIP version has settled. The pin-name logic lives in
|
||||
`DIL_IC` until a second class adopts it, then moves to a shared helper.
|
||||
- Translating datasheet group names. Toolbox datasheet menus are untranslated, like the resistor
|
||||
families.
|
||||
- Inferring a pinout from the value text. A model is applied explicitly, from the toolbox or by the
|
||||
AI.
|
||||
|
||||
## 3. Changes
|
||||
|
||||
### diylc-core
|
||||
|
||||
- `ComponentDescriptor`: `int datasheetModelColumn() default 0`, read back through
|
||||
`DatasheetService.getModelColumn(Class)` rather than added to `ComponentType`.
|
||||
- `DatasheetService.findSeries`: match on the model column of the class's descriptor.
|
||||
- `DatasheetService.findModel`: a blank `String` value counts as no value.
|
||||
- `ComponentCatalogGenerator`: distinct values of the model column become `datasheetModels`.
|
||||
- `import-defaults/variants.xml`: the DIP8 and DIP16 factory variants of `DIL_IC` are retired
|
||||
(`deletedOn` 2026-11-01T21:00) in favour of the datasheet models, as the Resistor variants were.
|
||||
|
||||
### diylc-library
|
||||
|
||||
- `DIL_IC`:
|
||||
- field `pinNames` with its `@EditableProperty` "Pin Names" and a transient parsed copy;
|
||||
- `getPinNumber(int)`, with `getControlPointNodeName` rewritten on top of it (D2, D3);
|
||||
- `drawPinNames` (D6), called from `draw()` after the name/value label;
|
||||
- `implements IDatasheetSupport`, `enableDatasheet = true`, `datasheetCreationStepCount = 2`,
|
||||
`datasheetModelColumn = 1`, `applyModel` (D11), and a `DIL_IC(String[] model)` constructor like
|
||||
`Resistor`;
|
||||
- `@AiNote` extended: "Pin Names" lists names in pin order starting at the notch, the rail
|
||||
suffix rule of D4, and that applying a datasheet model fills names, pin count and row spacing.
|
||||
- `datasheets/DIL_IC.datasheet`: rows per D8, each checked against the manufacturer's datasheet.
|
||||
A part whose pinout cannot be sourced is left out.
|
||||
|
||||
### diylc-swing
|
||||
|
||||
- "Pin Names" in `English.txt` and translated in every other file in `lang/`.
|
||||
|
||||
### Generated
|
||||
|
||||
- `catalog_full.json` regenerated.
|
||||
|
||||
## 4. Datasheet inventory
|
||||
|
||||
`DIL_IC.datasheet` holds 92 parts:
|
||||
|
||||
| Group | Parts |
|
||||
|---|---|
|
||||
| Op-Amp (Single) | TL061, TL071, TL081, LM741, LF356, OPA134, NE5534, LF351, UA741, OP07, LM308 |
|
||||
| Op-Amp (Dual) | TL062, TL072, TL082, NE5532, JRC4558, RC4580, OPA2134, OPA2604, LM4562, LM358, LF353, MC1458, RC4558, LM833, TL022, OP275, LME49720, OPA2132, OPA2227 |
|
||||
| Op-Amp (Quad) | TL074, TL084, OPA4134, LM324, TL064 |
|
||||
| Comparator | LM393 |
|
||||
| Timer | NE555, ICM7555, TLC555, NE556, ICM7556, LM555 |
|
||||
| OTA / VCA | LM13700, CA3080, SSM2164, V2164, LM13600, AS3080, AS2164 |
|
||||
| Power Amp | LM386, LM380 (14-pin LM380N), TDA7052, TDA2822 |
|
||||
| BBD | MN3007, MN3207, BL3207, BL3208A, V3207, MN3008, MN3005, BL3208B |
|
||||
| BBD Clock | MN3101, MN3102, V3102 |
|
||||
| Delay / Compander | PT2399, NE570, NE571, SA571 |
|
||||
| Charge Pump | ICL7660, TC1044, MAX1044, LT1054 |
|
||||
| CMOS Logic / Switch | CD4049, CD4069, CD40106, CD4011, CD4013, CD4017, CD4066, CD4051, CD4053, CD4016, 74HC14, 74HC4051 |
|
||||
| Optocoupler | PC817, 4N35, 6N138, H11L1, 6N139 |
|
||||
| MCU | ATtiny85, ATmega328P, ATtiny13A |
|
||||
|
||||
Rules for every row: names as in D5; a repeated net only through the `_n` suffix and only where the
|
||||
pins are joined inside the package (otherwise distinct names, e.g. `AGND` and `DGND` on the
|
||||
PT2399, `GAIN1` and `GAIN8` on the LM386); unused pins `NC`. A new part is added only after its pin
|
||||
table has been read from the manufacturer's datasheet or from two independent sources.
|
||||
|
||||
Sourcing and modelling notes that are not obvious from the rows:
|
||||
|
||||
- The groups added in phase 3 were each read from a manufacturer pin table or two agreeing sources.
|
||||
The weakest are the TDA7052 (pin 7 NC from one indexed copy), the CD4017 output order (one site),
|
||||
MN3101 (manufacturer scan only), and the ATmega328P grounds, named `GND_1`/`GND_2` as
|
||||
one net although the datasheet only says both must be connected.
|
||||
- The 24 phase 2 rows other than NE5534 and OPA134, and the 24 rows added from the candidate list
|
||||
(LF351 ... ATtiny13A, all sharing a pinout already in the file), are well-established pinouts not
|
||||
yet read one by one against a datasheet; of the latter only TL022 was read from its datasheet.
|
||||
- MN3005, MN3008 and BL3208B have 8 leads in a 14-pin body (leads at positions 1, 2, 6, 7, 8, 9, 13,
|
||||
14), so they are modelled as 14-pin parts with `NC` at the empty positions. The position mapping
|
||||
was derived from the package drawing, not from a datasheet table.
|
||||
- BL3208 exists in two pinouts: BL3208A follows the MN3207, BL3208B the MN3008. Both are listed by
|
||||
their full names.
|
||||
- The TDA7052 row is the plain part; the TDA7052A/B have a volume-control pin 4 and differ.
|
||||
- Pin names drawn on a 0.3 in body are dropped where they collide (D6), so long names such as
|
||||
`1RECTCAP` or `COMP/BAL` often show only in tooltips and the netlist.
|
||||
|
||||
### Candidates for further growth
|
||||
|
||||
Ranked from two sources: the ICs used in 784 user projects (Nov 2026 sample: 232 identifiable IC
|
||||
instances, about 74% covered by the library) and a survey of guitar, synth, hi-fi and radio/ham
|
||||
DIY communities. Each part still needs its pin table read before it is added.
|
||||
|
||||
- **Next, for coverage of the user sample (about 86% now, about 94% with these eight):** LM3915,
|
||||
74HC595, LM723, CD4046, CD4081, CD4510, INA128, INA217.
|
||||
- **New pinouts with community demand:** LM3914/LM3915/LM3916 (one pinout),
|
||||
74HC595, AS3340, AS3320, CD4052, CD4007, CD4046, CD4093, CD4024, CD4040, THAT340, CA3046,
|
||||
CA3094, MCP4822, LM339, NE602/SA602/SA612, MC1496, LM567, CD4060, uPC1237 (SIP-8), INA217,
|
||||
INA128, PGA2311, TDA1543, LM723, CD4081, CD4510.
|
||||
- **Multiwatt, existing package:** TDA7297, TDA7377 (Multiwatt 15), TDA2005, TDA2009A
|
||||
(Multiwatt 11), LM3875 (TO-220-11).
|
||||
- **Pentawatt / TO-220-5, needs the package back:** LM1875, TDA2030A, TDA2050, TDA2003, LM2576,
|
||||
LM2596 - the most requested missing package across guitar, hi-fi and power supplies. LM4766
|
||||
(TO-220-15) needs its lead spacing compared with Multiwatt 15 first.
|
||||
- **Niche:** MC1350, MC3361, TDA7000, CD2003, TA7358, PIC12F675, PIC16F628A, Electric Druid chips,
|
||||
XR2206, ICL8038, AD633, DG411, AS3310, AS3394, KA2281, KA2284, LM1036, TDA1541A, MAX7219.
|
||||
- **Out of scope:** SMD-only parts (SSI2130/2140, OPA1612, FV-1, PCM179x, Si5351, AD9850), TO-92
|
||||
parts and modules.
|
||||
|
||||
### SIP and Multiwatt packages
|
||||
|
||||
`SIL_IC` and `MultiwattIC` follow the same model: a `pinNames` string in pin-number order, a
|
||||
`PinLabels` property ("Pin Labels": None / Names / Numbers, default Names; a new top-level enum
|
||||
shared by both), and datasheet support with `datasheetModelColumn = 1`. Name parsing and the
|
||||
outside-the-body label drawing live in `ICPinNames`, which `DIL_IC` also uses for parsing and for
|
||||
the shared 6 px font. Labels on these packages sit outside the body, square to the row, in the
|
||||
border colour, because the bodies are too narrow to hold them.
|
||||
|
||||
- `SIL_IC.datasheet`: `group, part, pin spacing, names...` - 12 parts read from manufacturer
|
||||
datasheet pages: LA4440, LA4485, LA4425A, TA7205AP, TDA1013B, TDA1010A, TDA1521A, TDA7056,
|
||||
TDA7056A, BA5406, BA5417 (Power Amp) and BA3121N (Preamp). TA7205AP and TDA1010A have no pin
|
||||
table, so their names come from the manufacturer's application circuit.
|
||||
- `MultiwattIC.datasheet`: `group, part, names...`, the pin count picks the type - LM3886, TDA7265,
|
||||
TDA7293, TDA7294. Supply pins the datasheet repeats without stating an internal connection are
|
||||
separate nets, named after their pin or role as with the LM386: `VCC+1`/`VCC+5` (LM3886),
|
||||
`VS-1`/`VS-6` (TDA7265), `VS+SIG`/`VS+PWR` and `VS-SIG`/`VS-PWR` (TDA7293/94).
|
||||
- `MultiwattIC` geometry, from the manufacturer package drawings: consecutive leads are 1.7 mm
|
||||
apart on Multiwatt 11 / TO-220-11 and 1.27 mm on Multiwatt 15 (`MultiwattType` carries the lead
|
||||
pitch; Multiwatt 11 was previously drawn at 1.27 mm, so existing Multiwatt 11 parts change
|
||||
shape). The rows are 5.08 mm apart. Odd pins form the row bent forward in front of the body; the
|
||||
body (5 mm, tab at the back, `BACK_TO_NEAR_ROW` 4.55 mm) is drawn around the even row, whose pins
|
||||
are painted over it. All labels read forward, away from the tab: an even pin's from the front
|
||||
edge of the body, in the gap between the forward leads either side of it; an odd pin's past the
|
||||
end of its lead. Node names follow the physical numbering, which alternates between rows;
|
||||
before this they were control-point order.
|
||||
- Pentawatt (TO-220-5: LM1875, TDA2030A, TDA2050, LM2596...) was researched and dropped for now.
|
||||
If it returns: 1.7 mm lead pitch, 4.0 mm row offset, odd pins forward; TI's straight-leaded
|
||||
KC0005A and horizontal NEB forms are different footprints.
|
||||
|
||||
## 5. Tests
|
||||
|
||||
- `DIL_ICTest`: pin number per scheme across several pin counts, including `NO` now matching `DIP`;
|
||||
names mapped through each scheme; too few, too many and blank names; `applyModel` round trip.
|
||||
- `DIL_ICDatasheetTest`, after `ResistorDatasheetTest`: every row parses; its name count is a
|
||||
`PinCount` value; part numbers are unique; within a row every name is unique and no two names
|
||||
share a rail unless they carry the `_n` suffix; `findSeries("TL072")` returns exactly one row.
|
||||
- `DatasheetServiceTest`: model column other than 0, and the blank-value case of D10.
|
||||
|
||||
## 6. Verification
|
||||
|
||||
- `mvn -q test` over the whole reactor, since core, library and swing all change.
|
||||
- Render pin names and look at them: 8, 14 and 16 pins, 0.3 and 0.6 in row spacing, all four
|
||||
orientations, Display NAME / VALUE / BOTH.
|
||||
- Regression suite run is required: D2 changes netlist output of every sample project containing an
|
||||
unnamed DIP IC with "Pin Labels" (then "Display Pin #s") set to `NO`. Reference netlists are regenerated only after
|
||||
the diffs are confirmed to be exactly that renumbering.
|
||||
|
||||
## 7. Phases
|
||||
|
||||
1. **Pin names**: done (D1 to D7, `DIL_ICTest`, language files, `catalog_full.json`). The
|
||||
regression run of §6 is still outstanding and should precede the release.
|
||||
2. **Datasheet support**: done (D8 to D13, the core changes, 26 op-amps and timers,
|
||||
`DIL_ICDatasheetTest`, `catalog_full.json`). NE5534 and OPA134 were read from TI's current pin
|
||||
tables (the OPA134 no longer has offset trim: pins 1, 5 and 8 are NC); the other 24 rows are the
|
||||
well-established industry pinouts and have not yet been read against a datasheet one by one.
|
||||
3. **Library growth**: done - 68 DIP parts, 12 SIP parts and 4 Multiwatt parts. Further parts on
|
||||
request, each read from a manufacturer pin table first.
|
||||
Reference in New Issue
Block a user