@eturnity/eturnity_3d 0.0.4

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 (78) hide show
  1. package/.babelrc +3 -0
  2. package/.env +0 -0
  3. package/.eslintrc +18 -0
  4. package/.eslintrc.json +18 -0
  5. package/.prettierrc +7 -0
  6. package/Dockerfile +17 -0
  7. package/README.md +18 -0
  8. package/bitbucket-pipelines.yml +681 -0
  9. package/dist/assets/images/panels/longiSolarLR4_60HPH_350M.png +0 -0
  10. package/dist/assets/images/panels/longiSolarLR4_60HPH_370M.png +0 -0
  11. package/dist/assets/images/panels/reneSola_Virtus_2_JC320S_24_Bbw copy.png +0 -0
  12. package/dist/assets/images/panels/reneSola_Virtus_2_JC320S_24_Bbw.png +0 -0
  13. package/dist/assets/images/panels/uv.png +0 -0
  14. package/dist/assets/panels/longiSolarLR4_60HPH_350M.png +0 -0
  15. package/dist/assets/panels/longiSolarLR4_60HPH_370M.png +0 -0
  16. package/dist/assets/panels/reneSola_Virtus_2_JC320S_24_Bbw.png +0 -0
  17. package/dist/assets/panels/uv.png +0 -0
  18. package/dist/assets/theme.js +43 -0
  19. package/dist/assets/vue.svg +1 -0
  20. package/dist/css/main.1f8fe45d.css +1 -0
  21. package/dist/img/longiSolarLR4_60HPH_350M.85a84b2e.png +0 -0
  22. package/dist/img/longiSolarLR4_60HPH_370M.bf6b1f4e.png +0 -0
  23. package/dist/img/reneSola_Virtus_2_JC320S_24_Bbw.8b1892e0.png +0 -0
  24. package/dist/index.html +26 -0
  25. package/dist/main.js +60230 -0
  26. package/dist/main.js.map +1 -0
  27. package/dist/vite.svg +1 -0
  28. package/docker_conf/nginx/nginx.conf +16 -0
  29. package/index.html +26 -0
  30. package/package.json +71 -0
  31. package/postcss.config.js +1 -0
  32. package/preview.html +55 -0
  33. package/public/assets/images/panels/longiSolarLR4_60HPH_350M.png +0 -0
  34. package/public/assets/images/panels/longiSolarLR4_60HPH_370M.png +0 -0
  35. package/public/assets/images/panels/reneSola_Virtus_2_JC320S_24_Bbw copy.png +0 -0
  36. package/public/assets/images/panels/reneSola_Virtus_2_JC320S_24_Bbw.png +0 -0
  37. package/public/assets/images/panels/uv.png +0 -0
  38. package/public/assets/panels/longiSolarLR4_60HPH_350M.png +0 -0
  39. package/public/assets/panels/longiSolarLR4_60HPH_370M.png +0 -0
  40. package/public/assets/panels/reneSola_Virtus_2_JC320S_24_Bbw.png +0 -0
  41. package/public/assets/panels/uv.png +0 -0
  42. package/public/assets/theme.js +43 -0
  43. package/public/assets/vue.svg +1 -0
  44. package/public/vite.svg +1 -0
  45. package/server.js +17 -0
  46. package/src/App.vue +28 -0
  47. package/src/assets/images/panels/longiSolarLR4_60HPH_350M.png +0 -0
  48. package/src/assets/images/panels/longiSolarLR4_60HPH_370M.png +0 -0
  49. package/src/assets/images/panels/reneSola_Virtus_2_JC320S_24_Bbw copy.png +0 -0
  50. package/src/assets/images/panels/reneSola_Virtus_2_JC320S_24_Bbw.png +0 -0
  51. package/src/assets/images/panels/uv.png +0 -0
  52. package/src/assets/images/white_tile.png +0 -0
  53. package/src/assets/theme.js +43 -0
  54. package/src/components/ThreeCanvasViewer.vue +247 -0
  55. package/src/config.js +104 -0
  56. package/src/functions.js +2 -0
  57. package/src/helper/DFS.js +80 -0
  58. package/src/helper/MapView.js +253 -0
  59. package/src/helper/UpdateRoofModuleFieldRelations.js +119 -0
  60. package/src/helper/UpdateRoofObstacleRelations.js +86 -0
  61. package/src/helper/clearThreeObjects.js +21 -0
  62. package/src/helper/customProvider.js +57 -0
  63. package/src/helper/geometryHandler.js +606 -0
  64. package/src/helper/graphCreation.js +43 -0
  65. package/src/helper/materials.js +55 -0
  66. package/src/helper/projectedMaterial.js +502 -0
  67. package/src/helper/renderMixin.js +1132 -0
  68. package/src/helper/threeMixin.js +171 -0
  69. package/src/main.js +28 -0
  70. package/src/store/AddMargin.js +107 -0
  71. package/src/store/hydrateData.js +209 -0
  72. package/src/store/nodesEdgesCreation.js +216 -0
  73. package/src/store/store.js +10 -0
  74. package/src/store/three-d-module.js +142 -0
  75. package/src/style.css +96 -0
  76. package/src/utils/layers.js +265 -0
  77. package/src/utils/leaflet-config.service.js +67 -0
  78. package/vue.config.js +46 -0
