Mesin bor printer 3D dan konverter kartu bor PCAD ke G-Code

Halo, habrozhitel sayang.

Hari ini saya ingin berbagi sedikit dasar yang dirancang untuk mengubah kartu pengeboran PCAD menjadi kode-G. Fleksibel, sederhana, dan open-source. Benar, maaf, ospadi, di Qt. Menulisnya, tentu saja, itu bagus, tetapi menggunakan dan mengumpulkan kode orang lain ...

Bagian Satu Mekaniknya.


Beberapa waktu yang lalu, saya menunda proyek saya di kepala untuk prius, dan untuk ini:
Ketika saya sedang menunggu chip, saat bereksperimen dengan sirkuit, saya jelas menyadari bahwa saya ingin membuat papan sirkuit tercetak di rumah. Ya, ya, ada pengalaman dalam teknologi penyetrikaan laser, dan bahkan menggambar dengan pernis, tetapi saya menginginkan sesuatu yang nyata. Diputuskan untuk menggunakan film photoresist dan lampu UV untuk kuku. Secara alami, masalah timbul dari lubang pengeboran dan pelapisan. Dan ternyata dari sana bahwa lubang-lubang itu perlu di-metalisasi sebelum lintasan diukir di papan. Kalau tidak, menerapkan arus ke setiap lubang adalah keseluruhan cerita.

Ternyata pengeboran manual menghilang, karena tidak ada yang bisa dinavigasi (jangan menawarkan kertas dengan kartu lubang).

Diputuskan untuk menggantung spindle pada printer 3D yang ada, bukan Direct-head, dan hidup seperti itu. Dan di sini ada solusi yang ingin saya bagikan hari ini.

Head yang Dapat Dipertukarkan untuk RepRap


Agar mudah mengubah printer menjadi bor dan sebaliknya, diputuskan untuk membuat kepala dilepas. Slider yang diikat ke sabuk terpisah, dan yang lainnya bisa dilepas. Mengingat ini bukan kabar baik, sungguh sulit, tidak ada gunanya menyusun artikel terpisah. Berikut ini hanya foto dan tautan ke model STL , jika ada yang ingin melakukan hal yang persis sama. Arsip juga mengandung sumber SLDPRT, jika ada sesuatu untuk diperbaiki. Berayun lambat - terima kasih kepada ADSL dari Beltelecom, tetapi itu harus lama.

Hasilnya seperti ini:









Kepala spindle


Semuanya sederhana di sini - setelah upaya panjang untuk membuat poros sendiri, saya memutuskan untuk membeli satu di AliExpress, dan hanya menggantungnya di braket. Tidak ada foto, saat dalam proses.

G-Code Generator


Dan di sini kesenangan dimulai.

Dengan globalisme saya yang melekat, saya membahas solusi yang tersedia, dan menyadari bahwa masing-masing dari mereka tidak hanya dapat menciptakan banyak masalah ketika menggunakan teknologi di rumah, tetapi juga mengirimkannya secara teratur dan metodis, hingga pensiun. Apa yang tidak kamu sukai? Fleksibilitas. Semuanya lebih untuk mesin, dengan karakteristik templat yang telah ditentukan, dll. Ya, masalahnya tidak rumit. Tetapi suatu hari saya benar-benar tidak ingin menghadapi situasi di mana Anda perlu sedikit memodifikasi algoritme, dan tidak dapat melakukannya. Misalnya, saya belum melihat alat yang dapat memutar lubang di sekitar sumbu. Tetapi setelah metalisasi, Anda tidak bisa meletakkan papan 1: 1. Tapi ini adalah pemikiran untuk masa depan. Saya belum membutuhkannya. Tapi itu sudah mungkin. Secara umum, saya menginginkan sesuatu yang sederhana, ringan, fleksibel dan ... efisien. Saya memutuskan untuk memercikkannya sendiri.

