c80_map_floors 0.2.0.0 → 0.2.0.1

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
  SHA1:
3
- metadata.gz: 29c8408b56215867ecb61bc6c0c96541a8b3645c
4
- data.tar.gz: ee01051314c85f074b1d9acb033095fa1095cee0
3
+ metadata.gz: 2597a223d11b4fb3705f4659ceb15607a297d3f3
4
+ data.tar.gz: 1c9cd5b88f9585da75b252bf5d0cb3963895ec0c
5
5
  SHA512:
6
- metadata.gz: d8ccb255f481143ab61df377077b9205d0d9df7162d4c5fc9569a8d49a3abf4989b68149af9a276f01d719b87ebe6465eb419f1541d5004e28e459a4d8e7f199
7
- data.tar.gz: 60502338215bf6d3c889ac9cce8ef9e288d833c659af2f158f19eb6ee6f4c315c7a099f650f885ffe524bba819f39273db5a5fd647673f39770ed9a221e1bf71
6
+ metadata.gz: a63e2caff22da7243b43746bd2cfd92e4e534c58fbcbb89887bdc1667b1dc2ecd1b69d0a6da8cc1e77b78bd58bc5cf7c715d96201b1196356e0e784aff018ef8
7
+ data.tar.gz: 8d3e8e79f3c92d102c3fa6e97a194a73c810b52c5e08373905d6d0d6fe8219c300aca57cb1d3528b832d3d0b26e61e11e6c6c1860584912e2abb79f6012c71cb
data/README.md CHANGED
@@ -74,13 +74,26 @@ $(document).ready(function() {
74
74
  left_padding: 50,
75
75
  right_padding: 50,
76
76
  focus_area_width: 500,
77
- focus_area_height: 500
77
+ focus_area_height: 500,
78
+ bounding_box: {
79
+ x: 401,
80
+ y: 90,
81
+ width: 3576,
82
+ height: 2142
83
+ }
78
84
  });
79
85
  }
80
86
  });
81
87
  ```
88
+
89
+ Focus area:
90
+
82
91
  ![map padding tuning](map_padding_tuning.jpg)
83
92
 
93
+ Bounding box:
94
+
95
+ ![bounding box](bounding_box.jpg)
96
+
84
97
  # Helpers
85
98
  ```
86
99
  render_map
