fl-web-component 0.1.0

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 (52) hide show
  1. package/README.md +24 -0
  2. package/dist/demo.html +10 -0
  3. package/dist/fl-web-component.common.js +316 -0
  4. package/dist/fl-web-component.common.js.map +1 -0
  5. package/dist/fl-web-component.css +1 -0
  6. package/dist/fl-web-component.umd.js +326 -0
  7. package/dist/fl-web-component.umd.js.map +1 -0
  8. package/dist/fl-web-component.umd.min.js +2 -0
  9. package/dist/fl-web-component.umd.min.js.map +1 -0
  10. package/package.json +47 -0
  11. package/packages/components/button/index.vue +22 -0
  12. package/packages/components/model/api/index.js +429 -0
  13. package/packages/components/model/api/mock/detecttree.js +58 -0
  14. package/packages/components/model/api/mock/getmodel-line.js +79336 -0
  15. package/packages/components/model/api/mock/init.js +1 -0
  16. package/packages/components/model/api/mock/pbstree.js +835 -0
  17. package/packages/components/model/api/mock/topology.json +3238 -0
  18. package/packages/components/model/components/TextOverTooltip/index.vue +84 -0
  19. package/packages/components/model/components/annotation-toolbar.vue +425 -0
  20. package/packages/components/model/components/check-proofing-model.vue +42 -0
  21. package/packages/components/model/components/clipping-type.vue +51 -0
  22. package/packages/components/model/components/com-dialogWrapper/Readme.md +53 -0
  23. package/packages/components/model/components/com-dialogWrapper/index.vue +117 -0
  24. package/packages/components/model/components/detect-panel.vue +327 -0
  25. package/packages/components/model/components/detect-tree.vue +460 -0
  26. package/packages/components/model/components/firstPer-panel.vue +111 -0
  27. package/packages/components/model/components/header-button.vue +546 -0
  28. package/packages/components/model/components/imageViewer/index.vue +127 -0
  29. package/packages/components/model/components/import-model.vue +127 -0
  30. package/packages/components/model/components/location-panel.vue +95 -0
  31. package/packages/components/model/components/measure-type.vue +59 -0
  32. package/packages/components/model/components/pbs-tree.vue +502 -0
  33. package/packages/components/model/components/proof-config.vue +80 -0
  34. package/packages/components/model/components/proof-for-pc.vue +123 -0
  35. package/packages/components/model/components/proof-history.vue +318 -0
  36. package/packages/components/model/components/proof-panel-detail.vue +567 -0
  37. package/packages/components/model/components/proof-panel.vue +770 -0
  38. package/packages/components/model/components/proof-project-user.vue +482 -0
  39. package/packages/components/model/components/proof-publish.vue +130 -0
  40. package/packages/components/model/components/proof-role.vue +535 -0
  41. package/packages/components/model/components/props-panel.vue +249 -0
  42. package/packages/components/model/index.vue +3413 -0
  43. package/packages/components/model/readme.md +31 -0
  44. package/packages/components/model/utils/annotation-tool.js +340 -0
  45. package/packages/components/model/utils/cursor.js +18 -0
  46. package/packages/components/model/utils/detect-v1.js +341 -0
  47. package/packages/components/model/utils/index.js +48 -0
  48. package/packages/components/model/utils/threejs/measure-angle.js +258 -0
  49. package/packages/components/model/utils/threejs/measure-area.js +269 -0
  50. package/packages/components/model/utils/threejs/measure-distance.js +207 -0
  51. package/packages/components/model/utils/threejs/measure-volume.js +94 -0
  52. package/packages/index.js +24 -0
