Browse Source

intersection

Victor Luiz Domingues 5 năm trước cách đây
mục cha
commit
940e914269

+ 18 - 3
src/app/components/intersection-component/drawers/intersection-drawer.js

@@ -3,6 +3,7 @@ import { ELEMENTS_CLASS } from "../../../core/enums/elements-class-enum";
 import { Drawer } from "../../../core/drawers/drawer";
 import { app as App } from "../../../app";
 import { objects } from "../../../core/application/objects";
+import { DrawerAggregator } from "../../../core/drawers/drawer-aggregator";
 
 export class IntersectionDrawer extends Drawer {
   static FIRST_OBJECT_STATE() {
@@ -60,14 +61,28 @@ export class IntersectionDrawer extends Drawer {
     return objects.getByKonvaObject(konvaObject)[0];
   }
   drawPoint() {
-    console.info("generic object", this.aggregatorA);
     const intersectionPoint = this.aggregatorA.genericObject.getIntersection(
       this.aggregatorB.genericObject
     );
-    console.info("intersection point", intersectionPoint);
-    PointDrawer.drawPoint(intersectionPoint, false);
+    const point = PointDrawer.drawPoint(intersectionPoint, false, false);
+    const aggregator = new DrawerAggregator(
+      this,
+      intersectionPoint,
+      point.konvaObject,
+      ELEMENTS_CLASS.INTERSECTION_POINT
+    );
+    this.point = point.geometricObject;
+    super.addAggregator(aggregator);
+    this.aggregatorB.addAggregator(aggregator);
+    this.aggregatorA.addAggregator(aggregator);
   }
   isValidObject(konvaObject) {
     return konvaObject.attrs.class == ELEMENTS_CLASS.LINE_SEGMENT;
   }
+  update(aggregator, e) {
+    aggregator.genericObject.update(aggregator, e);
+    aggregator.konvaObject.x(aggregator.genericObject.posX);
+    aggregator.konvaObject.y(aggregator.genericObject.posY);
+    this.batchDraw();
+  }
 }

+ 9 - 4
src/app/components/intersection-component/models/intersection-model.js

@@ -1,9 +1,14 @@
 import { PointModel } from "../../point-component/models/point-model";
 
 export class IntersectionModel extends PointModel {
-  constructor(posX, posY) {
-    this.dependencies = [];
-    this.posX = posX;
-    this.posY = posY;
+  constructor(posX, posY, label, r, s) {
+    super(posX, posY, label);
+    this.r = r;
+    this.s = s;
+  }
+  update(aggregator, event) {
+    const intersection = this.r.getIntersection(this.s);
+    this.posX = parseFloat(intersection.posX.toFixed(2));
+    this.posY = parseFloat(intersection.posY.toFixed(2));
   }
 }

+ 2 - 2
src/app/components/line-segment-component/drawers/line-segment-drawer.js

@@ -76,7 +76,7 @@ export class LineSegmentDrawer extends Drawer {
         [this.pointA, this.pointB],
         [this.aggregatorA, this.aggregatorB]
       );
-      super.setState(undefined);
+      super.setState(LineSegmentDrawer.FIRST_POINT_STATE);
     }
   }
 
@@ -118,7 +118,7 @@ export class LineSegmentDrawer extends Drawer {
     super.batchDraw();
   }
 
