Compare commits
26 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 396c150472 | |||
| c47ff3a8fc | |||
| bf7fdafef5 | |||
| 35bf22edea | |||
| f249ba6b9e | |||
| 0d2475d4f6 | |||
| 2ae30b9630 | |||
| e751c20e93 | |||
| 12ac7fe809 | |||
| 1ae9c17cb0 | |||
| 75d0accc5a | |||
| 54179e2d7b | |||
| 732281f3d7 | |||
| 1a4b40d36c | |||
| 55c48c6b24 | |||
| b7fece1edb | |||
| 3ba4434b66 | |||
| e369ea6200 | |||
| 3e043a8387 | |||
| 1dfef6dd6b | |||
| ab16636860 | |||
| b3b0ef746f | |||
| a678b52f4d | |||
| 47f9056588 | |||
| c5a462a385 | |||
| b15a6e3f64 |
@@ -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
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 232 KiB After Width: | Height: | Size: 231 KiB |
|
Before Width: | Height: | Size: 293 KiB After Width: | Height: | Size: 293 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 195 KiB After Width: | Height: | Size: 196 KiB |
|
Before Width: | Height: | Size: 99 KiB After Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 200 KiB After Width: | Height: | Size: 200 KiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 601 KiB After Width: | Height: | Size: 601 KiB |
|
Before Width: | Height: | Size: 350 KiB After Width: | Height: | Size: 350 KiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 1.7 MiB |
|
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
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 805 KiB After Width: | Height: | Size: 805 KiB |
|
Before Width: | Height: | Size: 268 KiB After Width: | Height: | Size: 268 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 169 KiB After Width: | Height: | Size: 169 KiB |
|
Before Width: | Height: | Size: 720 KiB After Width: | Height: | Size: 721 KiB |
|
Before Width: | Height: | Size: 506 KiB After Width: | Height: | Size: 506 KiB |
|
Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 208 KiB |
|
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
|
||||
|
||||
|
Before Width: | Height: | Size: 3.6 MiB After Width: | Height: | Size: 3.6 MiB |
|
Before Width: | Height: | Size: 251 KiB After Width: | Height: | Size: 251 KiB |
|
Before Width: | Height: | Size: 2.5 MiB After Width: | Height: | Size: 2.5 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 186 KiB After Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 13 MiB After Width: | Height: | Size: 13 MiB |
|
Before Width: | Height: | Size: 358 KiB After Width: | Height: | Size: 358 KiB |
|
Before Width: | Height: | Size: 862 KiB After Width: | Height: | Size: 862 KiB |
|
Before Width: | Height: | Size: 314 KiB After Width: | Height: | Size: 314 KiB |
|
Before Width: | Height: | Size: 3.8 MiB After Width: | Height: | Size: 3.8 MiB |
|
Before Width: | Height: | Size: 351 KiB After Width: | Height: | Size: 351 KiB |
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 582 KiB After Width: | Height: | Size: 582 KiB |
|
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 251 KiB After Width: | Height: | Size: 251 KiB |
|
Before Width: | Height: | Size: 266 KiB After Width: | Height: | Size: 266 KiB |
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 202 KiB After Width: | Height: | Size: 204 KiB |
|
Before Width: | Height: | Size: 274 KiB After Width: | Height: | Size: 275 KiB |
|
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 97 KiB After Width: | Height: | Size: 97 KiB |
|
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 142 KiB |
|
Before Width: | Height: | Size: 217 KiB After Width: | Height: | Size: 216 KiB |
|
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 160 KiB |
|
Before Width: | Height: | Size: 308 KiB After Width: | Height: | Size: 308 KiB |
|
Before Width: | Height: | Size: 224 KiB After Width: | Height: | Size: 226 KiB |
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 213 KiB After Width: | Height: | Size: 212 KiB |
|
Before Width: | Height: | Size: 318 KiB After Width: | Height: | Size: 319 KiB |
|
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
|
||||
|
@@ -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,5 +1,5 @@
|
||||
{
|
||||
"version" : "6.9.0",
|
||||
"version" : "6.10.0",
|
||||
"categories" : {
|
||||
"Boards" : [ {
|
||||
"name" : "Blank Board",
|
||||
@@ -174,9 +174,6 @@
|
||||
}, {
|
||||
"name" : "9V Battery Snap",
|
||||
"className" : "electromechanical.BatterySnap9V"
|
||||
}, {
|
||||
"name" : "Chassis Panel",
|
||||
"className" : "chassis.ChassisPanel"
|
||||
}, {
|
||||
"name" : "Cliff 1/4\" Jack",
|
||||
"className" : "electromechanical.CliffJack1_4"
|
||||
@@ -189,12 +186,6 @@
|
||||
}, {
|
||||
"name" : "DIP Switch",
|
||||
"className" : "electromechanical.DIPSwitch"
|
||||
}, {
|
||||
"name" : "Drill Hole",
|
||||
"className" : "electromechanical.DrillHole"
|
||||
}, {
|
||||
"name" : "Elliptical Cutout",
|
||||
"className" : "chassis.EllipticalCutout"
|
||||
}, {
|
||||
"name" : "Fuse Holder (Panel)",
|
||||
"className" : "electromechanical.FuseHolderPanel"
|
||||
@@ -225,15 +216,9 @@
|
||||
}, {
|
||||
"name" : "Plastic DC Jack",
|
||||
"className" : "electromechanical.PlasticDCJack"
|
||||
}, {
|
||||
"name" : "Polygonal Cutout",
|
||||
"className" : "chassis.PolygonalCutout"
|
||||
}, {
|
||||
"name" : "RCA Jack",
|
||||
"className" : "electromechanical.RCAJack"
|
||||
}, {
|
||||
"name" : "Rectangular Cutout",
|
||||
"className" : "chassis.RectangularCutout"
|
||||
}, {
|
||||
"name" : "Rotary Selector Switch",
|
||||
"className" : "electromechanical.RotarySelectorSwitch"
|
||||
@@ -293,6 +278,25 @@
|
||||
"name" : "Stingray Bass Pickup",
|
||||
"className" : "guitar.StingrayBassPickup"
|
||||
} ],
|
||||
"Hardware" : [ {
|
||||
"name" : "Dial Scale",
|
||||
"className" : "chassis.DialScale"
|
||||
}, {
|
||||
"name" : "Drill Hole",
|
||||
"className" : "electromechanical.DrillHole"
|
||||
}, {
|
||||
"name" : "Elliptical Cutout",
|
||||
"className" : "chassis.EllipticalCutout"
|
||||
}, {
|
||||
"name" : "Enclosure",
|
||||
"className" : "chassis.ChassisPanel"
|
||||
}, {
|
||||
"name" : "Polygonal Cutout",
|
||||
"className" : "chassis.PolygonalCutout"
|
||||
}, {
|
||||
"name" : "Rectangular Cutout",
|
||||
"className" : "chassis.RectangularCutout"
|
||||
} ],
|
||||
"Misc" : [ {
|
||||
"name" : "Auto-Wrap Label",
|
||||
"className" : "misc.WrapLabel"
|
||||
@@ -302,9 +306,6 @@
|
||||
}, {
|
||||
"name" : "Common Node",
|
||||
"className" : "misc.CommonNode"
|
||||
}, {
|
||||
"name" : "Dial Scale",
|
||||
"className" : "chassis.DialScale"
|
||||
}, {
|
||||
"name" : "Image",
|
||||
"className" : "misc.Image"
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,16 +118,10 @@ public class ComparatorFactory {
|
||||
if (componentZOrderComparator == null) {
|
||||
componentZOrderComparator = new Comparator<IDIYComponent<?>>() {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public int compare(IDIYComponent<?> o1, IDIYComponent<?> o2) {
|
||||
ComponentType type1 =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) o1.getClass());
|
||||
ComponentType type2 =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) o2.getClass());
|
||||
return Double.valueOf(type1.getZOrder()).compareTo(type2.getZOrder());
|
||||
return Double.compare(ComponentProcessor.getInstance().getZOrder(o1),
|
||||
ComponentProcessor.getInstance().getZOrder(o2));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -409,6 +409,31 @@ public class ComponentProcessor {
|
||||
return type.getName();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the z-order (layer) of the component. A {@link CompositeComponent} sits on the lowest
|
||||
* layer among its children rather than the one its class declares: it is drawn as a
|
||||
* single unit, so it takes one place in the stack, and that place has to be under
|
||||
* whatever is later put on top of it. A block of chassis panels therefore stays on the
|
||||
* chassis layer, and a block built from a board, pads and silkscreen text on the board
|
||||
* layer.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public double getZOrder(IDIYComponent<?> component) {
|
||||
if (component instanceof CompositeComponent) {
|
||||
double zOrder = Double.MAX_VALUE;
|
||||
for (IDIYComponent<?> child : ((CompositeComponent) component).getChildComponents()) {
|
||||
zOrder = Math.min(zOrder, getZOrder(child));
|
||||
}
|
||||
if (zOrder < Double.MAX_VALUE) {
|
||||
return zOrder;
|
||||
}
|
||||
}
|
||||
ComponentType type =
|
||||
extractComponentTypeFrom((Class<? extends IDIYComponent<?>>) component.getClass());
|
||||
// internal types without a descriptor do not take part in layering
|
||||
return type == null ? Double.MAX_VALUE : type.getZOrder();
|
||||
}
|
||||
|
||||
public static boolean hasStickyPoint(IDIYComponent<?> c) {
|
||||
for (int i = 0; i < c.getControlPointCount(); i++)
|
||||
if (c.isControlPointSticky(0))
|
||||
|
||||
@@ -94,7 +94,8 @@ public class GroupAndLockIndex {
|
||||
if (componentType == null) {
|
||||
return false;
|
||||
}
|
||||
return project.getLockedLayers().contains((int) Math.round(componentType.getZOrder()))
|
||||
return project.getLockedLayers()
|
||||
.contains((int) Math.round(ComponentProcessor.getInstance().getZOrder(component)))
|
||||
|| project.getLockedComponents().contains(component);
|
||||
}
|
||||
|
||||
|
||||
@@ -494,7 +494,8 @@ public class Presenter implements IPlugInPort {
|
||||
// for internal types
|
||||
if (componentType == null)
|
||||
return true;
|
||||
return !currentProject.getHiddenLayers().contains((int) Math.round(componentType.getZOrder()));
|
||||
return !currentProject.getHiddenLayers()
|
||||
.contains((int) Math.round(ComponentProcessor.getInstance().getZOrder(component)));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1076,10 +1077,9 @@ public class Presenter implements IPlugInPort {
|
||||
Iterator<IDIYComponent<?>> i = newSelection.iterator();
|
||||
while (i.hasNext()) {
|
||||
IDIYComponent<?> c = i.next();
|
||||
ComponentType type =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom((Class<? extends IDIYComponent<?>>) c.getClass());
|
||||
if ((int) type.getZOrder() != layer)
|
||||
if ((int) ComponentProcessor.getInstance().getZOrder(c) != layer) {
|
||||
i.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
updateSelection(newSelection);
|
||||
@@ -2229,6 +2229,7 @@ public class Presenter implements IPlugInPort {
|
||||
ComponentType componentType =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) component.getClass());
|
||||
long layer = Math.round(ComponentProcessor.getInstance().getZOrder(component));
|
||||
int index = currentProject.getComponents().indexOf(component);
|
||||
if (index < 0) {
|
||||
LOG.warn("Component not found in the project: " + component.getName());
|
||||
@@ -2236,11 +2237,8 @@ public class Presenter implements IPlugInPort {
|
||||
while (index > 0) {
|
||||
IDIYComponent<?> componentBefore = currentProject.getComponents().get(index - 1);
|
||||
if (!selectedComponents.contains(componentBefore)) {
|
||||
ComponentType componentBeforeType =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) componentBefore.getClass());
|
||||
if (!componentType.isFlexibleZOrder()
|
||||
&& Math.round(componentBeforeType.getZOrder()) < Math.round(componentType.getZOrder())
|
||||
&& Math.round(ComponentProcessor.getInstance().getZOrder(componentBefore)) < layer
|
||||
&& forceConfirmation != IView.YES_OPTION
|
||||
&& (forceConfirmation =
|
||||
this.view
|
||||
@@ -2278,6 +2276,7 @@ public class Presenter implements IPlugInPort {
|
||||
ComponentType componentType =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) component.getClass());
|
||||
long layer = Math.round(ComponentProcessor.getInstance().getZOrder(component));
|
||||
int index = currentProject.getComponents().indexOf(component);
|
||||
if (index < 0) {
|
||||
LOG.warn("Component not found in the project: " + component.getName());
|
||||
@@ -2285,11 +2284,8 @@ public class Presenter implements IPlugInPort {
|
||||
while (index < currentProject.getComponents().size() - 1) {
|
||||
IDIYComponent<?> componentAfter = currentProject.getComponents().get(index + 1);
|
||||
if (!selectedComponents.contains(componentAfter)) {
|
||||
ComponentType componentAfterType =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) componentAfter.getClass());
|
||||
if (!componentType.isFlexibleZOrder()
|
||||
&& Math.round(componentAfterType.getZOrder()) > Math.round(componentType.getZOrder())
|
||||
&& Math.round(ComponentProcessor.getInstance().getZOrder(componentAfter)) > layer
|
||||
&& forceConfirmation != IView.YES_OPTION
|
||||
&& (forceConfirmation =
|
||||
this.view
|
||||
@@ -2684,13 +2680,9 @@ public class Presenter implements IPlugInPort {
|
||||
@SuppressWarnings("unchecked")
|
||||
private void addComponent(IDIYComponent<?> component, boolean allowAutoCreate) {
|
||||
int index = currentProject.getComponents().size();
|
||||
while (index > 0
|
||||
&& ComponentProcessor.getInstance()
|
||||
.extractComponentTypeFrom((Class<? extends IDIYComponent<?>>) component.getClass()).getZOrder() < ComponentProcessor
|
||||
.getInstance()
|
||||
.extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) currentProject.getComponents().get(index - 1).getClass())
|
||||
.getZOrder()) {
|
||||
double zOrder = ComponentProcessor.getInstance().getZOrder(component);
|
||||
while (index > 0 && zOrder < ComponentProcessor.getInstance()
|
||||
.getZOrder(currentProject.getComponents().get(index - 1))) {
|
||||
index--;
|
||||
}
|
||||
if (index < currentProject.getComponents().size()) {
|
||||
@@ -2724,12 +2716,9 @@ public class Presenter implements IPlugInPort {
|
||||
int maxIndex = 0;
|
||||
for (IDIYComponent<?> component : components) {
|
||||
int index = currentProject.getComponents().size();
|
||||
while (index > maxIndex && ComponentProcessor.getInstance()
|
||||
.extractComponentTypeFrom((Class<? extends IDIYComponent<?>>) component.getClass())
|
||||
.getZOrder() < ComponentProcessor.getInstance()
|
||||
.extractComponentTypeFrom((Class<? extends IDIYComponent<?>>) currentProject
|
||||
.getComponents().get(index - 1).getClass())
|
||||
.getZOrder()) {
|
||||
double zOrder = ComponentProcessor.getInstance().getZOrder(component);
|
||||
while (index > maxIndex && zOrder < ComponentProcessor.getInstance()
|
||||
.getZOrder(currentProject.getComponents().get(index - 1))) {
|
||||
index--;
|
||||
}
|
||||
|
||||
@@ -2879,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 {
|
||||
@@ -3075,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
|
||||
@@ -3132,12 +3116,9 @@ public class Presenter implements IPlugInPort {
|
||||
return GroupAndLockIndex.isLocked(currentProject, component);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private boolean isComponentLayerLocked(IDIYComponent<?> component) {
|
||||
ComponentType componentType =
|
||||
ComponentProcessor.getInstance().extractComponentTypeFrom(
|
||||
(Class<? extends IDIYComponent<?>>) component.getClass());
|
||||
return currentProject.getLockedLayers().contains((int) Math.round(componentType.getZOrder()));
|
||||
return currentProject.getLockedLayers()
|
||||
.contains((int) Math.round(ComponentProcessor.getInstance().getZOrder(component)));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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>
|
||||
@@ -1902,111 +1697,19 @@
|
||||
<list>
|
||||
<org.diylc.core.Template>
|
||||
<name>125B</name>
|
||||
<values>
|
||||
<entry>
|
||||
<string>Radius</string>
|
||||
<org.diylc.core.measures.Size value="5.0" unit="mm"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<string>Color</string>
|
||||
<awt-color hex="eeeeee"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<string>Border</string>
|
||||
<awt-color hex="a6a6a6"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<string>Border Thickness</string>
|
||||
<org.diylc.core.measures.Size value="0.2" unit="mm"/>
|
||||
</entry>
|
||||
</values>
|
||||
<points>
|
||||
<point x="0.0" y="0.0"/>
|
||||
<point x="4.815" y="2.64"/>
|
||||
</points>
|
||||
<defaultFlag>false</defaultFlag>
|
||||
<createdOn>2022-10-30T13:25:15.3894874</createdOn>
|
||||
<deletedOn>2026-11-01T23:00:00</deletedOn>
|
||||
</org.diylc.core.Template>
|
||||
<org.diylc.core.Template>
|
||||
<name>A</name>
|
||||
<values>
|
||||
<entry>
|
||||
<string>Radius</string>
|
||||
<org.diylc.core.measures.Size value="5.0" unit="mm"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<string>Color</string>
|
||||
<awt-color hex="eeeeee"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<string>Border</string>
|
||||
<awt-color hex="a6a6a6"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<string>Border Thickness</string>
|
||||
<org.diylc.core.measures.Size value="0.2" unit="mm"/>
|
||||
</entry>
|
||||
</values>
|
||||
<points>
|
||||
<point x="0.0" y="0.0"/>
|
||||
<point x="3.545" y="1.525"/>
|
||||
</points>
|
||||
<defaultFlag>false</defaultFlag>
|
||||
<createdOn>2022-10-30T13:25:15.3894874</createdOn>
|
||||
<deletedOn>2026-11-01T23:00:00</deletedOn>
|
||||
</org.diylc.core.Template>
|
||||
<org.diylc.core.Template>
|
||||
<name>B</name>
|
||||
<values>
|
||||
<entry>
|
||||
<string>Radius</string>
|
||||
<org.diylc.core.measures.Size value="5.0" unit="mm"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<string>Color</string>
|
||||
<awt-color hex="eeeeee"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<string>Border</string>
|
||||
<awt-color hex="a6a6a6"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<string>Border Thickness</string>
|
||||
<org.diylc.core.measures.Size value="0.2" unit="mm"/>
|
||||
</entry>
|
||||
</values>
|
||||
<points>
|
||||
<point x="0.0" y="0.0"/>
|
||||
<point x="4.41" y="2.36"/>
|
||||
</points>
|
||||
<defaultFlag>false</defaultFlag>
|
||||
<createdOn>2022-10-30T13:25:15.3894874</createdOn>
|
||||
<deletedOn>2026-11-01T23:00:00</deletedOn>
|
||||
</org.diylc.core.Template>
|
||||
<org.diylc.core.Template>
|
||||
<name>BB</name>
|
||||
<values>
|
||||
<entry>
|
||||
<string>Radius</string>
|
||||
<org.diylc.core.measures.Size value="5.0" unit="mm"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<string>Color</string>
|
||||
<awt-color hex="eeeeee"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<string>Border</string>
|
||||
<awt-color hex="a6a6a6"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<string>Border Thickness</string>
|
||||
<org.diylc.core.measures.Size value="0.2" unit="mm"/>
|
||||
</entry>
|
||||
</values>
|
||||
<points>
|
||||
<point x="0.0" y="0.0"/>
|
||||
<point x="4.695" y="3.69"/>
|
||||
</points>
|
||||
<defaultFlag>false</defaultFlag>
|
||||
<createdOn>2022-10-30T13:25:15.3894874</createdOn>
|
||||
<deletedOn>2026-11-01T23:00:00</deletedOn>
|
||||
</org.diylc.core.Template>
|
||||
</list>
|
||||
</entry>
|
||||
@@ -3076,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>
|
||||
|
||||
@@ -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,12 +514,76 @@
|
||||
<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>
|
||||
<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>
|
||||
<description>'Chassis Panel' is now 'Enclosure' and can draw an exploded view of the whole box; set 'Height' and choose which 'Sides' to unfold</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>NEW_FEATURE</changeType>
|
||||
<description>Added a datasheet to 'Enclosure' with Hammond 1590, 1550, 1441 and 1444 enclosures and the 125B size - more than 130 variations</description>
|
||||
</org.diylc.appframework.update.Change>
|
||||
<org.diylc.appframework.update.Change>
|
||||
<changeType>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>
|
||||
@@ -537,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>
|
||||
|
||||
@@ -35,7 +35,12 @@ import java.util.UUID;
|
||||
|
||||
import org.diylc.common.Percentage;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
import org.diylc.netlist.Node;
|
||||
import org.diylc.presenter.ComparatorFactory;
|
||||
import org.diylc.presenter.ComponentProcessor;
|
||||
import org.diylc.presenter.GroupAndLockIndex;
|
||||
import org.diylc.serialization.ProjectFileManager;
|
||||
import org.diylc.testcomponents.OnePointTestComponent;
|
||||
import org.diylc.testcomponents.TwoPointTestComponent;
|
||||
@@ -326,4 +331,77 @@ public class CompositeComponentTest {
|
||||
assertNotNull(blank.getChildComponents());
|
||||
assertTrue(blank.getChildComponents().isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void layerOfAChassisOnlyCompositeIsTheChassisLayer() {
|
||||
CompositeComponent composite = customBoard(new ChassisTestComponent(),
|
||||
new ChassisTestComponent());
|
||||
|
||||
assertEquals(IDIYComponent.CHASSIS, ComponentProcessor.getInstance().getZOrder(composite), 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void layerOfAMixedCompositeIsItsLowestChildLayer() {
|
||||
CompositeComponent composite = customBoard(new TextTestComponent(), twoPoint("R1"),
|
||||
new BoardTestComponent());
|
||||
|
||||
assertEquals(IDIYComponent.BOARD, ComponentProcessor.getInstance().getZOrder(composite), 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void layerOfANestedCompositeLooksThroughTheInnerComposite() {
|
||||
CompositeComponent inner = customBoard(new ChassisTestComponent());
|
||||
CompositeComponent outer = customBoard(twoPoint("R1"), inner);
|
||||
|
||||
assertEquals(IDIYComponent.CHASSIS, ComponentProcessor.getInstance().getZOrder(outer), 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void layerOfAChildlessCompositeIsTheDeclaredOne() {
|
||||
assertEquals(IDIYComponent.COMPONENT,
|
||||
ComponentProcessor.getInstance().getZOrder(new CompositeComponent()), 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lockingTheChildLayerLocksTheComposite() {
|
||||
Project project = new Project();
|
||||
CompositeComponent chassis = customBoard(new ChassisTestComponent());
|
||||
project.getComponents().add(chassis);
|
||||
|
||||
project.getLockedLayers().add(IDIYComponent.COMPONENT);
|
||||
assertFalse(GroupAndLockIndex.isLocked(project, chassis));
|
||||
|
||||
project.getLockedLayers().add(IDIYComponent.CHASSIS);
|
||||
assertTrue(GroupAndLockIndex.isLocked(project, chassis));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void compositeSortsByItsChildLayer() {
|
||||
CompositeComponent chassis = customBoard(new ChassisTestComponent());
|
||||
BoardTestComponent board = new BoardTestComponent();
|
||||
|
||||
assertTrue(ComparatorFactory.getInstance().getComponentZOrderComparator().compare(chassis,
|
||||
board) < 0);
|
||||
}
|
||||
|
||||
@ComponentDescriptor(name = "Chassis Test", category = "Test", author = "Test",
|
||||
description = "test", instanceNamePrefix = "CT", zOrder = IDIYComponent.CHASSIS)
|
||||
public static class ChassisTestComponent extends TwoPointTestComponent {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
||||
|
||||
@ComponentDescriptor(name = "Board Test", category = "Test", author = "Test",
|
||||
description = "test", instanceNamePrefix = "BT", zOrder = IDIYComponent.BOARD)
|
||||
public static class BoardTestComponent extends TwoPointTestComponent {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
||||
|
||||
@ComponentDescriptor(name = "Text Test", category = "Test", author = "Test",
|
||||
description = "test", instanceNamePrefix = "TT", zOrder = IDIYComponent.TEXT)
|
||||
public static class TextTestComponent extends TwoPointTestComponent {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {}
|
||||
}
|
||||
}
|
||||
@@ -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");
|
||||
|
||||
@@ -21,17 +21,21 @@
|
||||
*/
|
||||
package org.diylc.components.chassis;
|
||||
|
||||
import java.awt.AlphaComposite;
|
||||
import java.awt.Color;
|
||||
import java.awt.Composite;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
|
||||
import org.diylc.common.ObjectCache;
|
||||
import org.diylc.components.shapes.AbstractShape;
|
||||
import org.diylc.components.AbstractTransparentComponent;
|
||||
import org.diylc.components.transform.SimpleComponentTransformer;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.IDatasheetSupport;
|
||||
import org.diylc.core.IDrawingObserver;
|
||||
import org.diylc.core.Project;
|
||||
import org.diylc.core.VisibilityPolicy;
|
||||
import org.diylc.core.annotations.AiNote;
|
||||
import org.diylc.core.annotations.BomPolicy;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
@@ -39,60 +43,206 @@ import org.diylc.core.annotations.EditableProperty;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
|
||||
@AiNote("Each instance is one side of the chassis: an exploded view of a whole chassis takes five panels, while the top, front and back alone take three, which is typical for pedals and amplifiers. The top panel goes in the centre with the front panel against its upper edge and the back panel against its lower edge; in the five-panel view the left side panel goes against its left edge and the right side panel against its right edge")
|
||||
@AiNote("The panel is not conductive in the netlist: jacks, pots and lugs drawn on it are not joined through it, so chassis ground points must be connected explicitly")
|
||||
@ComponentDescriptor(name = "Chassis Panel", author = "Branislav Stojkovic", category = "Electro-Mechanical",
|
||||
instanceNamePrefix = "CP", description = "One side of a chassis, with or withouth rounded edges",
|
||||
@AiNote("The two control points are opposite corners of the enclosure's top panel. With 'Height' above zero the sides are unfolded around it as an exploded view, each as tall as 'Height' and set 'Spacing' apart from it: the front against the top panel's upper edge, the back against its lower edge and, when 'Sides' is All, the left and right sides against its left and right edges. The bottom is never drawn. With 'Sides' set to None, or 'Height' at zero, it is a single flat panel of any size, such as one side of a chassis drawn on its own")
|
||||
@AiNote("The enclosure is not conductive in the netlist: jacks, pots and lugs drawn on it are not joined through it, so chassis ground points must be connected explicitly")
|
||||
@AiNote("A datasheet model is a Hammond enclosure part number such as 1590BB, 1550B or 1444-32, or a generic size such as 125B, and is stored as 'Value'; it sets the top panel to the enclosure's length and width, upright for pedal-sized die-cast boxes up to 125 mm long and horizontal for bigger boxes and amplifier chassis and 'Height' to its wall height. 125B is a generic size sold by several makers; its Hammond equivalent is 1590N1")
|
||||
@ComponentDescriptor(name = "Enclosure", author = "Branislav Stojkovic", category = "Hardware",
|
||||
instanceNamePrefix = "ENC",
|
||||
description = "Top panel of an enclosure or chassis, optionally with its sides unfolded",
|
||||
zOrder = IDIYComponent.CHASSIS, bomPolicy = BomPolicy.SHOW_ONLY_TYPE_NAME, autoEdit = false,
|
||||
transformer = SimpleComponentTransformer.class)
|
||||
public class ChassisPanel extends AbstractShape {
|
||||
transformer = SimpleComponentTransformer.class, enableDatasheet = true,
|
||||
datasheetCreationStepCount = 2, datasheetModelColumn = 1)
|
||||
public class ChassisPanel extends AbstractTransparentComponent<String>
|
||||
implements IDatasheetSupport {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
protected Size edgeRadius = new Size(0d, SizeUnit.mm);
|
||||
|
||||
public static Color COLOR = LIGHT_METAL_COLOR;
|
||||
public static Color BORDER_COLOR = LIGHT_METAL_COLOR.darker();
|
||||
// a new enclosure is a 125B, the most common pedal enclosure, upright as in its datasheet row
|
||||
public static String DEFAULT_MODEL = "125B";
|
||||
public static Size DEFAULT_TOP_WIDTH = new Size(66d, SizeUnit.mm);
|
||||
public static Size DEFAULT_TOP_LENGTH = new Size(122d, SizeUnit.mm);
|
||||
public static Size DEFAULT_WALL_HEIGHT = new Size(36d, SizeUnit.mm);
|
||||
public static Size DEFAULT_RADIUS = new Size(0d, SizeUnit.mm);
|
||||
public static Size DEFAULT_SPACING = new Size(0d, SizeUnit.mm);
|
||||
|
||||
// the fields below up to borderThickness carry the names they had when this class extended
|
||||
// AbstractShape, because old files store them under those names
|
||||
private String value = DEFAULT_MODEL;
|
||||
private Point2D[] controlPoints = new Point2D[] {new Point2D.Double(0, 0), new Point2D.Double(
|
||||
DEFAULT_TOP_WIDTH.convertToPixels(), DEFAULT_TOP_LENGTH.convertToPixels())};
|
||||
private Point2D.Double firstPoint = new Point2D.Double();
|
||||
private Point2D.Double secondPoint = new Point2D.Double();
|
||||
private Color color = COLOR;
|
||||
private Color borderColor = BORDER_COLOR;
|
||||
// no longer used; kept so that old files that store it still load
|
||||
@Deprecated
|
||||
private Size borderThickness;
|
||||
protected Size edgeRadius = DEFAULT_RADIUS;
|
||||
private Size height = DEFAULT_WALL_HEIGHT;
|
||||
private Sides sides = Sides.ALL;
|
||||
private Size spacing = DEFAULT_SPACING;
|
||||
|
||||
public ChassisPanel() {
|
||||
this.color = LIGHT_METAL_COLOR;
|
||||
this.borderColor = LIGHT_METAL_COLOR.darker();
|
||||
updateCorners();
|
||||
}
|
||||
|
||||
public ChassisPanel(String[] model) {
|
||||
this();
|
||||
|
||||
applyModel(model);
|
||||
}
|
||||
|
||||
// columns: group, model, top panel size along x and along y, wall height. The wall height leaves
|
||||
// out the lid, which is the bottom left out of the view. Pedal-sized boxes are listed upright,
|
||||
// as pedals use them, and the bigger ones horizontal
|
||||
@Override
|
||||
public void applyModel(String[] model) {
|
||||
setValue(model[1]);
|
||||
setHeight(Size.parseSize(model[4]));
|
||||
// the first control point stays put and the top panel keeps the direction it is drawn in
|
||||
Point2D first = controlPoints[0];
|
||||
Point2D second = controlPoints[1];
|
||||
double x = Size.parseSize(model[2]).convertToPixels();
|
||||
double y = Size.parseSize(model[3]).convertToPixels();
|
||||
setControlPoint(new Point2D.Double(first.getX() + (second.getX() < first.getX() ? -x : x),
|
||||
first.getY() + (second.getY() < first.getY() ? -y : y)), 1);
|
||||
}
|
||||
|
||||
private void updateCorners() {
|
||||
firstPoint.setLocation(Math.min(controlPoints[0].getX(), controlPoints[1].getX()),
|
||||
Math.min(controlPoints[0].getY(), controlPoints[1].getY()));
|
||||
secondPoint.setLocation(Math.max(controlPoints[0].getX(), controlPoints[1].getX()),
|
||||
Math.max(controlPoints[0].getY(), controlPoints[1].getY()));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the side panels of the exploded view, folded out from the edges of the top panel:
|
||||
* front, back and then, when all sides are shown, left and right. Empty when no sides are
|
||||
* shown or the enclosure has no height.
|
||||
*/
|
||||
Rectangle2D[] getSidePanels() {
|
||||
double h = getHeight() == null ? 0 : getHeight().convertToPixels();
|
||||
if (h <= 0 || getSides() == Sides.NONE) {
|
||||
return new Rectangle2D[0];
|
||||
}
|
||||
double s = getSpacing() == null ? 0 : getSpacing().convertToPixels();
|
||||
double x = firstPoint.getX();
|
||||
double y = firstPoint.getY();
|
||||
double w = secondPoint.getX() - x;
|
||||
double d = secondPoint.getY() - y;
|
||||
Rectangle2D front = new Rectangle2D.Double(x, y - s - h, w, h);
|
||||
Rectangle2D back = new Rectangle2D.Double(x, y + d + s, w, h);
|
||||
if (getSides() == Sides.FRONT_AND_BACK) {
|
||||
return new Rectangle2D[] {front, back};
|
||||
}
|
||||
return new Rectangle2D[] {front, back, new Rectangle2D.Double(x - s - h, y, h, d),
|
||||
new Rectangle2D.Double(x + w + s, y, h, d)};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project,
|
||||
IDrawingObserver drawingObserver) {
|
||||
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke((int) borderThickness.convertToPixels()));
|
||||
int radius = (int) edgeRadius.convertToPixels();
|
||||
public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode,
|
||||
Project project, IDrawingObserver drawingObserver) {
|
||||
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1));
|
||||
int x = (int) Math.round(firstPoint.getX());
|
||||
int y = (int) Math.round(firstPoint.getY());
|
||||
int width = (int) (secondPoint.getX() - firstPoint.getX());
|
||||
int length = (int) (secondPoint.getY() - firstPoint.getY());
|
||||
int radius = (int) getEdgeRadius().convertToPixels();
|
||||
Rectangle2D[] sidePanels = getSidePanels();
|
||||
if (componentState != ComponentState.DRAGGING) {
|
||||
Composite oldComposite = applyAlpha(g2d, componentState);
|
||||
g2d.setColor(color);
|
||||
if (radius == 0) {
|
||||
g2d.fillRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
|
||||
(int) (secondPoint.getX() - firstPoint.getX()),
|
||||
(int) (secondPoint.getY() - firstPoint.getY()));
|
||||
g2d.fillRect(x, y, width, length);
|
||||
} else {
|
||||
g2d.fillRoundRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
|
||||
(int) (secondPoint.getX() - firstPoint.getX()),
|
||||
(int) (secondPoint.getY() - firstPoint.getY()), radius, radius);
|
||||
g2d.fillRoundRect(x, y, width, length, radius, radius);
|
||||
}
|
||||
for (Rectangle2D panel : sidePanels) {
|
||||
g2d.fill(panel);
|
||||
}
|
||||
g2d.setComposite(oldComposite);
|
||||
// the panels drawn so far are the whole area of the enclosure
|
||||
drawingObserver.stopTracking();
|
||||
}
|
||||
// Do not track any changes that follow because the whole rect has been
|
||||
// tracked so far.
|
||||
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
|
||||
: borderColor);
|
||||
g2d.setColor(componentState == ComponentState.SELECTED
|
||||
|| componentState == ComponentState.DRAGGING ? SELECTION_COLOR : borderColor);
|
||||
if (radius == 0) {
|
||||
g2d.drawRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
|
||||
(int) (secondPoint.getX() - firstPoint.getX()),
|
||||
(int) (secondPoint.getY() - firstPoint.getY()));
|
||||
g2d.drawRect(x, y, width, length);
|
||||
} else {
|
||||
g2d.drawRoundRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
|
||||
(int) (secondPoint.getX() - firstPoint.getX()),
|
||||
(int) (secondPoint.getY() - firstPoint.getY()), radius, radius);
|
||||
g2d.drawRoundRect(x, y, width, length, radius, radius);
|
||||
}
|
||||
for (Rectangle2D panel : sidePanels) {
|
||||
g2d.draw(panel);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getControlPointCount() {
|
||||
return controlPoints.length;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Point2D getControlPoint(int index) {
|
||||
return controlPoints[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setControlPoint(Point2D point, int index) {
|
||||
controlPoints[index].setLocation(point);
|
||||
updateCorners();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isControlPointSticky(int index) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VisibilityPolicy getControlPointVisibilityPolicy(int index) {
|
||||
return VisibilityPolicy.WHEN_SELECTED;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getControlPointNodeName(int index) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@EditableProperty
|
||||
@Override
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValue(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Color")
|
||||
public Color getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
public void setColor(Color color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Border")
|
||||
public Color getBorderColor() {
|
||||
return borderColor;
|
||||
}
|
||||
|
||||
public void setBorderColor(Color borderColor) {
|
||||
this.borderColor = borderColor;
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Radius")
|
||||
public Size getEdgeRadius() {
|
||||
if (edgeRadius == null) {
|
||||
edgeRadius = DEFAULT_RADIUS;
|
||||
}
|
||||
return edgeRadius;
|
||||
}
|
||||
|
||||
@@ -100,12 +250,70 @@ public class ChassisPanel extends AbstractShape {
|
||||
this.edgeRadius = edgeRadius;
|
||||
}
|
||||
|
||||
@EditableProperty
|
||||
public Size getHeight() {
|
||||
return height;
|
||||
}
|
||||
|
||||
public void setHeight(Size height) {
|
||||
this.height = height;
|
||||
}
|
||||
|
||||
@EditableProperty
|
||||
public Sides getSides() {
|
||||
if (sides == null) {
|
||||
sides = Sides.ALL;
|
||||
}
|
||||
return sides;
|
||||
}
|
||||
|
||||
public void setSides(Sides sides) {
|
||||
this.sides = sides;
|
||||
}
|
||||
|
||||
@EditableProperty
|
||||
public Size getSpacing() {
|
||||
if (spacing == null) {
|
||||
spacing = DEFAULT_SPACING;
|
||||
}
|
||||
return spacing;
|
||||
}
|
||||
|
||||
public void setSpacing(Size spacing) {
|
||||
this.spacing = spacing;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawIcon(Graphics2D g2d, int width, int height) {
|
||||
int factor = 32 / width;
|
||||
g2d.setColor(LIGHT_METAL_COLOR);
|
||||
g2d.fillRect(2 / factor, 4 / factor, width - 4 / factor, height - 8 / factor);
|
||||
g2d.setColor(LIGHT_METAL_COLOR.darker());
|
||||
g2d.drawRect(2 / factor, 4 / factor, width - 4 / factor, height - 8 / factor);
|
||||
int flap = 6 / factor;
|
||||
int left = 2 / factor + flap;
|
||||
int top = 2 / factor + flap;
|
||||
int topWidth = width - 2 * left;
|
||||
int topHeight = height - 2 * top;
|
||||
int[][] panels = {{left, top, topWidth, topHeight}, {left, top - flap, topWidth, flap},
|
||||
{left, top + topHeight, topWidth, flap}, {left - flap, top, flap, topHeight},
|
||||
{left + topWidth, top, flap, topHeight}};
|
||||
for (int[] panel : panels) {
|
||||
g2d.setColor(LIGHT_METAL_COLOR);
|
||||
g2d.fillRect(panel[0], panel[1], panel[2], panel[3]);
|
||||
g2d.setColor(LIGHT_METAL_COLOR.darker());
|
||||
g2d.drawRect(panel[0], panel[1], panel[2], panel[3]);
|
||||
}
|
||||
}
|
||||
|
||||
public enum Sides {
|
||||
ALL("All"), FRONT_AND_BACK("Front and Back"), NONE("None");
|
||||
|
||||
private final String label;
|
||||
|
||||
Sides(String label) {
|
||||
this.label = label;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return label;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ import org.diylc.core.annotations.EditableProperty;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
|
||||
@ComponentDescriptor(name = "Dial Scale", author = "Branislav Stojkovic", category = "Misc",
|
||||
@ComponentDescriptor(name = "Dial Scale", author = "Branislav Stojkovic", category = "Hardware",
|
||||
instanceNamePrefix = "DS", description = "Control panel dial scale", zOrder = IDIYComponent.CHASSIS + 0.1,
|
||||
bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, transformer = SimpleComponentTransformer.class)
|
||||
public class DialScale extends AbstractComponent<String> {
|
||||
|
||||
@@ -31,7 +31,7 @@ import org.diylc.core.Project;
|
||||
import org.diylc.core.annotations.BomPolicy;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
|
||||
@ComponentDescriptor(name = "Elliptical Cutout", author = "Branislav Stojkovic", category = "Electro-Mechanical",
|
||||
@ComponentDescriptor(name = "Elliptical Cutout", author = "Branislav Stojkovic", category = "Hardware",
|
||||
instanceNamePrefix = "ELC", description = "Elliptical chassis cutout", zOrder = IDIYComponent.CHASSIS + 0.1,
|
||||
bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, transformer = SimpleComponentTransformer.class)
|
||||
public class EllipticalCutout extends AbstractShape {
|
||||
|
||||
@@ -35,7 +35,7 @@ import org.diylc.core.annotations.BomPolicy;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
import org.diylc.core.annotations.EditableProperty;
|
||||
|
||||
@ComponentDescriptor(name = "Polygonal Cutout", author = "Branislav Stojkovic", category = "Electro-Mechanical",
|
||||
@ComponentDescriptor(name = "Polygonal Cutout", author = "Branislav Stojkovic", category = "Hardware",
|
||||
instanceNamePrefix = "POLYC", description = "Polygonal chassis cutout", zOrder = IDIYComponent.CHASSIS + 0.1,
|
||||
bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, transformer = SimpleComponentTransformer.class)
|
||||
public class PolygonalCutout extends AbstractShape {
|
||||
|
||||
@@ -34,7 +34,7 @@ import org.diylc.core.annotations.EditableProperty;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
|
||||
@ComponentDescriptor(name = "Rectangular Cutout", author = "Branislav Stojkovic", category = "Electro-Mechanical",
|
||||
@ComponentDescriptor(name = "Rectangular Cutout", author = "Branislav Stojkovic", category = "Hardware",
|
||||
instanceNamePrefix = "RECTC", description = "Rectangular chassis cutout, with or without rounded edges",
|
||||
zOrder = IDIYComponent.CHASSIS + 0.1, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false,
|
||||
transformer = SimpleComponentTransformer.class)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -43,7 +43,7 @@ import org.diylc.core.gerber.IGerberDrawingObserver;
|
||||
import org.diylc.core.measures.Size;
|
||||
import org.diylc.core.measures.SizeUnit;
|
||||
|
||||
@ComponentDescriptor(name = "Drill Hole", category = "Electro-Mechanical", author = "Branislav Stojkovic",
|
||||
@ComponentDescriptor(name = "Drill Hole", category = "Hardware", author = "Branislav Stojkovic",
|
||||
description = "Drill hole marker for PCB, chassis or faceplate", instanceNamePrefix = "Hole",
|
||||
zOrder = IDIYComponent.BOARD + 0.1, bomPolicy = BomPolicy.NEVER_SHOW,
|
||||
keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "PCB",
|
||||
|
||||