@@ -0,0 +1,269 @@
1
+ import * as THREE from 'three'
2
+ import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer'
3
+ var _this = null
4
+ var MeasureArea = function(renderer, scene, camera, width, height) {
5
+ this.renderer = renderer
6
+ this.scene = scene
7
+ this.camera = camera
8
+ this.pointArray = [] // 保存当前操作所添加的点
9
+ this.raycaster = new THREE.Raycaster()
10
+ this.points = [] // 保存页面中所添加的点
11
+ this.polyline = [] //保存页面中所添加的直线
12
+ this.labels = [] // 保存页面中所添加的文本
13
+ this.tempPoints = undefined
14
+ this.tempLine = undefined
15
+ this.tempLabel = undefined
16
+ this.tipsLabel = undefined
17
+ this.isCompleted = false
18
+ this.timer = null
19
+ this.polygonMesh = undefined
20
+ this.polygons = []
21
+ this.width = width
22
+ this.height = height
23
+ }
24
+
25
+ MeasureArea.prototype = {
26
+ start() {
27
+ _this = this
28
+ this.renderer.domElement.style.cursor = 'crosshair'
29
+ this.renderer.domElement.addEventListener('click', this.click, false)
30
+ this.renderer.domElement.addEventListener('mousemove', this.mousemove, false)
31
+ this.renderer.domElement.addEventListener('contextmenu', this.rightClick, false)
32
+ },
33
+ updateParams(width, height) {
34
+ this.camera.aspect = width / height
35
+ this.camera.updateProjectionMatrix()
36
+ this.renderer.setSize(width, height, true)
37
+ this.width = width
38
+ this.height = height
39
+ },
40
+ getPosition(e) {
41
+ const mouse = new THREE.Vector2()
42
+ mouse.x = (e.clientX / _this.width) * 2 - 1
43
+ mouse.y = -(e.clientY / _this.height) * 2 + 1
44
+ _this.raycaster.setFromCamera(mouse, _this.camera)
45
+ let intersects =_this.raycaster.intersectObjects(_this.scene.children, true)
46
+ if(intersects.length > 0) {
47
+ return intersects[0].point
48
+ }
49
+ return null
50
+ },
51
+ createLine(p1, p2, config = {color:0xff0000}) {
52
+ const lineMaterial = new THREE.LineBasicMaterial({ color: config.color, linewidth: 20 })
53
+ const lineGeometry = new THREE.BufferGeometry().setFromPoints([p1, p2])
54
+ const line = new THREE.Line(lineGeometry, lineMaterial)
55
+ line.frustumCulled = false;
56
+
57
+ return line
58
+ },
59
+ createLabel(name, text, position) {
60
+ const div = document.createElement('div')
61
+ div.className = name
62
+ div.textContent = text
63
+ const divLabel = new CSS2DObject(div)
64
+ divLabel.position.set(position.x, position.y, position.z)
65
+ return divLabel
66
+ },
67
+ mousemove(e) {
68
+ if (_this.isCompleted || _this.pointArray.length === 0) return
69
+ const point =_this.getPosition(e)
70
+ if (point) {
71
+ _this.pointArray.length === 1 ? _this.pointArray.push(point) : _this.pointArray.splice(_this.pointArray.length - 1, 1, point)
72
+ const length = _this.pointArray.length
73
+ if (_this.tempPoints) {
74
+ _this.tempPoints.position.set(point.x, point.y, point.z)
75
+ } else {
76
+ const geom = _this.createLabel('circle-tag', '', point)
77
+ _this.tempPoints = geom
78
+ _this.points.push(geom)
79
+ _this.scene.add(geom)
80
+ }
81
+ const p1 = _this.pointArray[length - 2]
82
+ const p2 = _this.pointArray[length - 1]
83
+ if (_this.tempLine) {
84
+ _this.tempLine.geometry.setFromPoints([p1, p2])
85
+ } else {
86
+ _this.tempLine = _this.createLine(p1, p2)
87
+ _this.polyline.push(_this.tempLine)
88
+ _this.scene.add(_this.tempLine)
89
+ }
90
+ if (_this.pointArray.length > 2) {
91
+ const area = _this.calculateArea(_this.pointArray)
92
+ _this.createPolygon(_this.pointArray)
93
+ if (_this.tempLabel) {
94
+ _this.polygonMesh.geometry.computeBoundingSphere()
95
+ _this.tempLabel.element.textContent = _this.numberToString(area) // + '㎡'
96
+ _this.tempLabel.position.set(_this.polygonMesh.geometry.boundingSphere.center.x, _this.polygonMesh.geometry.boundingSphere.center.y, _this.polygonMesh.geometry.boundingSphere.center.z)
97
+ } else {
98
+ _this.polygonMesh.geometry.computeBoundingSphere()
99
+ console.log(_this.polygonMesh.geometry)
100
+ _this.tempLabel = _this.createLabel('measure-label', area, _this.polygonMesh.geometry.boundingSphere.center)
101
+ _this.labels.push(_this.tempLabel)
102
+ _this.scene.add(_this.tempLabel)
103
+ }
104
+ }
105
+ if (_this.tipsLabel) {
106
+ _this.tipsLabel.position.set(point.x + 0.1, point.y, point.z + 0.05)
107
+ }
108
+ }
109
+ },
110
+ createTipsLabel(label, position) {
111
+ const div = document.createElement('div')
112
+ div.className = 'tips-label'
113
+ div.textContent = label
114
+ div.style = 'top: -50px'
115
+ const tipsLabel = new CSS2DObject(div)
116
+ tipsLabel.position.set(position.x + 0.1, position.y, position.z + 0.05)
117
+ return tipsLabel
118
+ },
119
+ click(e) {
120
+ if (_this.isCompleted) {
121
+ _this.renderer.domElement.addEventListener('mousemove', _this.mousemove)
122
+ }
123
+ clearTimeout(_this.timer)
124
+ _this.timer = setTimeout(() => {
125
+ _this.isCompleted = false
126
+ const point = _this.getPosition(e)
127
+ if (point) {
128
+ if(_this.tipsLabel) {
129
+ _this.tipsLabel.position.set(point.x + 0.01, point.y, point.z + 0.05)
130
+ } else {
131
+ _this.tipsLabel = _this.createTipsLabel('左击绘制右击结束', point)
132
+ _this.scene.add(_this.tipsLabel)
133
+ }
134
+ if (_this.tempPoints) {
135
+ _this.tempPoints.position.set(point.x, point.y, point.z)
136
+ _this.tempPoints = undefined
137
+ } else {
138
+ const geom = _this.createLabel('circle-tag', '', point)
139
+ _this.points.push(geom)
140
+ _this.scene.add(geom)
141
+ }
142
+ _this.tempLine = undefined
143
+ _this.pointArray.push(point)
144
+ }
145
+ }, 100)
146
+
147
+ },
148
+ rightClick (e) {
149
+ if(_this.tipsLabel) {
150
+ _this.scene.remove(_this.tipsLabel)
151
+ _this.tipsLabel = undefined
152
+ }
153
+ clearTimeout(_this.timer)
154
+ const point = _this.getPosition(e)
155
+ _this.pointArray.pop();
156
+ // this.remove(_this.points.pop());
157
+
158
+ // if (point) {
159
+ if (_this.pointArray.length == 2) {
160
+ _this.scene.remove(_this.points[_this.points.length-1])
161
+ }
162
+ if (_this.pointArray.length > 2) {
163
+ const area = _this.calculateArea(_this.pointArray)
164
+ _this.createPolygon(_this.pointArray)
165
+
166
+ if(_this.tempLabel){
167
+ _this.polygonMesh.geometry.computeBoundingSphere()
168
+ _this.tempLabel.element.textContent = _this.numberToString(area) // + '㎡'
169
+ }
170
+ }
171
+ _this.scene.remove(_this.tempPoints)
172
+ _this.scene.remove(_this.tempLine)
173
+ // _this.scene.remove(_this.tempLabel)
174
+
175
+ _this.isCompleted = true
176
+ if (_this.tempPoints) {
177
+ _this.tempPoints.position.set(point.x, point.y, point.z)
178
+ _this.tempPoints = undefined
179
+ }
180
+ _this.tempLine = undefined
181
+ _this.tempLabel = undefined
182
+ _this.polygonMesh = undefined
183
+ _this.pointArray.splice(0)
184
+ _this.renderer.domElement.removeEventListener('mousemove', _this.mousemove)
185
+ // }
186
+ },
187
+ close() {
188
+ this.renderer.domElement.removeEventListener('mousemove', this.mousemove)
189
+ this.renderer.domElement.removeEventListener('click',this.click)
190
+ this.renderer.domElement.removeEventListener('contextmenu',this.rightClick)
191
+ this.remove(this.points)
192
+ this.remove(this.polyline)
193
+ this.remove(this.labels)
194
+ this.remove(this.polygons)
195
+ this.pointArray.splice(0)
196
+ this.points.splice(0)
197
+ this.polyline.splice(0)
198
+ this.labels.splice(0)
199
+ this.tempPoints = undefined
200
+ this.tempLabel = undefined
201
+ this.tempLine = undefined
202
+ this.scene.remove(this.tipsLabel)
203
+ this.tipsLabel = undefined
204
+ this.renderer.domElement.style.cursor = 'pointer'
205
+ },
206
+ remove(array) {
207
+ for (let index = 0; index < array.length; index++) {
208
+ const element = array[index]
209
+ if (element.geometry) {
210
+ element.geometry.dispose()
211
+ }
212
+ this.scene.remove(element)
213
+ }
214
+ },
215
+ calculateArea(points) {
216
+ let area = 0
217
+ for (let i = 0, j = 1, k = 2; k < points.length; j++, k++) {
218
+ const a = points[i].distanceTo(points[j])
219
+ const b = points[j].distanceTo(points[k])
220
+ const c = points[k].distanceTo(points[i])
221
+ const p = (a + b + c) / 2
222
+ area += Math.sqrt(p * (p - a) * (p - b) * (p - c))
223
+ }
224
+ return area
225
+ },
226
+ numberToString(num) {
227
+ if (num < 0.0001) {
228
+ return num.toString()
229
+ }
230
+ let fractionDigits = 2
231
+ if (num < 0.01) {
232
+ fractionDigits = 4
233
+ } else if (num < 0.1) {
234
+ fractionDigits = 3
235
+ }
236
+ return num.toFixed(fractionDigits)
237
+ },
238
+ createPolygon(points) {
239
+ const length = points.length
240
+ const faces = []
241
+ for (let i = 0; i < length - 2; i++) {
242
+ faces.push(points[0].x, points[0].y, points[0].z)
243
+ faces.push(points[i+1].x, points[i+1].y, points[i+1].z)
244
+ faces.push(points[i+2].x, points[i+2].y, points[i+2].z)
245
+ }
246
+ if (faces.length > 3) {
247
+ if (_this.polygonMesh) {
248
+ _this.polygonMesh.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(faces), 3 ))
249
+ } else {
250
+ const geom = new THREE.BufferGeometry()
251
+ geom.setAttribute('position', new THREE.BufferAttribute(new Float32Array(faces), 3 ))
252
+ const material = new THREE.MeshBasicMaterial({
253
+ color: 0xffffff,
254
+ transparent: true,
255
+ opacity: 0.5,
256
+ side: THREE.DoubleSide
257
+ })
258
+ const mesh = new THREE.Mesh(geom, material)
259
+ mesh.name = 'polygonMesh'
260
+ _this.polygonMesh = mesh
261
+ _this.scene.add(mesh)
262
+ _this.polygons.push(mesh)
263
+ }
264
+ }
265
+ }
266
+ }
267
+ export default {
268
+ MeasureArea
269
+ }
@@ -0,0 +1,207 @@
1
+ import * as THREE from 'three'
2
+ import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer'
3
+ var _this = null
4
+ var MeasureDistance = function(renderer, scene, camera, width, height) {
5
+ this.renderer = renderer
6
+ this.scene = scene
7
+ this.camera = camera
8
+ this.pointArray = [] // 保存当前操作所添加的点
9
+ this.raycaster = new THREE.Raycaster()
10
+ this.points = [] // 保存页面中所添加的点
11
+ this.polyline = [] //保存页面中所添加的直线
12
+ this.labels = [] // 保存页面中所添加的文本
13
+ this.tempPoints = undefined
14
+ this.tempLine = undefined
15
+ this.tempLabel = undefined
16
+ this.tipsLabel = undefined
17
+ this.isCompleted = false
18
+ this.timer = null
19
+ this.width = width
20
+ this.height = height
21
+ }
22
+
23
+ MeasureDistance.prototype = {
24
+ start() {
25
+ _this = this
26
+ this.renderer.domElement.style.cursor = 'crosshair'
27
+ this.renderer.domElement.addEventListener('click', this.click, false)
28
+ this.renderer.domElement.addEventListener('mousemove', this.mousemove, false)
29
+ this.renderer.domElement.addEventListener('contextmenu', this.rightClick, false)
30
+ },
31
+ updateParams(width, height) {
32
+ this.camera.aspect = width / height
33
+ this.camera.updateProjectionMatrix()
34
+ this.renderer.setSize(width, height, true)
35
+ this.width = width
36
+ this.height = height
37
+ },
38
+ getPosition(e) {
39
+ const mouse = new THREE.Vector2()
40
+ mouse.x = (e.clientX / _this.width) * 2 - 1
41
+ mouse.y = -(e.clientY / _this.height) * 2 + 1
42
+ _this.raycaster.setFromCamera(mouse, this.camera)
43
+ let intersects = _this.raycaster.intersectObjects(_this.scene.children, true)
44
+ if(intersects.length > 0) {
45
+ return intersects[0].point
46
+ }
47
+ return null
48
+ },
49
+ createLine(p1, p2, config = {color: 0xff0000}) {
50
+ const lineMaterial = new THREE.LineBasicMaterial({ color: config.color, linewidth: 15 })
51
+ const lineGeometry = new THREE.BufferGeometry().setFromPoints([p1, p2])
52
+ const line = new THREE.Line(lineGeometry, lineMaterial)
53
+ line.frustumCulled = false;
54
+ return line
55
+ },
56
+ createLabel(name, text, position) {
57
+ const div = document.createElement('div')
58
+ div.className = name
59
+ div.textContent = text
60
+ const divLabel = new CSS2DObject(div)
61
+ divLabel.position.set(position.x, position.y, position.z)
62
+ return divLabel
63
+ },
64
+ mousemove(e) {
65
+ if (_this.isCompleted || _this.pointArray.length === 0) return
66
+ const point = _this.getPosition(e)
67
+ if (point) {
68
+ _this.pointArray.length === 1 ? _this.pointArray.push(point) : _this.pointArray.splice(_this.pointArray.length - 1, 1, point)
69
+ const length = _this.pointArray.length
70
+ if (_this.tempPoints) {
71
+ _this.tempPoints.position.set(point.x, point.y, point.z)
72
+ } else {
73
+ const geom = _this.createLabel('circle-tag', '', point)
74
+ _this.tempPoints = geom
75
+ _this.points.push(geom)
76
+ _this.scene.add(geom)
77
+ }
78
+ const p1 = _this.pointArray[length - 2]
79
+ const p2 = _this.pointArray[length - 1]
80
+ const dist = p1.distanceTo(p2)
81
+ const label = `${_this.numberToString(dist)}`
82
+ const position = new THREE.Vector3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2)
83
+ if (_this.tempLine) {
84
+ _this.tempLine.geometry.setFromPoints([p1, p2])
85
+ _this.tempLabel.element.textContent = label
86
+ _this.tempLabel.position.set(position.x, position.y, position.z)
87
+ } else {
88
+ _this.tempLine = _this.createLine(p1, p2)
89
+ _this.tempLabel = _this.createLabel('measure-label', label, position)
90
+ _this.polyline.push(_this.tempLine)
91
+ _this.labels.push(_this.tempLabel)
92
+ _this.scene.add(_this.tempLine)
93
+ _this.scene.add(_this.tempLabel)
94
+ }
95
+ if (_this.tipsLabel) {
96
+ _this.tipsLabel.position.set(point.x + 0.1, point.y, point.z + 0.05)
97
+ }
98
+ }
99
+ },
100
+ createTipsLabel(label, position) {
101
+ const div = document.createElement('div')
102
+ div.className = 'tips-label'
103
+ div.textContent = label
104
+ div.style = 'top: -50px'
105
+ const tipsLabel = new CSS2DObject(div)
106
+ tipsLabel.position.set(position.x + 0.1, position.y, position.z + 0.05)
107
+ return tipsLabel
108
+ },
109
+ click(e) {
110
+ if (_this.isCompleted) {
111
+ _this.renderer.domElement.addEventListener('mousemove', _this.mousemove)
112
+ }
113
+ clearTimeout(_this.timer)
114
+ _this.timer = setTimeout(() => {
115
+ _this.isCompleted = false
116
+ const point = _this.getPosition(e)
117
+ if (point) {
118
+ if(_this.tipsLabel) {
119
+ _this.tipsLabel.position.set(point.x + 0.1, point.y, point.z + 0.05)
120
+ } else {
121
+ _this.tipsLabel = _this.createTipsLabel('左击绘制右击结束', point)
122
+ _this.scene.add(_this.tipsLabel)
123
+ }
124
+ if (_this.tempPoints) {
125
+ _this.tempPoints.position.set(point.x, point.y, point.z)
126
+ _this.tempPoints = undefined
127
+ } else {
128
+ const geom = _this.createLabel('circle-tag', '', point)
129
+ _this.points.push(geom)
130
+ _this.scene.add(geom)
131
+ }
132
+ _this.tempLine = undefined
133
+ _this.tempLabel = undefined
134
+ _this.pointArray.push(point)
135
+ }
136
+ })
137
+ },
138
+ rightClick(e) {
139
+ if(_this.tipsLabel) {
140
+ _this.scene.remove(_this.tipsLabel)
141
+ _this.tipsLabel = undefined
142
+ }
143
+ clearTimeout(_this.timer)
144
+ // const point = _this.getPosition(e)
145
+ // this.remove(_this.points.pop());
146
+
147
+ // if (point) {
148
+ if (_this.pointArray.length == 2) {
149
+ _this.scene.remove(_this.points[_this.points.length-1])
150
+ _this.scene.remove(_this.points[_this.points.length-2])
151
+ }
152
+
153
+ _this.scene.remove(_this.tempPoints)
154
+ _this.scene.remove(_this.tempLine)
155
+ _this.scene.remove(_this.tempLabel)
156
+
157
+ _this.isCompleted = true
158
+ _this.tempPoints = undefined
159
+ _this.tempLine = undefined
160
+ _this.tempLabel = undefined
161
+ _this.pointArray.splice(0)
162
+ _this.renderer.domElement.removeEventListener('mousemove', _this.mousemove)
163
+ // }
164
+ },
165
+ close() {
166
+ this.renderer.domElement.removeEventListener('mousemove', this.mousemove)
167
+ this.renderer.domElement.removeEventListener('click', this.click)
168
+ this.renderer.domElement.removeEventListener('contextmenu', this.rightClick)
169
+ this.remove(this.points)
170
+ this.remove(this.polyline)
171
+ this.remove(this.labels)
172
+ this.pointArray.splice(0)
173
+ this.points.splice(0)
174
+ this.polyline.splice(0)
175
+ this.labels.splice(0)
176
+ this.tempPoints = undefined
177
+ this.tempLabel = undefined
178
+ this.tempLine = undefined
179
+ this.scene.remove(this.tipsLabel)
180
+ this.tipsLabel = undefined
181
+ this.renderer.domElement.style.cursor = 'pointer'
182
+ },
183
+ remove(array) {
184
+ for (let index = 0; index < array.length; index++) {
185
+ const element = array[index]
186
+ if (element.geometry) {
187
+ element.geometry.dispose()
188
+ }
189
+ this.scene.remove(element)
190
+ }
191
+ },
192
+ numberToString(num) {
193
+ if (num < 0.0001) {
194
+ return num.toString()
195
+ }
196
+ let fractionDigits = 2
197
+ if (num < 0.01) {
198
+ fractionDigits = 4
199
+ } else if (num < 0.1) {
200
+ fractionDigits = 3
201
+ }
202
+ return num.toFixed(fractionDigits)
203
+ }
204
+ }
205
+ export default {
206
+ MeasureDistance
207
+ }
@@ -0,0 +1,94 @@
1
+ import * as THREE from 'three'
2
+ import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer'
3
+ var _this = null
4
+ var MeasureVolume = function(renderer, scene, camera, width, height) {
5
+ this.renderer = renderer
6
+ this.scene = scene
7
+ this.camera = camera
8
+ this.pointArray = [] // 保存当前操作所添加的点
9
+ this.raycaster = new THREE.Raycaster()
10
+ this.vMeter = 0.3047999995367
11
+ this.tempLabel = undefined
12
+ this.width = width
13
+ this.height = height
14
+ }
15
+
16
+ MeasureVolume.prototype = {
17
+ start() {
18
+ _this = this
19
+ this.renderer.domElement.addEventListener('click', this.click, false)
20
+ },
21
+ updateParams(width, height) {
22
+ this.camera.aspect = width / height
23
+ this.camera.updateProjectionMatrix()
24
+ this.renderer.setSize(width, height, true)
25
+ this.width = width
26
+ this.height = height
27
+ },
28
+ getPosition(e) {
29
+ const mouse = new THREE.Vector2()
30
+ mouse.x = (e.clientX / _this.width) * 2 - 1
31
+ mouse.y = -(e.clientY / _this.height) * 2 + 1
32
+ _this.raycaster.setFromCamera(mouse, this.camera)
33
+ let intersects = _this.raycaster.intersectObjects(_this.scene.children, true)
34
+ if(intersects.length > 0) {
35
+ return intersects[0]
36
+ }
37
+ return null
38
+ },
39
+ createLabel(label, position) {
40
+ const div = document.createElement('div')
41
+ div.className = 'measure-label'
42
+ div.textContent = label
43
+ const divLabel = new CSS2DObject(div)
44
+ divLabel.position.set(position.x, position.y, position.z)
45
+ return divLabel
46
+ },
47
+ click(e) {
48
+ const checkObj = _this.getPosition(e)
49
+ const obj = checkObj.object
50
+ if (!obj.geometry.boundingBox) {
51
+ obj.geometry.computeBoundingBox()
52
+ }
53
+ const width = Math.abs(obj.geometry.boundingBox.max.x - obj.geometry.boundingBox.min.x) * obj.scale.x
54
+ const length = Math.abs(obj.geometry.boundingBox.max.y - obj.geometry.boundingBox.min.y) * obj.scale.y
55
+ const height = Math.abs(obj.geometry.boundingBox.max.z - obj.geometry.boundingBox.min.z) * obj.scale.z
56
+ const vol = (width * length * height) * _this.vMeter * _this.vMeter * _this.vMeter
57
+ const text = _this.numberToString(vol)
58
+ console.log(text)
59
+ if (_this.tempLabel) {
60
+ _this.tempLabel.element.textContent = text + 'm³'
61
+ _this.tempLabel.position.set(position.x, position.y, position.z)
62
+ } else {
63
+ _this.tempLabel = _this.createLabel(text + 'm³', obj.point)
64
+ _this.scene.add(_this.tempLabel)
65
+ }
66
+ },
67
+ close() {
68
+ this.renderer.domElement.removeEventListener('click', this.click)
69
+ },
70
+ remove(array) {
71
+ for (let index = 0; index < array.length; index++) {
72
+ const element = array[index]
73
+ if (element.geometry) {
74
+ element.geometry.dispose()
75
+ }
76
+ this.scene.remove(element)
77
+ }
78
+ },
79
+ numberToString(num) {
80
+ if (num < 0.0001) {
81
+ return num.toString()
82
+ }
83
+ let fractionDigits = 2
84
+ if (num < 0.01) {
85
+ fractionDigits = 4
86
+ } else if (num < 0.1) {
87
+ fractionDigits = 3
88
+ }
89
+ return num.toFixed(fractionDigits)
90
+ }
91
+ }
92
+ export default {
93
+ MeasureVolume
94
+ }
@@ -0,0 +1,24 @@
1
+ // import GraphicModel from './components/model/index.vue';
2
+ import MyButton from './components/button/index.vue';
3
+
4
+ const components = [
5
+ // GraphicModel,
6
+ MyButton,
7
+ ];
8
+
9
+ const install = (Vue) => {
10
+ components.forEach(component => {
11
+ Vue.component(component.name, component);
12
+ });
13
+ };
14
+
15
+ // 支持浏览器环境直接引入
16
+ if (typeof window !== 'undefined' && window.Vue) {
17
+ install(window.Vue);
18
+ }
19
+
20
+ export default {
21
+ install,
22
+ // GraphicModel,
23
+ MyButton,
24
+ };