From 45f7d463d647d6535a685fc72afa8b3f15cebe43 Mon Sep 17 00:00:00 2001
From: Andrea Gottsponer <ago@attr.ch>
Date: Tue, 25 Oct 2022 11:38:58 +0200
Subject: [PATCH] - add back scale for primitive generators - setup correct
 behaviour for generators - scale fixes

---
 src/app/index.ts                              | 505 ++++++++++++++++--
 src/lib/elements/primitives/ArrowPrimitive.ts |  13 +-
 .../elements/primitives/EllipsePrimitive.ts   |  11 +-
 .../elements/primitives/RectanglePrimitive.ts |  11 +-
 src/lib/elements/primitives/TextPrimitive.ts  |   1 +
 .../generators/combinations/ArrowGenerator.ts |   2 +
 .../combinations/EllipseGenerator.ts          |   2 +
 .../combinations/InteractiveAreaGenerator.ts  |   1 +
 .../combinations/MarkerGenerator.ts           |   1 +
 .../combinations/PrimitiveMarkerGenerator.ts  |   4 +
 .../combinations/RectangleGenerator.ts        |   2 +
 .../primitives/ArrowPrimitiveGenerator.ts     |  71 ++-
 .../primitives/EllipsePrimitiveGenerator.ts   |  71 ++-
 .../primitives/RectanglePrimitiveGenerator.ts |  71 ++-
 .../primitives/TextPrimitiveGenerator.ts      |  71 ++-
 src/lib/interactions/ScaleInteraction.ts      |  80 ++-
 16 files changed, 705 insertions(+), 212 deletions(-)

diff --git a/src/app/index.ts b/src/app/index.ts
index 999c4d37..0ec157b5 100644
--- a/src/app/index.ts
+++ b/src/app/index.ts
@@ -317,6 +317,7 @@ async function setupImage() {
             layerGroup: layerGroupsArray['sketch'],
             image: {},
             rotateWithLine: false,
+            withScaling: false,
             triggerImmediateEndDraw: true
         });
         // @ts-ignore
