Advertisement
satowine

GoJS - create polygon from planogram sample

Sep 28th, 2017
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. From small items of this sample (https://gojs.net/latest/samples/planogram.html) to polygon.
  2.  
  3. function getTopLeft(A){
  4.     let x = y = Number.MAX_VALUE;
  5.     let aux;
  6.     A.forEach(function(e){
  7.         let eX = parseInt(e.pos.split(' ')[0]);
  8.         let eY = parseInt(e.pos.split(' ')[1]);
  9.         if(eY < y){
  10.             y = eY;
  11.             x = eX;
  12.             aux = e;
  13.         }
  14.         else if(eY == y){
  15.             if(eX <= x){
  16.                 x = eX;
  17.                 aux = e;
  18.             }
  19.         }
  20.     })
  21.     return aux;
  22. }
  23.  
  24. function rowSort(A){
  25.     let sortedArray = [];
  26.     while(A.length > 0){
  27.         let node = getTopLeft(A);
  28.         let index = A.indexOf(node);
  29.         sortedArray.push(node);
  30.         A.splice(index,1);
  31.     }
  32.     return sortedArray;
  33. }
  34.  
  35. function pushEdges(node, container, cell_size){
  36.     let x = parseInt(node.pos.split(' ')[0]);
  37.     let y = parseInt(node.pos.split(' ')[1]);
  38.     let horizontalEdgeTop, horizontalEdgeBottom, verticalEdgeLeft, verticalEdgeRight;
  39.     let h = x+cell_size;
  40.     let v = y+cell_size;
  41.     horizontalEdgeTop = "M,"+x+','+y+",H,"+h+' '; // "M "+x+' '+y+" H "+h+' ';
  42.     horizontalEdgeBottom = "M,"+x+','+v+",H,"+h+' '; // "M "+x+' '+v+" H "+h+' ';
  43.     verticalEdgeLeft = "M,"+x+','+y+",V,"+v+' '; // "M "+x+' '+y+" V "+v+' ';
  44.     verticalEdgeRight = "M,"+h+','+y+",V,"+v+' '; // "M "+h+' '+y+" V "+v+' ';
  45.     container.edges.push(horizontalEdgeTop);
  46.     container.edges.push(horizontalEdgeBottom);
  47.     container.edges.push(verticalEdgeLeft);
  48.     container.edges.push(verticalEdgeRight);
  49. }
  50.  
  51. function searchEdges(A, cell_size){
  52.     let straightLines = [];
  53.     let edgesContainer = {
  54.         edges: straightLines
  55.     }
  56.     A.forEach(function(e){
  57.         pushEdges(e, edgesContainer, cell_size);
  58.     })
  59.     return edgesContainer.edges;
  60. }
  61.  
  62. function deleteAdjEdges(container){
  63.     let A = container.edges;
  64.     //costruisco una mappa contenente tutti gli elementi che hanno un duplicato
  65.     let uniq = A
  66.                 .map((edge)=>{
  67.                     return {count: 1, edge: edge}
  68.                 })
  69.                 .reduce((a,b)=>{
  70.                     a[b.edge] = (a[b.edge] || 0) + b.count
  71.                     return a
  72.                 }, {})
  73.     let duplicates = Object.keys(uniq).filter((a)=>uniq[a] > 1);
  74.     //elimino i duplicati
  75.     while(duplicates.length > 0){
  76.         let index = container.edges.indexOf(duplicates[0]);
  77.         while(index != -1){
  78.             container.edges.splice(index, 1);
  79.             index = container.edges.indexOf(duplicates[0]);
  80.         }
  81.         let dupIndex = duplicates.indexOf(duplicates[0]);
  82.         duplicates.splice(dupIndex, 1);
  83.     }
  84. }
  85.  
  86. /**
  87.  * Cerco il prossimo lato da inserire nell'array degli ordinati in senso orario
  88.  * @param {edges[]} A
  89.  * @param {int} x
  90.  * @param {int} y
  91.  * @param {char} dirS
  92.  * @param {int} endP
  93.  * @param {char} dir
  94.  */
  95. var getNextEdge = function (A, x, y, dirS, endP, dir, first, reverse) {
  96.   if (dir == 'H') {
  97.     if (dirS == 'H') {
  98.       for (let i = 0; i < A.length; i++){
  99.         if ((parseInt(A[i].split(',')[1]) == endP) && (parseInt(A[i].split (',')[2]) == y) && (A[i].split(',')[3] == 'H')){ // A[i].x == endP && A[i].y == y && A[i].dir == H
  100.           if ( y == (parseInt(A[i].split(',')[2])) && !first && reverse ){
  101.             return null;
  102.           } else {
  103.             return A[i];
  104.           } // if - else
  105.         } // if
  106.       } // for
  107.       return null;
  108.     } else if (dirS == 'V') {
  109.       for(let i = 0; i < A.length; i++){
  110.         if ((parseInt(A[i].split(',')[1]) == x) && (parseInt(A[i].split(',')[2]) == endP) && (A[i].split(',')[3] == 'H')){ // A[i].x == x && A[i].y == endP && A[i].dir == H
  111.             if(first){
  112.                 return null;
  113.             }
  114.             else{
  115.                 return A[i];
  116.             }
  117.         } // if
  118.       } // for
  119.       return null;
  120.     } // if - else
  121.   } else if (dir == 'V'){
  122.         if(dirS == 'H'){
  123.             for(let i = 0; i < A.length; i++){
  124.                 if((parseInt(A[i].split(',')[1]) == endP) && (parseInt(A[i].split(',')[2]) == y) && (A[i].split(',')[3] == 'V')){ // A[i].x == endP && A[i].y == y && A[i].dir == V                    
  125.                     return A[i];
  126.                 }
  127.             }
  128.             return null;
  129.         }
  130.         else if(dirS == 'V'){
  131.             for(let i = 0; i < A.length; i++){
  132.                 if((parseInt(A[i].split(',')[1]) == x) && (parseInt(A[i].split(',')[2]) == endP) && (A[i].split(',')[3] == 'V')){ // A[i].x == x && A[i].y == endP && A[i].dir == V
  133.                     return A[i];
  134.                 }
  135.             }
  136.             return null;
  137.         }
  138.     }
  139. } // getNextEdge
  140.  
  141. /**
  142.  * Dato l'array di tutti i lati (esclusi gli adiancenti) li ordina in senso orario
  143.  * @param {edges[]} edges
  144.  * @param {int} cell_size
  145.  */
  146. function sortEdges(edges, cell_size){
  147.     let reverse = false;
  148.     let first = true;
  149.     let nullFromReverse = false;
  150.     let sortedEdges = [];// inizializzo l'array di lati ordinati
  151.     sortedEdges.push(edges[0]);// pusho sicuramente il primo dei miei lati, che è certamente il primo da inserire
  152.     edges.splice(0, 1);// elimino dall'array dei lati quello appena inserito
  153.     let x, y, endP;
  154.     while(edges.length > 0){
  155.         if(!reverse){
  156.             x = parseInt(sortedEdges[sortedEdges.length-1].split(',')[1]);
  157.             y =  parseInt(sortedEdges[sortedEdges.length-1].split(',')[2]);
  158.         }
  159.         if(!nullFromReverse){
  160.             endP =  parseInt(sortedEdges[sortedEdges.length-1].split(',')[4]);
  161.         }
  162.         else{
  163.             x = parseInt(sortedEdges[sortedEdges.length-1].split(',')[1]);
  164.             y =  parseInt(sortedEdges[sortedEdges.length-1].split(',')[2]);
  165.             first = true;
  166.         }
  167.         let dirS =  sortedEdges[sortedEdges.length-1].split(',')[3];
  168.         let edge = getNextEdge(edges, x, y, dirS, endP, 'H', first, reverse);
  169.         if(edge){ // abbiamo un lato H da inserire
  170.             first = false;
  171.             if(reverse){
  172.                 endP = parseInt(edge.split(',')[4])-cell_size;
  173.                 x = parseInt(edge.split(',')[1]);
  174.                 y = parseInt(edge.split(',')[2])
  175.                 newEdge = "M,"+x+','+y+",H,"+endP+' ';
  176.                 sortedEdges.push(newEdge);
  177.                 reverse = false;
  178.             }
  179.             else{
  180.                 sortedEdges.push(edge);
  181.             }
  182.             let index = edges.indexOf(edge);
  183.             edges.splice(index, 1);
  184.             nullFromReverse = false;
  185.         }
  186.         else{ // non abbiamo un lato H da inserire, interrogo per V
  187.             edge = getNextEdge(edges, x, y, dirS, endP, 'V', first, reverse);
  188.             if(edge){ // abbiamo un lato V da inserire
  189.                 first = false;
  190.                 if(reverse){
  191.                     endP = parseInt(edge.split(',')[4])-cell_size;
  192.                     x = parseInt(edge.split(',')[1]);
  193.                     y = parseInt(edge.split(',')[2])
  194.                     newEdge = "M,"+x+','+y+",V,"+endP+' ';
  195.                     sortedEdges.push(newEdge);
  196.                     reverse = false;
  197.                     nullFromReverse = false;
  198.                 }
  199.                 else{
  200.                     sortedEdges.push(edge);
  201.                 }
  202.                 let index = edges.indexOf(edge);
  203.                 edges.splice(index, 1);
  204.             }
  205.             else if(!reverse){// Non abbiamo nè un H né un V, quindi ribaltiamo
  206.                 if(dirS == 'V'){
  207.                     x = x-cell_size;
  208.                     y = y+cell_size;
  209.                 }
  210.                 else{
  211.                     y = y-cell_size;
  212.                     x = x+cell_size;
  213.                 }
  214.                 reverse = true;
  215.             }
  216.             else{
  217.                 endP = endP-cell_size;
  218.                 nullFromReverse = true;
  219.             }
  220.         }
  221.     }
  222.     return sortedEdges;
  223. }
  224.  
  225. function createString(A){
  226.     let M = A[0].split(',')[0];
  227.     let Mx = A[0].split(',')[1];
  228.     let My = A[0].split(',')[2];
  229.     let dir = A[0].split(',')[3];
  230.     let endSpot = A[0].split(',')[4];
  231.     let path = "F "+M+' '+Mx+' '+My+' '+dir+' '+endSpot;
  232.     A.splice(0, 1);
  233.     A.forEach(function(e){
  234.         let dir = e.split(',')[3];
  235.         let endSpot = e.split(',')[4];
  236.         path = path.concat(' '+dir+' '+endSpot);
  237.     })
  238.     return path;
  239. }
  240.  
  241. var fig2 = [
  242.     {"key":"g", "color":"#B2FF59", "pos":"0 0", "group":"G1"},
  243.     {"key":"g2", "color":"#B2FF59", "pos":"0 50", "group":"G1"},
  244.     {"key":"g3", "color":"#B2FF59", "pos":"50 50", "group":"G1"},
  245.     {"key":"g4", "color":"#B2FF59", "pos":"100 0", "group":"G1"},
  246.     {"key":"g5", "color":"#B2FF59", "pos":"100 50", "group":"G1"},
  247.     {"key":"g6", "color":"#B2FF59", "pos":"150 50", "group":"G1"},
  248.     {"key":"g7", "color":"#B2FF59", "pos":"100 100", "group":"G1"},
  249.     {"key":"g8", "color":"#B2FF59", "pos":"50 100", "group":"G1"},
  250.     {"key":"g9", "color":"#B2FF59", "pos":"50 150", "group":"G1"},
  251.     {"key":"g10", "color":"#B2FF59", "pos":"100 150", "group":"G1"}
  252. ]
  253.  
  254. var sortedShape = rowSort(fig2);
  255. var edges = searchEdges(sortedShape, 50);
  256. var container = {
  257.     edges: edges
  258. };
  259. deleteAdjEdges(container);
  260. var sortedEdges = sortEdges(container.edges, 50);
  261. var path = createString(sortedEdges);
  262. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement