ifmapper 2.2.2 → 2.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 17cfd8a29b33b9c8048e138976d8b9e13b6f4112405f7bb22b58d56ce4264160
4
- data.tar.gz: bc9b7f85a19c4ac82728e632ec3f25f56a72e2deaa26ed216504fb4b9fda2237
3
+ metadata.gz: e2f57618e8827e75064b59271aed043f7e75debb7eaac3a26c141ef78b363bcf
4
+ data.tar.gz: 3e0f0226e2d80b52eb9db23c7f576e9c3bbad8d6451a246a78a54a712d1c8485
5
5
  SHA512:
6
- metadata.gz: 391fb1a443621b2576e958440cd0b8770da8ca68cf6e07d4f930b6ebbd06280a8793344f9b651184cc496bd5a9c884d24cb3951fb07bca7458df12c38ea698a7
7
- data.tar.gz: 7ee05511f9799fd1ca1c6a59eb174f9ced6e1c263d3567b95b6b6653cdc91667d4cc186e3b045b32e03f38b3562b41d9907f456e9b30ec2a235a46ae6e13eece
6
+ metadata.gz: b9d93d099544d7272af51879188c005a12a2ad88db8c6109a8e718cc9d53334225f8068471c1d25f9faae799d512eb456910173ebc71f98fff67501fb6c7291e
7
+ data.tar.gz: a8e4c0daac7bd03cc9bc5607b3d43134a46c4a32e22db988ec2b92cef8a708c56fac5778fea8b1fc1cd0ccb8df7cb443a76c40e3d848afe5a4fcf3ca4f17663f
@@ -1,6 +1,6 @@
1
1
  require "rubygems"
2
2
 
3
- VERSION = '2.2.2'
3
+ VERSION = '2.2.3'
4
4
  AUTHOR = "Gonzalo Garramuno"
5
5
  HOMEPAGE = 'http://ggarra13.github.io/ifmapper/en/start.html'
6
6
  EMAIL = 'ggarra13@gmail.com'
@@ -28,9 +28,9 @@ gem = Gem::Specification.new do |s|
28
28
  EOF
29
29
  s.add_runtime_dependency("rake-compiler", "~> 0.7.1", ">= 0.7.1" )
30
30
  s.add_runtime_dependency("fxruby", "~> 1.6.0", ">= 1.6.0")
31
- s.add_runtime_dependency("pdf-writer", "~> 1.1.1", ">= 1.1.1")
31
+ s.add_runtime_dependency("prawn", "~> 1.0.0", ">= 1.0.0")
32
32
  s.extra_rdoc_files = ["HISTORY.txt", "TODO.txt"] +
33
33
  Dir.glob("docs/*/*")
34
- s.rubyforge_project = 'ifmapper'
34
+ # s.rubyforge_project = 'ifmapper'
35
35
  s.required_ruby_version = '>= 2.0.0'
36
36
  end
@@ -1,526 +1,7 @@
1
-
2
1
  require 'tmpdir'
3
2
 
4
3
  begin
5
- require 'pdf/writer'
4
+ require 'IFMapper/PDFMapExporter_prawn'
6
5
  rescue LoadError => e