-  update(aggregator) {
+  update(aggregator, e) {
     const pointA = aggregator.genericObject.pointA;
     const pointB = aggregator.genericObject.pointB;
     aggregator.konvaObject.points([

+ 6 - 5
src/app/components/line-segment-component/models/line-segment-model.js

@@ -1,5 +1,5 @@
 import { GeometricObject } from "../../../core/models/objects/geometric-object";
-import { PointModel } from "../../point-component/models/point-model";
+import { IntersectionModel } from "../../intersection-component/models/intersection-model";
 export class LineSegmentModel extends GeometricObject {
   constructor(pointA, pointB, label) {
     super();
@@ -7,7 +7,6 @@ export class LineSegmentModel extends GeometricObject {
     this.pointB = pointB;
     this.setLabel(label);
   }
-  update() {}
   getStraight() {
     const aX = this.pointA.posX;
     const aY = this.pointA.posY;
@@ -29,15 +28,17 @@ export class LineSegmentModel extends GeometricObject {
     const c2 = s[2];
     const determinant = a1 * b2 - a2 * b1;
     if (determinant == 0) {
-      return new PointModel(
+      return new IntersectionModel(
         Number.MAX_SAFE_INTEGER,
         Number.MAX_SAFE_INTEGER,
-        label
+        undefined,
+        this,
+        lineSegment
       );
     } else {
       const x = (b2 * c1 - b1 * c2) / determinant;
       const y = (a1 * c2 - a2 * c1) / determinant;
-      return new PointModel(x, y);
+      return new IntersectionModel(x, y, undefined, this, lineSegment);
     }
   }
 }

+ 23 - 15
src/app/components/point-component/drawers/point-drawer.js

@@ -57,7 +57,7 @@ export class PointDrawer extends Drawer {
     return aggregator;
   }
 
-  updatePositions(aggregator, event) {
+  update(aggregator, event) {
     aggregator.konvaObject.children.forEach(function(element) {
       if (element.attrs.class == ELEMENTS_CLASS.POINT) {
         aggregator.genericObject.update(element, event);
@@ -76,10 +76,9 @@ export class PointDrawer extends Drawer {
     return PointDrawer.drawPoint(new PointModel(x, y), useLabel);
   }
 
-  static drawPoint(point, useLabel) {
-    const group = Drawer.getKonvaGroup();
-    const circle = PointDrawer.getKonvaCircle(point);
-
+  static drawPoint(point, useLabel, draggable) {
+    const group = Drawer.getKonvaGroup(draggable);
+    const circle = PointDrawer.getKonvaCircle(point, draggable);
     if (useLabel != undefined && useLabel) {
       const label = Label.draw();
       point.setLabel(label);
@@ -91,21 +90,29 @@ export class PointDrawer extends Drawer {
         group.add(text);
       }
     }
-    group.add(circle);
-    PointDrawer.configureCircleEvents(circle);
-    Drawer.drawObject(group);
-    group.zIndex(1);
-    Drawer.stageBatchDraw();
-    return { geometricObject: point, konvaObject: group };
+    if (useLabel) {
+      group.add(circle);
+      if (draggable == undefined || draggable)
+        PointDrawer.configureCircleEvents(circle);
+      Drawer.drawObject(group);
+      group.zIndex(Number.MAX_SAFE_INTEGER);
+      Drawer.stageBatchDraw();
+
+      return { geometricObject: point, konvaObject: group };
+    } else {
+      Drawer.drawObject(circle);
+      return { geometricObject: point, konvaObject: circle };
+    }
   }
 
-  static getKonvaCircle(point) {
+  static getKonvaCircle(point, draggable) {
+    const fill = draggable == undefined || draggable ? STYLE.fill : "#828783";
     return new Konva.Circle({
       x: point.posX,
       y: point.posY,
       radius: 5,
-      fill: STYLE.fill,
-      stroke: STYLE.fill,
+      fill: fill,
+      stroke: fill,
       strokeWidth: 1,
       strokeScaleEnabled: false,
       draggable: false,
@@ -116,7 +123,8 @@ export class PointDrawer extends Drawer {
       connections: [],
       startPosX: point.posX,
       startPosY: point.posY,
-      listening: true
+      listening: true,
+      selectable: draggable
     });
   }
   static getKonvaText(point, label) {

+ 2 - 2
src/app/components/point-component/models/point-model.js

@@ -7,7 +7,7 @@ export class PointModel extends GeometricObject {
     this.setLabel(label);
   }
   update(konvaObject, event) {
-    this.posX =  konvaObject.attrs.startPosX + event.target._lastPos.x ;
-    this.posY =  konvaObject.attrs.startPosY + event.target._lastPos.y;
+    this.posX = konvaObject.attrs.startPosX + event.target._lastPos.x;
+    this.posY = konvaObject.attrs.startPosY + event.target._lastPos.y;
   }
 }

+ 13 - 3
src/app/core/drawers/drawer-aggregator.js

@@ -31,9 +31,19 @@ export class DrawerAggregator {
     }
   }
   update(e) {
-    this.drawer.updatePositions(this, e);
-    this.aggregators.forEach(aggregator => {
-      aggregator.drawer.update(aggregator);
+    this.drawer.update(this, e);
+    this.updateAggregators(this.aggregators, e);
+  }
+  updateAggregators(aggregators, e) {
+    aggregators.forEach(aggregator => {
+      aggregator.drawer.update(aggregator, e);
+      if (
+        aggregator.aggregators == undefined ||
+        aggregator.aggregators.length == 0
+      ) {
+        return;
+      }
+      this.updateAggregators(aggregator.aggregators, e);
     });
   }
 }

+ 3 - 2
src/app/core/drawers/drawer.js

@@ -51,9 +51,10 @@ export class Drawer {
   static drawObject(object) {
     DrawerManager.draw(object);
   }
-  static getKonvaGroup() {
+  static getKonvaGroup(draggable) {
+    if (draggable == undefined) draggable = true;
     const group = new Konva.Group({
-      draggable: true,
+      draggable: draggable,
       resizeEnabled: false
     });
     return group;

+ 1 - 0
src/app/core/models/objects/geometric-object.js

@@ -6,6 +6,7 @@ export class GeometricObject extends DynamicObject {
     this.borderColor;
     this.backgroundColor;
     this.edgeThinckness;
+    this.draggable = false;
   }
   setBorderColor(color) {
     this.borderColor = color;

+ 48 - 49
src/app/core/parser/file-parser.js

@@ -1,24 +1,23 @@
 import * as ObjectClass from "./../enums/elements-class-enum";
 
-const TYPE    =  0; // identifica se Ponto, Texto, Reta...
-const ID      =  1; // identificador unico do objeto
-const DEFINITION =  2; // parametros dos quais o objeto depende (exemplo Reta depende de Ponto e Ponto => "2:IDPONTO1 IDPONTO2")
-const LIST     =  3; // lista de identificadores de objetos dependentes do atual
-const LABEL    =  4; // definicao do rotulo (valor/nome e se escondido ou nao)
-const DEFINED  =  6; // 0 ou 1 (???)
-const COLOR       =  5; // cor usando valor inteiro
-const HIDDEN =  7; // 0 (visivel) ou 1 (escondido)
-const PIXEL     =  8; // LeScript usa (coordenada X e Y - inteiros)
-const FONT     =  9; // 'Arial' T Tam: T = FONT.PLAIN, FONT.BOLD, FONT.ITALIC; Tam = 8, 9,...
-                    // PROIBIDO: "Arial" T Tam, pois em caso contrario nao sera lido como parametro
-                    //           usa  MARCAFNT = "\'" nao pode ser "\"" <[28/09/2006] agora vazio "">
+const TYPE = 0; // identifica se Ponto, Texto, Reta...
+const ID = 1; // identificador unico do objeto
+const DEFINITION = 2; // parametros dos quais o objeto depende (exemplo Reta depende de Ponto e Ponto => "2:IDPONTO1 IDPONTO2")
+const LIST = 3; // lista de identificadores de objetos dependentes do atual
+const LABEL = 4; // definicao do rotulo (valor/nome e se escondido ou nao)
+const DEFINED = 6; // 0 ou 1 (???)
+const COLOR = 5; // cor usando valor inteiro
+const HIDDEN = 7; // 0 (visivel) ou 1 (escondido)
+const PIXEL = 8; // LeScript usa (coordenada X e Y - inteiros)
+const FONT = 9; // 'Arial' T Tam: T = FONT.PLAIN, FONT.BOLD, FONT.ITALIC; Tam = 8, 9,...
+// PROIBIDO: "Arial" T Tam, pois em caso contrario nao sera lido como parametro
+//           usa  MARCAFNT = "\'" nao pode ser "\"" <[28/09/2006] agora vazio "">
 const LABEL_COLOR = 10; // cor de rotulo (tambem um inteiro) - inserido apos iGeom versao >= 2.9.9.31
 
 const OBJECT_LINE_REGEX = /^\{\w*(?:(?:\d+:@\|[^@]+@\|)|(?:\d+:[^,@|]+))\w(?:,\w*(?:(?:\d+:@\|[^@]+@\|)|(?:\d+:[^,@\|]+)))+\w*\}!?$/.compile();
 const ALPHA_MASK = 255 << 24;
 
 export class FileParser {
-
   /**
    *
    * @param {string} content
@@ -27,12 +26,13 @@ export class FileParser {
     this.content = content;
   }
 
-  parse () {
-    return this.content.split('\n')
+  parse() {
+    return this.content
+      .split("\n")
       .filter(str => !str.match(/^[#\[]/))
       .map(str => {
-        if(!OBJECT_LINE_REGEX.test(str.trim())) {
-          console.error("Malformed object string in igeom file: ",str);
+        if (!OBJECT_LINE_REGEX.test(str.trim())) {
+          console.error("Malformed object string in igeom file: ", str);
           return undefined;
         }
         return this.parseObjectLine(str.trim());
@@ -43,31 +43,31 @@ export class FileParser {
    *
    * @param {string} object_line
    */
-  parseObjectLine (object_line) {
+  parseObjectLine(object_line) {
     const map = new Map();
     object_line = object_line.substring(1);
-    if(object_line.endsWith('}!')) {
+    if (object_line.endsWith("}!")) {
       object_line = object_line.substring(0, object_line.length - 2);
     } else {
       object_line = object_line.substring(0, object_line.length - 1);
     }
-    const properties = object_line.split(',');
-    for(const prop in properties) {
-      const prop_info = prop.trim().split(':');
+    const properties = object_line.split(",");
+    for (const prop in properties) {
+      const prop_info = prop.trim().split(":");
       const key = parseInt(prop_info[0]);
 
-      if(key == TYPE) {
+      if (key == TYPE) {
         const type = prop_info[1];
         map.set("type", ObjectClass.fromCodeToClass(parseInt(type)));
-      } else if(key == ID) {
+      } else if (key == ID) {
         const id = prop_info[1];
         map.set("id", parseInt(id));
-      } else if(key == DEFINITION) {
+      } else if (key == DEFINITION) {
         const param_list = [];
-        const list = prop_info[1].trim().split(' ');
-        for(const param in list) {
+        const list = prop_info[1].trim().split(" ");
+        for (const param in list) {
           const maybe_number = Number(param);
-          if(Number.isNaN((maybe_number))) {
+          if (Number.isNaN(maybe_number)) {
             param_list.push(param);
           } else {
             param_list.push(maybe_number);
@@ -76,17 +76,17 @@ export class FileParser {
         map.set("param", param_list);
       } else if (key == LIST) {
         const id_list = [];
-        const list = prop_info[1].trim().split(' ');
-        for(const id in list) {
-           id_list.push(id);
+        const list = prop_info[1].trim().split(" ");
+        for (const id in list) {
+          id_list.push(id);
         }
         map.set("deps", id_list);
       } else if (key == LABEL) {
         const param_list = [];
-        const list = prop_info[1].trim().split(' ');
-        for(const param in list) {
+        const list = prop_info[1].trim().split(" ");
+        for (const param in list) {
           const maybe_number = Number(param);
-          if(Number.isNaN((maybe_number))) {
+          if (Number.isNaN(maybe_number)) {
             param_list.push(param);
           } else {
             param_list.push(maybe_number);
@@ -101,36 +101,35 @@ export class FileParser {
         let number = Number(value);
         const alpha = ((number & ALPHA_MASK) >>> 24) / 255;
         number = number ^ ALPHA_MASK;
-        const r = (number >> 16) & 0xFF;
-        const g = (number >> 8) & 0xFF;
-        const b = number & 0xFF;
-        map.set("color", {alpha:alpha, r:r, g:g, b:b});
-      } else if(key == HIDDEN) {
+        const r = (number >> 16) & 0xff;
+        const g = (number >> 8) & 0xff;
+        const b = number & 0xff;
+        map.set("color", { alpha: alpha, r: r, g: g, b: b });
+      } else if (key == HIDDEN) {
         const value = prop_info[1];
         map.set("hidden", parseInt(value));
-      } else if(key == PIXEL) {
+      } else if (key == PIXEL) {
         const position = [];
-        const list = prop_info[1].trim().split(' ');
-        for(const i in list) {
+        const list = prop_info[1].trim().split(" ");
+        for (const i in list) {
           position.push(parseInt(i));
         }
         map.set("position", position);
       } else if (key == FONT) {
-        const param_list = prop_info[1].trim().split(' ');
+        const param_list = prop_info[1].trim().split(" ");
         map.set("font", param_list);
-      } else if(key == LABEL_COLOR) {
+      } else if (key == LABEL_COLOR) {
         const value = prop_info[1];
         let number = Number(value);
         const alpha = ((number & ALPHA_MASK) >>> 24) / 255;
         number = number ^ ALPHA_MASK;
-        const r = (number >> 16) & 0xFF;
-        const g = (number >> 8) & 0xFF;
-        const b = number & 0xFF;
-        map.set("label_color", {alpha: alpha, r: r, g: g, b: b});
+        const r = (number >> 16) & 0xff;
+        const g = (number >> 8) & 0xff;
+        const b = number & 0xff;
+        map.set("label_color", { alpha: alpha, r: r, g: g, b: b });
       }
     }
 
     return map;
   }
-
 }