ruby-graphviz 0.9.7 → 0.9.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,94 @@
1
+ @echo "arrowhead.rb"
2
+ @ruby arrowhead.rb
3
+ @echo "HTML-Labels.rb"
4
+ @ruby HTML-Labels.rb
5
+ @echo "p2p.rb"
6
+ @ruby p2p.rb
7
+
8
+ @echo "sample01.rb"
9
+ @ruby sample01.rb
10
+ @echo "sample02.rb"
11
+ @ruby sample02.rb
12
+ @echo "sample03.rb"
13
+ @ruby sample03.rb
14
+ @echo "sample04.rb"
15
+ @ruby sample04.rb
16
+ @echo "sample05.rb"
17
+ @ruby sample05.rb
18
+ @echo "sample06.rb"
19
+ @ruby sample06.rb
20
+ @echo "sample07.rb"
21
+ @ruby sample07.rb
22
+ @echo "sample08.rb"
23
+ @ruby sample08.rb
24
+ @echo "sample09.rb"
25
+ @ruby sample09.rb
26
+ @echo "sample10.rb"
27
+ @ruby sample10.rb
28
+ @echo "sample11.rb"
29
+ @ruby sample11.rb
30
+ @echo "sample12.rb"
31
+ @ruby sample12.rb
32
+ @echo "sample13.rb"
33
+ @ruby sample13.rb
34
+ @echo "sample14.rb"
35
+ @ruby sample14.rb
36
+ @echo "sample15.rb"
37
+ @ruby sample15.rb
38
+ @echo "sample16.rb"
39
+ @ruby sample16.rb
40
+ @echo "sample17.rb"
41
+ @ruby sample17.rb
42
+ @echo "sample18.rb"
43
+ @ruby sample18.rb
44
+ @echo "sample19.rb"
45
+ @ruby sample19.rb
46
+ @echo "sample20.rb"
47
+ @ruby sample20.rb
48
+ @echo "sample21.rb"
49
+ @ruby sample21.rb
50
+ @echo "sample22.rb"
51
+ @ruby sample22.rb
52
+ @echo "sample23.rb"
53
+ @ruby sample23.rb
54
+ @echo "sample24.rb"
55
+ @ruby sample24.rb
56
+ @echo "sample25.rb"
57
+ @ruby sample25.rb
58
+ @echo "sample26.rb"
59
+ @ruby sample26.rb
60
+ @echo "sample27.rb"
61
+ @ruby sample27.rb
62
+ @echo "sample28.rb"
63
+ @ruby sample28.rb
64
+ @echo "sample29.rb"
65
+ @ruby sample29.rb
66
+ @echo "sample30.rb"
67
+ @ruby sample30.rb
68
+
69
+
70
+ @echo "shapes.rb"
71
+ @ruby shapes.rb
72
+ @echo "testorder.rb"
73
+ @ruby testorder.rb
74
+ @echo "testxml.rb"
75
+ @ruby testxml.rb
76
+
77
+ @cd dot
78
+ @pwd
79
+ @echo "dot/hello_test.rb"
80
+ @ruby hello_test.rb
81
+ @cd ..
82
+
83
+ @cd graphviz.org
84
+ @echo "graphviz.org/cluster.rb"
85
+ @ruby cluster.rb
86
+ @echo "graphviz.org/hello_world.rb"
87
+ @ruby hello_world.rb
88
+ @echo "graphviz.org/lion_share.rb"
89
+ @ruby lion_share.rb
90
+ @echo "graphviz.org/process.rb"
91
+ @ruby process.rb
92
+ @echo "graphviz.org/TrafficLights.rb"
93
+ @ruby TrafficLights.rb
94
+ @cd ..
data/examples/maketest.sh CHANGED
@@ -57,6 +57,16 @@ echo "sample24.rb"
57
57
  ruby sample24.rb
58
58
  echo "sample25.rb"
59
59
  ruby sample25.rb
60
+ echo "sample26.rb"
61
+ ruby sample26.rb
62
+ echo "sample27.rb"
63
+ ruby sample27.rb
64
+ echo "sample28.rb"
65
+ ruby sample28.rb
66
+ echo "sample29.rb"
67
+ ruby sample29.rb
68
+ echo "sample30.rb"
69
+ ruby sample30.rb
60
70
 
61
71
  echo "shapes.rb"
