logic.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /**
  2. * @license
  3. * Visual Blocks Language
  4. *
  5. * Copyright 2012 Google Inc.
  6. * https://blockly.googlecode.com/
  7. *
  8. * Licensed under the Apache License, Version 2.0 (the "License");
  9. * you may not use this file except in compliance with the License.
  10. * You may obtain a copy of the License at
  11. *
  12. * http://www.apache.org/licenses/LICENSE-2.0
  13. *
  14. * Unless required by applicable law or agreed to in writing, software
  15. * distributed under the License is distributed on an "AS IS" BASIS,
  16. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17. * See the License for the specific language governing permissions and
  18. * limitations under the License.
  19. */
  20. /**
  21. * @fileoverview Generating OpenSCAD for logic blocks.
  22. * @author q.neutron@gmail.com (Quynh Neutron)
  23. */
  24. 'use strict';
  25. goog.provide('Blockly.OpenSCAD.logic');
  26. goog.require('Blockly.OpenSCAD');
  27. Blockly.OpenSCAD['controls_if'] = function(block) {
  28. // If/elseif/else condition.
  29. var n = 0;
  30. var argument = Blockly.OpenSCAD.valueToCode(block, 'IF' + n,
  31. Blockly.OpenSCAD.ORDER_NONE) || 'false';
  32. var branch = Blockly.OpenSCAD.statementToCode(block, 'DO' + n);
  33. var hiya = Blockly.OpenSCAD.returnIfVarCode(block);
  34. var aC = hiya[0];
  35. var aP = hiya[1];
  36. var code = 'if (' + argument + ') {\n' +aC[0] + branch + '\n' + aP[0] + '}';
  37. for (n = 1; n <= block.elseifCount_; n++) {
  38. argument = Blockly.OpenSCAD.valueToCode(block, 'IF' + n,
  39. Blockly.OpenSCAD.ORDER_NONE) || 'false';
  40. branch = Blockly.OpenSCAD.statementToCode(block, 'DO' + n);
  41. code += ' else if (' + argument + ') {\n' + aC[n] + branch + '\n' + aP[n] + '}';
  42. }
  43. if (block.elseCount_) {
  44. branch = Blockly.OpenSCAD.statementToCode(block, 'ELSE');
  45. code += ' else {\n' + aC[aC.length - 1] + branch + '\n' + aP[aP.length - 1] + '}';
  46. }
  47. return code + '\n';
  48. };
  49. Blockly.OpenSCAD['logic_compare'] = function(block) {
  50. // Comparison operator.
  51. var OPERATORS = {
  52. EQ: '==',
  53. NEQ: '!=',
  54. LT: '<',
  55. LTE: '<=',
  56. GT: '>',
  57. GTE: '>='
  58. };
  59. var operator = OPERATORS[block.getFieldValue('OP')];
  60. var order = (operator == '==' || operator == '!=') ?
  61. Blockly.OpenSCAD.ORDER_EQUALITY : Blockly.OpenSCAD.ORDER_RELATIONAL;
  62. var argument0 = Blockly.OpenSCAD.valueToCode(block, 'A', order) || '0';
  63. var argument1 = Blockly.OpenSCAD.valueToCode(block, 'B', order) || '0';
  64. var code = argument0 + ' ' + operator + ' ' + argument1;
  65. if (block.getParent())
  66. return [code, order];
  67. else return ['//' + code, order];
  68. };
  69. Blockly.OpenSCAD['logic_operation'] = function(block) {
  70. // Operations 'and', 'or'.
  71. var operator = (block.getFieldValue('OP') == 'AND') ? '&&' : '||';
  72. var order = (operator == '&&') ? Blockly.OpenSCAD.ORDER_LOGICAL_AND :
  73. Blockly.OpenSCAD.ORDER_LOGICAL_OR;
  74. var argument0 = Blockly.OpenSCAD.valueToCode(block, 'A', order);
  75. var argument1 = Blockly.OpenSCAD.valueToCode(block, 'B', order);
  76. if (!argument0 && !argument1) {
  77. // If there are no arguments, then the return value is false.
  78. argument0 = 'false';
  79. argument1 = 'false';
  80. } else {
  81. // Single missing arguments have no effect on the return value.
  82. var defaultArgument = (operator == '&&') ? 'true' : 'false';
  83. if (!argument0) {
  84. argument0 = defaultArgument;
  85. }
  86. if (!argument1) {
  87. argument1 = defaultArgument;
  88. }
  89. }
  90. var code = argument0 + ' ' + operator + ' ' + argument1;
  91. if (block.getParent())
  92. return [code, order];
  93. else return ['//' + code, order];
  94. };
  95. Blockly.OpenSCAD['logic_negate'] = function(block) {
  96. // Negation.
  97. var order = Blockly.OpenSCAD.ORDER_LOGICAL_NOT;
  98. var argument0 = Blockly.OpenSCAD.valueToCode(block, 'BOOL', order) ||
  99. 'true';
  100. var code = '!' + argument0;
  101. if (block.getParent())
  102. return [code, order];
  103. else return ['//' + code, order];
  104. };
  105. Blockly.OpenSCAD['logic_boolean'] = function(block) {
  106. // Boolean values true and false.
  107. var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false';
  108. if (block.getParent())
  109. return [code, Blockly.OpenSCAD.ORDER_ATOMIC];
  110. else return ['//' + code, Blockly.OpenSCAD.ORDER_ATOMIC];
  111. };
  112. Blockly.OpenSCAD['logic_null'] = function(block) {
  113. // Null data type.
  114. var code = 'null';
  115. if (block.getParent())
  116. return [code, Blockly.OpenSCAD.ORDER_ATOMIC];
  117. else return ['//' + code, Blockly.OpenSCAD.ORDER_ATOMIC];
  118. };
  119. Blockly.OpenSCAD['logic_ternary'] = function(block) {
  120. // Ternary operator.
  121. var value_if = Blockly.OpenSCAD.valueToCode(block, 'IF',
  122. Blockly.OpenSCAD.ORDER_CONDITIONAL) || 'false';
  123. var value_then = Blockly.OpenSCAD.valueToCode(block, 'THEN',
  124. Blockly.OpenSCAD.ORDER_CONDITIONAL) || 'null';
  125. var value_else = Blockly.OpenSCAD.valueToCode(block, 'ELSE',
  126. Blockly.OpenSCAD.ORDER_CONDITIONAL) || 'null';
  127. var code = value_if + ' ? ' + value_then + ' : ' + value_else
  128. if (block.getParent())
  129. return [code, Blockly.OpenSCAD.ORDER_CONDITIONAL];
  130. else return ['//' + code, Blockly.OpenSCAD.ORDER_CONDITIONAL];
  131. };