Pustaka 5.11 Qt digunakan sebagai basis. Aplikasi ini ditulis dengan gaya konsol. Arsitektur aplikasi dibuat dalam gaya linux.

Aplikasi menerima file DRL yang ditarik keluar dari PCAD saat membuat Geber-kit. (Kamu mungkin harus memodifikasi parser jika kamu ingin memberinya sesuatu dari AltiumDesigner. Tapi untuk diriku sendiri, aku secara pribadi memutuskan untuk mengambil monster Altium ini dari dosa. Untuk apa dia sekarang berada dalam mimpi yang mengerikan dan tidak membiarkan aku melupakan namaku sendiri).

File XML ditentukan sebagai parameter. Format file ini akan dijelaskan di bagian kedua artikel. File ini, pada kenyataannya, menentukan mekanisme untuk menghasilkan G-Code (dan bahkan, setiap file teks) untuk mentransfernya (G-code) ke printer 3D.

Mekanisme aplikasi


  1. Format DRL (yang merupakan M48 atau Excellon ) dibaca dan dikenali. Hasilnya adalah alat yang berisi daftar lubang yang dibor dengan alat ini.
  2. Dengan data yang diperoleh dari item 1, kita pergi ke XML, mencari node script di sana, dan cukup jalankan semua yang ditulis di sana. Ada lima operator, tetapi kami tidak perlu lagi.
  3. Selama pelaksanaan langkah 2, pernyataan cetak terjadi. Hasilnya dicetak pada aliran output.

Bagian Dua Format file XML


Untuk membuat program sefleksibel mungkin, perpustakaan ScriptEngine digunakan. Dirinya sedikit kewalahan dengan apa yang sekarang bisa dilakukan dengan konfigurasi. Postulat utama adalah ini: ada banyak parameter terhitung yang ditangani setransparan mungkin: teks dilewatkan ke modul ScriptEngine, dan hasilnya digunakan. Situasi yang sama terjadi jika kombinasi $ {blah blah blah} ditemukan dalam templat G-Code. Selain itu, semua yang ada di dalam kurung keriting akan diteruskan ke perhitungan, dan seluruh templat akan diganti oleh hasilnya.

Kode sumber

