fl-web-component 2.0.0-beta.8 → 2.0.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.
- package/dist/fl-web-component.common.js +34645 -1611
- package/dist/fl-web-component.common.js.map +1 -1
- package/dist/fl-web-component.css +1 -1
- package/package.json +4 -15
- package/packages/components/com-card/index.vue +1 -1
- package/packages/components/com-flcanvas/components/bspline.js +31 -34
- package/packages/components/com-flcanvas/components/entityFormatting.js +810 -849
- package/packages/components/com-flcanvas/components/round10.js +17 -17
- package/packages/components/com-flcanvas/index.vue +314 -333
- package/packages/components/com-formDialog/index.vue +6 -4
- package/packages/components/com-graphics/component/ann-tool.vue +263 -208
- package/packages/components/com-graphics/index.vue +366 -773
- package/packages/components/com-graphics/pid.vue +304 -295
- package/packages/components/com-table/column-default.vue +2 -3
- package/packages/components/com-table/column-dynamic.vue +7 -4
- package/packages/components/com-table/column.vue +1 -2
- package/packages/components/com-table/index.vue +6 -5
- package/packages/components/com-tabs/index.vue +1 -2
- package/packages/components/com-tiles/index.vue +134 -136
- package/packages/components/com-treeDynamic/index.vue +1 -1
- package/packages/utils/StreamLoader.js +1548 -1489
- package/packages/utils/StreamLoaderParser.worker.js +9 -14
- package/src/main.js +2 -8
- package/src/utils/cloud.js +28 -28
- package/src/utils/cursor.js +11 -9
- package/src/utils/flgltf-parser.js +257 -245
- package/src/utils/instance-parser.js +20 -22
- package/src/utils/mini-devtool.js +94 -39
- package/src/utils/threejs/measure-angle.js +51 -13
- package/src/utils/threejs/measure-area.js +43 -12
- package/src/utils/threejs/measure-distance.js +43 -12
- package/src/utils/threejs/rain-shader.js +10 -10
- package/src/utils/threejs/snow-shader.js +9 -9
|
@@ -1,91 +1,86 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
|
|
3
|
-
<div ref="svgDraw" id="konva-container" style="height:100%"></div>
|
|
2
|
+
<div ref="svgDraw" id="konva-container" style="height: 100%"></div>
|
|
4
3
|
</template>
|
|
5
4
|
|
|
6
5
|
<script>
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
const byteArray = new Uint8Array(byteNumbers);
|
|
18
|
-
byteArrays.push(byteArray);
|
|
6
|
+
function base64ToBlob(base64) {
|
|
7
|
+
const byteCharacters = atob(base64);
|
|
8
|
+
const byteArrays = [];
|
|
9
|
+
|
|
10
|
+
for (let offset = 0; offset < byteCharacters.length; offset += 512) {
|
|
11
|
+
const slice = byteCharacters.slice(offset, offset + 512);
|
|
12
|
+
const byteNumbers = new Array(slice.length);
|
|
13
|
+
for (let i = 0; i < slice.length; i++) {
|
|
14
|
+
byteNumbers[i] = slice.charCodeAt(i);
|
|
19
15
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
function createObjectURL(blob) {
|
|
25
|
-
return URL.createObjectURL(blob);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
function downloadPDF(base64, fileName) {
|
|
31
|
-
const blob = base64ToBlob(base64);
|
|
32
|
-
const url = createObjectURL(blob);
|
|
33
|
-
const link = document.createElement('a');
|
|
34
|
-
link.href = url;
|
|
35
|
-
link.download = fileName || 'downloaded_pdf.pdf'; // 设置下载文件名,如果没有提供文件名,则默认为'downloaded_pdf.pdf'
|
|
36
|
-
document.body.appendChild(link); // 添加到DOM树中以便触发下载
|
|
37
|
-
link.click(); // 模拟点击下载
|
|
38
|
-
document.body.removeChild(link); // 下载完成后移除元素
|
|
39
|
-
URL.revokeObjectURL(url); // 释放URL对象
|
|
16
|
+
const byteArray = new Uint8Array(byteNumbers);
|
|
17
|
+
byteArrays.push(byteArray);
|
|
40
18
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
19
|
+
return new Blob(byteArrays, { type: 'application/pdf' });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function createObjectURL(blob) {
|
|
23
|
+
return URL.createObjectURL(blob);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function downloadPDF(base64, fileName) {
|
|
27
|
+
const blob = base64ToBlob(base64);
|
|
28
|
+
const url = createObjectURL(blob);
|
|
29
|
+
const link = document.createElement('a');
|
|
30
|
+
link.href = url;
|
|
31
|
+
link.download = fileName || 'downloaded_pdf.pdf'; // 设置下载文件名,如果没有提供文件名,则默认为'downloaded_pdf.pdf'
|
|
32
|
+
document.body.appendChild(link); // 添加到DOM树中以便触发下载
|
|
33
|
+
link.click(); // 模拟点击下载
|
|
34
|
+
document.body.removeChild(link); // 下载完成后移除元素
|
|
35
|
+
URL.revokeObjectURL(url); // 释放URL对象
|
|
36
|
+
}
|
|
37
|
+
import Konva from 'konva';
|
|
38
|
+
import DxfParser from 'dxf-parser';
|
|
39
|
+
import jsPDF from 'jspdf';
|
|
40
|
+
import { formatEntity, handleFn, centering } from './components/entityFormatting';
|
|
41
|
+
var konvaStage = null,
|
|
42
|
+
konvaLayer = null;
|
|
43
|
+
var recordLayerConfig = {};
|
|
44
|
+
var activedSvgPan = {
|
|
45
|
+
x: 0,
|
|
46
|
+
y: 0,
|
|
47
|
+
zoom: {
|
|
48
|
+
x: 1,
|
|
49
|
+
y: 1,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
export default {
|
|
53
|
+
name: 'Fl2dcanvas',
|
|
54
|
+
components: {},
|
|
55
|
+
data() {
|
|
56
|
+
return {
|
|
57
|
+
bounds: null,
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
created() {
|
|
61
|
+
//resize方法
|
|
62
|
+
window.addEventListener('resize', () => {
|
|
63
|
+
if (konvaStage) {
|
|
64
|
+
const obj = document.getElementById('konva-container');
|
|
65
|
+
konvaStage.setWidth(obj.clientWidth);
|
|
66
|
+
konvaStage.setHeight(obj.clientHeight);
|
|
67
|
+
konvaStage._resizeDOM();
|
|
68
|
+
}
|
|
69
|
+
});
|
|
75
70
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
71
|
+
this.$nextTick(() => {
|
|
72
|
+
console.log(document.getElementById('konva-container'));
|
|
73
|
+
console.log(this.$refs.svgDraw);
|
|
79
74
|
konvaStage = new Konva.Stage({
|
|
80
|
-
className:
|
|
81
|
-
container:
|
|
75
|
+
className: 'stage',
|
|
76
|
+
container: 'konva-container',
|
|
82
77
|
width: this.$refs.svgDraw.clientWidth,
|
|
83
78
|
height: this.$refs.svgDraw.clientHeight,
|
|
84
79
|
draggable: true,
|
|
85
80
|
});
|
|
86
81
|
//init layer
|
|
87
82
|
konvaLayer = new Konva.Layer({
|
|
88
|
-
name:
|
|
83
|
+
name: 'konva-layer',
|
|
89
84
|
x: 0,
|
|
90
85
|
y: 0,
|
|
91
86
|
});
|
|
@@ -95,8 +90,8 @@
|
|
|
95
90
|
konvaLayer.draw();
|
|
96
91
|
var scaleBy = 1.1;
|
|
97
92
|
//初始化缩放方法
|
|
98
|
-
konvaStage.on(
|
|
99
|
-
console.log(e)
|
|
93
|
+
konvaStage.on('wheel', e => {
|
|
94
|
+
console.log(e);
|
|
100
95
|
e.evt.preventDefault();
|
|
101
96
|
var oldScale = konvaStage.scaleX();
|
|
102
97
|
var pointer = konvaStage.getPointerPosition();
|
|
@@ -110,11 +105,11 @@
|
|
|
110
105
|
direction = -direction;
|
|
111
106
|
}
|
|
112
107
|
var newScale = direction > 0 ? oldScale * scaleBy : oldScale / scaleBy;
|
|
113
|
-
this.scaleRatio = Math.ceil(newScale)
|
|
108
|
+
this.scaleRatio = Math.ceil(newScale);
|
|
114
109
|
console.log(this.scaleRatio);
|
|
115
110
|
// 判断比例尺百分比
|
|
116
111
|
console.log(this.scaleRatio);
|
|
117
|
-
if (this.scaleRatio <1 || this.scaleRatio >= 100) return
|
|
112
|
+
if (this.scaleRatio < 1 || this.scaleRatio >= 100) return;
|
|
118
113
|
// 设置放大缩小多少倍
|
|
119
114
|
konvaStage.scale({ x: newScale, y: newScale });
|
|
120
115
|
var newPos = {
|
|
@@ -123,291 +118,277 @@
|
|
|
123
118
|
};
|
|
124
119
|
konvaStage.position(newPos);
|
|
125
120
|
});
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
konvaStage.setX(x);
|
|
135
|
-
konvaStage.setY(y); // 750
|
|
136
|
-
|
|
137
|
-
//算一下舞台中点
|
|
138
|
-
let width=konvaStage.width();
|
|
139
|
-
let height=konvaStage.height()
|
|
140
|
-
let x1=width/2;
|
|
141
|
-
let y1=height/2;
|
|
121
|
+
konvaStage.on('pointerdblclick', e => {
|
|
122
|
+
konvaStage.scale({
|
|
123
|
+
x: 1,
|
|
124
|
+
y: 1,
|
|
125
|
+
});
|
|
126
|
+
let x = -parseFloat(this.bounds.minX);
|
|
127
|
+
let y = -parseFloat(this.bounds.minY);
|
|
142
128
|
|
|
143
|
-
|
|
129
|
+
konvaStage.setX(x);
|
|
130
|
+
konvaStage.setY(y); // 750
|
|
144
131
|
|
|
145
|
-
|
|
146
|
-
|
|
132
|
+
//算一下舞台中点
|
|
133
|
+
let width = konvaStage.width();
|
|
134
|
+
let height = konvaStage.height();
|
|
135
|
+
let x1 = width / 2;
|
|
136
|
+
let y1 = height / 2;
|
|
147
137
|
|
|
148
|
-
|
|
149
|
-
let y2=y+y1-(boundsHeight/2)
|
|
138
|
+
//算包围盒宽高
|
|
150
139
|
|
|
140
|
+
let boundsWidth = this.bounds.maxX - this.bounds.minX;
|
|
141
|
+
let boundsHeight = Math.abs(Math.abs(this.bounds.maxY) - Math.abs(this.bounds.minY));
|
|
151
142
|
|
|
143
|
+
let x2 = x + x1 - boundsWidth / 2;
|
|
144
|
+
let y2 = y + y1 - boundsHeight / 2;
|
|
152
145
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
});
|
|
146
|
+
konvaStage.setX(x2);
|
|
147
|
+
konvaStage.setY(y2); // 750
|
|
156
148
|
});
|
|
157
|
-
|
|
158
|
-
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
//create方法结束
|
|
152
|
+
},
|
|
153
|
+
//销毁方法
|
|
154
|
+
|
|
155
|
+
methods: {
|
|
156
|
+
updateBounds(v) {
|
|
157
|
+
if (this.bounds === null) {
|
|
158
|
+
this.bounds = { minX: v.x, maxX: v.x, minY: v.y, maxY: v.y };
|
|
159
|
+
} else {
|
|
160
|
+
if (v.x < this.bounds.minX) {
|
|
161
|
+
this.bounds.minX = v.x;
|
|
162
|
+
} else if (v.x > this.bounds.maxX) {
|
|
163
|
+
this.bounds.maxX = v.x;
|
|
164
|
+
}
|
|
165
|
+
if (v.y < this.bounds.minY) {
|
|
166
|
+
this.bounds.minY = v.y;
|
|
167
|
+
} else if (v.y > this.bounds.maxY) {
|
|
168
|
+
this.bounds.maxY = v.y;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
159
171
|
},
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
updateBounds(v) {
|
|
164
|
-
if (this.bounds === null) {
|
|
165
|
-
this.bounds = { minX: v.x, maxX: v.x, minY: v.y, maxY: v.y }
|
|
166
|
-
} else {
|
|
167
|
-
if (v.x < this.bounds.minX) {
|
|
168
|
-
this.bounds.minX = v.x
|
|
169
|
-
} else if (v.x > this.bounds.maxX) {
|
|
170
|
-
this.bounds.maxX = v.x
|
|
171
|
-
}
|
|
172
|
-
if (v.y < this.bounds.minY) {
|
|
173
|
-
this.bounds.minY = v.y
|
|
174
|
-
} else if (v.y > this.bounds.maxY) {
|
|
175
|
-
this.bounds.maxY = v.y
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
},
|
|
180
|
-
//思路是计算居中包围盒,然后排除脏数据。
|
|
181
|
-
loadDxf(data){
|
|
182
|
-
let _this=this;
|
|
172
|
+
//思路是计算居中包围盒,然后排除脏数据。
|
|
173
|
+
loadDxf(data) {
|
|
174
|
+
let _this = this;
|
|
183
175
|
|
|
184
|
-
|
|
176
|
+
/* if(this.layer!=null){
|
|
185
177
|
let nodes=this.layer.find(".item");
|
|
186
178
|
for(let i=0;i<nodes.length;i++){
|
|
187
179
|
nodes[i].destroy();
|
|
188
180
|
}
|
|
189
181
|
}*/
|
|
190
182
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
183
|
+
konvaLayer.destroyChildren();
|
|
184
|
+
const parser = new DxfParser();
|
|
185
|
+
let dxf = parser.parse(data);
|
|
186
|
+
let entities = formatEntity(dxf.entities);
|
|
187
|
+
|
|
188
|
+
let layers = dxf.tables.layer.layers;
|
|
189
|
+
//加载图纸
|
|
190
|
+
console.log(dxf);
|
|
191
|
+
console.log(entities);
|
|
192
|
+
|
|
193
|
+
for (let key in entities) {
|
|
194
|
+
if (entities[key]) {
|
|
195
|
+
let group = [];
|
|
196
|
+
let l = entities[key].length;
|
|
197
|
+
let layerConfig = recordLayerConfig[key];
|
|
198
|
+
let configParams =
|
|
199
|
+
layerConfig && Object.keys(layerConfig).length > 0 ? layerConfig : null;
|
|
200
|
+
for (let i = 0; i < l; i++) {
|
|
201
|
+
let type = entities[key][i].type;
|
|
202
|
+
handleFn(
|
|
203
|
+
type,
|
|
204
|
+
dxf,
|
|
205
|
+
entities[key][i],
|
|
206
|
+
group,
|
|
207
|
+
key,
|
|
208
|
+
configParams,
|
|
209
|
+
konvaLayer,
|
|
210
|
+
recordLayerConfig
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
if (!konvaLayer) return;
|
|
214
|
+
for (let i = 0; i < group.length; i++) {
|
|
215
|
+
let entity = group[i];
|
|
216
|
+
if (entity.type === 'text') {
|
|
217
|
+
if (konvaLayer) konvaLayer.add(entity.obj);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
205
220
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
221
|
+
if (group[0].stroke == undefined) {
|
|
222
|
+
console.log(group);
|
|
223
|
+
group[0].stroke = '#000';
|
|
224
|
+
}
|
|
225
|
+
let customShape = new Konva.Shape({
|
|
226
|
+
x: 0,
|
|
227
|
+
y: 0,
|
|
228
|
+
strokeWidth: 0.2,
|
|
229
|
+
name: key.replace(/\s*/g, ''),
|
|
230
|
+
entityId: key,
|
|
231
|
+
stroke: group[0].stroke,
|
|
232
|
+
customColor: configParams ? configParams.color : '',
|
|
233
|
+
//visible: configParams ? configParams.visible :true,
|
|
234
|
+
sceneFunc(context, shape) {
|
|
235
|
+
context.beginPath();
|
|
236
|
+
for (let i = 0; i < group.length; i++) {
|
|
217
237
|
let entity = group[i];
|
|
218
|
-
if (entity.type === 'text') {
|
|
219
238
|
|
|
220
|
-
|
|
239
|
+
if (entity.type === 'line') {
|
|
240
|
+
context.strokeStyle = entity.stroke;
|
|
241
|
+
let x1 = entity.x1;
|
|
242
|
+
let y1 = entity.y1;
|
|
243
|
+
let x2 = entity.x2;
|
|
244
|
+
let y2 = entity.y2;
|
|
245
|
+
if (x1 != undefined && y1 != undefined && x2 != undefined && y2 != undefined) {
|
|
246
|
+
context.moveTo(x1, -parseFloat(y1));
|
|
247
|
+
context.lineTo(x2, -parseFloat(y2));
|
|
248
|
+
}
|
|
249
|
+
let v1 = {};
|
|
250
|
+
v1.x = x1;
|
|
251
|
+
v1.y = y1;
|
|
252
|
+
let v2 = {};
|
|
253
|
+
v2.x = x2;
|
|
254
|
+
v2.y = y2;
|
|
255
|
+
_this.updateBounds(v1);
|
|
256
|
+
_this.updateBounds(v2);
|
|
221
257
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
if( group[0].stroke==undefined){
|
|
226
|
-
console.log(group);
|
|
227
|
-
group[0].stroke='#000';
|
|
228
|
-
}
|
|
229
|
-
let customShape = new Konva.Shape({
|
|
230
|
-
x: 0,
|
|
231
|
-
y: 0,
|
|
232
|
-
strokeWidth: 0.2,
|
|
233
|
-
name: key.replace(/\s*/g, ""),
|
|
234
|
-
entityId: key,
|
|
235
|
-
stroke: group[0].stroke,
|
|
236
|
-
customColor: configParams ? configParams.color : "",
|
|
237
|
-
//visible: configParams ? configParams.visible :true,
|
|
238
|
-
sceneFunc (context, shape) {
|
|
239
|
-
context.beginPath();
|
|
240
|
-
for(let i = 0; i < group.length;i++){
|
|
241
|
-
let entity = group[i];
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
if(entity.type === 'line'){
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
context.strokeStyle=entity.stroke;
|
|
249
|
-
let x1=entity.x1;
|
|
250
|
-
let y1=entity.y1;
|
|
251
|
-
let x2=entity.x2;
|
|
252
|
-
let y2=entity.y2;
|
|
253
|
-
if(x1!=undefined&&y1!=undefined&&x2!=undefined&&y2!=undefined) {
|
|
254
|
-
context.moveTo(x1, -parseFloat(y1));
|
|
255
|
-
context.lineTo(x2, -parseFloat(y2));
|
|
256
|
-
}
|
|
257
|
-
let v1={};
|
|
258
|
-
v1.x=x1;
|
|
259
|
-
v1.y=y1;
|
|
260
|
-
let v2={};
|
|
261
|
-
v2.x=x2;
|
|
262
|
-
v2.y=y2;
|
|
263
|
-
_this.updateBounds(v1);
|
|
264
|
-
_this.updateBounds(v2);
|
|
265
|
-
}
|
|
266
|
-
if(entity.type === "polyline"){
|
|
267
|
-
context.strokeStyle=entity.stroke;
|
|
268
|
-
|
|
269
|
-
let flag=false;
|
|
258
|
+
if (entity.type === 'polyline') {
|
|
259
|
+
context.strokeStyle = entity.stroke;
|
|
270
260
|
|
|
261
|
+
let flag = false;
|
|
271
262
|
|
|
263
|
+
let points = entity.points;
|
|
272
264
|
|
|
273
|
-
|
|
265
|
+
let closed = entity.closed;
|
|
274
266
|
|
|
275
|
-
|
|
267
|
+
for (let j = 0; j < points.length; j++) {
|
|
268
|
+
let index = j % 2;
|
|
269
|
+
if (index === 0) {
|
|
270
|
+
let x = points[j];
|
|
271
|
+
let y = points[j + 1];
|
|
272
|
+
let point = {};
|
|
273
|
+
point.x = x;
|
|
274
|
+
point.y = y;
|
|
275
|
+
_this.updateBounds(point);
|
|
276
276
|
|
|
277
|
+
if (j === 0) {
|
|
278
|
+
context.moveTo(x, y);
|
|
279
|
+
} else {
|
|
280
|
+
context.lineTo(x, y);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
277
283
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
if(index === 0){
|
|
282
|
-
let x = points[j];
|
|
283
|
-
let y = points[j+1];
|
|
284
|
-
let point={};
|
|
285
|
-
point.x=x;
|
|
286
|
-
point.y=y;
|
|
287
|
-
_this.updateBounds(point);
|
|
288
|
-
|
|
289
|
-
if(j === 0){
|
|
290
|
-
context.moveTo(x, y);
|
|
291
|
-
}else{
|
|
292
|
-
context.lineTo(x,y);
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
if(closed) {
|
|
297
|
-
if (j === points.length - 1) {
|
|
298
|
-
context.lineTo(points[0], points[1]);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
284
|
+
if (closed) {
|
|
285
|
+
if (j === points.length - 1) {
|
|
286
|
+
context.lineTo(points[0], points[1]);
|
|
301
287
|
}
|
|
302
288
|
}
|
|
303
289
|
}
|
|
304
|
-
// context.closePath();
|
|
305
|
-
context.fillStrokeShape(shape);
|
|
306
290
|
}
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
let ratio = Number((this.$refs.svgDraw?.clientWidth / boundingRect.width).toFixed(1));
|
|
315
|
-
if (ratio > 2) {
|
|
316
|
-
scale = Number((boundingRect.width / boundingRect.height).toFixed(1));
|
|
317
|
-
scale = scale < 2 ? 2 : scale;
|
|
318
|
-
}
|
|
319
|
-
// konvaStage.scale({
|
|
320
|
-
// x: scale,
|
|
321
|
-
// y: scale,
|
|
322
|
-
//})
|
|
323
|
-
const boundingScale = konvaLayer.getClientRect();
|
|
324
|
-
//平移视口
|
|
325
|
-
const x =
|
|
326
|
-
this.$refs.svgDraw?.clientWidth / 2 -
|
|
327
|
-
(Math.ceil(boundingScale.width) / 2 + boundingScale.x / 2);
|
|
328
|
-
const y =
|
|
329
|
-
this.$refs.svgDraw.clientHeight / 2 -
|
|
330
|
-
(Math.ceil(boundingScale.height) / 2 + boundingScale.y);
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
konvaStage.scale({
|
|
336
|
-
x: 2,
|
|
337
|
-
y: 2,
|
|
338
|
-
});
|
|
339
|
-
konvaStage.setX(0);
|
|
340
|
-
konvaStage.setY(750); // 750
|
|
341
|
-
|
|
342
|
-
activedSvgPan.zoom.x = 0;
|
|
343
|
-
activedSvgPan.zoom.y = 750;
|
|
344
|
-
activedSvgPan.x = x;
|
|
345
|
-
activedSvgPan.y = x;
|
|
346
|
-
setTimeout(() => {
|
|
347
|
-
this.$emit('loaded')
|
|
348
|
-
}, 100)
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
},
|
|
353
|
-
toPdf(name){
|
|
354
|
-
//konvaStage.scale({
|
|
355
|
-
//x: activedSvgPan.zoom.x,
|
|
356
|
-
//y: activedSvgPan.zoom.y,
|
|
357
|
-
//});
|
|
358
|
-
//konvaStage.setX(activedSvgPan.x);
|
|
359
|
-
//konvaStage.setY(activedSvgPan.y);
|
|
360
|
-
// get data URL with default settings
|
|
361
|
-
|
|
362
|
-
// open in new window
|
|
363
|
-
konvaLayer.getCanvas().setPixelRatio(2);
|
|
364
|
-
const jpegURL = konvaStage.toDataURL({
|
|
365
|
-
mimeType: 'image/jpeg',
|
|
366
|
-
quality:1,
|
|
367
|
-
pixelRatio:2
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
let pageData=konvaLayer.canvas.toDataURL('image/jpeg', 2);
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
let img = new Image();
|
|
374
|
-
img.src=jpegURL;
|
|
375
|
-
const pdf = new jsPDF('l', 'px', [konvaStage.width(), konvaStage.height()]);
|
|
376
|
-
|
|
377
|
-
pdf.addImage(
|
|
378
|
-
konvaStage.toDataURL({ pixelRatio: 2 }),
|
|
379
|
-
0,
|
|
380
|
-
0,
|
|
381
|
-
konvaStage.width(),
|
|
382
|
-
konvaStage.height()
|
|
383
|
-
);
|
|
384
|
-
|
|
385
|
-
pdf.save(name+".pdf");
|
|
386
|
-
// var imgData = canvas.toDataURL('image/png');
|
|
387
|
-
//doc.text("Hello world!", 10, 10);
|
|
388
|
-
//doc.save("a4.pdf");
|
|
389
|
-
},
|
|
390
|
-
clearCache(){
|
|
391
|
-
konvaLayer && konvaLayer.destroyChildren()
|
|
392
|
-
konvaLayer && konvaLayer.destroy()
|
|
393
|
-
konvaLayer && konvaLayer.clear()
|
|
394
|
-
konvaStage && konvaStage.destroy()
|
|
395
|
-
konvaStage && konvaStage.clearCache()
|
|
396
|
-
konvaLayer = null
|
|
397
|
-
konvaStage = null
|
|
398
|
-
},
|
|
399
|
-
beforeDestroy() {
|
|
400
|
-
this.clearCache()
|
|
291
|
+
}
|
|
292
|
+
// context.closePath();
|
|
293
|
+
context.fillStrokeShape(shape);
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
if (konvaLayer) konvaLayer.add(customShape);
|
|
297
|
+
}
|
|
401
298
|
}
|
|
402
|
-
|
|
403
|
-
|
|
299
|
+
//缩放视口
|
|
300
|
+
let scale = 1;
|
|
301
|
+
const boundingRect = konvaLayer.getClientRect();
|
|
302
|
+
let ratio = Number((this.$refs.svgDraw?.clientWidth / boundingRect.width).toFixed(1));
|
|
303
|
+
if (ratio > 2) {
|
|
304
|
+
scale = Number((boundingRect.width / boundingRect.height).toFixed(1));
|
|
305
|
+
scale = scale < 2 ? 2 : scale;
|
|
306
|
+
}
|
|
307
|
+
// konvaStage.scale({
|
|
308
|
+
// x: scale,
|
|
309
|
+
// y: scale,
|
|
310
|
+
//})
|
|
311
|
+
const boundingScale = konvaLayer.getClientRect();
|
|
312
|
+
//平移视口
|
|
313
|
+
const x =
|
|
314
|
+
this.$refs.svgDraw?.clientWidth / 2 -
|
|
315
|
+
(Math.ceil(boundingScale.width) / 2 + boundingScale.x / 2);
|
|
316
|
+
const y =
|
|
317
|
+
this.$refs.svgDraw.clientHeight / 2 -
|
|
318
|
+
(Math.ceil(boundingScale.height) / 2 + boundingScale.y);
|
|
319
|
+
|
|
320
|
+
konvaStage.scale({
|
|
321
|
+
x: 2,
|
|
322
|
+
y: 2,
|
|
323
|
+
});
|
|
324
|
+
konvaStage.setX(0);
|
|
325
|
+
konvaStage.setY(750); // 750
|
|
326
|
+
|
|
327
|
+
activedSvgPan.zoom.x = 0;
|
|
328
|
+
activedSvgPan.zoom.y = 750;
|
|
329
|
+
activedSvgPan.x = x;
|
|
330
|
+
activedSvgPan.y = x;
|
|
331
|
+
setTimeout(() => {
|
|
332
|
+
this.$emit('loaded');
|
|
333
|
+
}, 100);
|
|
334
|
+
},
|
|
335
|
+
toPdf(name) {
|
|
336
|
+
//konvaStage.scale({
|
|
337
|
+
//x: activedSvgPan.zoom.x,
|
|
338
|
+
//y: activedSvgPan.zoom.y,
|
|
339
|
+
//});
|
|
340
|
+
//konvaStage.setX(activedSvgPan.x);
|
|
341
|
+
//konvaStage.setY(activedSvgPan.y);
|
|
342
|
+
// get data URL with default settings
|
|
343
|
+
|
|
344
|
+
// open in new window
|
|
345
|
+
konvaLayer.getCanvas().setPixelRatio(2);
|
|
346
|
+
const jpegURL = konvaStage.toDataURL({
|
|
347
|
+
mimeType: 'image/jpeg',
|
|
348
|
+
quality: 1,
|
|
349
|
+
pixelRatio: 2,
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
let pageData = konvaLayer.canvas.toDataURL('image/jpeg', 2);
|
|
353
|
+
|
|
354
|
+
let img = new Image();
|
|
355
|
+
img.src = jpegURL;
|
|
356
|
+
const pdf = new jsPDF('l', 'px', [konvaStage.width(), konvaStage.height()]);
|
|
357
|
+
|
|
358
|
+
pdf.addImage(
|
|
359
|
+
konvaStage.toDataURL({ pixelRatio: 2 }),
|
|
360
|
+
0,
|
|
361
|
+
0,
|
|
362
|
+
konvaStage.width(),
|
|
363
|
+
konvaStage.height()
|
|
364
|
+
);
|
|
365
|
+
|
|
366
|
+
pdf.save(name + '.pdf');
|
|
367
|
+
// var imgData = canvas.toDataURL('image/png');
|
|
368
|
+
//doc.text("Hello world!", 10, 10);
|
|
369
|
+
//doc.save("a4.pdf");
|
|
370
|
+
},
|
|
371
|
+
clearCache() {
|
|
372
|
+
konvaLayer && konvaLayer.destroyChildren();
|
|
373
|
+
konvaLayer && konvaLayer.destroy();
|
|
374
|
+
konvaLayer && konvaLayer.clear();
|
|
375
|
+
konvaStage && konvaStage.destroy();
|
|
376
|
+
konvaStage && konvaStage.clearCache();
|
|
377
|
+
konvaLayer = null;
|
|
378
|
+
konvaStage = null;
|
|
379
|
+
},
|
|
380
|
+
beforeDestroy() {
|
|
381
|
+
this.clearCache();
|
|
382
|
+
},
|
|
383
|
+
},
|
|
384
|
+
};
|
|
404
385
|
</script>
|
|
405
386
|
<style lang="scss" scoped>
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
387
|
+
#konva-container {
|
|
388
|
+
z-index: 3;
|
|
389
|
+
width: 100%;
|
|
390
|
+
height: 100%;
|
|
391
|
+
cursor: pointer;
|
|
392
|
+
overflow: hidden;
|
|
393
|
+
}
|
|
413
394
|
</style>
|