Skip to content

Commit 71c2df7

Browse files
author
zhaokai
committed
支持算法符号自定义几何
1 parent 4e05016 commit 71c2df7

20 files changed

+625
-630
lines changed

src/service/2DPlot/Shapes/IrregularShapes/PlotIrregularShape.js

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* @Author: zk
44
* @Date: 2021-11-18 15:08:54
55
* @LastEditors: zk
6-
* @LastEditTime: 2022-06-13 19:14:58
6+
* @LastEditTime: 2022-06-21 10:33:32
77
*/
88
import { fabric } from 'fabric';
99
import PlotPolylineObject from '../PlotPolylineObject';
@@ -17,11 +17,20 @@ const PlotIrregularShape = fabric.util.createClass(PlotPolylineObject, {
1717
});
1818
return boundingBox;
1919
},
20+
_calcStrokeOrFillGeometry(coords) {
21+
// 非规则符号使用外部设置函数进行控制点填充
22+
const strokeCoords = this._elem.applyFuncToStorkeGeometry(coords);
23+
// 非规则符号使用完整几何进行填充
24+
const fillCoords= this._elem.applyFuncToFillGeometry(coords);
25+
return { strokeCoords, fillCoords };
26+
},
2027
_pathElementRender: function _pathElementRender(ctx, coords) {
2128
const style = this._elem.getContextStyle();
2229
const lineWidth = this.calcMapScaleLineWidth(style.lineWidth);
2330
style.lineWidth = lineWidth;
24-
this._pointsToPath(ctx, style, coords);
31+
32+
const { strokeCoords, fillCoords } = this._calcStrokeOrFillGeometry(coords);
33+
this._pointsToPath(ctx, style, strokeCoords, fillCoords);
2534
},
2635
_comparePathElementRender: function _comparePathElementRender(ctx, coords) {
2736
const style = this._elem.getContextStyle();
@@ -39,8 +48,41 @@ const PlotIrregularShape = fabric.util.createClass(PlotPolylineObject, {
3948
})
4049
);
4150
if (_compareStyle) {
42-
this._pointsToPath(ctx, _compareStyle, coords);
51+
const { strokeCoords, fillCoords } = this._calcStrokeOrFillGeometry(coords);
52+
this._pointsToPath(ctx, style, strokeCoords, fillCoords);
53+
}
54+
},
55+
56+
_pointsToPath: function _pointsToPath(ctx, style, strokeCoords, fillCoords) {
57+
// stroke
58+
ctx.save();
59+
const strokeCoordsPnts = strokeCoords.filter((s) => s.length !== 0);
60+
for (let j = 0; j < strokeCoordsPnts.length; j += 1) {
61+
const tempPnts = strokeCoordsPnts[j];
62+
const tempPntsLen = tempPnts.length;
63+
ctx.beginPath();
64+
ctx.moveTo(tempPnts[0].x + this.m_offsetX, tempPnts[0].y + this.m_offsetY);
65+
for (let m = 1; m < tempPntsLen; m += 1) {
66+
ctx.lineTo(tempPnts[m].x + this.m_offsetX, tempPnts[m].y + this.m_offsetY);
67+
}
68+
this._drawPath(ctx, Object.assign({},style, { fillStyle: 'none' }));
69+
}
70+
ctx.restore();
71+
72+
// fill
73+
ctx.save();
74+
const fillPnts = fillCoords.filter((s) => s.length !== 0);
75+
for (let j = 0; j < fillPnts.length; j += 1) {
76+
const tempPnts = fillPnts[j];
77+
const tempPntsLen = tempPnts.length;
78+
ctx.beginPath();
79+
ctx.moveTo(tempPnts[0].x + this.m_offsetX, tempPnts[0].y + this.m_offsetY);
80+
for (let m = 1; m < tempPntsLen; m += 1) {
81+
ctx.lineTo(tempPnts[m].x + this.m_offsetX, tempPnts[m].y + this.m_offsetY);
82+
}
83+
this._drawPath(ctx, Object.assign({},style, { strokeStyle: 'none' }));
4384
}
85+
ctx.restore();
4486
},
4587
_render(ctx) {
4688
const coords = this._elem.cacheCoords || this._elem.getCoords();

src/service/2DPlot/Shapes/PlotPolylineObject.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ const PlotPolylineObject = fabric.util.createClass(PlotObject, {
158158
for (let m = 1; m < tempPntsLen; m += 1) {
159159
ctx.lineTo(tempPnts[m].x + this.m_offsetX, tempPnts[m].y + this.m_offsetY);
160160
}
161-
if (GeomUtil.PointEqualFuzzy(startPnt.x, startPnt.y, endPnt.x, endPnt.y)) {
161+
if (GeomUtil.PointEqualFuzzy(startPnt.x, startPnt.y, endPnt.x, endPnt.y,1e-18)) {
162162
ctx.closePath();
163163
}
164164

src/service/3DPlot/Primitive/ElementInstance/IrregularElementInstance.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ export default class IrregularElementInstance extends RegularLineElementInstance
4646
const lineWidth = pathStyle.lineWidth;
4747
const fillStyleType = pathStyle.fillStyleType;
4848

49+
// 非规则符号使用外部设置函数进行控制点填充
50+
const strokeCoords = this._elem.applyFuncToStorkeGeometry(coords);
51+
// 非规则符号使用完整几何进行填充
52+
const fillCoords= this._elem.applyFuncToFillGeometry(coords);
53+
54+
4955
const strokeColor = Cesium.Color.fromCssColorString(pathStyle.strokeStyle);
5056
const widthSize = (lineWidth * this.globelScale) / 2;
5157

@@ -57,8 +63,8 @@ export default class IrregularElementInstance extends RegularLineElementInstance
5763
const fillColorAttribute =
5864
Cesium.ColorGeometryInstanceAttribute.fromColor(fillColor);
5965

60-
for (let i = 0; i < coords.length; i += 1) {
61-
let path = coords[i];
66+
for (let i = 0; i < strokeCoords.length; i += 1) {
67+
let path = strokeCoords[i];
6268
path = GeomUtil.ClearSamePts(path);
6369
const geometry = this._generateStrokeGeometry(path, widthSize);
6470
if (!geometry) {
@@ -78,8 +84,8 @@ export default class IrregularElementInstance extends RegularLineElementInstance
7884
}
7985

8086
if (fillStyleType > 0) {
81-
for (let i = 0; i < coords.length; i += 1) {
82-
let path = coords[i];
87+
for (let i = 0; i < fillCoords.length; i += 1) {
88+
let path = fillCoords[i];
8389
path = GeomUtil.ClearSamePts(path);
8490
const geometry = this._generateFillGeometry(path, fillSize);
8591
if (!geometry) {

src/service/PlotBase/SvgLoader/element/IrregularElement/Arrow/AssaultArrowGeometry.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
/*
22
* @Author: your name
33
* @Date: 2021-11-09 10:21:27
4-
* @LastEditTime: 2022-06-13 14:49:58
4+
* @LastEditTime: 2022-06-21 11:14:20
55
* @LastEditors: zk
66
* @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
77
* @FilePath: \MapGISPlotBase\src\base\SvgLoader\element\IrregularElement\Arrow\AssaultArrow.js
88
*/
9-
import BaseIrregularElement from "../BaseIrregularElement";
109
import AssaultArrow from "../../../../../PlotUtilBase/Geometry/Arrow/AssaultArrow";
10+
import BaseArrowGeometry from "./BaseArrowGeometry";
1111

12-
export default class AssaultArrowGeometry extends BaseIrregularElement {
12+
export default class AssaultArrowGeometry extends BaseArrowGeometry {
1313
constructor(node) {
1414
super(node);
1515
this.type = 'assaultarrow';
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* @Author: your name
3+
* @Date: 2021-11-09 10:21:27
4+
* @LastEditTime: 2022-06-21 11:08:15
5+
* @LastEditors: zk
6+
* @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
7+
* @FilePath: \MapGISPlotBase\src\base\SvgLoader\element\IrregularElement\Arrow\AssaultArrow.js
8+
*/
9+
import BaseIrregularElement from "../BaseIrregularElement";
10+
11+
export default class BaseArrowGeometry extends BaseIrregularElement {
12+
constructor(node) {
13+
super(node);
14+
this.type = 'basearrow';
15+
}
16+
17+
applyFuncToFillGeometry(coords,func){
18+
let _fillCoords = [];
19+
coords.forEach((t) => {
20+
_fillCoords = _fillCoords.concat(t);
21+
});
22+
const fillCoords = [_fillCoords];
23+
return fillCoords
24+
}
25+
26+
}
Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
11
/*
22
* @Author: your name
33
* @Date: 2021-11-09 10:29:43
4-
* @LastEditTime: 2022-06-13 14:48:14
4+
* @LastEditTime: 2022-06-21 11:08:50
55
* @LastEditors: zk
66
* @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
77
* @FilePath: \MapGISPlotBase\src\base\SvgLoader\element\IrregularElement\Arrow\DoubleArrow.js
88
*/
9-
import BaseIrregularElement from "../BaseIrregularElement";
10-
import DoubleArrow from "../../../../../PlotUtilBase/Geometry/Arrow/Double_Arrow";
11-
import Point from "../../../../../PlotUtilBase/Geometry/Point";
9+
import DoubleArrow from '../../../../../PlotUtilBase/Geometry/Arrow/Double_Arrow';
10+
import Point from '../../../../../PlotUtilBase/Geometry/Point';
11+
import BaseArrowGeometry from './BaseArrowGeometry';
1212

13-
export default class DoubleArrowGeometry extends BaseIrregularElement{
13+
export default class DoubleArrowGeometry extends BaseArrowGeometry {
1414
constructor(node) {
1515
super(node);
16-
this.type='doublearrow';
16+
this.type = 'doublearrow';
1717
}
18-
_insertGeometry(points){
19-
const pnts= points.map((s)=> [s.x,s.y])
20-
const exPnts= new DoubleArrow(pnts).getPoints();
21-
const exPoints= exPnts.map((s)=>new Point(s[0],s[1]))
22-
return [exPoints]
18+
19+
20+
_insertGeometry(points) {
21+
const pnts = points.map((s) => [s.x, s.y]);
22+
const exPnts = new DoubleArrow(pnts).getPoints();
23+
const exPoints = exPnts.map((t) => t.map((s) => new Point(s[0], s[1])));
24+
return exPoints;
2325
}
24-
}
26+
}
Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,45 @@
11
/*
22
* @Author: your name
33
* @Date: 2021-11-09 10:37:25
4-
* @LastEditTime: 2022-06-13 14:48:21
4+
* @LastEditTime: 2022-06-21 15:47:15
55
* @LastEditors: zk
66
* @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
77
* @FilePath: \MapGISPlotBase\src\base\SvgLoader\element\IrregularElement\Arrow\MultiArrow.js
88
*/
9-
import BaseIrregularElement from "../BaseIrregularElement";
109
import MultiArrow from '../../../../../PlotUtilBase/Geometry/Arrow/MultiArrow';
10+
import Point from '../../../../../PlotUtilBase/Geometry/Point';
11+
import BaseArrowGeometry from './BaseArrowGeometry';
12+
export default class MultiArrowGeometry extends BaseArrowGeometry {
13+
constructor(node) {
14+
super(node);
15+
this.type = 'multiArrow';
16+
}
17+
18+
applyFuncToStorkeGeometry(coords, func) {
19+
console.log('coords: ', coords);
20+
let v = coords.map((t) => t.map((s) => new Point(s.x, s.y)));
21+
22+
let s = [];
23+
for (let i = 0; i < coords.length; i=i+2) {
24+
const vt = coords[i].map((t) => new Point(t.x, t.y));
25+
delete v[i];
26+
const v1 = vt.slice(0, 20);
27+
const v2 = vt.slice(25,45);
28+
const v3 = vt.slice(50);
29+
s.unshift(v3,v2, v1);
30+
}
31+
32+
s=s.filter((t)=>t.length!==0)
33+
v=v.filter((t)=>t)
34+
35+
s = s.concat(v);
36+
return s;
37+
}
1138

12-
export default class MultiArrowGeometry extends BaseIrregularElement{
13-
constructor(node) {
14-
super(node);
15-
this.type='multiArrow';
16-
}
17-
_insertGeometry(points){
18-
const mutiArrow=new MultiArrow({
19-
ctrlpnts: points,
20-
})
21-
return [mutiArrow.calculate()]
39+
_insertGeometry(points) {
40+
const mutiArrow = new MultiArrow({
41+
ctrlpnts: points
42+
});
43+
return mutiArrow.calculate();
2244
}
23-
}
45+
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
/*
22
* @Author: your name
33
* @Date: 2021-10-18 10:17:39
4-
* @LastEditTime: 2022-06-13 14:48:35
4+
* @LastEditTime: 2022-06-21 11:17:52
55
* @LastEditors: zk
66
* @Description: In User Settings Edit
77
* @FilePath: \MapGISPlotBase\src\base\SvgLoader\element\IrregularElement\Arrow\SimpleArrow.js
88
*/
9-
import BaseIrregularElement from "../BaseIrregularElement";
109
import AttackArrow from "../../../../../PlotUtilBase/Geometry/Arrow/Attack_Arrow";
1110
import Point from "../../../../../PlotUtilBase/Geometry/Point";
11+
import BaseArrowGeometry from "./BaseArrowGeometry";
1212

13-
export default class SimpleArrowGeometry extends BaseIrregularElement {
13+
export default class SimpleArrowGeometry extends BaseArrowGeometry {
1414
constructor(node) {
1515
super(node);
1616
this.type = "singlearrow";
1717
}
1818
_insertGeometry(points) {
1919
const pnts = points.map((s) => [s.x, s.y]);
2020
const exPnts = new AttackArrow(pnts).getPoints();
21-
const exPoints = exPnts.map((s) => new Point(s[0], s[1]));
22-
return [exPoints];
21+
const exPoints = exPnts.map((t) => t.map((s) => new Point(s[0], s[1])));
22+
return exPoints;
2323
}
2424
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
/*
22
* @Author: your name
33
* @Date: 2021-11-09 10:38:10
4-
* @LastEditTime: 2022-06-13 14:48:40
4+
* @LastEditTime: 2022-06-21 11:15:48
55
* @LastEditors: zk
66
* @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
77
* @FilePath: \MapGISPlotBase\src\base\SvgLoader\element\IrregularElement\Arrow\SquadArrow.js
88
*/
9-
import BaseIrregularElement from "../BaseIrregularElement";
109
import SquadArrow from "../../../../../PlotUtilBase/Geometry/Arrow/Squad_Arrow";
1110
import Point from "../../../../../PlotUtilBase/Geometry/Point";
11+
import BaseArrowGeometry from "./BaseArrowGeometry";
1212

13-
export default class SquadArrowGeometry extends BaseIrregularElement {
13+
export default class SquadArrowGeometry extends BaseArrowGeometry {
1414
constructor(node) {
1515
super(node);
1616
this.type = 'squadarrow';
@@ -19,7 +19,7 @@ export default class SquadArrowGeometry extends BaseIrregularElement {
1919
_insertGeometry(points) {
2020
const pnts = points.map((s) => [s.x, s.y])
2121
const exPnts = new SquadArrow(pnts).getPoints();
22-
const exPoints = exPnts.map((s) => new Point(s[0], s[1]))
23-
return [exPoints]
22+
const exPoints = exPnts.map((t) => t.map((s) => new Point(s[0], s[1])));
23+
return exPoints
2424
}
2525
}
Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
/*
22
* @Author: your name
33
* @Date: 2021-11-09 10:38:10
4-
* @LastEditTime: 2022-06-17 15:42:37
4+
* @LastEditTime: 2022-06-21 11:11:08
55
* @LastEditors: zk
66
* @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
77
* @FilePath: \MapGISPlotBase\src\base\SvgLoader\element\IrregularElement\Arrow\SquadArrow.js
88
*/
9-
import BaseIrregularElement from "../BaseIrregularElement";
10-
import TailedSquadArrow from "../../../../../PlotUtilBase/Geometry/Arrow/Tailed_Squad_Arrow";
11-
import Point from "../../../../../PlotUtilBase/Geometry/Point";
9+
import TailedSquadArrow from '../../../../../PlotUtilBase/Geometry/Arrow/Tailed_Squad_Arrow';
10+
import Point from '../../../../../PlotUtilBase/Geometry/Point';
11+
import BaseArrowGeometry from './BaseArrowGeometry';
1212

13-
export default class TailedSquadArrowGeometry extends BaseIrregularElement {
14-
constructor(node) {
15-
super(node);
16-
this.type = 'tailedsquadarrow';
17-
}
13+
export default class TailedSquadArrowGeometry extends BaseArrowGeometry {
14+
constructor(node) {
15+
super(node);
16+
this.type = 'tailedsquadarrow';
17+
}
1818

19-
_insertGeometry(points) {
20-
const pnts = points.map((s) => [s.x, s.y])
21-
const exPnts = new TailedSquadArrow(pnts).getPoints();
22-
const exPoints = exPnts.map((s) => new Point(s[0], s[1]))
23-
return [exPoints]
24-
}
25-
}
19+
_insertGeometry(points) {
20+
const pnts = points.map((s) => [s.x, s.y]);
21+
const exPnts = new TailedSquadArrow(pnts).getPoints();
22+
const exPoints = exPnts.map((t) => t.map((s) => new Point(s[0], s[1])));
23+
return exPoints;
24+
}
25+
}

0 commit comments

Comments
 (0)