Compare commits

..

21 Commits

Author SHA1 Message Date
Bane Stojkovic 396c150472 datasheet fix 2026-11-06 09:57:02 +01:00
Bane Stojkovic c47ff3a8fc release 2026-11-06 09:42:23 +01:00
Bane Stojkovic bf7fdafef5 blocks and variants import enhancements 2026-11-06 09:39:07 +01:00
Bane Stojkovic 35bf22edea test sync 2026-11-06 09:29:50 +01:00
Bane Stojkovic f249ba6b9e Update update.xml 2026-11-04 10:45:48 +01:00
Bane Stojkovic 0d2475d4f6 heat sink resistor 2026-11-04 10:38:27 +01:00
Bane Stojkovic 2ae30b9630 fix test config 2026-11-04 10:15:08 +01:00
Bane Stojkovic e751c20e93 added ability to save default model 2026-11-03 21:35:17 +01:00
Bane Stojkovic 12ac7fe809 to-1 flange added 2026-11-03 18:31:11 +01:00
Bane Stojkovic 1ae9c17cb0 add variants button in the tree 2026-11-03 18:18:12 +01:00
Bane Stojkovic 75d0accc5a more datasheet models 2026-11-03 16:08:12 +01:00
Bane Stojkovic 54179e2d7b regulator coverage gap 2026-11-03 13:44:22 +01:00
Bane Stojkovic 732281f3d7 consolidate pin color and pin rendering 2026-11-03 12:08:33 +01:00
Bane Stojkovic 1a4b40d36c sorting 2026-11-03 11:06:36 +01:00
Bane Stojkovic 55c48c6b24 ux4 sockec 2026-11-02 18:19:34 +01:00
Bane Stojkovic b7fece1edb submini tubes 2026-11-02 17:22:19 +01:00
Bane Stojkovic 3ba4434b66 tube improvements 2026-11-02 15:51:26 +01:00
Bane Stojkovic e369ea6200 diode improvements 2026-11-02 14:58:52 +01:00
Bane Stojkovic 3e043a8387 tube improvements 2026-11-02 14:40:23 +01:00
Bane Stojkovic 1dfef6dd6b Update update.xml 2026-11-02 13:10:51 +01:00
Bane Stojkovic ab16636860 transistor improvements 2026-11-02 13:01:11 +01:00
192 changed files with 7397 additions and 2145 deletions
@@ -1,39 +1,3 @@
Switch setup: [ 3-Way-Switch.Middle:Push Pull.ON1:Rhythm Circuit.ON1 ]
Bridge.South Finish <-> Lead Tone.1 <-> Lead Volume.3 <-> Neck.North Finish
Bridge.South Start <-> GND <-> Lead Tone Cap.2 <-> Lead Volume.1 <-> Neck.North Start <-> Output.Sleeve <-> RC Tone Cap.1 <-> RC Volume.1
Lead Tone Cap.1 <-> Lead Tone.2
Lead Volume.2 <-> Output.Tip
RC Tone Cap.2 <-> RC Tone.2
RC Tone.1 <-> RC Volume.3
Switch setup: [ 3-Way-Switch.Middle:Push Pull.ON1:Rhythm Circuit.ON2 ]
Bridge.South Finish <-> Neck.North Finish <-> RC Tone.1 <-> RC Volume.3
Bridge.South Start <-> GND <-> Lead Tone Cap.2 <-> Lead Volume.1 <-> Neck.North Start <-> Output.Sleeve <-> RC Tone Cap.1 <-> RC Volume.1
Lead Tone Cap.1 <-> Lead Tone.2
Lead Tone.1 <-> Lead Volume.3
Output.Tip <-> RC Volume.2
RC Tone Cap.2 <-> RC Tone.2
Switch setup: [ 3-Way-Switch.Rhythm:Push Pull.ON1:Rhythm Circuit.ON1 ]
Bridge.South Start <-> GND <-> Lead Tone Cap.2 <-> Lead Volume.1 <-> Neck.North Start <-> Output.Sleeve <-> RC Tone Cap.1 <-> RC Volume.1
Lead Tone Cap.1 <-> Lead Tone.2
Lead Tone.1 <-> Lead Volume.3 <-> Neck.North Finish
Lead Volume.2 <-> Output.Tip
RC Tone Cap.2 <-> RC Tone.2
RC Tone.1 <-> RC Volume.3
Switch setup: [ 3-Way-Switch.Rhythm:Push Pull.ON1:Rhythm Circuit.ON2 ]
Bridge.South Start <-> GND <-> Lead Tone Cap.2 <-> Lead Volume.1 <-> Neck.North Start <-> Output.Sleeve <-> RC Tone Cap.1 <-> RC Volume.1
Lead Tone Cap.1 <-> Lead Tone.2
Lead Tone.1 <-> Lead Volume.3
Neck.North Finish <-> RC Tone.1 <-> RC Volume.3
Output.Tip <-> RC Volume.2
RC Tone Cap.2 <-> RC Tone.2
Switch setup: [ 3-Way-Switch.Treble:Push Pull.ON1:Rhythm Circuit.ON1 ]
Bridge.South Finish <-> Lead Tone.1 <-> Lead Volume.3
@@ -72,3 +36,39 @@ Switch setup: [ Push Pull.ON2:Rhythm Circuit.ON2 ]
Output.Tip <-> RC Volume.2
RC Tone Cap.2 <-> RC Tone.2
Switch setup: [ 3-Way-Switch.Middle:Push Pull.ON1:Rhythm Circuit.ON1 ]
Bridge.South Finish <-> Lead Tone.1 <-> Lead Volume.3 <-> Neck.North Finish
Bridge.South Start <-> GND <-> Lead Tone Cap.2 <-> Lead Volume.1 <-> Neck.North Start <-> Output.Sleeve <-> RC Tone Cap.1 <-> RC Volume.1
Lead Tone Cap.1 <-> Lead Tone.2
Lead Volume.2 <-> Output.Tip
RC Tone Cap.2 <-> RC Tone.2
RC Tone.1 <-> RC Volume.3
Switch setup: [ 3-Way-Switch.Middle:Push Pull.ON1:Rhythm Circuit.ON2 ]
Bridge.South Finish <-> Neck.North Finish <-> RC Tone.1 <-> RC Volume.3
Bridge.South Start <-> GND <-> Lead Tone Cap.2 <-> Lead Volume.1 <-> Neck.North Start <-> Output.Sleeve <-> RC Tone Cap.1 <-> RC Volume.1
Lead Tone Cap.1 <-> Lead Tone.2
Lead Tone.1 <-> Lead Volume.3
Output.Tip <-> RC Volume.2
RC Tone Cap.2 <-> RC Tone.2
Switch setup: [ 3-Way-Switch.Rhythm:Push Pull.ON1:Rhythm Circuit.ON1 ]
Bridge.South Start <-> GND <-> Lead Tone Cap.2 <-> Lead Volume.1 <-> Neck.North Start <-> Output.Sleeve <-> RC Tone Cap.1 <-> RC Volume.1
Lead Tone Cap.1 <-> Lead Tone.2
Lead Tone.1 <-> Lead Volume.3 <-> Neck.North Finish
Lead Volume.2 <-> Output.Tip
RC Tone Cap.2 <-> RC Tone.2
RC Tone.1 <-> RC Volume.3
Switch setup: [ 3-Way-Switch.Rhythm:Push Pull.ON1:Rhythm Circuit.ON2 ]
Bridge.South Start <-> GND <-> Lead Tone Cap.2 <-> Lead Volume.1 <-> Neck.North Start <-> Output.Sleeve <-> RC Tone Cap.1 <-> RC Volume.1
Lead Tone Cap.1 <-> Lead Tone.2
Lead Tone.1 <-> Lead Volume.3
Neck.North Finish <-> RC Tone.1 <-> RC Volume.3
Output.Tip <-> RC Volume.2
RC Tone Cap.2 <-> RC Tone.2
Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 KiB

After

Width:  |  Height:  |  Size: 231 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 KiB

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 KiB

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 601 KiB

After

Width:  |  Height:  |  Size: 601 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 350 KiB

After

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 156 KiB