File contoh untuk printer saya
<xml> <variables> <var name="ZChangeToolValue" value="30"/> <var name="ZTravelValue" value="10"/> <var name="ZDrillValue" value="0"/> </variables> <functions> <!-- predefined function with single parameter: a - source (requested) diameter returns - suggested tool diameter for give requested after halvanic if function nod defined, it assumed return=a --> <plate_increase_dia f="a+0.2"/> </functions> <tools> <!-- "tool" node defines a real drill tool for make a hole Depends on your technical process you can set up different tools for plated or not holes or join same holes in single tool. Required parameters for tool are: 1. range_min,range_max - diameters range to assign holes for this tool You can joun different diameters (f.ex. 0.31-0.4) to single tool 2. plated="yes|no|both" - defines plated property to Other parameters are optional and can be used later in G-Code patterns. For example, you can define tool position or toolbox coords for the tool. --> <tool description="0,3mm" range_min="0" range_max="0.3" plated="both" position="0" /> <tool description="0,4mm" range_min="0.3" range_max="0.4" plated="both" position="1" /> <tool description="0,5mm" range_min="0.4" range_max="0.5" plated="both" position="2" /> <tool description="0,6mm" range_min="0.5" range_max="0.6" plated="both" position="3" /> <tool description="0,7mm" range_min="0.6" range_max="0.7" plated="both" position="4" /> <tool description="0,8mm" range_min="0.7" range_max="0.8" plated="both" position="5" /> <tool description="0,9mm" range_min="0.8" range_max="0.9" plated="both" position="6" /> <tool description="1,0mm" range_min="0.9" range_max="1.0" plated="both" position="7" /> <tool description="1,1mm" range_min="1.0" range_max="1.1" plated="both" position="8" /> <tool description="1,2mm" range_min="1.1" range_max="5" plated="both" position="9" /> </tools> <patterns> <!-- in any pattern you can use any variable from context where it's printing Example (used inside 'tool' loop type): Mnnn Please, change tool to ${description} ; message to lcd Mnnn ; pause Note : here ${description} is optional tag defined in <tool> node Use this example outsite the tool loop will cause calculation error. --> <pattern name="start"> G90 ;${var hcnt=holesCount;var tcnt=toolsCount;"Hello"} M117 Homing G28 XY M117 Move Z to travel G0 X${minX} Y${minY} M76 G92 Z${ZTravelValue} </pattern> <pattern name="finish"> G0 Z${ZChangeToolValue} M104 S0 ; disable spindle G0 X0 Y220 M117 Drill finished M300 S600 P1 ; Stats: ; Holes : ${holesCount} ; Tools : ${toolsCount} </pattern> <pattern name="set_tool"> ; Tools rest: ${tcnt--} G0 Z${ZChangeToolValue} G0 X100 Y0 M104 S0 ; disable spindle M117 Change tool to ${description} M300 S600 P1 M76 ; pause job M117 Drilling M104 S100 ; enable spindle G28 X </pattern> <pattern name="go_drill"> ; Holes rest: ${hcnt--} ; Percent rest: ${var percent=Math.round(hcnt*100/holesCount); percent}% M73 P${100-percent} G0 Z${ZTravelValue} G0 X${Math.round(x*100)/100} Y${Math.round(y*100)/100} G0 Z${ZDrillValue} G0 Z${ZTravelValue} </pattern> </patterns> <script> <!-- "assign tools". No parameters Just assign all tools declared in DRL-file to tools described in <tools> node. For each DRL-defined tool will be selected FIRST compatible tool from <tools> node. Ie if range 0.3..0.8 will be defined early, <tool> node for diameter 0.4..0.5 will never be assigned. Except 'plated' property will be different. --> <command verb="assign tools" /> <!-- "assign tools". No parameters Join all DRL-file tools, assigned to same tool here to one tool (also holes) Just avoid multiply changing physical tool to same --> <command verb="join tools" /> <!-- "offset". Offset ALL holes by defined values xoffs, yoffs - values to offset. Before offset will be calculated ie here you can use global variables. --> <command verb="offset" xoffs="-minX+10" yoffs="-minY+10"/> <!-- loop for each DRL-tool (assigned and joined before). Context inside will be filled also with tool's properties and node's parameters --> <command verb="print" pattern="start"/> <loop type="tools"> <command verb="print" pattern="set_tool"/> <command verb="print context" line_begin=";"/> <!-- loop for each hole inside the tool. Context inside will be filled also with hole's properties(x&y) and node's parameters --> <loop type="toolholes"> <command verb="print" pattern="go_drill"/> <!-- "print context". Anwhere in script you can use this verb. It inserts all context variables available. Usefull for debug but completely useless for normal work --> <command verb="print context" line_begin=";"/> </loop> </loop> <command verb="print" pattern="finish"/> </script> </xml> 



