blockly.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. <template>
  2. <div class="ablockly">
  3. <div class="btnPosition">
  4. <el-button type="primary" @click="go">下一步</el-button>
  5. <el-button type="primary" @click="returnA">上一步</el-button>
  6. </div>
  7. <div id="blocklyDiv"></div>
  8. <xml id="toolbox" style="display: none">
  9. <category name="逻辑" colour="%{BKY_LOGIC_HUE}">
  10. <block type="controls_if"></block>
  11. <block type="logic_compare"></block>
  12. <block type="logic_operation"></block>
  13. <block type="logic_negate"></block>
  14. <block type="logic_boolean"></block>
  15. <block type="logic_number"></block>
  16. </category>
  17. <sep></sep>
  18. <category name="循环" colour="#5ba55b">
  19. <block type="controls_repeat_forever"></block>
  20. <block type="controls_whileUntil"></block>
  21. <block type="controls_for"></block>
  22. </category>
  23. <sep></sep>
  24. <category id="catIOTScreen" name="屏幕" colour="#5cb2d6">
  25. <block type="iot_lcd_screeninit"></block>
  26. </category>
  27. <sep></sep>
  28. <category id="cat" name="人脸识别" colour="#ee783a">
  29. <block type="iot_lcd_faceinit"></block>
  30. <block type="iot_lcd_objectinit"></block>
  31. </category>
  32. <sep></sep>
  33. <category id="police" name="识别组件" colour="#1b5873">
  34. <block type="iot_lcd_policeinit"></block>
  35. <block type="police_objectinit"></block>
  36. </category>
  37. <sep></sep>
  38. <category id="voice" name="语音组件" colour="#9200ff">
  39. <block type="voice_voiceinit"></block>
  40. <block type="voice_talk"></block>
  41. <block type="voice_open"></block>
  42. </category>
  43. <sep></sep>
  44. <category id="ai" name="AI组件" colour="#935ba5">
  45. <block type="ai_gesture"></block>
  46. <block type="ai_motor"></block>
  47. </category>
  48. <sep></sep>
  49. <category id="light" name="灯光" colour="#3a8ee6">
  50. <block type="light_open"></block>
  51. <block type="light_close"></block>
  52. </category>
  53. <sep></sep>
  54. <category id="curtain" name="窗帘" colour="#26DDFF">
  55. <block type="curtain_open"></block>
  56. <block type="curtain_close"></block>
  57. </category>
  58. </xml>
  59. </div>
  60. </template>
  61. <style scoped>
  62. .ablockly,
  63. #blocklyDiv {
  64. width: 100%;
  65. height: 100%;
  66. }
  67. .blocklySvg {
  68. height: 905px !important;
  69. }
  70. .btnPosition {
  71. position: fixed;
  72. right: 130px;
  73. bottom: 35px;
  74. z-index: 999999;
  75. }
  76. </style>
  77. <script>
  78. // 引入Blockly
  79. import Blockly from "blockly";
  80. // 引入想要转换的语言,语言有php python dart lua javascript
  81. import * as JavaScript from "blockly/javascript";
  82. import * as Blocks from "blockly/blocks";
  83. // 引入语言包并使用
  84. import * as hans from "blockly/msg/zh-hans";
  85. Blockly.setLocale(hans);
  86. //引入媒体文件:我是在github上下载的blockly源码,将源码中的media文件放入我项目中的public文件夹下
  87. //忽略被vue错认为组件的blockly中的标签,不止以下这些,请发现一个忽略一个
  88. import Vue from "vue";
  89. Vue.config.ignoredElements.push("xml");
  90. Vue.config.ignoredElements.push("block");
  91. Vue.config.ignoredElements.push("field");
  92. Vue.config.ignoredElements.push("category");
  93. Vue.config.ignoredElements.push("sep");
  94. Vue.config.ignoredElements.push("value");
  95. Vue.config.ignoredElements.push("statement");
  96. Vue.config.ignoredElements.push("mutation");
  97. export default {
  98. data() {
  99. return {
  100. that: this,
  101. workspace: null,
  102. type: this.$route.query.typeN,
  103. };
  104. },
  105. methods: {
  106. // 代码生成器
  107. myUpdateFunction(event) {
  108. var code = Blockly.JavaScript.workspaceToCode(this.workspace);
  109. // debugger;
  110. return code;
  111. },
  112. // 获取blockly工作区中的code和xml结构
  113. getBlockData() {
  114. const code = Blockly.JavaScript.workspaceToCode(this.workspace);
  115. const xml = Blockly.Xml.workspaceToDom(this.workspace);
  116. const xmlText = Blockly.Xml.domToText(xml);
  117. },
  118. // 回显工作区中的xml结构
  119. setBlockData(xmlText) {
  120. this.clearBlockData();
  121. const xml = Blockly.Xml.textToDom(xmlText);
  122. Blockly.Xml.domToWorkspace(xml, this.workspace);
  123. },
  124. // 清空工作区
  125. clearBlockData() {
  126. this.workspace.clear();
  127. },
  128. //下一步
  129. go() {
  130. // var xmlText =
  131. // '<xml xmlns="https://developers.google.com/blockly/xml"><block type="iot_lcd_screeninit" id="{3nwI]%M1OB@v~%c^GJ*" x="270" y="150"><next><block type="controls_repeat_forever" id="%RwQN-vn~S,Qz:U%Dp2C"><statement name="DO"><block type="controls_if" id="tTNBMMPITBf)yE@hA}Lt"><value name="IF0"><block type="logic_compare" id="kW(af5I*_dMR|37aEHA8"><field name="OP">EQ</field><value name="A"><block type="ai_gesture" id="Msy)DT1[/[pA7vU$u2BD"><field name="ID">ID</field></block></value><value name="B"><block type="logic_number" id="F7nQ+Rn{h=Z-:`nxfOV{"><field name="number">布</field></block></value></block></value><statement name="DO0"><block type="ai_motor" id="9=+m`N)^mOs;,8?7ZZ:K"><field name="motor">M1</field><field name="speed">100</field></block></statement><next><block type="controls_if" id="~ykQvxBR]wnz6FHIGc^s"><value name="IF0"><block type="logic_compare" id="+v0*1:oG$.+wMFe_g_F@"><field name="OP">EQ</field><value name="A"><block type="ai_gesture" id=",|{9@1In%8:74vXPPn{O"><field name="ID">ID</field></block></value><value name="B"><block type="logic_number" id="[J4:1z-D*iz3){K$v[gM"><field name="number">石头</field></block></value></block></value><statement name="DO0"><block type="ai_motor" id="XIVuWHcKb[O5|0*HC_Em"><field name="motor">M1</field><field name="speed">0</field></block></statement><next><block type="controls_if" id="bNZCd.Zj2arimcA^dZvc"><value name="IF0"><block type="logic_compare" id="ul/^s*@P{HkWe6(^9fgn"><field name="OP">EQ</field><value name="A"><block type="ai_gesture" id="Wd)15h0yyFb`)Sy:H}0w"><field name="ID">ID</field></block></value><value name="B"><block type="logic_number" id="1f0Wep9dlC0i-})rTiqN"><field name="number">剪刀</field></block></value></block></value><statement name="DO0"><block type="ai_motor" id="bY;.J)_PvmP5TAD/KDs,"><field name="motor">M1</field><field name="speed">50</field></block></statement></block></next></block></next></block></statement></block></next></block></xml>';
  132. // this.setBlockData(xmlText);
  133. //update修改 function state里的参数
  134. var a = this.myUpdateFunction();
  135. this.$store.commit("update", ["function", a]);
  136. console.log(a);
  137. if (this.type == "fan") {
  138. this.$router.push("Ffun");
  139. } else if (this.type == "light") {
  140. this.$router.push("Flight");
  141. } else if (this.type == "curtain") {
  142. this.$router.push("Fcurtain");
  143. } else if (this.type == "shop") {
  144. this.$router.push("Fshop");
  145. } else {
  146. this.$router.push("function");
  147. }
  148. },
  149. returnA() {
  150. this.$router.go(-1);
  151. },
  152. },
  153. mounted() {
  154. this.workspace = Blockly.inject("blocklyDiv", {
  155. //工具栏
  156. toolbox: document.getElementById("toolbox"),
  157. //网格效果
  158. grid: { spacing: 20, length: 3, colour: "#ccc", snap: true },
  159. //媒体资源
  160. media: "../assets/img/",
  161. //垃圾桶
  162. trashcan: true,
  163. });
  164. //工作区监听代码生成器
  165. this.workspace.addChangeListener(this.myUpdateFunction);
  166. Blockly.Blocks["iot_lcd_screeninit"] = {
  167. init: function () {
  168. this.appendDummyInput().appendField(
  169. new Blockly.FieldImage(
  170. require("../assets/img/screen_init_header.png"),
  171. 45,
  172. 45
  173. )
  174. );
  175. this.appendDummyInput().appendField("LCD屏幕打开");
  176. this.setInputsInline(false);
  177. this.setPreviousStatement(true);
  178. this.setNextStatement(true);
  179. this.setColour("#5cb2d6");
  180. this.setTooltip("");
  181. this.setHelpUrl("");
  182. },
  183. };
  184. Blockly.JavaScript.iot_lcd_screeninit = function (block) {
  185. var _code = "screen=1;";
  186. return _code;
  187. };
  188. Blockly.Blocks["iot_lcd_faceinit"] = {
  189. init: function () {
  190. this.appendDummyInput().appendField(
  191. new Blockly.FieldImage(
  192. require("../assets/img/face_recognition_header.png"),
  193. 45,
  194. 45
  195. )
  196. );
  197. this.appendDummyInput().appendField("人脸辨识");
  198. this.setInputsInline(false);
  199. this.setPreviousStatement(true);
  200. this.setNextStatement(true);
  201. this.setColour("#ee783a");
  202. this.setTooltip("");
  203. this.setHelpUrl("");
  204. },
  205. };
  206. Blockly.JavaScript.iot_lcd_faceinit = function (block) {
  207. var _code = "face=1;";
  208. return _code;
  209. };
  210. Blockly.Blocks["iot_lcd_policeinit"] = {
  211. init: function () {
  212. this.appendDummyInput().appendField(
  213. new Blockly.FieldImage(
  214. require("../assets/img/screen_init_header.png"),
  215. 45,
  216. 45
  217. )
  218. );
  219. this.appendDummyInput().appendField("电子警察组件");
  220. this.setInputsInline(false);
  221. this.setPreviousStatement(true);
  222. this.setNextStatement(true);
  223. this.setColour("#1b5873");
  224. this.setTooltip("");
  225. this.setHelpUrl("");
  226. },
  227. };
  228. Blockly.JavaScript.iot_lcd_policeinit = function (block) {
  229. var _code = "police=1;";
  230. return _code;
  231. };
  232. Blockly.Blocks["police_objectinit"] = {
  233. init: function () {
  234. this.appendDummyInput().appendField(
  235. new Blockly.FieldImage(
  236. require("../assets/img/screen_init_header.png"),
  237. 45,
  238. 45
  239. )
  240. );
  241. this.appendDummyInput().appendField("物体识别对比组件");
  242. this.setInputsInline(false);
  243. this.setPreviousStatement(true);
  244. this.setNextStatement(true);
  245. this.setColour("#1b5873");
  246. this.setTooltip("");
  247. this.setHelpUrl("");
  248. },
  249. };
  250. Blockly.JavaScript.police_objectinit = function (block) {
  251. var _code = "pObject=1;";
  252. return _code;
  253. };
  254. Blockly.Blocks["logic_loop"] = {
  255. init: function () {
  256. this.appendStatementInput("NAME")
  257. .setCheck(null)
  258. .appendField("重复执行");
  259. this.setPreviousStatement(true, null);
  260. this.setNextStatement(true, null);
  261. this.setColour("#5b80a5");
  262. this.setTooltip("");
  263. this.setHelpUrl("");
  264. },
  265. };
  266. Blockly.JavaScript["logic_loop"] = function (block) {
  267. var statements_name = Blockly.JavaScript.statementToCode(block, "NAME");
  268. // TODO: Assemble JavaScript into code variable.
  269. var code = "for;\n";
  270. return code;
  271. };
  272. Blockly.Blocks.controls_repeat_forever = {
  273. init: function () {
  274. this.jsonInit({
  275. message0: Blockly.Msg.CONTROLS_REPEAT_FOREVER,
  276. previousStatement: null,
  277. nextStatement: null,
  278. colour: "#5ba55b",
  279. tooltip: Blockly.Msg.CONTROLS_REPEAT_FOREVER_TOOLTIP,
  280. helpUrl: Blockly.Msg.CONTROLS_REPEAT_HELPURL,
  281. });
  282. this.appendStatementInput("DO").appendField(
  283. Blockly.Msg.CONTROLS_REPEAT_INPUT_DO
  284. );
  285. },
  286. };
  287. Blockly.JavaScript.controls_repeat_forever = function (a) {
  288. var d = Blockly.JavaScript.statementToCode(a, "DO");
  289. d = Blockly.JavaScript.addLoopTrap(d, a);
  290. return "while (true) {\n" + d + "}\n";
  291. };
  292. Blockly.Blocks["logic_number"] = {
  293. init: function () {
  294. this.appendDummyInput().appendField(
  295. new Blockly.FieldTextInput("0"),
  296. "number"
  297. );
  298. this.setInputsInline(true);
  299. this.setOutput(true, "Number");
  300. this.setColour("#5b80a5");
  301. this.setTooltip("");
  302. this.setHelpUrl("");
  303. },
  304. };
  305. Blockly.JavaScript["logic_number"] = function (block) {
  306. var text_number = block.getFieldValue("number");
  307. // TODO: Assemble JavaScript into code variable.
  308. var code = text_number;
  309. // TODO: Change ORDER_NONE to the correct strength.
  310. return [code, Blockly.JavaScript.ORDER_NONE];
  311. };
  312. Blockly.Blocks["ai_gesture"] = {
  313. init: function () {
  314. this.appendDummyInput()
  315. .appendField("AI手势识别")
  316. .appendField(new Blockly.FieldDropdown([["ID", "ID"]]), "ID");
  317. this.setInputsInline(true);
  318. this.setOutput(true, null);
  319. this.setColour(285);
  320. this.setTooltip("");
  321. this.setHelpUrl("");
  322. },
  323. };
  324. Blockly.JavaScript["ai_gesture"] = function (block) {
  325. var dropdown_id = block.getFieldValue("ID");
  326. // TODO: Assemble JavaScript into code variable.
  327. var code = "hands";
  328. // TODO: Change ORDER_NONE to the correct strength.
  329. return [code, Blockly.JavaScript.ORDER_NONE];
  330. };
  331. Blockly.Blocks["ai_motor"] = {
  332. init: function () {
  333. this.appendDummyInput()
  334. .appendField("马达")
  335. .appendField(new Blockly.FieldDropdown([["M1", "M1"]]), "motor")
  336. .appendField("以速度")
  337. .appendField(new Blockly.FieldTextInput("0"), "speed")
  338. .appendField("转动");
  339. this.setPreviousStatement(true, null);
  340. this.setNextStatement(true, null);
  341. this.setColour(285);
  342. this.setTooltip("");
  343. this.setHelpUrl("");
  344. },
  345. };
  346. Blockly.JavaScript["ai_motor"] = function (block) {
  347. var dropdown_motor = block.getFieldValue("motor");
  348. var text_speed = block.getFieldValue("speed");
  349. // TODO: Assemble JavaScript into code variable.
  350. var code = "motor=" + text_speed;
  351. // TODO: Change ORDER_NONE to the correct strength.
  352. return code;
  353. };
  354. Blockly.Blocks["iot_lcd_objectinit"] = {
  355. init: function () {
  356. this.appendDummyInput().appendField(
  357. new Blockly.FieldImage(
  358. require("../assets/img/face_recognition_header.png"),
  359. 45,
  360. 45
  361. )
  362. );
  363. this.appendDummyInput().appendField("物体辨识");
  364. this.setInputsInline(false);
  365. this.setPreviousStatement(true);
  366. this.setNextStatement(true);
  367. this.setColour("#ee783a");
  368. this.setTooltip("");
  369. this.setHelpUrl("");
  370. },
  371. };
  372. Blockly.JavaScript.iot_lcd_objectinit = function (block) {
  373. var _code = "object=1";
  374. return _code;
  375. };
  376. Blockly.Blocks["voice_voiceinit"] = {
  377. init: function () {
  378. this.appendDummyInput().appendField(
  379. new Blockly.FieldImage(
  380. require("../assets/img/screen_init_header.png"),
  381. 45,
  382. 45
  383. )
  384. );
  385. this.appendDummyInput().appendField("语音识别");
  386. this.setInputsInline(false);
  387. this.setPreviousStatement(true);
  388. this.setNextStatement(true);
  389. this.setColour("#9200ff");
  390. this.setTooltip("");
  391. this.setHelpUrl("");
  392. },
  393. };
  394. Blockly.JavaScript.voice_voiceinit = function (block) {
  395. var _code = "voice=1;";
  396. return _code;
  397. };
  398. Blockly.Blocks["voice_open"] = {
  399. init: function () {
  400. this.appendDummyInput().appendField(
  401. new Blockly.FieldImage(
  402. require("../assets/img/screen_init_header.png"),
  403. 45,
  404. 45
  405. )
  406. );
  407. this.appendDummyInput().appendField("打开音频");
  408. this.setInputsInline(false);
  409. this.setPreviousStatement(true);
  410. this.setNextStatement(true);
  411. this.setColour("#9200ff");
  412. this.setTooltip("");
  413. this.setHelpUrl("");
  414. },
  415. };
  416. Blockly.JavaScript.voice_open = function (block) {
  417. var _code = "voiceOpen=1;";
  418. return _code;
  419. };
  420. Blockly.Blocks["voice_talk"] = {
  421. init: function () {
  422. this.appendDummyInput()
  423. .appendField("说出")
  424. .appendField(new Blockly.FieldTextInput(""), "say");
  425. this.setOutput(true, null);
  426. this.setColour("#9200ff");
  427. this.setTooltip("");
  428. this.setHelpUrl("");
  429. },
  430. };
  431. Blockly.JavaScript["voice_talk"] = function (block) {
  432. var text_say = block.getFieldValue("say");
  433. var code = "say="+text_say;
  434. // return code;
  435. return [code, Blockly.JavaScript.ORDER_NONE];
  436. };
  437. Blockly.Blocks["light_open"] = {
  438. init: function () {
  439. this.appendDummyInput().appendField("打开灯光");
  440. this.setPreviousStatement(true, null);
  441. this.setNextStatement(true, null);
  442. this.setColour("#3a8ee6");
  443. this.setTooltip("");
  444. this.setHelpUrl("");
  445. },
  446. };
  447. Blockly.JavaScript["light_open"] = function (block) {
  448. // TODO: Assemble JavaScript into code variable.
  449. var code = "light=1";
  450. return code;
  451. };
  452. Blockly.Blocks["light_close"] = {
  453. init: function () {
  454. this.appendDummyInput().appendField("关闭灯光");
  455. this.setPreviousStatement(true, null);
  456. this.setNextStatement(true, null);
  457. this.setColour("#3a8ee6");
  458. this.setTooltip("");
  459. this.setHelpUrl("");
  460. },
  461. };
  462. Blockly.JavaScript["light_close"] = function (block) {
  463. // TODO: Assemble JavaScript into code variable.
  464. var code = "light=0";
  465. return code;
  466. };
  467. Blockly.Blocks["curtain_open"] = {
  468. init: function () {
  469. this.appendDummyInput().appendField("打开窗帘");
  470. this.setPreviousStatement(true, null);
  471. this.setNextStatement(true, null);
  472. this.setColour("#26DDFF");
  473. this.setTooltip("");
  474. this.setHelpUrl("");
  475. },
  476. };
  477. Blockly.JavaScript["curtain_open"] = function (block) {
  478. // TODO: Assemble JavaScript into code variable.
  479. var code = "curtain=1";
  480. return code;
  481. };
  482. Blockly.Blocks["curtain_close"] = {
  483. init: function () {
  484. this.appendDummyInput().appendField("关闭窗帘");
  485. this.setPreviousStatement(true, null);
  486. this.setNextStatement(true, null);
  487. this.setColour("#26DDFF");
  488. this.setTooltip("");
  489. this.setHelpUrl("");
  490. },
  491. };
  492. Blockly.JavaScript["curtain_close"] = function (block) {
  493. // TODO: Assemble JavaScript into code variable.
  494. var code = "curtain=0";
  495. return code;
  496. };
  497. },
  498. };
  499. </script>