@@ -13,15 +13,11 @@ var InitMap = function (params) {
13
13
  // - to delete start -----------------------------------------------------------------------------------------------------------------------
14
14
  var scale = 0.599999;
15
15
 
16
- var window_height = $(window).height() - 200;
17
- if (window_height < 400) window_height = 400;
18
-
19
- var window_width = $(window).width();
20
16
  var image_width = MAP_WIDTH * scale;
21
17
  var image_height = MAP_HEIGHT * scale;
22
18
 
23
- var x = (window_width - image_width)/2;
24
- var y = (window_height - image_height)/2;
19
+ var x = image_width/2;
20
+ var y = image_height/2;
25
21
  // - to delete end -----------------------------------------------------------------------------------------------------------------------
26
22
 
27
23
  var map_params = {
@@ -30,8 +26,7 @@ var InitMap = function (params) {
30
26
  x: x,
31
27
  y: y,
32
28
  mapwidth: MAP_WIDTH,
33
- mapheight: MAP_HEIGHT,
34
- height: window_height
29
+ mapheight: MAP_HEIGHT
35
30
  };
36
31
  map_params = $.extend(map_params, params);
37
32
  map_on_index_page = $('#map_wrapper').beMap(map_params);
@@ -59,10 +54,23 @@ var InitMap = function (params) {
59
54
  y: 0,
60
55
  dnd_enable: true,
61
56
  debug: false,
57
+
58
+ // координаты области (в системе координат контейнера, который содержит карту),
59
+ // в которую вписывается картинка этажа при входе в него
62
60
  left_padding: 20,
63
61
  focus_area_width: 520,
64
62
  top_padding: 20,
65
- focus_area_height: 520
63
+ focus_area_height: 520,
64
+
65
+ // прямоугольник, который расположен на изображении, в котором находится осмысленное
66
+ // содержимое карты. Значения в системе координат изображения, получены с помощью photoshop.
67
+ // TODO:: эти значения должны высчитываться при геренации json при наличии полигонов зданий
68
+ bounding_box: {
69
+ x: 0,
70
+ y: 0,
71
+ width: 0,
72
+ height: 0
73
+ }
66
74
  };
67
75
  self.svg = null;
68
76
  self.svg_overlay = null;
@@ -119,6 +127,7 @@ var InitMap = function (params) {
119
127
 
120
128
  // extend options
121
129
  self.o = $.extend(self.o, params);
130
+ self.o.height = _$m.outerHeight();
122
131
 
123
132
  self.x = self.o.x;
124
133
  self.y = self.o.y;
@@ -169,9 +178,6 @@ var InitMap = function (params) {
169
178
 
170
179
  self.data = data;
171
180
 
172
- //var nrlevels = 0;
173
- //var shownLevel;
174
-
175
181
  self.container = $('.mcontainer'); //$('<div></div>').addClass('mcontainer').appendTo(self.el);
176
182
  self.map = self.container.find('.mmap'); //$('<div></div>').addClass('mmap').appendTo(self.container);
177
183
  if (self.o.zoom) self.map.addClass('mapplic-zoomable');
@@ -297,108 +303,74 @@ var InitMap = function (params) {
297
303
  // NOTE:: запускаем данные в карту
298
304
  self.draw_childs(data["buildings"]);
299
305
 
300
- // проверим, всё ли уместилось
301
- self.invalidateViewArea();
302
-
303
306
  // инициализируем класс, обслуживающий поиск
304
307
  self.search_gui_klass = new SearchGUI(self);
305
308
 
306
- // начнём слушать окно браузера
307
- $(window).resize(function () {
308
-
309
- // Mobile
310
- //if ($(window).width() < 668) {
311
- // self.container.height($(window).height() - 66);
312
- //}
313
- //else self.container.height('100%');
314
-
315
- // Контейнер с картой должен слушать изменения габаритов окна и подгоняться по высоте
316
- var window_height = $(window).height() - 200;
317
- if (window_height < 400) window_height = 400;
318
- self.el.height(window_height + "px");
319
-
320
- // 20161003: заодно после редизайна необходимо позиционировать текстовый блок с адресом
321
- var hh = _$address_p.outerHeight(true);
322
- _$address_p.css('margin-top',(window_height - hh - 200)+"px");
323
-
324
- // 20170327: подгоняем по высоте блок с текстом внутри инфо-панели
325
- // т.к. список арендаторов и площадей может быть очень большим
326
- self.building_info_klass.set_max_height_of_tab_content(window_height - 220);
327
-
328
- // ------------------------------------------------------------------------------------------------------------------------
329
-
330
- // если пользователь еще не взаимодействовал с картой или вне здания\площади
331
- // вписываем картинку карты в главный прямоугольник карты
332
- // т.е. меняем масштаб
333
- if (self.mark_virgin) {
334
- // рассчитаем масштаб, при котором можно вписать главный прямоугольник карты в прямоугольник рабочей области
335
- var scaleX = self.calcScale(self.o.mapwidth*0.05, self.o.mapwidth *.95, self.X10, self.X20);
336
- var scaleY = self.calcScale(self.o.mapheight*0.05, self.o.mapheight *.95, self.Y10, self.Y20);
337
- var scale = (scaleX < scaleY) ? scaleX : scaleY;
338
- self.scale = scale; /* NOTE:: вызывается во время window resize */
339
- }
340
-
341
- // совмещаем точку на экране, в которую надо центрировать карту,
342
- // с центром карты (или с центром здания\площади, в котором находится юзер),
343
- // с учётом рассчитанного масштаба
344
-
345
- // если пользователь еще не взаимодействовал с картой или вне здания\площади,
346
- // то фокусируемся на центр карты,
347
- // иначе - фокусируемся на центр здания\площади, в котором находится пользователь и
348
- // фокус сдвигаем, с учётом того, что сбоку открыта панель с информацией о здании
349
-
350
- // NOTE-25::хардкод
351
- // логические координаты - геометрический центр картинки
352
- var cx = self.o.mapwidth/2;
353
- var cy = self.o.mapheight/2;
354
- var mark_do_moving = false;
355
-
356
- if (self.current_building) {
357
- cx = self.current_building.cx();
358
- cy = self.current_building.cy();
359
- mark_do_moving = true;
360
- } else if (self.current_area) {
361
- cx = self.current_area.cx();
362
- cy = self.current_area.cy();
363
- mark_do_moving = true;
364
- } else if (self.mark_virgin) {
365
- mark_do_moving = true;
366
- }
367
-
368
- if (mark_do_moving) {
369
- self.x = self.normalizeX({
370
- x: self.CX - self.scale * cx - self.container.offset().left,
371
- scale: self.scale
372
- });
373
- self.y = self.normalizeY({
374
- y: self.CY - self.scale * cy - self.container.offset().top,
375
- scale: self.scale
376
- });
377
- console.log("<$(window).resize> call moveTo");
378
- self.moveTo(self.x, self.y, self.scale, 100);
379
-
380
- // если пользователь ещё не взаимодействовал с картой (т.е. она только загрузилась и готова к использованию)
381
- // запомним позицию, чтобы при нажатии на кнопку "назад на карту" происходил возврат с исходному
382
- // состоянию
383
- if (self.mark_virgin) {
384
- self.initial_map_position = {
385
- x: self.x,
386
- y: self.y,
387
- scale: self.scale
388
- }
389
- }
309
+ self.calcViewArea();
310
+ self.invalidateViewArea();
390
311
 
391
- }
312
+ };
392
313
 
393
- // ------------------------------------------------------------------------------------------------------------------------
314
+ // позиционируем картинку и gui елементы
315
+ self.invalidateViewArea = function () {
394
316
 
317
+ //<editor-fold desc="// вписываем картинку карты в "главный" прямоугольник карты (т.е. рассчитываем масштаб)">
318
+ var scaleX = self.calcScale(
319
+ self.o['bounding_box']['x'],
320
+ self.o['bounding_box']['x'] + self.o['bounding_box']['width'],
321
+ self.X10, self.X20);
322
+
323
+ // note:: вписываем по ширине
324
+ // var scaleY = self.calcScale(
325
+ // self.o['bounding_box']['y'],
326
+ // self.o['bounding_box']['y'] + self.o['bounding_box']['height'],
327
+ // self.Y10,
328
+ // self.Y20);
329
+ // var scale = (scaleX < scaleY) ? scaleX : scaleY;
330
+ // self.scale = scaleX;
331
+
332
+ self.scale = scaleX;
333
+ //</editor-fold>
334
+
335
+ // совмещаем точку на экране, в которую надо центрировать карту,
336
+ // с центром карты,
337
+ // с учётом рассчитанного масштаба
338
+
339
+ // центр в системе координат контейнера который совмещаем с центром картинки.
340
+ var screen_center_x, screen_center_y;
341
+
342
+ // центр картинки (координаты в системе координат картинки)
343
+ var cx, cy;
344
+
345
+ screen_center_x = self.CX0;
346
+ screen_center_y = self.CY0;
347
+ cx = self.o['bounding_box']['x'] + self.o['bounding_box']['width']/2;
348
+ cy = self.o['bounding_box']['y'] + self.o['bounding_box']['height']/2;
349
+
350
+ self.x = self.normalizeX({
351
+ x: screen_center_x - self.scale * cx,
352
+ scale: self.scale
353
+ });
354
+ self.y = self.normalizeY({
355
+ y: screen_center_y - self.scale * cy,
356
+ scale: self.scale
357
+ });
358
+ self.moveTo(self.x, self.y, self.scale, 100);
395
359
 
396
- self.invalidateViewArea();
360
+ // будет использован при клике по кнопке "обратно на карту"
361
+ self.initial_map_position = {
362
+ x: self.x,
363
+ y: self.y,
364
+ scale: self.scale
365
+ };
397
366
 
398
- }).resize();
367
+ // позиционируем элементы
368
+ self.building_info_klass.set_left(self.X2);
369
+ $area_order_button.css("left", self.X2 + "px");
370
+ if (self.container) $container_buttons.css("margin-top", (self.container.height() -10) + "px");
399
371
 
400
372
  };
401
-
373
+
402
374
  // драг энд дроп и прочая мышь
403
375
  var initAddControls = function () {
404
376
  var map = self.map,
@@ -727,8 +699,6 @@ var InitMap = function (params) {
727
699
  return pageC - scale * logicC;
728
700
  };
729
701
 
730
- /* --- invalidateViewArea BEGIN --------------------------------------------------------------------------------- */
731
-
732
702
  var _$m = $("#map_wrapper");
733
703
  var _$b = $('.container');//$('footer .container');
734
704
  var $area_order_button = $('.area_order_button');
@@ -736,36 +706,34 @@ var InitMap = function (params) {
736
706
  var _is_debug_drawn = false;
737
707
  var _$address_p = $('#paddress'); // 20161003: после редизайна надо дополнительно позиционировать блок с адресом
738
708
 
739
- self.invalidateViewArea = function () {
740
- console.log('<invalidateViewArea>');
709
+ // рассчитаем опорные переменные для view
710
+ self.calcViewArea = function () {
741
711
 
742
- // рассчитаем "константы" - прямоугольник, в который надо вписывать картинки зданий при входе в них
712
+ // прямоугольник, в который надо вписывать картинки зданий при входе в них
743
713
  self.X1 = self.o.left_padding;
744
714
  self.X2 = self.o.left_padding + self.o.focus_area_width;
745
-
746
715
  self.Y1 = self.o.top_padding;
747
716
  self.Y2 = self.o.top_padding + self.o.focus_area_height;
748
-
749
717
  self.CX = (self.X2 + self.X1) / 2;
750
718
  self.CY = (self.Y2 + self.Y1) / 2;
751
719
 
720
+ // прямоугольник, в который надо вписывать полигоны площадей при входе в них
752
721
  self.X1S = _$b.offset().left + 200;
753
722
  self.Y1S = 140;
754
723
  self.X2S = self.X1 + _$b.width() * .4;
755
724
  self.X3 = self.X1 + _$b.width() - 100;
756
725
  self.Y2S = _$m.height() - 80;
757
726
 
758
- self.X10 = _$b.offset().left + 15;
759
- self.X20 = self.X10 + _$b.width();
760
- self.Y10 = 73;
761
- self.Y20 = _$m.height();
727
+ // "главный" прямоугольник (тот, в который вписывается картинка карты в режиме `view` )
728
+ // (координаты прямоугольника даны в системе координат контейнера, содержащего карту)
729
+ self.X10 = self.X1;
730
+ self.X20 = _$m.outerWidth() - 15;
731
+ self.Y10 = self.Y1;
732
+ self.Y20 = _$m.outerHeight() - 15;
733
+ self.CX0 = (self.X20 + self.X10) / 2;
734
+ self.CY0 = (self.Y20 + self.Y10) / 2;
762
735
 
763
- // позиционируем элементы
764
- self.building_info_klass.set_left(self.X2);
765
- $area_order_button.css("left", self.X2 + "px");
766
- if (self.container) $container_buttons.css("margin-top", (self.container.height() -10) + "px");
767
-
768
- // DEBUG
736
+ // DEBUG DRAWING
769
737
  if (self.o.debug) {
770
738
 
771
739
  if (!_is_debug_drawn) {
@@ -777,15 +745,19 @@ var InitMap = function (params) {
777
745
  //var style_dot = style + 'width:4px;height:4px;left:{X}px;top:{Y}px;';
778
746
 
779
747
  var to_draw = [
780
- {x: self.X1},
781
- {x: self.X2},
782
- {y: self.Y1},
783
- {y: self.Y2},
784
- //{x: self.X20},
785
- //{y: self.Y10},
786
- //{y: self.Y20},
787
- {x: self.CX},
788
- {y: self.CY}
748
+ // {x: self.X1},
749
+ // {x: self.X2},
750
+ // {y: self.Y1},
751
+ // {y: self.Y2},
752
+ // {x: self.CX},
753
+ // {y: self.CY},
754
+
755
+ {x: self.X10},
756
+ {x: self.X20},
757
+ {y: self.Y10},
758
+ {y: self.Y20},
759
+ {x: self.CX0},
760
+ {y: self.CY0}
789
761
  ];
790
762
 
791
763
 
@@ -808,8 +780,6 @@ var InitMap = function (params) {
808
780
 
809
781
  };
810
782
 
811
- /* --- invalidateViewArea END ----------------------------------------------------------------------------------- */
812
-
813
783
  self.addEvent = function (target, eventType, func) {
814
784
  self.events.push(new AppEvent(target, eventType, func));
815
785
  return self;
@@ -1216,6 +1216,7 @@ g.mapplic-clickable:hover > * {
1216
1216
 
1217
1217
  div#map_wrapper {
1218
1218
  position: relative;
1219
+ height: 550px; /* переопределить в host-приложении */
1219
1220
 
1220
1221
  div.mcontainer {
1221
1222
  background-color: #D9D9D9;
data/bounding_box.jpg ADDED
Binary file
@@ -1,3 +1,3 @@
1
1
  module C80MapFloors
2
- VERSION = '0.2.0.0'
2
+ VERSION = '0.2.0.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: c80_map_floors
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0.0
4
+ version: 0.2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - C80609A
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-04-14 00:00:00.000000000 Z
11
+ date: 2017-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -204,6 +204,7 @@ files:
204
204
  - app/views/c80_map_floors/shared/map_row/_search_gui.html.erb
205
205
  - bin/console
206
206
  - bin/setup
207
+ - bounding_box.jpg
207
208
  - c80_map_floors.gemspec
208
209
  - config/routes.rb
209
210
  - db/migrate/20161015190000_create_c80_map_floors_settings.rb
@@ -242,7 +243,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
242
243
  version: '0'
243
244
  requirements: []
244
245
  rubyforge_project:
245
- rubygems_version: 2.5.1
246
+ rubygems_version: 2.6.11
246
247
  signing_key:
247
248
  specification_version: 4
248
249
  summary: Map