Dan versi file yang sama setelah tes praktis
 <xml> <variables> <var name="ZChangeToolValue" value="10"/> <var name="ZTravelValue" value="2"/> <var name="ZDrillValue" value="-3"/> <var name="FeedHorizontal" value="24000"/> <var name="FeedDown" value="100"/> <var name="FeedFree" value="2000"/> <var name="StartOffsX" value="20"/> <var name="StartOffsY" value="20"/> <var name="ZZeroPosition" value="0.1"/> <var name="first" value="0"/> </variables> <functions> <!-- predefined function with single parameter: a - source (requested) diameter returns - suggested tool diameter for give requested after halvanic if function nod defined, it assumed return=a --> <plate_increase_dia f="a+0.3"/> </functions> <tools> <!-- "tool" node defines a real drill tool for make a hole Depends on your technical process you can set up different tools for plated or not holes or join same holes in single tool. Required parameters for tool are: 1. range_min,range_max - diameters range to assign holes for this tool You can joun different diameters (f.ex. 0.31-0.4) to single tool 2. plated="yes|no|both" - defines plated property to Other parameters are optional and can be used later in G-Code patterns. For example, you can define tool position or toolbox coords for the tool. --> <tool description="0,3mm" range_min="0" range_max="0.3" plated="both" position="0" /> <tool description="0,4mm" range_min="0.3" range_max="0.4" plated="both" position="1" /> <tool description="0,5mm" range_min="0.4" range_max="0.5" plated="both" position="2" /> <tool description="0,6mm" range_min="0.5" range_max="0.6" plated="both" position="3" /> <tool description="0,7mm" range_min="0.6" range_max="0.7" plated="both" position="4" /> <tool description="0,8mm" range_min="0.7" range_max="0.8" plated="both" position="5" /> <tool description="0,9mm" range_min="0.8" range_max="0.9" plated="both" position="6" /> <tool description="1,0mm" range_min="0.9" range_max="1.0" plated="both" position="7" /> <tool description="1,1mm" range_min="1.0" range_max="1.1" plated="both" position="8" /> <tool description="1,2mm" range_min="1.1" range_max="5" plated="both" position="9" /> </tools> <patterns> <!-- in any pattern you can use any variable from context where it's printing Example (used inside 'tool' loop type): Mnnn Please, change tool to ${description} ; message to lcd Mnnn ; pause Note : here ${description} is optional tag defined in <tool> node Use this example outsite the tool loop will cause calculation error. --> <pattern name="start1"> ; Start </pattern> <pattern name="set_tool1"> ; Set tool ${description} </pattern> <pattern name="finish1"> ; Finish </pattern> <pattern name="go_drill1"> ; Drill X${Math.round(x*100)/100} Y${Math.round(y*100)/100} </pattern> <pattern name="start"> ;${var hcnt=holesCount;var tcnt=toolsCount;"Hello"} M117 Homing G28 G0 Z0 F${FeedFree} G92 Z1.6 </pattern> <pattern name="finish"> G0 Z${ZChangeToolValue} F${FeedFree} M400 M5 ; disable spindle G0 X0 Y220 F${FeedHorizontal} M117 Drill finished M300 S600 P100 ; Stats: ; Holes : ${holesCount} ; Tools : ${toolsCount} </pattern> <pattern name="set_tool"> ; Tools rest: ${tcnt--} G0 Z${ZChangeToolValue} F${FeedFree} M400 G0 X100 Y0 F${FeedHorizontal} M117 Stopping spindle M5 ; disable spindle M117 Change tool to ${description} M300 S600 P100 M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M25 M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause G28 XY G0 X${StartOffsX-1} Y${StartOffsX-1} Z${ZTravelValue} F${FeedHorizontal} G0 Z${ZZeroPosition} F${FeedFree} M117 Check zero-hole M300 S600 P100 M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M25 M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause M400 ; This strange line is just crutch to prevent Marlin from read-n-exec other commands begore do pause G92 Z${ZZeroPosition} F${FeedDown} M117 Starting spindle M3 ; enable spindle G0 Z${ZDrillValue} F${FeedDown/3} G0 Z${ZTravelValue} F${FeedFree} M117 Drilling M117 Starting spindle M3 ; enable spindle </pattern> <pattern name="go_drill"> ; Holes rest: ${hcnt--} ; Percent rest: ${var percent=Math.round(hcnt*100/holesCount); percent}% M73 P${100-percent} M117 Drilling X${Math.round(x*100)/100} Y${Math.round(y*100)/100} Z${ZTravelValue} G0 Z${ZTravelValue} F${FeedFree} G0 X${(Math.round(x*100)/100)-2} Y${(Math.round(y*100)/100)-2} F${FeedHorizontal} G0 X${Math.round(x*100)/100} Y${Math.round(y*100)/100} F${FeedHorizontal} M400 G0 Z${Math.round((ZZeroPosition+0.2)*100)/100} F${FeedFree} G0 Z${Math.round((ZZeroPosition-0.3)*100)/100} F${FeedDown/10} G0 Z${ZDrillValue} F${FeedDown} M117 Return G0 Z${ZTravelValue} F${FeedFree} </pattern> <pattern name="second_time"> ; ${var hcnt=holesCount;var tcnt=toolsCount;"SECOND!!!"} </pattern> </patterns> <script> <!-- "assign tools". No parameters Just assign all tools declared in DRL-file to tools described in <tools> node. For each DRL-defined tool will be selected FIRST compatible tool from <tools> node. Ie if range 0.3..0.8 will be defined early, <tool> node for diameter 0.4..0.5 will never be assigned. Except 'plated' property will be different. --> <command verb="assign tools" /> <!-- "assign tools". No parameters Join all DRL-file tools, assigned to same tool here to one tool (also holes) Just avoid multiply changing physical tool to same --> <command verb="join tools" /> <!-- "offset". Offset ALL holes by defined values xoffs, yoffs - values to offset. Before offset will be calculated ie here you can use global variables. --> <command verb="offset" xoffs="-minX+StartOffsX" yoffs="-minY+StartOffsY"/> <!-- loop for each DRL-tool (assigned and joined before). Context inside will be filled also with tool's properties and node's parameters --> <command verb="sort tools"/> <command verb="print" pattern="start"/> <loop type="tools"> <condition content="first++==0"> <command verb="print" pattern="set_tool"/> </condition> <command verb=";print context" line_begin=";"/> <!-- loop for each hole inside the tool. Context inside will be filled also with hole's properties(x&y) and node's parameters --> <loop type="toolholes"> <command verb="print" pattern="go_drill"/> <!-- "print context". Anwhere in script you can use this verb. It inserts all context variables available. Usefull for debug but completely useless for normal work --> <command verb=";print context" line_begin=";"/> </loop> </loop> <condition content="first=0"> <command verb=";dummy"/> </condition> <command verb="print" pattern="second_time"/> <loop type="tools"> <condition content="first++>0"> <command verb="print" pattern="set_tool"/> <command verb=";print context" line_begin=";"/> <!-- loop for each hole inside the tool. Context inside will be filled also with hole's properties(x&y) and node's parameters --> <loop type="toolholes"> <command verb="print" pattern="go_drill"/> <!-- "print context". Anwhere in script you can use this verb. It inserts all context variables available. Usefull for debug but completely useless for normal work --> <command verb=";print context" line_begin=";"/> </loop> </condition> </loop> <command verb="print" pattern="finish"/> </script> </xml> 



