mirror of
https://github.com/bancika/diy-layout-creator
synced 2026-11-07 12:24:58 +10:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b3b0ef746f | |||
| 8abaf2884b | |||
| a678b52f4d | |||
| 47f9056588 | |||
| c5a462a385 | |||
| b15a6e3f64 | |||
| 79d230ff07 | |||
| 23ecf9e8d7 | |||
| fce069895f | |||
| 4688879d0e | |||
| 15277452f4 | |||
| 5d92812d3e |
@@ -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.10 <-> 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.12 <-> 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.8 <-> R3.2
|
||||
C5.+ <-> LM324.14 <-> 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.10 <-> 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.12 <-> 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.8 <-> R3.2
|
||||
C5.+ <-> LM324.14 <-> 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.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
|
||||
+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
|
||||
|
||||
|
||||
@@ -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.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
|
||||
+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
|
||||
|
||||
|
||||
@@ -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.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
|
||||
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
|
||||
C10.1 <-> R22.1 <-> R30.2
|
||||
C10.2 <-> R16.1 <-> V3.7
|
||||
C11.1 <-> IC3.9
|
||||
C11.1 <-> IC3.16
|
||||
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.9 <-> R18.2 <-> R33.1 <-> V3.2
|
||||
C14.2 <-> C23.1 <-> IC2.16 <-> R18.2 <-> R33.1 <-> V3.2
|
||||
C15.1 <-> C9.1 <-> R19.1
|
||||
C15.2 <-> C22.1 <-> IC2.13 <-> R19.2 <-> R29.1
|
||||
C15.2 <-> C22.1 <-> IC2.12 <-> 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.4 <-> Q2.1
|
||||
C18.- <-> C29.- <-> IC1.3 <-> Q2.2 <-> SW1.2
|
||||
C18.+ <-> IC1.3 <-> Q2.1
|
||||
C18.- <-> C29.- <-> IC1.4 <-> 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.16 <-> IC3.16 <-> IC4.16 <-> SW1.1
|
||||
D6.A <-> D7.A <-> D8.A <-> D9.K <-> IC2.9 <-> IC3.9 <-> IC4.9 <-> SW1.1
|
||||
D9.A <-> R37.2
|
||||
IC3.13 <-> R36.2
|
||||
IC4.11 <-> VR6.2 <-> VR6.3
|
||||
IC4.9 <-> VR7.2 <-> VR7.3
|
||||
IC3.12 <-> R36.2
|
||||
IC4.14 <-> VR6.2 <-> VR6.3
|
||||
IC4.16 <-> 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.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
|
||||
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
|
||||
C10.1 <-> R22.1 <-> R30.2
|
||||
C10.2 <-> R16.1 <-> V3.7
|
||||
C11.1 <-> IC3.9
|
||||
C11.1 <-> IC3.16
|
||||
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.9 <-> R18.2 <-> R33.1 <-> V3.2
|
||||
C14.2 <-> C23.1 <-> IC2.16 <-> R18.2 <-> R33.1 <-> V3.2
|
||||
C15.1 <-> C9.1 <-> R19.1
|
||||
C15.2 <-> C22.1 <-> IC2.13 <-> R19.2 <-> R29.1
|
||||
C15.2 <-> C22.1 <-> IC2.12 <-> 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.4 <-> Q2.1
|
||||
C18.- <-> C29.- <-> D6.A <-> D7.A <-> D8.A <-> D9.K <-> IC1.3 <-> IC2.16 <-> IC3.16 <-> IC4.16 <-> Q2.2
|
||||
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
|
||||
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.13 <-> R36.2
|
||||
IC4.11 <-> VR6.2 <-> VR6.3
|
||||
IC4.9 <-> VR7.2 <-> VR7.3
|
||||
IC3.12 <-> R36.2
|
||||
IC4.14 <-> VR6.2 <-> VR6.3
|
||||
IC4.16 <-> 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.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
|
||||
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
|
||||
C10.1 <-> R22.1 <-> R30.2
|
||||
C10.2 <-> R16.1 <-> V3.7
|
||||
C11.1 <-> IC3.9
|
||||
C11.1 <-> IC3.16
|
||||
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.9 <-> R18.2 <-> R33.1 <-> V3.2
|
||||
C14.2 <-> C23.1 <-> IC2.16 <-> R18.2 <-> R33.1 <-> V3.2
|
||||
C15.1 <-> C9.1 <-> R19.1
|
||||
C15.2 <-> C22.1 <-> IC2.13 <-> R19.2 <-> R29.1
|
||||
C15.2 <-> C22.1 <-> IC2.12 <-> 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.4 <-> Q2.1
|
||||
C18.- <-> C29.- <-> IC1.3 <-> Q2.2
|
||||
C18.+ <-> IC1.3 <-> Q2.1
|
||||
C18.- <-> C29.- <-> IC1.4 <-> 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.16 <-> IC3.16 <-> IC4.16
|
||||
D6.A <-> D7.A <-> D8.A <-> D9.K <-> IC2.9 <-> IC3.9 <-> IC4.9
|
||||
D9.A <-> R37.2
|
||||
IC3.13 <-> R36.2
|
||||
IC4.11 <-> VR6.2 <-> VR6.3
|
||||
IC4.9 <-> VR7.2 <-> VR7.3
|
||||
IC3.12 <-> R36.2
|
||||
IC4.14 <-> VR6.2 <-> VR6.3
|
||||
IC4.16 <-> 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.8 <-> R3.1
|
||||
C2.+ <-> IC1.5 <-> R3.1
|
||||
C2.- <-> R4.2 <-> SW1.2
|
||||
C3.1 <-> IC1.6
|
||||
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.7 <-> J3.Sleeve <-> Q1.1
|
||||
C4.+ <-> IC1.6 <-> J3.Sleeve <-> Q1.1
|
||||
C5.1 <-> R3.2
|
||||
IC1.1 <-> VR1.3
|
||||
IC1.2 <-> VR2.2
|
||||
IC1.5 <-> VR1.2
|
||||
IC1.8 <-> 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.OFF ]
|
||||
|
||||
C1.1 <-> Q1.2 <-> R2.1
|
||||
C1.2 <-> VR2.3
|
||||
C2.+ <-> IC1.8 <-> R3.1
|
||||
C2.- <-> R4.2
|
||||
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
|
||||
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.+ <-> IC1.5 <-> R3.1
|
||||
C2.- <-> J1.Tip <-> R4.1 <-> R4.2 <-> R5.1
|
||||
C3.1 <-> IC1.6
|
||||
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.7 <-> J3.Sleeve <-> Q1.1
|
||||
C4.+ <-> IC1.6 <-> J3.Sleeve <-> Q1.1
|
||||
C5.1 <-> R3.2
|
||||
IC1.1 <-> VR1.3
|
||||
IC1.2 <-> VR2.2
|
||||
IC1.5 <-> VR1.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.- <-> R4.2
|
||||
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
|
||||
J1.Tip <-> R4.1 <-> R5.1
|
||||
J2.Tip <-> Q1.3 <-> R1.2
|
||||
|
||||
Switch setup: [ SW1.ON2 ]
|
||||
|
||||
C1.1 <-> Q1.2 <-> R2.1
|
||||
C1.2 <-> VR2.3
|
||||
C2.+ <-> IC1.8 <-> R3.1
|
||||
C2.+ <-> IC1.5 <-> R3.1
|
||||
C2.- <-> R4.2 <-> R5.2
|
||||
C3.1 <-> IC1.6
|
||||
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.7 <-> J3.Sleeve <-> Q1.1
|
||||
C4.+ <-> IC1.6 <-> J3.Sleeve <-> Q1.1
|
||||
C5.1 <-> R3.2
|
||||
IC1.1 <-> VR1.3
|
||||
IC1.2 <-> VR2.2
|
||||
IC1.5 <-> VR1.2
|
||||
IC1.8 <-> 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.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
|
||||
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
|
||||
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.8 <-> R6.1
|
||||
C4.2 <-> IC3.5 <-> R6.1
|
||||
C5.1 <-> IC3.3 <-> R4.2
|
||||
C5.2 <-> R8.2
|
||||
C6.1 <-> VR3.3
|
||||
C7.+ <-> D16.K <-> IC3.5 <-> R9.2
|
||||
D1.A <-> IC1.15 <-> IC1.16
|
||||
C7.+ <-> D16.K <-> IC3.8 <-> R9.2
|
||||
D1.A <-> IC1.10 <-> IC1.9
|
||||
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.10 <-> IC2.11
|
||||
D12.A <-> D13.K <-> IC2.14 <-> IC2.15
|
||||
D13.A <-> D14.K <-> IC2.1 <-> IC2.2
|
||||
D15.K <-> Q1.1
|
||||
D2.K <-> D3.A <-> IC1.13 <-> IC1.14
|
||||
D2.K <-> D3.A <-> IC1.11 <-> IC1.12
|
||||
D3.K <-> D4.A <-> IC1.4 <-> IC1.5
|
||||
D4.K <-> D5.A <-> IC1.11 <-> IC1.12
|
||||
D4.K <-> D5.A <-> IC1.13 <-> IC1.14
|
||||
D5.K <-> D6.A <-> IC1.2 <-> IC1.3
|
||||
D6.K <-> D7.A <-> IC1.10 <-> IC1.9
|
||||
D8.A <-> D9.K <-> IC2.14 <-> IC2.15
|
||||
D6.K <-> D7.A <-> IC1.15 <-> IC1.16
|
||||
D8.A <-> D9.K <-> IC2.10 <-> IC2.11
|
||||
D8.K <-> IC2.7 <-> IC2.8
|
||||
IC3.7 <-> R2.1 <-> R5.1
|
||||
IC3.6 <-> 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.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
|
||||
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
|
||||
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.8 <-> R6.1
|
||||
C4.2 <-> IC3.5 <-> R6.1
|
||||
C5.1 <-> IC3.3 <-> R4.2
|
||||
C5.2 <-> R8.2
|
||||
C6.1 <-> VR3.3
|
||||
C7.+ <-> D16.K <-> IC3.5 <-> R9.2
|
||||
D1.A <-> IC1.15 <-> IC1.16
|
||||
C7.+ <-> D16.K <-> IC3.8 <-> R9.2
|
||||
D1.A <-> IC1.10 <-> IC1.9
|
||||
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.10 <-> IC2.11
|
||||
D12.A <-> D13.K <-> IC2.14 <-> IC2.15
|
||||
D13.A <-> D14.K <-> IC2.1 <-> IC2.2
|
||||
D15.K <-> Q1.1
|
||||
D2.K <-> D3.A <-> IC1.13 <-> IC1.14
|
||||
D2.K <-> D3.A <-> IC1.11 <-> IC1.12
|
||||
D3.K <-> D4.A <-> IC1.4 <-> IC1.5
|
||||
D4.K <-> D5.A <-> IC1.11 <-> IC1.12
|
||||
D4.K <-> D5.A <-> IC1.13 <-> IC1.14
|
||||
D5.K <-> D6.A <-> IC1.2 <-> IC1.3
|
||||
D6.K <-> D7.A <-> IC1.10 <-> IC1.9
|
||||
D8.A <-> D9.K <-> IC2.14 <-> IC2.15
|
||||
D6.K <-> D7.A <-> IC1.15 <-> IC1.16
|
||||
D8.A <-> D9.K <-> IC2.10 <-> IC2.11
|
||||
D8.K <-> IC2.7 <-> IC2.8
|
||||
IC3.7 <-> R2.1 <-> R5.1
|
||||
IC3.6 <-> 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.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
|
||||
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
|
||||
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.25 <-> IC2.25
|
||||
IC1.26 <-> IC2.26
|
||||
IC1.27 <-> IC2.27 <-> IC3.5 <-> IC4.5
|
||||
IC1.46 <-> IC2.46 <-> IC3.5 <-> IC4.5
|
||||
IC1.47 <-> IC2.47
|
||||
IC1.48 <-> IC2.48
|
||||
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.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
|
||||
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
|
||||
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.25 <-> IC2.25
|
||||
IC1.26 <-> IC2.26
|
||||
IC1.27 <-> IC2.27 <-> IC3.5 <-> IC4.5
|
||||
IC1.46 <-> IC2.46 <-> IC3.5 <-> IC4.5
|
||||
IC1.47 <-> IC2.47
|
||||
IC1.48 <-> IC2.48
|
||||
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.8
|
||||
C10.- <-> C9.+ <-> IC2.5
|
||||
C12.+ <-> D6.K
|
||||
C12.- <-> C14.- <-> C2.2 <-> IC2.4 <-> R4.2
|
||||
C14.+ <-> D5.A <-> IC2.7
|
||||
C14.+ <-> D5.A <-> IC2.6
|
||||
C2.1 <-> IC2.2 <-> R5.1
|
||||
C3.+ <-> D1.A <-> IC1.7
|
||||
C4.+ <-> C5.- <-> C6.+ <-> IC1.8
|
||||
C3.+ <-> D1.A <-> IC1.6
|
||||
C4.+ <-> C5.- <-> C6.+ <-> IC1.5
|
||||
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.5
|
||||
IC1.1 <-> IC1.8
|
||||
IC1.3 <-> R2.1 <-> R3.1
|
||||
IC2.1 <-> IC2.5
|
||||
IC2.1 <-> IC2.8
|
||||
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.8
|
||||
C10.- <-> C9.+ <-> IC2.5
|
||||
C12.+ <-> D6.K
|
||||
C12.- <-> C14.- <-> C2.2 <-> IC2.4 <-> R4.2
|
||||
C14.+ <-> D5.A <-> IC2.7
|
||||
C14.+ <-> D5.A <-> IC2.6
|
||||
C2.1 <-> IC2.2 <-> R5.1
|
||||
C3.+ <-> D1.A <-> IC1.7
|
||||
C4.+ <-> C5.- <-> C6.+ <-> IC1.8
|
||||
C3.+ <-> D1.A <-> IC1.6
|
||||
C4.+ <-> C5.- <-> C6.+ <-> IC1.5
|
||||
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.5
|
||||
IC1.1 <-> IC1.8
|
||||
IC1.3 <-> R2.1 <-> R3.1
|
||||
IC2.1 <-> IC2.5
|
||||
IC2.1 <-> IC2.8
|
||||
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.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
|
||||
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
|
||||
IC1.1 <-> IC2.1 <-> IC5.1
|
||||
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
|
||||
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
|
||||
|
||||
|
||||
@@ -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.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
|
||||
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
|
||||
IC1.1 <-> IC2.1 <-> IC5.1
|
||||
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
|
||||
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
|
||||
|
||||
|
||||
+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.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
|
||||
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
|
||||
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.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
|
||||
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
|
||||
IC4.11 <-> IC6.11
|
||||
IC4.14 <-> IC6.14
|
||||
IC4.4 <-> IC6.12
|
||||
IC4.5 <-> IC6.13
|
||||
IC4.4 <-> IC6.13
|
||||
IC4.5 <-> IC6.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.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
|
||||
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
|
||||
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.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
|
||||
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
|
||||
IC4.11 <-> IC6.11
|
||||
IC4.14 <-> IC6.14
|
||||
IC4.4 <-> IC6.12
|
||||
IC4.5 <-> IC6.13
|
||||
IC4.4 <-> IC6.13
|
||||
IC4.5 <-> IC6.12
|
||||
|
||||
|
||||
+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.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.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.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.11 <-> IC2.11 <-> IC3.11 <-> IC4.11
|
||||
IC1.12 <-> IC3.4
|
||||
IC1.13 <-> IC3.5
|
||||
IC1.12 <-> IC3.5
|
||||
IC1.13 <-> IC3.4
|
||||
IC1.14 <-> IC2.14 <-> IC3.14 <-> IC4.14
|
||||
IC1.2 <-> IC5.3 <-> IC8.3
|
||||
IC1.3 <-> IC5.2 <-> IC8.2
|
||||
IC1.4 <-> IC2.12
|
||||
IC1.5 <-> IC2.13
|
||||
IC1.4 <-> IC2.13
|
||||
IC1.5 <-> IC2.12
|
||||
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.12
|
||||
IC2.5 <-> IC4.13
|
||||
IC2.4 <-> IC4.13
|
||||
IC2.5 <-> IC4.12
|
||||
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.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.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.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.11 <-> IC2.11 <-> IC3.11 <-> IC4.11
|
||||
IC1.12 <-> IC3.4
|
||||
IC1.13 <-> IC3.5
|
||||
IC1.12 <-> IC3.5
|
||||
IC1.13 <-> IC3.4
|
||||
IC1.14 <-> IC2.14 <-> IC3.14 <-> IC4.14
|
||||
IC1.2 <-> IC5.3 <-> IC8.3
|
||||
IC1.3 <-> IC5.2 <-> IC8.2
|
||||
IC1.4 <-> IC2.12
|
||||
IC1.5 <-> IC2.13
|
||||
IC1.4 <-> IC2.13
|
||||
IC1.5 <-> IC2.12
|
||||
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.12
|
||||
IC2.5 <-> IC4.13
|
||||
IC2.4 <-> IC4.13
|
||||
IC2.5 <-> IC4.12
|
||||
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.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.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.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.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
|
||||
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
|
||||
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.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
|
||||
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
|
||||
C6.1 <-> D5.K <-> D6.K <-> R7.1
|
||||
C6.2 <-> R8.1 <-> Square/Triangle 1.3
|
||||
C7.1 <-> IC5.8 <-> IC5.9
|
||||
C7.2 <-> IC5.12 <-> IC5.3 <-> R24.1
|
||||
C7.1 <-> IC5.13 <-> IC5.14
|
||||
C7.2 <-> IC5.10 <-> IC5.3 <-> R24.1
|
||||
C8.1 <-> D12.K <-> D7.K <-> R21.1
|
||||
C8.2 <-> R22.1 <-> Square/Triangle 2.3
|
||||
C9.1 <-> IC4.12 <-> IC4.5 <-> R14.1
|
||||
C9.2 <-> IC4.8 <-> IC4.9
|
||||
C9.1 <-> IC4.10 <-> IC4.5 <-> R14.1
|
||||
C9.2 <-> IC4.13 <-> IC4.14
|
||||
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.10
|
||||
D12.A <-> IC5.14 <-> R19.2 <-> R20.1
|
||||
D2.A <-> IC1.12
|
||||
D1.A <-> IC1.12
|
||||
D12.A <-> IC5.8 <-> R19.2 <-> R20.1
|
||||
D2.A <-> IC1.10
|
||||
D3.A <-> IC1.4
|
||||
D4.A <-> IC1.2
|
||||
D5.A <-> IC2.7 <-> Slope Shift 1.3
|
||||
D6.A <-> IC2.14 <-> R4.2 <-> R6.1
|
||||
D6.A <-> IC2.8 <-> 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.8 <-> IC2.4 <-> IC3.4 <-> IC4.4 <-> IC5.4 <-> IC6.4 <-> IC7.4 <-> R13.2 <-> R17.2 <-> R2.2 <-> R36.2 <-> R42.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
|
||||
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 <-> Square/Triangle 1.2
|
||||
IC3.12 <-> R10.2 <-> R11.1
|
||||
IC3.13 <-> IC3.14 <-> Square/Triangle 1.1
|
||||
IC3.10 <-> R10.2 <-> R11.1
|
||||
IC3.12 <-> Square/Triangle 1.2
|
||||
IC3.13 <-> IC3.14 <-> Output 1.Tip
|
||||
IC3.3 <-> R25.2 <-> R26.1
|
||||
IC3.5 <-> Square/Triangle 2.2
|
||||
IC3.6 <-> IC3.7 <-> Output 2.Tip
|
||||
IC3.8 <-> IC3.9 <-> Output 1.Tip
|
||||
IC3.8 <-> IC3.9 <-> Square/Triangle 1.1
|
||||
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.12 <-> R41.2 <-> R42.1 <-> Square/Sawtooth 4.2
|
||||
IC6.5 <-> IC7.10 <-> 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.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.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.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.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
|
||||
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
|
||||
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.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
|
||||
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
|
||||
C6.1 <-> D5.K <-> D6.K <-> R7.1
|
||||
C6.2 <-> R8.1 <-> Square/Triangle 1.3
|
||||
C7.1 <-> IC5.8 <-> IC5.9
|
||||
C7.2 <-> IC5.12 <-> IC5.3 <-> R24.1
|
||||
C7.1 <-> IC5.13 <-> IC5.14
|
||||
C7.2 <-> IC5.10 <-> IC5.3 <-> R24.1
|
||||
C8.1 <-> D12.K <-> D7.K <-> R21.1
|
||||
C8.2 <-> R22.1 <-> Square/Triangle 2.3
|
||||
C9.1 <-> IC4.12 <-> IC4.5 <-> R14.1
|
||||
C9.2 <-> IC4.8 <-> IC4.9
|
||||
C9.1 <-> IC4.10 <-> IC4.5 <-> R14.1
|
||||
C9.2 <-> IC4.13 <-> IC4.14
|
||||
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.10
|
||||
D12.A <-> IC5.14 <-> R19.2 <-> R20.1
|
||||
D2.A <-> IC1.12
|
||||
D1.A <-> IC1.12
|
||||
D12.A <-> IC5.8 <-> R19.2 <-> R20.1
|
||||
D2.A <-> IC1.10
|
||||
D3.A <-> IC1.4
|
||||
D4.A <-> IC1.2
|
||||
D5.A <-> IC2.7 <-> Slope Shift 1.3
|
||||
D6.A <-> IC2.14 <-> R4.2 <-> R6.1
|
||||
D6.A <-> IC2.8 <-> 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.8 <-> IC2.4 <-> IC3.4 <-> IC4.4 <-> IC5.4 <-> IC6.4 <-> IC7.4 <-> R13.2 <-> R17.2 <-> R2.2 <-> R36.2 <-> R42.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
|
||||
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 <-> Square/Triangle 1.2
|
||||
IC3.12 <-> R10.2 <-> R11.1
|
||||
IC3.13 <-> IC3.14 <-> Square/Triangle 1.1
|
||||
IC3.10 <-> R10.2 <-> R11.1
|
||||
IC3.12 <-> Square/Triangle 1.2
|
||||
IC3.13 <-> IC3.14 <-> Output 1.Tip
|
||||
IC3.3 <-> R25.2 <-> R26.1
|
||||
IC3.5 <-> Square/Triangle 2.2
|
||||
IC3.6 <-> IC3.7 <-> Output 2.Tip
|
||||
IC3.8 <-> IC3.9 <-> Output 1.Tip
|
||||
IC3.8 <-> IC3.9 <-> Square/Triangle 1.1
|
||||
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.12 <-> R41.2 <-> R42.1 <-> Square/Sawtooth 4.2
|
||||
IC6.5 <-> IC7.10 <-> 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.5 <-> IC2.5 <-> R2.1
|
||||
3PDT.4 <-> IC1.8 <-> IC2.8 <-> 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.8 <-> R1.2 <-> R2.2 <-> R3.2 <-> R5.1 <-> R5.2 <-> R6.2
|
||||
C2.- <-> C3.- <-> C5.1 <-> IC1.1 <-> IC1.2 <-> IC1.5 <-> R1.2 <-> R2.2 <-> R3.2 <-> R5.1 <-> R5.2 <-> R6.2
|
||||
C4.+ <-> R4.1
|
||||
C4.- <-> IC2.1 <-> IC2.2
|
||||
C6.2 <-> IC2.8 <-> R6.1
|
||||
C6.2 <-> IC2.5 <-> 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.5 <-> IC2.5 <-> R2.1
|
||||
1k.2 <-> IC1.8 <-> IC2.8 <-> 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.8 <-> R1.2 <-> R2.2 <-> R3.2 <-> R5.1 <-> R5.2 <-> R6.2
|
||||
C2.- <-> C3.- <-> C5.1 <-> IC1.1 <-> IC1.2 <-> IC1.5 <-> R1.2 <-> R2.2 <-> R3.2 <-> R5.1 <-> R5.2 <-> R6.2
|
||||
C4.+ <-> R4.1
|
||||
C4.- <-> IC2.1 <-> IC2.2
|
||||
C6.2 <-> IC2.8 <-> R6.1
|
||||
C6.2 <-> IC2.5 <-> 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.8 <-> R1.2 <-> R2.2 <-> R3.2 <-> R5.1 <-> R5.2 <-> R6.2
|
||||
C2.- <-> C3.- <-> C5.1 <-> IC1.1 <-> IC1.2 <-> IC1.5 <-> R1.2 <-> R2.2 <-> R3.2 <-> R5.1 <-> R5.2 <-> R6.2
|
||||
C4.+ <-> R4.1
|
||||
C4.- <-> IC2.1 <-> IC2.2
|
||||
C6.2 <-> IC2.8 <-> R6.1
|
||||
C6.2 <-> IC2.5 <-> R6.1
|
||||
C7.+ <-> Volume.3
|
||||
C7.- <-> IC1.6 <-> IC1.7
|
||||
C8.- <-> IC2.6 <-> IC2.7
|
||||
IC1.5 <-> IC2.5 <-> R2.1
|
||||
IC1.8 <-> IC2.8 <-> 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.8 <-> R12.1
|
||||
C15.+ <-> IC1.6 <-> IC2.6 <-> IC3.5 <-> R13.2 <-> R20.2
|
||||
C13.2 <-> D1.K <-> IC3.5 <-> R12.1
|
||||
C15.+ <-> IC1.7 <-> IC2.7 <-> IC3.8 <-> R13.2 <-> R20.2
|
||||
C16.+ <-> IC3.1 <-> LEVEL.2
|
||||
C16.- <-> R21.1
|
||||
C2.1 <-> IC1.1
|
||||
C2.2 <-> IC1.5
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.7
|
||||
C2.2 <-> IC1.8
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.6
|
||||
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.7 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C6.2 <-> IC2.6 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C7.1 <-> IC2.1
|
||||
C7.2 <-> IC2.5
|
||||
C7.2 <-> IC2.8
|
||||
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 <-> R17.2
|
||||
IC3.7 <-> R15.1 <-> R18.2
|
||||
IC3.6 <-> R15.1 <-> R18.2
|
||||
IC3.7 <-> R17.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.8 <-> R12.1
|
||||
C15.+ <-> IC1.6 <-> IC2.6 <-> IC3.5 <-> R13.2 <-> R20.2
|
||||
C13.2 <-> D1.K <-> IC3.5 <-> R12.1
|
||||
C15.+ <-> IC1.7 <-> IC2.7 <-> IC3.8 <-> R13.2 <-> R20.2
|
||||
C16.+ <-> IC3.1 <-> LEVEL.2
|
||||
C16.- <-> R21.1
|
||||
C2.1 <-> IC1.1
|
||||
C2.2 <-> IC1.5
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.7
|
||||
C2.2 <-> IC1.8
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.6
|
||||
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.7 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C6.2 <-> IC2.6 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C7.1 <-> IC2.1
|
||||
C7.2 <-> IC2.5
|
||||
C7.2 <-> IC2.8
|
||||
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 <-> R17.2
|
||||
IC3.7 <-> R15.1 <-> R18.2
|
||||
IC3.6 <-> R15.1 <-> R18.2
|
||||
IC3.7 <-> R17.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.8 <-> R12.1
|
||||
C15.+ <-> IC1.6 <-> IC2.6 <-> IC3.5 <-> R13.2 <-> R20.2
|
||||
C13.2 <-> D1.K <-> IC3.5 <-> R12.1
|
||||
C15.+ <-> IC1.7 <-> IC2.7 <-> IC3.8 <-> R13.2 <-> R20.2
|
||||
C16.+ <-> IC3.1 <-> LEVEL.2
|
||||
C16.- <-> R21.1
|
||||
C2.1 <-> IC1.1
|
||||
C2.2 <-> IC1.5
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.7
|
||||
C2.2 <-> IC1.8
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.6
|
||||
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.7 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C6.2 <-> IC2.6 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C7.1 <-> IC2.1
|
||||
C7.2 <-> IC2.5
|
||||
C7.2 <-> IC2.8
|
||||
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 <-> R17.2
|
||||
IC3.7 <-> R15.1 <-> R18.2
|
||||
IC3.6 <-> R15.1 <-> R18.2
|
||||
IC3.7 <-> R17.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.8 <-> R12.1
|
||||
C15.+ <-> IC1.6 <-> IC2.6 <-> IC3.5 <-> R13.2 <-> R20.2
|
||||
C13.2 <-> D1.K <-> IC3.5 <-> R12.1
|
||||
C15.+ <-> IC1.7 <-> IC2.7 <-> IC3.8 <-> R13.2 <-> R20.2
|
||||
C16.+ <-> IC3.1 <-> LEVEL.2
|
||||
C16.- <-> R21.1
|
||||
C2.1 <-> IC1.1
|
||||
C2.2 <-> IC1.5
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.7
|
||||
C2.2 <-> IC1.8
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.6
|
||||
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.7 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C6.2 <-> IC2.6 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C7.1 <-> IC2.1
|
||||
C7.2 <-> IC2.5
|
||||
C7.2 <-> IC2.8
|
||||
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 <-> R17.2
|
||||
IC3.7 <-> R15.1 <-> R18.2
|
||||
IC3.6 <-> R15.1 <-> R18.2
|
||||
IC3.7 <-> R17.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.8 <-> R12.1
|
||||
C15.+ <-> IC1.6 <-> IC2.6 <-> IC3.5 <-> R13.2 <-> R20.2
|
||||
C13.2 <-> D1.K <-> IC3.5 <-> R12.1
|
||||
C15.+ <-> IC1.7 <-> IC2.7 <-> IC3.8 <-> R13.2 <-> R20.2
|
||||
C16.+ <-> IC3.1 <-> LEVEL.2
|
||||
C16.- <-> R21.1
|
||||
C2.1 <-> IC1.1
|
||||
C2.2 <-> IC1.5
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.7
|
||||
C2.2 <-> IC1.8
|
||||
C3.+ <-> D1.A <-> GAIN.2 <-> IC1.6
|
||||
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.7 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C6.2 <-> IC2.6 <-> LDR.2 <-> R7.1 <-> R8.1 <-> R9.1
|
||||
C7.1 <-> IC2.1
|
||||
C7.2 <-> IC2.5
|
||||
C7.2 <-> IC2.8
|
||||
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 <-> R17.2
|
||||
IC3.7 <-> R15.1 <-> R18.2
|
||||
IC3.6 <-> R15.1 <-> R18.2
|
||||
IC3.7 <-> R17.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.7 <-> Q2.3 <-> R3.2
|
||||
C3.1 <-> IC1.6 <-> Q2.3 <-> R3.2
|
||||
C3.2 <-> C4.+ <-> R2.1 <-> R3.1 <-> R4.1 <-> R5.1
|
||||
C5.+ <-> C6.1 <-> D1.K <-> IC1.6 <-> R10.1 <-> R16.2 <-> R20.2 <-> R4.2
|
||||
IC1.8 <-> R19.1
|
||||
C5.+ <-> C6.1 <-> D1.K <-> IC1.7 <-> R10.1 <-> R16.2 <-> R20.2 <-> R4.2
|
||||
IC1.5 <-> 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.7 <-> Q2.3 <-> R3.2
|
||||
C3.1 <-> IC1.6 <-> Q2.3 <-> R3.2
|
||||
C3.2 <-> C4.+ <-> R2.1 <-> R3.1 <-> R4.1 <-> R5.1
|
||||
C5.+ <-> C6.1 <-> D1.K <-> IC1.6 <-> R10.1 <-> R16.2 <-> R20.2 <-> R4.2
|
||||
IC1.8 <-> R19.1
|
||||
C5.+ <-> C6.1 <-> D1.K <-> IC1.7 <-> R10.1 <-> R16.2 <-> R20.2 <-> R4.2
|
||||
IC1.5 <-> 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.14 <-> R15.1 <-> R16.2
|
||||
Bass Switch.3 <-> C10.2 <-> C11.2 <-> IC1.8 <-> 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.13 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.12 <-> Lo Filter.1
|
||||
C11.1 <-> IC1.9 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.10 <-> 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.10 <-> IC3.13 <-> R24.2
|
||||
C16.1 <-> IC3.12
|
||||
C15.2 <-> D2.A <-> IC3.12 <-> IC3.9 <-> R24.2
|
||||
C16.1 <-> IC3.10
|
||||
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.12 <-> IC2.14 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
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
|
||||
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.10
|
||||
C6.1 <-> IC1.12
|
||||
C7.1 <-> R10.2 <-> R13.1
|
||||
C7.2 <-> C8.2 <-> C9.1 <-> Hi Filter.2
|
||||
D2.K <-> IC3.14
|
||||
D2.K <-> IC3.8
|
||||
D3.A <-> IC3.7
|
||||
IC1.4 <-> IC2.8 <-> IC3.4
|
||||
IC1.13 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC1.14 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.4 <-> IC2.14 <-> 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.8
|
||||
IC3.3 <-> IC3.9 <-> R19.2 <-> R22.2
|
||||
IC2.6 <-> IC3.14
|
||||
IC3.13 <-> IC3.3 <-> 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.14 <-> R15.1 <-> R16.2
|
||||
C11.1 <-> IC1.13 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.12 <-> Lo Filter.1
|
||||
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
|
||||
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.10 <-> IC3.13 <-> R24.2
|
||||
C16.1 <-> IC3.12
|
||||
C15.2 <-> D2.A <-> IC3.12 <-> IC3.9 <-> R24.2
|
||||
C16.1 <-> IC3.10
|
||||
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.12 <-> IC2.14 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
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
|
||||
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.10
|
||||
C6.1 <-> IC1.12
|
||||
C7.1 <-> R10.2 <-> R13.1
|
||||
C7.2 <-> C8.2 <-> C9.1 <-> Hi Filter.2
|
||||
D2.K <-> IC3.14
|
||||
D2.K <-> IC3.8
|
||||
D3.A <-> IC3.7
|
||||
IC1.4 <-> IC2.8 <-> IC3.4
|
||||
IC1.13 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC1.14 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.4 <-> IC2.14 <-> 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.8
|
||||
IC3.3 <-> IC3.9 <-> R19.2 <-> R22.2
|
||||
IC2.6 <-> IC3.14
|
||||
IC3.13 <-> IC3.3 <-> 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.14 <-> R15.1 <-> R16.2
|
||||
C11.1 <-> IC1.13 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.12 <-> Lo Filter.1
|
||||
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
|
||||
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.10 <-> IC3.13 <-> R24.2
|
||||
C16.1 <-> IC3.12
|
||||
C15.2 <-> D2.A <-> IC3.12 <-> IC3.9 <-> R24.2
|
||||
C16.1 <-> IC3.10
|
||||
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.12 <-> IC2.14 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
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
|
||||
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.10
|
||||
C6.1 <-> IC1.12
|
||||
C7.1 <-> R10.2 <-> R13.1
|
||||
C7.2 <-> C8.2 <-> C9.1 <-> Hi Filter.2
|
||||
D2.K <-> IC3.14
|
||||
D2.K <-> IC3.8
|
||||
D3.A <-> IC3.7
|
||||
IC1.4 <-> IC2.8 <-> IC3.4
|
||||
IC1.13 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC1.14 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.4 <-> IC2.14 <-> 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.8
|
||||
IC3.3 <-> IC3.9 <-> R19.2 <-> R22.2
|
||||
IC2.6 <-> IC3.14
|
||||
IC3.13 <-> IC3.3 <-> 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.14 <-> R15.1 <-> R16.2
|
||||
Blend.3 <-> C10.2 <-> C11.2 <-> IC1.8 <-> R15.1 <-> R16.2
|
||||
C1.2 <-> IC1.3 <-> IC1.5 <-> R1.1
|
||||
C10.1 <-> Lo Filter.2 <-> R14.2
|
||||
C11.1 <-> IC1.13 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.12 <-> Lo Filter.1
|
||||
C11.1 <-> IC1.9 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.10 <-> 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.10 <-> IC3.13 <-> R24.2
|
||||
C16.1 <-> IC3.12
|
||||
C15.2 <-> D2.A <-> IC3.12 <-> IC3.9 <-> R24.2
|
||||
C16.1 <-> IC3.10
|
||||
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.12 <-> IC2.14 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
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
|
||||
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.10
|
||||
C6.1 <-> IC1.12
|
||||
C7.1 <-> R10.2 <-> R13.1
|
||||
C7.2 <-> C8.2 <-> C9.1 <-> Hi Filter.2
|
||||
C8.1 <-> R13.2 <-> R14.1
|
||||
D2.K <-> IC3.14
|
||||
D2.K <-> IC3.8
|
||||
D3.A <-> IC3.7
|
||||
IC1.4 <-> IC2.8 <-> IC3.4
|
||||
IC1.13 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC1.14 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.4 <-> IC2.14 <-> 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.8
|
||||
IC3.3 <-> IC3.9 <-> R19.2 <-> R22.2
|
||||
IC2.6 <-> IC3.14
|
||||
IC3.13 <-> IC3.3 <-> 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.14 <-> R15.1 <-> R16.2
|
||||
Blend.3 <-> C10.2 <-> C11.2 <-> IC1.8 <-> R15.1 <-> R16.2
|
||||
C1.2 <-> IC1.3 <-> IC1.5 <-> R1.1
|
||||
C10.1 <-> Lo Filter.2 <-> R14.2
|
||||
C11.1 <-> IC1.13 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.12 <-> Lo Filter.1
|
||||
C11.1 <-> IC1.9 <-> R16.1 <-> R17.1
|
||||
C12.1 <-> IC1.10 <-> 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.10 <-> IC3.13 <-> R24.2
|
||||
C16.1 <-> IC3.12
|
||||
C15.2 <-> D2.A <-> IC3.12 <-> IC3.9 <-> R24.2
|
||||
C16.1 <-> IC3.10
|
||||
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.12 <-> IC2.14 <-> IC2.3 <-> IC2.5 <-> IC2.7 <-> R15.2 <-> R21.2 <-> R25.2 <-> R26.2 <-> R28.1 <-> R3.2 <-> R8.2
|
||||
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
|
||||
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.10
|
||||
C6.1 <-> IC1.12
|
||||
C7.1 <-> R10.2 <-> R13.1
|
||||
C7.2 <-> C8.2 <-> C9.1 <-> Hi Filter.2
|
||||
C8.1 <-> R13.2 <-> R14.1
|
||||
D2.K <-> IC3.14
|
||||
D2.K <-> IC3.8
|
||||
D3.A <-> IC3.7
|
||||
IC1.4 <-> IC2.8 <-> IC3.4
|
||||
IC1.13 <-> R11.1 <-> R7.2 <-> R9.1
|
||||
IC1.14 <-> R10.1 <-> R7.1 <-> R8.1
|
||||
IC1.4 <-> IC2.14 <-> 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.8
|
||||
IC3.3 <-> IC3.9 <-> R19.2 <-> R22.2
|
||||
IC2.6 <-> IC3.14
|
||||
IC3.13 <-> IC3.3 <-> 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.7 <-> VR1.3
|
||||
C2.+ <-> IC1.6 <-> VR1.3
|
||||
C2.- <-> IC1.3 <-> IC1.4
|
||||
C3.1 <-> Q1.1 <-> VR1.1 <-> VR1.2
|
||||
C3.2 <-> VR2.3
|
||||
C4.1 <-> IC1.6
|
||||
C5.+ <-> IC1.8
|
||||
C4.1 <-> IC1.7
|
||||
C5.+ <-> IC1.5
|
||||
IC1.1 <-> VR3.1 <-> VR3.2
|
||||
IC1.2 <-> VR2.2
|
||||
IC1.5 <-> VR3.3
|
||||
IC1.8 <-> 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.7 <-> VR1.3
|
||||
C2.+ <-> IC1.6 <-> VR1.3
|
||||
C2.- <-> IC1.3 <-> IC1.4
|
||||
C3.1 <-> Q1.1 <-> VR1.1 <-> VR1.2
|
||||
C3.2 <-> VR2.3
|
||||
C4.1 <-> IC1.6
|
||||
C5.+ <-> IC1.8
|
||||
C4.1 <-> IC1.7
|
||||
C5.+ <-> IC1.5
|
||||
IC1.1 <-> VR3.1 <-> VR3.2
|
||||
IC1.2 <-> VR2.2
|
||||
IC1.5 <-> VR3.3
|
||||
IC1.8 <-> 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.9 <-> R28.2
|
||||
C12.2 <-> IC3.8 <-> R28.1 <-> R31.1
|
||||
C11.2 <-> IC3.13 <-> R28.2
|
||||
C12.2 <-> IC3.14 <-> R28.1 <-> R31.1
|
||||
C2.1 <-> IC1.7 <-> R5.1
|
||||
C2.2 <-> R6.1
|
||||
C3.1 <-> IC1.13 <-> IC1.14 <-> R8.1
|
||||
C3.1 <-> IC1.8 <-> IC1.9 <-> 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.13 <-> IC2.14 <-> R21.1
|
||||
C6.1 <-> IC2.8 <-> IC2.9 <-> R21.1
|
||||
C7.1 <-> C8.1 <-> R21.2
|
||||
C9.2 <-> IC2.8 <-> IC2.9
|
||||
D1.A <-> D2.K <-> IC2.12 <-> R19.2
|
||||
C9.2 <-> IC2.13 <-> IC2.14
|
||||
D1.A <-> D2.K <-> IC2.10 <-> 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 <-> R8.2 <-> R9.1
|
||||
IC1.10 <-> R7.1
|
||||
IC1.11 <-> IC2.11 <-> IC3.11 <-> IC4.4
|
||||
IC1.12 <-> R7.1
|
||||
IC1.12 <-> R8.2 <-> R9.1
|
||||
IC1.13 <-> R10.1 <-> R11.2
|
||||
IC1.14 <-> R11.1
|
||||
IC1.2 <-> R2.1 <-> R3.1
|
||||
IC1.3 <-> R1.1
|
||||
IC1.4 <-> IC2.4 <-> IC3.4 <-> IC4.5
|
||||
IC1.4 <-> IC2.4 <-> IC3.4 <-> IC4.8
|
||||
IC1.6 <-> R4.2 <-> R5.2
|
||||
IC1.8 <-> R11.1
|
||||
IC1.9 <-> R10.1 <-> R11.2
|
||||
IC2.10 <-> R20.2
|
||||
IC2.12 <-> 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.9 <-> R28.2
|
||||
C12.2 <-> IC3.8 <-> R28.1 <-> R31.1
|
||||
C11.2 <-> IC3.13 <-> R28.2
|
||||
C12.2 <-> IC3.14 <-> R28.1 <-> R31.1
|
||||
C2.1 <-> IC1.7 <-> R5.1
|
||||
C2.2 <-> R6.1
|
||||
C3.1 <-> IC1.13 <-> IC1.14 <-> R8.1
|
||||
C3.1 <-> IC1.8 <-> IC1.9 <-> 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.13 <-> IC2.14 <-> R21.1
|
||||
C6.1 <-> IC2.8 <-> IC2.9 <-> R21.1
|
||||
C7.1 <-> C8.1 <-> R21.2
|
||||
C9.2 <-> IC2.8 <-> IC2.9
|
||||
D1.A <-> D2.K <-> IC2.12 <-> R19.2
|
||||
C9.2 <-> IC2.13 <-> IC2.14
|
||||
D1.A <-> D2.K <-> IC2.10 <-> 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 <-> R8.2 <-> R9.1
|
||||
IC1.10 <-> R7.1
|
||||
IC1.11 <-> IC2.11 <-> IC3.11 <-> IC4.4
|
||||
IC1.12 <-> R7.1
|
||||
IC1.12 <-> R8.2 <-> R9.1
|
||||
IC1.13 <-> R10.1 <-> R11.2
|
||||
IC1.14 <-> R11.1
|
||||
IC1.2 <-> R2.1 <-> R3.1
|
||||
IC1.3 <-> R1.1
|
||||
IC1.4 <-> IC2.4 <-> IC3.4 <-> IC4.5
|
||||
IC1.4 <-> IC2.4 <-> IC3.4 <-> IC4.8
|
||||
IC1.6 <-> R4.2 <-> R5.2
|
||||
IC1.8 <-> R11.1
|
||||
IC1.9 <-> R10.1 <-> R11.2
|
||||
IC2.10 <-> R20.2
|
||||
IC2.12 <-> 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.8 <-> Q2.1 <-> R15.2
|
||||
C11.1 <-> IC2.5 <-> Q2.1 <-> R15.2
|
||||
C11.2 <-> R14.2
|
||||
C12.2 <-> C6.2 <-> C7.+ <-> IC1.5 <-> IC2.5 <-> Q2.2 <-> Q2.3 <-> R3.2 <-> VR1.1 <-> VR1.2
|
||||
C12.2 <-> C6.2 <-> C7.+ <-> IC1.8 <-> IC2.8 <-> 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.8 <-> R8.2
|
||||
C5.+ <-> IC1.5 <-> R8.2
|
||||
C8.- <-> D1.A <-> R10.1
|
||||
C9.+ <-> IC1.6 <-> R9.2
|
||||
C9.+ <-> IC1.7 <-> R9.2
|
||||
C9.- <-> D2.A <-> R11.1
|
||||
IC1.2 <-> R5.2 <-> R6.1
|
||||
IC1.7 <-> R7.2 <-> R9.1
|
||||
IC1.6 <-> R7.2 <-> R9.1
|
||||
IC2.1 <-> IC2.2 <-> R13.1
|
||||
IC2.3 <-> Ratio.2
|
||||
IC2.6 <-> Q1.2 <-> Q1.3 <-> R16.2
|
||||
IC2.7 <-> R13.2 <-> R16.1
|
||||
IC2.6 <-> R13.2 <-> R16.1
|
||||
IC2.7 <-> Q1.2 <-> Q1.3 <-> R16.2
|
||||
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.8 <-> Q2.1 <-> R15.2
|
||||
C11.1 <-> IC2.5 <-> Q2.1 <-> R15.2
|
||||
C11.2 <-> R14.2
|
||||
C12.2 <-> C6.2 <-> C7.+ <-> IC1.5 <-> IC2.5 <-> Q2.2 <-> Q2.3 <-> R3.2 <-> VR1.1 <-> VR1.2
|
||||
C12.2 <-> C6.2 <-> C7.+ <-> IC1.8 <-> IC2.8 <-> 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.8 <-> R8.2
|
||||
C5.+ <-> IC1.5 <-> R8.2
|
||||
C8.- <-> D1.A <-> R10.1
|
||||
C9.+ <-> IC1.6 <-> R9.2
|
||||
C9.+ <-> IC1.7 <-> R9.2
|
||||
C9.- <-> D2.A <-> R11.1
|
||||
IC1.2 <-> R5.2 <-> R6.1
|
||||
IC1.7 <-> R7.2 <-> R9.1
|
||||
IC1.6 <-> R7.2 <-> R9.1
|
||||
IC2.1 <-> IC2.2 <-> R13.1
|
||||
IC2.3 <-> Ratio.2
|
||||
IC2.6 <-> Q1.2 <-> Q1.3 <-> R16.2
|
||||
IC2.7 <-> R13.2 <-> R16.1
|
||||
IC2.6 <-> R13.2 <-> R16.1
|
||||
IC2.7 <-> Q1.2 <-> Q1.3 <-> R16.2
|
||||
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.8 <-> R7.1
|
||||
C2.1 <-> C3.2 <-> IC1.5 <-> R7.1
|
||||
C2.2 <-> P2A.1 <-> P2A.2
|
||||
D1.A <-> D2.K <-> R4.2 <-> R5.1
|
||||
D1.K <-> D2.A <-> IC1.6 <-> P1.3 <-> R5.2 <-> R6.1
|
||||
D1.K <-> D2.A <-> IC1.7 <-> P1.3 <-> R5.2 <-> R6.1
|
||||
IC1.1 <-> IC1.2
|
||||
IC1.3 <-> P1.2
|
||||
IC1.5 <-> R1.2 <-> S1.1
|
||||
IC1.7 <-> R3.1 <-> R4.1
|
||||
IC1.6 <-> R3.1 <-> R4.1
|
||||
IC1.8 <-> R1.2 <-> S1.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.8 <-> R7.1
|
||||
C2.1 <-> C3.2 <-> IC1.5 <-> R7.1
|
||||
C2.2 <-> P2A.1 <-> P2A.2
|
||||
D1.A <-> D2.K <-> R4.2 <-> R5.1
|
||||
D1.K <-> D2.A <-> IC1.6 <-> P1.3 <-> R5.2 <-> R6.1
|
||||
D1.K <-> D2.A <-> IC1.7 <-> P1.3 <-> R5.2 <-> R6.1
|
||||
IC1.1 <-> IC1.2
|
||||
IC1.3 <-> P1.2
|
||||
IC1.5 <-> R1.2
|
||||
IC1.7 <-> R3.1 <-> R4.1
|
||||
IC1.6 <-> R3.1 <-> R4.1
|
||||
IC1.8 <-> R1.2
|
||||
P2A.3 <-> R6.2
|
||||
P2B.3 <-> R7.2
|
||||
|
||||
|
||||
+459
-255
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"version" : "6.10.0",
|
||||
"version" : "6.9.0",
|
||||
"components" : [ {
|
||||
"name" : "Blank Board",
|
||||
"className" : "boards.BlankBoard",
|
||||
@@ -7142,45 +7142,6 @@
|
||||
"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",
|
||||
@@ -7672,66 +7633,6 @@
|
||||
}
|
||||
} ]
|
||||
}
|
||||
}, {
|
||||
"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",
|
||||
@@ -7837,7 +7738,7 @@
|
||||
"className" : "electromechanical.MiniRelay",
|
||||
"category" : "Electro-Mechanical",
|
||||
"namePrefix" : "RY",
|
||||
"description" : "Miniature PCB mount relay, like Omron G5V-1 or G5V-2",
|
||||
"description" : "Miniature PCB mount relay, like Omron G5V-1/G5V-2 or Fujitsu FTR-B3",
|
||||
"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" : [ {
|
||||
@@ -7994,7 +7895,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" ],
|
||||
"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" ],
|
||||
"defaultValue" : "DPDT"
|
||||
} ],
|
||||
"pinout" : {
|
||||
@@ -8266,6 +8167,41 @@
|
||||
"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 ] ]
|
||||
} ]
|
||||
}
|
||||
} ]
|
||||
}
|
||||
}, {
|
||||
@@ -8597,43 +8533,6 @@
|
||||
"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",
|
||||
@@ -8665,44 +8564,6 @@
|
||||
"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",
|
||||
@@ -11552,6 +11413,242 @@
|
||||
"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",
|
||||
@@ -11653,52 +11750,6 @@
|
||||
"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",
|
||||
@@ -12194,6 +12245,7 @@
|
||||
"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",
|
||||
@@ -12308,6 +12360,7 @@
|
||||
"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",
|
||||
@@ -12432,6 +12485,7 @@
|
||||
"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",
|
||||
@@ -12528,6 +12582,7 @@
|
||||
"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",
|
||||
@@ -12930,6 +12985,7 @@
|
||||
"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",
|
||||
@@ -13461,7 +13517,8 @@
|
||||
"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'" ],
|
||||
"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" ],
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
@@ -16507,7 +16564,8 @@
|
||||
"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" ],
|
||||
"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" ],
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
@@ -16528,11 +16586,6 @@
|
||||
"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"
|
||||
@@ -16554,6 +16607,14 @@
|
||||
"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",
|
||||
@@ -16576,22 +16637,10 @@
|
||||
"type" : "String"
|
||||
} ],
|
||||
"pinout" : {
|
||||
"drivers" : [ "Display Pin #s", "Pins" ],
|
||||
"drivers" : [ "Pin Labels", "Pins" ],
|
||||
"variants" : [ {
|
||||
"when" : {
|
||||
"Display Pin #s" : "NO"
|
||||
},
|
||||
"pinCountExpression" : "Pins",
|
||||
"labels" : "sequential",
|
||||
"pinCountSamples" : {
|
||||
"_4" : 4,
|
||||
"_16" : 16,
|
||||
"_28" : 28,
|
||||
"_40" : 40
|
||||
}
|
||||
}, {
|
||||
"when" : {
|
||||
"Display Pin #s" : "DIP"
|
||||
"Pin Labels" : "NO"
|
||||
},
|
||||
"pinCountExpression" : "Pins",
|
||||
"labels" : "custom",
|
||||
@@ -16621,7 +16670,67 @@
|
||||
}
|
||||
}, {
|
||||
"when" : {
|
||||
"Display Pin #s" : "CONNECTOR"
|
||||
"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"
|
||||
},
|
||||
"pinCountExpression" : "Pins",
|
||||
"labels" : "custom",
|
||||
@@ -16651,7 +16760,7 @@
|
||||
}
|
||||
}, {
|
||||
"when" : {
|
||||
"Display Pin #s" : "DIP_MIRROR"
|
||||
"Pin Labels" : "DIP_MIRROR"
|
||||
},
|
||||
"pinCountExpression" : "Pins",
|
||||
"labels" : "custom",
|
||||
@@ -16681,7 +16790,7 @@
|
||||
}
|
||||
}, {
|
||||
"when" : {
|
||||
"Display Pin #s" : "CONNECTOR_MIRROR"
|
||||
"Pin Labels" : "CONNECTOR_MIRROR"
|
||||
},
|
||||
"pinCountExpression" : "Pins",
|
||||
"labels" : "custom",
|
||||
@@ -16981,6 +17090,8 @@
|
||||
"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",
|
||||
@@ -17014,6 +17125,14 @@
|
||||
"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",
|
||||
@@ -17039,14 +17158,90 @@
|
||||
"when" : {
|
||||
"Type" : "MULTIWATT_11"
|
||||
},
|
||||
"pinCount" : 11,
|
||||
"labels" : "sequential"
|
||||
"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"
|
||||
} ]
|
||||
}, {
|
||||
"when" : {
|
||||
"Type" : "MULTIWATT_15"
|
||||
},
|
||||
"pinCount" : 15,
|
||||
"labels" : "sequential"
|
||||
"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"
|
||||
} ]
|
||||
} ]
|
||||
}
|
||||
}, {
|
||||
@@ -17056,7 +17251,8 @@
|
||||
"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" ],
|
||||
"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" ],
|
||||
"properties" : [ {
|
||||
"name" : "Alpha",
|
||||
"type" : "Percentage",
|
||||
@@ -17095,6 +17291,14 @@
|
||||
"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",
|
||||
@@ -18531,7 +18735,7 @@
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0.2mm"
|
||||
"defaultValue" : "1px"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
@@ -18632,7 +18836,7 @@
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0.2mm"
|
||||
"defaultValue" : "1px"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
@@ -18669,7 +18873,7 @@
|
||||
"type" : "Size",
|
||||
"format" : "(value)(unit)",
|
||||
"possibleUnits" : [ "px", "mm", "cm", "m", "in", "ft", "yd" ],
|
||||
"defaultValue" : "0.2mm"
|
||||
"defaultValue" : "1px"
|
||||
}, {
|
||||
"name" : "Color",
|
||||
"type" : "Color",
|
||||
|
||||
+20
-19
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"version" : "6.10.0",
|
||||
"version" : "6.9.0",
|
||||
"categories" : {
|
||||
"Boards" : [ {
|
||||
"name" : "Blank Board",
|
||||
@@ -174,9 +174,6 @@
|
||||
}, {
|
||||
"name" : "9V Battery Snap",
|
||||
"className" : "electromechanical.BatterySnap9V"
|
||||
}, {
|
||||
"name" : "Chassis Panel",
|
||||
"className" : "chassis.ChassisPanel"
|
||||
}, {
|
||||
"name" : "Cliff 1/4\" Jack",
|
||||
"className" : "electromechanical.CliffJack1_4"
|
||||
@@ -189,12 +186,6 @@
|
||||
}, {
|
||||
"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"
|
||||
@@ -225,15 +216,9 @@
|
||||
}, {
|
||||
"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"
|
||||
@@ -293,6 +278,25 @@
|
||||
"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"
|
||||
@@ -302,9 +306,6 @@
|
||||
}, {
|
||||
"name" : "Common Node",
|
||||
"className" : "misc.CommonNode"
|
||||
}, {
|
||||
"name" : "Dial Scale",
|
||||
"className" : "chassis.DialScale"
|
||||
}, {
|
||||
"name" : "Image",
|
||||
"className" : "misc.Image"
|
||||
|
||||
@@ -25,6 +25,7 @@ import java.awt.geom.Point2D;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
public class Template {
|
||||
|
||||
@@ -35,6 +36,8 @@ 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() {
|
||||
}
|
||||
@@ -82,11 +85,20 @@ 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());
|
||||
@@ -107,6 +119,9 @@ 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,6 +129,14 @@ 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
|
||||
|
||||
+13
@@ -52,6 +52,7 @@ 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;
|
||||
|
||||
/**
|
||||
@@ -175,6 +176,18 @@ 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,16 +118,10 @@ public class ComparatorFactory {
|
||||
if (componentZOrderComparator == null) {
|
||||
componentZOrderComparator = new Comparator<IDIYComponent<?>>() {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public int compare(IDIYComponent<?> o1, IDIYComponent<?> 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());
|
||||
return Double.compare(ComponentProcessor.getInstance().getZOrder(o1),
|
||||
ComponentProcessor.getInstance().getZOrder(o2));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -409,6 +409,31 @@ 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,6 +31,7 @@ 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;
|
||||
|
||||
@@ -128,6 +129,16 @@ 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.
|
||||
@@ -141,14 +152,16 @@ 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 > 0 && row[0].trim().equalsIgnoreCase(name))
|
||||
.filter(row -> row.length > column && row[column].trim().equalsIgnoreCase(name))
|
||||
.collect(Collectors.toList());
|
||||
if (rows.isEmpty()) {
|
||||
String lowerName = name.toLowerCase();
|
||||
rows = datasheet.stream()
|
||||
.filter(row -> row.length > 0 && row[0].trim().toLowerCase().contains(lowerName))
|
||||
.filter(row -> row.length > column
|
||||
&& row[column].trim().toLowerCase().contains(lowerName))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
return rows;
|
||||
@@ -170,7 +183,7 @@ public class DatasheetService {
|
||||
return null;
|
||||
}
|
||||
Object value = component.getValue();
|
||||
if (value == null) {
|
||||
if (value == null || (value instanceof String text && text.isBlank())) {
|
||||
// nothing to preserve, but nothing to choose by either
|
||||
return rows.size() == 1 ? rows.get(0) : null;
|
||||
}
|
||||
|
||||
@@ -94,7 +94,8 @@ public class GroupAndLockIndex {
|
||||
if (componentType == null) {
|
||||
return false;
|
||||
}
|
||||
return project.getLockedLayers().contains((int) Math.round(componentType.getZOrder()))
|
||||
return project.getLockedLayers()
|
||||
.contains((int) Math.round(ComponentProcessor.getInstance().getZOrder(component)))
|
||||
|| project.getLockedComponents().contains(component);
|
||||
}
|
||||
|
||||
|
||||
@@ -494,7 +494,8 @@ public class Presenter implements IPlugInPort {
|
||||
// for internal types
|
||||
if (componentType == null)
|
||||
return true;
|
||||
return !currentProject.getHiddenLayers().contains((int) Math.round(componentType.getZOrder()));
|
||||
return !currentProject.getHiddenLayers()
|
||||
.contains((int) Math.round(ComponentProcessor.getInstance().getZOrder(component)));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1076,10 +1077,9 @@ public class Presenter implements IPlugInPort {
|
||||
Iterator<IDIYComponent<?>> i = newSelection.iterator();
|
||||
while (i.hasNext()) {
|
||||
IDIYComponent<?> c = i.next();
|
||||
ComponentType type =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom((Class<? extends IDIYComponent<?>>) c.getClass());
|
||||
if ((int) type.getZOrder() != layer)
|
||||
if ((int) ComponentProcessor.getInstance().getZOrder(c) != layer) {
|
||||
i.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
updateSelection(newSelection);
|
||||
@@ -2229,6 +2229,7 @@ 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());
|
||||
@@ -2236,11 +2237,8 @@ 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(componentBeforeType.getZOrder()) < Math.round(componentType.getZOrder())
|
||||
&& Math.round(ComponentProcessor.getInstance().getZOrder(componentBefore)) < layer
|
||||
&& forceConfirmation != IView.YES_OPTION
|
||||
&& (forceConfirmation =
|
||||
this.view
|
||||
@@ -2278,6 +2276,7 @@ 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());
|
||||
@@ -2285,11 +2284,8 @@ 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(componentAfterType.getZOrder()) > Math.round(componentType.getZOrder())
|
||||
&& Math.round(ComponentProcessor.getInstance().getZOrder(componentAfter)) > layer
|
||||
&& forceConfirmation != IView.YES_OPTION
|
||||
&& (forceConfirmation =
|
||||
this.view
|
||||
@@ -2684,13 +2680,9 @@ public class Presenter implements IPlugInPort {
|
||||
@SuppressWarnings("unchecked")
|
||||
private void addComponent(IDIYComponent<?> component, boolean allowAutoCreate) {
|
||||
int index = currentProject.getComponents().size();
|
||||
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()) {
|
||||
double zOrder = ComponentProcessor.getInstance().getZOrder(component);
|
||||
while (index > 0 && zOrder < ComponentProcessor.getInstance()
|
||||
.getZOrder(currentProject.getComponents().get(index - 1))) {
|
||||
index--;
|
||||
}
|
||||
if (index < currentProject.getComponents().size()) {
|
||||
@@ -2724,12 +2716,9 @@ public class Presenter implements IPlugInPort {
|
||||
int maxIndex = 0;
|
||||
for (IDIYComponent<?> component : components) {
|
||||
int index = currentProject.getComponents().size();
|
||||
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()) {
|
||||
double zOrder = ComponentProcessor.getInstance().getZOrder(component);
|
||||
while (index > maxIndex && zOrder < ComponentProcessor.getInstance()
|
||||
.getZOrder(currentProject.getComponents().get(index - 1))) {
|
||||
index--;
|
||||
}
|
||||
|
||||
@@ -3132,12 +3121,9 @@ public class Presenter implements IPlugInPort {
|
||||
return GroupAndLockIndex.isLocked(currentProject, component);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private boolean isComponentLayerLocked(IDIYComponent<?> component) {
|
||||
ComponentType componentType =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) component.getClass());
|
||||
return currentProject.getLockedLayers().contains((int) Math.round(componentType.getZOrder()));
|
||||
return currentProject.getLockedLayers()
|
||||
.contains((int) Math.round(ComponentProcessor.getInstance().getZOrder(component)));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -65,6 +65,7 @@ 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);
|
||||
@@ -89,7 +90,20 @@ public class VariantManager {
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
for (Template variant : entry.getValue()) {
|
||||
if ((variant.getCreatedOn() == null || importDate.compareTo(variant.getCreatedOn()) < 0)
|
||||
// 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
|
||||
&& !existingNames.contains(variant.getName())) {
|
||||
existingVariants.add(variant);
|
||||
importCount++;
|
||||
@@ -104,6 +118,9 @@ 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,253 +1,5 @@
|
||||
<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>
|
||||
@@ -744,5 +496,65 @@
|
||||
</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,5 +5325,253 @@
|
||||
</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,7 +35,12 @@ 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;
|
||||
@@ -326,4 +331,77 @@ 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,17 +21,21 @@
|
||||
*/
|
||||
package org.diylc.components.chassis;
|
||||
|
||||
import java.awt.AlphaComposite;
|
||||
import java.awt.Color;
|
||||
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.shapes.AbstractShape;
|
||||
import org.diylc.components.AbstractTransparentComponent;
|
||||
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;
|
||||
@@ -39,60 +43,206 @@ import org.diylc.core.annotations.EditableProperty;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
|
||||
@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",
|
||||
@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",
|
||||
zOrder = IDIYComponent.CHASSIS, bomPolicy = BomPolicy.SHOW_ONLY_TYPE_NAME, autoEdit = false,
|
||||
transformer = SimpleComponentTransformer.class)
|
||||
public class ChassisPanel extends AbstractShape {
|
||||
transformer = SimpleComponentTransformer.class, enableDatasheet = true,
|
||||
datasheetCreationStepCount = 2, datasheetModelColumn = 1)
|
||||
public class ChassisPanel extends AbstractTransparentComponent<String>
|
||||
implements IDatasheetSupport {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
protected Size edgeRadius = new Size(0d, SizeUnit.mm);
|
||||
|
||||
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;
|
||||
|
||||
public ChassisPanel() {
|
||||
this.color = LIGHT_METAL_COLOR;
|
||||
this.borderColor = LIGHT_METAL_COLOR.darker();
|
||||
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)};
|
||||
}
|
||||
|
||||
@Override
|
||||
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();
|
||||
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();
|
||||
if (componentState != ComponentState.DRAGGING) {
|
||||
Composite oldComposite = applyAlpha(g2d, componentState);
|
||||
g2d.setColor(color);
|
||||
if (radius == 0) {
|
||||
g2d.fillRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
|
||||
(int) (secondPoint.getX() - firstPoint.getX()),
|
||||
(int) (secondPoint.getY() - firstPoint.getY()));
|
||||
g2d.fillRect(x, y, width, length);
|
||||
} else {
|
||||
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.fillRoundRect(x, y, width, length, radius, radius);
|
||||
}
|
||||
for (Rectangle2D panel : sidePanels) {
|
||||
g2d.fill(panel);
|
||||
}
|
||||
g2d.setComposite(oldComposite);
|
||||
// the panels drawn so far are the whole area of the enclosure
|
||||
drawingObserver.stopTracking();
|
||||
}
|
||||
// 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);
|
||||
g2d.setColor(componentState == ComponentState.SELECTED
|
||||
|| componentState == ComponentState.DRAGGING ? SELECTION_COLOR : borderColor);
|
||||
if (radius == 0) {
|
||||
g2d.drawRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
|
||||
(int) (secondPoint.getX() - firstPoint.getX()),
|
||||
(int) (secondPoint.getY() - firstPoint.getY()));
|
||||
g2d.drawRect(x, y, width, length);
|
||||
} else {
|
||||
g2d.drawRoundRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
|
||||
(int) (secondPoint.getX() - firstPoint.getX()),
|
||||
(int) (secondPoint.getY() - firstPoint.getY()), radius, radius);
|
||||
g2d.drawRoundRect(x, y, width, length, 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;
|
||||
}
|
||||
|
||||
@@ -100,12 +250,70 @@ public class ChassisPanel extends AbstractShape {
|
||||
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;
|
||||
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);
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 = "Misc",
|
||||
@ComponentDescriptor(name = "Dial Scale", author = "Branislav Stojkovic", category = "Hardware",
|
||||
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 = "Electro-Mechanical",
|
||||
@ComponentDescriptor(name = "Elliptical Cutout", author = "Branislav Stojkovic", category = "Hardware",
|
||||
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 = "Electro-Mechanical",
|
||||
@ComponentDescriptor(name = "Polygonal Cutout", author = "Branislav Stojkovic", category = "Hardware",
|
||||
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 = "Electro-Mechanical",
|
||||
@ComponentDescriptor(name = "Rectangular Cutout", author = "Branislav Stojkovic", category = "Hardware",
|
||||
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 = "Electro-Mechanical", author = "Branislav Stojkovic",
|
||||
@ComponentDescriptor(name = "Drill Hole", category = "Hardware", 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,6 +37,7 @@ 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;
|
||||
@@ -48,10 +49,13 @@ 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)
|
||||
public class Resistor extends AbstractLeadedComponent<Resistance> implements IGerberComponentSimple {
|
||||
zOrder = IDIYComponent.COMPONENT, transformer = SimpleComponentTransformer.class, enableCache = true,
|
||||
enableDatasheet = true, datasheetCreationStepCount = 2)
|
||||
public class Resistor extends AbstractLeadedComponent<Resistance>
|
||||
implements IGerberComponentSimple, IDatasheetSupport {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -75,6 +79,41 @@ public class Resistor extends AbstractLeadedComponent<Resistance> implements IGe
|
||||
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;
|
||||
|
||||
+136
-39
@@ -30,16 +30,22 @@ 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;
|
||||
@@ -55,11 +61,15 @@ 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)
|
||||
public class DIL_IC extends AbstractLabeledComponent<String> implements IGerberComponentSimple {
|
||||
transformer = DIL_ICTransformer.class, enableCache = true, enableDatasheet = true,
|
||||
datasheetCreationStepCount = 2, datasheetModelColumn = 1)
|
||||
public class DIL_IC extends AbstractLabeledComponent<String>
|
||||
implements IGerberComponentSimple, IDatasheetSupport {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -72,7 +82,9 @@ public class DIL_IC extends AbstractLabeledComponent<String> implements IGerberC
|
||||
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.NO;
|
||||
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);
|
||||
|
||||
private String value = "";
|
||||
private Orientation orientation = Orientation.DEFAULT;
|
||||
@@ -86,6 +98,7 @@ public class DIL_IC extends AbstractLabeledComponent<String> implements IGerberC
|
||||
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()),
|
||||
@@ -97,12 +110,29 @@ public class DIL_IC extends AbstractLabeledComponent<String> implements IGerberC
|
||||
// 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;
|
||||
@@ -425,9 +455,14 @@ public class DIL_IC extends AbstractLabeledComponent<String> implements IGerberC
|
||||
}
|
||||
}
|
||||
|
||||
if (getDisplayNumbers() == DisplayNumbers.NAMES) {
|
||||
drawPinNames(g2d);
|
||||
}
|
||||
|
||||
// draw pin numbers
|
||||
if (getDisplayNumbers() != DisplayNumbers.NO) {
|
||||
if (getDisplayNumbers() != DisplayNumbers.NO && getDisplayNumbers() != DisplayNumbers.NAMES) {
|
||||
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];
|
||||
@@ -454,16 +489,68 @@ public class DIL_IC extends AbstractLabeledComponent<String> implements IGerberC
|
||||
textY2 = textY2 - pinSize;
|
||||
}
|
||||
|
||||
g2d.setFont(project.getFont().deriveFont((float) (project.getFont().getSize2D() * 0.66)));
|
||||
String pinNumber = Integer.toString(getPinNumber(i));
|
||||
if (i >= pinCount.getValue() / 2) {
|
||||
g2d.drawString(getControlPointNodeName(i), textX1, textY1);
|
||||
g2d.drawString(pinNumber, textX1, textY1);
|
||||
} else {
|
||||
g2d.drawString(getControlPointNodeName(i), textX2, textY2);
|
||||
g2d.drawString(pinNumber, 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;
|
||||
@@ -527,7 +614,7 @@ public class DIL_IC extends AbstractLabeledComponent<String> implements IGerberC
|
||||
this.indentColor = indentColor;
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Display Pin #s")
|
||||
@EditableProperty(name = "Pin Labels")
|
||||
public DisplayNumbers getDisplayNumbers() {
|
||||
if (displayNumbers == null) {
|
||||
displayNumbers = DisplayNumbers.NO;
|
||||
@@ -539,6 +626,42 @@ public class DIL_IC extends AbstractLabeledComponent<String> implements IGerberC
|
||||
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;
|
||||
@@ -569,35 +692,9 @@ public class DIL_IC extends AbstractLabeledComponent<String> implements IGerberC
|
||||
|
||||
@Override
|
||||
public String getControlPointNodeName(int index) {
|
||||
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);
|
||||
int pinNumber = getPinNumber(index);
|
||||
String name = getPinName(pinNumber);
|
||||
return name == null ? Integer.toString(pinNumber) : name;
|
||||
}
|
||||
|
||||
public static enum PinCount {
|
||||
@@ -616,8 +713,8 @@ public class DIL_IC extends AbstractLabeledComponent<String> implements IGerberC
|
||||
|
||||
public enum DisplayNumbers {
|
||||
|
||||
NO("No"), DIP("DIP"), CONNECTOR("Connector"), DIP_MIRROR("DIP (Mirrored)"), CONNECTOR_MIRROR(
|
||||
"Connector (Mirrored)");
|
||||
NO("None"), NAMES("Names"), DIP("DIP"), CONNECTOR("Connector"), DIP_MIRROR("DIP (Mirrored)"),
|
||||
CONNECTOR_MIRROR("Connector (Mirrored)");
|
||||
|
||||
private String label;
|
||||
|
||||
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
+220
-113
@@ -30,16 +30,20 @@ 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;
|
||||
@@ -48,11 +52,16 @@ 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)
|
||||
public class MultiwattIC extends AbstractTransparentComponent<String> implements IGerberComponentSimple {
|
||||
enableCache = true, enableDatasheet = true, datasheetCreationStepCount = 2,
|
||||
datasheetModelColumn = 1)
|
||||
public class MultiwattIC extends AbstractTransparentComponent<String>
|
||||
implements IGerberComponentSimple, IDatasheetSupport {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -67,12 +76,11 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
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);
|
||||
// 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);
|
||||
// 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 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;
|
||||
@@ -84,7 +92,10 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
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();
|
||||
@@ -92,6 +103,27 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
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;
|
||||
@@ -175,7 +207,7 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
int pinsRight = type.getPinsRight();
|
||||
controlPoints = new Point2D.Double[pinCount];
|
||||
controlPoints[0] = firstPoint;
|
||||
double pinSpacing = PIN_SPACING.convertToPixels();
|
||||
double pinSpacing = type.getRowPitch().convertToPixels();
|
||||
double rowSpacing = ROW_SPACING.convertToPixels();
|
||||
// Update control points for staggered layout
|
||||
double dx1, dy1, dx2, dy2;
|
||||
@@ -234,91 +266,68 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
public Area[] getBody() {
|
||||
if (body == null) {
|
||||
body = new Area[2];
|
||||
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();
|
||||
double pinSpacing = type.getRowPitch().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; // 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));
|
||||
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));
|
||||
}
|
||||
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) {
|
||||
@@ -337,20 +346,8 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
double pinX = point.getX();
|
||||
double pinY = point.getY();
|
||||
|
||||
// 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 {
|
||||
// pins under the body are drawn on top of it further down
|
||||
if (!mainArea.contains(pinX, pinY)) {
|
||||
// Draw rectangular lead from body edge to pin position
|
||||
double bodyX = bodyBounds.getX();
|
||||
double bodyY = bodyBounds.getY();
|
||||
@@ -460,6 +457,25 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
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;
|
||||
@@ -492,6 +508,44 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
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
|
||||
@@ -500,7 +554,7 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
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) (LEAD_OFFSET.convertToPixels() * width / 100); // Scale lead offset for icon
|
||||
int leadOffset = (int) (BACK_TO_NEAR_ROW.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;
|
||||
@@ -508,13 +562,13 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
|
||||
// Calculate pin spacing to use all vertical space
|
||||
// Use same spacing for both rows, with front row offset by half spacing
|
||||
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
|
||||
// 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
|
||||
|
||||
// Draw thin body between pin rows
|
||||
g2d.setColor(BODY_COLOR);
|
||||
@@ -522,14 +576,14 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
g2d.setColor(BORDER_COLOR);
|
||||
g2d.drawRect(bodyX, bodyY, bodyWidth, bodyHeight);
|
||||
|
||||
// Draw heat sink tab on left side (where there are more pins)
|
||||
// Draw heat sink tab on left side, away from the forward row
|
||||
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 4 pins in the back (left row, more pins) as squares - inside body
|
||||
// Draw 3 pins in the back as squares - inside body
|
||||
g2d.setColor(PIN_COLOR);
|
||||
for (int i = 0; i < backPins; i++) {
|
||||
int pinY = backStartY + i * pinSpacing - pinSize / 2;
|
||||
@@ -539,7 +593,7 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
g2d.setColor(PIN_COLOR);
|
||||
}
|
||||
|
||||
// Draw 3 pins in the front (right row, fewer pins) with leads going left to body
|
||||
// Draw 4 pins in the front 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++) {
|
||||
@@ -628,6 +682,49 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
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;
|
||||
@@ -652,18 +749,28 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
|
||||
public static enum MultiwattType {
|
||||
// Multiwatt-11: 6 pins on left, 5 pins on right (staggered)
|
||||
MULTIWATT_11(11, 6, 5),
|
||||
MULTIWATT_11(11, 6, 5, new Size(1.7d, SizeUnit.mm), "Multiwatt 11"),
|
||||
// Multiwatt-15: 8 pins on left, 7 pins on right (staggered)
|
||||
MULTIWATT_15(15, 8, 7);
|
||||
MULTIWATT_15(15, 8, 7, new Size(1.27d, SizeUnit.mm), "Multiwatt 15");
|
||||
|
||||
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) {
|
||||
MultiwattType(int pinCount, int pinsLeft, int pinsRight, Size leadPitch, String title) {
|
||||
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() {
|
||||
@@ -680,7 +787,7 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Multiwatt " + pinCount;
|
||||
return title;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
|
||||
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,13 +32,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.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;
|
||||
@@ -54,11 +57,15 @@ 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)
|
||||
public class SIL_IC extends AbstractTransparentComponent<String> implements IGerberComponentSimple {
|
||||
enableCache = true, enableDatasheet = true, datasheetCreationStepCount = 2,
|
||||
datasheetModelColumn = 1)
|
||||
public class SIL_IC extends AbstractTransparentComponent<String>
|
||||
implements IGerberComponentSimple, IDatasheetSupport {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -83,6 +90,8 @@ public class SIL_IC extends AbstractTransparentComponent<String> implements IGer
|
||||
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()),
|
||||
@@ -94,6 +103,7 @@ public class SIL_IC extends AbstractTransparentComponent<String> implements IGer
|
||||
// new Point(3 * pinSpacing.convertToPixels(), 3 *
|
||||
// pinSpacing.convertToPixels()) };
|
||||
transient private Area[] body;
|
||||
transient private String[] parsedPinNames;
|
||||
|
||||
public SIL_IC() {
|
||||
super();
|
||||
@@ -101,6 +111,22 @@ public class SIL_IC extends AbstractTransparentComponent<String> implements IGer
|
||||
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;
|
||||
@@ -230,7 +256,7 @@ public class SIL_IC extends AbstractTransparentComponent<String> implements IGer
|
||||
int thickness = getClosestOdd(THICKNESS.convertToPixels());
|
||||
double width;
|
||||
double height;
|
||||
double pinSpacing = (int) this.pinSpacing.convertToPixels();
|
||||
double pinSpacing = this.pinSpacing.convertToPixels();
|
||||
Area indentation = null;
|
||||
int indentationSize = getClosestOdd(INDENT_SIZE.convertToPixels());
|
||||
switch (orientation) {
|
||||
@@ -364,6 +390,40 @@ public class SIL_IC extends AbstractTransparentComponent<String> implements IGer
|
||||
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
|
||||
@@ -429,6 +489,41 @@ public class SIL_IC extends AbstractTransparentComponent<String> implements IGer
|
||||
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(0.2d, SizeUnit.mm);
|
||||
protected Size borderThickness = new Size(1.0, SizeUnit.px);
|
||||
|
||||
@EditableProperty(name = "Color")
|
||||
public Color getColor() {
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
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
|
||||
@@ -0,0 +1,92 @@
|
||||
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
|
||||
@@ -0,0 +1,4 @@
|
||||
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
|
||||
@@ -0,0 +1,22 @@
|
||||
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
|
||||
@@ -0,0 +1,12 @@
|
||||
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
|
||||
@@ -0,0 +1,196 @@
|
||||
/*
|
||||
|
||||
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,6 +93,9 @@ 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
@@ -0,0 +1,241 @@
|
||||
/*
|
||||
|
||||
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
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
|
||||
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
@@ -0,0 +1,123 @@
|
||||
/*
|
||||
*
|
||||
* 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
@@ -0,0 +1,137 @@
|
||||
/*
|
||||
*
|
||||
* 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
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
*
|
||||
* 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
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
*
|
||||
* 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
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
*
|
||||
* 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 = Display Pin #s, Pins
|
||||
semiconductors.DIL_IC = Pin Labels, Pins
|
||||
semiconductors.DiodeGlass = fixed
|
||||
semiconductors.DiodePlastic = fixed
|
||||
semiconductors.DiodeSymbol = fixed
|
||||
|
||||
@@ -96,11 +96,6 @@
|
||||
<artifactId>commons-compiler</artifactId>
|
||||
<version>3.1.12</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.formdev</groupId>
|
||||
<artifactId>flatlaf</artifactId>
|
||||
<version>3.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.java.balloontip</groupId>
|
||||
<artifactId>balloontip</artifactId>
|
||||
|
||||
@@ -25,6 +25,7 @@ import java.util.Arrays;
|
||||
import java.util.Properties;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.UIManager;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.apache.log4j.PropertyConfigurator;
|
||||
import org.diylc.appframework.miscutils.ConfigurationManager;
|
||||
@@ -41,7 +42,6 @@ import org.diylc.serialization.ProjectFileManager;
|
||||
import org.diylc.swing.gui.MainFrame;
|
||||
import org.diylc.swing.gui.TemplateDialog;
|
||||
import org.diylc.swing.plugins.file.ProjectDrawingProvider;
|
||||
import org.diylc.utils.LookAndFeelUtils;
|
||||
|
||||
/**
|
||||
* Main class that runs DIYLC.
|
||||
@@ -136,7 +136,7 @@ public class DIYLCStarter {
|
||||
LOG.info("Configuration dump end.");
|
||||
|
||||
try {
|
||||
LookAndFeelUtils.applyLookAndFeel();
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
|
||||
// Apply configurable font scaling from VM argument: -Dorg.diylc.fontScaleFactor=X
|
||||
org.diylc.utils.FontScalingUtils.applyFontScaling();
|
||||
|
||||
@@ -34,7 +34,6 @@ import javax.swing.SwingConstants;
|
||||
import javax.swing.border.MatteBorder;
|
||||
import org.diylc.appframework.miscutils.ConfigurationManager;
|
||||
import org.diylc.appframework.miscutils.IConfigListener;
|
||||
import org.diylc.utils.LookAndFeelUtils;
|
||||
|
||||
/***
|
||||
* Panel that has a clickable line that can used to collapse and expand the contents of the panel.
|
||||
@@ -50,8 +49,7 @@ public class CollapsiblePanel extends JPanel {
|
||||
private MatteBorderEx border;
|
||||
private String visibilityConfigKey;
|
||||
|
||||
private Color defaultColor =
|
||||
LookAndFeelUtils.themeColor(Color.lightGray, new Color(85, 88, 90));
|
||||
private Color defaultColor = Color.lightGray;
|
||||
private Color highlightColor = Color.decode("#66CCFF");
|
||||
|
||||
/**
|
||||
|
||||
@@ -24,13 +24,11 @@ import javax.swing.BorderFactory;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.UIManager;
|
||||
import org.diylc.appframework.miscutils.ConfigurationManager;
|
||||
import org.diylc.swingframework.ButtonDialog;
|
||||
|
||||
import org.diylc.common.IPlugInPort;
|
||||
import org.diylc.utils.IconLoader;
|
||||
import org.diylc.utils.LookAndFeelUtils;
|
||||
|
||||
public class InfoDialog extends ButtonDialog {
|
||||
|
||||
@@ -55,10 +53,9 @@ public class InfoDialog extends ButtonDialog {
|
||||
protected JComponent getMainComponent() {
|
||||
JLabel label = new JLabel("<html>" + message + "</html>");
|
||||
label.setIcon(IconLoader.Help.getIcon());
|
||||
label.setBackground(UIManager.getColor("List.background"));
|
||||
label.setBackground(Color.white);
|
||||
label.setOpaque(true);
|
||||
label.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 0,
|
||||
LookAndFeelUtils.themeColor(Color.lightGray, new Color(85, 88, 90))), BorderFactory.createEmptyBorder(16, 16, 16, 16)));
|
||||
label.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.lightGray), BorderFactory.createEmptyBorder(16, 16, 16, 16)));
|
||||
label.setIconTextGap(8);
|
||||
return label;
|
||||
}
|
||||
|
||||
@@ -60,7 +60,6 @@ import org.diylc.common.IPlugInPort;
|
||||
import org.diylc.common.PropertyWrapper;
|
||||
import org.diylc.core.IView;
|
||||
import org.diylc.presenter.Presenter;
|
||||
import org.diylc.utils.LookAndFeelUtils;
|
||||
|
||||
public class TemplateDialog extends JDialog {
|
||||
|
||||
@@ -202,8 +201,7 @@ public class TemplateDialog extends JDialog {
|
||||
public JPanel getInfoPanel() {
|
||||
if (infoPanel == null) {
|
||||
infoPanel = new JPanel();
|
||||
infoPanel.setBackground(
|
||||
LookAndFeelUtils.themeColor(Color.decode("#FFFFCC"), Color.decode("#4B4B3A")));
|
||||
infoPanel.setBackground(Color.decode("#FFFFCC"));
|
||||
infoPanel.setBorder(new JTextField().getBorder());
|
||||
JLabel infoLabel =
|
||||
new JLabel(
|
||||
|
||||
+2
-3
@@ -36,7 +36,6 @@ import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JSeparator;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.UIManager;
|
||||
|
||||
import org.diylc.common.IPlugInPort;
|
||||
import org.diylc.common.ITask;
|
||||
@@ -92,7 +91,7 @@ public class CommentDialog extends JDialog {
|
||||
private JPanel getListPanel() {
|
||||
if (listPanel == null) {
|
||||
listPanel = new JPanel(new GridBagLayout());
|
||||
listPanel.setBackground(UIManager.getColor("List.background"));
|
||||
listPanel.setBackground(Color.white);
|
||||
for (CommentEntity c : comments) {
|
||||
addComment(c);
|
||||
|
||||
@@ -108,7 +107,7 @@ public class CommentDialog extends JDialog {
|
||||
private JPanel getMainPanel() {
|
||||
if (mainPanel == null) {
|
||||
mainPanel = new JPanel(new GridBagLayout());
|
||||
mainPanel.setBackground(UIManager.getColor("List.background"));
|
||||
mainPanel.setBackground(Color.white);
|
||||
|
||||
GridBagConstraints gbc = new GridBagConstraints();
|
||||
gbc.gridx = 0;
|
||||
|
||||
+2
-2
@@ -21,6 +21,7 @@
|
||||
*/
|
||||
package org.diylc.swing.plugins.cloud.view.browser;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
@@ -36,7 +37,6 @@ import javax.swing.JRootPane;
|
||||
import javax.swing.JTabbedPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.SwingWorker;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
import org.apache.log4j.Logger;
|
||||
@@ -167,7 +167,7 @@ public class CloudBrowserFrame extends JFrame implements ISimpleView {
|
||||
if (searchPanel == null) {
|
||||
searchPanel = new JPanel(new GridBagLayout());
|
||||
GridBagConstraints gbc = new GridBagConstraints();
|
||||
searchPanel.setBackground(UIManager.getColor("List.background"));
|
||||
searchPanel.setBackground(Color.white);
|
||||
gbc.anchor = GridBagConstraints.NORTH;
|
||||
gbc.insets = new Insets(2, 2, 2, 2);
|
||||
gbc.gridx = 0;
|
||||
|
||||
+3
-3
@@ -18,6 +18,7 @@
|
||||
*/
|
||||
package org.diylc.swing.plugins.cloud.view.browser;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.Graphics;
|
||||
@@ -47,7 +48,6 @@ import javax.swing.JTextArea;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.SwingWorker;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.text.DefaultCaret;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.diylc.appframework.miscutils.InMemoryConfigurationManager;
|
||||
@@ -507,7 +507,7 @@ public class ResultsScrollPanel extends JScrollPane {
|
||||
}
|
||||
});
|
||||
|
||||
buttonPanel.setBackground(UIManager.getColor("List.background"));
|
||||
buttonPanel.setBackground(Color.white);
|
||||
buttonPanel.add(downloadButton);
|
||||
if (showEditControls) {
|
||||
buttonPanel.add(editButton);
|
||||
@@ -651,7 +651,7 @@ public class ResultsScrollPanel extends JScrollPane {
|
||||
private JPanel getResultsPanel() {
|
||||
if (resultsPanel == null) {
|
||||
resultsPanel = new JPanel(new GridBagLayout());
|
||||
resultsPanel.setBackground(UIManager.getColor("List.background"));
|
||||
resultsPanel.setBackground(Color.white);
|
||||
}
|
||||
return resultsPanel;
|
||||
}
|
||||
|
||||
+2
-2
@@ -21,6 +21,7 @@
|
||||
*/
|
||||
package org.diylc.swing.plugins.cloud.view.browser;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
import java.awt.Insets;
|
||||
@@ -30,7 +31,6 @@ import javax.swing.JComboBox;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.UIManager;
|
||||
|
||||
import org.diylc.utils.IconLoader;
|
||||
|
||||
@@ -48,7 +48,7 @@ public class SearchHeaderPanel extends JPanel {
|
||||
public SearchHeaderPanel() {
|
||||
setLayout(new GridBagLayout());
|
||||
|
||||
this.setBackground(UIManager.getColor("List.background"));
|
||||
this.setBackground(Color.white);
|
||||
GridBagConstraints gbc = new GridBagConstraints();
|
||||
gbc.anchor = GridBagConstraints.LINE_START;
|
||||
gbc.insets = new Insets(2, 2, 2, 2);
|
||||
|
||||
@@ -43,7 +43,6 @@ import org.diylc.lang.Language;
|
||||
import org.diylc.swing.ActionFactory;
|
||||
import org.diylc.swing.ISwingUI;
|
||||
import org.diylc.utils.IconLoader;
|
||||
import org.diylc.utils.LookAndFeelUtils;
|
||||
import org.diylc.utils.ResourceUtils;
|
||||
|
||||
/**
|
||||
@@ -57,7 +56,6 @@ public class ConfigPlugin implements IPlugIn {
|
||||
|
||||
private static final String CONFIG_MENU = "Config";
|
||||
private static final String THEME_MENU = "Theme";
|
||||
private static final String UI_THEME_MENU = "UI Theme";
|
||||
private static final String RULER_MENU = "Ruler Inch Subdivision...";
|
||||
private static final String SNAP_MENU = "Snap To";
|
||||
private static final String CATEGORIES_MENU = "Component Categories";
|
||||
@@ -70,7 +68,6 @@ public class ConfigPlugin implements IPlugIn {
|
||||
private static final String LANGUAGE_MENU = LangUtil.translate("Language");
|
||||
|
||||
private static final String LANG_RESTART = LangUtil.translate("Language selection will be applied after the application is restarted.");
|
||||
private static final String UI_THEME_RESTART = LangUtil.translate("UI theme selection will be applied after the application is restarted.");
|
||||
public static final String THEMES_DIR = "themes";
|
||||
|
||||
private ISwingUI swingUI;
|
||||
@@ -141,14 +138,6 @@ public class ConfigPlugin implements IPlugIn {
|
||||
} catch (Exception e) {
|
||||
LOG.error("Error while setting up language menu", e);
|
||||
}
|
||||
|
||||
swingUI.injectSubmenu(UI_THEME_MENU, IconLoader.WindowColors.getIcon(), CONFIG_MENU);
|
||||
for (String uiTheme : new String[] {LookAndFeelUtils.UI_THEME_SYSTEM,
|
||||
LookAndFeelUtils.UI_THEME_LIGHT, LookAndFeelUtils.UI_THEME_DARK}) {
|
||||
swingUI.injectMenuAction(ActionFactory.getInstance().createToggleAction(uiTheme,
|
||||
LookAndFeelUtils.UI_THEME_KEY, UI_THEME_MENU, LookAndFeelUtils.UI_THEME_DEFAULT),
|
||||
UI_THEME_MENU);
|
||||
}
|
||||
|
||||
|
||||
swingUI.injectMenuAction(
|
||||
@@ -242,16 +231,6 @@ public class ConfigPlugin implements IPlugIn {
|
||||
swingUI.showMessage(LANG_RESTART, LANGUAGE_MENU, ISwingUI.INFORMATION_MESSAGE);
|
||||
}
|
||||
});
|
||||
|
||||
ConfigurationManager.getInstance().addConfigListener(LookAndFeelUtils.UI_THEME_KEY,
|
||||
new IConfigListener() {
|
||||
|
||||
@Override
|
||||
public void valueChanged(String key, Object value) {
|
||||
swingUI.showMessage(UI_THEME_RESTART, LangUtil.translate(UI_THEME_MENU),
|
||||
ISwingUI.INFORMATION_MESSAGE);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+16
-26
@@ -37,17 +37,16 @@ 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;
|
||||
import org.diylc.swing.gui.IDragDropListListener;
|
||||
import org.diylc.swing.gui.SearchTextField;
|
||||
import org.diylc.utils.LookAndFeelUtils;
|
||||
|
||||
public class ExplorerPane extends JPanel {
|
||||
|
||||
@@ -258,7 +257,7 @@ public class ExplorerPane extends JPanel {
|
||||
0, false, false)
|
||||
.getPreferredSize().height);
|
||||
componentList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
|
||||
componentList.setCellRenderer(new ComponentListCellRenderer(plugInPort.getComponentTypes()));
|
||||
componentList.setCellRenderer(new ComponentListCellRenderer());
|
||||
selectionListener = new ListSelectionListener() {
|
||||
|
||||
@Override
|
||||
@@ -587,16 +586,6 @@ public class ExplorerPane extends JPanel {
|
||||
|
||||
protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
|
||||
|
||||
private Map<String, ComponentType> componentTypes;
|
||||
|
||||
private String layerColor = LookAndFeelUtils.themeHtmlColor("#c0c0c0", "#707070");
|
||||
private String valueColor = LookAndFeelUtils.themeHtmlColor("#666666", "#a0a0a0");
|
||||
|
||||
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) {
|
||||
@@ -609,14 +598,15 @@ public class ExplorerPane extends JPanel {
|
||||
if (groupItem.getComponentCount() == 1) {
|
||||
// Render as individual component (ungrouped)
|
||||
IDIYComponent<?> component = groupItem.getGroup().iterator().next();
|
||||
ComponentType componentType = componentTypes.get(component.getClass().getCanonicalName());
|
||||
|
||||
if (componentType == null) {
|
||||
double zOrder = ComponentProcessor.getInstance().getZOrder(component);
|
||||
|
||||
// internal types without a descriptor have no layer
|
||||
if (zOrder == Double.MAX_VALUE) {
|
||||
renderer.setText(component.toString());
|
||||
return renderer;
|
||||
}
|
||||
|
||||
int layerId = (int) Math.round(componentType.getZOrder());
|
||||
int layerId = (int) Math.round(zOrder);
|
||||
|
||||
String valueForDisplay = component.getValueForDisplay();
|
||||
if (isSelected) {
|
||||
@@ -628,12 +618,12 @@ public class ExplorerPane extends JPanel {
|
||||
}
|
||||
} else {
|
||||
if (valueForDisplay == null || valueForDisplay.trim().isEmpty()) {
|
||||
renderer.setText(String.format("<html><font color='%s'>[L%s]</font> %s</html>",
|
||||
layerColor, layerId, component.getName()));
|
||||
renderer.setText(String.format("<html><font color='#c0c0c0'>[L%s]</font> %s</html>",
|
||||
layerId, component.getName()));
|
||||
} else {
|
||||
renderer.setText(String.format(
|
||||
"<html><font color='%s'>[L%s]</font> %s (<font color='%s'>%s</font>)</html>",
|
||||
layerColor, layerId, component.getName(), valueColor, valueForDisplay));
|
||||
"<html><font color='#c0c0c0'>[L%s]</font> %s (<font color='#666666'>%s</font>)</html>",
|
||||
layerId, component.getName(), valueForDisplay));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -641,9 +631,9 @@ public class ExplorerPane extends JPanel {
|
||||
// Calculate maximum layer from components in the group
|
||||
int maxLayerId = 0;
|
||||
for (IDIYComponent<?> component : groupItem.getGroup()) {
|
||||
ComponentType componentType = componentTypes.get(component.getClass().getCanonicalName());
|
||||
if (componentType != null) {
|
||||
int layerId = (int) Math.round(componentType.getZOrder());
|
||||
double zOrder = ComponentProcessor.getInstance().getZOrder(component);
|
||||
if (zOrder != Double.MAX_VALUE) {
|
||||
int layerId = (int) Math.round(zOrder);
|
||||
if (layerId > maxLayerId) {
|
||||
maxLayerId = layerId;
|
||||
}
|
||||
@@ -660,8 +650,8 @@ public class ExplorerPane extends JPanel {
|
||||
renderer.setText(String.format("<html>[L%s] <b>%s</b> (<b>%s</b>)</html>", maxLayerId, groupName, componentCount));
|
||||
} else {
|
||||
renderer.setText(String.format(
|
||||
"<html><font color='%s'>[L%s]</font> %s (<font color='%s'>%s</font>)</html>",
|
||||
layerColor, maxLayerId, groupName, valueColor, componentCount));
|
||||
"<html><font color='#c0c0c0'>[L%s]</font> %s (<font color='#666666'>%s</font>)</html>",
|
||||
maxLayerId, groupName, componentCount));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,85 +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.utils;
|
||||
|
||||
import java.awt.Color;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.UnsupportedLookAndFeelException;
|
||||
|
||||
import com.formdev.flatlaf.FlatDarkLaf;
|
||||
import com.formdev.flatlaf.FlatLaf;
|
||||
import com.formdev.flatlaf.FlatLightLaf;
|
||||
import com.formdev.flatlaf.themes.FlatMacDarkLaf;
|
||||
import com.formdev.flatlaf.themes.FlatMacLightLaf;
|
||||
|
||||
import org.diylc.appframework.miscutils.ConfigurationManager;
|
||||
import org.diylc.appframework.miscutils.Utils;
|
||||
|
||||
/**
|
||||
* Installs the Swing look and feel selected under Config > UI Theme. The native look and feel
|
||||
* remains the default; the light and dark themes are provided by FlatLaf.
|
||||
*
|
||||
* @author Branislav Stojkovic
|
||||
*/
|
||||
public class LookAndFeelUtils {
|
||||
|
||||
public static final String UI_THEME_KEY = "uiTheme";
|
||||
public static final String UI_THEME_SYSTEM = "System";
|
||||
public static final String UI_THEME_LIGHT = "Light";
|
||||
public static final String UI_THEME_DARK = "Dark";
|
||||
public static final String UI_THEME_DEFAULT = UI_THEME_SYSTEM;
|
||||
|
||||
/**
|
||||
* Installs the configured look and feel. Must run before any UI component is created, since
|
||||
* switching requires an application restart.
|
||||
*/
|
||||
public static void applyLookAndFeel() throws ClassNotFoundException, InstantiationException,
|
||||
IllegalAccessException, UnsupportedLookAndFeelException {
|
||||
String theme = ConfigurationManager.getInstance().readString(UI_THEME_KEY, UI_THEME_DEFAULT);
|
||||
if (UI_THEME_DARK.equalsIgnoreCase(theme)) {
|
||||
UIManager.setLookAndFeel(Utils.isMac() ? new FlatMacDarkLaf() : new FlatDarkLaf());
|
||||
} else if (UI_THEME_LIGHT.equalsIgnoreCase(theme)) {
|
||||
UIManager.setLookAndFeel(Utils.isMac() ? new FlatMacLightLaf() : new FlatLightLaf());
|
||||
} else {
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isDark() {
|
||||
return FlatLaf.isLafDark();
|
||||
}
|
||||
|
||||
/**
|
||||
* Picks between two variants of a color that the look and feel does not provide, such as an
|
||||
* accent or a highlight.
|
||||
*/
|
||||
public static Color themeColor(Color light, Color dark) {
|
||||
return isDark() ? dark : light;
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as {@link #themeColor(Color, Color)} for colors embedded into HTML, in "#rrggbb" form.
|
||||
*/
|
||||
public static String themeHtmlColor(String light, String dark) {
|
||||
return isDark() ? dark : light;
|
||||
}
|
||||
}
|
||||
@@ -117,7 +117,6 @@ Diameter|Durchmesser
|
||||
Directional|Direktionell
|
||||
Directly heated|Direkt geheizt
|
||||
Display|Anzeigen
|
||||
Display Pin #s|Stiftnummern anzeigen
|
||||
Dog Ear|‘Dog Ear’
|
||||
Dot Spacing|Punktabstand
|
||||
Dotted|Gepunktet
|
||||
@@ -714,6 +713,10 @@ 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?
|
||||
UI Theme|UI-Design
|
||||
System|System
|
||||
UI theme selection will be applied after the application is restarted.|Das gewählte UI-Design wird nach Neustart der Anwendung verwendet.
|
||||
Pin Names|Pinnamen
|
||||
Pin Labels|Pin-Beschriftungen
|
||||
Names|Namen
|
||||
Hardware|Hardware
|
||||
Sides|Seiten
|
||||
All|Alle
|
||||
Front and Back|Vorne und hinten
|
||||
|
||||
@@ -117,7 +117,6 @@ Diameter
|
||||
Directional
|
||||
Directly heated
|
||||
Display
|
||||
Display Pin #s
|
||||
Dog Ear
|
||||
Dot Spacing
|
||||
Donate
|
||||
@@ -707,6 +706,10 @@ 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?
|
||||
UI Theme
|
||||
System
|
||||
UI theme selection will be applied after the application is restarted.
|
||||
Pin Names
|
||||
Pin Labels
|
||||
Names
|
||||
Hardware
|
||||
Sides
|
||||
All
|
||||
Front and Back
|
||||
|
||||
@@ -114,7 +114,6 @@ 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
|
||||
@@ -710,6 +709,10 @@ 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?
|
||||
UI Theme|Tema de la interfaz
|
||||
System|Sistema
|
||||
UI theme selection will be applied after the application is restarted.|La selección del tema de la interfaz se aplicará después de reiniciar la aplicación.
|
||||
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,7 +114,6 @@ 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)
|
||||
@@ -709,6 +708,10 @@ 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 ?
|
||||
UI Theme|Thème de l'interface
|
||||
System|Système
|
||||
UI theme selection will be applied after the application is restarted.|La sélection du thème de l'interface sera appliquée après le redémarrage de l'application.
|
||||
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,7 +117,6 @@ 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
|
||||
@@ -711,6 +710,10 @@ 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?
|
||||
UI Theme|Tema dell'interfaccia
|
||||
System|Sistema
|
||||
UI theme selection will be applied after the application is restarted.|La selezione del tema dell'interfaccia verrà applicata dopo il riavvio dell'applicazione.
|
||||
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,7 +117,6 @@ 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
|
||||
@@ -715,6 +714,10 @@ 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?
|
||||
UI Theme|Interfacethema
|
||||
System|Systeem
|
||||
UI theme selection will be applied after the application is restarted.|Interfacethema wordt toegepast nadat het programma opnieuw is opgestart.
|
||||
Pin Names|Pinnamen
|
||||
Pin Labels|Pinlabels
|
||||
Names|Namen
|
||||
Hardware|Hardware
|
||||
Sides|Zijden
|
||||
All|Alle
|
||||
Front and Back|Voor- en achterkant
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user