7
- err = "PDF-Writer library not found. Please install it.\n"
8
- if $rubygems
9
- err += "You can usually do so if you do 'gem install pdf-writer'."
10
- else
11
- err += "You can download it from www.rubyforge.net."
12
- end
13
- raise LoadError, err
14
- end
15
-
16
- require 'IFMapper/MapPrinting'
17
-
18
- PDF_ZOOM = 0.5
19
- PDF_ROOM_WIDTH = W * PDF_ZOOM
20
- PDF_ROOM_HEIGHT = H * PDF_ZOOM
21
- PDF_ROOM_WS = WS * PDF_ZOOM
22
- PDF_ROOM_HS = HS * PDF_ZOOM
23
- PDF_MARGIN = 20.0
24
-
25
- #
26
- # Open all the map class and add all pdf methods there
27
- # Gotta love Ruby's flexibility to just inject in new methods.
28
- #
29
- class FXConnection
30
- def _cvt_pt(p, opts)
31
- x = (p[0] - WW / 2.0) / WW.to_f
32
- y = (p[1] - HH / 2.0) / HH.to_f
33
- x = x * opts['ww'] + opts['ws_2'] + opts['margin_2'] + opts['w'] / 2.0
34
- y = (opts['height'] - y) * opts['hh'] + opts['hs_2'] + opts['margin_2'] + opts['hs']
35
- return [x, y]
36
- end
37
-
38
- def pdf_draw_arrow(pdf, opts, x1, y1, x2, y2)
39
- return if @dir == BOTH
40
-
41
- pt1, d = _arrow_info( x1, y1, x2, y2, 0.5 )
42
-
43
- p = []
44
- p << PDF::Writer::PolygonPoint.new( pt1[0], pt1[1] )
45
- p << PDF::Writer::PolygonPoint.new( pt1[0] + d[0], pt1[1] - d[1] )
46
- p << PDF::Writer::PolygonPoint.new( pt1[0] + d[1], pt1[1] + d[0] )
47
- pdf.fill_color Color::RGB::Black
48
- pdf.polygon(p).fill
49
- end
50
-
51
- def pdf_draw_complex_as_bspline( pdf, opts )
52
- p = []
53
- p << _cvt_pt(@pts[0], opts)
54
- p << p[0]
55
- p << p[0]
56
- @pts.each { |pt|
57
- p << _cvt_pt(pt, opts)
58
- }
59
- p << p[-1]
60
- p << p[-1]
61
- p << p[-1]
62
- return FXSpline::bspline(p)
63
- end
64
-
65
- # PRE: If it's a loop exit that comes back to the same place, let's move
66
- # it up and right
67
- def pdf_draw_complex_as_lines( pdf, opts )
68
- p = []
69
- maxy = opts['height'] * opts['hh'] + opts['hs_2'] + opts['margin_2']
70
- @pts.each { |pt|
71
- if loop? == true
72
- p << [ pt[0] * PDF_ZOOM + 10, maxy - pt[1] * PDF_ZOOM + 48 ]
73
- else
74
- p << [ pt[0] * PDF_ZOOM, maxy - pt[1] * PDF_ZOOM ]
75
- end
76
- }
77
- return p
78
- end
79
-
80
- def pdf_draw_door( pdf, x1, y1, x2, y2 )
81
- v = [ (x2-x1), (y2-y1) ]
82
- t = 10 / Math.sqrt(v[0]*v[0]+v[1]*v[1])
83
- v = [ v[0]*t, v[1]*t ]
84
- m = [ (x2+x1)/2, (y2+y1)/2 ]
85
- x1, y1 = [m[0] + v[1], m[1] - v[0]]
86
- x2, y2 = [m[0] - v[1], m[1] + v[0]]
87
- if @type == LOCKED_DOOR
88
- pdf.move_to(x1, y1)
89
- pdf.line_to(x2, y2).stroke
90
- else
91
- s = PDF::Writer::StrokeStyle.new(1,
92
- :cap => :butt,
93
- :join => :miter,
94
- :dash => PDF::Writer::StrokeStyle::SOLID_LINE )
95
- pdf.stroke_style(s)
96
- v = [ v[0] / 3, v[1] / 3]
97
- pdf.move_to(x1 - v[0], y1 - v[1])
98
- pdf.line_to(x1 + v[0], y1 + v[1])
99
- pdf.line_to(x2 + v[0], y2 + v[1])
100
- pdf.line_to(x2 - v[0], y2 - v[1])
101
- pdf.line_to(x1 - v[0], y1 - v[1])
102
- pdf.stroke
103
- s = PDF::Writer::StrokeStyle.new(2,
104
- :cap => :butt,
105
- :join => :miter,
106
- :dash => PDF::Writer::StrokeStyle::SOLID_LINE )
107
- pdf.stroke_style(s)
108
- end
109
- end
110
-
111
- def pdf_draw_complex( pdf, opts )
112
- if opts['Paths as Curves']
113
- if @room[0] == @room[1]
114
- dirA, dirB = dirs
115
- if dirA == dirB
116
- p = pdf_draw_complex_as_lines( pdf, opts )
117
- else
118
- p = pdf_draw_complex_as_bspline( pdf, opts )
119
- end
120
- else
121
- p = pdf_draw_complex_as_bspline( pdf, opts )
122
- end
123
- else
124
- p = pdf_draw_complex_as_lines( pdf, opts )
125
- end
126
- pdf.move_to( p[0][0], p[0][1] )
127
- p.each { |pt| pdf.line_to( pt[0], pt[1] ) }
128
- pdf.stroke
129
-
130
- x1, y1 = [p[0][0], p[0][1]]
131
- x2, y2 = [p[-1][0], p[-1][1]]
132
- pdf_draw_arrow(pdf, opts, x1, y1, x2, y2)
133
-
134
- if @type == LOCKED_DOOR or @type == CLOSED_DOOR
135
- t = p.size / 2
136
- x1, y1 = [ p[t][0], p[t][1] ]
137
- x2, y2 = [ p[t-2][0], p[t-2][1] ]
138
- pdf_draw_door(pdf, x1, y1, x2, y2)
139
- end
140
- end
141
-
142
- def pdf_draw_simple(pdf, opts)
143
- return if not @room[1] # PDF does not print unfinished complex connections
144
-
145
- dir = @room[0].exits.index(self)
146
- x1, y1 = @room[0].pdf_corner(opts, self, dir)
147
- x2, y2 = @room[1].pdf_corner(opts, self)
148
- pdf.move_to(x1, y1)
149
- pdf.line_to(x2, y2).stroke
150
- pdf_draw_arrow(pdf, opts, x1, y1, x2, y2)
151
- if @type == LOCKED_DOOR or @type == CLOSED_DOOR
152
- pdf_draw_door(pdf, x1, y1, x2, y2)
153
- end
154
- end
155
-
156
- #
157
- # Draw the connection text next to the arrow ('I', 'O', etc)
158
- #
159
- def pdf_draw_text(pdf, x, y, dir, text, arrow)
160
- if dir == 7 or dir < 6 and dir != 1
161
- if arrow and (dir == 0 or dir == 4)
162
- x += 5
163
- end
164
- x += 2.5
165
- elsif dir == 6 or dir == 1
166
- x -= 7.5
167
- end
168
-
169
- if dir > 5 or dir < 4
170
- if arrow and (dir == 6 or dir == 2)
171
- y += 5
172
- end
173
- y += 2.5
174
- elsif dir == 4 or dir == 5
175
- y -= 7.5
176
- end
177
-
178
- font_size = 8
179
- pdf.add_text(x, y, text, font_size)
180
- end
181
-
182
- def pdf_draw_exit_text(pdf, opts)
183
-
184
- if @exitText[0] != 0
185
- dir = @room[0].exits.index(self)
186
- x, y = @room[0].pdf_corner(opts, self, dir)
187
- pdf_draw_text( pdf, x, y, dir,
188
- EXIT_TEXT[@exitText[0]], @dir == BtoA)
189
- end
190
-
191
- if @exitText[1] != 0
192
- dir = @room[1].exits.rindex(self)
193
- x, y = @room[1].pdf_corner(opts, self, dir)
194
- pdf_draw_text( pdf, x, y, dir,
195
- EXIT_TEXT[@exitText[1]], @dir == AtoB)
196
- end
197
- end
198
-
199
- def pdf_draw(pdf, opts)
200
- pdf_draw_exit_text(pdf, opts)
201
- if @type == SPECIAL
202
- s = PDF::Writer::StrokeStyle.new(2, :dash => {
203
- :pattern => [2],
204
- :phase => [1]
205
- } )
206
- else
207
- s = PDF::Writer::StrokeStyle.new(2,
208
- :cap => :butt,
209
- :join => :miter,
210
- :dash => PDF::Writer::StrokeStyle::SOLID_LINE )
211
- end
212
- pdf.stroke_style( s )
213
- pdf.stroke_color Color::RGB::Black
214
- pdf.fill_color Color::RGB::Black
215
- if @pts.size > 0
216
- pdf_draw_complex(pdf, opts)
217
- else
218
- pdf_draw_simple(pdf, opts)
219
- end
220
- end
221
- end
222
-
223
-
224
- class FXRoom
225
- def pdf_corner( opts, c, idx = nil )
226
- x, y = _corner(c, idx)
227
- y = -y
228
-
229
- ww = opts['ww']
230
- hh = opts['hh']
231
- w = opts['w']
232
- h = opts['h']
233
-
234
- ry = opts['height'] - @y
235
- x = @x * ww + opts['ws_2'] + opts['margin_2'] + x * w
236
- y = ry * hh + opts['hs_2'] + h + opts['margin_2'] + y * h
237
- return [x, y]
238
- end
239
-
240
-
241
- def pdf_draw_box( pdf, opts, idx, pdflocationnos )
242
- x = @x * opts['ww'] + opts['ws_2'] + opts['margin_2']
243
- y = (opts['height'] - @y) * opts['hh'] + opts['hs_2'] + opts['margin_2']
244
-
245
- s = PDF::Writer::StrokeStyle::DEFAULT
246
- pdf.stroke_style( s )
247
-
248
- if @darkness
249
- pdf.fill_color( Color::RGB::Gray )
250
- else
251
- pdf.fill_color( Color::RGB::White )
252
- end
253
-
254
- pdf.rectangle(x, y, opts['w'], opts['h']).fill_stroke
255
-
256
- if pdflocationnos == 1
257
- # PRE: Draw a rectangle for the location number
258
- pdf.rectangle((x+opts['w']-opts['w']/4), y, opts['w']/4, opts['h']/4).fill_stroke
259
-
260
- # PRE: Pad out the number so it is three chars long
261
- locationno = (idx+1).to_s
262
- if (idx+1) < 10
263
- locationno = ' '+locationno
264
- elsif (idx+1) < 100
265
- locationno = ' '+locationno
266
- end
267
-
268
- # PRE: Write the location number
269
- pdf.fill_color(Color::RGB::Black)
270
- pdf.add_text((x+((opts['w']/4)*3)+2), y+2, locationno, 8)
271
- end
272
-
273
- end
274
-
275
- def pdf_draw_text( pdf, opts, x, y, text, font_size, pdflocationnos )
276
- miny = (opts['height'] - @y) * opts['hh'] + opts['hs_2'] +
277
- opts['margin_2']
278
- while text != ''
279
- # PRE: Wrap the text to avoid the location number box
280
- if (y >= miny) and (y <= (miny+font_size)) and (pdflocationnos == 1)
281
- wrapwidthmodifier = 15
282
- else
283
- wrapwidthmodifier = 2
284
- end
285
- text = pdf.add_text_wrap(x, y, opts['w'] - wrapwidthmodifier, text, font_size)
286
- y -= font_size
287
- break if y <= miny
288
- end
289
- return [x, y]
290
- end
291
-
292
- def pdf_draw_objects(pdf, opts, x, y, pdflocationnos)
293
- font_size = 6
294
- objs = @objects.split("\n")
295
- objs = objs.join(', ')
296
- return pdf_draw_text( pdf, opts, x, y, objs, font_size, pdflocationnos )
297
- end
298
-
299
- def pdf_draw_name(pdf, opts, pdflocationnos)
300
- # We could also use pdf_corner(7) here
301
- x = @x * opts['ww'] + opts['margin_2'] + opts['ws_2'] + 2
302
- y = opts['height'] - @y
303
- font_size = 8
304
- y = y * opts['hh'] + opts['margin_2'] + opts['hs_2'] + opts['h'] -
305
- (font_size + 2)
306
- pdf.stroke_color(Color::RGB::Black)
307
- pdf.fill_color(Color::RGB::Black)
308
- return pdf_draw_text( pdf, opts, x, y, @name, font_size, pdflocationnos )
309
- end
310
-
311
- # PRE: Send through the index so we can print the location number
312
- # along with boolean value indicating whether the user wants them
313
- def pdf_draw( pdf, opts, idx, pdflocationnos )
314
- pdf_draw_box( pdf, opts, idx, pdflocationnos )
315
- x, y = pdf_draw_name( pdf, opts, pdflocationnos )
316
- pdf_draw_objects(pdf, opts, x, y, pdflocationnos)
317
- end
318
- end
319
-
320
-
321
-
322
- class FXSection
323
-
324
- def pdf_draw_grid(pdf, opts, w, h )
325
- (0...w).each { |xx|
326
- (0...h).each { |yy|
327
- x = xx * opts['ww'] + opts['ws_2'] + opts['margin_2']
328
- y = yy * opts['hh'] + opts['hs_2'] + opts['margin_2']
329
- pdf.rectangle(x, y, opts['w'], opts['h']).stroke
330
- }
331
- }
332
- end
333
-
334
-
335
- def pdf_draw_section_name( pdf, opts, px, py )
336
- return if not @name or @name == ''
337
- xymin, xymax = min_max_rooms
338
- text = @name
339
- text += " (#{px}, #{py})" if px > 0 or py > 0
340
- y = (opts['height']) * opts['hh'] + 16
341
- w = xymax[0]
342
- w = opts['width'] if w > opts['width']
343
- x = (w + 2) * opts['ww'] / 2 - text.size / 2 * 16
344
- x = 0 if x < 0
345
- pdf.add_text( x, y, text, 16 )
346
- end
347
-
348
-
349
- def pdf_draw(pdf, opts, mapname, pdflocationnos )
350
-
351
-
352
- w, h = rooms_width_height
353
- x, y = [0, 0]
354
-
355
- loop do
356
-
357
- if rotate
358
- pdf.rotate_axis(90.0)
359
- pdf.translate_axis( 0, -pdf.page_height )
360
- end
361
-
362
- # Move section to its position in page
363
- tx1, ty1 = [@xoff * opts['ww'], @yoff * -opts['hh']]
364
- pdf.translate_axis( tx1, ty1 )
365
-
366
- # Use times-roman as font
367
- pdf.select_font 'Times-Roman'
368
- pdf.stroke_color(Color::RGB::Black)
369
- pdf.fill_color(Color::RGB::Black)
370
-
371
- pdf_draw_section_name( pdf, opts, x, y )
372
-
373
- xymin, = min_max_rooms
374
-
375
- # Move rooms, so that we don't print empty areas
376
- tx2 = -(xymin[0]) * opts['ww'] - x * opts['ww']
377
- ty2 = (xymin[1]) * opts['hh'] - 60 + (y - (y > 0? 1 : 0)) * opts['hh']
378
- pdf.translate_axis( tx2, ty2 )
379
-
380
-
381
- # For testing purposes only, draw grid of boxes
382
- # pdf_draw_grid( pdf, opts, w, h )
383
- @connections.each { |c|
384
- a = c.roomA
385
- b = c.roomB
386
- next if a.y < y and b and b.y < y
387
- c.pdf_draw( pdf, opts )
388
- }
389
- @rooms.each_with_index { |r, idx|
390
- next if r.y < y
391
- r.pdf_draw( pdf, opts, idx, pdflocationnos)
392
- }
393
-
394
- # Reset axis
395
- pdf.translate_axis(-tx2, -ty2)
396
- pdf.translate_axis(-tx1, -ty1)
397
-
398
- xi = opts['width']
399
- yi = opts['height']
400
- if rotate
401
- xi = (pdf.page_height / opts['ww']).to_i - 1
402
- yi = (pdf.page_width / opts['hh']).to_i - 1
403
- end
404
-
405
- x += xi
406
- if x >= w
407
- x = 0
408
- y += yi
409
- break if y >= h
410
- end
411
-
412
- if rotate
413
- pdf.rotate_axis(-90.0)
414
- pdf.translate_axis( 0, pdf.page_height )
415
- end
416
-
417
- # We could not fit all rooms in page. Start new page
418
- pdf.start_new_page
419
- end
420
- end
421
- end
422
-
423
-
424
- class FXMap
425
-
426
- attr_accessor :pdfpapersize
427
- # boolean value indicating whether the user wants to see location nos
428
- attr_accessor :pdflocationnos
429
-
430
- def pdf_draw_mapname( pdf, opts )
431
- return if not @name or @name == ''
432
- pdf.text( @name,
433
- :font_size => 24,
434
- :justification => :center
435
- )
436
- end
437
-
438
- def pdf_draw_sections( pdf, opts )
439
- old_section = @section
440
- page = -1
441
- @sections.each_with_index { |sect, idx|
442
- if page != sect.page
443
- page = sect.page
444
- pdf.start_new_page if page > 1
445
- pdf_draw_mapname( pdf, opts )
446
- end
447
- @section = idx
448
- # For each page, we need to regenerate the pathmap so that complex
449
- # paths will come out ok.
450
- create_pathmap
451
- # Now, we draw it
452
- sect.pdf_draw(pdf, opts, @name, pdflocationnos)
453
- }
454
-
455
- # Restore original viewing page
456
- @section = old_section
457
- create_pathmap
458
- end
459
-
460
-
461
- def pdf_export(pdffile = Dir::tmpdir + "/ifmap.pdf", printer = nil)
462
-
463
- # PRE: Let's set the PDF paper size to user's choice
464
- paper = BOX_PDF_PAGE_SIZE_TEXT[pdfpapersize]
465
- if printer
466
- case printer.mediasize
467
- when FXPrinter::MEDIA_LETTER
468
- paper = 'LETTER'
469
- when FXPrinter::MEDIA_LEGAL
470
- paper = 'LEGAL'
471
- when FXPrinter::MEDIA_A4
472
- paper = 'A4'
473
- when FXPrinter::MEDIA_ENVELOPE
474
- paper = 'ENVELOPE'
475
- when FXPrinter::MEDIA_CUSTOM
476
- raise "Sorry, custom paper not supported"
477
- end
478
- end
479
-
480
- # Open a new PDF writer with paper selected
481
- # PRE: Let's also set the paper orientation based on user selection
482
- pdf = PDF::Writer.new :paper => paper
483
-
484
- pdf.margins_pt 0
485
-
486
- pdf_options = @options.dup
487
-
488
- ww = PDF_ROOM_WIDTH + PDF_ROOM_WS
489
- hh = PDF_ROOM_HEIGHT + PDF_ROOM_HS
490
-
491
- pdf_options.merge!(
492
- {
493
- 'ww' => ww,
494
- 'hh' => hh,
495
- 'w' => PDF_ROOM_WIDTH,
496
- 'h' => PDF_ROOM_HEIGHT,
497
- 'ws' => PDF_ROOM_WS,
498
- 'hs' => PDF_ROOM_HS,
499
- 'ws_2' => PDF_ROOM_WS / 2.0,
500
- 'hs_2' => PDF_ROOM_HS / 2.0,
501
- 'margin' => PDF_MARGIN,
502
- 'margin_2' => PDF_MARGIN / 2.0,
503
- 'width' => (pdf.page_width / ww).to_i - 1,
504
- 'height' => (pdf.page_height / hh).to_i - 1,
505
- }
506
- )
507
-
508
-
509
- begin
510
- # See if it is possible to pack several map sections (sections) into
511
- # a single print page.
512
- num = pack_sections( pdf_options['width'] + 2,
513
- pdf_options['height'] + 2 )
514
- pdf_draw_sections(pdf, pdf_options)
515
- if pdffile !~ /\.pdf$/
516
- pdffile << ".pdf"
517
- end
518
- status "Exporting PDF file '#{pdffile}'"
519
- pdf.save_as(pdffile)
520
- rescue => e
521
- p e
522
- p e.backtrace
523
- raise e
524
- end
525
- end
6
+ raise LoadError, e
526
7
  end
