SlimRunner

dgc-script-table-assitant

Jun 20th, 2020
315
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. let vxm = {};
  2.  
  3. vxm.ExprID;
  4. vxm.TableState = {};
  5. vxm.Scaling = true;
  6.  
  7. Object.defineProperties(vxm.TableState, {
  8.     INVALID : {
  9.         value: 0,
  10.         writable: false,
  11.         enumerable: true,
  12.         configurable: true
  13.     },
  14.    
  15.     NO_TRAIL : {
  16.         value: 1,
  17.         writable: false,
  18.         enumerable: true,
  19.         configurable: true
  20.     },
  21.    
  22.     HAS_TRAIL : {
  23.         value: 2,
  24.         writable: false,
  25.         enumerable: true,
  26.         configurable: true
  27.     }
  28. }); // !TableState defineProperties
  29.  
  30. Object.assign(vxm, {
  31.    
  32.    
  33.     initialize : function () {
  34.         if (typeof vxm.ExprID !== 'undefined') {
  35.             throw Error('Cannot initialize twice');
  36.         }
  37.        
  38.         vxm.ExprID = null;
  39.         let element = (elem => elem[elem.length - 1])(document.getElementsByClassName('dcg-graph-outer'));
  40.        
  41.         element.addEventListener('mousedown', (e) => {
  42.             let client = element.getBoundingClientRect();
  43.             let graphPix = Calc.graphpaperBounds.pixelCoordinates;
  44.             let graphMath = Calc.graphpaperBounds.mathCoordinates;
  45.             let x, y;
  46.            
  47.             x = (e.x - client.x) / graphPix.width * graphMath.width + graphMath.left;
  48.             y = -(e.y - client.y) / graphPix.height * graphMath.height + graphMath.top;
  49.            
  50.             if (
  51.                 vxm.getIndex() !== -1 &&
  52.                 e.altKey &&
  53.                 e.buttons === 1
  54.             ) {
  55.                 let TS = vxm.TableState;
  56.                 let expr = Calc.getExpressions()[vxm.getIndex()];
  57.                 let lastIdx = expr.columns[0].values.length - 1;
  58.                 let canModify = false;
  59.                
  60.                 if (vxm.Scaling) {
  61.                     let scaleFactor = Math.pow(10,
  62.                         Math.ceil(
  63.                             Math.log10(
  64.                                 graphPix.width / graphMath.width
  65.                             )
  66.                         )
  67.                     );
  68.                    
  69.                     x = Math.round(x * scaleFactor) / scaleFactor;
  70.                     y = Math.round(y * scaleFactor) / scaleFactor;
  71.                 }
  72.                
  73.                 switch (vxm.validateExpression(expr)) {
  74.                     case TS.NO_TRAIL:
  75.                         expr.columns[0].values.push(x);
  76.                         expr.columns[1].values.push(y);
  77.                         canModify = true;
  78.                         break;
  79.                     case TS.HAS_TRAIL:
  80.                         expr.columns[0].values[lastIdx] = x;
  81.                         expr.columns[1].values[lastIdx] = y;
  82.                         canModify = true;
  83.                         break;
  84.                     case TS.INVALID:
  85.                         //nothing to do
  86.                         break;
  87.                     default:
  88.                         //nothing to do
  89.                 }
  90.                
  91.                 if (canModify) {
  92.                     Calc.setExpression(expr);
  93.                 }
  94.                
  95.             }
  96.         }); // !element_mouseup
  97.        
  98.     }, // !initialize ()
  99.    
  100.    
  101.    
  102.     bindExpression : function (idx) {
  103.         --idx;
  104.        
  105.         vxm.ExprID = null;
  106.        
  107.         let expList = Calc.getExpressions();
  108.         let message = (str) => {console.log(str); return -1};
  109.        
  110.         if ( idx < 0 || idx >= expList.length )
  111.             return message('input error: expression does not exist');
  112.        
  113.         let msg = vxm.validateExpression(expList[idx]);
  114.         if (msg === vxm.TableState.INVALID)
  115.             return msg;
  116.        
  117.         vxm.ExprID = expList[idx].id;
  118.     }, // !bindExpression ()
  119.    
  120.    
  121.    
  122.     validateExpression : function (expr) {
  123.         let message = (str, val) => {console.log(str); return val};
  124.        
  125.         if (expr.type !== 'table'){
  126.             vxm.ExprID = null;
  127.             return message(
  128.                 'expression error: expression must be a table', vxm.TableState.INVALID
  129.             );
  130.         }
  131.        
  132.         if (expr.columns.length !== 2) {
  133.             return message(
  134.                 'expression error: table must have 2 columns',
  135.                 vxm.TableState.INVALID
  136.             );
  137.         }
  138.            
  139.         let lastIdx = expr.columns[0].values.length;
  140.        
  141.         if (lastIdx !== expr.columns[1].values.length) {
  142.             return message(
  143.                 'expression error: table columns must have the same size',
  144.                 vxm.TableState.INVALID
  145.             );
  146.         }
  147.         --lastIdx;
  148.        
  149.         if (
  150.             expr.columns[0].values[lastIdx] &&
  151.             expr.columns[1].values[lastIdx]
  152.         ) {
  153.             return vxm.TableState.NO_TRAIL;
  154.         }
  155.        
  156.         return vxm.TableState.HAS_TRAIL;
  157.     }, // !validateExpression ()
  158.    
  159.    
  160.    
  161.     getIndex : function () {
  162.         let calcExpressions = Calc.getExpressions();
  163.         return calcExpressions.findIndex((elem) => {
  164.             return elem.id === vxm.ExprID;
  165.         });
  166.     }, // !getIndex ()
  167.    
  168.    
  169.    
  170.     addPolygon : function () {
  171.         if (vxm.getIndex() !== -1) {
  172.             let expr = Calc.getExpressions()[vxm.getIndex()];
  173.            
  174.             let msg = vxm.validateExpression(expr);
  175.             if (msg === vxm.TableState.INVALID)
  176.                 return msg;
  177.            
  178.             let x = expr.columns[0].latex;
  179.             let y = expr.columns[1].latex;
  180.            
  181.             Calc.setExpression({
  182.                 latex : `\\operatorname{polygon}\\left(${x},${y}\\right)`
  183.             });
  184.         } else {
  185.             console.log('There is not bound expression');
  186.         } // !if-else
  187.     },
  188.    
  189.    
  190.    
  191.     unbindExpression : function () {
  192.         vxm.ExprID = null;
  193.     }
  194.    
  195. }); // !vxm assign
  196.  
  197. vxm.initialize();
Advertisement
Add Comment
Please, Sign In to add comment