summaryrefslogtreecommitdiff
path: root/graphics/circuit_macros/examples/svg/EEPSVG.m4
blob: 4f928f927d696ea419e8e69901cee6f2a5a93c86 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
.PS
# EEPSVG.m4
# https://electrical-engineering-portal.com/single-line-diagrams-symbols-drawings-analysis

cct_init
divert(-1)

# This section defines *DRAFT* SLD elements with or without attached
# circuit breakers.  Many other elements applicable to SLD drawings are
# already in libcct.m4.  The contributions and suggestions of Benjamin
# Vilmann are acknowledged with thanks.

# 1-terminal SLD elements:
# Argument 1 is normally the linespec of the stem to set the element direction
#   and length. See also: PtoL defined below.
# For a 0-length stem (which has undefined direction):
#   arg1 can also be U, D, L, R (for up, down, left, right),
#   or a number to set the direction in degrees, optionally followed by
#   `at position' to set the position (Here by default).
#   Zero-length stem examples: sl_box(U), sl_box(45 at Here+(1,0))
# Argument 2 contains semicolon (;)-separated key-value attributes
#   of the element head as applicable: e.g., name=Name; text="text"; lgth=expr 
# A non-blank argument 3 is C for a default closed breaker in the stem, O for
#   an open breaker, or key-value pairs to specify breaker details.
# The element body (head) can be named. It is overlaid with or contained in
#   a [] block.

# 2-terminal SLD elements:
# These obey the normal Circuit_macro two-terminal conventions.
# They can be labelled using rlabel() or llabel() as well as directly.
# Argument 2 contains key-value pairs to customize the element body,
#   e.g., name=Name; text="text"; wdth=expr; ...
# Nonblank arguments 3 and 4 put a breaker in the input and output respectively.

# Attached breakers:
# Nonblank arguments 3 and 4 of the two-terminal elements and argument 3 of
#   the 1-terminal elements specify a breaker in the input, output, and stem
#   respectivlely. An O creates a default-size open breaker, and C a closed
#   breaker, otherwise the argument contains key-value pairs to specify the
#   details of the box; e.g., box=dotted 2bp__ shaded "green"

# The SLD current transformer macro sl_ct is composite, within a [] block.
# Internal labels L (for inductor) and terminals Ts, Tc, and Te are defined.

define(`sldlib_')
ifdef(`libcct_',,`include(libcct.m4)divert(-1)')

# Default size parameters.  These can be redefined in a diagram.