@@ -1,4 +1,3 @@
1
-
2
1
  require 'tmpdir'
3
2
 
4
3
  begin
@@ -16,8 +15,8 @@ end
16
15
  require 'IFMapper/MapPrinting'
17
16
 
18
17
  PDF_ZOOM = 0.5
19
- PDF_ROOM_WIDTH = W * PDF_ZOOM
20
- PDF_ROOM_HEIGHT = H * PDF_ZOOM
18
+ PDF_ROOM_WIDTH = W * PDF_ZOOM
19
+ PDF_ROOM_HEIGHT = H * PDF_ZOOM
21
20
  PDF_ROOM_WS = WS * PDF_ZOOM
22
21
  PDF_ROOM_HS = HS * PDF_ZOOM
23
22
  PDF_MARGIN = 20.0
@@ -37,14 +36,14 @@ class FXConnection
37
36
 
38
37
  def pdf_draw_arrow(pdf, opts, x1, y1, x2, y2)
39
38
  return if @dir == BOTH
40
-
39
+
41
40
  pt1, d = _arrow_info( x1, y1, x2, y2, 0.5 )
42
-
41
+
43
42
  pdf.stroke_color '000000'
44
43
  pdf.fill_color '000000'
45
- pdf.fill_polygon( [ pt1[0], pt1[1] ],
46
- [ pt1[0] + d[0], pt1[1] - d[1] ],
47
- [ pt1[0] + d[0], pt1[1] + d[1] ] )
44
+ pdf.fill_polygon( [ pt1[0], pt1[1] ],
45
+ [ pt1[0] + d[0], pt1[1] - d[1] ],
46
+ [ pt1[0] + d[1], pt1[1] + d[0] ] )
48
47
  end