Padahal, tidak ada yang rumit, jika Anda membacanya. Tetapi mari kita menganalisis bagian demi bagian:

  <variables> <var name=" " value=" "/> </variables> 

Di bagian variabel, seperti namanya, kita dapat mendefinisikan set variabel global yang arbitrer. Mereka tidak mempengaruhi operasi program dengan cara apa pun sampai mereka bertemu dalam ekspresi yang dihitung.

  <functions> <plate_increase_dia f="a+0.2"/> </functions> 

Fungsi Nah, lebih tepatnya, sebuah fungsi. Sejauh ini, sudah ditentukan sebelumnya, satu: perhitungan diameter nyata bor untuk lubang logam. Diketahui bahwa metalisasi mencuri diameter, dan ini sering menyebabkan insiden ketika mencoba untuk menempelkan kaki komponen 0,8, yang tidak masuk ke lubang yang diletakkan sebagai 0,9. Agar tidak repot dengan ini ketika mendesain, saya memutuskan untuk menambahkan fungsi ini.

Arti bagian ini adalah untuk menentukan fungsi yang dapat digunakan konverter untuk tujuan tertentu. Fungsi-fungsi ini tidak dapat (belum?) Digunakan secara independen.

  <tools> <tool description="0,3mm" range_min="0" range_max="0.3" plated="both" position="0" /> </tools> 

