@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.
- package/.editorconfig +5 -0
- package/package.json +8 -4
- package/src/App.vue +16 -16
- package/src/assets/theme.js +4 -4
- package/src/components/ThreeCanvasViewer.vue +56 -43
- package/src/config.js +139 -65
- package/src/helper/MapView.js +214 -241
- package/src/helper/UpdateRoofModuleFieldRelations.js +17 -23
- package/src/helper/UpdateRoofObstacleRelations.js +48 -41
- package/src/helper/cameraMixin.js +97 -93
- package/src/helper/customProvider.js +28 -28
- package/src/helper/materialMixin.js +86 -70
- package/src/helper/materials.js +64 -49
- package/src/helper/render/background.js +2 -5
- package/src/helper/render/base.js +43 -40
- package/src/helper/render/clear.js +96 -84
- package/src/helper/render/edge.js +59 -65
- package/src/helper/render/geometryHandler.js +166 -128
- package/src/helper/render/imageOverlay.js +157 -106
- package/src/helper/render/index.js +21 -3
- package/src/helper/render/loader.js +34 -34
- package/src/helper/render/mapProjection.js +88 -74
- package/src/helper/render/margin.js +46 -50
- package/src/helper/render/moduleField.js +26 -24
- package/src/helper/render/node.js +43 -43
- package/src/helper/render/obstacle.js +50 -48
- package/src/helper/render/panel.js +85 -79
- package/src/helper/render/projectionMaterial.js +58 -50
- package/src/helper/render/roof.js +136 -133
- package/src/helper/render/texture.js +17 -17
- package/src/helper/render/tile.js +291 -0
- package/src/helper/renderMixin.js +30 -37
- package/src/helper/threeMixin.js +40 -101
- package/src/main.js +22 -18
- package/src/store/AddMargin.js +87 -83
- package/src/store/hydrateData.js +40 -30
- package/src/store/nodesEdgesCreation.js +177 -160
- package/src/store/three-d-module.js +41 -27
- package/src/utils/cancellablePromise.js +23 -0
- package/.eslintrc.json +0 -18
- package/src/helper/geo-three.module.js +0 -1903
package/src/store/hydrateData.js
CHANGED
|
@@ -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){
|
|
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){
|
|
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){
|
|
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(
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
.
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
edge2D.
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
165
|
+
})
|
|
166
|
+
return edges2D
|
|
167
|
+
}
|
|
168
|
+
|
|
152
169
|
export function generateEdges3D(polygons) {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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
|
-
|
|
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={
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
}
|