@eturnity/eturnity_3d 6.34.0 → 6.34.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.
Files changed (41) hide show
  1. package/.editorconfig +5 -0
  2. package/package.json +8 -4
  3. package/src/App.vue +16 -16
  4. package/src/assets/theme.js +4 -4
  5. package/src/components/ThreeCanvasViewer.vue +56 -43
  6. package/src/config.js +139 -65
  7. package/src/helper/MapView.js +214 -241
  8. package/src/helper/UpdateRoofModuleFieldRelations.js +17 -23
  9. package/src/helper/UpdateRoofObstacleRelations.js +48 -41
  10. package/src/helper/cameraMixin.js +97 -93
  11. package/src/helper/customProvider.js +28 -28
  12. package/src/helper/materialMixin.js +86 -70
  13. package/src/helper/materials.js +64 -49
  14. package/src/helper/render/background.js +2 -5
  15. package/src/helper/render/base.js +43 -40
  16. package/src/helper/render/clear.js +96 -84
  17. package/src/helper/render/edge.js +59 -65
  18. package/src/helper/render/geometryHandler.js +166 -128
  19. package/src/helper/render/imageOverlay.js +157 -106
  20. package/src/helper/render/index.js +21 -3
  21. package/src/helper/render/loader.js +34 -34
  22. package/src/helper/render/mapProjection.js +88 -74
  23. package/src/helper/render/margin.js +46 -50
  24. package/src/helper/render/moduleField.js +26 -24
  25. package/src/helper/render/node.js +43 -43
  26. package/src/helper/render/obstacle.js +50 -48
  27. package/src/helper/render/panel.js +85 -79
  28. package/src/helper/render/projectionMaterial.js +58 -50
  29. package/src/helper/render/roof.js +136 -133
  30. package/src/helper/render/texture.js +17 -17
  31. package/src/helper/render/tile.js +291 -0
  32. package/src/helper/renderMixin.js +30 -37
  33. package/src/helper/threeMixin.js +40 -101
  34. package/src/main.js +22 -18
  35. package/src/store/AddMargin.js +87 -83
  36. package/src/store/hydrateData.js +40 -30
  37. package/src/store/nodesEdgesCreation.js +177 -160
  38. package/src/store/three-d-module.js +41 -27
  39. package/src/utils/cancellablePromise.js +23 -0
  40. package/.eslintrc.json +0 -18
  41. package/src/helper/geo-three.module.js +0 -1903
@@ -6,9 +6,7 @@ import {
6
6
  getObstacleMarginOutline
7
7
  } from '@eturnity/eturnity_maths'
8
8
  import getLayers from '../utils/layers'
9
- import {
10
- UpdateRoofObstacleRelations
11
- } from '../helper/UpdateRoofObstacleRelations'
9
+ import { UpdateRoofObstacleRelations } from '../helper/UpdateRoofObstacleRelations'
12
10
 