Latihan. Di sini Anda perlu membuat referensi ke perintah skrip "align tools", tentang yang di bawah ini. Setiap elemen dari bagian ini mendefinisikan sel tempat semua alat yang dikenali dalam file input akan dikumpulkan. Idenya adalah bahwa seringkali ketika mendesain, diameter inci terjadi, dan banyak alat dengan nilai 0.478 ... 0.492 ... dll. Agar tidak mengacaukannya, kami menetapkan parameter yang diperlukan range_min dan range_max. Tanda metalisasi juga diperlukan. Node XML dipindai secara berurutan, dan segera setelah alat berikutnya dari DRL sesuai dengan definisi, node dikenali sebagai cocok.
Anda dapat mengatur parameter lain di node. Nilainya nanti dapat digunakan dalam templat.

Anda dapat mengatur posisi di tempat pensil atau koordinat tempat menangkap bor, jika Anda memiliki mesin dengan alat ganti otomatis. Dan Anda dapat menggambarkan alat dengan huruf untuk ditampilkan di layar printer, jika Anda, seperti milik saya, memiliki Marlin dan perubahan mata bor secara manual.

  <patterns> <pattern name="start"> G90 ;${var hcnt=holesCount;var tcnt=toolsCount;"Hello"} M117 Homing G28 XY M117 Move Z to travel G0 X${minX} Y${minY} M76 G92 Z${ZTravelValue} </pattern> 

Dan sekarang, hargai semua pesona mesin skrip! Templat. Konverter, seperti sudah saya katakan, bekerja dengan templat secara sederhana: ia mencari semua bagian formulir $ {...}, dan mengirimkannya ke mesin skrip. Dan ada bahasa seperti JS. Karena itu, pada kenyataannya, Anda bahkan dapat memprogram sedikit. Dalam contoh ini, Anda dapat melihat bagaimana, saat menampilkan pola awal, kami pertama-tama mendefinisikan sepasang variabel yang diberi nilai global. Nah, baru kemudian mereka menulis sebuah konstanta, yang akan menjadi nilai dari eksekusi bagian ini.

Ketika template ini di-output ke file output, kita akan melihat:

 G90 ;Hello M117 Homing G28 XY M117 Move Z to travel G0 X10 Y10 M76 G92 Z10 

Yah, aku tidak bisa membanggakan. Nilai potongan dari template untuk mengebor setiap lubang:

  ; Holes rest: ${hcnt--} ; Percent rest: ${var percent=Math.round(hcnt*100/holesCount); percent}% M73 P${100-percent} 

ya ... setiap kali kami mengetik komentar pada Holes rest, kami akan menurunkan nilai hcnt. Dan itu, seperti yang kita ingat, ditentukan saat kita mengetik start, dan, oleh karena itu, terletak dalam konteks di atas. Dan kemudian kita akan menghitung variabel persen untuk menggunakannya di bagian lain sesudahnya - ketika meneruskannya ke perintah M73 (perintah ini memaksa marlin untuk memindahkan bilah kemajuan). Kode-G yang dihasilkan oleh fragmen ini:

 ; Holes rest: 6 ; Percent rest: 13% M73 P87 

omong-omong, toolsCount, minX adalah nama-nama variabel global yang sudah ditentukan sebelumnya.
Saya perhatikan bahwa nama templat tidak ditentukan sebelumnya, mis. Anda bisa menggunakan apa saja. Template akan dicetak ketika perintah cetak dan namanya ditemukan dalam skrip.

 <script> <command verb="assign tools" /> 

Dan dasarnya adalah bagian skrip


Node dengan perintah dan loop nama dapat ditemukan di dalam bagian.