@@ -576,6 +577,7 @@ async function setupImageObjects() {
     //</editor-fold>
 
     //<editor-fold desc="Elements">
+    //<editor-fold desc="Tests">
     /**/
     // -- Arrow point
     const arrowPoint = new MedsurfDraw.PositionPoint(image, {
@@ -1096,7 +1098,9 @@ async function setupImageObjects() {
     image.addChild(legend);
     elementsArray['legend'] = legend;
     /**/
+    //</editor-fold>
     // TEST LINE
+    //<editor-fold desc="Real Test">
     // -- Real Point 1
     const realPoint1 = new MedsurfDraw.PositionPoint(image, {
         id: 'realPoint1',
@@ -1214,65 +1218,454 @@ async function setupImageObjects() {
     realPoint2.model.primitives.push(realText1.model);
     realPoint2.addChild(realText1);
     //</editor-fold>
-
-    // TEST ------------------------------------------------------------------------------------------------------------
-    const test = new PIXI.Graphics();
-    test.name = "test_menu";
-    test.clear();
-    test.beginFill(0xff0000, 1);
-    test.drawCircle(0, 0, 30);
-    test.endFill();
-    image.moveInteraction.on("onMove", (event: PIXI.InteractionEvent, dX: number, dY: number): void => {
-        /**/
-        test.position.x += dX;
-        test.position.y += dY;
-        /**/
+    // TEST Primitives
+    //<editor-fold desc="Scale Test">
+    //<editor-fold desc="Ellipse Primitive">
+    //<editor-fold desc="Test 1">
+    // -- ellipse Primitive Test Point 1
+    const ellipsePrimitiveTestPoint1 = new MedsurfDraw.PositionPoint(image, {
+        id: 'ellipsePrimitiveTestPoint1',
+        type: Models.ImageObjectType.POSITIONPOINT,
+        isStatic: false,
+        zIndex: 0,
+        position: {
+            x: 800 / image.dimensions.width,
+            y: 100 / image.dimensions.width,
+        },
+        isSelftest: true,
+        selftestItems: [],
+        primitives: []
     });
-    /**/
-    image.zoomInteraction.on('onZoom', (dX: number, dY: number): void => {
-        /*
-        console.log(test.name, test.parent);
-        const imageGlobalPos = image.getGlobalPosition();
-        // const bla = image.getGlobalPosition(new PIXI.Point(300, 500));
-        const imagePos = image.position;
-        const imageScale = image.scale;
-        const testPos = test.position;
-        console.log(imageGlobalPos, imagePos, imagePos, testPos);
-        */
-
-        /** /
-        dX = imagePos.x - testPos.x;
-        dY = imagePos.y - testPos.y;
-        /** /
-        /** /
-        test.position.x += imagePos.x - testPos.x + 300;
-        test.position.y += imagePos.y - testPos.y + 500;
-        /**/
-        /* TODO WHY does it zoom the object ??? * /
-        console.log(dX, dY);
-        if (dX && dY) {
-            test.position.x += dX;
-            test.position.y += dY;
+    image.addChild(ellipsePrimitiveTestPoint1);
+    // -- ellipse Primitive Test 1
+    const ellipsePrimitiveTest1 = new MedsurfDraw.EllipsePrimitive(image, {
+        id: 'ellipsePrimitiveTest1',
+        type: Models.ImageObjectType.ELLIPSE,
+        isStatic: false,
+        zIndex: 0,
+        positionPoint: ellipsePrimitiveTestPoint1.model,
+        rotateWithLine: false,
+        ellipse: new PIXI.Ellipse(
+            0,
+            0,
+            20 / image.dimensions.width,
+            20 / image.dimensions.width
+        ),
+        strokeWidth: 1 / image.dimensions.width,
+        options: {
+            hasLine: true,
+            lineColor: 0x000000,
+            hasFill: true,
+            fillColor: 0x00FF00,
+            fillAlpha: 0.6
         }
-         */
-        test.position.set(imagePos.x + 300 * imageScale.x, imagePos.y + 500 * imageScale.y);
-        // container.position.set(imagePos.x, imagePos.y);
-        /**/
-        // test.position.set(image.position.x - 300, image.position.y - 500);
-        /**/
     });
-    /**/
-    // container
-    const imageGlobalPos = image.getGlobalPosition();
-    const imagePos = image.position;
-    const imageScale = image.scale;
-    // const container = new PIXI.Container();
-    test.position.set(imagePos.x + 300 * imageScale.x, imagePos.y + 500 * imageScale.x);
-    // container.position.set(imageGlobalPos.x, imageGlobalPos.y);
-    // container.addChild(test);
-    // stage
-    app.stage.addChild(test);
-    // TEST ------------------------------------------------------------------------------------------------------------
+    // @ts-ignore
+    ellipsePrimitiveTestPoint1.model.primitives.push(ellipsePrimitiveTest1.model);
+    ellipsePrimitiveTestPoint1.addChild(ellipsePrimitiveTest1);
+    //</editor-fold>
+    //<editor-fold desc="Test 2">
+    // -- ellipse Primitive Test Point 2
+    const ellipsePrimitiveTestPoint2 = new MedsurfDraw.PositionPoint(image, {
+        id: 'ellipsePrimitiveTestPoint2',
+        type: Models.ImageObjectType.POSITIONPOINT,
+        isStatic: false,
+        zIndex: 0,
+        position: {
+            x: 800 / image.dimensions.width,
+            y: 200 / image.dimensions.width,
+        },
+        isSelftest: true,
+        selftestItems: [],
+        primitives: []
+    });
+    image.addChild(ellipsePrimitiveTestPoint2);
+    // -- ellipse Primitive Test 2
+    const ellipsePrimitiveTest2 = new MedsurfDraw.EllipsePrimitive(image, {
+        id: 'ellipsePrimitiveTest2',
+        type: Models.ImageObjectType.ELLIPSE,
+        isStatic: false,
+        zIndex: 0,
+        positionPoint: ellipsePrimitiveTestPoint2.model,
+        rotateWithLine: false,
+        ellipse: new PIXI.Ellipse(
+            0,
+            0,
+            20 / image.dimensions.width,
+            20 / image.dimensions.width
+        ),
+        angle: 0.7853982,
+        strokeWidth: 1 / image.dimensions.width,
+        options: {
+            hasLine: true,
+            lineColor: 0x000000,
+            hasFill: true,
+            fillColor: 0x00FF00,
+            fillAlpha: 0.6
+        }
+    });
+    // @ts-ignore
+    ellipsePrimitiveTestPoint2.model.primitives.push(ellipsePrimitiveTest2.model);
+    ellipsePrimitiveTestPoint2.addChild(ellipsePrimitiveTest2);
+    //</editor-fold>
+    //<editor-fold desc="Test 3">
+    // -- ellipse Primitive Test Point 3
+    const ellipsePrimitiveTestPoint3 = new MedsurfDraw.PositionPoint(image, {
+        id: 'ellipsePrimitiveTestPoint3',
+        type: Models.ImageObjectType.POSITIONPOINT,
+        isStatic: false,
+        zIndex: 0,
+        position: {
+            x: 800 / image.dimensions.width,
+            y: 300 / image.dimensions.width,
+        },
+        isSelftest: true,
+        selftestItems: [],
+        primitives: []
+    });
+    image.addChild(ellipsePrimitiveTestPoint3);
+    // -- ellipse Primitive Test 3
+    const ellipsePrimitiveTest3 = new MedsurfDraw.EllipsePrimitive(image, {
+        id: 'ellipsePrimitiveTest3',
+        type: Models.ImageObjectType.ELLIPSE,
+        isStatic: false,
+        zIndex: 0,
+        positionPoint: ellipsePrimitiveTestPoint3.model,
+        rotateWithLine: false,
+        ellipse: new PIXI.Ellipse(
+            10 / image.dimensions.width,
+            10 / image.dimensions.width,
+            20 / image.dimensions.width,
+            20 / image.dimensions.width
+        ),
+        strokeWidth: 1 / image.dimensions.width,
+        options: {
+            hasLine: true,
+            lineColor: 0x000000,
+            hasFill: true,
+            fillColor: 0x00FF00,
+            fillAlpha: 0.6
+        }
+    });
+    // @ts-ignore
+    ellipsePrimitiveTestPoint3.model.primitives.push(ellipsePrimitiveTest3.model);
+    ellipsePrimitiveTestPoint3.addChild(ellipsePrimitiveTest3);
+    //</editor-fold>
+    //</editor-fold>
+    //<editor-fold desc="Rectangle Primitive">
+    //<editor-fold desc="Test 1">
+    // -- rectangle Primitive Test Point 1
+    const rectanglePrimitiveTestPoint1 = new MedsurfDraw.PositionPoint(image, {
+        id: 'rectanglePrimitiveTestPoint1',
+        type: Models.ImageObjectType.POSITIONPOINT,
+        isStatic: false,
+        zIndex: 0,
+        position: {
+            x: 900 / image.dimensions.width,
+            y: 100 / image.dimensions.width,
+        },
+        isSelftest: true,
+        selftestItems: [],
+        primitives: []
+    });
+    image.addChild(rectanglePrimitiveTestPoint1);
+    // -- rectangle Primitive Test 1
+    const rectanglePrimitiveTest1 = new MedsurfDraw.RectanglePrimitive(image, {
+        id: 'rectanglePrimitiveTest1',
+        type: Models.ImageObjectType.RECTANGLE,
+        isStatic: false,
+        zIndex: 0,
+        positionPoint: rectanglePrimitiveTestPoint1.model,
+        rotateWithLine: false,
+        rectangle: new PIXI.Rectangle(
+            0,
+            0,
+            40 / image.dimensions.width,
+            40 / image.dimensions.width
+        ),
+        strokeWidth: 1 / image.dimensions.width,
+        options: {
+            hasLine: true,
+            lineColor: 0x000000,
+            hasFill: true,
+            fillColor: 0x00FF00,
+            fillAlpha: 0.6
+        }
+    });
+    // @ts-ignore
+    rectanglePrimitiveTestPoint1.model.primitives.push(rectanglePrimitiveTest1.model);
+    rectanglePrimitiveTestPoint1.addChild(rectanglePrimitiveTest1);
+    //</editor-fold>
+    //<editor-fold desc="Test 2">
+    // -- rectangle Primitive Test Point 2
+    const rectanglePrimitiveTestPoint2 = new MedsurfDraw.PositionPoint(image, {
+        id: 'rectanglePrimitiveTestPoint2',
+        type: Models.ImageObjectType.POSITIONPOINT,
+        isStatic: false,
+        zIndex: 0,
+        position: {
+            x: 900 / image.dimensions.width,
+            y: 200 / image.dimensions.width,
+        },
+        isSelftest: true,
+        selftestItems: [],
+        primitives: []
+    });
+    image.addChild(rectanglePrimitiveTestPoint2);
+    // -- rectangle Primitive Test 2
+    const rectanglePrimitiveTest2 = new MedsurfDraw.RectanglePrimitive(image, {
+        id: 'rectanglePrimitiveTest2',
+        type: Models.ImageObjectType.RECTANGLE,
+        isStatic: false,
+        zIndex: 0,
+        positionPoint: rectanglePrimitiveTestPoint2.model,
+        rotateWithLine: false,
+        rectangle: new PIXI.Rectangle(
+            0,
+            0,
+            40 / image.dimensions.width,
+            40 / image.dimensions.width
+        ),
+        angle: 0.7853982,
+        strokeWidth: 1 / image.dimensions.width,
+        options: {
+            hasLine: true,
+            lineColor: 0x000000,
+            hasFill: true,
+            fillColor: 0x00FF00,
+            fillAlpha: 0.6
+        }
+    });
+    // @ts-ignore
+    rectanglePrimitiveTestPoint2.model.primitives.push(rectanglePrimitiveTest2.model);
+    rectanglePrimitiveTestPoint2.addChild(rectanglePrimitiveTest2);
+    //</editor-fold>
+    //<editor-fold desc="Test 3">
+    // -- rectangle Primitive Test Point 3
+    const rectanglePrimitiveTestPoint3 = new MedsurfDraw.PositionPoint(image, {
+        id: 'rectanglePrimitiveTestPoint3',
+        type: Models.ImageObjectType.POSITIONPOINT,
+        isStatic: false,
+        zIndex: 0,
+        position: {
+            x: 900 / image.dimensions.width,
+            y: 300 / image.dimensions.width,
+        },
+        isSelftest: true,
+        selftestItems: [],
+        primitives: []
+    });
+    image.addChild(rectanglePrimitiveTestPoint3);
+    // -- rectangle Primitive Test 3
+    const rectanglePrimitiveTest3 = new MedsurfDraw.RectanglePrimitive(image, {
+        id: 'rectanglePrimitiveTest3',
+        type: Models.ImageObjectType.RECTANGLE,
+        isStatic: false,
+        zIndex: 0,
+        positionPoint: rectanglePrimitiveTestPoint3.model,
+        rotateWithLine: false,
+        rectangle: new PIXI.Rectangle(
+            10 / image.dimensions.width,
+            10 / image.dimensions.width,
+            40 / image.dimensions.width,
+            40 / image.dimensions.width
+        ),
+        strokeWidth: 1 / image.dimensions.width,
+        options: {
+            hasLine: true,
+            lineColor: 0x000000,
+            hasFill: true,
+            fillColor: 0x00FF00,
+            fillAlpha: 0.6
+        }
+    });
+    // @ts-ignore
+    rectanglePrimitiveTestPoint3.model.primitives.push(rectanglePrimitiveTest3.model);
+    rectanglePrimitiveTestPoint3.addChild(rectanglePrimitiveTest3);
+    //</editor-fold>
+    //</editor-fold>
+    //<editor-fold desc="Arrow Primitive">
+    //<editor-fold desc="Test 1">
+    // -- arrow Primitive Test Point 1
+    const arrowPrimitiveTestPoint1 = new MedsurfDraw.PositionPoint(image, {
+        id: 'arrowPrimitiveTestPoint1',
+        type: Models.ImageObjectType.POSITIONPOINT,
+        isStatic: false,
+        zIndex: 0,
+        position: {
+            x: 1000 / image.dimensions.width,
+            y: 100 / image.dimensions.width,
+        },
+        isSelftest: true,
+        selftestItems: [],
+        primitives: []
+    });
+    image.addChild(arrowPrimitiveTestPoint1);
+    // -- arrow Primitive Test 1
+    const arrowPrimitiveTest1 = new MedsurfDraw.ArrowPrimitive(image, {
+        id: 'arrowPrimitiveTest1',
+        type: Models.ImageObjectType.ARROW,
+        isStatic: false,
+        zIndex: 0,
+        positionPoint: arrowPrimitiveTestPoint1.model,
+        rotateWithLine: false,
+        rectangle: new PIXI.Rectangle(
+            0,
+            0,
+            40 / image.dimensions.width,
+            40 / image.dimensions.width
+        ),
+        strokeWidth: 1 / image.dimensions.width,
+        options: {
+            hasLine: true,
+            lineColor: 0x000000,
+            hasFill: true,
+            fillColor: 0x00FF00,
+            fillAlpha: 0.6
+        }
+    });
+    // @ts-ignore
+    arrowPrimitiveTestPoint1.model.primitives.push(arrowPrimitiveTest1.model);
+    arrowPrimitiveTestPoint1.addChild(arrowPrimitiveTest1);
+    //</editor-fold>
+    //<editor-fold desc="Test 2">
+    // -- arrow Primitive Test Point 2
+    const arrowPrimitiveTestPoint2 = new MedsurfDraw.PositionPoint(image, {
+        id: 'arrowPrimitiveTestPoint2',
+        type: Models.ImageObjectType.POSITIONPOINT,
+        isStatic: false,
+        zIndex: 0,
+        position: {
+            x: 1000 / image.dimensions.width,
+            y: 200 / image.dimensions.width,
+        },
+        isSelftest: true,
+        selftestItems: [],
+        primitives: []
+    });
+    image.addChild(arrowPrimitiveTestPoint2);
+    // -- arrow Primitive Test 2
+    const arrowPrimitiveTest2 = new MedsurfDraw.ArrowPrimitive(image, {
+        id: 'arrowPrimitiveTest2',
+        type: Models.ImageObjectType.ARROW,
+        isStatic: false,
+        zIndex: 0,
+        positionPoint: arrowPrimitiveTestPoint2.model,
+        rotateWithLine: false,
+        rectangle: new PIXI.Rectangle(
+            0,
+            0,
+            40 / image.dimensions.width,
+            40 / image.dimensions.width
+        ),
+        angle: 0.7853982,
+        strokeWidth: 1 / image.dimensions.width,
+        options: {
+            hasLine: true,
+            lineColor: 0x000000,
+            hasFill: true,
+            fillColor: 0x00FF00,
+            fillAlpha: 0.6
+        }
+    });
+    // @ts-ignore
+    arrowPrimitiveTestPoint2.model.primitives.push(arrowPrimitiveTest2.model);
+    arrowPrimitiveTestPoint2.addChild(arrowPrimitiveTest2);
+    //</editor-fold>
+    //<editor-fold desc="Test 3">
+    // -- arrow Primitive Test Point 3
+    const arrowPrimitiveTestPoint3 = new MedsurfDraw.PositionPoint(image, {
+        id: 'arrowPrimitiveTestPoint3',
+        type: Models.ImageObjectType.POSITIONPOINT,
+        isStatic: false,
+        zIndex: 0,
+        position: {
+            x: 1000 / image.dimensions.width,
+            y: 300 / image.dimensions.width,
+        },
+        isSelftest: true,
+        selftestItems: [],
+        primitives: []
+    });
+    image.addChild(arrowPrimitiveTestPoint3);
+    // -- arrow Primitive Test 3
+    const arrowPrimitiveTest3 = new MedsurfDraw.ArrowPrimitive(image, {
+        id: 'arrowPrimitiveTest3',
+        type: Models.ImageObjectType.ARROW,
+        isStatic: false,
+        zIndex: 0,
+        positionPoint: arrowPrimitiveTestPoint3.model,
+        rotateWithLine: false,
+        rectangle: new PIXI.Rectangle(
+            10 / image.dimensions.width,
+            10 / image.dimensions.width,
+            40 / image.dimensions.width,
+            40 / image.dimensions.width
+        ),
+        strokeWidth: 1 / image.dimensions.width,
+        options: {
+            hasLine: true,
+            lineColor: 0x000000,
+            hasFill: true,
+            fillColor: 0x00FF00,
+            fillAlpha: 0.6
+        }
+    });
+    // @ts-ignore
+    arrowPrimitiveTestPoint3.model.primitives.push(arrowPrimitiveTest3.model);
+    arrowPrimitiveTestPoint3.addChild(arrowPrimitiveTest3);
+    //</editor-fold>
+    //</editor-fold>
+    //<editor-fold desc="Text Primitive">
+    // -- text Primitive Test Point 1
+    const textPrimitiveTestPoint1 = new MedsurfDraw.PositionPoint(image, {
+        id: 'textPrimitiveTestPoint1',
+        type: Models.ImageObjectType.POSITIONPOINT,
+        isStatic: false,
+        zIndex: 0,
+        position: {
+            x: 1100 / image.dimensions.width,
+            y: 100 / image.dimensions.width,
+        },
+        isSelftest: true,
+        selftestItems: [],
+        primitives: []
+    });
+    image.addChild(textPrimitiveTestPoint1);
+    // -- text Primitive Test Point 2
+    const textPrimitiveTestPoint2 = new MedsurfDraw.PositionPoint(image, {
+        id: 'textPrimitiveTestPoint2',
+        type: Models.ImageObjectType.POSITIONPOINT,
+        isStatic: false,
+        zIndex: 0,
+        position: {
+            x: 1100 / image.dimensions.width,
+            y: 200 / image.dimensions.width,
+        },
+        isSelftest: true,
+        selftestItems: [],
+        primitives: []
+    });
+    image.addChild(textPrimitiveTestPoint2);
+    // -- text Primitive Test Point 3
+    const textPrimitiveTestPoint3 = new MedsurfDraw.PositionPoint(image, {
+        id: 'textPrimitiveTestPoint3',
+        type: Models.ImageObjectType.POSITIONPOINT,
+        isStatic: false,
+        zIndex: 0,
+        position: {
+            x: 1100 / image.dimensions.width,
+            y: 300 / image.dimensions.width,
+        },
+        isSelftest: true,
+        selftestItems: [],
+        primitives: []
+    });
+    image.addChild(textPrimitiveTestPoint3);
+    //</editor-fold>
+    //</editor-fold>
+
+    //</editor-fold>
 
     image.sortChildren();
     app.stage.emit("setDefaultMode", "default");
diff --git a/src/lib/elements/primitives/ArrowPrimitive.ts b/src/lib/elements/primitives/ArrowPrimitive.ts
index 2a15e730..7a2e6134 100644
--- a/src/lib/elements/primitives/ArrowPrimitive.ts
+++ b/src/lib/elements/primitives/ArrowPrimitive.ts
@@ -112,7 +112,7 @@ export class ArrowPrimitive extends BaseElementContainer<Models.ArrowPrimitive,
         this.moveInteraction.on("onMove", this.onMove, this);
         this.moveInteraction.on("endMove", this.endMove, this);
         // -- Scale interaction
-        this.scaleInteraction = new MedsurfDraw.ScaleInteraction(this);
+        this.scaleInteraction = new MedsurfDraw.ScaleInteraction(this, true);
         this.scaleInteraction.on("onScale", this.onScale, this);
         // -- Select interaction
         this.selectInteraction = new MedsurfDraw.SelectInteraction(this);
@@ -163,7 +163,7 @@ export class ArrowPrimitive extends BaseElementContainer<Models.ArrowPrimitive,
         // Get wedge point
         this.wedgePoint = this.model.wedgePoint
             ? {x: this.model.wedgePoint.x * imageWidth, y: this.model.wedgePoint.y * imageWidth}
-            : {x: (this.model.rectangle.x + this.model.rectangle.width) * imageWidth, y: (this.model.rectangle.y + this.model.rectangle.height / 2) * imageWidth};
+            : {x: this.model.rectangle.width * imageWidth, y: this.model.rectangle.height / 2 * imageWidth};
 
         // Position
         this.position.set(
@@ -428,6 +428,7 @@ export class ArrowPrimitive extends BaseElementContainer<Models.ArrowPrimitive,
         }
         // -- Selftest element
         if (this._selftestElement) {
+            this.image.parent.removeChild(this._selftestElement);
             this._selftestElement.destroy(options);
         }
         // -- Wedge point element
@@ -1670,14 +1671,6 @@ export class ArrowPrimitive extends BaseElementContainer<Models.ArrowPrimitive,
      * @param dH
      */
     public onScale(scaleSide: MedsurfDraw.ScaleSideTypes, dX: number, dY: number, dW: number, dH: number): void {
-        if ([MedsurfDraw.ScaleSideTypes.X, MedsurfDraw.ScaleSideTypes.Y, MedsurfDraw.ScaleSideTypes.WIDTH,
-            MedsurfDraw.ScaleSideTypes.HEIGHT].indexOf(scaleSide) > -1) {
-            console.log("ok");
-            // Fix for pivot 0.5, 0.5
-            dW *= 2;
-            dH *= 2;
-        }
-
         if (this._arrowElement.rectangle.width + dW < 1) {
             return;
             /*
diff --git a/src/lib/elements/primitives/EllipsePrimitive.ts b/src/lib/elements/primitives/EllipsePrimitive.ts
index 2459bc4c..04ea6c06 100644
--- a/src/lib/elements/primitives/EllipsePrimitive.ts
+++ b/src/lib/elements/primitives/EllipsePrimitive.ts
@@ -412,6 +412,7 @@ export class EllipsePrimitive extends BaseElementContainer<Models.EllipsePrimiti
         }
         // -- Selftest element
         if (this._selftestElement) {
+            this.image.parent.removeChild(this._selftestElement);
             this._selftestElement.destroy(options);
         }
         //</editor-fold>
@@ -1592,16 +1593,6 @@ export class EllipsePrimitive extends BaseElementContainer<Models.EllipsePrimiti
      * @param dH
      */
     public onScale(scaleSide: MedsurfDraw.ScaleSideTypes, dX: number, dY: number, dW: number, dH: number): void {
-        // TODO not working
-        if ([MedsurfDraw.ScaleSideTypes.X_Y, MedsurfDraw.ScaleSideTypes.X_HEIGHT, MedsurfDraw.ScaleSideTypes.WIDTH_Y,
-            MedsurfDraw.ScaleSideTypes.WIDTH_HEIGHT].indexOf(scaleSide) > -1
-            // && !(MedsurfDraw.Keyboard.isKeyDown("ShiftLeft") || MedsurfDraw.Keyboard.isKeyDown("ShiftRight"))
-        ) {
-            // Fix for pivot 0.5, 0.5
-            // dW /= 2;
-            // dH /= 2;
-        }
-
         if (this._ellipseElement.ellipse.width + dW < 1) {
             return;
             /*
diff --git a/src/lib/elements/primitives/RectanglePrimitive.ts b/src/lib/elements/primitives/RectanglePrimitive.ts
index e3ce55a4..6bbcfe6f 100644
--- a/src/lib/elements/primitives/RectanglePrimitive.ts
+++ b/src/lib/elements/primitives/RectanglePrimitive.ts
@@ -112,7 +112,7 @@ export class RectanglePrimitive extends BaseElementContainer<Models.RectanglePri
         this.moveInteraction.on("onMove", this.onMove, this);
         this.moveInteraction.on("endMove", this.endMove, this);
         // -- Scale interaction
-        this.scaleInteraction = new MedsurfDraw.ScaleInteraction(this);
+        this.scaleInteraction = new MedsurfDraw.ScaleInteraction(this, true);
         this.scaleInteraction.on("onScale", this.onScale, this);
         // -- Select interaction
         this.selectInteraction = new MedsurfDraw.SelectInteraction(this);
@@ -413,6 +413,7 @@ export class RectanglePrimitive extends BaseElementContainer<Models.RectanglePri
         }
         // -- Selftest element
         if (this._selftestElement) {
+            this.image.parent.removeChild(this._selftestElement);
             this._selftestElement.destroy(options);
         }
         //</editor-fold>
@@ -1593,14 +1594,6 @@ export class RectanglePrimitive extends BaseElementContainer<Models.RectanglePri
      * @param dH
      */
     public onScale(scaleSide: MedsurfDraw.ScaleSideTypes, dX: number, dY: number, dW: number, dH: number): void {
-        console.log(this.interactive);
-        if ([MedsurfDraw.ScaleSideTypes.X, MedsurfDraw.ScaleSideTypes.Y, MedsurfDraw.ScaleSideTypes.WIDTH,
-            MedsurfDraw.ScaleSideTypes.HEIGHT].indexOf(scaleSide) > -1) {
-            // Fix for pivot 0.5, 0.5
-            dW *= 2;
-            dH *= 2;
-        }
-
         if (this._rectangleElement.rectangle.width + dW < 1) {
             return;
             /*
diff --git a/src/lib/elements/primitives/TextPrimitive.ts b/src/lib/elements/primitives/TextPrimitive.ts
index c7d33369..5d7f3d59 100644
--- a/src/lib/elements/primitives/TextPrimitive.ts
+++ b/src/lib/elements/primitives/TextPrimitive.ts
@@ -438,6 +438,7 @@ export class TextPrimitive extends BaseElementContainer<Models.TextPrimitive, Ba
         }
         // -- Selftest element
         if (this._selftestElement) {
+            this.image.parent.removeChild(this._selftestElement);
             this._selftestElement.destroy(options);
         }
         //</editor-fold>
diff --git a/src/lib/generators/combinations/ArrowGenerator.ts b/src/lib/generators/combinations/ArrowGenerator.ts
index ce149080..b01562e9 100644
--- a/src/lib/generators/combinations/ArrowGenerator.ts
+++ b/src/lib/generators/combinations/ArrowGenerator.ts
@@ -166,6 +166,7 @@ export class ArrowGenerator extends BaseGenerator<MedsurfDraw.Image, ArrowGenera
                 startElement: positionPoint,
                 hasWedgePoint: this.data.hasWedgePoint,
                 rotateWithLine: true,
+                withScaling: true,
                 triggerImmediateEndDraw: true
             });
             this._arrowPrimitiveGenerator.once("startGenerator", this.start, this);
@@ -181,6 +182,7 @@ export class ArrowGenerator extends BaseGenerator<MedsurfDraw.Image, ArrowGenera
                 stickMode: MedsurfDraw.StickMode.NOELEMENTS,
                 startElement: positionPoint,
                 rotateWithLine: false,
+                withScaling: false,
                 triggerImmediateEndDraw: true
             });
             this._textPrimitiveGenerator.once("startGenerator", this.startTextPrimitiveGenerator, this);
diff --git a/src/lib/generators/combinations/EllipseGenerator.ts b/src/lib/generators/combinations/EllipseGenerator.ts
index 2a3cc745..3d84c808 100644
--- a/src/lib/generators/combinations/EllipseGenerator.ts
+++ b/src/lib/generators/combinations/EllipseGenerator.ts
@@ -164,6 +164,7 @@ export class EllipseGenerator extends BaseGenerator<MedsurfDraw.Image, EllipseGe
                 stickMode: MedsurfDraw.StickMode.NOELEMENTS,
                 startElement: positionPoint,
                 rotateWithLine: false,
+                withScaling: true,
                 triggerImmediateEndDraw: true
             });
             this._ellipsePrimitiveGenerator.once("startGenerator", this.start, this);
@@ -179,6 +180,7 @@ export class EllipseGenerator extends BaseGenerator<MedsurfDraw.Image, EllipseGe
                 stickMode: MedsurfDraw.StickMode.NOELEMENTS,
                 startElement: positionPoint,
                 rotateWithLine: false,
+                withScaling: false,
                 triggerImmediateEndDraw: true
             });
             this._textPrimitiveGenerator.once("startGenerator", this.startTextPrimitiveGenerator, this);
diff --git a/src/lib/generators/combinations/InteractiveAreaGenerator.ts b/src/lib/generators/combinations/InteractiveAreaGenerator.ts
index 50328a90..a7859c84 100644
--- a/src/lib/generators/combinations/InteractiveAreaGenerator.ts
+++ b/src/lib/generators/combinations/InteractiveAreaGenerator.ts
@@ -176,6 +176,7 @@ export class InteractiveAreaGenerator extends BaseGenerator<MedsurfDraw.Image, I
                 stickMode: MedsurfDraw.StickMode.NOELEMENTS,
                 startElement: positionPoint,
                 rotateWithLine: false,
+                withScaling: false,
                 triggerImmediateEndDraw: true
             });
             this._textPrimitiveGenerator.once("startGenerator", this.startTextPrimitiveGenerator, this);
diff --git a/src/lib/generators/combinations/MarkerGenerator.ts b/src/lib/generators/combinations/MarkerGenerator.ts
index 11266a2b..7354b75e 100644
--- a/src/lib/generators/combinations/MarkerGenerator.ts
+++ b/src/lib/generators/combinations/MarkerGenerator.ts
@@ -203,6 +203,7 @@ export class MarkerGenerator extends BaseGenerator<MedsurfDraw.Image, MarkerGene
                 stickMode: MedsurfDraw.StickMode.NOELEMENTS,
                 startElement: positionPoint,
                 rotateWithLine: false,
+                withScaling: false,
                 triggerImmediateEndDraw: false
             });
             this._textPrimitiveGenerator.once("endGenerator", this.endTextPrimitiveGenerator, this);
diff --git a/src/lib/generators/combinations/PrimitiveMarkerGenerator.ts b/src/lib/generators/combinations/PrimitiveMarkerGenerator.ts
index b3abac94..87be60cf 100644
--- a/src/lib/generators/combinations/PrimitiveMarkerGenerator.ts
+++ b/src/lib/generators/combinations/PrimitiveMarkerGenerator.ts
@@ -189,6 +189,7 @@ export class PrimitiveMarkerGenerator extends BaseGenerator<MedsurfDraw.Image, P
                         startElement: positionPoint,
                         hasWedgePoint: (this.data as ArrowMarkerGeneratorModel).hasWedgePoint,
                         rotateWithLine: this.data.rotateWithLine,
+                        withScaling: false,
                         triggerImmediateEndDraw: true
                     });
                     break;
@@ -200,6 +201,7 @@ export class PrimitiveMarkerGenerator extends BaseGenerator<MedsurfDraw.Image, P
                         stickMode: MedsurfDraw.StickMode.NOELEMENTS,
                         startElement: positionPoint,
                         rotateWithLine: this.data.rotateWithLine,
+                        withScaling: false,
                         triggerImmediateEndDraw: true
                     });
                     break;
@@ -211,6 +213,7 @@ export class PrimitiveMarkerGenerator extends BaseGenerator<MedsurfDraw.Image, P
                         stickMode: MedsurfDraw.StickMode.NOELEMENTS,
                         startElement: positionPoint,
                         rotateWithLine: this.data.rotateWithLine,
+                        withScaling: false,
                         triggerImmediateEndDraw: true
                     });
                     break;
@@ -222,6 +225,7 @@ export class PrimitiveMarkerGenerator extends BaseGenerator<MedsurfDraw.Image, P
                         stickMode: MedsurfDraw.StickMode.NOELEMENTS,
                         startElement: positionPoint,
                         rotateWithLine: this.data.rotateWithLine,
+                        withScaling: false,
                         triggerImmediateEndDraw: true
                     });
                     break;
diff --git a/src/lib/generators/combinations/RectangleGenerator.ts b/src/lib/generators/combinations/RectangleGenerator.ts
index 31122794..89b3a6fd 100644
--- a/src/lib/generators/combinations/RectangleGenerator.ts
+++ b/src/lib/generators/combinations/RectangleGenerator.ts
@@ -164,6 +164,7 @@ export class RectangleGenerator extends BaseGenerator<MedsurfDraw.Image, Rectang
                 stickMode: MedsurfDraw.StickMode.NOELEMENTS,
                 startElement: positionPoint,
                 rotateWithLine: false,
+                withScaling: true,
                 triggerImmediateEndDraw: true
             });
             this._rectanglePrimitiveGenerator.once("startGenerator", this.start, this);
@@ -179,6 +180,7 @@ export class RectangleGenerator extends BaseGenerator<MedsurfDraw.Image, Rectang
                 stickMode: MedsurfDraw.StickMode.NOELEMENTS,
                 startElement: positionPoint,
                 rotateWithLine: false,
+                withScaling: false,
                 triggerImmediateEndDraw: true
             });
             this._textPrimitiveGenerator.once("startGenerator", this.startTextPrimitiveGenerator, this);
diff --git a/src/lib/generators/primitives/ArrowPrimitiveGenerator.ts b/src/lib/generators/primitives/ArrowPrimitiveGenerator.ts
index af33841e..91d4ec5e 100644
--- a/src/lib/generators/primitives/ArrowPrimitiveGenerator.ts
+++ b/src/lib/generators/primitives/ArrowPrimitiveGenerator.ts
@@ -10,6 +10,7 @@ export class ArrowPrimitiveGeneratorModel extends PositionPointGeneratorModel {
     startElement?: MedsurfDraw.PositionPoint;
     hasWedgePoint: boolean;
     rotateWithLine: boolean;
+    withScaling: boolean;
     triggerImmediateEndDraw: boolean;
 }
 
@@ -57,31 +58,35 @@ export class ArrowPrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image, Ar
             this._positionPointGenerator.once("startGenerator", this.start, this);
             this._positionPointGenerator.once("startGenerator", this.startPositionPointGenerator, this);
             this._positionPointGenerator.once("updatePoint", this.updatePositionPointGenerator, this);
-            // TODO uncommend when scale needed: this._positionPointGenerator.once("endGenerator", this.endPositionPointGeneratorScale, this);
-            // TODO uncommend when scale needed: this._positionPointGenerator.once("endGenerator", this.startScale, this);
-            this._positionPointGenerator.once("endGenerator", this.endPositionPointGenerator, this); // TODO commend when scale needed
+            if (this.withScaling) {
+                this._positionPointGenerator.once("endGenerator", this.endPositionPointGeneratorScale, this);
+                this._positionPointGenerator.once("endGenerator", this.startScale, this);
+            } else {
+                this._positionPointGenerator.once("endGenerator", this.endPositionPointGenerator, this);
+            }
             this._positionPointGenerator.once("abortGenerator", this.abortPositionPointGenerator, this);
         } else {
             // Setup arrow primitive
             this.startPositionPointGenerator();
 
             // Start arrow primitive scale
-            // TODO uncommend when scale needed: this.endPositionPointGeneratorScale();
-            this.endPositionPointGenerator();
-
-            /* TODO uncommend when scale needed:
-            // Check pointerover
-            // -- Check if mouse is in image
-            const globalPoint = this.target.renderer.plugins.interaction.mouse.global;
-            const hitTest = this.target.renderer.plugins.interaction.hitTest(globalPoint, this.target);
-            if (!hitTest) {
-                // -- Not hit test result -> mouse outside image
-                this.target.once("pointerover", this.startScale, this);
+            if (this.withScaling) {
+                this.endPositionPointGeneratorScale();
+
+                // Check pointerover
+                // -- Check if mouse is in image
+                const globalPoint = this.target.renderer.plugins.interaction.mouse.global;
+                const hitTest = this.target.renderer.plugins.interaction.hitTest(globalPoint, this.target);
+                if (!hitTest) {
+                    // -- Not hit test result -> mouse outside image
+                    this.target.once("pointerover", this.startScale, this);
+                } else {
+                    // -- Hit rest result -> mouse inside image
+                    this.startScale();
+                }
             } else {
-                // -- Hit rest result -> mouse inside image
-                this.startScale();
+                this.endPositionPointGenerator();
             }
-            */
         }
         //</editor-fold>
     }
@@ -209,13 +214,14 @@ export class ArrowPrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image, Ar
         this.startPositionPointGenerator();
 
         // End generator
-        // TODO uncommend when scale needed: this.endPositionPointGeneratorScale();
-        this.endPositionPointGenerator();
+        if (this.withScaling) {
+            this.endPositionPointGeneratorScale();
 
-        /* TODO uncommend when scale needed:
-        // Start scale
-        this.startScale();
-        */
+            // Start scale
+            this.startScale();
+        } else {
+            this.endPositionPointGenerator();
+        }
     }
 
     /**
@@ -228,7 +234,7 @@ export class ArrowPrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image, Ar
         }
         this.positionPointElement.model.primitives.push(this.arrowPrimitiveElement.model as any);
 
-        if (this.triggerImmediateEndDraw) {
+        if (!this.withScaling && this.triggerImmediateEndDraw) {
             this.endArrowPrimitiveDraw()
         } else {
             //<editor-fold desc="Events">
@@ -258,7 +264,7 @@ export class ArrowPrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image, Ar
         }
         this.positionPointElement.model.primitives.push(this.arrowPrimitiveElement.model as any);
 
-        if (this.triggerImmediateEndDraw) {
+        if (!this.withScaling && this.triggerImmediateEndDraw) {
             this.endArrowPrimitiveDraw();
         } else {
             //<editor-fold desc="Events">
@@ -403,6 +409,21 @@ export class ArrowPrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image, Ar
         this.data.rotateWithLine = value;
     }
 
+    /**
+     * Get with scaling
+     */
+    public get withScaling(): boolean {
+        return this.data.withScaling;
+    }
+
+    /**
+     * Set with scaling
+     * @param value
+     */
+    public set withScaling(value: boolean) {
+        this.data.withScaling = value;
+    }
+
     /**
      * Get trigger immediate end draw
      */
diff --git a/src/lib/generators/primitives/EllipsePrimitiveGenerator.ts b/src/lib/generators/primitives/EllipsePrimitiveGenerator.ts
index a205aa0c..8c017112 100644
--- a/src/lib/generators/primitives/EllipsePrimitiveGenerator.ts
+++ b/src/lib/generators/primitives/EllipsePrimitiveGenerator.ts
@@ -9,6 +9,7 @@ import {PositionPointGeneratorModel} from "../positionings/PositionPointGenerato
 export class EllipsePrimitiveGeneratorModel extends PositionPointGeneratorModel {
     startElement?: MedsurfDraw.PositionPoint;
     rotateWithLine: boolean;
+    withScaling: boolean;
     triggerImmediateEndDraw: boolean;
 }
 
@@ -56,31 +57,35 @@ export class EllipsePrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image,
             this._positionPointGenerator.once("startGenerator", this.start, this);
             this._positionPointGenerator.once("startGenerator", this.startPositionPointGenerator, this);
             this._positionPointGenerator.once("updatePoint", this.updatePositionPointGenerator, this);
-            // TODO uncommend when scale needed: this._positionPointGenerator.once("endGenerator", this.endPositionPointGeneratorScale, this);
-            // TODO uncommend when scale needed: this._positionPointGenerator.once("endGenerator", this.startScale, this);
-            this._positionPointGenerator.once("endGenerator", this.endPositionPointGenerator, this);  // TODO commend when scale needed
+            if (this.withScaling) {
+                this._positionPointGenerator.once("endGenerator", this.endPositionPointGeneratorScale, this);
+                this._positionPointGenerator.once("endGenerator", this.startScale, this);
+            } else {
+                this._positionPointGenerator.once("endGenerator", this.endPositionPointGenerator, this);
+            }
             this._positionPointGenerator.once("abortGenerator", this.abortPositionPointGenerator, this);
         } else {
             // Setup ellipse primitive
             this.startPositionPointGenerator();
 
             // Start ellipse primitive scale
-            // TODO uncommend when scale needed: this.endPositionPointGeneratorScale();
-            this.endPositionPointGenerator();
-
-            /* TODO uncommend when scale needed:
-            // Check pointerover
-            // -- Check if mouse is in image
-            const globalPoint = this.target.renderer.plugins.interaction.mouse.global;
-            const hitTest = this.target.renderer.plugins.interaction.hitTest(globalPoint, this.target);
-            if (!hitTest) {
-                // -- Not hit test result -> mouse outside image
-                this.target.once("pointerover", this.startScale, this);
+            if (this.withScaling) {
+                this.endPositionPointGeneratorScale();
+
+                // Check pointerover
+                // -- Check if mouse is in image
+                const globalPoint = this.target.renderer.plugins.interaction.mouse.global;
+                const hitTest = this.target.renderer.plugins.interaction.hitTest(globalPoint, this.target);
+                if (!hitTest) {
+                    // -- Not hit test result -> mouse outside image
+                    this.target.once("pointerover", this.startScale, this);
+                } else {
+                    // -- Hit rest result -> mouse inside image
+                    this.startScale();
+                }
             } else {
-                // -- Hit rest result -> mouse inside image
-                this.startScale();
+                this.endPositionPointGenerator();
             }
-            */
         }
         //</editor-fold>
     }
@@ -208,13 +213,14 @@ export class EllipsePrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image,
         this.startPositionPointGenerator();
 
         // End generator
-        // TODO uncommend when scale needed: this.endPositionPointGeneratorScale();
-        this.endPositionPointGenerator();
+        if (this.withScaling) {
+            this.endPositionPointGeneratorScale();
 
-        /* TODO uncommend when scale needed:
-        // Start scale
-        this.startScale();
-        */
+            // Start scale
+            this.startScale();
+        } else {
+            this.endPositionPointGenerator();
+        }
     }
 
     /**
@@ -227,7 +233,7 @@ export class EllipsePrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image,
         }
         this.positionPointElement.model.primitives.push(this.ellipsePrimitiveElement.model as any);
 
-        if (this.triggerImmediateEndDraw) {
+        if (!this.withScaling && this.triggerImmediateEndDraw) {
             this.endEllipsePrimitiveDraw();
         } else {
             //<editor-fold desc="Events">
@@ -257,7 +263,7 @@ export class EllipsePrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image,
         }
         this.positionPointElement.model.primitives.push(this.ellipsePrimitiveElement.model as any);
 
-        if (this.triggerImmediateEndDraw) {
+        if (!this.withScaling && this.triggerImmediateEndDraw) {
             this.endEllipsePrimitiveDraw();
         } else {
             //<editor-fold desc="Events">
@@ -387,6 +393,21 @@ export class EllipsePrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image,
         this.data.rotateWithLine = value;
     }
 
+    /**
+     * Get with scaling
+     */
+    public get withScaling(): boolean {
+        return this.data.withScaling;
+    }
+
+    /**
+     * Set with scaling
+     * @param value
+     */
+    public set withScaling(value: boolean) {
+        this.data.withScaling = value;
+    }
+
     /**
      * Get trigger immediate end draw
      */
diff --git a/src/lib/generators/primitives/RectanglePrimitiveGenerator.ts b/src/lib/generators/primitives/RectanglePrimitiveGenerator.ts
index 7fcaa208..8bb7e979 100644
--- a/src/lib/generators/primitives/RectanglePrimitiveGenerator.ts
+++ b/src/lib/generators/primitives/RectanglePrimitiveGenerator.ts
@@ -9,6 +9,7 @@ import {PositionPointGeneratorModel} from "../positionings/PositionPointGenerato
 export class RectanglePrimitiveGeneratorModel extends PositionPointGeneratorModel {
     startElement?: MedsurfDraw.PositionPoint;
     rotateWithLine: boolean;
+    withScaling: boolean;
     triggerImmediateEndDraw: boolean;
 }
 
@@ -56,31 +57,35 @@ export class RectanglePrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image
             this._positionPointGenerator.once("startGenerator", this.start, this);
             this._positionPointGenerator.once("startGenerator", this.startPositionPointGenerator, this);
             this._positionPointGenerator.once("updatePoint", this.updatePositionPointGenerator, this);
-            // TODO uncommend when scale needed: this._positionPointGenerator.once("endGenerator", this.endPositionPointGeneratorScale, this);
-            // TODO uncommend when scale needed: this._positionPointGenerator.once("endGenerator", this.startScale, this);
-            this._positionPointGenerator.once("endGenerator", this.endPositionPointGenerator, this); // TODO commend when scale needed
+            if (this.withScaling) {
+                this._positionPointGenerator.once("endGenerator", this.endPositionPointGeneratorScale, this);
+                this._positionPointGenerator.once("endGenerator", this.startScale, this);
+            } else {
+                this._positionPointGenerator.once("endGenerator", this.endPositionPointGenerator, this);
+            }
             this._positionPointGenerator.once("abortGenerator", this.abortPositionPointGenerator, this);
         } else {
             // Setup rectangle primitive
             this.startPositionPointGenerator();
 
             // Start rectangle primitive scale
-            // TODO uncommend when scale needed: this.endPositionPointGeneratorScale();
-            this.endPositionPointGenerator();
-
-            /* TODO uncommend when scale needed:
-            // Check pointerover
-            // -- Check if mouse is in image
-            const globalPoint = this.target.renderer.plugins.interaction.mouse.global;
-            const hitTest = this.target.renderer.plugins.interaction.hitTest(globalPoint, this.target);
-            if (!hitTest) {
-                // -- Not hit test result -> mouse outside image
-                this.target.once("pointerover", this.startScale, this);
+            if (this.withScaling) {
+                this.endPositionPointGeneratorScale();
+
+                // Check pointerover
+                // -- Check if mouse is in image
+                const globalPoint = this.target.renderer.plugins.interaction.mouse.global;
+                const hitTest = this.target.renderer.plugins.interaction.hitTest(globalPoint, this.target);
+                if (!hitTest) {
+                    // -- Not hit test result -> mouse outside image
+                    this.target.once("pointerover", this.startScale, this);
+                } else {
+                    // -- Hit rest result -> mouse inside image
+                    this.startScale();
+                }
             } else {
-                // -- Hit rest result -> mouse inside image
-                this.startScale();
+                this.endPositionPointGenerator();
             }
-            */
         }
         //</editor-fold>
     }
@@ -207,13 +212,14 @@ export class RectanglePrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image
         this.startPositionPointGenerator();
 
         // End generator
-        // TODO uncommend when scale needed: this.endPositionPointGeneratorScale();
-        this.endPositionPointGenerator();
+        if (this.withScaling) {
+            this.endPositionPointGeneratorScale();
 
-        /* TODO uncommend when scale needed:
-        // Start scale
-        this.startScale();
-        */
+            // Start scale
+            this.startScale();
+        } else {
+            this.endPositionPointGenerator();
+        }
     }
 
     /**
@@ -226,7 +232,7 @@ export class RectanglePrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image
         }
         this.positionPointElement.model.primitives.push(this.rectanglePrimitiveElement.model as any);
 
-        if (this.triggerImmediateEndDraw) {
+        if (!this.withScaling && this.triggerImmediateEndDraw) {
             this.endRectanglePrimitiveDraw();
         } else {
             //<editor-fold desc="Events">
@@ -256,7 +262,7 @@ export class RectanglePrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image
         }
         this.positionPointElement.model.primitives.push(this.rectanglePrimitiveElement.model as any);
 
-        if (this.triggerImmediateEndDraw) {
+        if (!this.withScaling && this.triggerImmediateEndDraw) {
             this.endRectanglePrimitiveDraw();
         } else {
             //<editor-fold desc="Events">
@@ -386,6 +392,21 @@ export class RectanglePrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image
         this.data.rotateWithLine = value;
     }
 
+    /**
+     * Get with scaling
+     */
+    public get withScaling(): boolean {
+        return this.data.withScaling;
+    }
+
+    /**
+     * Set with scaling
+     * @param value
+     */
+    public set withScaling(value: boolean) {
+        this.data.withScaling = value;
+    }
+
     /**
      * Get trigger immediate end draw
      */
diff --git a/src/lib/generators/primitives/TextPrimitiveGenerator.ts b/src/lib/generators/primitives/TextPrimitiveGenerator.ts
index 725c4494..ed05b9dd 100644
--- a/src/lib/generators/primitives/TextPrimitiveGenerator.ts
+++ b/src/lib/generators/primitives/TextPrimitiveGenerator.ts
@@ -9,6 +9,7 @@ import {PositionPointGeneratorModel} from "../positionings/PositionPointGenerato
 export class TextPrimitiveGeneratorModel extends PositionPointGeneratorModel {
     startElement?: MedsurfDraw.PositionPoint;
     rotateWithLine: boolean;
+    withScaling: boolean;
     triggerImmediateEndDraw: boolean;
 }
 
@@ -56,31 +57,35 @@ export class TextPrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image, Tex
             this._positionPointGenerator.once("startGenerator", this.start, this);
             this._positionPointGenerator.once("startGenerator", this.startPositionPointGenerator, this);
             this._positionPointGenerator.once("updatePoint", this.updatePositionPointGenerator, this);
-            // TODO uncommend when scale needed: this._positionPointGenerator.once("endGenerator", this.endPositionPointGeneratorScale, this);
-            // TODO uncommend when scale needed: this._positionPointGenerator.once("endGenerator", this.startScale, this);
-            this._positionPointGenerator.once("endGenerator", this.endPositionPointGenerator, this); // TODO commend when scale needed
+            if (this.withScaling) {
+                this._positionPointGenerator.once("endGenerator", this.endPositionPointGeneratorScale, this);
+                this._positionPointGenerator.once("endGenerator", this.startScale, this);
+            } else {
+                this._positionPointGenerator.once("endGenerator", this.endPositionPointGenerator, this);
+            }
             this._positionPointGenerator.once("abortGenerator", this.abortPositionPointGenerator, this);
         } else {
             // Setup text primitive
             this.startPositionPointGenerator();
 
             // Start text primitive scale
-            // TODO uncommend when scale needed: this.endPositionPointGeneratorScale();
-            this.endPositionPointGenerator();
-
-            /* TODO uncommend when scale needed:
-            // Check pointerover
-            // -- Check if mouse is in image
-            const globalPoint = this.target.renderer.plugins.interaction.mouse.global;
-            const hitTest = this.target.renderer.plugins.interaction.hitTest(globalPoint, this.target);
-            if (!hitTest) {
-                // -- Not hit test result -> mouse outside image
-                this.target.once("pointerover", this.startScale, this);
+            if (this.withScaling) {
+                this.endPositionPointGeneratorScale();
+
+                // Check pointerover
+                // -- Check if mouse is in image
+                const globalPoint = this.target.renderer.plugins.interaction.mouse.global;
+                const hitTest = this.target.renderer.plugins.interaction.hitTest(globalPoint, this.target);
+                if (!hitTest) {
+                    // -- Not hit test result -> mouse outside image
+                    this.target.once("pointerover", this.startScale, this);
+                } else {
+                    // -- Hit rest result -> mouse inside image
+                    this.startScale();
+                }
             } else {
-                // -- Hit rest result -> mouse inside image
-                this.startScale();
+                this.endPositionPointGenerator();
             }
-            */
         }
         //</editor-fold>
     }
@@ -207,13 +212,14 @@ export class TextPrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image, Tex
         this.startPositionPointGenerator();
 
         // End generator
-        // TODO uncommend when scale needed: this.endPositionPointGeneratorScale();
-        this.endPositionPointGenerator();
+        if (this.withScaling) {
+            this.endPositionPointGeneratorScale();
 
-        /* TODO uncommend when scale needed:
-        // Start scale
-        this.startScale();
-        */
+            // Start scale
+            this.startScale();
+        } else {
+            this.endPositionPointGenerator();
+        }
     }
 
     /**
@@ -226,7 +232,7 @@ export class TextPrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image, Tex
         }
         this.positionPointElement.model.primitives.push(this.textPrimitiveElement.model as any);
 
-        if (this.triggerImmediateEndDraw) {
+        if (!this.withScaling && this.triggerImmediateEndDraw) {
             this.endTextPrimitiveDraw()
         } else {
             //<editor-fold desc="Events">
@@ -257,7 +263,7 @@ export class TextPrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image, Tex
         this.positionPointElement.model.primitives.push(this.textPrimitiveElement.model as any);
 
         // Check for trigger var
-        if (this.triggerImmediateEndDraw) {
+        if (!this.withScaling && this.triggerImmediateEndDraw) {
             this.endTextPrimitiveDraw()
         } else {
             //<editor-fold desc="Events">
@@ -387,6 +393,21 @@ export class TextPrimitiveGenerator extends BaseGenerator<MedsurfDraw.Image, Tex
         this.data.rotateWithLine = value;
     }
 
+    /**
+     * Get with scaling
+     */
+    public get withScaling(): boolean {
+        return this.data.withScaling;
+    }
+
+    /**
+     * Set with scaling
+     * @param value
+     */
+    public set withScaling(value: boolean) {
+        this.data.withScaling = value;
+    }
+
     /**
      * Get trigger immediate end draw
      */
diff --git a/src/lib/interactions/ScaleInteraction.ts b/src/lib/interactions/ScaleInteraction.ts
index 58117196..6e91efbb 100644
--- a/src/lib/interactions/ScaleInteraction.ts
+++ b/src/lib/interactions/ScaleInteraction.ts
@@ -23,6 +23,7 @@ export class ScaleInteraction<TElement extends MedsurfDraw.ImageObject> extends
     /**
      * Members
      */
+    protected _pivotCenter: boolean;
     protected _scaleX: number;
     protected _scaleY: number;
     protected _isScaling: boolean;
@@ -31,10 +32,14 @@ export class ScaleInteraction<TElement extends MedsurfDraw.ImageObject> extends
     /**
      * Constructor
      * @param element
+     * @param pivotCenter
      */
-    public constructor(element: TElement) {
+    public constructor(element: TElement, pivotCenter: boolean = false) {
         // Parent constructor
         super(element);
+
+        // Members
+        this._pivotCenter = pivotCenter;
     }
 
     //<editor-fold desc="Public functions">
@@ -91,58 +96,79 @@ export class ScaleInteraction<TElement extends MedsurfDraw.ImageObject> extends
         let dW: number = 0;
         let dH: number = 0;
 
-        // TODO
-        // Use rotation here -> otherwise not working
+        let pW = 1;
+        let pH = 1;
+        if (this._pivotCenter) {
+            pW = 2;
+            pH = 2;
+        }
+
+        /*
+        const scaleDirection = Math.atan2(event.data.global.y / scale.y - this._scaleY, event.data.global.x / scale.x - this._scaleX);
+        if (scaleDirection + 0.2 > Math.PI && scaleDirection - 0.2 < Math.PI) {
+            return;
+        }
+        const scaleDirection = 1 - 1 / Math.atan2(event.data.global.y / scale.y - this._scaleY, event.data.global.x / scale.x - this._scaleX);
+        if ((scaleDirection - 0.2) > this.element.rotation && (scaleDirection + 0.2) < this.element.rotation) {
+            return;
+        }
+        */
+
+        /* TODO only scale in correct way
+        console.log(event.data.global.x / scale.x, this._scaleX);
+        console.log(event.data.global.y / scale.y, this._scaleY);
+        console.log("answer:", Math.atan2(event.data.global.y / scale.y - this._scaleY, event.data.global.x / scale.x - this._scaleX));
+        */
+
+        let cosR = Math.cos(this.element.rotation);
+        if (cosR === 0)
+            cosR = 1;
+
+        let sinR = Math.sin(this.element.rotation);
+        if (sinR === 0)
+            sinR = 1;
+
+        /*
+        console.log(cosR);
+        console.log(sinR);
+        console.log("answer:", 1 - 1 / Math.atan2(event.data.global.y / scale.y - this._scaleY, event.data.global.x / scale.x - this._scaleX));
+        */
 
         if (this._scaleSide == ScaleSideTypes.X || this._scaleSide == ScaleSideTypes.X_Y
             || this._scaleSide == ScaleSideTypes.X_HEIGHT) {
-            dX = (event.data.global.x / scale.x - this._scaleX);
-            dW = -1 * dX;
+            dX = (event.data.global.x / scale.x - this._scaleX) / cosR;
+            dW = -1 * dX * pW;
             this._scaleX = event.data.global.x / scale.x;
         }
         if (this._scaleSide == ScaleSideTypes.Y || this._scaleSide == ScaleSideTypes.X_Y
             || this._scaleSide == ScaleSideTypes.WIDTH_Y) {
-            dY = (event.data.global.y / scale.y - this._scaleY);
-            dH = -1 * dY;
+            dY = (event.data.global.y / scale.y - this._scaleY) / sinR;
+            dH = -1 * dY * pH;
             this._scaleY = event.data.global.y / scale.y;
         }
         if (this._scaleSide == ScaleSideTypes.WIDTH || this._scaleSide == ScaleSideTypes.WIDTH_Y
             || this._scaleSide == ScaleSideTypes.WIDTH_HEIGHT) {
-            dW = (event.data.global.x / scale.x - this._scaleX);
-            /* TODO
-            if ((parent.parent.parent as Primitives).type === "ellipse") {
-                dX = dW;
-            }
-            */
+            dW = (event.data.global.x / scale.x - this._scaleX) * pW / cosR;
             this._scaleX = event.data.global.x / scale.x;
         }
         if (this._scaleSide == ScaleSideTypes.HEIGHT || this._scaleSide == ScaleSideTypes.X_HEIGHT
             || this._scaleSide == ScaleSideTypes.WIDTH_HEIGHT) {
-            dH = (event.data.global.y / scale.y - this._scaleY);
-            /* TODO
-            if ((parent.parent.parent as Primitives).type === "ellipse") {
-                dY = dH;
-            }
-            */
+            dH = (event.data.global.y / scale.y - this._scaleY) * pH / sinR;
             this._scaleY = event.data.global.y / scale.y;
         }
 
         // Keep aspect ratio
-        // TODO up / down scaling not consistent
-        if ((this._scaleSide == ScaleSideTypes.X_Y || this._scaleSide == ScaleSideTypes.X_HEIGHT
-            || this._scaleSide == ScaleSideTypes.WIDTH_Y || this._scaleSide == ScaleSideTypes.WIDTH_HEIGHT)
-            && !(MedsurfDraw.Keyboard.isKeyDown("ShiftLeft") || MedsurfDraw.Keyboard.isKeyDown("ShiftRight"))) {
+        if (!(MedsurfDraw.Keyboard.isKeyDown("ShiftLeft") || MedsurfDraw.Keyboard.isKeyDown("ShiftRight"))) {
             const rectangle = this.element.getRectangle();
 
-            if (dW > dH) {
+            if (this._scaleSide == ScaleSideTypes.X_Y || this._scaleSide == ScaleSideTypes.WIDTH_Y) {
                 dH = rectangle.height / rectangle.width * dW;
-            } else {
+            }
+            if (this._scaleSide == ScaleSideTypes.X_HEIGHT || this._scaleSide == ScaleSideTypes.WIDTH_HEIGHT) {
                 dW = rectangle.width / rectangle.height * dH;
             }
         }
 
-        // TODO (parent.parent.parent as Primitives).scaleAnnotation(dX, dY, dW, dH);
-
         this.emit("onScale", this._scaleSide, dX, dY, dW, dH);
     }
 
-- 
GitLab