@@ -1,3 +1,20 @@
Switch setup: [ SW1.Treble:SW2.ON1 ]
Bucker.North Finish <-> Bucker.North Start <-> Bucker.South Finish <-> C1.2 <-> J1.Sleeve <-> Single.North Start <-> VR1.1 <-> VR2.1
Bucker.South Start <-> VR1.3
C1.1 <-> VR3.2
J1.Tip <-> VR1.2 <-> VR3.1
Single.North Finish <-> VR2.3
Switch setup: [ SW1.Treble:SW2.ON2 ]
Bucker.North Finish <-> Bucker.South Finish
Bucker.North Start <-> C1.2 <-> J1.Sleeve <-> Single.North Start <-> VR1.1 <-> VR2.1
Bucker.South Start <-> VR1.3
C1.1 <-> VR3.2
J1.Tip <-> VR1.2 <-> VR3.1
Single.North Finish <-> VR2.3
Switch setup: [ SW1.Middle:SW2.ON1 ]
Bucker.North Finish <-> Bucker.North Start <-> Bucker.South Finish <-> C1.2 <-> J1.Sleeve <-> Single.North Start <-> VR1.1 <-> VR2.1
@@ -32,20 +49,3 @@ Switch setup: [ SW1.Rhythm:SW2.ON2 ]
J1.Tip <-> VR2.2 <-> VR3.1
Single.North Finish <-> VR2.3
Switch setup: [ SW1.Treble:SW2.ON1 ]
Bucker.North Finish <-> Bucker.North Start <-> Bucker.South Finish <-> C1.2 <-> J1.Sleeve <-> Single.North Start <-> VR1.1 <-> VR2.1
Bucker.South Start <-> VR1.3
C1.1 <-> VR3.2
J1.Tip <-> VR1.2 <-> VR3.1
Single.North Finish <-> VR2.3
Switch setup: [ SW1.Treble:SW2.ON2 ]
Bucker.North Finish <-> Bucker.South Finish
Bucker.North Start <-> C1.2 <-> J1.Sleeve <-> Single.North Start <-> VR1.1 <-> VR2.1
Bucker.South Start <-> VR1.3
C1.1 <-> VR3.2
J1.Tip <-> VR1.2 <-> VR3.1
Single.North Finish <-> VR2.3
@@ -1,7 +1,7 @@
Switch setup: [ ALL ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> SW1.1
@@ -1,7 +1,7 @@
Switch setup: [ SW1.ON1:SW1.ON1:SW1.ON1:SW1.ON1:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
@@ -16,7 +16,54 @@ Switch setup: [ SW1.ON1:SW1.ON1:SW1.ON1:SW1.ON1:SW1.ON1 ]
Switch setup: [ SW1.ON1:SW1.ON1:SW1.ON1:SW1.ON1:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Sleeve <-> L4.2
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
Switch setup: [ SW1.ON1:SW1.ON1:SW1.ON1:SW1.ON2:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Tip
J2.Sleeve <-> L4.1 <-> L7.1 <-> Level.1
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
L4.2 <-> Level.3
Switch setup: [ SW1.ON1:SW1.ON1:SW1.ON1:SW1.ON2:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Sleeve
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
L4.2 <-> Level.3
Switch setup: [ SW1.ON1:SW1.ON1:SW1.ON2:SW1.ON1:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
@@ -27,136 +74,125 @@ Switch setup: [ SW1.ON1:SW1.ON1:SW1.ON1:SW1.ON1:SW1.ON2 ]
J2.Tip <-> L4.2
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
Switch setup: [ SW1.ON1:SW1.ON1:SW1.ON1:SW1.ON2:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> L4.1 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Tip <-> L4.2
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
Switch setup: [ SW1.ON1:SW1.ON1:SW1.ON1:SW1.ON2:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> L4.1 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Tip <-> L4.2
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
Switch setup: [ SW1.ON1:SW1.ON1:SW1.ON2:SW1.ON1:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Sleeve <-> L4.1 <-> L7.1 <-> Level.1
J2.Tip <-> L7.2
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
Switch setup: [ SW1.ON1:SW1.ON1:SW1.ON2:SW1.ON1:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> R1.1 <-> R1.2 <-> TL072.4
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Sleeve <-> L4.1 <-> L7.1 <-> Level.1
J2.Tip <-> L7.2
J2.Sleeve <-> L4.2
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
Switch setup: [ SW1.ON1:SW1.ON1:SW1.ON2:SW1.ON2:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L4.1 <-> L6.2 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Tip <-> L7.2
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
Switch setup: [ SW1.ON1:SW1.ON1:SW1.ON2:SW1.ON2:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L4.1 <-> L6.2 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Tip <-> L7.2
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
Switch setup: [ SW1.ON1:SW1.ON2:SW1.ON1:SW1.ON1:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Sleeve <-> L4.2
Impedance.2 <-> J2.Tip
J2.Sleeve <-> L4.1 <-> L7.1 <-> Level.1
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
L4.2 <-> Level.3
Switch setup: [ SW1.ON1:SW1.ON1:SW1.ON2:SW1.ON2:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Sleeve
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
L4.2 <-> Level.3
Switch setup: [ SW1.ON1:SW1.ON2:SW1.ON1:SW1.ON1:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> L4.1 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Tip <-> L4.2
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
Switch setup: [ SW1.ON1:SW1.ON2:SW1.ON1:SW1.ON1:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> L4.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Sleeve <-> L4.2
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
Switch setup: [ SW1.ON1:SW1.ON2:SW1.ON1:SW1.ON2:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> L4.2 <-> R1.1 <-> R1.2 <-> TL072.4
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> L4.1 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
Impedance.2 <-> J2.Tip
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
L4.2 <-> Level.3
Switch setup: [ SW1.ON1:SW1.ON2:SW1.ON1:SW1.ON2:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> Impedance.2 <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
L4.2 <-> Level.3
Switch setup: [ SW1.ON1:SW1.ON2:SW1.ON2:SW1.ON1:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> L4.1 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Tip <-> L4.2
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
Switch setup: [ SW1.ON1:SW1.ON2:SW1.ON2:SW1.ON1:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
@@ -166,142 +202,128 @@ Switch setup: [ SW1.ON1:SW1.ON2:SW1.ON1:SW1.ON2:SW1.ON2 ]
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
Switch setup: [ SW1.ON1:SW1.ON2:SW1.ON2:SW1.ON1:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Sleeve <-> L7.2
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
Switch setup: [ SW1.ON1:SW1.ON2:SW1.ON2:SW1.ON1:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Sleeve <-> L7.2
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
Switch setup: [ SW1.ON1:SW1.ON2:SW1.ON2:SW1.ON2:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> L7.2 <-> R1.1 <-> R1.2 <-> TL072.4
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> L4.1 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
Impedance.2 <-> J2.Tip
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
L4.2 <-> Level.3
Switch setup: [ SW1.ON1:SW1.ON2:SW1.ON2:SW1.ON2:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> L7.2 <-> R1.1 <-> R1.2 <-> TL072.4
C2.- <-> C2.- <-> Impedance.2 <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
L4.2 <-> Level.3
Switch setup: [ SW1.ON2:SW1.ON1:SW1.ON1:SW1.ON1:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Tip
J2.Sleeve <-> L4.1 <-> L7.1 <-> Level.1
J2.Tip <-> L7.2
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
L4.2 <-> Level.3
Switch setup: [ SW1.ON2:SW1.ON1:SW1.ON1:SW1.ON1:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Tip
J2.Sleeve <-> L4.1 <-> L7.1 <-> Level.1
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
L4.2 <-> Level.3
J2.Sleeve <-> L7.2
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
Switch setup: [ SW1.ON2:SW1.ON1:SW1.ON1:SW1.ON2:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> L4.1 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Tip
J2.Sleeve <-> L4.1 <-> L7.1 <-> Level.1
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
L4.2 <-> Level.3
L7.2 <-> Level.3
Switch setup: [ SW1.ON2:SW1.ON1:SW1.ON1:SW1.ON2:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> L4.1 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Tip
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
L4.2 <-> Level.3
Impedance.2 <-> J2.Sleeve
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
L7.2 <-> Level.3
Switch setup: [ SW1.ON2:SW1.ON1:SW1.ON2:SW1.ON1:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Tip
J2.Sleeve <-> L4.1 <-> L7.1 <-> Level.1
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
L7.2 <-> Level.3
J2.Tip <-> L7.2
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
Switch setup: [ SW1.ON2:SW1.ON1:SW1.ON2:SW1.ON1:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Sleeve <-> L7.2
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
Switch setup: [ SW1.ON2:SW1.ON1:SW1.ON2:SW1.ON2:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
@@ -313,130 +335,68 @@ Switch setup: [ SW1.ON2:SW1.ON1:SW1.ON2:SW1.ON1:SW1.ON2 ]
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
L7.2 <-> Level.3
Switch setup: [ SW1.ON2:SW1.ON1:SW1.ON2:SW1.ON2:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L4.1 <-> L6.2 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Tip
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
L7.2 <-> Level.3
Switch setup: [ SW1.ON2:SW1.ON1:SW1.ON2:SW1.ON2:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L4.1 <-> L6.2 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Tip
Impedance.2 <-> J2.Sleeve
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
L7.2 <-> Level.3
Switch setup: [ SW1.ON2:SW1.ON2:SW1.ON1:SW1.ON1:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L4.1 <-> L6.2 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Sleeve
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J2.Tip <-> L7.2
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
L4.2 <-> Level.3
Switch setup: [ SW1.ON2:SW1.ON2:SW1.ON1:SW1.ON1:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> L7.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Sleeve
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
L4.2 <-> Level.3
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
Switch setup: [ SW1.ON2:SW1.ON2:SW1.ON1:SW1.ON2:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> Impedance.2 <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L4.1 <-> L6.2 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
Impedance.2 <-> J2.Tip
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
L4.2 <-> Level.3
L7.2 <-> Level.3
Switch setup: [ SW1.ON2:SW1.ON2:SW1.ON1:SW1.ON2:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> Impedance.2 <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L3.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
L4.2 <-> Level.3
Switch setup: [ SW1.ON2:SW1.ON2:SW1.ON2:SW1.ON1:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Sleeve
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
L7.2 <-> Level.3
Switch setup: [ SW1.ON2:SW1.ON2:SW1.ON2:SW1.ON1:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Sleeve
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
L7.2 <-> Level.3
Switch setup: [ SW1.ON2:SW1.ON2:SW1.ON2:SW1.ON2:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> J4.Tip
@@ -448,10 +408,50 @@ Switch setup: [ SW1.ON2:SW1.ON2:SW1.ON2:SW1.ON2:SW1.ON1 ]
J5.Tip <-> L3.1 <-> L6.1 <-> R1.2
L7.2 <-> Level.3
Switch setup: [ SW1.ON2:SW1.ON2:SW1.ON2:SW1.ON1:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L4.1 <-> L6.2 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Tip <-> L7.2
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
Switch setup: [ SW1.ON2:SW1.ON2:SW1.ON2:SW1.ON1:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L6.2 <-> L7.2 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
J2.Tip <-> L4.1 <-> L7.1 <-> Level.1
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
Switch setup: [ SW1.ON2:SW1.ON2:SW1.ON2:SW1.ON2:SW1.ON1 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
C2.+ <-> R1.2 <-> R1.2 <-> R1.2
C2.- <-> C2.- <-> J2.Sleeve <-> J4.Sleeve <-> J5.Sleeve <-> J6.Center <-> L4.1 <-> L6.2 <-> L7.1 <-> Level.1 <-> R1.1 <-> R1.2 <-> TL072.4
Impedance.1 <-> Level.2
Impedance.2 <-> J2.Tip
J4.Tip <-> J5.Tip <-> L3.1 <-> L6.1
L7.2 <-> Level.3
Switch setup: [ SW1.ON2:SW1.ON2:SW1.ON2:SW1.ON2:SW1.ON2 ]
4001.A <-> C2.+ <-> J6.Sleeve
4001.K <-> R1.1 <-> TL072.5
4001.K <-> R1.1 <-> TL072.8
C1.1 <-> R1.1 <-> R1.1
C1.1 <-> R1.1 <-> TL072.3
C1.2 <-> TL072.1 <-> TL072.2
@@ -1,3 +1,12 @@
Switch setup: [ Split.ON1:SW1.Treble ]
Bridge.North Finish <-> Bridge.South Finish
Bridge.North Start <-> Cbleed.1 <-> Volume.3
Bridge.South Start <-> J1.Sleeve <-> Neck.North Finish <-> Volume.1
Cbleed.2 <-> Rbleed.2
J1.Tip <-> Rbleed.1 <-> Volume.2
Neck.North Start <-> Neck.South Start
Switch setup: [ Split.ON1:SW1.Middle ]
Bridge.North Finish <-> Bridge.South Finish
@@ -16,14 +25,12 @@ Switch setup: [ Split.ON1:SW1.Rhythm ]
J1.Tip <-> Rbleed.1 <-> Volume.2
Neck.North Start <-> Neck.South Start
Switch setup: [ Split.ON1:SW1.Treble ]
Switch setup: [ Split.ON2:SW1.Treble ]
Bridge.North Finish <-> Bridge.South Finish
Bridge.North Finish <-> Bridge.South Finish <-> Bridge.South Start <-> J1.Sleeve <-> Neck.North Finish <-> Neck.North Start <-> Neck.South Start <-> Volume.1
Bridge.North Start <-> Cbleed.1 <-> Volume.3
Bridge.South Start <-> J1.Sleeve <-> Neck.North Finish <-> Volume.1
Cbleed.2 <-> Rbleed.2
J1.Tip <-> Rbleed.1 <-> Volume.2
Neck.North Start <-> Neck.South Start
Switch setup: [ Split.ON2:SW1.Middle ]
@@ -39,10 +46,3 @@ Switch setup: [ Split.ON2:SW1.Rhythm ]
Cbleed.2 <-> Rbleed.2
J1.Tip <-> Rbleed.1 <-> Volume.2
Switch setup: [ Split.ON2:SW1.Treble ]
Bridge.North Finish <-> Bridge.South Finish <-> Bridge.South Start <-> J1.Sleeve <-> Neck.North Finish <-> Neck.North Start <-> Neck.South Start <-> Volume.1
Bridge.North Start <-> Cbleed.1 <-> Volume.3
Cbleed.2 <-> Rbleed.2
J1.Tip <-> Rbleed.1 <-> Volume.2
Binary file not shown.

Before

Width:  |  Height:  |  Size: 805 KiB

After

Width:  |  Height:  |  Size: 805 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 268 KiB

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 720 KiB

After

Width:  |  Height:  |  Size: 721 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 506 KiB

After

Width:  |  Height:  |  Size: 506 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 268 KiB

After

Width:  |  Height:  |  Size: 268 KiB

@@ -1,175 +1,3 @@
Switch setup: [ SW1.OFF:SW6.ON1,SW1.ON2:SW6.ON1 ]
.047 uF.1 <-> J1.Tip
.047 uF.2 <-> 1 M.2 <-> R1.2
.1 <-> R2.1
.2 <-> 1 M.1 <-> 1N4007.A <-> BASS-CLEAN.1 <-> BASS-LEAD.1 <-> C1.- <-> C2.1 <-> C20.2 <-> C5.1 <-> C6.1 <-> C6.2 <-> C8.2 <-> CLEAN GAIN.1 <-> CLEAN GAIN.3 <-> D11.K <-> D13.K <-> D2.K <-> D3.A <-> D4.A <-> D5.K <-> D7.K <-> J1.Sleeve <-> J1.Tip Switch <-> LEAD GAIN.1 <-> LEAD GAIN.3 <-> LEAD VOL.1 <-> LEAD VOL.3 <-> MASTER VOL.1 <-> MIDDLE--CLEAN.1 <-> MIDDLE-LEAD.1 <-> R11.1 <-> R12.1 <-> R2.2 <-> R20.2 <-> R21.2 <-> R24.2 <-> R27.2 <-> R3.2 <-> R39.1 <-> R7.1 <-> R8.1 <-> R9.1 <-> RY1.COM2 <-> RY1.NC2 <-> RY1.NO2 <-> RY2.COM2 <-> RY2.NC2 <-> RY2.NO2
.A <-> C31.- <-> R42.2
.K <-> R54.1
1N4007.K <-> C8.1 <-> D7.A <-> R15.2
BASS-CLEAN.2 <-> BASS-CLEAN.3 <-> R29.2
BASS-LEAD.2 <-> BASS-LEAD.3 <-> R28.2
C1.+ <-> C2.2 <-> R3.1 <-> R4.1 <-> V1.8 <-> V1.9
C10.1 <-> C12.2 <-> C15.1 <-> C17.2 <-> R19.1 <-> V2.6
C10.2 <-> DUAL BASS 2--LEAD.3
C11.1 <-> C14.2 <-> R23.2
C11.2 <-> R22.2
C12.1 <-> C13.1 <-> DUAL BASS 2--LEAD.2 <-> R23.1
C13.2 <-> C21.1 <-> TREBLE-LEAD.3
C14.1 <-> MIDDLE-LEAD.2
C15.2 <-> DUAL BASS-CLEAN.3
C16.1 <-> C19.2 <-> R26.2
C16.2 <-> R25.2
C17.1 <-> C18.1 <-> DUAL BASS-CLEAN.2 <-> R26.1
C18.2 <-> C23.1 <-> TREBLE-CLEAN.3
C19.1 <-> MIDDLE--CLEAN.2
C20.1 <-> R22.1 <-> R28.1 <-> TREBLE-LEAD.1
C21.2 <-> MIDDLE-LEAD.3
C22.1 <-> R25.1 <-> R29.1 <-> TREBLE-CLEAN.1
C23.2 <-> MIDDLE--CLEAN.3
C24.1 <-> MASTER VOL.2
C24.2 <-> R30.2
C25.1 <-> R32.2 <-> V3.7
C25.2 <-> R33.2 <-> R38.1 <-> RESONANCE.1
C26.1 <-> R36.2
C26.2 <-> C28.1 <-> R34.1
C27.1 <-> R37.2
C27.2 <-> C28.2 <-> R35.1
C29.1 <-> PRESENCE.2
C29.2 <-> PRESENCE.1
C3.1 <-> R8.2 <-> R9.2
C3.2 <-> C4.2 <-> R5.2 <-> V1.6
C30.+ <-> C31.+ <-> C33.- <-> D10.A <-> D9.A <-> J30.J30Sleeve <-> R43.1 <-> V1.5
C30.- <-> R36.1 <-> R37.1 <-> R42.1 <-> R43.2
C32.+1 <-> R34.2 <-> R35.2 <-> R40.2 <-> R41.2
C32.+2 <-> R41.1 <-> R48.1 <-> V6.6
C32.- <-> J29.J29Sleeve
C33.+1 <-> C33.+2 <-> D6.K <-> D8.K <-> FH2.1
C34.2 <-> C5.2 <-> R6.1 <-> RY1.COM1
C35.1 <-> PRESENCE.3 <-> RESONANCE.2 <-> RESONANCE.3
C4.1 <-> C7.+1 <-> C7.+2 <-> R10.1 <-> R10.2 <-> R18.2 <-> R19.2 <-> R4.2 <-> R40.1 <-> R5.1 <-> R6.2 <-> R7.2 <-> V1.7
C7.- <-> J59.J59Sleeve
C9.1 <-> R18.1
C9.2 <-> R17.1 <-> R20.1 <-> V2.7
CLEAN GAIN.2 <-> RY1.NC1
CP RY.Coil1 <-> D12.K
D1.A <-> D3.K <-> D4.K <-> D5.A
D1.K <-> D2.A
D10.K <-> D6.A
D12.A <-> R39.2
D8.A <-> D9.K
DUAL BASS 2--LEAD.1 <-> R24.1
DUAL BASS-CLEAN.1 <-> R27.1
FEEDBACK (NFB).1 <-> R38.2
FH1.1 <-> IEC1.Neutral
IEC1.Earth <-> J32.J32Sleeve
J36.J36Sleeve <-> J60.Sleeve <-> J61.Sleeve <-> V5.8
J38.J38Sleeve <-> V7.1 <-> V7.8
J60.Tip <-> J61.Tip
LEAD GAIN.2 <-> RY1.NO1
LEAD VOL.2 <-> R16.1
R13.2 <-> R14.1
R14.2 <-> R15.1 <-> R16.2 <-> R17.2
R30.1 <-> R31.1 <-> R32.1 <-> R33.1
R31.2 <-> V3.8
R46.1 <-> R47.1
R46.2 <-> V4.4
R47.2 <-> V5.4
R48.2 <-> V6.4
R50.2 <-> R51.2
R51.1 <-> V4.5
R52.1 <-> V6.5
R52.2 <-> R53.2
RY2.NO1 <-> TREBLE-LEAD.2
V4.3 <-> V5.3
V6.3 <-> V7.3
Switch setup: [ SW1.OFF:SW6.ON2,SW1.ON2:SW6.ON2 ]
.047 uF.1 <-> J1.Tip
.047 uF.2 <-> 1 M.2 <-> R1.2
.1 <-> R2.1
.2 <-> 1 M.1 <-> 1N4007.A <-> BASS-CLEAN.1 <-> BASS-LEAD.1 <-> C1.- <-> C2.1 <-> C20.2 <-> C34.1 <-> C6.1 <-> C6.2 <-> C8.2 <-> CLEAN GAIN.1 <-> CLEAN GAIN.3 <-> D11.K <-> D13.K <-> D2.K <-> D3.A <-> D4.A <-> D5.K <-> D7.K <-> J1.Sleeve <-> J1.Tip Switch <-> LEAD GAIN.1 <-> LEAD GAIN.3 <-> LEAD VOL.1 <-> LEAD VOL.3 <-> MASTER VOL.1 <-> MIDDLE--CLEAN.1 <-> MIDDLE-LEAD.1 <-> R11.1 <-> R12.1 <-> R2.2 <-> R20.2 <-> R21.2 <-> R24.2 <-> R27.2 <-> R3.2 <-> R39.1 <-> R7.1 <-> R8.1 <-> R9.1 <-> RY1.COM2 <-> RY1.NC2 <-> RY1.NO2 <-> RY2.COM2 <-> RY2.NC2 <-> RY2.NO2
.A <-> C31.- <-> R42.2
.K <-> R54.1
1N4007.K <-> C8.1 <-> D7.A <-> R15.2
BASS-CLEAN.2 <-> BASS-CLEAN.3 <-> R29.2
BASS-LEAD.2 <-> BASS-LEAD.3 <-> R28.2
C1.+ <-> C2.2 <-> R3.1 <-> R4.1 <-> V1.8 <-> V1.9
C10.1 <-> C12.2 <-> C15.1 <-> C17.2 <-> R19.1 <-> V2.6
C10.2 <-> DUAL BASS 2--LEAD.3
C11.1 <-> C14.2 <-> R23.2
C11.2 <-> R22.2
C12.1 <-> C13.1 <-> DUAL BASS 2--LEAD.2 <-> R23.1
C13.2 <-> C21.1 <-> TREBLE-LEAD.3
C14.1 <-> MIDDLE-LEAD.2
C15.2 <-> DUAL BASS-CLEAN.3
C16.1 <-> C19.2 <-> R26.2
C16.2 <-> R25.2
C17.1 <-> C18.1 <-> DUAL BASS-CLEAN.2 <-> R26.1
C18.2 <-> C23.1 <-> TREBLE-CLEAN.3
C19.1 <-> MIDDLE--CLEAN.2
C20.1 <-> R22.1 <-> R28.1 <-> TREBLE-LEAD.1
C21.2 <-> MIDDLE-LEAD.3
C22.1 <-> R25.1 <-> R29.1 <-> TREBLE-CLEAN.1
C23.2 <-> MIDDLE--CLEAN.3
C24.1 <-> MASTER VOL.2
C24.2 <-> R30.2
C25.1 <-> R32.2 <-> V3.7
C25.2 <-> R33.2 <-> R38.1 <-> RESONANCE.1
C26.1 <-> R36.2
C26.2 <-> C28.1 <-> R34.1
C27.1 <-> R37.2
C27.2 <-> C28.2 <-> R35.1
C29.1 <-> PRESENCE.2
C29.2 <-> PRESENCE.1
C3.1 <-> R8.2 <-> R9.2
C3.2 <-> C4.2 <-> R5.2 <-> V1.6
C30.+ <-> C31.+ <-> C33.- <-> D10.A <-> D9.A <-> J30.J30Sleeve <-> R43.1 <-> V1.5
C30.- <-> R36.1 <-> R37.1 <-> R42.1 <-> R43.2
C32.+1 <-> R34.2 <-> R35.2 <-> R40.2 <-> R41.2
C32.+2 <-> R41.1 <-> R48.1 <-> V6.6
C32.- <-> J29.J29Sleeve
C33.+1 <-> C33.+2 <-> D6.K <-> D8.K <-> FH2.1
C34.2 <-> C5.2 <-> R6.1 <-> RY1.COM1
C35.1 <-> PRESENCE.3 <-> RESONANCE.2 <-> RESONANCE.3
C4.1 <-> C7.+1 <-> C7.+2 <-> R10.1 <-> R10.2 <-> R18.2 <-> R19.2 <-> R4.2 <-> R40.1 <-> R5.1 <-> R6.2 <-> R7.2 <-> V1.7
C7.- <-> J59.J59Sleeve
C9.1 <-> R18.1
C9.2 <-> R17.1 <-> R20.1 <-> V2.7
CLEAN GAIN.2 <-> RY1.NC1
CP RY.Coil1 <-> D12.K
D1.A <-> D3.K <-> D4.K <-> D5.A
D1.K <-> D2.A
D10.K <-> D6.A
D12.A <-> R39.2
D8.A <-> D9.K
DUAL BASS 2--LEAD.1 <-> R24.1
DUAL BASS-CLEAN.1 <-> R27.1
FEEDBACK (NFB).1 <-> R38.2
FH1.1 <-> IEC1.Neutral
IEC1.Earth <-> J32.J32Sleeve
J36.J36Sleeve <-> J60.Sleeve <-> J61.Sleeve <-> V5.8
J38.J38Sleeve <-> V7.1 <-> V7.8
J60.Tip <-> J61.Tip
LEAD GAIN.2 <-> RY1.NO1
LEAD VOL.2 <-> R16.1
R13.2 <-> R14.1
R14.2 <-> R15.1 <-> R16.2 <-> R17.2
R30.1 <-> R31.1 <-> R32.1 <-> R33.1
R31.2 <-> V3.8
R46.1 <-> R47.1
R46.2 <-> V4.4
R47.2 <-> V5.4
R48.2 <-> V6.4
R50.2 <-> R51.2
R51.1 <-> V4.5
R52.1 <-> V6.5
R52.2 <-> R53.2
RY2.NO1 <-> TREBLE-LEAD.2
V4.3 <-> V5.3
V6.3 <-> V7.3
Switch setup: [ SW1.ON1:SW6.ON1 ]
.047 uF.1 <-> J1.Tip
@@ -340,3 +168,175 @@ Switch setup: [ SW1.ON1:SW6.ON2 ]
V4.3 <-> V5.3
V6.3 <-> V7.3
Switch setup: [ SW1.OFF:SW6.ON1, SW1.ON2:SW6.ON1 ]
.047 uF.1 <-> J1.Tip
.047 uF.2 <-> 1 M.2 <-> R1.2
.1 <-> R2.1
.2 <-> 1 M.1 <-> 1N4007.A <-> BASS-CLEAN.1 <-> BASS-LEAD.1 <-> C1.- <-> C2.1 <-> C20.2 <-> C5.1 <-> C6.1 <-> C6.2 <-> C8.2 <-> CLEAN GAIN.1 <-> CLEAN GAIN.3 <-> D11.K <-> D13.K <-> D2.K <-> D3.A <-> D4.A <-> D5.K <-> D7.K <-> J1.Sleeve <-> J1.Tip Switch <-> LEAD GAIN.1 <-> LEAD GAIN.3 <-> LEAD VOL.1 <-> LEAD VOL.3 <-> MASTER VOL.1 <-> MIDDLE--CLEAN.1 <-> MIDDLE-LEAD.1 <-> R11.1 <-> R12.1 <-> R2.2 <-> R20.2 <-> R21.2 <-> R24.2 <-> R27.2 <-> R3.2 <-> R39.1 <-> R7.1 <-> R8.1 <-> R9.1 <-> RY1.COM2 <-> RY1.NC2 <-> RY1.NO2 <-> RY2.COM2 <-> RY2.NC2 <-> RY2.NO2
.A <-> C31.- <-> R42.2
.K <-> R54.1
1N4007.K <-> C8.1 <-> D7.A <-> R15.2
BASS-CLEAN.2 <-> BASS-CLEAN.3 <-> R29.2
BASS-LEAD.2 <-> BASS-LEAD.3 <-> R28.2
C1.+ <-> C2.2 <-> R3.1 <-> R4.1 <-> V1.8 <-> V1.9
C10.1 <-> C12.2 <-> C15.1 <-> C17.2 <-> R19.1 <-> V2.6
C10.2 <-> DUAL BASS 2--LEAD.3
C11.1 <-> C14.2 <-> R23.2
C11.2 <-> R22.2
C12.1 <-> C13.1 <-> DUAL BASS 2--LEAD.2 <-> R23.1
C13.2 <-> C21.1 <-> TREBLE-LEAD.3
C14.1 <-> MIDDLE-LEAD.2
C15.2 <-> DUAL BASS-CLEAN.3
C16.1 <-> C19.2 <-> R26.2
C16.2 <-> R25.2
C17.1 <-> C18.1 <-> DUAL BASS-CLEAN.2 <-> R26.1
C18.2 <-> C23.1 <-> TREBLE-CLEAN.3
C19.1 <-> MIDDLE--CLEAN.2
C20.1 <-> R22.1 <-> R28.1 <-> TREBLE-LEAD.1
C21.2 <-> MIDDLE-LEAD.3
C22.1 <-> R25.1 <-> R29.1 <-> TREBLE-CLEAN.1
C23.2 <-> MIDDLE--CLEAN.3
C24.1 <-> MASTER VOL.2
C24.2 <-> R30.2
C25.1 <-> R32.2 <-> V3.7
C25.2 <-> R33.2 <-> R38.1 <-> RESONANCE.1
C26.1 <-> R36.2
C26.2 <-> C28.1 <-> R34.1
C27.1 <-> R37.2
C27.2 <-> C28.2 <-> R35.1
C29.1 <-> PRESENCE.2
C29.2 <-> PRESENCE.1
C3.1 <-> R8.2 <-> R9.2
C3.2 <-> C4.2 <-> R5.2 <-> V1.6
C30.+ <-> C31.+ <-> C33.- <-> D10.A <-> D9.A <-> J30.J30Sleeve <-> R43.1 <-> V1.5
C30.- <-> R36.1 <-> R37.1 <-> R42.1 <-> R43.2
C32.+1 <-> R34.2 <-> R35.2 <-> R40.2 <-> R41.2
C32.+2 <-> R41.1 <-> R48.1 <-> V6.6
C32.- <-> J29.J29Sleeve
C33.+1 <-> C33.+2 <-> D6.K <-> D8.K <-> FH2.1
C34.2 <-> C5.2 <-> R6.1 <-> RY1.COM1
C35.1 <-> PRESENCE.3 <-> RESONANCE.2 <-> RESONANCE.3
C4.1 <-> C7.+1 <-> C7.+2 <-> R10.1 <-> R10.2 <-> R18.2 <-> R19.2 <-> R4.2 <-> R40.1 <-> R5.1 <-> R6.2 <-> R7.2 <-> V1.7
C7.- <-> J59.J59Sleeve
C9.1 <-> R18.1
C9.2 <-> R17.1 <-> R20.1 <-> V2.7
CLEAN GAIN.2 <-> RY1.NC1
CP RY.Coil1 <-> D12.K
D1.A <-> D3.K <-> D4.K <-> D5.A
D1.K <-> D2.A
D10.K <-> D6.A
D12.A <-> R39.2
D8.A <-> D9.K
DUAL BASS 2--LEAD.1 <-> R24.1
DUAL BASS-CLEAN.1 <-> R27.1
FEEDBACK (NFB).1 <-> R38.2
FH1.1 <-> IEC1.Neutral
IEC1.Earth <-> J32.J32Sleeve
J36.J36Sleeve <-> J60.Sleeve <-> J61.Sleeve <-> V5.8
J38.J38Sleeve <-> V7.1 <-> V7.8
J60.Tip <-> J61.Tip
LEAD GAIN.2 <-> RY1.NO1
LEAD VOL.2 <-> R16.1
R13.2 <-> R14.1
R14.2 <-> R15.1 <-> R16.2 <-> R17.2
R30.1 <-> R31.1 <-> R32.1 <-> R33.1
R31.2 <-> V3.8
R46.1 <-> R47.1
R46.2 <-> V4.4
R47.2 <-> V5.4
R48.2 <-> V6.4
R50.2 <-> R51.2
R51.1 <-> V4.5
R52.1 <-> V6.5
R52.2 <-> R53.2
RY2.NO1 <-> TREBLE-LEAD.2
V4.3 <-> V5.3
V6.3 <-> V7.3
Switch setup: [ SW1.OFF:SW6.ON2, SW1.ON2:SW6.ON2 ]
.047 uF.1 <-> J1.Tip
.047 uF.2 <-> 1 M.2 <-> R1.2
.1 <-> R2.1
.2 <-> 1 M.1 <-> 1N4007.A <-> BASS-CLEAN.1 <-> BASS-LEAD.1 <-> C1.- <-> C2.1 <-> C20.2 <-> C34.1 <-> C6.1 <-> C6.2 <-> C8.2 <-> CLEAN GAIN.1 <-> CLEAN GAIN.3 <-> D11.K <-> D13.K <-> D2.K <-> D3.A <-> D4.A <-> D5.K <-> D7.K <-> J1.Sleeve <-> J1.Tip Switch <-> LEAD GAIN.1 <-> LEAD GAIN.3 <-> LEAD VOL.1 <-> LEAD VOL.3 <-> MASTER VOL.1 <-> MIDDLE--CLEAN.1 <-> MIDDLE-LEAD.1 <-> R11.1 <-> R12.1 <-> R2.2 <-> R20.2 <-> R21.2 <-> R24.2 <-> R27.2 <-> R3.2 <-> R39.1 <-> R7.1 <-> R8.1 <-> R9.1 <-> RY1.COM2 <-> RY1.NC2 <-> RY1.NO2 <-> RY2.COM2 <-> RY2.NC2 <-> RY2.NO2
.A <-> C31.- <-> R42.2
.K <-> R54.1
1N4007.K <-> C8.1 <-> D7.A <-> R15.2
BASS-CLEAN.2 <-> BASS-CLEAN.3 <-> R29.2
BASS-LEAD.2 <-> BASS-LEAD.3 <-> R28.2
C1.+ <-> C2.2 <-> R3.1 <-> R4.1 <-> V1.8 <-> V1.9
C10.1 <-> C12.2 <-> C15.1 <-> C17.2 <-> R19.1 <-> V2.6
C10.2 <-> DUAL BASS 2--LEAD.3
C11.1 <-> C14.2 <-> R23.2
C11.2 <-> R22.2
C12.1 <-> C13.1 <-> DUAL BASS 2--LEAD.2 <-> R23.1
C13.2 <-> C21.1 <-> TREBLE-LEAD.3
C14.1 <-> MIDDLE-LEAD.2
C15.2 <-> DUAL BASS-CLEAN.3
C16.1 <-> C19.2 <-> R26.2
C16.2 <-> R25.2
C17.1 <-> C18.1 <-> DUAL BASS-CLEAN.2 <-> R26.1
C18.2 <-> C23.1 <-> TREBLE-CLEAN.3
C19.1 <-> MIDDLE--CLEAN.2
C20.1 <-> R22.1 <-> R28.1 <-> TREBLE-LEAD.1
C21.2 <-> MIDDLE-LEAD.3
C22.1 <-> R25.1 <-> R29.1 <-> TREBLE-CLEAN.1
C23.2 <-> MIDDLE--CLEAN.3
C24.1 <-> MASTER VOL.2
C24.2 <-> R30.2
C25.1 <-> R32.2 <-> V3.7
C25.2 <-> R33.2 <-> R38.1 <-> RESONANCE.1
C26.1 <-> R36.2
C26.2 <-> C28.1 <-> R34.1
C27.1 <-> R37.2
C27.2 <-> C28.2 <-> R35.1
C29.1 <-> PRESENCE.2
C29.2 <-> PRESENCE.1
C3.1 <-> R8.2 <-> R9.2
C3.2 <-> C4.2 <-> R5.2 <-> V1.6
C30.+ <-> C31.+ <-> C33.- <-> D10.A <-> D9.A <-> J30.J30Sleeve <-> R43.1 <-> V1.5
C30.- <-> R36.1 <-> R37.1 <-> R42.1 <-> R43.2
C32.+1 <-> R34.2 <-> R35.2 <-> R40.2 <-> R41.2
C32.+2 <-> R41.1 <-> R48.1 <-> V6.6
C32.- <-> J29.J29Sleeve
C33.+1 <-> C33.+2 <-> D6.K <-> D8.K <-> FH2.1
C34.2 <-> C5.2 <-> R6.1 <-> RY1.COM1
C35.1 <-> PRESENCE.3 <-> RESONANCE.2 <-> RESONANCE.3
C4.1 <-> C7.+1 <-> C7.+2 <-> R10.1 <-> R10.2 <-> R18.2 <-> R19.2 <-> R4.2 <-> R40.1 <-> R5.1 <-> R6.2 <-> R7.2 <-> V1.7
C7.- <-> J59.J59Sleeve
C9.1 <-> R18.1
C9.2 <-> R17.1 <-> R20.1 <-> V2.7
CLEAN GAIN.2 <-> RY1.NC1
CP RY.Coil1 <-> D12.K
D1.A <-> D3.K <-> D4.K <-> D5.A
D1.K <-> D2.A
D10.K <-> D6.A
D12.A <-> R39.2
D8.A <-> D9.K
DUAL BASS 2--LEAD.1 <-> R24.1
DUAL BASS-CLEAN.1 <-> R27.1
FEEDBACK (NFB).1 <-> R38.2
FH1.1 <-> IEC1.Neutral
IEC1.Earth <-> J32.J32Sleeve
J36.J36Sleeve <-> J60.Sleeve <-> J61.Sleeve <-> V5.8
J38.J38Sleeve <-> V7.1 <-> V7.8
J60.Tip <-> J61.Tip
LEAD GAIN.2 <-> RY1.NO1
LEAD VOL.2 <-> R16.1
R13.2 <-> R14.1
R14.2 <-> R15.1 <-> R16.2 <-> R17.2
R30.1 <-> R31.1 <-> R32.1 <-> R33.1
R31.2 <-> V3.8
R46.1 <-> R47.1
R46.2 <-> V4.4
R47.2 <-> V5.4
R48.2 <-> V6.4
R50.2 <-> R51.2
R51.1 <-> V4.5
R52.1 <-> V6.5
R52.2 <-> R53.2
RY2.NO1 <-> TREBLE-LEAD.2
V4.3 <-> V5.3
V6.3 <-> V7.3
@@ -13,7 +13,7 @@ Switch setup: [ ALL ]
100k.1 <-> 150p.1
100k.2 <-> 100k.2 <-> 22u 450v.+ <-> 470k.2 <-> 470k.2 <-> 47k.2 <-> 4k7.1 <-> 4k7.2 <-> 820.2
100u 100v.+ <-> 270 3W.1
10k 2W.1 <-> 1k 2w.2 <-> 1k 2W.2 <-> L2.1
10k 2W.1 <-> 1k 2W.2 <-> 1k 2w.2 <-> L2.1
1k5.2 <-> 1k5.2
D1.K <-> D3.A
D2.K <-> D4.A
@@ -13,7 +13,7 @@ Switch setup: [ ALL ]
100k.1 <-> 150p.1
100k.2 <-> 100k.2 <-> 22u 450v.+ <-> 470k.2 <-> 470k.2 <-> 47k.2 <-> 4k7.1 <-> 4k7.2 <-> 820.2
100u 100v.+ <-> 270 3W.1
10k 2W.1 <-> 1k 2w.2 <-> 1k 2W.2 <-> L2.1
10k 2W.1 <-> 1k 2W.2 <-> 1k 2w.2 <-> L2.1
1k5.2 <-> 1k5.2
D1.K <-> D3.A
D2.K <-> D4.A
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 MiB

After

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 KiB

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 MiB

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 MiB

After

Width:  |  Height:  |  Size: 13 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 358 KiB

After

Width:  |  Height:  |  Size: 358 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 KiB

After

Width:  |  Height:  |  Size: 862 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 KiB

After

Width:  |  Height:  |  Size: 314 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 MiB

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 351 KiB

After

Width:  |  Height:  |  Size: 351 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 582 KiB

After

Width:  |  Height:  |  Size: 582 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 KiB

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 266 KiB

After

Width:  |  Height:  |  Size: 266 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 KiB

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 KiB

After

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 KiB

After

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 308 KiB

After

Width:  |  Height:  |  Size: 308 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 318 KiB

After

Width:  |  Height:  |  Size: 319 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 141 KiB

@@ -0,0 +1,102 @@
OK,Failed,Total Time,Avg Time
38,59,278979,2876
File,Status,Message,Time
12v_supply.diy,OK,,3351
211.diy,FAILED,Images do not match!,1890
255.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,3323
2555X BOARD LAYOUT RESaddTSRELAYnew.diy,FAILED,Images do not match!;Netlists do not match with switches,18596
259.diy,FAILED,Images do not match!,3580
291.diy,OK,,998
315.diy,OK,,4401
331.diy,FAILED,Images do not match!,1607
360.diy,OK,,498
367.diy,FAILED,Images do not match!,3097
374.diy,FAILED,Images do not match!,2103
414.diy,OK,,490
419.diy,FAILED,Images do not match!,2224
448.diy,OK,,1509
451.diy,FAILED,Images do not match!,5089
480.diy,OK,,893
523.diy,OK,,1088
537.diy,FAILED,Images do not match!,1706
543.diy,FAILED,Images do not match!,1238
546.diy,OK,,283
548.diy,OK,,1104
560.diy,OK,,1155
562.diy,FAILED,Netlists do not match with switches,2258
565.diy,OK,,1002
578.diy,FAILED,Images do not match!,3484
580.diy,FAILED,Images do not match!,3701
581.diy,FAILED,Images do not match!,10362
606.diy,FAILED,Images do not match!,2130
610.diy,OK,,1311
614.diy,OK,,982
6Y6 Express 2.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,2895
801.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,450
9V_supply_regulated.diy,FAILED,Images do not match!,2301
ALU board with interface.diy,OK,,1149
AllTube Schem.diy,OK,,4021
Blue 7.diy,OK,,257
BrownfaceReverb Schematic 2.diy,OK,,1449
Bus decoder board (RL,Z2,Z1,Z0).diy,FAILED,Images do not match!,4038
DR18Tagstrip.diy,FAILED,Images do not match!,7686
Deluxe_Micro_EF80_Layout.diy,FAILED,Images do not match!,4101
Fender_Bassman_5F6_5F6A.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,544
IIc+.diy,FAILED,Images do not match!,2567
Ibanez Balance-Master Mod.diy,OK,,991
LM386 Voltage Converter.diy,FAILED,Images do not match!,1709
LargeBandMaster.diy,FAILED,Images do not match!,50814
Lectrolab schematic.diy,OK,,2194
PCF DI Cable Diagram.diy,OK,,1320
ProTremoVerb Schematic.diy,OK,,2041
RAM board 2.diy,FAILED,Images do not match!,6668
RR2104_Master_Volume_6V6_Schematic.diy,OK,,878
Radio Amp Noval.diy,FAILED,Images do not match!,2495
Register board (LSB).diy,FAILED,Images do not match!,3256
Rix 18 watt.diy,OK,,247
Rix AC15 Xlite.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,202
Rix Baby Blue.diy,OK,,256
Rix Bassman.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,1838
Rix JD stout.diy,FAILED,Netlists do not match with switches;Netlists do not match without switches,210
Rix Junior AB763.diy,OK,,696
Rix Junior.diy,OK,,242
Rix Plexi 6V6.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,368
Rix Pro Jr.diy,OK,,235
Silvertone 1484 v6f.diy,FAILED,Images do not match!,16076
Stack Pointer board.diy,FAILED,Images do not match!,3606
Synth Oscllator_v1.diy,FAILED,Images do not match!,3241
Thunderbolt Mk3.diy,OK,,233
antiquity_fuzz.diy,FAILED,Images do not match!,1833
b_blender.diy,FAILED,Images do not match!,1749
bixonix_expandora.diy,FAILED,Images do not match!,2173
dallas_rangemaster_pcb.diy,FAILED,Images do not match!,2082
deacy.diy,FAILED,Images do not match!,527
dist_layout.diy,FAILED,Images do not match!,2051
dyna_comp_perf.diy,FAILED,Images do not match!,2149
eh_octave_multiplexer.diy,FAILED,Images do not match!,1875
fetzer_ruby.diy,FAILED,Images do not match!,1795
fetzer_valve.diy,FAILED,Images do not match!,1934
fetzer_valve_deluxe_2.diy,FAILED,Images do not match!,4194
fetzer_valve_deluxe_perf.diy,FAILED,Images do not match!,2301
flexi_clip.diy,FAILED,Images do not match!,2916
ga5t_preamp.diy,FAILED,Images do not match!,2591
jfet boost.diy,OK,,56
lp switch + pots.diy,FAILED,Netlists do not match with switches,1232
lxh2_marshall_amp_sim.diy,FAILED,Images do not match!,2460
orange_treble_bass_booster_2.diy,FAILED,Images do not match!,2055
puzzle87_comp.diy,FAILED,Images do not match!,2224
rangemaster.diy,FAILED,Images do not match!,344
roger_mayer_octavia_vero.diy,FAILED,Images do not match!,1839
ruby.diy,FAILED,Images do not match!,360
shaka_hv.diy,FAILED,Images do not match!,2100
signal_gen.diy,FAILED,Images do not match!,1743
slo2.diy,FAILED,Images do not match!,5183
soapdodger2.diy,FAILED,Images do not match!,3172
splitter2.diy,FAILED,Images do not match!;Netlists do not match with switches;Netlists do not match without switches,2225
standard strat.diy,OK,,1619
tda1521a-2.diy,FAILED,Images do not match!,879
timmy7.diy,FAILED,Images do not match!,1942
travelcaster3 (new format).diy,FAILED,Netlists do not match with switches,392
wah2.diy,FAILED,Images do not match!,2257
1 OK,Failed,Total Time,Avg Time
2 38,59,278979,2876
3 File,Status,Message,Time
4 12v_supply.diy,OK,,3351
5 211.diy,FAILED,Images do not match!,1890
6 255.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,3323
7 2555X BOARD LAYOUT RESaddTSRELAYnew.diy,FAILED,Images do not match!;Netlists do not match with switches,18596
8 259.diy,FAILED,Images do not match!,3580
9 291.diy,OK,,998
10 315.diy,OK,,4401
11 331.diy,FAILED,Images do not match!,1607
12 360.diy,OK,,498
13 367.diy,FAILED,Images do not match!,3097
14 374.diy,FAILED,Images do not match!,2103
15 414.diy,OK,,490
16 419.diy,FAILED,Images do not match!,2224
17 448.diy,OK,,1509
18 451.diy,FAILED,Images do not match!,5089
19 480.diy,OK,,893
20 523.diy,OK,,1088
21 537.diy,FAILED,Images do not match!,1706
22 543.diy,FAILED,Images do not match!,1238
23 546.diy,OK,,283
24 548.diy,OK,,1104
25 560.diy,OK,,1155
26 562.diy,FAILED,Netlists do not match with switches,2258
27 565.diy,OK,,1002
28 578.diy,FAILED,Images do not match!,3484
29 580.diy,FAILED,Images do not match!,3701
30 581.diy,FAILED,Images do not match!,10362
31 606.diy,FAILED,Images do not match!,2130
32 610.diy,OK,,1311
33 614.diy,OK,,982
34 6Y6 Express 2.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,2895
35 801.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,450
36 9V_supply_regulated.diy,FAILED,Images do not match!,2301
37 ALU board with interface.diy,OK,,1149
38 AllTube Schem.diy,OK,,4021
39 Blue 7.diy,OK,,257
40 BrownfaceReverb Schematic 2.diy,OK,,1449
41 Bus decoder board (RL,Z2,Z1,Z0).diy,FAILED,Images do not match!,4038
42 DR18Tagstrip.diy,FAILED,Images do not match!,7686
43 Deluxe_Micro_EF80_Layout.diy,FAILED,Images do not match!,4101
44 Fender_Bassman_5F6_5F6A.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,544
45 IIc+.diy,FAILED,Images do not match!,2567
46 Ibanez Balance-Master Mod.diy,OK,,991
47 LM386 Voltage Converter.diy,FAILED,Images do not match!,1709
48 LargeBandMaster.diy,FAILED,Images do not match!,50814
49 Lectrolab schematic.diy,OK,,2194
50 PCF DI Cable Diagram.diy,OK,,1320
51 ProTremoVerb Schematic.diy,OK,,2041
52 RAM board 2.diy,FAILED,Images do not match!,6668
53 RR2104_Master_Volume_6V6_Schematic.diy,OK,,878
54 Radio Amp Noval.diy,FAILED,Images do not match!,2495
55 Register board (LSB).diy,FAILED,Images do not match!,3256
56 Rix 18 watt.diy,OK,,247
57 Rix AC15 Xlite.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,202
58 Rix Baby Blue.diy,OK,,256
59 Rix Bassman.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,1838
60 Rix JD stout.diy,FAILED,Netlists do not match with switches;Netlists do not match without switches,210
61 Rix Junior AB763.diy,OK,,696
62 Rix Junior.diy,OK,,242
63 Rix Plexi 6V6.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,368
64 Rix Pro Jr.diy,OK,,235
65 Silvertone 1484 v6f.diy,FAILED,Images do not match!,16076
66 Stack Pointer board.diy,FAILED,Images do not match!,3606
67 Synth Oscllator_v1.diy,FAILED,Images do not match!,3241
68 Thunderbolt Mk3.diy,OK,,233
69 antiquity_fuzz.diy,FAILED,Images do not match!,1833
70 b_blender.diy,FAILED,Images do not match!,1749
71 bixonix_expandora.diy,FAILED,Images do not match!,2173
72 dallas_rangemaster_pcb.diy,FAILED,Images do not match!,2082
73 deacy.diy,FAILED,Images do not match!,527
74 dist_layout.diy,FAILED,Images do not match!,2051
75 dyna_comp_perf.diy,FAILED,Images do not match!,2149
76 eh_octave_multiplexer.diy,FAILED,Images do not match!,1875
77 fetzer_ruby.diy,FAILED,Images do not match!,1795
78 fetzer_valve.diy,FAILED,Images do not match!,1934
79 fetzer_valve_deluxe_2.diy,FAILED,Images do not match!,4194
80 fetzer_valve_deluxe_perf.diy,FAILED,Images do not match!,2301
81 flexi_clip.diy,FAILED,Images do not match!,2916
82 ga5t_preamp.diy,FAILED,Images do not match!,2591
83 jfet boost.diy,OK,,56
84 lp switch + pots.diy,FAILED,Netlists do not match with switches,1232
85 lxh2_marshall_amp_sim.diy,FAILED,Images do not match!,2460
86 orange_treble_bass_booster_2.diy,FAILED,Images do not match!,2055
87 puzzle87_comp.diy,FAILED,Images do not match!,2224
88 rangemaster.diy,FAILED,Images do not match!,344
89 roger_mayer_octavia_vero.diy,FAILED,Images do not match!,1839
90 ruby.diy,FAILED,Images do not match!,360
91 shaka_hv.diy,FAILED,Images do not match!,2100
92 signal_gen.diy,FAILED,Images do not match!,1743
93 slo2.diy,FAILED,Images do not match!,5183
94 soapdodger2.diy,FAILED,Images do not match!,3172
95 splitter2.diy,FAILED,Images do not match!;Netlists do not match with switches;Netlists do not match without switches,2225
96 standard strat.diy,OK,,1619
97 tda1521a-2.diy,FAILED,Images do not match!,879
98 timmy7.diy,FAILED,Images do not match!,1942
99 travelcaster3 (new format).diy,FAILED,Netlists do not match with switches,392
100 wah2.diy,FAILED,Images do not match!,2257
@@ -0,0 +1,102 @@
OK,Failed,Total Time,Avg Time
97,0,166731,1718
File,Status,Message,Time
12v_supply.diy,OK,,3536
211.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,1793
255.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,4205
2555X BOARD LAYOUT RESaddTSRELAYnew.diy,OK,,6859
259.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,2890
291.diy,OK,,1282
315.diy,OK,,4164
331.diy,OK,,896
360.diy,OK,,668
367.diy,OK,,1104
374.diy,OK,,1980
414.diy,OK,,486
419.diy,OK,,1433
448.diy,OK,,3171
451.diy,OK,,2006
480.diy,OK,,994
523.diy,OK,,960
537.diy,OK,,963
543.diy,OK,,892
546.diy,OK,,338
548.diy,OK,,1017
560.diy,OK,,1216
562.diy,OK,,1746
565.diy,OK,,1049
578.diy,OK,,2598
580.diy,OK,,1719
581.diy,OK,,4322
606.diy,OK,,1386
610.diy,OK,,1561
614.diy,OK,,1179
6Y6 Express 2.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,3103
801.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,678
9V_supply_regulated.diy,OK,<html>File was opened, but there were some issues with it:<br><br>Could not recognize component type Transformer<br></html,2332
ALU board with interface.diy,OK,,1288
AllTube Schem.diy,OK,,2148
Blue 7.diy,OK,,202
BrownfaceReverb Schematic 2.diy,OK,,1385
Bus decoder board (RL,Z2,Z1,Z0).diy,OK,,1452
DR18Tagstrip.diy,OK,,2783
Deluxe_Micro_EF80_Layout.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,1274
Fender_Bassman_5F6_5F6A.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,588
IIc+.diy,OK,,1639
Ibanez Balance-Master Mod.diy,OK,,1395
LM386 Voltage Converter.diy,OK,,888
LargeBandMaster.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,14763
Lectrolab schematic.diy,OK,,1388
PCF DI Cable Diagram.diy,OK,,895
ProTremoVerb Schematic.diy,OK,,2463
RAM board 2.diy,OK,,3320
RR2104_Master_Volume_6V6_Schematic.diy,OK,,1574
Radio Amp Noval.diy,OK,,1871
Register board (LSB).diy,OK,,1097
Rix 18 watt.diy,OK,,273
Rix AC15 Xlite.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,383
Rix Baby Blue.diy,OK,,266
Rix Bassman.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,889
Rix JD stout.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,249
Rix Junior AB763.diy,OK,,295
Rix Junior.diy,OK,,301
Rix Plexi 6V6.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,459
Rix Pro Jr.diy,OK,,475
Silvertone 1484 v6f.diy,OK,,5147
Stack Pointer board.diy,OK,,1385
Synth Oscllator_v1.diy,OK,,4212
Thunderbolt Mk3.diy,OK,,289
antiquity_fuzz.diy,OK,,1113
b_blender.diy,OK,<html>File was opened, but there were some issues with it:<br><br>Could not recognize component type Jack<br></html,1346
bixonix_expandora.diy,OK,,1136
dallas_rangemaster_pcb.diy,OK,,1415
deacy.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,445
dist_layout.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,1192
dyna_comp_perf.diy,OK,,1117
eh_octave_multiplexer.diy,OK,,1344
fetzer_ruby.diy,OK,,1757
fetzer_valve.diy,OK,,1914
fetzer_valve_deluxe_2.diy,OK,,1194
fetzer_valve_deluxe_perf.diy,OK,,1290
flexi_clip.diy,OK,<html>File was opened, but there were some issues with it:<br><br>Unsupported toggle switch dimensions<br></html,1714
ga5t_preamp.diy,OK,,1100
jfet boost.diy,OK,,59
lp switch + pots.diy,OK,,2001
lxh2_marshall_amp_sim.diy,OK,,1296
orange_treble_bass_booster_2.diy,OK,<html>File was opened, but there were some issues with it:<br><br>Could not recognize component type Jack<br></html,1646
puzzle87_comp.diy,OK,<html>File was opened, but there were some issues with it:<br><br>Could not recognize component type Jack<br></html,1186
rangemaster.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,134
roger_mayer_octavia_vero.diy,OK,,1024
ruby.diy,OK,,267
shaka_hv.diy,OK,,1461
signal_gen.diy,OK,<html>File was opened, but there were some issues with it:<br><br>Could not recognize component type Jack<br></html,1151
slo2.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,3912
soapdodger2.diy,OK,<html>File was opened, but there were some issues with it:<br><br>Could not recognize component type Jack<br></html,3460
splitter2.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,2201
standard strat.diy,OK,,3600
tda1521a-2.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,629
timmy7.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,1049
travelcaster3 (new format).diy,OK,,632
wah2.diy,OK,,1384
1 OK,Failed,Total Time,Avg Time
2 97,0,166731,1718
3 File,Status,Message,Time
4 12v_supply.diy,OK,,3536
5 211.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,1793
6 255.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,4205
7 2555X BOARD LAYOUT RESaddTSRELAYnew.diy,OK,,6859
8 259.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,2890
9 291.diy,OK,,1282
10 315.diy,OK,,4164
11 331.diy,OK,,896
12 360.diy,OK,,668
13 367.diy,OK,,1104
14 374.diy,OK,,1980
15 414.diy,OK,,486
16 419.diy,OK,,1433
17 448.diy,OK,,3171
18 451.diy,OK,,2006
19 480.diy,OK,,994
20 523.diy,OK,,960
21 537.diy,OK,,963
22 543.diy,OK,,892
23 546.diy,OK,,338
24 548.diy,OK,,1017
25 560.diy,OK,,1216
26 562.diy,OK,,1746
27 565.diy,OK,,1049
28 578.diy,OK,,2598
29 580.diy,OK,,1719
30 581.diy,OK,,4322
31 606.diy,OK,,1386
32 610.diy,OK,,1561
33 614.diy,OK,,1179
34 6Y6 Express 2.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,3103
35 801.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,678
36 9V_supply_regulated.diy,OK,<html>File was opened, but there were some issues with it:<br><br>Could not recognize component type Transformer<br></html,2332
37 ALU board with interface.diy,OK,,1288
38 AllTube Schem.diy,OK,,2148
39 Blue 7.diy,OK,,202
40 BrownfaceReverb Schematic 2.diy,OK,,1385
41 Bus decoder board (RL,Z2,Z1,Z0).diy,OK,,1452
42 DR18Tagstrip.diy,OK,,2783
43 Deluxe_Micro_EF80_Layout.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,1274
44 Fender_Bassman_5F6_5F6A.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,588
45 IIc+.diy,OK,,1639
46 Ibanez Balance-Master Mod.diy,OK,,1395
47 LM386 Voltage Converter.diy,OK,,888
48 LargeBandMaster.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,14763
49 Lectrolab schematic.diy,OK,,1388
50 PCF DI Cable Diagram.diy,OK,,895
51 ProTremoVerb Schematic.diy,OK,,2463
52 RAM board 2.diy,OK,,3320
53 RR2104_Master_Volume_6V6_Schematic.diy,OK,,1574
54 Radio Amp Noval.diy,OK,,1871
55 Register board (LSB).diy,OK,,1097
56 Rix 18 watt.diy,OK,,273
57 Rix AC15 Xlite.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,383
58 Rix Baby Blue.diy,OK,,266
59 Rix Bassman.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,889
60 Rix JD stout.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,249
61 Rix Junior AB763.diy,OK,,295
62 Rix Junior.diy,OK,,301
63 Rix Plexi 6V6.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,459
64 Rix Pro Jr.diy,OK,,475
65 Silvertone 1484 v6f.diy,OK,,5147
66 Stack Pointer board.diy,OK,,1385
67 Synth Oscllator_v1.diy,OK,,4212
68 Thunderbolt Mk3.diy,OK,,289
69 antiquity_fuzz.diy,OK,,1113
70 b_blender.diy,OK,<html>File was opened, but there were some issues with it:<br><br>Could not recognize component type Jack<br></html,1346
71 bixonix_expandora.diy,OK,,1136
72 dallas_rangemaster_pcb.diy,OK,,1415
73 deacy.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,445
74 dist_layout.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,1192
75 dyna_comp_perf.diy,OK,,1117
76 eh_octave_multiplexer.diy,OK,,1344
77 fetzer_ruby.diy,OK,,1757
78 fetzer_valve.diy,OK,,1914
79 fetzer_valve_deluxe_2.diy,OK,,1194
80 fetzer_valve_deluxe_perf.diy,OK,,1290
81 flexi_clip.diy,OK,<html>File was opened, but there were some issues with it:<br><br>Unsupported toggle switch dimensions<br></html,1714
82 ga5t_preamp.diy,OK,,1100
83 jfet boost.diy,OK,,59
84 lp switch + pots.diy,OK,,2001
85 lxh2_marshall_amp_sim.diy,OK,,1296
86 orange_treble_bass_booster_2.diy,OK,<html>File was opened, but there were some issues with it:<br><br>Could not recognize component type Jack<br></html,1646
87 puzzle87_comp.diy,OK,<html>File was opened, but there were some issues with it:<br><br>Could not recognize component type Jack<br></html,1186
88 rangemaster.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,134
89 roger_mayer_octavia_vero.diy,OK,,1024
90 ruby.diy,OK,,267
91 shaka_hv.diy,OK,,1461
92 signal_gen.diy,OK,<html>File was opened, but there were some issues with it:<br><br>Could not recognize component type Jack<br></html,1151
93 slo2.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,3912
94 soapdodger2.diy,OK,<html>File was opened, but there were some issues with it:<br><br>Could not recognize component type Jack<br></html,3460
95 splitter2.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,2201
96 standard strat.diy,OK,,3600
97 tda1521a-2.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,629
98 timmy7.diy,OK,<html>File was opened, but there were some issues with it:<br><br>The project references unknown component properties, most likely because it was created with a newer version of DIYLC.<br></html,1049
99 travelcaster3 (new format).diy,OK,,632
100 wah2.diy,OK,,1384
+999 -89
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,5 +1,5 @@
{
"version" : "6.9.0",
"version" : "6.10.0",
"categories" : {
"Boards" : [ {
"name" : "Blank Board",
+1 -1
View File
@@ -7,7 +7,7 @@
<parent>
<groupId>org.diylc</groupId>
<artifactId>diylc-parent</artifactId>
<version>6.9.0</version>
<version>6.10.0</version>
</parent>
<artifactId>diylc-core</artifactId>
@@ -21,6 +21,7 @@
*/
package org.diylc.common;
import java.time.LocalDateTime;
import java.util.Collection;
import org.diylc.core.IDIYComponent;
@@ -29,6 +30,10 @@ public class BuildingBlock {
private String name;
private Collection<IDIYComponent<?>> components;
// the dates are set only on factory blocks in import-defaults/blocks.xml, and a withdrawn
// factory block carries nothing but its name and deletedOn
private LocalDateTime createdOn;
private LocalDateTime deletedOn;
public BuildingBlock(String name, Collection<IDIYComponent<?>> components) {
super();
@@ -52,6 +57,22 @@ public class BuildingBlock {
this.components = components;
}
public LocalDateTime getCreatedOn() {
return createdOn;
}
public void setCreatedOn(LocalDateTime createdOn) {
this.createdOn = createdOn;
}
public LocalDateTime getDeletedOn() {
return deletedOn;
}
public void setDeletedOn(LocalDateTime deletedOn) {
this.deletedOn = deletedOn;
}
@Override
public String toString() {
return name;
@@ -27,6 +27,7 @@ public interface IBlockProcessor {
public static final String BLOCKS_KEY = "buildingBlocks";
public static final String DEFAULT_BLOCKS_IMPORTED_KEY = "defaultBlocksImported";
public static final String DEFAULT_BLOCKS_IMPORT_DATE_KEY = "defaultBlocksImportDate";
/**
* Prefix that marks a string as a reference to a building block rather than a component class
@@ -43,6 +43,10 @@ public interface IVariantProcessor {
void deleteVariant(ComponentType type, String variantName);
void setDefaultVariant(ComponentType type, String variantName);
void setDefaultModel(ComponentType type, String[] model);
boolean isDefaultModel(ComponentType type, String[] model);
int importVariants(String fileName) throws IOException;
@@ -1,357 +1,359 @@
/*
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.Color;
import java.awt.Font;
import java.awt.Shape;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.UUID;
import java.util.stream.Collectors;
import org.diylc.core.IDIYComponent;
import org.diylc.core.Project;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.measures.Size;
/**
* Abstract implementation of {@link IDIYComponent} that contains component name and toString.
*
* IMPORTANT: to improve performance, all fields except for <code>Point</code> and
* <code>Point</code> arrays should be immutable. Failing to comply with this can result in annoying
* and hard to trace bugs.
*
* @author Branislav Stojkovic
*
* @param <T>
*/
public abstract class AbstractComponent<T> implements IDIYComponent<T> {
private static final long serialVersionUID = 1L;
protected UUID id = UUID.randomUUID();
protected String name = "";
public static Color SELECTION_COLOR = Color.red;
public static Color LABEL_COLOR = Color.black;
public static Color LABEL_COLOR_SELECTED = Color.red;
public static Font LABEL_FONT = new Font("Square721 BT", Font.PLAIN, 14);
public static Color METAL_COLOR = Color.decode("#759DAF");
public static Color LIGHT_METAL_COLOR = Color.decode("#EEEEEE");
public static Color COPPER_COLOR = Color.decode("#DA8A67");
public static Color GOLD_COLOR = Color.decode("#F4B301");
public static Color BRASS_COLOR = Color.decode("#B8860B");
public static Color FR4_COLOR = Color.decode("#6B9B6B");
public static Color FR4_LIGHT_COLOR = Color.decode("#BABE71");
public static Color PHENOLIC_COLOR = Color.decode("#F8EBB3");
public static Color PHENOLIC_DARK_COLOR = Color.decode("#CD8500");
@EditableProperty(defaultable = false)
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public UUID getId() {
if (id == null) {
id = UUID.randomUUID();
}
return id;
}
@Override
public void setId(UUID id) {
this.id = id;
}
@Override
public boolean canControlPointOverlap(int index) {
return false;
}
@Override
public String toString() {
return name == null ? "(null)" : name;
}
@Override
public String getValueForDisplay() {
if (getValue() == null)
return "";
Object val = getValue();
if (val.getClass().isArray()) {
return String.join(" / ", Arrays.stream((Object[])val).map(x -> x == null ? "" : x.toString()).collect(Collectors.toList()));
}
return val.toString();
}
/**
* Returns the closest odd number, i.e. x when x is odd, or x + 1 when x is even.
*
* @param x
* @return
*/
protected int getClosestOdd(double x) {
return ((int) x / 2) * 2 + 1;
}
/**
* Returns the closest odd number, i.e. x when x is odd, or x + 1 when x is even.
*
* @param x
* @return
*/
protected int getClosestOdd(Size s) {
double x = s.convertToPixels();
return ((int) x / 2) * 2 + 1;
}
/**
* Returns darker color if possible, or lighter if it's already dark
*
* @param color
* @return
*/
protected Color darkerOrLighter(Color color) {
float[] hsb = new float[3];
Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), hsb);
return new Color(Color.HSBtoRGB(hsb[0], hsb[1], hsb[2] > 0.5 ? hsb[2] - 0.25f : hsb[2] + 0.25f));
}
/**
* @param clip
* @return true if none of the control points lie in the clip rectangle.
*/
protected boolean checkPointsClipped(Shape clip) {
if (clip == null) {
return false;
}
for (int i = 0; i < getControlPointCount(); i++) {
if (clip.contains(getControlPoint(i))) {
return false;
}
}
double minX = Integer.MAX_VALUE;
double minY = Integer.MAX_VALUE;
double maxX = Integer.MIN_VALUE;
double maxY = Integer.MIN_VALUE;
for (int i = 0; i < getControlPointCount(); i++) {
Point2D p = getControlPoint(i);
if (minX > p.getX()) {
minX = p.getX();
}
if (maxX < p.getX()) {
maxX = p.getX();
}
if (minY > p.getY()) {
minY = p.getY();
}
if (maxY < p.getY()) {
maxY = p.getY();
}
}
double margin = getClipMargin();
Rectangle2D rect = new Rectangle2D.Double(minX - margin, minY - margin,
maxX - minX + 2 * margin, maxY - minY + 2 * margin);
return !clip.intersects(rect);
}
/**
* Distance in pixels that the drawing may reach beyond the bounding box of the control points,
* such as half the width of a stroke running through them. {@link #checkPointsClipped(Shape)}
* widens the box by this much before testing it against the clip. The margin must stay positive,
* because {@link Shape#intersects(Rectangle2D)} reports a box with no width or height as disjoint
* from everything, which would hide a straight horizontal or vertical component whose control
* points all lie outside the clip.
*
* @return margin around the control points.
*/
protected double getClipMargin() {
return 1;
}
@SuppressWarnings("unchecked")
public IDIYComponent<T> clone() throws CloneNotSupportedException {
try {
// Instantiate object of the same type
Class<?> clazz = this.getClass();
AbstractComponent<T> newInstance = (AbstractComponent<T>) clazz.getDeclaredConstructor().newInstance();
while (AbstractComponent.class.isAssignableFrom(clazz)) {
Field[] fields = clazz.getDeclaredFields();
clazz = clazz.getSuperclass();
// fields = this.getClass().getDeclaredFields();
// Copy over all non-static, non-final fields that are declared
// in AbstractComponent or one of it's child classes
for (Field field : fields) {
if (!Modifier.isStatic(field.getModifiers()) && !Modifier.isFinal(field.getModifiers())) {
field.setAccessible(true);
Object value = field.get(this);
if (field.getName().equalsIgnoreCase("id")) {
value = getId();
}
// Deep copy point arrays.
// TODO: something nicer
if (value != null && value.getClass().isArray()
&& Point2D.class.isAssignableFrom(value.getClass().getComponentType())) {
Object newArray = Array.newInstance(value.getClass().getComponentType(), Array.getLength(value));
for (int i = 0; i < Array.getLength(value); i++) {
Point2D p = (Point2D) Array.get(value, i);
if (p != null)
Array.set(newArray, i, new Point2D.Double(p.getX(), p.getY()));
}
value = newArray;
}
// Deep copy points.
// TODO: something nicer
if (value != null && value instanceof Point2D) {
Point2D p = (Point2D) value;
value = new Point2D.Double(p.getX(), p.getY());
}
field.set(newInstance, value);
}
}
}
return newInstance;
} catch (Exception e) {
throw new CloneNotSupportedException("Could not clone the component. Reason: " + e.getMessage());
}
}
@Override
public boolean equalsTo(IDIYComponent<?> other) {
if (other == null)
return false;
if (!other.getClass().equals(this.getClass()))
return false;
Class<?> clazz = this.getClass();
while (AbstractComponent.class.isAssignableFrom(clazz)) {
Field[] fields = clazz.getDeclaredFields();
clazz = clazz.getSuperclass();
// fields = this.getClass().getDeclaredFields();
// Copy over all non-static, non-final and non-transient fields that are declared
// in
// AbstractComponent or one of it's child classes
for (Field field : fields) {
if (!Modifier.isStatic(field.getModifiers()) && !Modifier.isFinal(field.getModifiers()) &&
!Modifier.isTransient(field.getModifiers())) {
field.setAccessible(true);
try {
Object value = field.get(this);
Object otherValue = field.get(other);
if (!compareObjects(value, otherValue))
return false;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
return true;
}
private boolean compareObjects(Object o1, Object o2) {
if (o1 == null && o2 == null)
return true;
if (o1 == null || o2 == null)
return false;
if (o1.getClass().isArray()) {
if (o1.getClass().getComponentType() == byte.class)
return Arrays.equals((byte[]) o1, (byte[]) o2);
if (o1.getClass().getComponentType() == double.class)
return Arrays.equals((double[]) o1, (double[]) o2);
if (o1.getClass().getComponentType() == int.class)
return Arrays.equals((int[]) o1, (int[]) o2);
return Arrays.equals((Object[]) o1, (Object[]) o2);
}
return o1.equals(o2);
}
@Override
public String getControlPointNodeName(int index) {
return Integer.toString(index + 1);
}
@Override
public String getInternalLinkName(int index1, int index2) {
return null;
}
@Override
public boolean canPointMoveFreely(int pointIndex) {
return true;
}
@Override
public void stretchBetween(Point2D first, Point2D second) {
int count = getControlPointCount();
// fresh instances because implementations are free to keep the point objects they are handed
setControlPoint(new Point2D.Double(first.getX(), first.getY()), 0);
if (count > 1) {
setControlPoint(new Point2D.Double(second.getX(), second.getY()), count - 1);
}
for (int i = 1; i < count - 1; i++) {
setControlPoint(getStretchedPoint(first, second, i), i);
}
}
/**
* Decides where a control point that is neither of the two ends lands when the component is
* stretched between them, see {@link #stretchBetween(Point2D, Point2D)}. The default spaces the
* points evenly along the straight line joining the ends. Override to place a point that carries
* a meaning of its own, such as one that positions a label.
*
* @param first
* @param second
* @param index
* @return position of the control point at the specified index.
*/
protected Point2D getStretchedPoint(Point2D first, Point2D second, int index) {
double t = (double) index / (getControlPointCount() - 1);
return new Point2D.Double(first.getX() + t * (second.getX() - first.getX()),
first.getY() + t * (second.getY() - first.getY()));
}
@Override
public Rectangle2D getCachingBounds() {
return null;
}
@Override
public void createdIn(Project project) {
// TODO Auto-generated method stub
}
}
/*
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.Color;
import java.awt.Font;
import java.awt.Shape;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.UUID;
import java.util.stream.Collectors;
import org.diylc.core.IDIYComponent;
import org.diylc.core.Project;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.measures.Size;
/**
* Abstract implementation of {@link IDIYComponent} that contains component name and toString.
*
* IMPORTANT: to improve performance, all fields except for <code>Point</code> and
* <code>Point</code> arrays should be immutable. Failing to comply with this can result in annoying
* and hard to trace bugs.
*
* @author Branislav Stojkovic
*
* @param <T>
*/
public abstract class AbstractComponent<T> implements IDIYComponent<T> {
private static final long serialVersionUID = 1L;
protected UUID id = UUID.randomUUID();
protected String name = "";
public static Color SELECTION_COLOR = Color.red;
public static Color LABEL_COLOR = Color.black;
public static Color LABEL_COLOR_SELECTED = Color.red;
public static Font LABEL_FONT = new Font("Square721 BT", Font.PLAIN, 14);
public static Color METAL_COLOR = Color.decode("#759DAF");
public static Color LIGHT_METAL_COLOR = Color.decode("#EEEEEE");
public static Color PIN_COLOR = Color.decode("#00B2EE");
public static Color PIN_BORDER_COLOR = PIN_COLOR.darker();
public static Color COPPER_COLOR = Color.decode("#DA8A67");
public static Color GOLD_COLOR = Color.decode("#F4B301");
public static Color BRASS_COLOR = Color.decode("#B8860B");
public static Color FR4_COLOR = Color.decode("#6B9B6B");
public static Color FR4_LIGHT_COLOR = Color.decode("#BABE71");
public static Color PHENOLIC_COLOR = Color.decode("#F8EBB3");
public static Color PHENOLIC_DARK_COLOR = Color.decode("#CD8500");
@EditableProperty(defaultable = false)
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public UUID getId() {
if (id == null) {
id = UUID.randomUUID();
}
return id;
}
@Override
public void setId(UUID id) {
this.id = id;
}
@Override
public boolean canControlPointOverlap(int index) {
return false;
}
@Override
public String toString() {
return name == null ? "(null)" : name;
}
@Override
public String getValueForDisplay() {
if (getValue() == null)
return "";
Object val = getValue();
if (val.getClass().isArray()) {
return String.join(" / ", Arrays.stream((Object[])val).map(x -> x == null ? "" : x.toString()).collect(Collectors.toList()));
}
return val.toString();
}
/**
* Returns the closest odd number, i.e. x when x is odd, or x + 1 when x is even.
*
* @param x
* @return
*/
protected int getClosestOdd(double x) {
return ((int) x / 2) * 2 + 1;
}
/**
* Returns the closest odd number, i.e. x when x is odd, or x + 1 when x is even.
*
* @param x
* @return
*/
protected int getClosestOdd(Size s) {
double x = s.convertToPixels();
return ((int) x / 2) * 2 + 1;
}
/**
* Returns darker color if possible, or lighter if it's already dark
*
* @param color
* @return
*/
protected Color darkerOrLighter(Color color) {
float[] hsb = new float[3];
Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), hsb);
return new Color(Color.HSBtoRGB(hsb[0], hsb[1], hsb[2] > 0.5 ? hsb[2] - 0.25f : hsb[2] + 0.25f));
}
/**
* @param clip
* @return true if none of the control points lie in the clip rectangle.
*/
protected boolean checkPointsClipped(Shape clip) {
if (clip == null) {
return false;
}
for (int i = 0; i < getControlPointCount(); i++) {
if (clip.contains(getControlPoint(i))) {
return false;
}
}
double minX = Integer.MAX_VALUE;
double minY = Integer.MAX_VALUE;
double maxX = Integer.MIN_VALUE;
double maxY = Integer.MIN_VALUE;
for (int i = 0; i < getControlPointCount(); i++) {
Point2D p = getControlPoint(i);
if (minX > p.getX()) {
minX = p.getX();
}
if (maxX < p.getX()) {
maxX = p.getX();
}
if (minY > p.getY()) {
minY = p.getY();
}
if (maxY < p.getY()) {
maxY = p.getY();
}
}
double margin = getClipMargin();
Rectangle2D rect = new Rectangle2D.Double(minX - margin, minY - margin,
maxX - minX + 2 * margin, maxY - minY + 2 * margin);
return !clip.intersects(rect);
}
/**
* Distance in pixels that the drawing may reach beyond the bounding box of the control points,
* such as half the width of a stroke running through them. {@link #checkPointsClipped(Shape)}
* widens the box by this much before testing it against the clip. The margin must stay positive,
* because {@link Shape#intersects(Rectangle2D)} reports a box with no width or height as disjoint
* from everything, which would hide a straight horizontal or vertical component whose control
* points all lie outside the clip.
*
* @return margin around the control points.
*/
protected double getClipMargin() {
return 1;
}
@SuppressWarnings("unchecked")
public IDIYComponent<T> clone() throws CloneNotSupportedException {
try {
// Instantiate object of the same type
Class<?> clazz = this.getClass();
AbstractComponent<T> newInstance = (AbstractComponent<T>) clazz.getDeclaredConstructor().newInstance();
while (AbstractComponent.class.isAssignableFrom(clazz)) {
Field[] fields = clazz.getDeclaredFields();
clazz = clazz.getSuperclass();
// fields = this.getClass().getDeclaredFields();
// Copy over all non-static, non-final fields that are declared
// in AbstractComponent or one of it's child classes
for (Field field : fields) {
if (!Modifier.isStatic(field.getModifiers()) && !Modifier.isFinal(field.getModifiers())) {
field.setAccessible(true);
Object value = field.get(this);
if (field.getName().equalsIgnoreCase("id")) {
value = getId();
}
// Deep copy point arrays.
// TODO: something nicer
if (value != null && value.getClass().isArray()
&& Point2D.class.isAssignableFrom(value.getClass().getComponentType())) {
Object newArray = Array.newInstance(value.getClass().getComponentType(), Array.getLength(value));
for (int i = 0; i < Array.getLength(value); i++) {
Point2D p = (Point2D) Array.get(value, i);
if (p != null)
Array.set(newArray, i, new Point2D.Double(p.getX(), p.getY()));
}
value = newArray;
}
// Deep copy points.
// TODO: something nicer
if (value != null && value instanceof Point2D) {
Point2D p = (Point2D) value;
value = new Point2D.Double(p.getX(), p.getY());
}
field.set(newInstance, value);
}
}
}
return newInstance;
} catch (Exception e) {
throw new CloneNotSupportedException("Could not clone the component. Reason: " + e.getMessage());
}
}
@Override
public boolean equalsTo(IDIYComponent<?> other) {
if (other == null)
return false;
if (!other.getClass().equals(this.getClass()))
return false;
Class<?> clazz = this.getClass();
while (AbstractComponent.class.isAssignableFrom(clazz)) {
Field[] fields = clazz.getDeclaredFields();
clazz = clazz.getSuperclass();
// fields = this.getClass().getDeclaredFields();
// Copy over all non-static, non-final and non-transient fields that are declared
// in
// AbstractComponent or one of it's child classes
for (Field field : fields) {
if (!Modifier.isStatic(field.getModifiers()) && !Modifier.isFinal(field.getModifiers()) &&
!Modifier.isTransient(field.getModifiers())) {
field.setAccessible(true);
try {
Object value = field.get(this);
Object otherValue = field.get(other);
if (!compareObjects(value, otherValue))
return false;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
return true;
}
private boolean compareObjects(Object o1, Object o2) {
if (o1 == null && o2 == null)
return true;
if (o1 == null || o2 == null)
return false;
if (o1.getClass().isArray()) {
if (o1.getClass().getComponentType() == byte.class)
return Arrays.equals((byte[]) o1, (byte[]) o2);
if (o1.getClass().getComponentType() == double.class)
return Arrays.equals((double[]) o1, (double[]) o2);
if (o1.getClass().getComponentType() == int.class)
return Arrays.equals((int[]) o1, (int[]) o2);
return Arrays.equals((Object[]) o1, (Object[]) o2);
}
return o1.equals(o2);
}
@Override
public String getControlPointNodeName(int index) {
return Integer.toString(index + 1);
}
@Override
public String getInternalLinkName(int index1, int index2) {
return null;
}
@Override
public boolean canPointMoveFreely(int pointIndex) {
return true;
}
@Override
public void stretchBetween(Point2D first, Point2D second) {
int count = getControlPointCount();
// fresh instances because implementations are free to keep the point objects they are handed
setControlPoint(new Point2D.Double(first.getX(), first.getY()), 0);
if (count > 1) {
setControlPoint(new Point2D.Double(second.getX(), second.getY()), count - 1);
}
for (int i = 1; i < count - 1; i++) {
setControlPoint(getStretchedPoint(first, second, i), i);
}
}
/**
* Decides where a control point that is neither of the two ends lands when the component is
* stretched between them, see {@link #stretchBetween(Point2D, Point2D)}. The default spaces the
* points evenly along the straight line joining the ends. Override to place a point that carries
* a meaning of its own, such as one that positions a label.
*
* @param first
* @param second
* @param index
* @return position of the control point at the specified index.
*/
protected Point2D getStretchedPoint(Point2D first, Point2D second, int index) {
double t = (double) index / (getControlPointCount() - 1);
return new Point2D.Double(first.getX() + t * (second.getX() - first.getX()),
first.getY() + t * (second.getY() - first.getY()));
}
@Override
public Rectangle2D getCachingBounds() {
return null;
}
@Override
public void createdIn(Project project) {
// TODO Auto-generated method stub
}
}
@@ -106,7 +106,10 @@ public class Group implements Comparable<Group> {
@Override
public int compareTo(Group o) {
return toString().compareToIgnoreCase(o.toString());
String text = toString();
String otherText = o.toString();
int comparison = text.compareToIgnoreCase(otherText);
return comparison != 0 ? comparison : text.compareTo(otherText);
}
@Override
@@ -23,6 +23,7 @@ package org.diylc.netlist;
import java.awt.geom.Point2D;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
@@ -39,7 +40,14 @@ public class Node implements Comparable<Node> {
/** Pin names that mark an absent connection, so repeats of them are not one net. */
private static final Set<String> NON_NET_NAMES =
new HashSet<String>(Arrays.asList("NC", "RSV"));
new HashSet<String>(Arrays.asList("NC", "RSV", "IC"));
/**
* Orders points top to bottom, then left to right. Breaks ties between parts that share a name:
* where a part sits is the same in every run, unlike the order a hash set yields it in.
*/
static final Comparator<Point2D> LOCATION_ORDER = Comparator.nullsLast(
Comparator.comparingDouble(Point2D::getY).thenComparingDouble(Point2D::getX));
private IDIYComponent<?> component;
private int pointIndex;
@@ -137,6 +145,15 @@ public class Node implements Comparable<Node> {
@Override
public int compareTo(Node o) {
return toString().compareToIgnoreCase(o.toString());
String name = toString();
String otherName = o.toString();
int comparison = name.compareToIgnoreCase(otherName);
if (comparison == 0) {
comparison = name.compareTo(otherName);
}
if (comparison == 0) {
comparison = LOCATION_ORDER.compare(getPoint2D(), o.getPoint2D());
}
return comparison != 0 ? comparison : Integer.compare(pointIndex, o.pointIndex);
}
}
@@ -21,6 +21,8 @@
*/
package org.diylc.netlist;
import java.awt.geom.Point2D;
import org.diylc.core.IDIYComponent;
import org.diylc.core.ISwitch;
@@ -84,9 +86,20 @@ public class Position implements Comparable<Position> {
@Override
public int compareTo(Position o) {
int comparison = getSwitchName().compareToIgnoreCase(o.getSwitchName());
return comparison != 0
? comparison
: Integer.compare(position, o.position);
if (comparison == 0) {
comparison = getSwitchName().compareTo(o.getSwitchName());
}
// switches that share a name keep apart by location, so a setup reads the same in every run
if (comparison == 0) {
comparison = Node.LOCATION_ORDER.compare(getSwitchLocation(), o.getSwitchLocation());
}
return comparison != 0 ? comparison : Integer.compare(position, o.position);
}
private Point2D getSwitchLocation() {
return theSwitch instanceof IDIYComponent<?> component && component.getControlPointCount() > 0
? component.getControlPoint(0)
: null;
}
String getSwitchName() {
@@ -124,6 +124,7 @@ public class SwitchSetup implements Comparable<SwitchSetup> {
}
// Same earliest full configuration: use the description as a tie-breaker.
return toString().compareToIgnoreCase(o.toString());
int comparison = toString().compareToIgnoreCase(o.toString());
return comparison != 0 ? comparison : toString().compareTo(o.toString());
}
}
@@ -18,6 +18,7 @@
package org.diylc.presenter;
import java.io.*;
import java.time.LocalDateTime;
import java.util.*;
import org.apache.log4j.Logger;
@@ -28,6 +29,7 @@ import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.security.AnyTypePermission;
import org.diylc.common.BlockInstantiationMode;
import org.diylc.common.BuildingBlock;
import org.diylc.common.BuildingBlockPackage;
import org.diylc.common.ComponentType;
import org.diylc.common.IBlockProcessor;
@@ -42,7 +44,7 @@ public class BuildingBlockManager {
private static final String BLOCKS_FILE_NAME = "import-defaults/blocks.xml";
private static final Logger LOG = Logger.getLogger(VariantManager.class);
private static final Logger LOG = Logger.getLogger(BuildingBlockManager.class);
private IConfigurationManager<?> configManager;
private XStream xStream;
@@ -58,44 +60,80 @@ public class BuildingBlockManager {
@SuppressWarnings("unchecked")
public void importDefaultBlocks() {
// import default templates from variants.xml file only if we didn't do it already
if (!configManager.readBoolean(IPlugInPort.DEFAULT_BLOCKS_IMPORTED_KEY, false)) {
try {
InputStream inputStream = Presenter.class.getResourceAsStream("/" + BLOCKS_FILE_NAME);
if (inputStream == null) {
return;
}
BufferedInputStream in = new BufferedInputStream(inputStream);
Map<String, List<IDIYComponent<?>>> defaults =
(Map<String, List<IDIYComponent<?>>>) ProjectFileManager.xStreamSerializer
.fromXML(in);
in.close();
Map<String, List<IDIYComponent<?>>> blocksMap =
(Map<String, List<IDIYComponent<?>>>) configManager.readObject(IPlugInPort.BLOCKS_KEY,
null);
if (blocksMap == null)
blocksMap = new HashMap<String, List<IDIYComponent<?>>>();
// merge default blocks with user's
for (Map.Entry<String, List<IDIYComponent<?>>> entry : defaults.entrySet()) {
if (!blocksMap.containsKey(entry.getKey()))
blocksMap.put(entry.getKey(), entry.getValue());
}
// update templates and a flag marking that we imported them
configManager.writeValue(IPlugInPort.DEFAULT_BLOCKS_IMPORTED_KEY, true);
configManager.writeValue(IPlugInPort.BLOCKS_KEY, blocksMap);
int importCount = defaults.size();
if (importCount > 0) {
LOG.info(String.format("Imported %d default building blocks", importCount));
}
} catch (Exception e) {
LOG.error("Could not load default blocks", e);
try {
InputStream inputStream = Presenter.class.getResourceAsStream("/" + BLOCKS_FILE_NAME);
if (inputStream == null) {
return;
}
BufferedInputStream in = new BufferedInputStream(inputStream);
List<BuildingBlock> defaults =
(List<BuildingBlock>) ProjectFileManager.xStreamSerializer.fromXML(in);
in.close();
importDefaultBlocks(defaults);
} catch (Exception e) {
LOG.error("Could not load default blocks", e);
}
}
@SuppressWarnings("unchecked")
void importDefaultBlocks(List<BuildingBlock> defaults) {
LocalDateTime importDate = (LocalDateTime) configManager
.readObject(IPlugInPort.DEFAULT_BLOCKS_IMPORT_DATE_KEY, LocalDateTime.MIN);
Map<String, List<IDIYComponent<?>>> blocksMap =
(Map<String, List<IDIYComponent<?>>>) configManager.readObject(IPlugInPort.BLOCKS_KEY,
null);
if (blocksMap == null) {
blocksMap = new HashMap<String, List<IDIYComponent<?>>>();
}
// as with variants, the import date is the latest date in the bundled file rather than the
// clock, and never moves backwards
LocalDateTime newImportDate = importDate;
List<String> deletedNames = new ArrayList<String>();
int importCount = 0;
for (BuildingBlock block : defaults) {
if (block.getCreatedOn() != null && block.getCreatedOn().isAfter(newImportDate)) {
newImportDate = block.getCreatedOn();
}
if (block.getDeletedOn() != null && block.getDeletedOn().isAfter(newImportDate)) {
newImportDate = block.getDeletedOn();
}
// a deletion stub keeps nothing but its name, so a missing createdOn only means an old
// entry when the block has not been deleted
boolean created = block.getCreatedOn() == null ? block.getDeletedOn() == null
: importDate.compareTo(block.getCreatedOn()) < 0;
boolean deleted =
block.getDeletedOn() != null && importDate.compareTo(block.getDeletedOn()) < 0;
if (deleted && !created) {
if (blocksMap.remove(block.getName()) != null) {
deletedNames.add(block.getName());
}
} else if (created && block.getDeletedOn() == null
&& !blocksMap.containsKey(block.getName())) {
// a user who had the block before the import date existed keeps their copy, edited or
// not, and one who deleted it gets it back once
blocksMap.put(block.getName(), new ArrayList<IDIYComponent<?>>(block.getComponents()));
importCount++;
}
}
// the flag stays so that older versions, which know nothing else, do not import again
configManager.writeValue(IPlugInPort.DEFAULT_BLOCKS_IMPORTED_KEY, true);
configManager.writeValue(IPlugInPort.DEFAULT_BLOCKS_IMPORT_DATE_KEY, newImportDate);
configManager.writeValue(IPlugInPort.BLOCKS_KEY, blocksMap);
for (String name : deletedNames) {
removeFromRecent(name);
}
if (importCount > 0) {
LOG.info(String.format("Imported %d default building blocks", importCount));
}
if (!deletedNames.isEmpty()) {
LOG.info(String.format("Deleted %d withdrawn default building blocks", deletedNames.size()));
}
}
@SuppressWarnings("unchecked")
public int importBlocks(String fileName) throws IOException {
LOG.debug(String.format("importBlocks(%s)", fileName));
@@ -221,14 +259,15 @@ public class BuildingBlockManager {
blocks.put(blockName, blockComponents);
if (System.getProperty("org.diylc.WriteStaticBlocks", "false").equalsIgnoreCase("true")) {
Map<String, List<IDIYComponent<?>>> defaultBlockMap =
new HashMap<String, List<IDIYComponent<?>>>();
defaultBlockMap.put(blockName, blockComponents);
BuildingBlock defaultBlock = new BuildingBlock(blockName, blockComponents);
defaultBlock.setCreatedOn(LocalDateTime.now().withNano(0));
List<BuildingBlock> defaultBlocks = new ArrayList<BuildingBlock>();
defaultBlocks.add(defaultBlock);
try {
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(BLOCKS_FILE_NAME));
XStream xStream = new XStream(new DomDriver());
xStream.addPermission(AnyTypePermission.ANY);
xStream.toXML(defaultBlockMap, out);
xStream.toXML(defaultBlocks, out);
out.close();
LOG.info("Saved default blocks");
} catch (IOException e) {
@@ -248,11 +287,16 @@ public class BuildingBlockManager {
blocks.remove(blockName);
configManager.writeValue(IBlockProcessor.BLOCKS_KEY, blocks);
}
removeFromRecent(blockName);
}
// drop the block from the recently used list too, so it doesn't linger as a dead entry
// drop the block from the recently used list too, so it doesn't linger as a dead entry
@SuppressWarnings("unchecked")
private void removeFromRecent(String blockName) {
List<String> recent =
(List<String>) configManager.readObject(IPlugInPort.RECENT_COMPONENTS_KEY, null);
if (recent != null && recent.remove(IBlockProcessor.BLOCK_PREFIX + blockName))
if (recent != null && recent.remove(IBlockProcessor.BLOCK_PREFIX + blockName)) {
configManager.writeValue(IPlugInPort.RECENT_COMPONENTS_KEY, recent);
}
}
}
@@ -2868,17 +2868,21 @@ public class Presenter implements IPlugInPort {
controlPointMap.clear();
}
// try to find a default template if none is provided
if (componentType != null && template == null) {
String defaultTemplate = getDefaultVariant(componentType);
List<Template> templates = getVariantsFor(componentType);
if (templates != null && defaultTemplate != null)
for (Template t : templates) {
if (t.getName().equals(defaultTemplate)) {
template = t;
break;
// try to find a default model or template if none is provided
if (componentType != null && template == null && model == null) {
model = variantManager.getDefaultModel(componentType);
if (model == null) {
String defaultTemplate = getDefaultVariant(componentType);
List<Template> templates = getVariantsFor(componentType);
if (templates != null && defaultTemplate != null) {
for (Template t : templates) {
if (t.getName().equals(defaultTemplate)) {
template = t;
break;
}
}
}
}
}
try {
@@ -3064,28 +3068,19 @@ public class Presenter implements IPlugInPort {
variantManager.deleteVariant(type, templateName);
}
@SuppressWarnings("unchecked")
@Override
public void setDefaultVariant(ComponentType type, String templateName) {
LOG.debug(String.format("setTemplateDefault(%s, %s)", type, templateName));
Map<String, String> defaultTemplateMap =
(Map<String, String>) configManager.readObject(DEFAULT_TEMPLATES_KEY, null);
if (defaultTemplateMap == null)
defaultTemplateMap = new HashMap<String, String>();
variantManager.setDefaultVariant(type, templateName);
}
// try by class name and then by old category.type format
String key1 = type.getInstanceClass().getCanonicalName();
String key2 = type.getCategory() + "." + type.getName();
@Override
public void setDefaultModel(ComponentType type, String[] model) {
variantManager.setDefaultModel(type, model);
}
if (templateName.equals(defaultTemplateMap.get(key1)) || templateName.equals(defaultTemplateMap.get(key2))) {
defaultTemplateMap.remove(key1);
defaultTemplateMap.remove(key2);
} else {
// get rid of legacy key
defaultTemplateMap.remove(key2);
defaultTemplateMap.put(key1, templateName);
}
configManager.writeValue(DEFAULT_TEMPLATES_KEY, defaultTemplateMap);
@Override
public boolean isDefaultModel(ComponentType type, String[] model) {
return variantManager.isDefaultModel(type, model);
}
@Override
@@ -23,6 +23,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@@ -46,6 +47,9 @@ import org.diylc.serialization.ProjectFileManager;
public class VariantManager {
private static final String VARIANTS_FILE_NAME = "import-defaults/variants.xml";
// marks a default that names a datasheet model rather than a variant; older versions find no
// variant by that name and simply place the component without a default
private static final String DATASHEET_MODEL_PREFIX = "datasheet:";
private static final Logger LOG = Logger.getLogger(VariantManager.class);
@@ -82,6 +86,11 @@ public class VariantManager {
if (variantMap == null)
variantMap = new HashMap<String, List<Template>>();
// the import date records how far the bundled file reaches, not when it was read, so that
// running an older build first does not mark the variants of a newer build as already seen;
// it never moves backwards, so running an older build after a newer one changes nothing
LocalDateTime newImportDate = importDate;
// merge default variants with user's
for (Map.Entry<String, List<Template>> entry : defaults.entrySet()) {
List<Template> existingVariants = variantMap.computeIfAbsent(entry.getKey(), key -> new ArrayList<Template>());
@@ -90,6 +99,12 @@ public class VariantManager {
.collect(Collectors.toSet());
for (Template variant : entry.getValue()) {
if (variant.getCreatedOn() != null && variant.getCreatedOn().isAfter(newImportDate)) {
newImportDate = variant.getCreatedOn();
}
if (variant.getDeletedOn() != null && variant.getDeletedOn().isAfter(newImportDate)) {
newImportDate = variant.getDeletedOn();
}
// 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
@@ -112,8 +127,7 @@ public class VariantManager {
}
// update templates and a flag marking that we imported them
configManager.writeValue(IPlugInPort.DEFAULT_TEMPLATES_IMPORT_DATE_KEY,
LocalDateTime.now());
configManager.writeValue(IPlugInPort.DEFAULT_TEMPLATES_IMPORT_DATE_KEY, newImportDate);
configManager.writeValue(IPlugInPort.TEMPLATES_KEY, variantMap);
if (importCount > 0) {
LOG.info(String.format("Imported default %d variants", importCount));
@@ -261,6 +275,67 @@ public class VariantManager {
return defaultTemplateMap.get(key2);
}
/**
* Makes the variant the default of its type, replacing whatever variant or model was the
* default before, or clears the default if the variant already is it.
*/
@SuppressWarnings("unchecked")
public void setDefaultVariant(ComponentType type, String variantName) {
Map<String, String> defaultTemplateMap =
(Map<String, String>) configManager.readObject(IPlugInPort.DEFAULT_TEMPLATES_KEY, null);
if (defaultTemplateMap == null) {
defaultTemplateMap = new HashMap<String, String>();
}
// try by class name and then by old category.type format
String key1 = type.getInstanceClass().getCanonicalName();
String key2 = type.getCategory() + "." + type.getName();
if (variantName.equals(defaultTemplateMap.get(key1))
|| variantName.equals(defaultTemplateMap.get(key2))) {
defaultTemplateMap.remove(key1);
defaultTemplateMap.remove(key2);
LOG.info(String.format("Cleared default of %s, was %s", type.getName(), variantName));
} else {
// get rid of legacy key
defaultTemplateMap.remove(key2);
defaultTemplateMap.put(key1, variantName);
LOG.info(String.format("Set default of %s to %s", type.getName(), variantName));
}
configManager.writeValue(IPlugInPort.DEFAULT_TEMPLATES_KEY, defaultTemplateMap);
}
/**
* Same as {@link #setDefaultVariant(ComponentType, String)} for a datasheet model, sharing the
* single default slot of the type.
*/
public void setDefaultModel(ComponentType type, String[] model) {
setDefaultVariant(type, encodeModel(type, model));
}
public boolean isDefaultModel(ComponentType type, String[] model) {
return encodeModel(type, model).equals(getDefaultVariant(type));
}
/**
* @return the datasheet row pinned as the default of the type, or null when the default is a
* variant, nothing is pinned, or the pinned model is no longer in the datasheet.
*/
public String[] getDefaultModel(ComponentType type) {
String defaultVariant = getDefaultVariant(type);
List<String[]> datasheet = type.getDatasheet();
if (defaultVariant == null || !defaultVariant.startsWith(DATASHEET_MODEL_PREFIX)
|| datasheet == null) {
return null;
}
for (String[] row : datasheet) {
if (defaultVariant.equals(encodeModel(type, row))) {
return row;
}
}
return null;
}
@SuppressWarnings("unchecked")
public void deleteVariant(ComponentType type, String templateName) {
LOG.debug(String.format("deleteTemplate(%s, %s)", type, templateName));
@@ -294,4 +369,11 @@ public class VariantManager {
}
configManager.writeValue(IPlugInPort.TEMPLATES_KEY, templateMap);
}
// a model is identified by its path through the datasheet submenus, the same columns the
// toolbox matches when a model is clicked
private String encodeModel(ComponentType type, String[] model) {
int depth = Math.min(type.getDatasheetCreationStepCount(), model.length);
return DATASHEET_MODEL_PREFIX + String.join("|", Arrays.copyOf(model, depth));
}
}
@@ -1,7 +1,8 @@
<map>
<entry>
<string>TO-92 w/ 3 Leads</string>
<list>
<list>
<org.diylc.common.BuildingBlock>
<name>TO-92 w/ 3 Leads</name>
<createdOn>2026-01-01T00:00:00</createdOn>
<components class="list">
<diylc.connectivity.Jumper>
<name>J1</name>
<alpha>127</alpha>
@@ -73,11 +74,12 @@
<folded>false</folded>
<pinSpacing value="0.05" unit="in"/>
</diylc.semiconductors.TransistorTO92>
</list>
</entry>
<entry>
<string>TO-92 w/ 2 Leads</string>
<list>
</components>
</org.diylc.common.BuildingBlock>
<org.diylc.common.BuildingBlock>
<name>TO-92 w/ 2 Leads</name>
<createdOn>2026-01-01T00:00:00</createdOn>
<components class="list">
<diylc.connectivity.Jumper>
<name>J1</name>
<alpha>127</alpha>
@@ -131,11 +133,12 @@
<folded>false</folded>
<pinSpacing value="0.05" unit="in"/>
</diylc.semiconductors.TransistorTO92>
</list>
</entry>
<entry>
<string>Title Block</string>
<list>
</components>
</org.diylc.common.BuildingBlock>
<org.diylc.common.BuildingBlock>
<name>Title Block</name>
<createdOn>2026-01-01T00:00:00</createdOn>
<components class="list">
<org.diylc.components.shapes.Rectangle>
<name>RECT1</name>
<alpha>127</alpha>
@@ -735,6 +738,6 @@
<verticalAlignment>CENTER</verticalAlignment>
<orientation>DEFAULT</orientation>
</org.diylc.components.misc.Label>
</list>
</entry>
</map>
</components>
</org.diylc.common.BuildingBlock>
</list>
@@ -885,7 +885,7 @@
<awt-color hex="acaca7"/>
</entry>
<entry>
<string>Electrode Labels</string>
<string>Pin Names</string>
<string>1,2,3,4,5,6,7,8,9</string>
</entry>
<entry>
@@ -924,7 +924,7 @@
<awt-color hex="acaca7"/>
</entry>
<entry>
<string>Electrode Labels</string>
<string>Pin Names</string>
<string>1,2,3,4,5,6,7,8,9</string>
</entry>
<entry>
@@ -948,232 +948,27 @@
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>Chassis Noval 9A (12A?7)</name>
<values>
<entry>
<string>Color</string>
<awt-color hex="f7f7ef"/>
</entry>
<entry>
<string>Mount</string>
<diylc.tube.TubeSocket_-Mount>CHASSIS</diylc.tube.TubeSocket_-Mount>
</entry>
<entry>
<string>Label</string>
<awt-color hex="acaca7"/>
</entry>
<entry>
<string>Electrode Labels</string>
<string>A,G,C,H,H,A,G,C,CT</string>
</entry>
<entry>
<string>Base</string>
<diylc.tube.TubeSocket_-Base>B9A</diylc.tube.TubeSocket_-Base>
</entry>
</values>
<points>
<point x="0.0" y="0.0"/>
<point x="0.2" y="0.145"/>
<point x="0.075" y="0.235"/>
<point x="-0.08" y="0.235"/>
<point x="-0.205" y="0.145"/>
<point x="-0.25" y="0.0"/>
<point x="-0.205" y="-0.15"/>
<point x="-0.08" y="-0.24"/>
<point x="0.075" y="-0.24"/>
<point x="0.2" y="-0.15"/>
</points>
<defaultFlag>false</defaultFlag>
<createdOn>2022-10-30T13:25:15.3894874</createdOn>
<deletedOn>2026-11-02T14:00:00</deletedOn>
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>Chassis Noval 9CV (EL84)</name>
<values>
<entry>
<string>Color</string>
<awt-color hex="f7f7ef"/>
</entry>
<entry>
<string>Mount</string>
<diylc.tube.TubeSocket_-Mount>CHASSIS</diylc.tube.TubeSocket_-Mount>
</entry>
<entry>
<string>Label</string>
<awt-color hex="acaca7"/>
</entry>
<entry>
<string>Electrode Labels</string>
<string>n/c,G,C,H,H,n/c,P,n/c,S</string>
</entry>
<entry>
<string>Base</string>
<diylc.tube.TubeSocket_-Base>B9A</diylc.tube.TubeSocket_-Base>
</entry>
</values>
<points>
<point x="0.0" y="0.0"/>
<point x="0.2" y="0.145"/>
<point x="0.075" y="0.235"/>
<point x="-0.08" y="0.235"/>
<point x="-0.205" y="0.145"/>
<point x="-0.25" y="0.0"/>
<point x="-0.205" y="-0.15"/>
<point x="-0.08" y="-0.24"/>
<point x="0.075" y="-0.24"/>
<point x="0.2" y="-0.15"/>
</points>
<defaultFlag>false</defaultFlag>
<createdOn>2022-10-30T13:25:15.3894874</createdOn>
<deletedOn>2026-11-02T14:00:00</deletedOn>
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>Chassis Octal 5T</name>
<values>
<entry>
<string>Color</string>
<awt-color hex="f7f7ef"/>
</entry>
<entry>
<string>Mount</string>
<diylc.tube.TubeSocket_-Mount>CHASSIS</diylc.tube.TubeSocket_-Mount>
</entry>
<entry>
<string>Label</string>
<awt-color hex="acaca7"/>
</entry>
<entry>
<string>Electrode Labels</string>
<string>n/c,H,n/c,P,n/c,P,n/c,H</string>
</entry>
<entry>
<string>Base</string>
<diylc.tube.TubeSocket_-Base>OCTAL</diylc.tube.TubeSocket_-Base>
</entry>
</values>
<points>
<point x="0.0" y="0.0"/>
<point x="0.315" y="0.13"/>
<point x="0.13" y="0.315"/>
<point x="-0.13" y="0.315"/>
<point x="-0.315" y="0.13"/>
<point x="-0.315" y="-0.13"/>
<point x="-0.13" y="-0.315"/>
<point x="0.13" y="-0.315"/>
<point x="0.315" y="-0.13"/>
</points>
<defaultFlag>false</defaultFlag>
<createdOn>2022-10-30T13:25:15.3894874</createdOn>
<deletedOn>2026-11-02T14:00:00</deletedOn>
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>Chassis Octal 7AC (6?6)</name>
<values>
<entry>
<string>Color</string>
<awt-color hex="f7f7ef"/>
</entry>
<entry>
<string>Mount</string>
<diylc.tube.TubeSocket_-Mount>CHASSIS</diylc.tube.TubeSocket_-Mount>
</entry>
<entry>
<string>Label</string>
<awt-color hex="acaca7"/>
</entry>
<entry>
<string>Electrode Labels</string>
<string>n/c,H,P,S,G,n/c,H,C</string>
</entry>
<entry>
<string>Base</string>
<diylc.tube.TubeSocket_-Base>OCTAL</diylc.tube.TubeSocket_-Base>
</entry>
</values>
<points>
<point x="0.0" y="0.0"/>
<point x="0.315" y="0.13"/>
<point x="0.13" y="0.315"/>
<point x="-0.13" y="0.315"/>
<point x="-0.315" y="0.13"/>
<point x="-0.315" y="-0.13"/>
<point x="-0.13" y="-0.315"/>
<point x="0.13" y="-0.315"/>
<point x="0.315" y="-0.13"/>
</points>
<defaultFlag>false</defaultFlag>
<createdOn>2022-10-30T13:25:15.3894874</createdOn>
<deletedOn>2026-11-02T14:00:00</deletedOn>
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>Chassis 7-pin 7BK</name>
<values>
<entry>
<string>Color</string>
<awt-color hex="f7f7ef"/>
</entry>
<entry>
<string>Mount</string>
<diylc.tube.TubeSocket_-Mount>CHASSIS</diylc.tube.TubeSocket_-Mount>
</entry>
<entry>
<string>Label</string>
<awt-color hex="acaca7"/>
</entry>
<entry>
<string>Electrode Labels</string>
<string>G,IS,H,H,P,S,C</string>
</entry>
<entry>
<string>Base</string>
<diylc.tube.TubeSocket_-Base>B7G</diylc.tube.TubeSocket_-Base>
</entry>
</values>
<points>
<point x="0.0" y="0.0"/>
<point x="0.165" y="0.165"/>
<point x="0.0" y="0.235"/>
<point x="-0.17" y="0.165"/>
<point x="-0.24" y="0.0"/>
<point x="-0.17" y="-0.17"/>
<point x="0.0" y="-0.24"/>
<point x="0.165" y="-0.17"/>
</points>
<defaultFlag>false</defaultFlag>
<createdOn>2022-10-30T13:25:15.3894874</createdOn>
<deletedOn>2026-11-02T14:00:00</deletedOn>
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>Chassis Octal 8ET (EL34)</name>
<values>
<entry>
<string>Color</string>
<awt-color hex="f7f7ef"/>
</entry>
<entry>
<string>Mount</string>
<diylc.tube.TubeSocket_-Mount>CHASSIS</diylc.tube.TubeSocket_-Mount>
</entry>
<entry>
<string>Label</string>
<awt-color hex="acaca7"/>
</entry>
<entry>
<string>Electrode Labels</string>
<string>IS,H,P,S,G,n/c,H,C</string>
</entry>
<entry>
<string>Base</string>
<diylc.tube.TubeSocket_-Base>OCTAL</diylc.tube.TubeSocket_-Base>
</entry>
</values>
<points>
<point x="0.0" y="0.0"/>
<point x="0.315" y="0.13"/>
<point x="0.13" y="0.315"/>
<point x="-0.13" y="0.315"/>
<point x="-0.315" y="0.13"/>
<point x="-0.315" y="-0.13"/>
<point x="-0.13" y="-0.315"/>
<point x="0.13" y="-0.315"/>
<point x="0.315" y="-0.13"/>
</points>
<defaultFlag>false</defaultFlag>
<createdOn>2022-10-30T13:25:15.3894874</createdOn>
<deletedOn>2026-11-02T14:00:00</deletedOn>
</org.diylc.core.Template>
</list>
</entry>
@@ -2984,183 +2779,43 @@
<list>
<org.diylc.core.Template>
<name>HS10</name>
<values>
<entry><string>Value</string><null/></entry>
<entry><string>Power Rating</string><org.diylc.core.measures.Power value="10.0" unit="W"/></entry>
<entry><string>Length</string><org.diylc.core.measures.Size value="15.9" unit="mm"/></entry>
<entry><string>Width</string><org.diylc.core.measures.Size value="16.5" unit="mm"/></entry>
<entry><string>Lead Length</string><org.diylc.core.measures.Size value="7.05" unit="mm"/></entry>
<entry><string>Lip Width</string><org.diylc.core.measures.Size value="4.1" unit="mm"/></entry>
<entry><string>Mounting Holes</string><diylc.passive.HeatSinkResistor_-MountingHoleCount>TWO_DIAGONAL</diylc.passive.HeatSinkResistor_-MountingHoleCount></entry>
<entry><string>Hole Spacing</string><org.diylc.core.measures.Size value="11.3" unit="mm"/></entry>
<entry><string>Hole Diameter</string><org.diylc.core.measures.Size value="2.4" unit="mm"/></entry>
<entry><string>Lead Diameter</string><org.diylc.core.measures.Size value="2.0" unit="mm"/></entry>
</values>
<points><point x="0.0" y="0.0"/><point x="1.181" y="0.0"/></points>
<defaultFlag>false</defaultFlag>
<createdOn>2026-04-02T18:38:00.0000000</createdOn>
<deletedOn>2026-11-04T12:00:00</deletedOn>
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>HS15</name>
<values>
<entry><string>Value</string><null/></entry>
<entry><string>Power Rating</string><org.diylc.core.measures.Power value="15.0" unit="W"/></entry>
<entry><string>Length</string><org.diylc.core.measures.Size value="19.9" unit="mm"/></entry>
<entry><string>Width</string><org.diylc.core.measures.Size value="21.0" unit="mm"/></entry>
<entry><string>Lead Length</string><org.diylc.core.measures.Size value="8.3" unit="mm"/></entry>
<entry><string>Lip Width</string><org.diylc.core.measures.Size value="5.1" unit="mm"/></entry>
<entry><string>Mounting Holes</string><diylc.passive.HeatSinkResistor_-MountingHoleCount>TWO_DIAGONAL</diylc.passive.HeatSinkResistor_-MountingHoleCount></entry>
<entry><string>Hole Spacing</string><org.diylc.core.measures.Size value="14.3" unit="mm"/></entry>
<entry><string>Hole Diameter</string><org.diylc.core.measures.Size value="2.4" unit="mm"/></entry>
<entry><string>Lead Diameter</string><org.diylc.core.measures.Size value="2.0" unit="mm"/></entry>
</values>
<points><point x="0.0" y="0.0"/><point x="1.437" y="0.0"/></points>
<defaultFlag>false</defaultFlag>
<createdOn>2026-04-02T18:38:00.0000000</createdOn>
<deletedOn>2026-11-04T12:00:00</deletedOn>
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>HS25</name>
<values>
<entry><string>Value</string><null/></entry>
<entry><string>Power Rating</string><org.diylc.core.measures.Power value="25.0" unit="W"/></entry>
<entry><string>Length</string><org.diylc.core.measures.Size value="27.3" unit="mm"/></entry>
<entry><string>Width</string><org.diylc.core.measures.Size value="28.0" unit="mm"/></entry>
<entry><string>Lead Length</string><org.diylc.core.measures.Size value="11.85" unit="mm"/></entry>
<entry><string>Lip Width</string><org.diylc.core.measures.Size value="8.2" unit="mm"/></entry>
<entry><string>Mounting Holes</string><diylc.passive.HeatSinkResistor_-MountingHoleCount>TWO_DIAGONAL</diylc.passive.HeatSinkResistor_-MountingHoleCount></entry>
<entry><string>Hole Spacing</string><org.diylc.core.measures.Size value="18.3" unit="mm"/></entry>
<entry><string>Hole Diameter</string><org.diylc.core.measures.Size value="3.2" unit="mm"/></entry>
<entry><string>Lead Diameter</string><org.diylc.core.measures.Size value="2.0" unit="mm"/></entry>
</values>
<points><point x="0.0" y="0.0"/><point x="2.008" y="0.0"/></points>
<defaultFlag>true</defaultFlag>
<createdOn>2026-04-02T18:38:00.0000000</createdOn>
<deletedOn>2026-11-04T12:00:00</deletedOn>
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>HS50</name>
<values>
<entry><string>Value</string><null/></entry>
<entry><string>Power Rating</string><org.diylc.core.measures.Power value="50.0" unit="W"/></entry>
<entry><string>Length</string><org.diylc.core.measures.Size value="49.1" unit="mm"/></entry>
<entry><string>Width</string><org.diylc.core.measures.Size value="29.7" unit="mm"/></entry>
<entry><string>Lead Length</string><org.diylc.core.measures.Size value="11.7" unit="mm"/></entry>
<entry><string>Lip Width</string><org.diylc.core.measures.Size value="8.3" unit="mm"/></entry>
<entry><string>Mounting Holes</string><diylc.passive.HeatSinkResistor_-MountingHoleCount>TWO_DIAGONAL</diylc.passive.HeatSinkResistor_-MountingHoleCount></entry>
<entry><string>Hole Spacing</string><org.diylc.core.measures.Size value="39.7" unit="mm"/></entry>
<entry><string>Hole Diameter</string><org.diylc.core.measures.Size value="3.2" unit="mm"/></entry>
<entry><string>Lead Diameter</string><org.diylc.core.measures.Size value="2.0" unit="mm"/></entry>
</values>
<points><point x="0.0" y="0.0"/><point x="2.854" y="0.0"/></points>
<defaultFlag>false</defaultFlag>
<createdOn>2026-04-02T18:38:00.0000000</createdOn>
<deletedOn>2026-11-04T12:00:00</deletedOn>
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>HS75</name>
<values>
<entry><string>Value</string><null/></entry>
<entry><string>Power Rating</string><org.diylc.core.measures.Power value="75.0" unit="W"/></entry>
<entry><string>Length</string><org.diylc.core.measures.Size value="48.7" unit="mm"/></entry>
<entry><string>Width</string><org.diylc.core.measures.Size value="47.5" unit="mm"/></entry>
<entry><string>Lead Length</string><org.diylc.core.measures.Size value="11.65" unit="mm"/></entry>
<entry><string>Lip Width</string><org.diylc.core.measures.Size value="10.5" unit="mm"/></entry>
<entry><string>Mounting Holes</string><diylc.passive.HeatSinkResistor_-MountingHoleCount>FOUR</diylc.passive.HeatSinkResistor_-MountingHoleCount></entry>
<entry><string>Hole Spacing</string><org.diylc.core.measures.Size value="29.0" unit="mm"/></entry>
<entry><string>Hole Diameter</string><org.diylc.core.measures.Size value="4.4" unit="mm"/></entry>
<entry><string>Lead Diameter</string><org.diylc.core.measures.Size value="3.2" unit="mm"/></entry>
</values>
<points><point x="0.0" y="0.0"/><point x="2.835" y="0.0"/></points>
<defaultFlag>false</defaultFlag>
<createdOn>2026-04-02T18:38:00.0000000</createdOn>
<deletedOn>2026-11-04T12:00:00</deletedOn>
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>HS100</name>
<values>
<entry><string>Value</string><null/></entry>
<entry><string>Power Rating</string><org.diylc.core.measures.Power value="100.0" unit="W"/></entry>
<entry><string>Length</string><org.diylc.core.measures.Size value="65.2" unit="mm"/></entry>
<entry><string>Width</string><org.diylc.core.measures.Size value="47.5" unit="mm"/></entry>
<entry><string>Lead Length</string><org.diylc.core.measures.Size value="11.4" unit="mm"/></entry>
<entry><string>Lip Width</string><org.diylc.core.measures.Size value="10.5" unit="mm"/></entry>
<entry><string>Mounting Holes</string><diylc.passive.HeatSinkResistor_-MountingHoleCount>FOUR</diylc.passive.HeatSinkResistor_-MountingHoleCount></entry>
<entry><string>Hole Spacing</string><org.diylc.core.measures.Size value="35.0" unit="mm"/></entry>
<entry><string>Hole Diameter</string><org.diylc.core.measures.Size value="4.4" unit="mm"/></entry>
<entry><string>Lead Diameter</string><org.diylc.core.measures.Size value="3.2" unit="mm"/></entry>
</values>
<points><point x="0.0" y="0.0"/><point x="3.465" y="0.0"/></points>
<defaultFlag>false</defaultFlag>
<createdOn>2026-04-02T18:38:00.0000000</createdOn>
<deletedOn>2026-11-04T12:00:00</deletedOn>
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>HS150</name>
<values>
<entry><string>Value</string><null/></entry>
<entry><string>Power Rating</string><org.diylc.core.measures.Power value="150.0" unit="W"/></entry>
<entry><string>Length</string><org.diylc.core.measures.Size value="97.7" unit="mm"/></entry>
<entry><string>Width</string><org.diylc.core.measures.Size value="47.5" unit="mm"/></entry>
<entry><string>Lead Length</string><org.diylc.core.measures.Size value="11.65" unit="mm"/></entry>
<entry><string>Lip Width</string><org.diylc.core.measures.Size value="10.5" unit="mm"/></entry>
<entry><string>Mounting Holes</string><diylc.passive.HeatSinkResistor_-MountingHoleCount>SIX</diylc.passive.HeatSinkResistor_-MountingHoleCount></entry>
<entry><string>Hole Spacing</string><org.diylc.core.measures.Size value="29.0" unit="mm"/></entry>
<entry><string>Hole Diameter</string><org.diylc.core.measures.Size value="4.4" unit="mm"/></entry>
<entry><string>Lead Diameter</string><org.diylc.core.measures.Size value="3.2" unit="mm"/></entry>
</values>
<points><point x="0.0" y="0.0"/><point x="4.764" y="0.0"/></points>
<defaultFlag>false</defaultFlag>
<createdOn>2026-04-02T18:38:00.0000000</createdOn>
<deletedOn>2026-11-04T12:00:00</deletedOn>
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>HS200</name>
<values>
<entry><string>Value</string><null/></entry>
<entry><string>Power Rating</string><org.diylc.core.measures.Power value="200.0" unit="W"/></entry>
<entry><string>Length</string><org.diylc.core.measures.Size value="89.7" unit="mm"/></entry>
<entry><string>Width</string><org.diylc.core.measures.Size value="72.5" unit="mm"/></entry>
<entry><string>Lead Length</string><org.diylc.core.measures.Size value="28.0" unit="mm"/></entry>
<entry><string>Lip Width</string><org.diylc.core.measures.Size value="15.3" unit="mm"/></entry>
<entry><string>Mounting Holes</string><diylc.passive.HeatSinkResistor_-MountingHoleCount>SIX</diylc.passive.HeatSinkResistor_-MountingHoleCount></entry>
<entry><string>Hole Spacing</string><org.diylc.core.measures.Size value="35.0" unit="mm"/></entry>
<entry><string>Hole Diameter</string><org.diylc.core.measures.Size value="5.1" unit="mm"/></entry>
<entry><string>Lead Diameter</string><org.diylc.core.measures.Size value="6.0" unit="mm"/></entry>
</values>
<points><point x="0.0" y="0.0"/><point x="5.736" y="0.0"/></points>
<defaultFlag>false</defaultFlag>
<createdOn>2026-04-02T18:38:00.0000000</createdOn>
<deletedOn>2026-11-04T12:00:00</deletedOn>
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>HS250</name>
<values>
<entry><string>Value</string><null/></entry>
<entry><string>Power Rating</string><org.diylc.core.measures.Power value="250.0" unit="W"/></entry>
<entry><string>Length</string><org.diylc.core.measures.Size value="109.7" unit="mm"/></entry>
<entry><string>Width</string><org.diylc.core.measures.Size value="72.5" unit="mm"/></entry>
<entry><string>Lead Length</string><org.diylc.core.measures.Size value="28.65" unit="mm"/></entry>
<entry><string>Lip Width</string><org.diylc.core.measures.Size value="15.3" unit="mm"/></entry>
<entry><string>Mounting Holes</string><diylc.passive.HeatSinkResistor_-MountingHoleCount>SIX</diylc.passive.HeatSinkResistor_-MountingHoleCount></entry>
<entry><string>Hole Spacing</string><org.diylc.core.measures.Size value="44.5" unit="mm"/></entry>
<entry><string>Hole Diameter</string><org.diylc.core.measures.Size value="5.1" unit="mm"/></entry>
<entry><string>Lead Diameter</string><org.diylc.core.measures.Size value="6.0" unit="mm"/></entry>
</values>
<points><point x="0.0" y="0.0"/><point x="6.575" y="0.0"/></points>
<defaultFlag>false</defaultFlag>
<createdOn>2026-04-02T18:38:00.0000000</createdOn>
<deletedOn>2026-11-04T12:00:00</deletedOn>
</org.diylc.core.Template>
<org.diylc.core.Template>
<name>HS300</name>
<values>
<entry><string>Value</string><null/></entry>
<entry><string>Power Rating</string><org.diylc.core.measures.Power value="300.0" unit="W"/></entry>
<entry><string>Length</string><org.diylc.core.measures.Size value="127.7" unit="mm"/></entry>
<entry><string>Width</string><org.diylc.core.measures.Size value="72.5" unit="mm"/></entry>
<entry><string>Lead Length</string><org.diylc.core.measures.Size value="28.35" unit="mm"/></entry>
<entry><string>Lip Width</string><org.diylc.core.measures.Size value="13.5" unit="mm"/></entry>
<entry><string>Mounting Holes</string><diylc.passive.HeatSinkResistor_-MountingHoleCount>SIX</diylc.passive.HeatSinkResistor_-MountingHoleCount></entry>
<entry><string>Hole Spacing</string><org.diylc.core.measures.Size value="52.0" unit="mm"/></entry>
<entry><string>Hole Diameter</string><org.diylc.core.measures.Size value="6.6" unit="mm"/></entry>
<entry><string>Lead Diameter</string><org.diylc.core.measures.Size value="6.0" unit="mm"/></entry>
</values>
<points><point x="0.0" y="0.0"/><point x="7.260" y="0.0"/></points>
<defaultFlag>false</defaultFlag>
<createdOn>2026-04-02T18:38:00.0000000</createdOn>
<deletedOn>2026-11-04T12:00:00</deletedOn>
</org.diylc.core.Template>
</list>
</entry>
+72 -8
View File
@@ -502,7 +502,7 @@
<minor>10</minor>
<build>0</build>
</versionNumber>
<releaseDate>2026-10-30 00:00:00.000 CET</releaseDate>
<releaseDate>2026-11-06 00:00:00.000 CET</releaseDate>
<name></name>
<changes>
<org.diylc.appframework.update.Change>
@@ -514,16 +514,32 @@
<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>
<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>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>
<description>Added datasheets to 'Transistor (TO-92)', 'Transistor (TO-1)', 'Transistor (TO-126)', 'Transistor (TO-220)' and 'Transistor (TO-3)' - pick a part by its number from the component's submenu to set its value and pinout at once - more than 250 transistors, JFETs, MOSFETs and voltage regulators used in guitar effects, hi-fi, radio and synth projects; 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>Added 'Pinout' property to 'Transistor (TO-3)' and a terminal in the mounting hole next to the pins, so the case (collector) can be wired and shows up in netlists and AI analysis</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>NEW_FEATURE</changeType>
<description>Added a datasheet to 'Tube Socket' - pick a tube by its type from the component's submenu to set its base and electrode labels at once - more than 180 preamp, power, rectifier, radio, space-charge and Soviet tubes; the AI Assistant can place these tubes by type too</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>NEW_FEATURE</changeType>
<description>Added the UX4 base to 'Tube Socket', with the 300B, 2A3, 6A3 and 45 triodes and the 5Z3 rectifier in its datasheet</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>NEW_FEATURE</changeType>
<description>Added datasheets to 'Diode (plastic)' and 'Diode (glass)' - pick a part by its number from the component's submenu to draw it at its real package size and colours - more than 300 rectifiers, Schottky, signal, germanium and zener diodes, including the Japanese clippers of classic overdrive pedals; 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>Added 'Pin Names', 'Pin Labels' and 'Thickness' to 'Sub-Mini Tube' to name each lead and draw flat bulbs, and a datasheet with popular Western and Soviet sub-miniature tubes such as 6021, 6111, 5840, 5672, 6N16B and 6N17B that sets leads, bulb size and lead names at once</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>NEW_FEATURE</changeType>
@@ -533,10 +549,42 @@
<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>NEW_FEATURE</changeType>
<description>Datasheet models in a component's drop-down menu now have the same pin as saved variants, so a model such as a 2N3904 can be made the default that is placed when the component is clicked; a component has one default, so pinning a model replaces a pinned variant and the other way round</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>IMPROVEMENT</changeType>
<description>Re-modeled factory variants of 'Resistor' and 'Heat Sink Resistor' component types as datasheets 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>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>IMPROVEMENT</changeType>
<description>Pins of transistors, 'SIP IC', 'DIP Switch' and 'Bridge Rectifier' are now drawn on top of the body, so they stay visible whatever the body transparency, and pins are drawn in the same color on every component, including 'DIP IC', 'Bridge Rectifier', 'LED Bar Graph', trimmers and PCB-mounted 'Tube Socket'</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>IMPROVEMENT</changeType>
<description>'Electrode Labels' of 'Tube Socket' is now called 'Pin Names', as on ICs, and the new 'Pin Labels' property shows pin names, pin numbers or nothing</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>IMPROVEMENT</changeType>
<description>Added B-E-C, C-E-B and S-D-G transistor pinouts and ADJ-IN-OUT, IN-OUT-GND and IN-OUT-ADJ regulator pinouts</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>IMPROVEMENT</changeType>
<description>The '+N' variant count next to a component in the component tree is now a button - click it to pick one of the component's variants or datasheet parts from a drop-down menu, without having to right-click the component</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>IMPROVEMENT</changeType>
<description>'Transistor (TO-1)' now shows the tab on the rim of the metal can next to pin 1, as on the real part, so the orientation is easy to tell at a glance; turn it off with the new 'Flange' property</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>
@@ -553,6 +601,22 @@
<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>
<org.diylc.appframework.update.Change>
<changeType>BUG_FIX</changeType>
<description>SPICE netlists listed the pins of transistors with E-C-B pinout in the wrong order</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>BUG_FIX</changeType>
<description>'Tube Socket' variants with electrode labels connected pins that share a label in netlists and AI analysis, e.g. both anodes of a 12AX7 or both heater ends; these variants are replaced by the datasheet</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>BUG_FIX</changeType>
<description>'Tube Socket' with a Noval, 7-pin or Duodecar base on a chassis mount did not rotate its mounting notches with the pins when 'Angle' was changed</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>BUG_FIX</changeType>
<description>'Sub-Mini Tube' with circular leads numbered the body centre as lead 1 in netlists and AI analysis, so every real lead was reported one number too high</description>
</org.diylc.appframework.update.Change>
</changes>
<url>https://github.com/bancika/diy-layout-creator/releases</url>
</org.diylc.appframework.update.Version>
@@ -0,0 +1,86 @@
/*
*
* 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.netlist;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import org.diylc.testcomponents.OnePointTestComponent;
import org.diylc.testcomponents.SwitchTestComponent;
public class NetlistSortingTest {
@Test
public void namesDifferingOnlyInCaseSortTheSameEitherWay() {
Node lower = new Node(new OnePointTestComponent("1k 2w", "2", new Point2D.Double(0, 0)), 0);
Node upper = new Node(new OnePointTestComponent("1k 2W", "2", new Point2D.Double(0, 0)), 0);
Assert.assertEquals(sorted(lower, upper), sorted(upper, lower));
}
@Test
public void sameNamedPartsSortByLocation() {
Node top = new Node(new OnePointTestComponent("R1", "1", new Point2D.Double(50, 0)), 0);
Node bottom = new Node(new OnePointTestComponent("R1", "1", new Point2D.Double(0, 10)), 0);
Assert.assertEquals(Arrays.asList(top, bottom), sorted(bottom, top));
Assert.assertEquals(Arrays.asList(top, bottom), sorted(top, bottom));
}
@Test
public void sameNamedSwitchesKeepTheirPlaceInASetup() {
SwitchTestComponent upper = switchAt(0);
SwitchTestComponent lower = switchAt(10);
SwitchSetup upperOn = setup(new Position(lower, 1), new Position(upper, 0));
SwitchSetup lowerOn = setup(new Position(upper, 1), new Position(lower, 0));
Assert.assertEquals("SW1.ON:SW1.OFF", upperOn.toString());
Assert.assertEquals("SW1.OFF:SW1.ON", lowerOn.toString());
Assert.assertEquals(-Integer.signum(lowerOn.compareTo(upperOn)),
Integer.signum(upperOn.compareTo(lowerOn)));
Assert.assertNotEquals(0, upperOn.compareTo(lowerOn));
}
private static List<Node> sorted(Node... nodes) {
List<Node> list = new ArrayList<Node>(Arrays.asList(nodes));
Collections.sort(list);
return list;
}
private static SwitchTestComponent switchAt(double y) {
SwitchTestComponent component = new SwitchTestComponent("SW1");
component.setControlPoint(new Point2D.Double(0, y), 0);
component.setControlPoint(new Point2D.Double(10, y), 1);
return component;
}
private static SwitchSetup setup(Position... positions) {
return new SwitchSetup(new ArrayList<Position>(Arrays.asList(positions)));
}
}
@@ -87,6 +87,8 @@ public class NodeNameTest {
public void railNameRejectsPinsThatNameNoNet() {
Assert.assertNull(Node.railName("NC_1"));
Assert.assertNull(Node.railName("RSV_2"));
// a tube pin marked "internal connection" must not be used as a tie point
Assert.assertNull(Node.railName("IC"));
Assert.assertNull(Node.railName(null));
}
@@ -0,0 +1,246 @@
/*
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.presenter;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.awt.geom.Point2D;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.diylc.appframework.miscutils.IConfigListener;
import org.diylc.appframework.miscutils.IConfigurationManager;
import org.diylc.common.BuildingBlock;
import org.diylc.common.IBlockProcessor;
import org.diylc.common.IPlugInPort;
import org.diylc.core.IDIYComponent;
import org.diylc.testcomponents.TwoPointTestComponent;
import org.junit.Before;
import org.junit.Test;
/**
* Covers {@link BuildingBlockManager#importDefaultBlocks(List)}: factory blocks reach existing
* users by their {@code createdOn}, withdrawn ones leave by their {@code deletedOn}, and the
* recorded import date comes from the bundled file rather than the clock.
*/
public class DefaultBlockImportTest {
private static final LocalDateTime OLDER_RELEASE = LocalDateTime.of(2026, 1, 1, 0, 0);
private static final LocalDateTime NEWER_RELEASE = LocalDateTime.of(2026, 6, 1, 0, 0);
private MapConfigurationManager configManager;
private BuildingBlockManager manager;
@Before
public void setUp() {
configManager = new MapConfigurationManager();
manager = new BuildingBlockManager(configManager, null, null);
}
@Test
public void freshInstallImportsEveryBlock() {
manager.importDefaultBlocks(
Arrays.asList(block("Old", OLDER_RELEASE), block("New", NEWER_RELEASE)));
assertTrue(blocks().containsKey("Old"));
assertTrue(blocks().containsKey("New"));
assertEquals(NEWER_RELEASE, importDate());
assertTrue(configManager.readBoolean(IPlugInPort.DEFAULT_BLOCKS_IMPORTED_KEY, false));
}
@Test
public void configFromTheOneTimeImportGetsTheMissingBlocksWithoutDuplicates() {
List<IDIYComponent<?>> kept = components();
Map<String, List<IDIYComponent<?>>> userBlocks = new HashMap<String, List<IDIYComponent<?>>>();
userBlocks.put("Old", kept);
configManager.writeValue(IPlugInPort.BLOCKS_KEY, userBlocks);
configManager.writeValue(IPlugInPort.DEFAULT_BLOCKS_IMPORTED_KEY, true);
manager.importDefaultBlocks(
Arrays.asList(block("Old", OLDER_RELEASE), block("New", OLDER_RELEASE)));
assertEquals(2, blocks().size());
assertSame(kept, blocks().get("Old"));
assertTrue(blocks().containsKey("New"));
}
@Test
public void blockOfANewerReleaseArrivesAfterAnOlderReleaseRanFirst() {
manager.importDefaultBlocks(Arrays.asList(block("Old", OLDER_RELEASE)));
manager.importDefaultBlocks(
Arrays.asList(block("Old", OLDER_RELEASE), block("New", NEWER_RELEASE)));
assertTrue(blocks().containsKey("New"));
assertEquals(NEWER_RELEASE, importDate());
}
@Test
public void olderReleaseRunAfterANewerOneLeavesTheImportDate() {
manager.importDefaultBlocks(
Arrays.asList(block("Old", OLDER_RELEASE), block("New", NEWER_RELEASE)));
manager.importDefaultBlocks(Arrays.asList(block("Old", OLDER_RELEASE)));
assertEquals(NEWER_RELEASE, importDate());
}
@Test
public void factoryBlockDeletedByTheUserIsNotImportedAgain() {
manager.importDefaultBlocks(Arrays.asList(block("Old", OLDER_RELEASE)));
blocks().remove("Old");
manager.importDefaultBlocks(Arrays.asList(block("Old", OLDER_RELEASE)));
assertFalse(blocks().containsKey("Old"));
}
@Test
public void userBlockOfTheSameNameIsKept() {
List<IDIYComponent<?>> own = components();
Map<String, List<IDIYComponent<?>>> userBlocks = new HashMap<String, List<IDIYComponent<?>>>();
userBlocks.put("New", own);
configManager.writeValue(IPlugInPort.BLOCKS_KEY, userBlocks);
manager.importDefaultBlocks(Arrays.asList(block("New", OLDER_RELEASE)));
assertSame(own, blocks().get("New"));
}
@Test
public void withdrawnBlockIsRemovedFromTheRecentlyUsedListToo() {
manager.importDefaultBlocks(Arrays.asList(block("Old", OLDER_RELEASE)));
List<String> recent =
new ArrayList<String>(Arrays.asList(IBlockProcessor.BLOCK_PREFIX + "Old"));
configManager.writeValue(IPlugInPort.RECENT_COMPONENTS_KEY, recent);
manager.importDefaultBlocks(Arrays.asList(withdrawn("Old", NEWER_RELEASE)));
assertFalse(blocks().containsKey("Old"));
assertTrue(recent.isEmpty());
assertEquals(NEWER_RELEASE, importDate());
}
@Test
public void blockRecreatedByTheUserAfterTheWithdrawalIsKept() {
manager.importDefaultBlocks(Arrays.asList(withdrawn("Old", OLDER_RELEASE)));
blocks().put("Old", components());
manager.importDefaultBlocks(Arrays.asList(withdrawn("Old", OLDER_RELEASE)));
assertTrue(blocks().containsKey("Old"));
}
@Test
public void blockCreatedAndWithdrawnSinceTheLastImportNeverArrives() {
BuildingBlock shortLived = withdrawn("Short-lived", NEWER_RELEASE);
shortLived.setCreatedOn(OLDER_RELEASE);
manager.importDefaultBlocks(Arrays.asList(shortLived));
assertFalse(blocks().containsKey("Short-lived"));
}
@SuppressWarnings("unchecked")
private Map<String, List<IDIYComponent<?>>> blocks() {
return (Map<String, List<IDIYComponent<?>>>) configManager.readObject(IPlugInPort.BLOCKS_KEY,
null);
}
private LocalDateTime importDate() {
return (LocalDateTime) configManager.readObject(IPlugInPort.DEFAULT_BLOCKS_IMPORT_DATE_KEY,
null);
}
private static List<IDIYComponent<?>> components() {
return new ArrayList<IDIYComponent<?>>(Arrays.asList(
new TwoPointTestComponent("R1", new Point2D.Double(0, 0), new Point2D.Double(10, 0))));
}
private static BuildingBlock block(String name, LocalDateTime createdOn) {
BuildingBlock block = new BuildingBlock(name, components());
block.setCreatedOn(createdOn);
return block;
}
private static BuildingBlock withdrawn(String name, LocalDateTime deletedOn) {
BuildingBlock block = new BuildingBlock(name, null);
block.setDeletedOn(deletedOn);
return block;
}
private static class MapConfigurationManager 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) readObject(key, defaultValue);
}
@Override
public String readString(String key, String defaultValue) {
return (String) readObject(key, defaultValue);
}
@Override
public int readInt(String key, int defaultValue) {
return (Integer) readObject(key, defaultValue);
}
@Override
public float readFloat(String key, float defaultValue) {
return (Float) readObject(key, defaultValue);
}
@Override
public double readDouble(String key, double defaultValue) {
return (Double) readObject(key, defaultValue);
}
@Override
public Object readObject(String key, Object defaultValue) {
return values.containsKey(key) ? values.get(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) {}
}
}
@@ -0,0 +1,191 @@
/*
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.presenter;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.diylc.appframework.miscutils.IConfigListener;
import org.diylc.appframework.miscutils.IConfigurationManager;
import org.diylc.common.ComponentType;
import org.diylc.common.IPlugInPort;
import org.diylc.core.CreationMethod;
import org.diylc.core.annotations.BomPolicy;
import org.diylc.core.annotations.KeywordPolicy;
import org.diylc.testcomponents.TwoPointTestComponent;
import org.junit.Before;
import org.junit.Test;
/**
* Covers the single default slot that variants and datasheet models share, see
* {@code docs/plans/default-datasheet-model.md}.
*/
public class VariantManagerTest {
private static final String[] NPN = new String[] {"BJT (NPN)", "2N3904", "BJT_EBC"};
private static final String[] PNP = new String[] {"BJT (PNP)", "2N3906", "BJT_EBC"};
private MapConfigurationManager configManager;
private ComponentType type;
private VariantManager manager;
@Before
public void setUp() {
configManager = new MapConfigurationManager();
type = createType(new ArrayList<String[]>(Arrays.asList(NPN, PNP)));
manager = new VariantManager(configManager, null);
}
@Test
public void pinningAModelMakesItTheDefault() {
manager.setDefaultModel(type, NPN);
assertTrue(manager.isDefaultModel(type, NPN));
assertFalse(manager.isDefaultModel(type, PNP));
assertArrayEquals(NPN, manager.getDefaultModel(type));
assertEquals("datasheet:BJT (NPN)|2N3904", manager.getDefaultVariant(type));
}
@Test
public void pinningTheDefaultModelAgainClearsIt() {
manager.setDefaultModel(type, NPN);
manager.setDefaultModel(type, NPN);
assertFalse(manager.isDefaultModel(type, NPN));
assertNull(manager.getDefaultModel(type));
assertNull(manager.getDefaultVariant(type));
}
@Test
public void pinningAnotherModelReplacesTheDefault() {
manager.setDefaultModel(type, NPN);
manager.setDefaultModel(type, PNP);
assertFalse(manager.isDefaultModel(type, NPN));
assertArrayEquals(PNP, manager.getDefaultModel(type));
}
@Test
public void modelAndVariantReplaceEachOther() {
manager.setDefaultVariant(type, "My variant");
manager.setDefaultModel(type, NPN);
assertArrayEquals(NPN, manager.getDefaultModel(type));
manager.setDefaultVariant(type, "My variant");
assertEquals("My variant", manager.getDefaultVariant(type));
assertNull(manager.getDefaultModel(type));
}
@Test
public void modelMissingFromTheDatasheetIsNoDefault() {
manager.setDefaultModel(type, NPN);
ComponentType reduced = createType(new ArrayList<String[]>(Arrays.<String[]>asList(PNP)));
assertNull(manager.getDefaultModel(reduced));
}
@Test
public void legacyKeyIsReadAndReplacedOnWrite() {
String legacyKey = type.getCategory() + "." + type.getName();
Map<String, String> defaults = new HashMap<String, String>();
defaults.put(legacyKey, "Old variant");
configManager.writeValue(IPlugInPort.DEFAULT_TEMPLATES_KEY, defaults);
assertEquals("Old variant", manager.getDefaultVariant(type));
manager.setDefaultModel(type, PNP);
@SuppressWarnings("unchecked")
Map<String, String> written = (Map<String, String>) configManager
.readObject(IPlugInPort.DEFAULT_TEMPLATES_KEY, null);
assertFalse(written.containsKey(legacyKey));
assertArrayEquals(PNP, manager.getDefaultModel(type));
}
private static ComponentType createType(List<String[]> datasheet) {
return new ComponentType("Test Transistor", "", CreationMethod.SINGLE_CLICK, "Test", "Q", "",
null, TwoPointTestComponent.class, 0, false, BomPolicy.SHOW_ALL_NAMES, false, null,
KeywordPolicy.NEVER_SHOW, null, false, datasheet, 2);
}
private static class MapConfigurationManager 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) readObject(key, defaultValue);
}
@Override
public String readString(String key, String defaultValue) {
return (String) readObject(key, defaultValue);
}
@Override
public int readInt(String key, int defaultValue) {
return (Integer) readObject(key, defaultValue);
}
@Override
public float readFloat(String key, float defaultValue) {
return (Float) readObject(key, defaultValue);
}
@Override
public double readDouble(String key, double defaultValue) {
return (Double) readObject(key, defaultValue);
}
@Override
public Object readObject(String key, Object defaultValue) {
return values.containsKey(key) ? values.get(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) {}
}
}
+1 -1
View File
@@ -7,7 +7,7 @@
<parent>
<groupId>org.diylc</groupId>
<artifactId>diylc-parent</artifactId>
<version>6.9.0</version>
<version>6.10.0</version>
</parent>
<artifactId>diylc-library</artifactId>
@@ -64,8 +64,6 @@ public abstract class AbstractMakerBoard extends AbstractTransparentComponent<Vo
public static final Color ESP_BLACK = Color.decode("#3E3E3E");
public static final Color WEMOS_BLUE = Color.decode("#006699");
public static Color PIN_COLOR = Color.decode("#00B2EE");
public static Color PIN_BORDER_COLOR = PIN_COLOR.darker();
public static Color HEADER_BODY_COLOR = Color.decode("#222222");
public static Color HEADER_BORDER_COLOR = Color.decode("#111111");
public static Color MOUNTING_HOLE_COLOR = Color.decode("#B8860B");
@@ -74,8 +74,6 @@ public class LEDBarGraph extends AbstractLabeledComponent<String> {
public static Color BODY_COLOR = Color.decode("#2B2B2B");
public static Color BORDER_COLOR = Color.decode("#1A1A1A");
public static Color PIN_COLOR = METAL_COLOR;
public static Color PIN_BORDER_COLOR = PIN_COLOR.darker();
// A bar graph is a scale, not a lamp: green most of the way up, yellow for the last two and
// red for the topmost, as on a level or VU meter.
public static Color SEGMENT_GREEN = Color.decode("#43A047");
@@ -59,8 +59,6 @@ public class DIPSwitch extends AbstractTransparentComponent<String> implements I
public static Color BODY_COLOR = Color.decode("#E84E46");
public static Color BORDER_COLOR = BODY_COLOR.darker();
public static Color PIN_COLOR = Color.decode("#00B2EE");
public static Color PIN_BORDER_COLOR = PIN_COLOR.darker();
public static Color TICK_COLOR = Color.white;
public static Color LABEL_COLOR = Color.white;
public static int EDGE_RADIUS = 2;
@@ -330,23 +328,6 @@ public class DIPSwitch extends AbstractTransparentComponent<String> implements I
}
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1));
Area mainArea = getBody()[0];
if (!outlineMode) {
int pinSize = (int) PIN_SIZE.convertToPixels() / 2 * 2;
for (Point2D point : controlPoints) {
g2d.setColor(PIN_COLOR);
int pinWidth = getClosestOdd(pinSize
/ (getOrientation() == Orientation.DEFAULT || getOrientation() == Orientation._180 ? 2f
: 1f));
int pinHeight = getClosestOdd(pinSize
/ (getOrientation() == Orientation.DEFAULT || getOrientation() == Orientation._180 ? 1f
: 2f));
g2d.fillRect((int) Math.round(point.getX() - pinWidth / 2), (int) Math.round(point.getY() - pinHeight / 2),
pinWidth, pinHeight);
g2d.setColor(PIN_BORDER_COLOR);
g2d.drawRect((int) Math.round(point.getX() - pinWidth / 2), (int) Math.round(point.getY() - pinHeight / 2),
pinWidth, pinHeight);
}
}
Composite oldComposite = applyAlpha(g2d, componentState);
g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : getBodyColor());
g2d.fill(mainArea);
@@ -390,6 +371,30 @@ public class DIPSwitch extends AbstractTransparentComponent<String> implements I
}
}
// the pins sit under the body, so they are drawn over it to stay visible whatever its alpha
int pinSize = (int) PIN_SIZE.convertToPixels() / 2 * 2;
int pinWidth = getClosestOdd(pinSize
/ (getOrientation() == Orientation.DEFAULT || getOrientation() == Orientation._180 ? 2f
: 1f));
int pinHeight = getClosestOdd(pinSize
/ (getOrientation() == Orientation.DEFAULT || getOrientation() == Orientation._180 ? 1f
: 2f));
Color pinBorderColor = outlineMode ? ((Theme) ConfigurationManager.getInstance()
.readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME)).getOutlineColor()
: PIN_BORDER_COLOR;
for (Point2D point : controlPoints) {
int pinX = (int) Math.round(point.getX() - pinWidth / 2);
int pinY = (int) Math.round(point.getY() - pinHeight / 2);
if (!outlineMode) {
g2d.setColor(PIN_COLOR);
drawingObserver.startTracking();
g2d.fillRect(pinX, pinY, pinWidth, pinHeight);
drawingObserver.stopTracking();
}
g2d.setColor(pinBorderColor);
g2d.drawRect(pinX, pinY, pinWidth, pinHeight);
}
// Draw label.
g2d.setFont(project.getFont());
Color finalLabelColor;
@@ -64,8 +64,6 @@ public class MiniRelay extends AbstractLabeledComponent<String> implements IGerb
public static Color BODY_COLOR = Color.gray;
public static Color BORDER_COLOR = Color.gray.darker();
public static Color PIN_COLOR = Color.decode("#00B2EE");
public static Color PIN_BORDER_COLOR = PIN_COLOR.darker();
public static Color INDENT_COLOR = Color.gray.darker();
public static Color LABEL_COLOR = Color.white;
public static int EDGE_RADIUS = 6;
@@ -60,8 +60,6 @@ public class PinHeader extends AbstractTransparentComponent<Void> {
private static final long serialVersionUID = 1L;
public static Color BODY_COLOR = Color.gray;
public static Color PIN_COLOR = Color.decode("#00B2EE");
public static Color PIN_BORDER_COLOR = PIN_COLOR.darker();
public static Color INDENT_COLOR = Color.gray.darker();
public static Size PIN_SIZE = new Size(0.03d, SizeUnit.in);
public static Size INDENT_SIZE = new Size(0.1d, SizeUnit.in);
@@ -57,8 +57,6 @@ public class TactileMicroSwitch extends AbstractLabeledComponent<String> impleme
private static final Color BODY_COLOR = Color.lightGray;
private static final Color BORDER_COLOR = Color.gray.darker();
private static final Color PIN_COLOR = METAL_COLOR;
private static final Color PIN_BORDER_COLOR = PIN_COLOR.darker();
private static final Color INDENT_COLOR = Color.gray.darker();
private static final Color LABEL_COLOR = Color.white;
private static final Size PIN_SIZE = new Size(0.04d, SizeUnit.in);
@@ -56,8 +56,6 @@ public class ThonkJack3_5 extends AbstractTransparentComponent<String> {
private static Color SHAFT_COLOR = Color.lightGray;
private static Color SHAFT_BORDER_COLOR = SHAFT_COLOR.darker();
private static Color HOLE_COLOR = Color.decode("#111111");
public static Color PIN_COLOR = METAL_COLOR;
public static Color PIN_BORDER_COLOR = PIN_COLOR.darker();
public static Size PIN_SIZE = new Size(0.03d, SizeUnit.in);
protected static Display DISPLAY = Display.NAME;
@@ -70,8 +70,6 @@ public class AudioTransformer extends AbstractMultiPartComponent<String> impleme
public static Color CORE_BORDER_COLOR = CORE_COLOR.darker();
public static Color COIL_COLOR = Color.decode("#DDDDDD");
public static Color COIL_BORDER_COLOR = COIL_COLOR.darker();
public static Color PIN_COLOR = Color.decode("#00B2EE");
public static Color PIN_BORDER_COLOR = PIN_COLOR.darker();
public static Color LABEL_COLOR = Color.white;
public static int EDGE_RADIUS = 6;
public static Size PIN_SIZE = new Size(0.03d, SizeUnit.in);
@@ -59,7 +59,6 @@ public class BoxTrimmer extends AbstractTransparentComponent<Resistance> {
public static Size BODY_LENGTH = new Size(0.375d, SizeUnit.in); // 9.53mm from datasheet
public static Color BODY_COLOR = Color.decode("#4477BB");
public static Color BORDER_COLOR = BODY_COLOR.darker();
public static Color PIN_COLOR = METAL_COLOR;
public static Color SCREW_COLOR = BRASS_COLOR;
protected String name;
private Resistance value = new Resistance(10d, ResistanceUnit.K);
@@ -245,7 +244,7 @@ public class BoxTrimmer extends AbstractTransparentComponent<Resistance> {
g2d.drawLine(bodyX + 2 + screwSize / 2 - slotLen / 2, bodyY,
bodyX + 2 + screwSize / 2 + slotLen / 2, bodyY);
// Draw three pins at bottom (light gray)
// Draw three pins at bottom
g2d.setColor(PIN_COLOR);
int pinSpacing = bodyWidth / 4;
for (int i = 0; i < 3; i++) {
@@ -40,6 +40,8 @@ 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;
import org.diylc.core.annotations.PositiveMeasureValidator;
@@ -54,11 +56,14 @@ import org.diylc.core.Project;
import org.diylc.core.Theme;
import org.diylc.utils.Constants;
@AiNote("A datasheet model is an Arcol HS part such as HS25 or HS100 and sets 'Power Rating' and the whole housing - body size, lips, mounting holes, lead length and diameter - but never the resistance; set 'Value' separately")
@ComponentDescriptor(name = "Heat Sink Resistor", author = "Branislav Stojkovic", category = "Passive",
creationMethod = CreationMethod.SINGLE_CLICK, instanceNamePrefix = "R",
description = "Power resistor with heatsink; similar to Arcol HS series",
zOrder = IDIYComponent.COMPONENT, transformer = SimpleComponentTransformer.class, enableCache = true)
public class HeatSinkResistor extends AbstractLeadedComponent<Resistance> implements IGerberComponentSimple {
zOrder = IDIYComponent.COMPONENT, transformer = SimpleComponentTransformer.class, enableCache = true,
enableDatasheet = true, datasheetCreationStepCount = 2, datasheetModelColumn = 1)
public class HeatSinkResistor extends AbstractLeadedComponent<Resistance>
implements IGerberComponentSimple, IDatasheetSupport {
private static final long serialVersionUID = 1L;
@@ -107,6 +112,37 @@ public class HeatSinkResistor extends AbstractLeadedComponent<Resistance> implem
leadLength = DEFAULT_LEAD_LENGTH;
}
public HeatSinkResistor(String[] model) {
this();
applyModel(model);
}
// columns: series, part, power, body length, total width, lead length, lip width, mounting holes,
// hole spacing, hole diameter, lead diameter; the resistance is not part of a row because the
// housing depends only on the part
@Override
public void applyModel(String[] model) {
setPower(Power.parseCapacitance(model[2]));
setLength(Size.parseSize(model[3]));
setWidth(Size.parseSize(model[4]));
setLeadLength(Size.parseSize(model[5]));
setLipSize(Size.parseSize(model[6]));
setMountingHoles(parseMountingHoles(model[7]));
setHorizontalHoleSpacing(Size.parseSize(model[8]));
setMountingHoleDiameter(Size.parseSize(model[9]));
setTerminalLeadDiameter(Size.parseSize(model[10]));
}
private static MountingHoleCount parseMountingHoles(String label) {
for (MountingHoleCount value : MountingHoleCount.values()) {
if (value.toString().equalsIgnoreCase(label)) {
return value;
}
}
throw new IllegalArgumentException("Unknown mounting holes: " + label);
}
private MountingHoleCount holeCount() {
return mountingHoles == null ? MountingHoleCount.TWO_DIAGONAL : mountingHoles;
}
@@ -59,8 +59,6 @@ public class MiniaturePotentiometer extends AbstractPotentiometer {
private static Color BORDER_COLOR = BODY_COLOR.darker();
private static Color SHAFT_COLOR = Color.lightGray;
private static Color SHAFT_BORDER_COLOR = SHAFT_COLOR.darker();
public static Color PIN_COLOR = METAL_COLOR;
public static Color PIN_BORDER_COLOR = PIN_COLOR.darker();
public static Size PIN_SIZE = new Size(0.03d, SizeUnit.in);
protected static Display DISPLAY = Display.NAME;
@@ -319,9 +317,9 @@ public class MiniaturePotentiometer extends AbstractPotentiometer {
if (!outlineMode) {
if (bracket != null) {
g2d.setColor(PIN_COLOR);
g2d.setColor(METAL_COLOR);
g2d.fill(bracket);
g2d.setColor(PIN_BORDER_COLOR);
g2d.setColor(METAL_COLOR.darker());
g2d.draw(bracket);
}
if (rivet1 != null) {
@@ -70,8 +70,7 @@ public class MultiSectionCapacitor extends AbstractLabeledComponent<Capacitance[
public static Color BODY_COLOR = Color.decode("#6B6DCE");
public static Color BASE_COLOR = Color.decode("#333333");
public static Color BORDER_COLOR = BODY_COLOR.darker();
public static Color PIN_COLOR = METAL_COLOR;// Color.decode("#00B2EE");
// public static Color PIN_BORDER_COLOR = PIN_COLOR.darker();
public static Color TERMINAL_COLOR = METAL_COLOR;
public static Color LABEL_COLOR = Color.white;
public static Size PIN_SIZE = new Size(0.08d, SizeUnit.in);
// public static Size PIN_SPACING = new Size(0.05d, SizeUnit.in);
@@ -89,7 +88,7 @@ public class MultiSectionCapacitor extends AbstractLabeledComponent<Capacitance[
private Color baseColor = BASE_COLOR;
private Color borderColor = BORDER_COLOR;
private Color labelColor = LABEL_COLOR;
private Color pinColor = PIN_COLOR;
private Color pinColor = TERMINAL_COLOR;
protected Display display = Display.NAME;
// private Size pinSpacing = PIN_SPACING;
private Size diameter = BODY_DIAMETER;
@@ -455,7 +454,7 @@ public class MultiSectionCapacitor extends AbstractLabeledComponent<Capacitance[
margin = 6 * width / 32;
area = new Area(new Ellipse2D.Double(margin, margin, width - 2 * margin + 1, width - 2 * margin + 1));
g2d.fill(area);
g2d.setColor(PIN_COLOR);
g2d.setColor(TERMINAL_COLOR);
int pinSize = 2 * width / 32;
for (int i = 0; i < 3; i++) {
g2d.fillOval((i == 1 ? width * 3 / 8 : width / 2) - pinSize / 2, height / 2 + (i - 1) * (height / 5), pinSize, pinSize);
@@ -71,8 +71,6 @@ public class TrimmerPotentiometer extends AbstractPotentiometer {
private static Color BORDER_COLOR = Color.decode("#8E8E38");
private static Color SHAFT_COLOR = Color.decode("#FFFFE0");
private static Color SHAFT_BORDER_COLOR = Color.decode("#8E8E38");
public static Color PIN_COLOR = Color.decode("#00B2EE");
public static Color PIN_BORDER_COLOR = PIN_COLOR.darker();
public static Size PIN_SIZE = new Size(0.03d, SizeUnit.in);
protected static Display DISPLAY = Display.NAME;

Some files were not shown because too many files have changed in this diff Show More