Format simpul perintah :

  <command verb=" " ....    ... /> 

Pernyataan tindakan adalah salah satu dari sedikit operator. Opsi untuk masing-masing dijelaskan di bawah ini. Mereka dapat ditambahkan oleh orang lain yang, seperti yang sudah Anda pahami, dapat digunakan dalam template.

Format simpul simpul:

 <loop type=" "> ..... </loop> 

loop adalah bagian yang isinya akan dieksekusi untuk setiap elemen yang ditentukan oleh jenis loop. Ada dua dari mereka (untuk saat ini):

tools - sebuah loop akan dieksekusi untuk setiap tool, dan
lubang alat - sebuah siklus akan dieksekusi untuk setiap lubang yang dirancang untuk pengeboran dengan alat ini. Jelas, loop lubang alat hanya bisa bersarang di alat .
Pada saat yang sama, ketika mengeksekusi loop bersarang, semua variabel untuk alat saat ini tersedia. Mengapa Saya tidak tahu. Baru diberitahu.

Operator


menetapkan alat
Opsi: tidak ada.

Tetapkan setiap bor dari file alat sumber dari XML. Tanpanya, sebagian besar tindakan lain tidak ada artinya.

bergabung dengan alat
Opsi: tidak ada.
Lebih banyak organisasi - menggabungkan semua alat yang telah ditetapkan sama dari file XML. Masuk akal setelah alat tetapkan, tapi saya memutuskan untuk memberi pengguna kesempatan untuk melakukan operasi mereka.

alat semacam itu
Parameter: tidak ada (belum).
Mengurutkan latihan dengan meningkatkan diameter

mengimbangi
Parameter:
xoffs, yoffs - nilai offset. Mesin skrip sedang berjalan.
Menggeser semua lubang ke nilai yang ditentukan. Ya, sering terjadi bahwa papan tidak berjauhan dengan asalnya.

cetak
Parameter:
pola Nama pola.
Mencetak template dengan nama yang ditentukan pada aliran output.

konteks cetak
Parameter:
line_begin, line_end - awal dan akhir setiap baris.
Hal debug - memungkinkan Anda untuk mengeluarkan semua variabel yang saat ini tersedia dan nilainya di mana saja di dalam keluaran. Setiap variabel ditampilkan dalam baris terpisah, awal dan akhir ditentukan dalam parameter

Nama variabel global yang telah ditentukan sebelumnya.


holesCount, toolsCount - Saya benar-benar, sangat, sangat berharap bahwa makna dari variabel-variabel ini tidak perlu penjelasan. Ya, ya Ini adalah jumlah alat dan jumlah lubang.
minX, maxX, minY, maxY - dan ini juga. Tidak, well, untuk jaga-jaga, ini adalah koordinat lapangan pengeboran. Semua lubang ada di dalam persegi panjang ini. Dihitung ulang setelah perintah offset.

Kesimpulan


Di sini, pada kenyataannya, saya mencoba secara singkat, tetapi selengkap mungkin menggambarkan tulza yang dibuat.

Jujur, ketika saya mencoba membayangkan skenario penggunaan, saya dengan jelas membayangkan berapa kali kuk Tatar-Mongol akan muncul di tanah Rusia (diyakini bahwa mereka membawa kami tikar).

Karena itu pertanyaannya: apakah layak untuk kebingungan, dan membuat halaman web sederhana di mana Anda dapat memasukkan input dan skrip, dan mendapatkan G-Code yang sudah selesai, melewati tahapan perakitan dari sumber?
UPD:
Terima kasih kepada mereka yang memilih. Saya mencucinya . Dan ... ya: Saya menulis bahwa halaman web akan sederhana? Jika seseorang tidak terlalu malas untuk membawa semuanya ke tampilan yang lebih estetis - lempar HTML ke dalam PM.

Source: https://habr.com/ru/post/id428534/


All Articles