@@ -0,0 +1,216 @@
1
+ import { Point, Line } from '@eturnity/eturnity_maths'
2
+ import { mmTolerance } from '../config'
3
+ import {
4
+ isSamePoint2D,
5
+ isSamePoint3D,
6
+ isSameSegment2D,
7
+ isAlmostSameSegment2D,
8
+ isSameSegment3D,
9
+ isAlmostSamePoint2D
10
+ } from '@eturnity/eturnity_maths'
11
+
12
+ export function generateNodes2D(polygons, constructionPolyline) {
13
+ let nodes2D = []
14
+ polygons
15
+ .filter((poly) =>
16
+ ['roof', 'obstacle', 'tmpModuleField', 'moduleField'].includes(poly.layer)
17
+ )
18
+ .forEach((polygon) => {
19
+ const outline = polygon.outline
20
+ outline.forEach((point, i) => {
21
+ //check if nodes2D already exist
22
+ let node2D = nodes2D.find(
23
+ (node) => isAlmostSamePoint2D(node, point,mmTolerance) && node.layer == polygon.layer
24
+ )
25
+ if (!node2D) {
26
+ node2D = new Point(point.x, point.y, point.z, polygon.layer)
27
+ node2D.belongsTo = []
28
+ node2D.itemType = 'node2D'
29
+ node2D.layer = polygon.layer
30
+ node2D.masterHandle = {
31
+ id: node2D.id,
32
+ itemType: 'masterHandle',
33
+ open: null,
34
+ selected: null
35
+ }
36
+ nodes2D.push(node2D)
37
+ }
38
+ node2D.belongsTo.push({
39
+ polygonId: polygon.id,
40
+ index: i,
41
+ polygon
42
+ })
43
+ })
44
+ })
45
+ if (constructionPolyline) {
46
+ constructionPolyline.outline.forEach((point, i) => {
47
+ //check if nodes2D already exist
48
+ const node2D = new Point(
49
+ point.x,
50
+ point.y,
51
+ point.z,
52
+ constructionPolyline.layer
53
+ )
54
+ node2D.belongsTo = [
55
+ {
56
+ polygonId: constructionPolyline.id,
57
+ index: i,
58
+ polygon: constructionPolyline
59
+ }
60
+ ]
61
+ node2D.itemType = 'node2D'
62
+ node2D.layer = constructionPolyline.layer
63
+ nodes2D.push(node2D)
64
+ })
65
+ }
66
+ //all nodes has been created. now lets update open/selected field
67
+ nodes2D.forEach((node2D) => {
68
+ if (node2D.masterHandle) {
69
+ node2D.masterHandle.open =
70
+ node2D.belongsTo.filter((item) => item.polygon.outline[item.index].open)
71
+ .length > 0
72
+ node2D.masterHandle.selected =
73
+ node2D.belongsTo.filter(
74
+ (item) => item.polygon.outline[item.index].selected
75
+ ).length == node2D.belongsTo.length
76
+ }
77
+ })
78
+ return nodes2D
79
+ }
80
+
81
+ export function generateNodes3D(polygons) {
82
+ let nodes3D = []
83
+ polygons
84
+ .filter((poly) =>
85
+ ['roof', 'obstacle', 'tmpModuleField', 'moduleField'].includes(poly.layer)
86
+ )
87
+ .forEach((polygon) => {
88
+ const outline = polygon.outline
89
+ outline.forEach((point, i) => {
90
+ //check if nodes2D already exist
91
+ let node3D = nodes3D.find((node) => isSamePoint3D(node, point))
92
+ if (!node3D) {
93
+ node3D = new Point(point.x, point.y, point.z, polygon.layer)
94
+ node3D.belongsTo = []
95
+ node3D.itemType = 'node3D'
96
+ node3D.layer = polygon.layer
97
+ node3D.masterHandle = {
98
+ id: node3D.id,
99
+ itemType: 'masterHandle',
100
+ open: null,
101
+ selected: null
102
+ }
103
+ nodes3D.push(node3D)
104
+ }
105
+ node3D.belongsTo.push({
106
+ polygonId: polygon.id,
107
+ index: i,
108
+ polygon
109
+ })
110
+ })
111
+ })
112
+ //all nodes has been created. now lets update open/selected field
113
+ nodes3D.forEach((node3D) => {
114
+ if (node3D.masterHandle) {
115
+ node3D.masterHandle.open =
116
+ node3D.belongsTo.filter((item) => item.polygon.outline[item.index].open)
117
+ .length > 0
118
+ node3D.masterHandle.selected =
119
+ node3D.belongsTo.filter(
120
+ (item) => item.polygon.outline[item.index].selected
121
+ ).length > node3D.belongsTo.length
122
+ }
123
+ })
124
+ return nodes3D
125
+ }
126
+
127
+ export function generateEdges2D(polygons, constructionPolyline) {
128
+ let edges2D = []
129
+ polygons
130
+ .filter((poly) => ['roof', 'obstacle'].includes(poly.layer))
131
+ .forEach((polygon) => {
132
+ const outline = polygon.outline
133
+ outline.forEach((point, i) => {
134
+ //check if edge2D already exist
135
+ const nextPoint = outline[(i + 1) % outline.length]
136
+ let edge2D = edges2D.find((edge) => {
137
+ return (
138
+ isAlmostSameSegment2D([point, nextPoint], edge.outline,mmTolerance) &&
139
+ edge.layer == polygon.layer
140
+ )
141
+ })
142
+ if (!edge2D) {
143
+ //create an edge at this position
144
+ edge2D = new Line(point, nextPoint, polygon.layer)
145
+ edge2D.belongsTo = []
146
+ edge2D.layer = polygon.layer
147
+ edge2D.selected = false
148
+ edge2D.itemType = 'edge2D'
149
+ edges2D.push(edge2D)
150
+ }
151
+ //add BelongToPolygon
152
+ edge2D.belongsTo.push({
153
+ polygonId: polygon.id,
154
+ index: i,
155
+ polygon
156
+ })
157
+ })
158
+ })
159
+ if (constructionPolyline) {
160
+ constructionPolyline.outline.forEach((point, i) => {
161
+ //check if nodes2D already exist
162
+ if (i != constructionPolyline.outline.length - 1) {
163
+ const nextPoint =
164
+ constructionPolyline.outline[
165
+ (i + 1) % constructionPolyline.outline.length
166
+ ]
167
+ const edge2D = new Line(point, nextPoint, constructionPolyline.layer)
168
+ edge2D.belongsTo = [
169
+ {
170
+ polygonId: constructionPolyline.id,
171
+ index: i,
172
+ polygon: constructionPolyline
173
+ }
174
+ ]
175
+ edge2D.layer = constructionPolyline.layer
176
+ edge2D.selected = false
177
+ edge2D.itemType = 'edge2D'
178
+ edges2D.push(edge2D)
179
+ }
180
+ })
181
+ }
182
+ return edges2D
183
+ }
184
+
185
+ export function generateEdges3D(polygons) {
186
+ let edges3D = []
187
+ polygons
188
+ .filter((poly) => poly.layer == 'roof' || poly.layer == 'obstacle')
189
+ .forEach((polygon) => {
190
+ const outline = polygon.outline
191
+ outline.forEach((point, i) => {
192
+ //check if edge2D already exist
193
+ const nextPoint = outline[(i + 1) % outline.length]
194
+ let edge3D = edges3D.find((edge) => {
195
+ isSameSegment3D([point, nextPoint], edge.outline) &&
196
+ edge.layer == polygon.layer
197
+ })
198
+ if (!edge3D) {
199
+ //create an edge at this position
200
+ edge3D = new Line(point, nextPoint, polygon.layer)
201
+ edge3D.belongsTo = []
202
+ edge3D.layer = polygon.layer
203
+ edge3D.selected = false
204
+ edge3D.itemType = 'edge3D'
205
+ edges3D.push(edge3D)
206
+ }
207
+ //add BelongToPolygon
208
+ edge3D.belongsTo.push({
209
+ polygonId: polygon.id,
210
+ index: i,
211
+ polygon
212
+ })
213
+ })
214
+ })
215
+ return edges3D
216
+ }
@@ -0,0 +1,10 @@
1
+ import Vue from 'vue'
2
+ import Vuex from 'vuex'
3
+ import threeDModule from './three-d-module'
4
+
5
+ Vue.use(Vuex)
6
+ export default new Vuex.Store({
7
+ modules: {
8
+ threeDModule
9
+ }
10
+ })
@@ -0,0 +1,142 @@
1
+ import {
2
+ generateNodes2D,
3
+ generateNodes3D,
4
+ generateEdges2D,
5
+ generateEdges3D
6
+ } from './nodesEdgesCreation'
7
+ import { hydrateData } from './hydrateData.js'
8
+
9
+ const init_state = {
10
+ isLoading: false,
11
+
12
+ polygons: [],
13
+ nodes: [],
14
+ edges: [],
15
+
16
+ mapConfig: {},
17
+
18
+ //for Panels
19
+ cancelTokenGlobal: '',
20
+ globalProjectProperties: [],
21
+ buildingLocation: null,
22
+ layoutSettings: {
23
+ base64_image_url: null,
24
+ layout_latitude: null,
25
+ layout_longitude: null,
26
+ map_layer: 'swisstopoLayer_swissimage',
27
+ map_zoom: 19,
28
+ camera_3d: {}
29
+ },
30
+ //useless state for viewer
31
+ pvDataMemo:[],
32
+ mountingDataMemo:[],
33
+ module_texture_version_id:0,
34
+ selectedMapLayer:null,
35
+ globalProjectProperties: [],
36
+ }
37
+
38
+ const state = init_state
39
+
40
+ const getters = {
41
+
42
+ getSelectedTool() {
43
+ return ""
44
+ },
45
+ getRoofs(state) {
46
+ return state.polygons.filter((p) => p.layer == 'roof')
47
+ },
48
+ getObstacles(state) {
49
+ return state.polygons.filter((p) => p.layer == 'obstacle')
50
+ },
51
+ getModuleFields(state) {
52
+ return state.polygons.filter((p) => p.layer == 'moduleField')
53
+ },
54
+ getPanels(state) {
55
+ return state.polygons.filter((p) => p.layer == 'panel')
56
+ },
57
+ getUserDeactivatedPanels(state) {
58
+ return state.polygons.filter((p) => p.layer == 'user_deactivated_panel')
59
+ },
60
+ getNodes2D(state) {
61
+ return generateNodes2D(state.polygons, state.constructionPolyline)
62
+ },
63
+ getNodes3D(state) {
64
+ return generateNodes3D(state.polygons)
65
+ },
66
+ getEdges2D(state) {
67
+ return generateEdges2D(state.polygons, state.constructionPolyline)
68
+ },
69
+ getEdges3D(state) {
70
+ return generateEdges3D(state.polygons)
71
+ },
72
+
73
+ getPolygons(state) {
74
+ return state.polygons
75
+ },
76
+
77
+ getMapConfig(state) {
78
+ return state.mapConfig
79
+ },
80
+
81
+ getGlobalProjectProperties(state) {
82
+ return state.globalProjectProperties
83
+ },
84
+
85
+ getBuildingLocation(state) {
86
+ return state.buildingLocation
87
+ },
88
+
89
+ getLayoutSettings(state) {
90
+ return state.layoutSettings
91
+ },
92
+ getGeometryEvents() {
93
+ return []
94
+ }
95
+ }
96
+
97
+ const mutations = {
98
+ mutate_map(state, value) {
99
+ state.map = value
100
+ },
101
+ mutate_selectedLayer(state, value) {
102
+ state.selectedLayer = value
103
+ },
104
+ mutate_layoutSettings(state, value) {
105
+ state.layoutSettings = value
106
+ },
107
+ mutate_selectedZoom(state, value) {
108
+ state.selectedZoom = value
109
+ },
110
+
111
+ mutate_mapConfig(state, value) {
112
+ state.mapConfig = value
113
+ },
114
+
115
+ mutate_globalProjectProperties(state, value) {
116
+ state.globalProjectProperties = value
117
+ },
118
+
119
+ mutate_buildingLocation(state, value) {
120
+ state.buildingLocation = value
121
+ },
122
+ mutate_module_texture_version_id(state,value){
123
+ state.module_texture_version_id=value
124
+ },
125
+ mutate_module_texture_version_id(state,value){
126
+ state.module_texture_version_id=value
127
+ },
128
+ mutate_selectedMapLayer(state,value){
129
+ state.selectedMapLayer=value
130
+ },
131
+ }
132
+
133
+ const actions = {
134
+ hydrateData
135
+ }
136
+
137
+ export default {
138
+ state,
139
+ getters,
140
+ mutations,
141
+ actions
142
+ }
package/src/style.css ADDED
@@ -0,0 +1,96 @@
1
+ :root {
2
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
3
+ font-size: 16px;
4
+ line-height: 24px;
5
+ font-weight: 400;
6
+
7
+ color-scheme: light dark;
8
+ color: rgba(255, 255, 255, 0.87);
9
+ background-color: #242424;
10
+
11
+ font-synthesis: none;
12
+ text-rendering: optimizeLegibility;
13
+ -webkit-font-smoothing: antialiased;
14
+ -moz-osx-font-smoothing: grayscale;
15
+ -webkit-text-size-adjust: 100%;
16
+ }
17
+
18
+ a {
19
+ font-weight: 500;
20
+ color: #646cff;
21
+ text-decoration: inherit;
22
+ }
23
+ a:hover {
24
+ color: #535bf2;
25
+ }
26
+
27
+ a {
28
+ font-weight: 500;
29
+ color: #646cff;
30
+ text-decoration: inherit;
31
+ }
32
+ a:hover {
33
+ color: #535bf2;
34
+ }
35
+
36
+ body {
37
+ margin: 0;
38
+ display: flex;
39
+ place-items: center;
40
+ min-width: 320px;
41
+ min-height: 100vh;
42
+ }
43
+
44
+ h1 {
45
+ font-size: 3.2em;
46
+ line-height: 1.1;
47
+ }
48
+
49
+ button {
50
+ border-radius: 8px;
51
+ border: 1px solid transparent;
52
+ padding: 0.6em 1.2em;
53
+ font-size: 1em;
54
+ font-weight: 500;
55
+ font-family: inherit;
56
+ background-color: #1a1a1a;
57
+ cursor: pointer;
58
+ transition: border-color 0.25s;
59
+ }
60
+ button:hover {
61
+ border-color: #646cff;
62
+ }
63
+ button:focus,
64
+ button:focus-visible {
65
+ outline: 4px auto -webkit-focus-ring-color;
66
+ }
67
+
68
+ .card {
69
+ padding: 2em;
70
+ }
71
+
72
+ #app {
73
+ max-width: 1280px;
74
+ margin: 0 auto;
75
+ padding: 2rem;
76
+ text-align: center;
77
+ }
78
+ #app2 {
79
+ max-width: 1280px;
80
+ margin: 0 auto;
81
+ padding: 2rem;
82
+ text-align: center;
83
+ }
84
+
85
+ @media (prefers-color-scheme: light) {
86
+ :root {
87
+ color: #213547;
88
+ background-color: #ffffff;
89
+ }
90
+ a:hover {
91
+ color: #747bff;
92
+ }
93
+ button {
94
+ background-color: #f9f9f9;
95
+ }
96
+ }