From 1ebf37664b0574c7e2e92890ef58c3e7a48a6639 Mon Sep 17 00:00:00 2001 From: Andrea Gottsponer <ago@attr.ch> Date: Sat, 17 Sep 2022 22:03:48 +0200 Subject: [PATCH] - fix fill line when point is already in polygon --- src/app/index.ts | 36 ++++- src/lib/elements/connections/Line.ts | 132 +++++++++++------- .../elements/connections/LineControlPoint.ts | 6 +- src/lib/elements/connections/LineCorner.ts | 18 +-- 4 files changed, 130 insertions(+), 62 deletions(-) diff --git a/src/app/index.ts b/src/app/index.ts index 77820b8a..16a43c9a 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -637,7 +637,7 @@ async function setupImageObjects() { primitives: [] }); image.addChild(testPoint); - // -- Test point + // -- Test 2 point const test2Point = new MedsurfDraw.PositionPoint({ id: 'test2Point', type: Models.ImageObjectType.POSITIONPOINT, @@ -652,6 +652,21 @@ async function setupImageObjects() { primitives: [] }); image.addChild(test2Point); + // -- Test 3 point + const test3Point = new MedsurfDraw.PositionPoint({ + id: 'test3Point', + type: Models.ImageObjectType.POSITIONPOINT, + isStatic: false, + zIndex: 0, + position: { + x: 150 / image.dimensions.width, + y: 150 / image.dimensions.width, + }, + isSelftest: true, + selftestItems: ['rectanglePoint'], + primitives: [] + }); + image.addChild(test3Point); // -- Test point const test17Point = new MedsurfDraw.PositionPoint({ id: 'test17Point', @@ -936,6 +951,25 @@ async function setupImageObjects() { }); image.addChild(fillLine); elementsArray['fillLine'] = fillLine; + // -- FillLine2 + const fillLine2 = new MedsurfDraw.Line({ + id: 'fillLine2', + type: Models.ImageObjectType.LINE, + isStatic: false, + zIndex: 0, + start: 'test3Point', + end: 'fill1', + isBezier: true, + strokeWidth: 1 / image.dimensions.width, + interactWithLines: false, + options: { + hasLine: true, + lineColor: 0xFFFFFF, + hasFill: false, + } + }); + image.addChild(fillLine2); + elementsArray['fillLine2'] = fillLine2; // -- Legend model const legendCollectionModel: Models.LegendCollection = { id: 'legend', diff --git a/src/lib/elements/connections/Line.ts b/src/lib/elements/connections/Line.ts index 211d2bd6..28b2f830 100644 --- a/src/lib/elements/connections/Line.ts +++ b/src/lib/elements/connections/Line.ts @@ -15,6 +15,7 @@ import {debounce} from "debounce"; * Line types */ export enum LineTypes { + NOT_INITIALIZED, LINEAR, QUADRATIC, BEZIER, @@ -202,9 +203,7 @@ export class Line extends BaseElementContainer<Models.Line, BaseElementContainer // Members this.start = image.getChildByName(this.model.start) as BaseElementContainer<Models.ImageObject, BaseElementContainerModel<Models.ImageObject>>; - // TODO: this.start = image.children.find((c) => c.name === this.model.start) as BaseElementContainer<Models.ImageObject, BaseElementContainerModel<Models.ImageObject>>; this.end = image.getChildByName(this.model.end) as BaseElementContainer<Models.ImageObject, BaseElementContainerModel<Models.ImageObject>>; - // TODO: this.end = image.children.find((c) => c.name === this.model.end) as BaseElementContainer<Models.ImageObject, BaseElementContainerModel<Models.ImageObject>>; // Events if (this.start instanceof MedsurfDraw.PositionPoint) { @@ -231,6 +230,32 @@ export class Line extends BaseElementContainer<Models.Line, BaseElementContainer } this.end.on("removed", this.onButtonDelete, this); + //<editor-fold desc="Elements"> + // -- Line corner element + this._lineCornerElement = new MedsurfDraw.LineCorner({ + points: undefined, + options: Object.assign({}, this.model.options), + lineWidth: Math.round(this.model.strokeWidth * this.getImageDimensions().width * 100) / 100, + }); + this.addChild(this._lineCornerElement); + // -- Line control point element + this._lineControlPointElement = new MedsurfDraw.LineControlPoint({ + points: undefined, + options: { + hasLine: true, + lineColor: Design.line.bezierLineColor, + lineAlpha: Design.line.bezierLineAlpha, + hasFill: true, + fillColor: Design.line.bezierPointColor, + fillAlpha: Design.line.bezierPointAlpha + }, + lineWidth: Design.line.bezierLineWidth, + radius: Design.line.bezierPointRadius + }); + this._lineControlPointElement.hideItem(); + this.addChild(this._lineControlPointElement); + //</editor-fold> + //<editor-fold desc="Menu elements"> //<editor-fold desc="Edit"> // -- Edit button element @@ -440,7 +465,7 @@ export class Line extends BaseElementContainer<Models.Line, BaseElementContainer public draw(): void { // Elements // -- Line element - if (this._lineElement) { + if (this._lineElement || this.type === LineTypes.NOT_INITIALIZED) { // Store type const oldType = this.type; @@ -457,7 +482,10 @@ export class Line extends BaseElementContainer<Models.Line, BaseElementContainer if (this.type !== oldType) { // Elements // -- Line element - this._lineElement.destroy(); + if (this._lineElement) { + this._lineElement.destroy(); + } + // Get line object const result = this._getLineObject(points); @@ -467,16 +495,35 @@ export class Line extends BaseElementContainer<Models.Line, BaseElementContainer } } else { // -- Line element - this._lineElement.points = points; + if (this._lineElement) { + this._lineElement.points = points; + } } - this._lineElement.renderable = true; - this._lineElement.draw(); + // Elements + // -- Line element + if (this._lineElement) { + this._lineElement.draw(); + } + // -- Line corner element + this._lineCornerElement.renderable = true; + // -- Line control point element + this._lineControlPointElement.renderable = true; } else { // Elements // -- Line element if (this._lineElement) { - this._lineElement.renderable = false; + this._lineElement.destroy(); + delete this._lineElement; + this.type = LineTypes.NOT_INITIALIZED; + } + // -- Line corner element + if (this._lineCornerElement) { + this._lineCornerElement.renderable = false; + } + // -- Line control point element + if (this._lineControlPointElement) { + this._lineControlPointElement.renderable = false; } } } @@ -696,7 +743,7 @@ export class Line extends BaseElementContainer<Models.Line, BaseElementContainer return; } - this.type = LineTypes.LINEAR; + this.type = LineTypes.NOT_INITIALIZED; this.direction = LineDirection.START_END; this.controlStart = null; this.controlEnd = null; @@ -718,6 +765,7 @@ export class Line extends BaseElementContainer<Models.Line, BaseElementContainer // No matching control points const points = this._getStraightLinePointsModel(this.start, this.end); if (points) { + this.type = LineTypes.LINEAR; return points; } } @@ -751,6 +799,7 @@ export class Line extends BaseElementContainer<Models.Line, BaseElementContainer // Straight line const points = this._getStraightLinePointsModel(this.start, this.end); if (points) { + this.type = LineTypes.LINEAR; return points; } } @@ -1106,45 +1155,32 @@ export class Line extends BaseElementContainer<Models.Line, BaseElementContainer */ protected _removeModeInit(): void { // Elements - const points = this._getLinePointsModel(); - if (!points) { - return; - } - const result = this._getLineObject(points); - if (result) { - // -- Line element - this._lineElement = result; - this.addChild(this._lineElement); - // -- Line corner element - this._lineCornerElement = new MedsurfDraw.LineCorner({ - points: result.points, - options: Object.assign({}, this.model.options), - lineWidth: Math.round(this.model.strokeWidth * this.getImageDimensions().width * 100) / 100, - }); - this.addChild(this._lineCornerElement); - // -- Line control point element - this._lineControlPointElement = new MedsurfDraw.LineControlPoint({ - points: result.points, - options: { - hasLine: true, - lineColor: Design.line.bezierLineColor, - lineAlpha: Design.line.bezierLineAlpha, - hasFill: true, - fillColor: Design.line.bezierPointColor, - fillAlpha: Design.line.bezierPointAlpha - }, - lineWidth: Design.line.bezierLineWidth, - radius: Design.line.bezierPointRadius - }); - this._lineControlPointElement.hideItem(); - this.addChild(this._lineControlPointElement); - } + try { + const points = this._getLinePointsModel(); + if (!points) { + return; + } + const result = this._getLineObject(points); + if (result) { + // -- Line element + this._lineElement = result; + this.addChild(this._lineElement); + // -- Line corner element + this._lineCornerElement.points = result.points; + // -- Line control point element + this._lineControlPointElement.points = result.points; + } - // Sort items - this.sortChildren(); + // Sort items + this.sortChildren(); - // Draw - this.emit("debounceDraw"); + // Draw + this.emit("debounceDraw"); + } + catch (e) { + this.type = LineTypes.NOT_INITIALIZED; + this.emit("debounceDraw"); + } } /** @@ -2218,10 +2254,6 @@ export class Line extends BaseElementContainer<Models.Line, BaseElementContainer * TODO return linetype so we can compare ??? */ public onPointUpdate(): void { - if (!this._lineElement) { - return; - } - // Draw this.draw(); } diff --git a/src/lib/elements/connections/LineControlPoint.ts b/src/lib/elements/connections/LineControlPoint.ts index ff2851ca..8270fb4b 100644 --- a/src/lib/elements/connections/LineControlPoint.ts +++ b/src/lib/elements/connections/LineControlPoint.ts @@ -6,7 +6,7 @@ import {StraightLinePointsModel, BezierLinePointsModel, QuadraticCurvePointsMode * Line control point model */ export class LineControlPointModel extends BaseGraphicsModel { - points: StraightLinePointsModel | QuadraticCurvePointsModel | BezierLinePointsModel; + points: StraightLinePointsModel | QuadraticCurvePointsModel | BezierLinePointsModel | undefined; options: Models.ElementOptions; lineWidth: number; radius: number; @@ -82,7 +82,7 @@ export class LineControlPoint extends BaseGraphics<LineControlPointModel> { /** * Get points */ - public get points(): StraightLinePointsModel | QuadraticCurvePointsModel | BezierLinePointsModel { + public get points(): StraightLinePointsModel | QuadraticCurvePointsModel | BezierLinePointsModel | undefined { return this.data.points; } @@ -90,7 +90,7 @@ export class LineControlPoint extends BaseGraphics<LineControlPointModel> { * Set points * @param value */ - public set points(value: StraightLinePointsModel | QuadraticCurvePointsModel | BezierLinePointsModel) { + public set points(value: StraightLinePointsModel | QuadraticCurvePointsModel | BezierLinePointsModel | undefined) { this.data.points = value; } diff --git a/src/lib/elements/connections/LineCorner.ts b/src/lib/elements/connections/LineCorner.ts index b67639d3..281cf602 100644 --- a/src/lib/elements/connections/LineCorner.ts +++ b/src/lib/elements/connections/LineCorner.ts @@ -6,7 +6,7 @@ import {BaseGraphics, BaseGraphicsModel} from "../../bases/elements/BaseGraphics * Line corner model */ export class LineCornerModel extends BaseGraphicsModel { - points: MedsurfDraw.StraightLinePointsModel | MedsurfDraw.QuadraticCurvePointsModel | MedsurfDraw.BezierLinePointsModel; + points: MedsurfDraw.StraightLinePointsModel | MedsurfDraw.QuadraticCurvePointsModel | MedsurfDraw.BezierLinePointsModel | undefined; options: Models.ElementOptions; lineWidth: number } @@ -47,19 +47,21 @@ export class LineCorner extends BaseGraphics<LineCornerModel> { this.clear(); // Draw corner - this.lineStyle(this.lineWidth / 2, this.options.lineColor, this.options.lineAlpha); - this.beginFill(this.options.lineColor, this.options.lineAlpha); - this.drawCircle(this.points.start.x, this.points.start.y, this.lineWidth / 4); - this.drawCircle(this.points.end.x, this.points.end.y, this.lineWidth / 4); + if (this.points) { + this.lineStyle(this.lineWidth / 2, this.options.lineColor, this.options.lineAlpha); + this.beginFill(this.options.lineColor, this.options.lineAlpha); + this.drawCircle(this.points.start.x, this.points.start.y, this.lineWidth / 4); + this.drawCircle(this.points.end.x, this.points.end.y, this.lineWidth / 4); - this.endFill(); + this.endFill(); + } } //<editor-fold desc="Getter and Setter"> /** * Get points */ - public get points(): MedsurfDraw.StraightLinePointsModel { + public get points(): MedsurfDraw.StraightLinePointsModel | MedsurfDraw.QuadraticCurvePointsModel | MedsurfDraw.BezierLinePointsModel | undefined { return this.data.points; } @@ -67,7 +69,7 @@ export class LineCorner extends BaseGraphics<LineCornerModel> { * Set points * @param value */ - public set points(value: MedsurfDraw.StraightLinePointsModel) { + public set points(value: MedsurfDraw.StraightLinePointsModel | MedsurfDraw.QuadraticCurvePointsModel | MedsurfDraw.BezierLinePointsModel | undefined) { this.data.points = value; } -- GitLab