13
11
  export async function hydrateData({ state, commit }, data) {
14
12
  let roofsResponse = data.roofs
@@ -17,18 +15,24 @@ export async function hydrateData({ state, commit }, data) {
17
15
  const layoutSettingResponse = data.layoutSettings
18
16
  const imageOverlayResponse = data.imageOverlay
19
17
  //removing empty roof,obstacle and modulefield generated by BE on variant creation
20
- roofsResponse=roofsResponse.reduce((acc,cur)=>{
21
- if(cur.roof_outline.length>0){acc.push(cur)}
18
+ roofsResponse = roofsResponse.reduce((acc, cur) => {
19
+ if (cur.roof_outline.length > 0) {
20
+ acc.push(cur)
21
+ }
22
22
  return acc
23
- },[])
24
- obstaclesResponse=obstaclesResponse.reduce((acc,cur)=>{
25
- if(cur.obstacle_outline.length>0){acc.push(cur)}
23
+ }, [])
24
+ obstaclesResponse = obstaclesResponse.reduce((acc, cur) => {
25
+ if (cur.obstacle_outline.length > 0) {
26
+ acc.push(cur)
27
+ }
26
28
  return acc
27
- },[])
28
- moduleFieldsResponse=moduleFieldsResponse.reduce((acc,cur)=>{
29
- if(cur.module_field_outline.length>0){acc.push(cur)}
29
+ }, [])
30
+ moduleFieldsResponse = moduleFieldsResponse.reduce((acc, cur) => {
31
+ if (cur.module_field_outline.length > 0) {
32
+ acc.push(cur)
33
+ }
30
34
  return acc
31
- },[])
35
+ }, [])
32
36
 
33
37
  if (imageOverlayResponse && imageOverlayResponse.image_overlay_url) {
34
38
  let imageOverlay = {
@@ -38,22 +42,27 @@ export async function hydrateData({ state, commit }, data) {
38
42
  }
39
43
  commit('mutate_imageOverlay', imageOverlay)
40
44
  }
41
-
45
+
42
46
  if (!!layoutSettingResponse) {
43
47
  const layoutSetting = layoutSettingResponse
44
- const moduleTextureVersionId=layoutSetting.module_texture_version_id || 0
48
+ const moduleTextureVersionId = layoutSetting.module_texture_version_id || 0
45
49
  commit('mutate_layoutSettings', layoutSetting)
46
- commit('mutate_moduleTextureVersionId',moduleTextureVersionId)
50
+ commit('mutate_moduleTextureVersionId', moduleTextureVersionId)
47
51
  commit('mutate_wallColor', layoutSetting.wall_color)
48
- let layers=getLayers()
52
+ let layers = getLayers()
49
53
  let selectedLayer
50
- if(layoutSetting.background_map_settings && layoutSetting.background_map_settings.layerKey){
51
- selectedLayer=layers.find(layer=>layer.key==layoutSetting.background_map_settings.layerKey)
52
- }else{
53
- selectedLayer=layers.find(layer=>layer.key=="googleLayer")
54
+ if (
55
+ layoutSetting.background_map_settings &&
56
+ layoutSetting.background_map_settings.layerKey
57
+ ) {
58
+ selectedLayer = layers.find(
59
+ (layer) => layer.key == layoutSetting.background_map_settings.layerKey
60
+ )
61
+ } else {
62
+ selectedLayer = layers.find((layer) => layer.key == 'googleLayer')
54
63
  }
55
64
  commit('mutate_selectedMapLayer', selectedLayer)
56
-
65
+
57
66
  //end of layoutSetting correction
58
67
  const newMapConfig = state.mapConfig
59
68
  newMapConfig.center = {
@@ -63,7 +72,7 @@ export async function hydrateData({ state, commit }, data) {
63
72
  newMapConfig.layer = layoutSetting.map_layer
64
73
  newMapConfig.zoom = layoutSetting.map_zoom
65
74
  commit('mutate_mapConfig', newMapConfig)
66
- }
75
+ }
67
76
 
68
77
  const roofs = []
69
78
  const obstacles = []
@@ -136,13 +145,15 @@ export async function hydrateData({ state, commit }, data) {
136
145
  pv_module_ids.push(moduleFieldResp.component_id_pv_module)
137
146
  mounting_system_ids.push(moduleFieldResp.component_id_mounting_system)
138
147
 
148
+ moduleField.data.number_of_panels_override =
149
+ moduleFieldResp.number_of_panels_override
150
+ moduleField.data.number_of_panels = moduleFieldResp.number_of_panels
151
+ moduleField.data.yearly_yield_manual_entry =
152
+ moduleFieldResp.yearly_yield_manual_entry
153
+ moduleField.data.yearly_yield_kwh_kwp = moduleFieldResp.yearly_yield_kwh_kwp
154
+ moduleField.data.yearly_yield_kwh_kwp_2 =
155
+ moduleFieldResp.yearly_yield_kwh_kwp_2
139
156
 
140
- moduleField.data.number_of_panels_override=moduleFieldResp.number_of_panels_override
141
- moduleField.data.number_of_panels=moduleFieldResp.number_of_panels
142
- moduleField.data.yearly_yield_manual_entry=moduleFieldResp.yearly_yield_manual_entry
143
- moduleField.data.yearly_yield_kwh_kwp=moduleFieldResp.yearly_yield_kwh_kwp
144
- moduleField.data.yearly_yield_kwh_kwp_2=moduleFieldResp.yearly_yield_kwh_kwp_2
145
-
146
157
  moduleField.data.modules = moduleFieldResp.modules
147
158
  moduleFieldResp.modules.forEach((m) => {
148
159
  const panel = new Polygon(
@@ -182,7 +193,7 @@ export async function hydrateData({ state, commit }, data) {
182
193
  //Get PV & Mounting system component Data (texture):
183
194
  pv_module_ids = [...new Set(pv_module_ids)]
184
195
  mounting_system_ids = [...new Set(mounting_system_ids)]
185
-
196
+
186
197
  state.polygons = [
187
198
  ...roofs,
188
199
  ...obstacles,
@@ -192,4 +203,3 @@ export async function hydrateData({ state, commit }, data) {
192
203
  ]
193
204
  state = UpdateRoofObstacleRelations(state)
194
205
  }
195
-
@@ -8,178 +8,195 @@ import {
8
8
  } from '@eturnity/eturnity_maths'
9
9
 
10
10
  export function generateNodes2D(polygons) {
11
- let nodes2D = []
12
- polygons
13
- .filter((poly) =>
14
- ['roof', 'obstacle', 'tmpModuleField', 'moduleField','construction'].includes(poly.layer)
15
- )
16
- .forEach((polygon) => {
17
- const outline = polygon.outline
18
- outline.forEach((point, i) => {
19
- //check if nodes2D already exist
20
- let node2D = nodes2D.find(
21
- (node) => isAlmostSamePoint2D(node, point,mmTolerance) && node.layer == polygon.layer
22
- )
23
- if (!node2D) {
24
- node2D = new Point(point.x, point.y, point.z, polygon.layer)
25
- node2D.belongsTo = []
26
- node2D.id="node2D"
27
- node2D.itemType = 'node2D'
28
- node2D.layer = polygon.layer
29
- node2D.masterHandle = {
30
- id: node2D.id,
31
- itemType: 'masterHandle',
32
- open: null,
33
- selected: null
34
- }
35
- nodes2D.push(node2D)
11
+ let nodes2D = []
12
+ polygons
13
+ .filter((poly) =>
14
+ [
15
+ 'roof',
16
+ 'obstacle',
17
+ 'tmpModuleField',
18
+ 'moduleField',
19
+ 'construction'
20
+ ].includes(poly.layer)
21
+ )
22
+ .forEach((polygon) => {
23
+ const outline = polygon.outline
24
+ outline.forEach((point, i) => {
25
+ //check if nodes2D already exist
26
+ let node2D = nodes2D.find(
27
+ (node) =>
28
+ isAlmostSamePoint2D(node, point, mmTolerance) &&
29
+ node.layer == polygon.layer
30
+ )
31
+ if (!node2D) {
32
+ node2D = new Point(point.x, point.y, point.z, polygon.layer)
33
+ node2D.belongsTo = []
34
+ node2D.id = 'node2D'
35
+ node2D.itemType = 'node2D'
36
+ node2D.layer = polygon.layer
37
+ node2D.masterHandle = {
38
+ id: node2D.id,
39
+ itemType: 'masterHandle',
40
+ open: null,
41
+ selected: null
36
42
  }
37
- node2D.belongsTo.push({
38
- polygonId: polygon.id,
39
- index: i,
40
- polygon
41
- })
42
- node2D.id+="_"+polygon.id+"_"+i
43
+ nodes2D.push(node2D)
44
+ }
45
+ node2D.belongsTo.push({
46
+ polygonId: polygon.id,
47
+ index: i,
48
+ polygon
43
49
  })
50
+ node2D.id += '_' + polygon.id + '_' + i
44
51
  })
45
-
46
- //all nodes has been created. now lets update open/selected field
47
- nodes2D.forEach((node2D) => {
48
- if (node2D.masterHandle) {
49
- node2D.masterHandle.open =
50
- node2D.belongsTo.filter((item) => item.polygon.outline[item.index].open || item.polygon.outline[item.index].hasWarning)
51
- .length > 0
52
- node2D.masterHandle.hasWarning =
53
- node2D.belongsTo.filter((item) => item.polygon.outline[item.index].hasWarning)
54
- .length > 0
55
- node2D.masterHandle.selected =
56
- node2D.belongsTo.filter(
57
- (item) => item.polygon.outline[item.index].selected
58
- ).length == node2D.belongsTo.length
59
- }
60
52
  })
61
- return nodes2D
62
- }
63
-
53
+
54
+ //all nodes has been created. now lets update open/selected field
55
+ nodes2D.forEach((node2D) => {
56
+ if (node2D.masterHandle) {
57
+ node2D.masterHandle.open =
58
+ node2D.belongsTo.filter(
59
+ (item) =>
60
+ item.polygon.outline[item.index].open ||
61
+ item.polygon.outline[item.index].hasWarning
62
+ ).length > 0
63
+ node2D.masterHandle.hasWarning =
64
+ node2D.belongsTo.filter(
65
+ (item) => item.polygon.outline[item.index].hasWarning
66
+ ).length > 0
67
+ node2D.masterHandle.selected =
68
+ node2D.belongsTo.filter(
69
+ (item) => item.polygon.outline[item.index].selected
70
+ ).length == node2D.belongsTo.length
71
+ }
72
+ })
73
+ return nodes2D
74
+ }
75
+
64
76
  export function generateNodes3D(polygons) {
65
- let nodes3D = []
66
- polygons
67
- .filter((poly) =>
68
- ['roof', 'obstacle', 'tmpModuleField', 'moduleField'].includes(poly.layer)
69
- )
70
- .forEach((polygon) => {
71
- const outline = polygon.outline
72
- outline.forEach((point, i) => {
73
- //check if nodes2D already exist
74
- let node3D = nodes3D.find((node) => isSamePoint3D(node, point))
75
- if (!node3D) {
76
- node3D = new Point(point.x, point.y, point.z, polygon.layer)
77
- node3D.belongsTo = []
78
- node3D.id="node3D"
79
- node3D.itemType = 'node3D'
80
- node3D.layer = polygon.layer
81
- node3D.masterHandle = {
82
- id: node3D.id,
83
- itemType: 'masterHandle',
84
- open: null,
85
- selected: null
86
- }
87
- nodes3D.push(node3D)
77
+ let nodes3D = []
78
+ polygons
79
+ .filter((poly) =>
80
+ ['roof', 'obstacle', 'tmpModuleField', 'moduleField'].includes(poly.layer)
81
+ )
82
+ .forEach((polygon) => {
83
+ const outline = polygon.outline
84
+ outline.forEach((point, i) => {
85
+ //check if nodes2D already exist
86
+ let node3D = nodes3D.find((node) => isSamePoint3D(node, point))
87
+ if (!node3D) {
88
+ node3D = new Point(point.x, point.y, point.z, polygon.layer)
89
+ node3D.belongsTo = []
90
+ node3D.id = 'node3D'
91
+ node3D.itemType = 'node3D'
92
+ node3D.layer = polygon.layer
93
+ node3D.masterHandle = {
94
+ id: node3D.id,
95
+ itemType: 'masterHandle',
96
+ open: null,
97
+ selected: null
88
98
  }
89
- node3D.belongsTo.push({
90
- polygonId: polygon.id,
91
- index: i,
92
- polygon
93
- })
94
- node3D.id+="_"+polygon.id+"_"+i
99
+ nodes3D.push(node3D)
100
+ }
101
+ node3D.belongsTo.push({
102
+ polygonId: polygon.id,
103
+ index: i,
104
+ polygon
95
105
  })
106
+ node3D.id += '_' + polygon.id + '_' + i
96
107
  })
97
- //all nodes has been created. now lets update open/selected field
98
- nodes3D.forEach((node3D) => {
99
- if (node3D.masterHandle) {
100
- node3D.masterHandle.open =
101
- node3D.belongsTo.filter((item) => item.polygon.outline[item.index].open)
102
- .length > 0
103
- node3D.masterHandle.selected =
104
- node3D.belongsTo.filter(
105
- (item) => item.polygon.outline[item.index].selected
106
- ).length > node3D.belongsTo.length
107
- }
108
108
  })
109
- return nodes3D
110
- }
111
-
109
+ //all nodes has been created. now lets update open/selected field
110
+ nodes3D.forEach((node3D) => {
111
+ if (node3D.masterHandle) {
112
+ node3D.masterHandle.open =
113
+ node3D.belongsTo.filter((item) => item.polygon.outline[item.index].open)
114
+ .length > 0
115
+ node3D.masterHandle.selected =
116
+ node3D.belongsTo.filter(
117
+ (item) => item.polygon.outline[item.index].selected
118
+ ).length > node3D.belongsTo.length
119
+ }
120
+ })
121
+ return nodes3D
122
+ }
123
+
112
124
  export function generateEdges2D(polygons) {
113
- let edges2D = []
114
- polygons
115
- .filter((poly) => ['roof', 'obstacle','moduleField','construction'].includes(poly.layer))
116
- .forEach((polygon) => {
117
- const outline = polygon.outline
118
- outline.forEach((point, i) => {
119
- if(!polygon.isClosed && i==outline.length-1){
120
- return
121
- }
122
- //check if edge2D already exist
123
- const nextPoint = outline[(i + 1) % outline.length]
124
- let edge2D = edges2D.find((edge) => {
125
- return (
126
- isAlmostSameSegment2D([point, nextPoint], edge.outline,mmTolerance) &&
127
- edge.layer == polygon.layer
128
- )
129
- })
130
- if (!edge2D) {
131
- //create an edge at this position
132
- edge2D = new Line(point, nextPoint, polygon.layer)
133
- edge2D.id='edge2D'
134
- edge2D.belongsTo = []
135
- edge2D.layer = polygon.layer
136
- edge2D.selected = false
137
- edge2D.itemType = 'edge2D'
138
- edges2D.push(edge2D)
139
- }
140
- //add BelongToPolygon
141
- edge2D.belongsTo.push({
142
- polygonId: polygon.id,
143
- index: i,
144
- polygon
145
- })
146
- edge2D.id+="_"+polygon.id+"_"+i
125
+ let edges2D = []
126
+ polygons
127
+ .filter((poly) =>
128
+ ['roof', 'obstacle', 'moduleField', 'construction'].includes(poly.layer)
129
+ )
130
+ .forEach((polygon) => {
131
+ const outline = polygon.outline
132
+ outline.forEach((point, i) => {
133
+ if (!polygon.isClosed && i == outline.length - 1) {
134
+ return
135
+ }
136
+ //check if edge2D already exist
137
+ const nextPoint = outline[(i + 1) % outline.length]
138
+ let edge2D = edges2D.find((edge) => {
139
+ return (
140
+ isAlmostSameSegment2D(
141
+ [point, nextPoint],
142
+ edge.outline,
143
+ mmTolerance
144
+ ) && edge.layer == polygon.layer
145
+ )
146
+ })
147
+ if (!edge2D) {
148
+ //create an edge at this position
149
+ edge2D = new Line(point, nextPoint, polygon.layer)
150
+ edge2D.id = 'edge2D'
151
+ edge2D.belongsTo = []
152
+ edge2D.layer = polygon.layer
153
+ edge2D.selected = false
154
+ edge2D.itemType = 'edge2D'
155
+ edges2D.push(edge2D)
156
+ }
157
+ //add BelongToPolygon
158
+ edge2D.belongsTo.push({
159
+ polygonId: polygon.id,
160
+ index: i,
161
+ polygon
147
162
  })
163
+ edge2D.id += '_' + polygon.id + '_' + i
148
164
  })
149
- return edges2D
150
- }
151
-
165
+ })
166
+ return edges2D
167
+ }
168
+
152
169
  export function generateEdges3D(polygons) {
153
- let edges3D = []
154
- polygons
155
- .filter((poly) => poly.layer == 'roof' || poly.layer == 'obstacle')
156
- .forEach((polygon) => {
157
- const outline = polygon.outline
158
- outline.forEach((point, i) => {
159
- //check if edge2D already exist
160
- const nextPoint = outline[(i + 1) % outline.length]
161
- let edge3D = edges3D.find((edge) => {
162
- isSameSegment3D([point, nextPoint], edge.outline) &&
163
- edge.layer == polygon.layer
164
- })
165
- if (!edge3D) {
166
- //create an edge at this position
167
- edge3D = new Line(point, nextPoint, polygon.layer)
168
- edge3D.id='edge3D'
169
- edge3D.belongsTo = []
170
- edge3D.layer = polygon.layer
171
- edge3D.selected = false
172
- edge3D.itemType = 'edge3D'
173
- edges3D.push(edge3D)
174
- }
175
- //add BelongToPolygon
176
- edge3D.belongsTo.push({
177
- polygonId: polygon.id,
178
- index: i,
179
- polygon
180
- })
181
- edge3D.id+="_"+polygon.id+"_"+i
170
+ let edges3D = []
171
+ polygons
172
+ .filter((poly) => poly.layer == 'roof' || poly.layer == 'obstacle')
173
+ .forEach((polygon) => {
174
+ const outline = polygon.outline
175
+ outline.forEach((point, i) => {
176
+ //check if edge2D already exist
177
+ const nextPoint = outline[(i + 1) % outline.length]
178
+ let edge3D = edges3D.find((edge) => {
179
+ isSameSegment3D([point, nextPoint], edge.outline) &&
180
+ edge.layer == polygon.layer
181
+ })
182
+ if (!edge3D) {
183
+ //create an edge at this position
184
+ edge3D = new Line(point, nextPoint, polygon.layer)
185
+ edge3D.id = 'edge3D'
186
+ edge3D.belongsTo = []
187
+ edge3D.layer = polygon.layer
188
+ edge3D.selected = false
189
+ edge3D.itemType = 'edge3D'
190
+ edges3D.push(edge3D)
191
+ }
192
+ //add BelongToPolygon
193
+ edge3D.belongsTo.push({
194
+ polygonId: polygon.id,
195
+ index: i,
196
+ polygon
182
197
  })
198
+ edge3D.id += '_' + polygon.id + '_' + i
183
199
  })
184
- return edges3D
185
- }
200
+ })
201
+ return edges3D
202
+ }
@@ -19,7 +19,7 @@ const init_state = {
19
19
  cancelTokenGlobal: '',
20
20
  globalProjectProperties: [],
21
21
  buildingLocation: null,
22
- imageOverlay:null,
22
+ imageOverlay: null,
23
23
  layoutSettings: {
24
24
  base64_image_url: null,
25
25
  layout_latitude: null,
@@ -29,22 +29,21 @@ const init_state = {
29
29
  camera_3d: {}
30
30
  },
31
31
  //useless state for viewer
32
- pvDataMemo:[],
33
- mountingDataMemo:[],
34
- moduleTextureVersionId:0,
35
- wallColor:'#454545',
36
- panelOpacity:1,
37
- selectedMapLayer:null,
32
+ pvDataMemo: [],
33
+ mountingDataMemo: [],
34
+ moduleTextureVersionId: 0,
35
+ wallColor: '#454545',
36
+ panelOpacity: 1,
37
+ selectedMapLayer: null,
38
38
  globalProjectProperties: [],
39
- imageOverlay:null
39
+ imageOverlay: null
40
40
  }
41
41
 
42
42
  const state = init_state
43
43
 
44
44
  const getters = {
45
-
46
45
  getSelectedTool() {
47
- return ""
46
+ return ''
48
47
  },
49
48
  getRoofs(state) {
50
49
  return state.polygons.filter((p) => p.layer == 'roof')
@@ -89,7 +88,7 @@ const getters = {
89
88
  getBuildingLocation(state) {
90
89
  return state.buildingLocation
91
90
  },
92
- getImageOverlay(state){
91
+ getImageOverlay(state) {
93
92
  return state.imageOverlay
94
93
  },
95
94
  getLayoutSettings(state) {
@@ -98,16 +97,31 @@ const getters = {
98
97
  getGeometryEvents() {
99
98
  return []
100
99
  },
101
- getRoofsBounds(state,getters){
102
- let bounds={xMin:Infinity,xMax:-Infinity,yMin:Infinity,yMax:-Infinity}
103
- getters.getRoofs.forEach(polygon=>polygon.outline.forEach(p=>{
104
- if(bounds.xMin>p.x){bounds.xMin=p.x}
105
- if(bounds.xMax<p.x){bounds.xMax=p.x}
106
- if(bounds.yMin>p.y){bounds.yMin=p.y}
107
- if(bounds.yMax<p.y){bounds.yMax=p.y}
108
- }))
100
+ getRoofsBounds(state, getters) {
101
+ let bounds = {
102
+ xMin: Infinity,
103
+ xMax: -Infinity,
104
+ yMin: Infinity,
105
+ yMax: -Infinity
106
+ }
107
+ getters.getRoofs.forEach((polygon) =>
108
+ polygon.outline.forEach((p) => {
109
+ if (bounds.xMin > p.x) {
110
+ bounds.xMin = p.x
111
+ }
112
+ if (bounds.xMax < p.x) {
113
+ bounds.xMax = p.x
114
+ }
115
+ if (bounds.yMin > p.y) {
116
+ bounds.yMin = p.y
117
+ }
118
+ if (bounds.yMax < p.y) {
119
+ bounds.yMax = p.y
120
+ }
121
+ })
122
+ )
109
123
  return bounds
110
- },
124
+ }
111
125
  }
112
126
 
113
127
  const mutations = {
@@ -138,15 +152,15 @@ const mutations = {
138
152
  mutate_buildingLocation(state, value) {
139
153
  state.buildingLocation = value
140
154
  },
141
- mutate_moduleTextureVersionId(state,value){
142
- state.moduleTextureVersionId=value
155
+ mutate_moduleTextureVersionId(state, value) {
156
+ state.moduleTextureVersionId = value
143
157
  },
144
- mutate_wallColor(state,value){
145
- state.wallColor=value
146
- },
147
- mutate_selectedMapLayer(state,value){
148
- state.selectedMapLayer=value
158
+ mutate_wallColor(state, value) {
159
+ state.wallColor = value
149
160
  },
161
+ mutate_selectedMapLayer(state, value) {
162
+ state.selectedMapLayer = value
163
+ }
150
164
  }
151
165
 
152
166
  const actions = {
@@ -0,0 +1,23 @@
1
+ export function cancellablePromise(promise){
2
+ let status='pending'
3
+ let isCancel=false
4
+ const promiseObject=new Promise(function(res,rej){
5
+ promise
6
+ .then(data=>{
7
+ if(!isCancel){res(data);status='resolved'}else{
8
+ status='resolved but cancelled before'
9
+ }
10
+ })
11
+ .catch(data=>{
12
+ status='rejected'
13
+ if(!isCancel) rej(data)
14
+ })
15
+ })
16
+ promiseObject.getStatus=()=>{
17
+ return status
18
+ }
19
+ promiseObject.cancel=()=>{
20
+ isCancel=true
21
+ }
22
+ return promiseObject
23
+ }
package/.eslintrc.json DELETED
@@ -1,18 +0,0 @@
1
- {
2
- "env": {
3
- "browser": true,
4
- "es2021": true
5
- },
6
- "extends": "plugin:vue/vue3-essential",
7
- "overrides": [
8
- ],
9
- "parserOptions": {
10
- "ecmaVersion": "latest",
11
- "sourceType": "module"
12
- },
13
- "plugins": [
14
- "vue"
15
- ],
16
- "rules": {
17
- }
18
- }