49
48
 
50
49
  def pdf_draw_complex_as_bspline( pdf, opts )
@@ -61,11 +60,11 @@ class FXConnection
61
60
  return FXSpline::bspline(p)
62
61
  end
63
62
 
64
- # PRE: If it's a loop exit that comes back to the same place, let's move
63
+ # PRE: If it's a loop exit that comes back to the same place, let's move
65
64
  # it up and right
66
65
  def pdf_draw_complex_as_lines( pdf, opts )
67
66
  p = []
68
- maxy = opts['height'] * opts['hh'] + opts['hs_2'] + opts['margin_2']
67
+ maxy = opts['height'] * opts['hh'] + opts['hs_2'] + opts['margin_2']
69
68
  @pts.each { |pt|
70
69
  if loop? == true
71
70
  p << [ pt[0] * PDF_ZOOM + 10, maxy - pt[1] * PDF_ZOOM + 48 ]
@@ -88,6 +87,7 @@ class FXConnection
88
87
  if @type == LOCKED_DOOR
89
88
  pdf.move_to(x1, y1)
90
89
  pdf.line_to(x2, y2)
90
+ pdf.stroke
91
91
  else
92
92
  pdf.cap_style = :butt
93
93
  pdf.join_style = :miter
@@ -99,6 +99,7 @@ class FXConnection
99
99
  pdf.line_to(x2 + v[0], y2 + v[1])
100
100
  pdf.line_to(x2 - v[0], y2 - v[1])
101
101
  pdf.line_to(x1 - v[0], y1 - v[1])
102
+ pdf.stroke
102
103
 
103
104
  pdf.cap_style = :butt
104
105
  pdf.join_style = :miter
@@ -107,27 +108,24 @@ class FXConnection
107
108
  end
108
109
 
109
110
  def pdf_draw_complex( pdf, opts )
110
- pdf.stroke_color '000000'
111
- pdf.fill_color '000000'
112
111
  if opts['Paths as Curves']
113
112
  if @room[0] == @room[1]
114
- dirA, dirB = dirs
115
- if dirA == dirB
116
- p = pdf_draw_complex_as_lines( pdf, opts )
117
- else
118
- p = pdf_draw_complex_as_bspline( pdf, opts )
119
- end
113
+ dirA, dirB = dirs
114
+ if dirA == dirB
115
+ p = pdf_draw_complex_as_lines( pdf, opts )
116
+ else
117
+ p = pdf_draw_complex_as_bspline( pdf, opts )
118
+ end
120
119
  else
121
- p = pdf_draw_complex_as_bspline( pdf, opts )
120
+ p = pdf_draw_complex_as_bspline( pdf, opts )
122
121
  end
123
122
  else
124
123
  p = pdf_draw_complex_as_lines( pdf, opts )
125
124
  end
126
-
127
- pdf.stroke_color '000000'
128
- pdf.fill_color '000000'
125
+
129
126
  pdf.move_to( p[0][0], p[0][1] )
130
127
  p.each { |pt| pdf.line_to( pt[0], pt[1] ) }
128
+ pdf.stroke
131
129
 
132
130
  x1, y1 = [p[0][0], p[0][1]]
133
131
  x2, y2 = [p[-1][0], p[-1][1]]
@@ -147,10 +145,9 @@ class FXConnection
147
145
  dir = @room[0].exits.index(self)
148
146
  x1, y1 = @room[0].pdf_corner(opts, self, dir)
149
147
  x2, y2 = @room[1].pdf_corner(opts, self)
150
- pdf.stroke_color '000000'
151
- pdf.fill_color '000000'
152
148
  pdf.move_to(x1, y1)
153
149
  pdf.line_to(x2, y2)
150
+ pdf.stroke
154
151
  pdf_draw_arrow(pdf, opts, x1, y1, x2, y2)
155
152
  if @type == LOCKED_DOOR or @type == CLOSED_DOOR
156
153
  pdf_draw_door(pdf, x1, y1, x2, y2)
@@ -163,22 +160,22 @@ class FXConnection
163
160
  def pdf_draw_text(pdf, x, y, dir, text, arrow)
164
161
  if dir == 7 or dir < 6 and dir != 1
165
162
  if arrow and (dir == 0 or dir == 4)
166
- x += 5
163
+ x += 5
167
164
  end
168
165
  x += 2.5
169
166
  elsif dir == 6 or dir == 1
170
167
  x -= 7.5
171
168
  end
172
-
169
+
173
170
  if dir > 5 or dir < 4
174
171
  if arrow and (dir == 6 or dir == 2)
175
- y += 5
172
+ y += 5
176
173
  end
177
174
  y += 2.5
178
175
  elsif dir == 4 or dir == 5
179
176
  y -= 7.5
180
177
  end
181
-
178
+
182
179
  font_size = 8
183
180
  pdf.text_box text, :at => [x, y], :size => font_size
184
181
  end
@@ -189,20 +186,22 @@ class FXConnection
189
186
  dir = @room[0].exits.index(self)
190
187
  x, y = @room[0].pdf_corner(opts, self, dir)
191
188
  pdf.move_to(x, y)
192
- pdf_draw_text( pdf, x, y+4, dir,
189
+ pdf_draw_text( pdf, x, y+4, dir,
193
190
  EXIT_TEXT[@exitText[0]], @dir == BtoA)
194
191
  end
195
192
 
196
193
  if @exitText[1] != 0
197
194
  dir = @room[1].exits.rindex(self)
198
195
  x, y = @room[1].pdf_corner(opts, self, dir)
199
- pdf_draw_text( pdf, x, y+4, dir,
200
- EXIT_TEXT[@exitText[1]], @dir == AtoB)
196
+ pdf_draw_text( pdf, x, y+4, dir,
197
+ EXIT_TEXT[@exitText[1]], @dir == AtoB)
201
198
  end
202
199
  end
203
200
 
204
201
  def pdf_draw(pdf, opts)
205
202
  pdf_draw_exit_text(pdf, opts)
203
+ pdf.stroke_color '000000'
204
+ pdf.fill_color '000000'
206
205
  if @type == SPECIAL
207
206
  pdf.dash 4
208
207
  else
@@ -210,8 +209,6 @@ class FXConnection
210
209
  pdf.join_style = :miter
211
210
  pdf.undash
212
211
  end
213
- pdf.stroke_color '000000'
214
- pdf.fill_color '000000'
215
212
  if @pts.size > 0
216
213
  pdf_draw_complex(pdf, opts)
217
214
  else
@@ -245,10 +242,12 @@ class FXRoom
245
242
  pdf.cap_style = :butt
246
243
  pdf.join_style = :miter
247
244
  pdf.line_width 1
245
+ pdf.undash
248
246
 
249
247
  if @darkness
250
248
  pdf.fill_color '808080'
251
249
  pdf.stroke_color '000000'
250
+ pdf.fill_rectangle [x, y], opts['w'], -opts['h']
252
251
  else
253
252
  pdf.fill_color 'ffffff'
254
253
  pdf.stroke_color '000000'
@@ -256,11 +255,12 @@ class FXRoom
256
255
 
257
256
  pdf.stroke_rectangle [x, y], opts['w'], -opts['h']
258
257
 
258
+
259
259
  if pdflocationnos == 1
260
260
  # PRE: Draw a rectangle for the location number
261
- pdf.stroke_rectangle( [x+opts['w']-opts['w']/4, y],
261
+ pdf.stroke_rectangle( [x+opts['w']-opts['w']/4, y],
262
262
  opts['w']/4, -opts['h']/4 )
263
-
263
+
264
264
  # PRE: Pad out the number so it is three chars long
265
265
  locationno = (idx+1).to_s
266
266
  if (idx+1) < 10
@@ -273,16 +273,16 @@ class FXRoom
273
273
  pdf.stroke_color '000000'
274
274
  pdf.fill_color '000000'
275
275
 
276
- pdf.text_box locationno,
276
+ pdf.text_box locationno,
277
277
  :at => [(x+((opts['w']/4)*3)+2), y+7], :size => 8
278
278
  end
279
-
279
+
280
280
  end
281
281
 
282
282
  def pdf_draw_text( pdf, opts, x, y, text, font_size, pdflocationnos )
283
- miny = (opts['height'] - @y) * opts['hh'] + opts['hs_2'] +
283
+ miny = (opts['height'] - @y) * opts['hh'] + opts['hs_2'] +
284
284
  opts['margin_2']
285
- pdf.text_box text, :at => [x, y+6], :size => font_size,
285
+ pdf.text_box text, :at => [x, y+6], :size => font_size,
286
286
  :width => opts['w'], :height => opts['h'], :valign => :top,
287
287
  :align => :left, :overflow => :shrink_to_fit
288
288
  return [x, y]
@@ -292,7 +292,7 @@ class FXRoom
292
292
  font_size = 6
293
293
  objs = @objects.split("\n")
294
294
  objs = objs.join(', ')
295
- return pdf_draw_text( pdf, opts, x, y-font_size,
295
+ return pdf_draw_text( pdf, opts, x, y-font_size,
296
296
  objs, font_size, pdflocationnos )
297
297
  end
298
298
 
@@ -301,7 +301,7 @@ class FXRoom
301
301
  x = @x * opts['ww'] + opts['margin_2'] + opts['ws_2'] + 2
302
302
  y = opts['height'] - @y
303
303
  font_size = 8
304
- y = y * opts['hh'] + opts['margin_2'] + opts['hs_2'] + opts['h'] -
304
+ y = y * opts['hh'] + opts['margin_2'] + opts['hs_2'] + opts['h'] -
305
305
  (font_size + 2)
306
306
  pdf.stroke_color '000000'
307
307
  pdf.fill_color '000000'
@@ -324,9 +324,9 @@ class FXSection
324
324
  def pdf_draw_grid(pdf, opts, w, h )
325
325
  (0...w).each { |xx|
326
326
  (0...h).each { |yy|
327
- x = xx * opts['ww'] + opts['ws_2'] + opts['margin_2']
328
- y = yy * opts['hh'] + opts['hs_2'] + opts['margin_2']
329
- pdf.rectangle([x, y], opts['w'], opts['h'])
327
+ x = xx * opts['ww'] + opts['ws_2'] + opts['margin_2']
328
+ y = yy * opts['hh'] + opts['hs_2'] + opts['margin_2']
329
+ pdf.rectangle([x, y], opts['w'], opts['h'])
330
330
  }
331
331
  }
332
332
  end
@@ -356,9 +356,9 @@ class FXSection
356
356
 
357
357
  pdf.save_graphics_state
358
358
 
359
- if rotate
360
- pdf.rotate 90.0
361
- pdf.translate( 0, -pdf.margin_box.height )
359
+ if rotate and @rooms.size > 2
360
+ pdf.rotate 90.0
361
+ pdf.translate( 0, -pdf.margin_box.height )
362
362
  end
363
363
 
364
364
  # Move section to its position in page
@@ -377,42 +377,42 @@ class FXSection
377
377
  tx2 = -(xymin[0]) * opts['ww'] - x * opts['ww']
378
378
  ty2 = (xymin[1]) * opts['hh'] - 60 + (y - (y > 0? 1 : 0)) * opts['hh']
379
379
  pdf.translate( tx2, ty2 )
380
-
381
-
380
+
381
+
382
382
  # For testing purposes only, draw grid of boxes
383
383
  # pdf_draw_grid( pdf, opts, w, h )
384
- @connections.each { |c|
385
- a = c.roomA
386
- b = c.roomB
387
- next if a.y < y and b and b.y < y
388
- c.pdf_draw( pdf, opts )
384
+ @connections.each { |c|
385
+ a = c.roomA
386
+ b = c.roomB
387
+ next if a.y < y and b and b.y < y
388
+ c.pdf_draw( pdf, opts )
389
389
  }
390
- @rooms.each_with_index { |r, idx|
391
- next if r.y < y
392
- r.pdf_draw( pdf, opts, idx, pdflocationnos)
390
+ @rooms.each_with_index { |r, idx|
391
+ next if r.y < y
392
+ r.pdf_draw( pdf, opts, idx, pdflocationnos)
393
393
  }
394
-
394
+
395
395
  # Reset axis
396
396
  pdf.translate(-tx2, -ty2)
397
397
  pdf.translate(-tx1, -ty1)
398
-
398
+
399
399
  xi = opts['width']
400
400
  yi = opts['height']
401
- if rotate
402
- xi = (pdf.margin_box.height / opts['ww']).to_i - 1
403
- yi = (pdf.margin_box.width / opts['hh']).to_i - 1
401
+ if rotate and @rooms.size > 2
402
+ xi = (pdf.margin_box.height / opts['ww']).to_i - 1
403
+ yi = (pdf.margin_box.width / opts['hh']).to_i - 1
404
404
  end
405
405
 
406
406
  x += xi
407
407
  if x >= w
408
- x = 0
409
- y += yi
410
- break if y >= h
408
+ x = 0
409
+ y += yi
410
+ break if y >= h
411
411
  end
412
412
 
413
- if rotate
414
- pdf.rotate(-90.0)
415
- pdf.translate( 0, pdf.page_height )
413
+ if rotate and @rooms.size > 2
414
+ pdf.rotate(-90.0)
415
+ pdf.translate( 0, pdf.page_height )
416
416
  end
417
417
 
418
418
  pdf.restore_graphics_state
@@ -429,13 +429,13 @@ class FXMap
429
429
  attr_accessor :pdfpapersize
430
430
  # boolean value indicating whether the user wants to see location nos
431
431
  attr_accessor :pdflocationnos
432
-
432
+
433
433
  def pdf_draw_mapname( pdf, opts )
434
434
  return if not @name or @name == ''
435
435
  pdf.text( @name,
436
- :font_size => 24,
437
- :justification => :center
438
- )
436
+ :font_size => 24,
437
+ :justification => :center
438
+ )
439
439
  end
440
440
 
441
441
  def pdf_draw_sections( pdf, opts )
@@ -443,9 +443,9 @@ class FXMap
443
443
  page = -1
444
444
  @sections.each_with_index { |sect, idx|
445
445
  if page != sect.page
446
- page = sect.page
447
- pdf.start_new_page if page > 1
448
- pdf_draw_mapname( pdf, opts )
446
+ page = sect.page
447
+ pdf.start_new_page if page > 1
448
+ pdf_draw_mapname( pdf, opts )
449
449
  end
450
450
  @section = idx
451
451
  # For each page, we need to regenerate the pathmap so that complex
@@ -462,27 +462,27 @@ class FXMap
462
462
 
463
463
 
464
464
  def pdf_export(pdffile = Dir::tmpdir + "/ifmap.pdf", printer = nil)
465
-
465
+
466
466
  # PRE: Let's set the PDF paper size to user's choice
467
467
  paper = BOX_PDF_PAGE_SIZE_TEXT[pdfpapersize]
468
468
  if printer
469
469
  case printer.mediasize
470
470
  when FXPrinter::MEDIA_LETTER
471
- paper = 'LETTER'
471
+ paper = 'LETTER'
472
472
  when FXPrinter::MEDIA_LEGAL
473
- paper = 'LEGAL'
473
+ paper = 'LEGAL'
474
474
  when FXPrinter::MEDIA_A4
475
- paper = 'A4'
475
+ paper = 'A4'
476
476
  when FXPrinter::MEDIA_ENVELOPE
477
- paper = 'ENVELOPE'
477
+ paper = 'ENVELOPE'
478
478
  when FXPrinter::MEDIA_CUSTOM
479
- raise "Sorry, custom paper not supported"
479
+ raise "Sorry, custom paper not supported"
480
480
  end
481
481
  end
482
482
 
483
483
  # Open a new PDF writer with paper selected
484
484
  # PRE: Let's also set the paper orientation based on user selection
485
-
485
+
486
486
  pdf = Prawn::Document.new :page_size => paper
487
487
 
488
488
  pdf_options = @options.dup
@@ -490,32 +490,32 @@ class FXMap
490
490
  ww = PDF_ROOM_WIDTH + PDF_ROOM_WS
491
491
  hh = PDF_ROOM_HEIGHT + PDF_ROOM_HS
492
492
 
493
- pdf_options.merge!(
494
- {
495
- 'ww' => ww,
496
- 'hh' => hh,
497
- 'w' => PDF_ROOM_WIDTH,
498
- 'h' => PDF_ROOM_HEIGHT,
499
- 'ws' => PDF_ROOM_WS,
500
- 'hs' => PDF_ROOM_HS,
501
- 'ws_2' => PDF_ROOM_WS / 2.0,
502
- 'hs_2' => PDF_ROOM_HS / 2.0,
503
- 'margin' => PDF_MARGIN,
504
- 'margin_2' => PDF_MARGIN / 2.0,
505
- 'width' => (pdf.margin_box.width / ww).to_i - 1,
506
- 'height' => (pdf.margin_box.height / hh).to_i - 1,
507
- }
508
- )
493
+ pdf_options.merge!(
494
+ {
495
+ 'ww' => ww,
496
+ 'hh' => hh,
497
+ 'w' => PDF_ROOM_WIDTH,
498
+ 'h' => PDF_ROOM_HEIGHT,
499
+ 'ws' => PDF_ROOM_WS,
500
+ 'hs' => PDF_ROOM_HS,
501
+ 'ws_2' => PDF_ROOM_WS / 2.0,
502
+ 'hs_2' => PDF_ROOM_HS / 2.0,
503
+ 'margin' => PDF_MARGIN,
504
+ 'margin_2' => PDF_MARGIN / 2.0,
505
+ 'width' => (pdf.margin_box.width / ww).to_i - 1,
506
+ 'height' => (pdf.margin_box.height / hh).to_i - 1,
507
+ }
508
+ )
509
509
 
510
510
 
511
511
  begin
512
512
  # See if it is possible to pack several map sections (sections) into
513
513
  # a single print page.
514
- num = pack_sections( pdf_options['width'] + 2,
514
+ num = pack_sections( pdf_options['width'] + 2,
515
515
  pdf_options['height'] + 2 )
516
516
  pdf_draw_sections(pdf, pdf_options)
517
517
  if pdffile !~ /\.pdf$/
518
- pdffile << ".pdf"
518
+ pdffile << ".pdf"
519
519
  end
520
520
  status "Exporting PDF file '#{pdffile}'"
521
521
  pdf.render_file pdffile
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ifmapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.2
4
+ version: 2.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gonzalo Garramuno
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-03 00:00:00.000000000 Z
11
+ date: 2020-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
@@ -51,25 +51,25 @@ dependencies:
51
51
  - !ruby/object:Gem::Version
52
52
  version: 1.6.0
53
53
  - !ruby/object:Gem::Dependency
54
- name: pdf-writer
54
+ name: prawn
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: 1.1.1
59
+ version: 1.0.0
60
60
  - - ">="
61
61
  - !ruby/object:Gem::Version
62
- version: 1.1.1
62
+ version: 1.0.0
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: 1.1.1
69
+ version: 1.0.0
70
70
  - - ">="
71
71
  - !ruby/object:Gem::Version
72
- version: 1.1.1
72
+ version: 1.0.0
73
73
  description: " Interactive Fiction Mapping Tool.\n"
74
74
  email: ggarra13@gmail.com
75
75
  executables: