procedures.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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 procedure blocks.
  22. * @author fraser@google.com (Neil Fraser)
  23. */
  24. 'use strict';
  25. goog.provide('Blockly.OpenSCAD.procedures');
  26. goog.require('Blockly.OpenSCAD');
  27. Blockly.OpenSCAD['procedures_defreturn'] = function(block) {
  28. // Define a procedure with a return value.
  29. var funcName = Blockly.OpenSCAD.variableDB_.getName(
  30. block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE);
  31. var returnValue = Blockly.OpenSCAD.valueToCode(block, 'RETURN',
  32. Blockly.OpenSCAD.ORDER_NONE) || '';
  33. if (returnValue) {
  34. returnValue = returnValue + ';\n';
  35. }
  36. else returnValue = '0;\n';
  37. var args = [];
  38. for (var x = 0; x < block.arguments_.length; x++) {
  39. args[x] = Blockly.OpenSCAD.variableDB_.getName(block.arguments_[x],
  40. Blockly.Variables.NAME_TYPE);
  41. }
  42. var code = 'function ' + funcName + '(' + args.join(', ') + ') = ' + returnValue;
  43. code = Blockly.OpenSCAD.scrub_(block, code);
  44. Blockly.OpenSCAD.definitions_[funcName] = code;
  45. return null;
  46. };
  47. Blockly.OpenSCAD['procedures_defnoreturn'] = function(block) {
  48. // Define a module with statements, but no return value.
  49. var funcName = Blockly.OpenSCAD.variableDB_.getName(
  50. block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE);
  51. var branch = Blockly.OpenSCAD.statementToCode(block, 'STACK');
  52. if (Blockly.OpenSCAD.INFINITE_LOOP_TRAP) {
  53. branch = Blockly.OpenSCAD.INFINITE_LOOP_TRAP.replace(/%1/g,
  54. '\'' + block.id + '\'') + branch;
  55. }
  56. var args = [];
  57. for (var x = 0; x < block.arguments_.length; x++) {
  58. args[x] = Blockly.OpenSCAD.variableDB_.getName(block.arguments_[x],
  59. Blockly.Variables.NAME_TYPE);
  60. }
  61. var code = 'module ' + funcName + '(' + args.join(', ') + ') {\n';
  62. code += 'union() { //end assign\n';
  63. code += branch + '\n'
  64. code += '} //end assign\n';
  65. code += '}\n';
  66. code = Blockly.OpenSCAD.scrub_(block, code);
  67. Blockly.OpenSCAD.definitions_[funcName] = code;
  68. return null;
  69. };
  70. Blockly.OpenSCAD['procedures_callreturn'] = function(block) {
  71. // Call a procedure with a return value.
  72. var funcName = Blockly.OpenSCAD.variableDB_.getName(
  73. block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE);
  74. var args = [];
  75. for (var x = 0; x < block.arguments_.length; x++) {
  76. args[x] = Blockly.OpenSCAD.valueToCode(block, 'ARG' + x,
  77. Blockly.OpenSCAD.ORDER_COMMA) || 'null';
  78. }
  79. var code = funcName + '(' + args.join(', ') + ')';
  80. return [code, Blockly.OpenSCAD.ORDER_FUNCTION_CALL];
  81. };
  82. Blockly.OpenSCAD['procedures_callnoreturn'] = function(block) {
  83. // Call a procedure with no return value.
  84. var funcName = Blockly.OpenSCAD.variableDB_.getName(
  85. block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE);
  86. var args = [];
  87. for (var x = 0; x < block.arguments_.length; x++) {
  88. args[x] = Blockly.OpenSCAD.valueToCode(block, 'ARG' + x,
  89. Blockly.OpenSCAD.ORDER_COMMA) || 'null';
  90. }
  91. var code = funcName + '(' + args.join(', ') + ');';
  92. return code;
  93. };
  94. Blockly.OpenSCAD['procedures_ifreturn'] = function(block) {
  95. // Conditionally return value from a procedure.
  96. var condition = Blockly.OpenSCAD.valueToCode(block, 'CONDITION',
  97. Blockly.OpenSCAD.ORDER_NONE) || 'false';
  98. var code = 'if (' + condition + ') {\n';
  99. if (block.hasReturnValue_) {
  100. var value = Blockly.OpenSCAD.valueToCode(block, 'VALUE',
  101. Blockly.OpenSCAD.ORDER_NONE) || 'null';
  102. code += ' return ' + value + ';\n';
  103. } else {
  104. code += ' return;\n';
  105. }
  106. code += '}\n';
  107. return code;
  108. };