62
72
  ruby shapes.rb
data/examples/sample01.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/ruby
2
2
 
3
- $:.unshift( "../lib" );
3
+ $:.unshift( "../lib" )
4
4
  require "graphviz"
5
5
 
6
6
  g = nil
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift( "../lib" );
4
+ require "graphviz"
5
+
6
+ puts GraphViz.new(:G){ |g|
7
+ g[:ratio => "auto", :label => "I love the world!"]
8
+
9
+ g.hello( :label => "Hello", :color => "blue" ) # You can do this
10
+ g.none[ :label => "World", :color => "green" ] # or that
11
+ (g.hello - g.none)[:style => :bold, :label => " I say"]
12
+ }.save( :png => "#{$0}.png" )
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift( "../lib" );
4
+ require "graphviz"
5
+
6
+ GraphViz.new(:G){ |g|
7
+ g.add_node("\"Hello.\"\nHow are you ?", :href => "http://www.website.com", :tooltip => "\"Hello.\"\nHow are you ?", :shape => "ellipse", :color => "#FF0000")
8
+ }.save( :svg => "#{$0}.svg" )
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift( "../lib" );
4
+ require "graphviz"
5
+
6
+ GraphViz.new(:g){ |g|
7
+ g[:center] = true
8
+ a = g.add_node("A", :shape => "sdl_procedure_start", :peripheries => 0 )
9
+ b = g.add_node("B", :shape => "sdl_save", :peripheries => 0)
10
+ c = g.add_node("n", :shape => "box", :label => "\\G::\\N\\r")
11
+ a << b << c
12
+ }.save( :ps => "#{$0}.ps", :extlib => "sdlshapes/sdl.ps" )
@@ -0,0 +1,2 @@
1
+ PostScript library for SDL node shapes (http://www.sdl-forum.org/SDL/index.htm)
2
+ by Mark Rison of Cambridge Silicon Radio Ltd.
@@ -0,0 +1,655 @@
1
+ %! SDL shapes for Graphviz/dot in PostScript output mode
2
+
3
+ % FILE
4
+ % sdl.ps - SDL shapes for Graphviz/dot in PostScript output mode
5
+ %
6
+ % USE
7
+ % All procedures expect to be passed a rectangular bounding box in the
8
+ % order [upper right, lower right, lower left, upper left, upper right].
9
+ % All procedures expect to be used with "peripheries = 0".
10
+ %
11
+ % BUGS
12
+ % The following shapes are currently not implemented:
13
+ % - frame/system/block/process/procedure/service/procedure, and types thereof
14
+ % - macro inlet/outlet/call
15
+ % - exception handler/handle/raise
16
+ % - decision (suggest use diamond)
17
+ % - alternative (suggest use triangle)
18
+ % - internal input/output (suggest stop using historical relics!)
19
+ %
20
+ % COPYRIGHT AND PERMISSION NOTICE
21
+ % Copyright (C) 2005 Cambridge Silicon Radio Ltd.; all rights reserved.
22
+ %
23
+ % Permission is hereby granted, free of charge, to any person obtaining
24
+ % a copy of this software and associated documentation files (the
25
+ % "Software"), to deal in the Software without restriction, including
26
+ % without limitation the rights to use, copy, modify, merge, publish,
27
+ % distribute, sublicense, and/or sell copies of the Software, and to
28
+ % permit persons to whom the Software is furnished to do so, subject to
29
+ % the following conditions:
30
+ %
31
+ % The above copyright notice and this permission notice shall be
32
+ % included in all copies or substantial portions of the Software.
33
+ %
34
+ % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
35
+ % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
36
+ % MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
37
+ % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
38
+ % LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
39
+ % OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
40
+ % WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
41
+ %
42
+ % Except as contained in this notice, the name of a copyright holder
43
+ % shall not be used in advertising or otherwise to promote the sale, use
44
+ % or other dealings in the Software without prior written authorization
45
+ % of the copyright holder.
46
+ %
47
+ % REVISION
48
+ % #4
49
+
50
+ /xdef {exch def} bind def
51
+
52
+ % SDL task
53
+
54
+ /sdl_task {
55
+ 3 1 roll % put filled flag at end
56
+ 4 ne { stop } if % sanity-check number of sides
57
+ aload pop
58
+ newpath
59
+ moveto
60
+ lineto
61
+ lineto
62
+ lineto
63
+ pop pop
64
+ closepath
65
+ { fill } { stroke } ifelse
66
+ } bind def
67
+
68
+ % SDL input from right
69
+ % The indent has lines at 45 degrees
70
+ % There should be a few spaces at the end of this shape's label
71
+
72
+ /sdl_input_from_right {
73
+ 9 dict begin
74
+ 3 1 roll % put filled flag at end
75
+ 4 ne { stop } if % sanity-check number of sides
76
+ aload pop
77
+ /ury xdef /urx xdef
78
+ /lry xdef /lrx xdef
79
+ /lly xdef /llx xdef
80
+ /uly xdef /ulx xdef
81
+ /h2 ury lry sub 2 div def
82
+ newpath
83
+ moveto
84
+ urx h2 sub ury h2 sub lineto
85
+ lrx lry lineto
86
+ llx lly lineto
87
+ ulx uly lineto
88
+ closepath
89
+ { fill } { stroke } ifelse
90
+ end
91
+ } bind def
92
+
93
+ % SDL input from left
94
+ % Similar to SDL input from right
95
+ % There should be a few spaces at the start of this shape's label
96
+
97
+ /sdl_input_from_left {
98
+ 9 dict begin
99
+ 3 1 roll % put filled flag at end
100
+ 4 ne { stop } if % sanity-check number of sides
101
+ aload pop
102
+ /ury xdef /urx xdef
103
+ /lry xdef /lrx xdef
104
+ /lly xdef /llx xdef
105
+ /uly xdef /ulx xdef
106
+ /h2 uly lly sub 2 div def
107
+ newpath
108
+ moveto
109
+ lrx lry lineto
110
+ llx lly lineto
111
+ ulx h2 add ury h2 sub lineto
112
+ ulx uly lineto
113
+ closepath
114
+ { fill } { stroke } ifelse
115
+ end
116
+ } bind def
117
+
118
+ % SDL priority input from right
119
+ % Similar to SDL input from right
120
+ % The chevrons are displaced by an eighth of the shape height
121
+ % The filled version is indistinguishable from a non-priority SDL input
122
+
123
+ /sdl_priority_input_from_right {
124
+ 9 dict begin
125
+ 3 1 roll % put filled flag at end
126
+ 4 ne { stop } if % sanity-check number of sides
127
+ aload pop
128
+ /ury xdef /urx xdef
129
+ /lry xdef /lrx xdef
130
+ /lly xdef /llx xdef
131
+ /uly xdef /ulx xdef
132
+ /h2 ury lry sub 2 div def
133
+ newpath
134
+ moveto
135
+ urx h2 sub ury h2 sub lineto
136
+ lrx lry lineto
137
+ llx lly lineto
138
+ ulx uly lineto
139
+ closepath
140
+ { fill } { stroke
141
+ urx h2 4 div sub ury moveto
142
+ urx h2 sub h2 4 div sub ury h2 sub lineto
143
+ lrx h2 4 div sub lry lineto
144
+ stroke } ifelse
145
+ end
146
+ } bind def
147
+
148
+ % SDL priority input from left
149
+ % Similar to SDL priority input from right
150
+
151
+ /sdl_priority_input_from_left {
152
+ 9 dict begin
153
+ 3 1 roll % put filled flag at end
154
+ 4 ne { stop } if % sanity-check number of sides
155
+ aload pop
156
+ /ury xdef /urx xdef
157
+ /lry xdef /lrx xdef
158
+ /lly xdef /llx xdef
159
+ /uly xdef /ulx xdef
160
+ /h2 uly lly sub 2 div def
161
+ newpath
162
+ moveto
163
+ lrx lry lineto
164
+ llx lly lineto
165
+ ulx h2 add uly h2 sub lineto
166
+ ulx uly lineto
167
+ closepath
168
+ { fill } { stroke
169
+ llx h2 4 div add lly moveto
170
+ ulx h2 add h2 4 div add uly h2 sub lineto
171
+ ulx h2 4 div add uly lineto
172
+ stroke } ifelse
173
+ end
174
+ } bind def
175
+
176
+ % SDL start
177
+ % The left and right sides are semicircles
178
+ % This should be used with "label = " ""
179
+
180
+ /sdl_start {
181
+ 9 dict begin
182
+ 3 1 roll % put filled flag at end
183
+ 4 ne { stop } if % sanity-check number of sides
184
+ aload pop
185
+ /ury xdef /urx xdef
186
+ /lry xdef /lrx xdef
187
+ /lly xdef /llx xdef
188
+ /uly xdef /ulx xdef
189
+ pop pop
190
+ /r ury lry sub 2 div def
191
+ newpath
192
+ urx r sub ury r sub r 90 -90 arcn
193
+ ulx r add uly r sub r -90 90 arcn
194
+ closepath
195
+ { fill } { stroke } ifelse
196
+ end
197
+ } bind def
198
+
199
+ % SDL procedure start
200
+ % Similar to SDL start
201
+ % The filled version is indistinguishable from an SDL start
202
+ % This should be used with "label = " ""
203
+
204
+ /sdl_procedure_start {
205
+ 9 dict begin
206
+ 3 1 roll % put filled flag at end
207
+ 4 ne { stop } if % sanity-check number of sides
208
+ aload pop
209
+ /ury xdef /urx xdef
210
+ /lry xdef /lrx xdef
211
+ /lly xdef /llx xdef
212
+ /uly xdef /ulx xdef
213
+ pop pop
214
+ /r ury lry sub 2 div def
215
+ newpath
216
+ urx r sub ury r sub r 90 -90 arcn
217
+ ulx r add uly r sub r -90 90 arcn
218
+ closepath
219
+ { fill } { stroke
220
+ lrx r sub lry moveto
221
+ 0 r 2 mul rlineto
222
+ llx r add lly moveto
223
+ 0 r 2 mul rlineto
224
+ stroke } ifelse
225
+ end
226
+ } bind def
227
+
228
+ % SDL state/nextstate
229
+ % The left and right sides are arcs
230
+
231
+ /sdl_state {
232
+ 12 dict begin
233
+ 3 1 roll % put filled flag at end
234
+ 4 ne { stop } if % sanity-check number of sides
235
+ aload pop
236
+ /ury xdef /urx xdef
237
+ /lry xdef /lrx xdef
238
+ /lly xdef /llx xdef
239
+ /uly xdef /ulx xdef
240
+ pop pop
241
+ /h2 ury lry sub 2 div def
242
+ /w2 h2 1.5 mul def % was urx ulx sub 2 div def but this made curvature width-dependent
243
+ /r w2 def
244
+ /th h2 r dup mul h2 dup mul sub sqrt atan def
245
+ newpath
246
+ urx w2 sub ury h2 sub r th th neg arcn
247
+ ulx w2 add uly h2 sub r -180 th add -180 th sub arcn
248
+ closepath
249
+ { fill } { stroke } ifelse
250
+ end
251
+ } bind def
252
+
253
+ % SDL output to right
254
+ % The outdent has lines at 45 degrees
255
+ % There should be a few spaces at the end of this shape's label
256
+
257
+ /sdl_output_to_right {
258
+ 9 dict begin
259
+ 3 1 roll % put filled flag at end
260
+ 4 ne { stop } if % sanity-check number of sides
261
+ aload pop
262
+ /ury xdef /urx xdef
263
+ /lry xdef /lrx xdef
264
+ /lly xdef /llx xdef
265
+ /uly xdef /ulx xdef
266
+ /h2 ury lry sub 2 div def
267
+ newpath
268
+ exch h2 sub exch moveto
269
+ urx ury h2 sub lineto
270
+ lrx h2 sub lry lineto
271
+ llx lly lineto
272
+ ulx uly lineto
273
+ closepath
274
+ { fill } { stroke } ifelse
275
+ end
276
+ } bind def
277
+
278
+ % SDL output to left
279
+ % Similar to SDL output to right
280
+ % There should be a few spaces at the start of this shape's label
281
+
282
+ /sdl_output_to_left {
283
+ 9 dict begin
284
+ 3 1 roll % put filled flag at end
285
+ 4 ne { stop } if % sanity-check number of sides
286
+ aload pop
287
+ /ury xdef /urx xdef
288
+ /lry xdef /lrx xdef
289
+ /lly xdef /llx xdef
290
+ /uly xdef /ulx xdef
291
+ /h2 ury lry sub 2 div def
292
+ newpath
293
+ moveto
294
+ lrx lry lineto
295
+ llx h2 add lly lineto
296
+ ulx ury h2 sub lineto
297
+ ulx h2 add uly lineto
298
+ closepath
299
+ { fill } { stroke } ifelse
300
+ end
301
+ } bind def
302
+
303
+ % SDL continuous signal/enabling condition
304
+ % The chevrons have lines at 45 degrees
305
+ % There should be a few spaces at the start and end of this shape's label
306
+
307
+ /sdl_condition {
308
+ 9 dict begin
309
+ 3 1 roll % put filled flag at end
310
+ 4 ne { stop } if % sanity-check number of sides
311
+ aload pop
312
+ /ury xdef /urx xdef
313
+ /lry xdef /lrx xdef
314
+ /lly xdef /llx xdef
315
+ /uly xdef /ulx xdef
316
+ /h2 ury lry sub 2 div def
317
+ newpath
318
+ exch h2 sub exch moveto
319
+ urx ury h2 sub lineto
320
+ lrx h2 sub lry lineto
321
+ dup llx h2 add lly 3 -1 roll { lineto } { moveto } ifelse
322
+ ulx uly h2 sub lineto
323
+ ulx h2 add uly lineto
324
+ { fill } { stroke } ifelse
325
+ end
326
+ } bind def
327
+
328
+ % SDL save
329
+ % The left and right edges are at about 60 degrees
330
+ % There should be a few spaces at the start and end of this shape's label
331
+
332
+ /sdl_save {
333
+ 9 dict begin
334
+ 3 1 roll % put filled flag at end
335
+ 4 ne { stop } if % sanity-check number of sides
336
+ aload pop
337
+ /ury xdef /urx xdef
338
+ /lry xdef /lrx xdef
339
+ /lly xdef /llx xdef
340
+ /uly xdef /ulx xdef
341
+ /h3 ury lry sub 3 div def
342
+ newpath
343
+ moveto
344
+ lrx h3 sub lry lineto
345
+ llx lly lineto
346
+ ulx h3 add uly lineto
347
+ closepath
348
+ { fill } { stroke } ifelse
349
+ end
350
+ } bind def
351
+
352
+ % SDL stop
353
+ % The width of the bounding box is ignored; the lines are set at 45 degrees
354
+ % This shape cannot be filled
355
+ % This should be used with "label = """ and "arrowhead = none, headclip = false"
356
+
357
+ /sdl_stop {
358
+ 7 dict begin
359
+ { stop } if % make sure not asked to fill this
360
+ 4 ne { stop } if % sanity-check number of sides
361
+ aload pop
362
+ pop pop
363
+ /lry xdef /lrx xdef
364
+ /lly xdef /llx xdef
365
+ /uly xdef pop
366
+ /h2 uly lly sub 2 div def
367
+ /mx llx lrx add 2 div def
368
+ newpath
369
+ mx h2 add exch moveto pop
370
+ mx h2 sub lly lineto
371
+ mx h2 sub uly moveto
372
+ mx h2 add lry lineto
373
+ closepath
374
+ stroke
375
+ end
376
+ } bind def
377
+
378
+ % SDL return
379
+ % The width of the bounding box is ignored; the lines are set at 45 degrees
380
+ % The filled version is indistinguishable from an SDL connection
381
+
382
+ /sdl_return {
383
+ 9 dict begin
384
+ 3 1 roll % put filled flag at end
385
+ 4 ne { stop } if % sanity-check number of sides
386
+ aload pop
387
+ /ury xdef pop
388
+ /lry xdef /lrx xdef
389
+ /lly xdef /llx xdef
390
+ /uly xdef pop
391
+ pop pop
392
+ /h2 uly lly sub 2 div 2 sqrt div def
393
+ /mx llx lrx add 2 div def
394
+ /my lry ury add 2 div def
395
+ newpath
396
+ mx my uly lly sub 2 div 0 360 arc
397
+ { fill } { stroke
398
+ mx h2 add my h2 add moveto
399
+ mx h2 sub my h2 sub lineto
400
+ mx h2 sub my h2 add moveto
401
+ mx h2 add my h2 sub lineto
402
+ stroke } ifelse
403
+ end
404
+ } bind def
405
+
406
+ % SDL create
407
+ % The extra lines are displaced by an eighth of the shape height
408
+ % The filled version is indistinguishable from an SDL task
409
+
410
+ /sdl_create {
411
+ 9 dict begin
412
+ 3 1 roll % put filled flag at end
413
+ 4 ne { stop } if % sanity-check number of sides
414
+ aload pop
415
+ /ury xdef /urx xdef
416
+ /lry xdef /lrx xdef
417
+ /lly xdef /llx xdef
418
+ /uly xdef /ulx xdef
419
+ /h8 ury lry sub 8 div def
420
+ newpath
421
+ moveto
422
+ lrx lry lineto
423
+ llx lly lineto
424
+ ulx uly lineto
425
+ closepath
426
+ { fill } { stroke
427
+ ulx uly h8 sub moveto
428
+ urx ury h8 sub lineto
429
+ llx lly h8 add moveto
430
+ lrx lry h8 add lineto
431
+ stroke } ifelse
432
+ end
433
+ } bind def
434
+
435
+ % SDL call
436
+ % The extra lines are displaced by an eighth of the shape height
437
+ % The filled version is indistinguishable from an SDL task
438
+ % There should be a few spaces at the start and end of this shape's label
439
+
440
+ /sdl_call {
441
+ 9 dict begin
442
+ 3 1 roll % put filled flag at end
443
+ 4 ne { stop } if % sanity-check number of sides
444
+ aload pop
445
+ /ury xdef /urx xdef
446
+ /lry xdef /lrx xdef
447
+ /lly xdef /llx xdef
448
+ /uly xdef /ulx xdef
449
+ /h8 ury lry sub 8 div def
450
+ newpath
451
+ moveto
452
+ lrx lry lineto
453
+ llx lly lineto
454
+ ulx uly lineto
455
+ closepath
456
+ { fill } { stroke
457
+ urx h8 sub ury moveto
458
+ lrx h8 sub lry lineto
459
+ llx h8 add lly moveto
460
+ ulx h8 add uly lineto
461
+ stroke } ifelse
462
+ end
463
+ } bind def
464
+
465
+ % SDL text symbol
466
+ % The corner has a size of twice the H height
467
+
468
+ /sdl_text {
469
+ 10 dict begin
470
+ 3 1 roll % put filled flag at end
471
+ 4 ne { stop } if % sanity-check number of sides
472
+ aload pop
473
+ /ury xdef /urx xdef
474
+ /lry xdef /lrx xdef
475
+ /lly xdef /llx xdef
476
+ /uly xdef /ulx xdef
477
+ /h8 ury lry sub 8 div def
478
+ newpath
479
+ moveto
480
+ /d (H) true charpath flattenpath pathbbox exch pop exch sub exch pop 2 mul def
481
+ newpath
482
+ urx ury d sub moveto
483
+ lrx lry lineto
484
+ llx lly lineto
485
+ ulx uly lineto
486
+ urx d sub ury lineto
487
+ closepath
488
+ { fill } { stroke } ifelse
489
+ urx ury d sub moveto
490
+ d neg 0 rlineto
491
+ 0 d rlineto
492
+ stroke
493
+ end
494
+ } bind def
495
+
496
+ % SDL text extension from left
497
+ % This should be used with "rank = same"
498
+
499
+ /sdl_text_extension_from_left {
500
+ 3 1 roll % put filled flag at end
501
+ 4 ne { stop } if % sanity-check number of sides
502
+ aload pop
503
+ pop pop
504
+ moveto
505
+ lineto
506
+ lineto
507
+ lineto
508
+ { fill } { stroke } ifelse
509
+ } bind def
510
+
511
+ % SDL text extension from right
512
+ % This should be used with "rank = same"
513
+
514
+ /sdl_text_extension_from_right {
515
+ 3 1 roll % put filled flag at end
516
+ 4 ne { stop } if % sanity-check number of sides
517
+ aload pop
518
+ pop pop
519
+ 8 4 roll
520
+ moveto
521
+ lineto
522
+ lineto
523
+ lineto
524
+ { fill } { stroke } ifelse
525
+ } bind def
526
+
527
+ % SDL comment from left
528
+ % This should be used with "style = dashed" and "rank = same"
529
+
530
+ /sdl_comment_from_left { sdl_text_extension_from_left } bind def
531
+
532
+ % SDL comment from right
533
+ % This should be used with "style = dashed" and "rank = same"
534
+
535
+ /sdl_comment_from_right { sdl_text_extension_from_right } bind def
536
+
537
+ % SDL connector
538
+ % The width of the bounding box is ignored
539
+
540
+ /sdl_connector {
541
+ 7 dict begin
542
+ 3 1 roll % put filled flag at end
543
+ 4 ne { stop } if % sanity-check number of sides
544
+ aload pop
545
+ pop pop
546
+ /lry xdef /lrx xdef
547
+ /lly xdef /llx xdef
548
+ /uly xdef pop
549
+ pop pop
550
+ /h2 uly lly sub 2 div def
551
+ /mx llx lrx add 2 div def
552
+ newpath
553
+ mx uly h2 sub h2 0 360 arc
554
+ { fill } { stroke } ifelse
555
+ end
556
+ } bind def
557
+
558
+ % SDL set (extension)
559
+ % The hourglass has a size of twice the H height
560
+ % There should be a few spaces at the start of this shape's label
561
+
562
+ /sdl_set {
563
+ 10 dict begin
564
+ 3 1 roll % put filled flag at end
565
+ 4 ne { stop } if % sanity-check number of sides
566
+ aload pop
567
+ /ury xdef /urx xdef
568
+ /lry xdef /lrx xdef
569
+ /lly xdef /llx xdef
570
+ /uly xdef /ulx xdef
571
+ /my uly lly add 2 div def
572
+ newpath
573
+ moveto
574
+ /d (H) true charpath flattenpath pathbbox exch pop exch sub exch pop def
575
+ newpath
576
+ llx d add my d add moveto
577
+ ulx d add uly lineto
578
+ urx ury lineto
579
+ lrx lry lineto
580
+ llx d add lly lineto
581
+ llx d add my d sub lineto
582
+ dup { closepath fill } { stroke } ifelse
583
+ llx my d sub moveto
584
+ d 2 mul dup rlineto
585
+ d 2 mul neg 0 rlineto
586
+ d 2 mul dup neg rlineto
587
+ closepath
588
+ { fill } { stroke } ifelse
589
+ end
590
+ } bind def
591
+
592
+ % SDL reset (extension)
593
+ % The cross has a size of twice the H height
594
+ % There should be a few spaces at the start of this shape's label
595
+
596
+ /sdl_reset {
597
+ 10 dict begin
598
+ 3 1 roll % put filled flag at end
599
+ 4 ne { stop } if % sanity-check number of sides
600
+ aload pop
601
+ /ury xdef /urx xdef
602
+ /lry xdef /lrx xdef
603
+ /lly xdef /llx xdef
604
+ /uly xdef /ulx xdef
605
+ /my uly lly add 2 div def
606
+ newpath
607
+ moveto
608
+ /d (H) true charpath flattenpath pathbbox exch pop exch sub exch pop def
609
+ newpath
610
+ urx ury moveto
611
+ lrx lry lineto
612
+ llx d add lly lineto
613
+ ulx d add uly lineto
614
+ closepath
615
+ { fill } { stroke } ifelse
616
+ llx my d sub moveto
617
+ d 2 mul dup rlineto
618
+ llx d 2 mul add my d sub moveto
619
+ d 2 mul dup neg exch rlineto
620
+ stroke
621
+ end
622
+ } bind def
623
+
624
+ % SDL export (extension)
625
+ % The store has a width of twice the H height
626
+ % There should be a few spaces at the start of this shape's label
627
+
628
+ /sdl_export {
629
+ 10 dict begin
630
+ 3 1 roll % put filled flag at end
631
+ 4 ne { stop } if % sanity-check number of sides
632
+ aload pop
633
+ /ury xdef /urx xdef
634
+ /lry xdef /lrx xdef
635
+ /lly xdef /llx xdef
636
+ /uly xdef /ulx xdef
637
+ /my uly lly add 2 div def
638
+ newpath
639
+ moveto
640
+ /d (H) true charpath flattenpath pathbbox exch pop exch sub exch pop def
641
+ newpath
642
+ llx d add my d 2 div add moveto
643
+ ulx d add uly lineto
644
+ urx ury lineto
645
+ lrx lry lineto
646
+ llx d add lly lineto
647
+ llx d add my d 2 div sub lineto
648
+ { closepath fill } { stroke } ifelse
649
+ llx my d 2 div sub moveto
650
+ d 2 mul 0 rlineto
651
+ llx my d 2 div add moveto
652
+ d 2 mul 0 rlineto
653
+ stroke
654
+ end
655
+ } bind def