c80_map_floors 0.2.0.0 → 0.2.0.1

Sign up to get free protection for your applications and to get access to all the features.
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