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,460 @@
1
+ <template>
2
+ <div class="tree-box-item-card">
3
+ <!-- <el-input
4
+ placeholder="请输入位号"
5
+ v-model="filterVal"
6
+ clearable
7
+ maxlength="30"
8
+ class="input-with-pbs"
9
+ @clear="getTree"
10
+ @keyup.enter.native="queryPbs"
11
+ >
12
+ <i class="el-icon-search el-input__icon search-icon" slot="suffix" @click="queryPbs"> </i>
13
+ </el-input> -->
14
+
15
+ <!-- :render-content="renderContent" -->
16
+ <el-scrollbar>
17
+ <!-- @node-click="handleNodeClick" -->
18
+ <!-- @check="handleCheckChange" -->
19
+
20
+ <el-tree
21
+ ref="tree"
22
+ :data="formatTreeData"
23
+ node-key="id"
24
+ :expand-on-click-node="false"
25
+ :current-node-key="currentKey"
26
+ :props="defaultProps"
27
+ :highlight-current="true"
28
+ :default-expanded-keys="expanded"
29
+ empty-text="暂无数据"
30
+ >
31
+ <span class="custom-tree-node" slot-scope="{ node, data }">
32
+ <span class="node-root" v-if="data.id == -1" :title="node.label">{{
33
+ node.label
34
+ }}</span>
35
+ <span
36
+ class="node-child"
37
+ v-else-if="node.isLeaf && data.id != -1"
38
+ :title="node.label"
39
+ >碰撞点位:{{ node.label }}</span
40
+ >
41
+ <span class="node-parent" v-else :title="node.label"
42
+ >本体:{{ node.label }}</span
43
+ >
44
+
45
+ <span v-if="data.id != -1">
46
+ <el-button
47
+ title="定位"
48
+ icon="el-icon-location-outline"
49
+ type="text"
50
+ @click="() => handleNodeClick(node, data, 'locate')"
51
+ >
52
+ </el-button>
53
+ <el-button
54
+ title="高亮"
55
+ style="margin: 0 5px"
56
+ icon="el-icon-s-opportunity"
57
+ type="text"
58
+ @click="() => handleNodeClick(node, data, 'highlight')"
59
+ >
60
+ </el-button>
61
+ </span>
62
+ </span>
63
+ </el-tree>
64
+ </el-scrollbar>
65
+ </div>
66
+ </template>
67
+ <script>
68
+ import { proofInit, getPbsTree } from '../api/index';
69
+ import { loading, loadingClose } from '../utils/index';
70
+
71
+ var projectId = null;
72
+ var timeout = null; //防抖时间戳
73
+ var checkedArr = [];
74
+ const proofInfo = {
75
+ // projectId: 566,
76
+ // stageId: 2,
77
+ projectId: 451,
78
+ stageId: 1,
79
+ };
80
+ let selectedIds = [];
81
+
82
+ export default {
83
+ name: 'DetectTree',
84
+ props: {
85
+ folderId: {
86
+ type: String,
87
+ default() {
88
+ return '';
89
+ },
90
+ },
91
+ projectId: {
92
+ type: String,
93
+ default() {
94
+ return '';
95
+ },
96
+ },
97
+ version: {
98
+ type: String,
99
+ default: '',
100
+ },
101
+ flag: {
102
+ type: Boolean,
103
+ default() {
104
+ return false;
105
+ },
106
+ },
107
+ pbsVersion: {
108
+ type: Object,
109
+ default() {
110
+ return {};
111
+ },
112
+ },
113
+ treeData: {
114
+ type: Array,
115
+ default() {
116
+ return [];
117
+ },
118
+ },
119
+ },
120
+ data() {
121
+ return {
122
+ defaultProps: {
123
+ label: 'category',
124
+ children: 'detect',
125
+ // isLeaf: (data) => {
126
+ // return !data.leaf
127
+ // },
128
+ // disabled: (data) => {
129
+ // return data.type !== 0;
130
+ // }
131
+ },
132
+ currentKey: null,
133
+ expanded: [],
134
+ checkedArr: [],
135
+ node: '',
136
+ filterVal: '',
137
+ };
138
+ },
139
+ computed: {
140
+ formatTreeData() {
141
+ // let nodeCount = 0;
142
+ // this.treeData.forEach((item) => {
143
+ // nodeCount += item.detect.length;
144
+ // });
145
+
146
+ const root = [
147
+ {
148
+ category: `碰撞检查树(总数:${this.treeData.length})`,
149
+ detect: this.treeData,
150
+ id: -1,
151
+ objectid: '',
152
+ },
153
+ ];
154
+ return root;
155
+ },
156
+ },
157
+ watch: {
158
+ // folderId(val) {
159
+ // if (val) this.getTree()
160
+ // },
161
+ // projectId(val) {
162
+ // if (val) this.getTree()
163
+ // },
164
+ // flag(val) {
165
+ // if (val) this.getTree()
166
+ // },
167
+ },
168
+ created() {
169
+ // proofInit(proofInfo).then(res => {
170
+ // this.getTree()
171
+ // }).catch()
172
+ // console.log(this.pbsVersion)
173
+ },
174
+ methods: {
175
+ expandNodes(data) {
176
+ data.forEach((item) => {
177
+ this.expanded.push(item.nodeId);
178
+ if (item.children) {
179
+ item.children.forEach((childrenItem) => {
180
+ this.expanded.push(childrenItem.nodeId);
181
+ this.expandNodes(childrenItem.children);
182
+ });
183
+ }
184
+ });
185
+ return this.expanded;
186
+ },
187
+ formatTree(data) {
188
+ if (data.type !== 0) {
189
+ data.disabled = true;
190
+ } else {
191
+ data.disabled = false;
192
+ }
193
+ if (data.child) {
194
+ data.child.forEach((childrenItem) => {
195
+ this.formatTree(childrenItem);
196
+ });
197
+ }
198
+ return data;
199
+ },
200
+ // 获取pbs节点
201
+ getPbsTree(params) {
202
+ loading('加载中...');
203
+
204
+ getPbsTree(params)
205
+ .then((res) => {
206
+ // res = this.formatTree(res)
207
+
208
+ if (res) {
209
+ this.$set(this, 'treeData', [res]);
210
+ // this.$set(this, 'currentKey', [res])
211
+ // this.$nextTick(() => {
212
+ // this.scrollTo('2.441.2-MODELELEM-o.157.f.66dd4337-157')
213
+ // this.$refs.tree.setChecked(, true, true)
214
+ // this.handleCheckChange(this.$refs.tree.getNode(res.objectId).data)
215
+
216
+ // })
217
+ }
218
+ })
219
+ .catch(() => {
220
+ console.log('error');
221
+ this.treeData.splice(0);
222
+ })
223
+ .finally(() => {
224
+ loadingClose();
225
+ });
226
+ },
227
+ handleNodeClick(node, data, type) {
228
+ this.node = data;
229
+ type === 'locate' && this.$emit('locate', node, data);
230
+ type === 'highlight' && this.$emit('highlight', node, data);
231
+
232
+ // if (data.nodeType === 'Pbs') {
233
+ // 这个有待考究 需不需要传版本数据 data里面没有版本数据的字段
234
+ // this.getModelIdsByNodeIds(projectId, data, 'PbsClick')
235
+ // }
236
+ },
237
+ setChecked(entityId) {
238
+ modelApi
239
+ .PbsInfo(entityId, projectId)
240
+ .then((res) => {})
241
+ .catch((err) => {
242
+ this.$set(this, 'currentKey', '');
243
+ this.$refs.tree.setCurrentKey(null);
244
+ // this.$message({ type: 'error', message: err.msg })
245
+ });
246
+ },
247
+ // 选中节点
248
+ scrollTo(nodeId) {
249
+ this.$refs.tree.setCurrentKey(nodeId);
250
+ if (nodeId) {
251
+ this.expanded.push(nodeId);
252
+ this.$set(this, 'currentKey', nodeId);
253
+ this.$nextTick(() => {
254
+ const ele = document.querySelector('.is-current');
255
+ setTimeout(() => {
256
+ if (ele) {
257
+ ele.scrollIntoView({
258
+ block: 'center',
259
+ behavior: 'smooth',
260
+ });
261
+ }
262
+ }, 400);
263
+ });
264
+ } else {
265
+ this.$message({
266
+ type: 'warning',
267
+ message: '未关联Pbs节点',
268
+ });
269
+ }
270
+ },
271
+ //获取复选框选中得到的数据
272
+ handleCheckChange(data, node) {
273
+ // type 为0的是组节点 加载模型 10是模型 (定位) 14是专业
274
+ console.log(data, node);
275
+ const tree = this.$refs.tree;
276
+ console.log(tree.getNode(data));
277
+ const currentNode = tree.getNode(data);
278
+ const nodeData = currentNode.data;
279
+ if (currentNode.checked) {
280
+ this.selectAllChildren([nodeData]);
281
+ } else {
282
+ this.invertChildrenSelection([nodeData]);
283
+ }
284
+ // selectedIds = ['100']
285
+ console.log(selectedIds);
286
+ tree.setCheckedKeys(selectedIds);
287
+
288
+ if (data.type === 0) {
289
+ this.getModelIdsByNodeIds(projectId, selectedIds, 'checkChange');
290
+ }
291
+ // clearTimeout(timeout)
292
+ // // 过滤一下数据
293
+ // const checkedKeys = tree.getCheckedKeys();
294
+ // console.log(checkedKeys)
295
+ // // this.filterCheckArr(data)
296
+ // timeout = setTimeout(() => {
297
+ // this.getModelIdsByNodeIds(projectId, checkedKeys, 'checkChange')
298
+ // checkedKeys.splice(0)
299
+ // }, 500)
300
+ },
301
+ filterCheckArr(data) {
302
+ if (data.children.length === 0) {
303
+ checkedArr.push({
304
+ folderId: data.nodeFolderId,
305
+ nodeId: data.nodeId,
306
+ version: this.pbsVersion[data.nodeFolderId],
307
+ });
308
+ } else {
309
+ for (let index = 0; index < data.children.length; index++) {
310
+ this.filterCheckArr(data.children[index]);
311
+ }
312
+ }
313
+ },
314
+ // 获取当前选中的节点中所对应的模型信息集合
315
+ getModelIdsByNodeIds(projectId, nodes, type) {
316
+ // this.$emit('checkChange', nodes)
317
+ type === 'checkChange' && this.$emit('checkChange', nodes);
318
+ type === 'PbsClick' && this.$emit('pbsNodeClick', nodes);
319
+
320
+ // PbsApi.getModelIdsByNodeIds(projectId, parmas).then(res => {
321
+ // // type === 'checkChange' && this.$emit('checkChange', this.formatterMsg(res))
322
+ // // type === 'PbsClick' && this.$emit('PbsNodeClick', res, this.node)
323
+ // this.$emit('PbsNodeClick', res, this.node)
324
+ // }).catch((err) => {
325
+ // this.$message({
326
+ // type: 'warning',
327
+ // message: err.msg
328
+ // })
329
+ // })
330
+ },
331
+ // 整合数据
332
+ formatterMsg(data) {
333
+ //整合数据以对象形式传递,{key:[]},key为titleName,[]是batchId去重后组成的数组
334
+ const batchIdObj = {};
335
+ for (let i = 0; i < data.length; i++) {
336
+ if (data[i].batchIds) {
337
+ let batchIds = JSON.parse(data[i].batchIds);
338
+ for (let index = 0; index < batchIds.length; index++) {
339
+ const element = batchIds[index];
340
+ let modelPiece = element.titleName;
341
+ if (Object.keys(batchIdObj).includes(modelPiece)) {
342
+ !batchIdObj[modelPiece].batchIds.find(
343
+ (item) => item === element.batchId
344
+ ) && batchIdObj[modelPiece].batchIds.push(element.batchId);
345
+ } else {
346
+ batchIdObj[modelPiece] = {
347
+ folderId: '',
348
+ batchIds: [],
349
+ };
350
+ if (
351
+ !batchIdObj[modelPiece].batchIds.find(
352
+ (item) => item === element.batchId
353
+ )
354
+ ) {
355
+ batchIdObj[modelPiece].batchIds.push(element.batchId);
356
+ batchIdObj[modelPiece].folderId = data[i].groupId;
357
+ }
358
+ }
359
+ }
360
+ }
361
+ }
362
+ return batchIdObj;
363
+ },
364
+ // 判断节点是否拥有子节点
365
+ hasChildren(data) {
366
+ return data.hasOwnProperty('child') && data.child.length > 0;
367
+ },
368
+ // 选中当前节点的所有子节点
369
+ selectAllChildren(items) {
370
+ const childIds = this.collectChildIdsRecursive(items);
371
+ selectedIds = [...new Set([...selectedIds, ...childIds])];
372
+ },
373
+ // 取消选中当前节点的所有子节点
374
+ invertChildrenSelection(items) {
375
+ const childIds = this.collectChildIdsRecursive(items);
376
+ selectedIds = selectedIds.filter((id) => !childIds.includes(id));
377
+ },
378
+ // 递归收集节点及其子节点的ID
379
+ collectChildIdsRecursive(items, result = []) {
380
+ items.forEach((item) => {
381
+ item.type === 0 && result.push(item.objectId);
382
+ if (this.hasChildren(item))
383
+ this.collectChildIdsRecursive(item.child, result);
384
+ });
385
+ return result;
386
+ },
387
+ },
388
+ };
389
+ </script>
390
+ <style lang="scss" scoped>
391
+ ::v-deep .el-card__body {
392
+ height: 100%;
393
+ padding: 0;
394
+ }
395
+
396
+ ::v-deep .el-tree {
397
+ margin-top: 10px;
398
+ height: 100%;
399
+ // color: #fff;
400
+ background: none;
401
+ }
402
+
403
+ ::v-deep .el-tree__empty-text {
404
+ // color: #fff;
405
+ font-size: 12px;
406
+ }
407
+
408
+ ::v-deep .el-tree-node__content:hover {
409
+ background: rgba(255, 255, 255, 0.3);
410
+ }
411
+
412
+ ::v-deep .el-tree-node:focus > .el-tree-node__content {
413
+ background: rgba(255, 255, 255, 0.3);
414
+ }
415
+
416
+ .title {
417
+ font-size: 16px;
418
+ }
419
+
420
+ ::v-deep .el-tree-node > .el-tree-node__children {
421
+ overflow: unset;
422
+ }
423
+
424
+ ::v-deep .el-tree .is-disabled {
425
+ display: none;
426
+ }
427
+
428
+ ::v-deep .el-tree--highlight-current
429
+ .el-tree-node.is-current
430
+ > .el-tree-node__content {
431
+ background: rgba(255, 255, 255, 0.3);
432
+ }
433
+
434
+ .custom-tree-node {
435
+ flex: 1;
436
+ display: flex;
437
+ align-items: center;
438
+ justify-content: space-between;
439
+ font-size: 14px;
440
+ padding-right: 8px;
441
+ }
442
+
443
+ .node-parent {
444
+ width: 173px;
445
+ white-space: nowrap;
446
+ text-overflow: ellipsis;
447
+ overflow: hidden;
448
+ }
449
+
450
+ .node-child {
451
+ width: 155px;
452
+ white-space: nowrap;
453
+ text-overflow: ellipsis;
454
+ overflow: hidden;
455
+ }
456
+
457
+ ::v-deep .el-scrollbar{
458
+ height: 739px;
459
+ }
460
+ </style>
@@ -0,0 +1,111 @@
1
+ <template>
2
+ <div>
3
+ <div class="key">
4
+ <span>漫游</span>
5
+ <div class="center">
6
+ <div class="top"><span>W</span></div>
7
+ <div class="cen">
8
+ <span>A</span>
9
+ <span>S</span>
10
+ <span>D</span>
11
+ </div>
12
+ <span class="text">W向前移动、S向后移动、A向左移动、D向右移动</span>
13
+ </div>
14
+ </div>
15
+ <div class="line"></div>
16
+ <div class="mouse">
17
+ <span>环视</span>
18
+ <div class="center">
19
+ <i class="iconfont icon-shubiao"></i>
20
+ <span class="text">鼠标控制方向</span>
21
+ </div>
22
+ </div>
23
+ <div class="line"></div>
24
+ <div class="quit">
25
+ <span>退出</span>
26
+ <div class="center">
27
+ <div class="cen"><span>Esc</span></div>
28
+ <span class="text">使用Esc键退出漫游</span>
29
+ </div>
30
+ </div>
31
+ <div class="button">
32
+ <el-button @click="start(false)">好的,知道了</el-button>
33
+ <el-button @click="start(true)" type="primary">不再提示</el-button>
34
+ </div>
35
+ </div>
36
+ </template>
37
+ <script>
38
+ export default {
39
+ name: 'FirstPerPanel',
40
+ data() {
41
+ return {
42
+
43
+ }
44
+ },
45
+ created() {
46
+ },
47
+ methods: {
48
+ start(val) {
49
+ this.$emit('start', val)
50
+ }
51
+ }
52
+ }
53
+ </script>
54
+ <style lang="scss" scoped>
55
+ span{
56
+ font-weight: bolder;
57
+ }
58
+ .text{
59
+ margin-top: 20px;
60
+ }
61
+ .line{
62
+ border-bottom: 1px solid #DCDFE6;
63
+ margin: 20px 0;
64
+ }
65
+ .center{
66
+ display: flex;
67
+ flex-direction: column;
68
+ align-items: center;
69
+ .top,.cen{
70
+ span{
71
+ color: #53a8ff;
72
+ display: inline-block;
73
+ width: 40px;
74
+ height: 40px;
75
+ text-align: center;
76
+ line-height: 30px;
77
+ border: 1px solid #53a8ff;
78
+ padding: 5px;
79
+ margin-bottom: 10px;
80
+ background-color: #E9F3FF;
81
+ }
82
+ }
83
+ .cen{
84
+ span{
85
+ margin: 10px;
86
+ }
87
+ }
88
+ }
89
+ .button{
90
+ display: flex;
91
+ justify-content: end;
92
+ margin-top: 20px;
93
+ }
94
+ @font-face {
95
+ font-family: "iconfont"; /* Project id 3226805 */
96
+ src: url('//at.alicdn.com/t/font_3226805_qqvo3ag3r8.woff2?t=1646635700216') format('woff2'),
97
+ url('//at.alicdn.com/t/font_3226805_qqvo3ag3r8.woff?t=1646635700216') format('woff'),
98
+ url('//at.alicdn.com/t/font_3226805_qqvo3ag3r8.ttf?t=1646635700216') format('truetype');
99
+ }
100
+ .iconfont {
101
+ font-family: "iconfont" !important;
102
+ font-size: 50px;
103
+ font-style: normal;
104
+ color: #53a8ff;
105
+ -webkit-font-smoothing: antialiased;
106
+ -moz-osx-font-smoothing: grayscale;
107
+ }
108
+ .icon-shubiao:before {
109
+ content: "\e8a7";
110
+ }
111
+ </style>