define(`brksiz_',`dimen_*3/16')   # Default inline box breaker size
define(`drosiz_',`dimen_/4')      # Default sl_drawout (chevron) size

# One-terminal elements ###################################################

                            `sl_disk( stem linespec, keys, breaker )
                                 keys: name=Name;
                                       text="text";
                                       diam=expr;
                                       circle=circle attributes; eg diam expr'
                                `default breaker name Bd'
define(`sl_disk',
 `sl_eleminit_(`$1')
  setkeys_(`$2',`name::N; circle::N; text::N; diam:dimen_*2/3')dnl
  ifelse(`$3',,
   `ifelse(m4name,,,m4name:) circle diam m4diam \
      at last line.end + vec_(m4diam/2,0) m4circle m4text
    [ box invis wid_ m4diam ht_ m4diam ] at last circle
    line from last line.end  to last line.start',
   `m4br_one(`sl_disk',`$1',`$2',m4brk_(`$3',Bd))') ')

                            `sl_box( stem linespec, keys, breaker )
                                 keys: name=Name; lgth=expr; wdth=expr;
                                       text="text";
                                       box= box attributes; (e.g. shade "red")'
                                `default breaker name Bb'
define(`sl_box',
 `sl_eleminit_(`$1')
  setkeys_(`$2',`name::N; wdth:dimen_*2/3; lgth:dimen_*2/3; box::N; text::N')dnl
  ifelse(`$3',,
   `line from last line.end to last line.start 
    { ifelse(m4name,,,m4name:) [S:Here; lbox(m4lgth,m4wdth,m4box)] \
        with .S at last line.start }
    ifelse(m4text,,,`{m4text at last []}')',
   `m4br_one(`sl_box',`$1',`$2',m4brk_(`$3',Bb))') ')

                            `sl_grid( stem linespec, keys, breaker )
                                 keys: name=Name; lgth=expr; wdth=expr;'
                                `default breaker name Bgr'
define(`sl_grid',
 `sl_eleminit_(`$1')
  setkeys_(`$2',`name::N; wdth:dimen_*4/5; lgth:dimen_*2/3; box::N; text::N')dnl
  ifelse(`$3',,
   `line from last line.end to last line.start 
    { ifelse(m4name,,,m4name:) [S:Here
      { ifelse(m4name,,,m4name:) lbox(m4lgth,m4wdth) }
      { line to rvec_(m4lgth/2, m4wdth/2)
        line to rvec_(m4lgth/2,-m4wdth/2)
        line to rvec_(-m4lgth/2,-m4wdth/2)
        line to rvec_(-m4wdth/2, m4wdth/2) }
      { line from rvec_(0,m4wdth/2) to rvec_(m4lgth,-m4wdth/2) }
      line from rvec_(0,-m4wdth/2) to rvec_(m4lgth,m4wdth/2)
      ] with .S at last line.start } ',
   `m4br_one(`sl_grid',`$1',`$2',m4brk_(`$3',Bgr))') ')

                            `sl_load( stem linespec, keys, breaker )
                                 keys: name=Name; lgth=expr; wdth=expr;
                                       head= arrowhead attributes;'
                                `default breaker name Bl'
define(`sl_load',
 `sl_eleminit_(`$1')
  setkeys_(`$2',`name::N; wdth:dimen_*0.32; lgth:dimen_*0.45; head::N')dnl
  ifelse(`$3',,
   `line from last line.end to last line.start 
    { ifelse(m4name,,,m4name:) [S:Here; line to rvec_(0,m4wdth/2) \
        then to rvec_(m4lgth,0) then to rvec_(0,-m4wdth/2) \
        then to Here m4head ] with .S at last line.start } ',
   `m4br_one(`sl_load',`$1',`$2',m4brk_(`$3',Bl))') ')

                            `sl_meterbox( stem linespec, keys, breaker )
                                  keys: sl_box attributes'
                                `default breaker name Bm'
define(`sl_meterbox',
 `sl_eleminit_(`$1')
  setkeys_(`$2',`name::N; wdth:dimen_*2/3; lgth:dimen_*2/3; box::N; text::N')dnl
  ifelse(`$3',,
   `line from last line.end to last line.start 
    {ifelse(m4name,,,m4name:) [S:Here;
      { B: rotbox( m4lgth, m4wdth, m4box ) with .W at S }
      a = rp_ang*rtod_
      if (abs(a-90) < 45) || (abs(a-180) < 45) || (abs(a+180) < 45) then { 
        C: rvec_(m4lgth*2/5,0)
        line from rvec_(m4lgth*4/5,m4wdth/2) to rvec_(m4lgth*4/5,-m4wdth/2) } \
      else { C: rvec_(m4lgth*3/5,0)
         line from rvec_(m4lgth/5,m4wdth/2) to rvec_(m4lgth/5,-m4wdth/2) }
      ifelse(m4text,,,`m4text at C')
      ] with .S at last line.start}',
   `m4br_one(`sl_meterbox',`$1',`$2',m4brk_(`$3',Bm))') ')

                            `sl_generator( stem linespec, keys, breaker )'
                                `default breaker name Bd'
define(`sl_generator',`sl_disk($@)
  { ACsymbol(at last circle,,,R)
    m4lcd = last circle.diam
    [ box invis wid_ m4lcd ht_ m4lcd ] at last circle } ')

                            `sl_syncmeter( stem linespec, keys, breaker )'
                                `default breaker name Bd'
define(`sl_syncmeter',`sl_disk($@)
  { Syncsymb(at last circle)
    m4lcd = last circle.diam
    [ box invis wid_ m4lcd ht_ m4lcd ] at last circle } ')

                            `sl_lamp( stem linespec, keys, breaker )'
                                `default breaker name Bd'
define(`sl_lamp',`sl_disk($@)
  { line from last circle.ne to last circle.sw
    line from last circle.nw to last circle.se
    m4lcd = last circle.diam
    [ box invis wid_ m4lcd ht_ m4lcd ] at last circle } ')

# One-terminal utilities ##################################################

                            `Syncsymb(at position, rad)
                                Symbol for sync meter'
define(`Syncsymb',`[ define(`m4ssrad',`ifelse(`$2',,(dimen_/4),`($2)')')dnl
 Origin: Here
 {arc <-> ht arrowht/2 wid arrowwid*2/3 \
   from Rect_(m4ssrad,30) to Rect_(m4ssrad,150) with .c at Here}
 line from (0,m4ssrad) to (0,-m4ssrad/2)
 `$3' ] with .Origin ifelse(`$1',,`at Here',`$1')')

                            `m4br_one( `name', stem linespec, body keys,
                               breaker keys )'
                            `Draw the breaker in the stem then the element'
define(`m4br_one',
 `M4_S: last line.start
  setkey_(`$4',lgth,brksiz_)dnl
  line from M4_S to last line.end+vec_(-(m4lgth)*5/2,0)
  sl_breaker(to rvec_(m4lgth,0),`$4')
  $1(to rvec_((m4lgth)*3/2,0),`$3')
  move to M4_S ')

                            `sl_eleminit_(linespec or (for zero length)
                                U|D|L|R|number [at location])'
define(`sl_eleminit_',
 `ifelse(regexp(`$1',^ *[UDLR0123456789]),-1,
   `eleminit_(`$1',dimen_)',
   `pushdef(`M4pos',`ifinstr(`$1',` at ',`patsubst(`$1',^.* at *)')')dnl
    ifelse(M4pos,,,`move to M4pos;') setdir_(patsubst(`$1',` at.*'))
   line invis from Here to Here popdef(`M4pos')')')

# Two-terminal elements ###################################################

                            `sl_transformer(linespec,keys,
                              input breaker keys, output breaker keys)
                             keys:
                               type=I|S
                               (type=I) scale=expr; (default 1.5)
                                        cycles=n; (default 4)
                               (type=S) body=shaded "color";
                               name=Body name;
                               (breaker default names BrI, BrO)'
define(`sl_transformer',
 `setkeys_(`$2',name::N; type:I:N; cycles:4:N; body::N;  scale:1.5:; )dnl
  ifelse(`$3'`$4',,
   `ifinstr(m4type,S,
     `source(`$1',G,,,m4body)',
     `eleminit_(`$1'); m4atmp = rp_ang; m4slen = rp_len
      define(`m4swd',`dimen_*3/16*m4scale')dnl
      { line to rvec_((m4slen-m4swd)/2,0)
        {ifelse(m4name,,SL_box,m4name): [ linewid = linewid*m4scale
          {L1: inductor(to vec_(0,-m4cycles*dimen_/8),,m4cycles)}
          {point_(m4atmp)
           L2: inductor(from vec_(dimen_*3/16,-m4cycles*dimen_/8) \
             to vec_(dimen_*3/16,0),,m4cycles)}
           C2: last line.c; point_(m4atmp) ] with .L1.c at Here}
        line from rvec_(m4swd,0) to rvec_((m4slen+m4swd)/2,0) }
      line invis to rvec_(rp_len,0)') ',
   `m4br_two(`sl_transformer',`$1',`$2',m4brk_(`$3',BrI),m4brk_(`$4',BrO),
      ifelse(`$3',,,I)`'ifelse(`$4',,,O))') ')

                            `Two-terminal box'
                            `sl_ttbox(linespec,keys,breaker keys,breaker keys)
                             keys= lgth=expr; wdth=expr; box=attributes;
                               supp=additional rotbox commands; name=Body name;
                               text="text";
                               (breaker default names BrI, BrO)'
define(`sl_ttbox',
 `setkeys_(`$2',`lgth:dimen_*3/4; wdth:dimen_*3/4;
    name::N; box::N; text::N; supp::N')dnl
  ifelse(`$3'`$4',,
   `eleminit_(`$1')
    {line to rvec_((rp_len-m4lgth)/2,0)
      {ifelse(m4name,,,m4name:)rotbox(m4lgth,m4wdth,m4box,,m4supp) \
        with .W at Here }
      {ifelse(m4text,,,`{m4text at rvec_(m4lgth/2,0)}') }
     line from rvec_(m4lgth,0) to rvec_((rp_len+m4lgth)/2,0)}
    line invis to rvec_(rp_len,0) ',
   `m4br_two(`sl_ttbox',`$1',`$2',m4brk_(`$3',BrI),m4brk_(`$4',BrO),
      ifelse(`$3',,,I)`'ifelse(`$4',,,O))') ')

define(`m4brk_',`ifelse(`$1',,,
  `ifelse(`$1',C,,`$1',O,box=fill 0,`$1')`'ifelse(`$2',,,;name=`$2')')')

                            `sl_rectifier(ttbox args)'
define(`sl_rectifier',
 `sl_ttbox(`$@')
  { line from last [].Line.ne to last [].Line.sw
    AC: ACsymbol(at last [].C+(-m4lgth/6, m4wdth/4),,,R)
    DC: DCsymbol(at 2nd last [].C+( m4lgth/6,-m4wdth/4),,,R) } ')

                            `sl_inverter(ttbox args)'
define(`sl_inverter',
 `sl_ttbox(`$@')
  { line from last [].Line.ne to last [].Line.sw
    DC: DCsymbol(at last [].C+(-m4lgth/6, m4wdth/4),,,R)
    AC: ACsymbol(at 2nd last [].C+( m4lgth/6,-m4wdth/4),,,R) } ')

                            `sl_breaker(linespec, type=[A|C][D]; ttbox keys)
                               C is for curved breaker
                               D is for sl_drawout'
define(`sl_breaker',
 `setkeys_(`$2',`lgth:brksiz_; wdth:brksiz_; name::N; type::N')dnl
  ifinstr(m4type,C,
   `ifinstr(m4type,D,
     `m4ch_two(`cbreaker',`$1')',
     `ifelse(m4name,,,m4name:) cbreaker(`$1')')',
   `ifinstr(m4type,D,
     `m4ch_two(`sl_ttbox',`$1',lgth=m4lgth;wdth=m4wdth;`$2';name=Br)',
     `sl_ttbox(`$1',lgth=m4lgth;wdth=m4wdth;`$2')') ') ')

                            `sl_reactor(linespec,keys,breaker keys,breaker keys)
                             keys=
                               diam=expr,
                             (Default breaker names BrI and BrO)'
define(`sl_reactor',
 `setkeys_(`$2',`diam:sourcerad_*4/3; type::N')dnl
  ifelse(`$3'`$4',,
   `eleminit_(`$1')
    { line to rvec_(rp_len/2,0) then to rvec_(rp_len/2,-m4diam/2); round
      arc rad m4diam/2 cw from Here to rvec_(m4diam/2,m4diam/2) \
        with .c at rvec_(0,m4diam/2); round
      line to rvec_(rp_len/2-m4diam/2,0) }
    {[ box invis ht m4diam wid m4diam ] at rvec_(rp_len/2,0)}
    line invis to rvec_(rp_len,0) ',
   `m4br_two(`sl_reactor', `$1', lgth=m4diam*2;`$2',
      m4brk_(`$3',BrI),m4brk_(`$4',BrO),ifelse(`$3',,,I)`'ifelse(`$4',,,O))')')

                            `sl_busbar( linespec, nports, keys )
                             Labels P1, P2 ... Pnports are defined on the line.
                                  keys: line=line attributes;
                                        port=D; (dotted ports)
                             The bus extends beyond the first and last points
                              by dimen_/5 which can be redefined as
                                line=chop -(expr)'
define(`sl_busbar',
 `define(`m4npoints',`ifelse(`$2',,2,`$2')')dnl
  setkeys_(`$3',`line:thick 1.6 chop -dimen_/5:N; port::N')dnl
  [ tmp_ang = rp_ang
    eleminit_(`$1',(m4npoints-1)*dimen_)
    Start: last line.start; End: last line.end
    for_(1,m4npoints,1,
     `P`'m4x: (m4x-1)/(m4npoints-1) between Start and End dnl
     ifinstr(m4port,D,` ;dot(at P`'m4x)')')
    Line: line from Start to End m4line
    Start: last line.start; End: last line.end
    point_(tmp_ang) ] ')

                            `sl_drawout(linespec, keys, R)
                             Drawout (i.e. plugin) chevron element;
                               keys:  type=T; (truncated leads)
                                      lgth=expr; (body size)
                                      wdth=expr;
                                      name=Name; (body name)
                                      line= line attributes (e.g. thick 2)
                               arg3=R reverse direction'
define(`sl_drawout',
  `setkeys_(`$2',`lgth:drosiz_; wdth:drosiz_; type::N; name::N; line::N')dnl
   eleminit_(`$1',ifelse(m4type,T,m4lgth))
   ifelse(`$3',R,`{M4ds: Here; move to last line.end; rp_ang = rp_ang+pi_')
   {line to rvec_(rp_len/2,0)
    ifelse(m4name,,,m4name:) [
     S: Here; {line from rvec_(-m4lgth/2,m4wdth/2) to Here then
       to rvec_(-m4lgth/2,-m4wdth/2) m4line }
     E: rvec_(m4lgth/2,0); line from rvec_(0,m4wdth/2) to E then
       to rvec_(0,-m4wdth/2) m4line ] with .S at Here
     ifelse(m4type,T,,
      line from last [].E to last [].E+vec_((rp_len-m4lgth)/2,0))}
    ifelse(`$3',R,`rp_ang = rp_ang-pi_; move to M4ds}')
   line invis to rvec_(rp_len,0) ')

# Two-terminal utilities ##################################################

                            `Breakers in the input and output lines:'
                            `m4br_two(`2-term element macroname in quotes',
                                linespec, body keys,
                                input breaker keys,
                                output breaker keys,
                                I|O|IO)'
                            `(Default breaker names are BrI and BrO)'
define(`m4br_two',
 `define(`m4il',`ifinstr(`$6',I,`setkey_(`$4',lgth,brksiz_) m4lgth',0)')dnl
  define(`m4ol',`ifinstr(`$6',O,`setkey_(`$5',lgth,brksiz_) m4lgth',0)')dnl
  define(`m4bl',`setkey_(`$3',lgth,dimen_*4/3) m4lgth')dnl
  eleminit_(`$2',dimen_*3)
  M4start: Here; M4end: last line.end
  M4cc: last line.c+vec_(((m4il*3/2)-(m4ol*3/2)),0)
  M4ii: M4cc+vec_(-min((m4bl/2+m4il/2),distance(M4start,M4cc)-m4il),0)
  line from M4start to ifinstr(`$6',I,
   `M4ii+vec_(-m4il,0); sl_breaker(to M4ii,`$4';name=BrI)',M4ii)
  M4oi: M4cc+vec_(min((m4bl/2+m4ol/2),distance(M4end,M4cc)-m4ol),0)
  $1(from M4ii to M4oi,`$3')
  ifinstr(`$6',O,`sl_breaker(to M4oi+vec_(m4ol,0),`$5';name=BrO)')
  line to M4end
  line invis from M4start to M4end ')

                            `Chevrons in the input and output lines:'
                            `m4ch_two(`2-term element macroname in quotes',
                                linespec, body keys,
                                input breaker keys,
                                output breaker keys,
                                I|O|IO)'
define(`m4ch_two',
 `define(`m4bl',`setkey_(`$3',lgth,dimen_*3/8) m4lgth')dnl
  eleminit_(`$2',dimen_*3)
  M4start: Here; M4end: last line.end
  M4elem: $1(to rvec_(m4bl+2*drosiz_,0) with .c at last line.c,`$3')
  sl_drawout(from last line.start-vec_(drosiz_,0) to last line.start,type=T,R)
  line from last line.start to M4start
  sl_drawout(from M4elem.end to M4elem.end+vec_(drosiz_,0),type=T)
  line to M4end
  line invis from M4start to M4end')

# Composite elements ###################################################

                            `sl_ct( at position, stem length, U|D|L|R|expr,
                                scale=expr) (default scale is 1.5)'
define(`sl_ct',
 `[ setdir_(`$3'); setkey_(`$4',scale,1.5); linewid = linewid*m4scale
    L: inductor(to vec_(2*dimen_/8,0),,2)
      stemlen = ifelse(`$2',,dimen_/5,`$2')
      line from L.start to L.start+vec_(0,-stemlen)
    Ts: Here
      line from L.end to L.end+vec_(0,-stemlen)
    Te: Here
      line from L.c to L.c+vec_(0,-stemlen)
    Tc: Here
    resetdir_ ] with .L.c at ifelse(`$1',,Here,patsubst(`$1',^ *at *)) ')

# #######################################################################

divert(0)dnl


  u = dimen_

  svg_font(sans-serif,9.0bp__,textoffset)

define(`ctb',`[CT: sl_ct(,,`$1')
      L: line up_ u/2 with .c at CT.L.c
      BU: sl_breaker( up_ u*2/3,box=fill_(0))
      BR: sl_breaker( right_ ifelse(`$1',U,,-)u*3/4 \
        from CT.ifelse(`$1',U,Te,Ts),box=fill_(0))]')

define(`tsbx',`sl_ttbox(`$1',`$2';lgth=u*0.4;wdth=u/2;text="TS")')
define(`lcdiam',u*0.85)
define(`lcirc',`[C: circle diam lcdiam ifelse(`$1',,,`$1')
  line right C.diam*3/4 with .c at C
  ifelse(`$2',,,`$2' at C.ne above )
  ifelse(`$3',,,`$3' at C.se below )
 ]')

define(`Svee',`[S: Here; line from (sqrt(3),1)*(`$1') to S \
   then to (sqrt(3),-1)*(`$1')]')

Box1: [
  V: line down_ u
    {`"13.8 kV 3 ph + GND 60 Hz"' at V.start rjust}
    { ellipse wid u/6 ht u/10 at Here+(0,u/3)
      line right_ u/2 from last ellipse.e
      ellipse wid u*4/3 ht u/2 "M1-00" }
    AT: open_arrow(ToPos(,U,u), u/3*sqrt(3)/2, u/3)
    dot(at 2nd last line.start)
    { line left_ u then up_ u/3 ht u/10 wid u/10; dot }
    line down_ u
    { line up_ u/2 from last line.end+(-u/6,u/8)
      sl_disk( left_ u/2 from last line.c,diam=u/3;name=L ); move to L.c
      for_(45,315,90,`{line to L.c+(Rect_(L.diam,m4x)) chop u/5 chop 0}') }
    T: dot
    { sl_transformer(right_ 2*u,cycles=2;name=Tr1)
      {"14400:120` 'V" at last [].n above}
      { Svee(u/7) with .ne at Tr1.sw+(-u/15,-u/15)
        Svee(u/7) with .nw at Tr1.se+( u/15,-u/15); ground(at last [].S) }
      dot; fuse(right_ u,C)
      line to (Here,1st ellipse)
      MB: box wid 3/4*u ht 3/4*u with .sw at Here+(-u/8,0) 
      circle diam 5/8*u at last box "M" }
    line down u/2
    CT1: ctb(U) with .BU.end at Here
    {"500:5" rjust at CT1.CT.w }
    { Svee(u/7) with .S at CT1.CT.Ts+( u/4,0); ground(at last [].S) }
    line from MB.se+(-u/8,0) down_ MB.s.y-CT1.BR.y then to CT1.BR.end
    line from CT1.L.start down_ 3/4*u
    T2: dot
    { line left_ u from T2; sl_drawout(,type=T,R); fuse(left_ u,C)
      sl_transformer(left_ u/2,cycles=2;name=Tr2)
      {"14400:120` 'V" at last [].n above}
      {Ysymbol(with .ne at Tr2.sw+(u/8,0),type=G;size=u/6)}
      {Ysymbol(with .nw at Tr2.se+(u/15,0),type=G;size=u/6)}
      fuse(left_ u,C); sl_drawout(,type=T)
      TS1: tsbx(left_ u*3/4) }
    CT2: ctb(U) with .BU.end at Here
    {"800:5" rjust at CT2.CT.w }
    {Ysymbol(at CT2.CT.Ts+(u/2,-u/8),type=G;size=u/5)}
    sl_breaker(up_ 2.0*u with .end at CT2.L.start,
      lgth=u*0.75;wdth=u*0.8;name=M1;type=D)
    {`"52-M1" "1200 A"' at M1}
    CT3: ctb(D) with .BU.end at last line.start
    {"800:5" ljust at CT3.CT.e }
    BT3: CT3.BR.end
    {Ysymbol(at CT3.CT.Te+(-u/2,-u/8),type=G;size=u/5)}
    CT4: ctb(D) with .BU.end at CT3.L.start
    {"600:5 MR" ljust at CT4.CT.e }
    {Ysymbol(at CT4.CT.Te+(-u/2,-u/8),type=G;size=u/5)}
    line from CT4.L.start down_ u; dot;
    { line left_ u then up_ u/3 ht u/10 wid u/10; dot }
    AB: arrow down_ u*2/3 ht u/3*sqrt(3)/2 wid u/3
    tsbx(left_ u from CT3.BR.end,text="SB")
    line to (TS1.start,Here)
    tsbx(left_ u*3/4); line left_ u/2+lcdiam/2 then up_ u/5
    CEDR3: lcirc("59" "M1","(3)") with .C.s at Here
    Q: line left_ u*3/4 from CEDR3.C.w
    { line left_ u/8 from Q.c+(u/8,CEDR3.C.rad) \
        then down_ CEDR3.C.diam then right_ u/8 }
    CEDR4: lcirc("22" "M1","(1)") with .C.e at Here
    { arrow right_ 3/2*u from CEDR3.C.e
      lcirc("86" "M1","(1)") with .C.w at Here
      arrow right_ u from last [].C.e
      "TRIP M1" ljust above "TRIP S1" ljust }
    { CEDR1: lcirc("59" "M1",,"(3)") with .C.w at (Q.c,T2)
      { line from TS1.end to CEDR1.C.e }
      CEDR2: lcirc("22" "M1",,"(3)")
      arrow up u*2/3 from (CEDR2.e.x,CEDR2.n.y+u/3)
      "TRIP S1" above; "TRIP M1" at last "".n above
      move to last arrow.start
      line from CEDR2.n to (CEDR2,Here) then to (CEDR1,Here) then to CEDR1.n
      }
    EDR5000: box wid TS1.end.x-CEDR4.C.w.x-u/8 ht last arrow.y-CEDR4.C.s.y+u/2 \
      with .n at last arrow "EDR-5000-M1"
    M2: box wid u*1.1 ht u*0.85 at (TS1,CT4.BR) "PXM6000" "METER"
    { line from M2.e to CT4.BR.end }
    line from M2.w left_ u*3/4
    BT: dot
    line to (EDR5000.w,Here)+(-u/5,0); Lft: Here
    continue to (Here,CEDR2.C) then to CEDR2.C.w
    Head: line down_ u*3/4 from AB.end
    { ellipse wid u/6 ht u/10 at Here+(0,u/3)
      line left_ u/2 from last ellipse.w
      ellipse wid u*4/3 ht u/2 "M1-00" }
    { line right_ u*3/4 then down_ u/8;
      {line right_ u/10 with .c at Here}
      {line right_ u/10 with .c at Here+(0,-u/8)}
      pushdef(`dimen_',u/2) ground(at last line.c) popdef(`dimen_') }
    { line down_ u/8 from Here+(u/2,0)
      { pushdef(`dimen_',u/2) ground(at Here+(0,-u/8)) popdef(`dimen_') }
      pushdef(`dotrad_',dotrad_/2) gap(down_ u/8,1) popdef(`dotrad_') }
    BB: arrow <- down_ u/2 ht u/3*sqrt(3)/2 wid u/3
    sl_transformer(down_ u,name=Tr3)
    { CUR2: lcirc("21" "T1",,"(1)") with .C.c at Tr3.e+(u,0)
      CUR3: lcirc("49" "T1",,"(1)") with .C.w at CUR2.C.e
      CUR1: lcirc("21" "T1","(1)") with .C.c at CUR2.C.c+(Rect_(CUR2.C.diam,60))
      }
    line from BT to (BT.x,AB.y+u/10); X: Here; corner
    CT5: ctb(U) with .BU.end at Tr3.L2.end
    {"600:5" ljust below at CT5.CT.e }
    corner(,at CT5.CT.Ts); ground
    line from CT5.BR.end to (CUR3.C.e,CT5.BR.end)+(u/6,0)
    continue to (Here,X)
    tsbx(up_ u*4/3)
    CUR5: lcirc("51G" "T1","(1)") with .C.s at Here
    CUR6: lcirc("87" "T1","(1)") with .C.c at CUR5.C.c+(2*u,0)
    arrow up_ u*2/3 from CUR5.C.n
    CUR4: lcirc("86" "T1","(1)") with .C.s at Here
    arrow up_ u*2/3 from CUR4.C.n
    arrow <- from CUR4.C.w left CUR4.C.w.x-CUR1.C.x; corner
    J2: line to CUR1.C.n
    arrow from CUR6.C.w left_ u/3 then up_ CUR4.C.y-CUR6.C.y then to CUR4.C.e
    tsbx(up_ u from CUR6.C.n)
    line to (Here,CT2.BR) then to CT2.BR.end
    crossover(from X to (CUR5,X)-(u*2/3,0),L,AB,J2); corner
    tsbx(up_ u*4/3); dot
    ETR5000: box wid CUR6.C.e.x-CUR1.C.x + u/5 ht CUR5.C.diam+u/2 \
      with .nw at (CUR1.C.n.x-u/8,CUR5.C.n.y+u/6)
    {"   ETR-5000-T1" wid 72bp__ at ETR5000.s above }
    AL: arrow from Tr3.L2.c down_ u ht u/3*sqrt(3)/2 wid u/3; BX: Here
    { line down_ u*2/3 from Here+( u/12,0) }
    { line down_ u*2/3 from Here+(-u/12,0) }
    { line down_ u*2/3; Bbot: Here }
    { ellipse wid u/6 ht u/10 at Here+(0,-u/6)
      line left_ u/2 from last ellipse.e
      ellipse wid u*2 ht u/2 `"2000 A BUSWAY"' }
    line from (CUR6,Bbot) to (CUR6,X); tsbx(to CUR6.C.s)
    Outer: box ht AT.end.y-AB.end.y wid ETR5000.e.x-Lft.x + u/3 \
      with .nw at (Lft.x-u/6,AT.end.y)
    `"USG-1A"' ljust \
    `"13.8 KV 1200 A"' ljust \
    `"50 kA SYM S.C."' ljust \
    `"(15 kV - 95 kV BIL RATED)"' ljust at Outer.nw+(0,-u*2/3)
  ]

  command "</g>"

.PE