Browse Source

Merge branch 'develop' of http://200.144.254.107/git/victordomingues/poc-igeom into feature/line-segment

Victor Domingues 5 years ago
parent
commit
c4221e732c
2 changed files with 151 additions and 0 deletions
  1. 15 0
      src/app/core/enums/elements-class-enum.js
  2. 136 0
      src/app/core/parser/file-parser.js

+ 15 - 0
src/app/core/enums/elements-class-enum.js

@@ -22,3 +22,18 @@ export const ELEMENTS_CLASS = {
   // TO: MED_TEXTO                  =  20;  // para textos
   // TO: CIRCUNFERENCIA_INT         =  21; // [11/01/2006] estava 56, mas este num. e de rotacao
 };
+
+/**
+ * 
+ * @param {number} code 
+ */
+export function fromCodeToClass (code) {
+  switch(code) {
+    case 0:
+      return ELEMENTS_CLASS.POINT;
+    case 1:
+      return ELEMENTS_CLASS.LINE_SEGMENT;
+    default:
+      return ELEMENTS_CLASS.POINT;
+  }
+}

+ 136 - 0
src/app/core/parser/file-parser.js

@@ -0,0 +1,136 @@
+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 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
+   */
+  constructor(content) {
+    this.content = content;
+  }
+
+  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);
+          return undefined;
+        }
+        return this.parseObjectLine(str.trim());
+      });
+  }
+
+  /**
+   *
+   * @param {string} object_line
+   */
+  parseObjectLine (object_line) {
+    const map = new Map();
+    object_line = object_line.substring(1);
+    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 key = parseInt(prop_info[0]);
+
+      if(key == TYPE) {
+        const type = prop_info[1];
+        map.set("type", ObjectClass.fromCodeToClass(parseInt(type)));
+      } else if(key == ID) {
+        const id = prop_info[1];
+        map.set("id", parseInt(id));
+      } else if(key == DEFINITION) {
+        const param_list = [];
+        const list = prop_info[1].trim().split(' ');
+        for(const param in list) {
+          const maybe_number = Number(param);
+          if(Number.isNaN((maybe_number))) {
+            param_list.push(param);
+          } else {
+            param_list.push(maybe_number);
+          }
+        }
+        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);
+        }
+        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 maybe_number = Number(param);
+          if(Number.isNaN((maybe_number))) {
+            param_list.push(param);
+          } else {
+            param_list.push(maybe_number);
+          }
+        }
+        map.set("label", param_list);
+      } else if (key == DEFINED) {
+        const value = prop_info[1];
+        map.set("defined", parseInt(value));
+      } else if (key == 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("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) {
+        const position = [];
+        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(' ');
+        map.set("font", param_list);
+      } 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});
+      }
+    }
+
+    return map;
+  }
+
+}