import { Attrib, ShapeType } from "../../../type";
import { DEV } from "../../../env";
import { WholeLinePointHelper, WholeLineLineHelper } from "../helper";
import { WholeLinePoint, WholeLinePointAttrib } from "./whole-line-point";
import { WholeLineLine, WholeLineLineAttrib } from "./whole-line-line";
import { WholeLinePolygon, WholeLinePolygonAttrib } from "./whole-line-polygon";
import { Group } from "konva/lib/Group";
import { Entity, EntityProps } from "../../entity";
import {
IncEntitysFactory,
incEntitysFactoryGenerate,
} from "../../../shared/entity-utils";
import { watch } from "vue";
export type WholeLineAttrib<
P extends WholeLinePointAttrib = WholeLinePointAttrib,
L extends WholeLineLineAttrib = WholeLineLineAttrib,
PY extends WholeLinePolygonAttrib = WholeLinePolygonAttrib
> = Attrib & {
points: P[];
lines: L[];
polygons: PY[];
};
export type WholeLineProps<
W extends WholeLineAttrib
,
P extends WholeLinePointAttrib = WholeLinePointAttrib,
L extends WholeLineLineAttrib = WholeLineLineAttrib,
PY extends WholeLinePolygonAttrib = WholeLinePolygonAttrib
> = EntityProps;
export type WLP = W extends WholeLineAttrib
? P
: never;
export type WLL = W extends WholeLineAttrib<
WholeLinePointAttrib,
infer L
>
? L
: never;
export type WLPY = W extends WholeLineAttrib<
WholeLinePointAttrib,
WholeLineLineAttrib,
infer PY
>
? PY
: never;
export class WholeLine<
W extends WholeLineAttrib = WholeLineAttrib,
PS extends ShapeType = ShapeType,
LS extends ShapeType = ShapeType,
PYS extends ShapeType = ShapeType
> extends Entity {
static namespace = "whole-line";
incLinesFactory: IncEntitysFactory, WholeLineLine, LS>>;
incPointsFactory: IncEntitysFactory, WholeLinePoint, PS>>;
incPolygonFactory: IncEntitysFactory, WholeLinePolygon, PYS>>;
private incLinesHelperFactory: IncEntitysFactory<
WholeLineLineAttrib,
WholeLineLineHelper
>;
private incPointsHelperFactory?: IncEntitysFactory<
WholeLinePointAttrib,
WholeLinePointHelper
>;
constructor(props: WholeLineProps) {
props.name = props.name || WholeLine.namespace + props.attrib.id;
super(props);
}
initIncFactory() {
this.incLinesFactory = incEntitysFactoryGenerate(
WholeLineLine, LS>,
this,
(line) => {
line.setConfig(this.attrib);
}
);
this.incPointsFactory = incEntitysFactoryGenerate(
WholeLinePoint, PS>,
this
);
this.incPolygonFactory = incEntitysFactoryGenerate(
WholeLinePolygon, PYS>,
this
);
if (DEV) {
this.incLinesHelperFactory = incEntitysFactoryGenerate(
WholeLineLineHelper,
this,
(line) => {
line.setConfig(this.attrib);
}
);
this.incPointsHelperFactory = incEntitysFactoryGenerate(
WholeLinePointHelper,
this
);
this.incPointsHelperFactory = incEntitysFactoryGenerate(
WholeLinePointHelper,
this
);
}
}
init() {
this.initIncFactory();
super.init();
}
initShape() {
return new Group({ id: this.name });
}
getRedrawLines() {
// 去重 防止来回线段绘画两次
const lines: WLL[] = [];
for (let i = this.attrib.lines.length - 1; i >= 0; i--) {
const a = this.attrib.lines[i];
let j = 0;
for (j = 0; j < i; j++) {
const b = this.attrib.lines[j];
if (
b.pointIds.includes(a.pointIds[0]) &&
b.pointIds.includes(a.pointIds[1])
) {
break;
}
}
if (i === j) {
lines.push(a as WLL);
}
}
return lines;
}
diffRedraw() {
const lineAttribs = this.getRedrawLines();
if (DEV) {
this.incLinesHelperFactory(lineAttribs);
this.incPointsHelperFactory(this.attrib.points);
}
const pointEntityInc = this.incPointsFactory(this.attrib.points as any);
const lineEntityInc = this.incLinesFactory(lineAttribs);
const polygonEntityInc = this.incPolygonFactory(
this.attrib.polygons as any
);
return { lineEntityInc, pointEntityInc, polygonEntityInc };
}
initReactive() {
return watch(
() => ({
pointIds: this.attrib.points.map(({ id }) => id),
lineIds: this.attrib.lines.map(({ id }) => id),
}),
this.diffRedraw.bind(this),
{ immediate: true, flush: "sync" }
);
}
}