-
Notifications
You must be signed in to change notification settings - Fork 0
/
FlatCamAuto.FlatScript
363 lines (307 loc) · 19.6 KB
/
FlatCamAuto.FlatScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
# ____ _ ____ ___ ____ ____ _ _
# |--- |___ |--| | |___ |--| |\/|
# ____ _ _ ___ ____ _ _ ____ ___ _ ____ __ _
# |--| |__| | [__] |\/| |--| | | [__] | \|
#
#
# HOWTO:
# 1. Create project in KiCAD
# 2. make PCB ( set auxillary origin point )
# 3. plot PCB with layers using auxillary axis origin point and "Do not tent vias" :
# - minimal: F.Cu, Edge.Cuts
# - available:
# * F.Cu
# * B.Cu
# * F_Mask, B_Mask, Eco1.User (front annotations), Eco2.User (back annotations), Edge.Cuts
# * User_1 / User_2 - for NCC (non-copper-clearing) polygons front & back respectively
# 4. Generate drills file in KiCAD (use auxillary axis)
# 5. Open FlatCAM
# 6. Load this script
# 7. Setup paths below (input & output)
# 8. Adjust cuts/overlaps & other params - according to your/cnc needs
# 9. Open gcodes in OpenCNCPilot or your fav cnc sender software
# 10. Process files with order given by filename
# - 1. make heightmap, apply to gcode & engrave isolation of front
# - 2. optional: engrave front annotations (Eco1 layer) - eg. some texts engraved in copper
# - 3. optional: cover front with UV-curable solder mask ink & cure (cover with thin foil, then glass to equalize UV ink layer thickness)
# - 4. optional: engrave with floating engraving tool your front mask, zero Z at Z=-0.5mm)
# (depth=-0.5mm), weakest spring load (CNCAid FET Tool holder)
# TO CHECK:
# - 4a. drill'n'mill holes from front - drilling from bottom after bottom processing can make copper tear off the board, esp. when mask applied
# start with biggest drill (easier to zero-probe)
#
# - 5. drill 1.5mm alignment holes (to rotate board upside down and align proper x0y0 )
# - 5b. with 90deg V-bit carve path of CutOut to make board edges looks sexier :)
# - 6. rotate board, align with pins,
# - 7. make heightmap, apply to gcode & engrave isolation of back
# - 8. optional: engrave back annotations (Eco2 layer)
# - 9. optional: cover back with UV mask ink & cure
# - 10. optional: engrave with FET back mask
# OR DRILL HERE, BUT HOW TO PROTECT TOP COPPER WHEN MILLING FROM BOTTOM ?
# - 12. with 90deg V-bit carve path of mirrored CutOut before actually cutting out board from plate
# - 13. cut edges with 1.5mm two-flute flathead or fishtail bit
# DONE.
#
# kicad_name = kicad project name / folder name
# kicad_path = kicad's projects path
# track_z_cut = gerber isolation z_cut depth
# annot_z_cut = Eco1 & Eco2 layer paint z_cut
# track_xy_feed = isolation carving speed
# z_feedrate = isolation Z plunge speed
# mirror_axis = mirror axis for two sided boards (Y = left<->right, X = top<->bottom)
# shallow_hole_diam_front = diameter of holes (excellon) which will be drilled shallow from FRONT side of PCB (up to shallow_hole_depth) - useful for some PCB stuff I made
# shallow_hole_diam_back = the same, but BACK side of PCB
# thruhole_z - depth of holes
# cutout_z_cut - depth of cutout (should equal PCB thickness+0.1mm)
# DEFINE PROJECT NAME AND PATH (without trailing slash) --------------------------------------------------------------------------------------------------------------------
# << PROJECT NAME (DIRECTORY NAME) >>
set kicad_name $shellvar_0
# set kicad_name "60mm_new_power_small"
# << PROJECT PATH >>
set kicad_path "/mnt/Gerbers"
# << OUTPUT PATH, if empty - equals to PROJECT PATH, if doesn't exist - CREATE ONE >>
set output_path "/mnt/Frezarra"
# good params :
# vbit 45/0.1 => z_cut=-0.08, iso_passes=2
# vbit 60/0.1 => z_cut =-0.03, iso_passes=1
# PROCESSING DETAILS
set track_z_cut -0.05
set vbit_angle 60
set vbit_tip 0.1
set vbit_angle_rad [ expr { $vbit_angle/2 *3.14159/180 } ]
set vbit_iso_width [ expr { $vbit_tip + -$track_z_cut * 2 * [ tcl::mathfunc::tan $vbit_angle_rad ] } ]
set iso_passes 3
set isolation_overlap 50
set annot_z_cut -0.05
set track_xy_feed 400
set z_feedrate 160
set mirror_axis "Y"
set shallow_hole_diam_front 0.3
set shallow_hole_diam_back 0.35
set shallow_hole_depth -0.5
#how deep drill the hole
set thruhole_z -2.0
#make holes mirrored (drilled from backside) or not?
set thruhole_mirrored "Y"
set ncc_tool_dia 1.5
set ncc_z_cut -0.3
set ncc_xy_feed 300
set ncc_z_feed 160
set cutout_z_cut -1.8
set cutout_tool_dia 1.5
set cutout_passes 1
set cutout_cut_per_pass [ expr { -$cutout_z_cut / $cutout_passes } ]
set add_cutout_offset "Y"
set cutout_feedrate_xy 200
set cutout_feedrate_z 160
set cutout_carve_z_cut -0.5
set cutout_carve_vbit_angle 90
set cutout_carve_vbit_tip 0.1
set cutout_carve_vbit_angle_rad [ expr { $cutout_carve_vbit_angle / 2 *3.14159/180 } ]
set cutout_carve_path_width [ expr { $cutout_carve_vbit_tip + -$cutout_carve_z_cut * 2 * [ tcl::mathfunc::tan $cutout_carve_vbit_angle_rad ] } ]
set align_holes_depth -6
set align_holes_dia 1.5
set spindle_rpm 1000
set spindle_dwell 2
set mask_xy_feed 600
set mask_z_feed 250
set mask_z_travel 1
set mask_z_cut -0.001
set mask_overlap 20
set mask_vbit_tip 0.2
set mask_method "combo"
set panel_count_x 2
set panel_count_y 2
set panel_spacing_x 1.5
set panel_spacing_y 1.5
# CLEAR PROJECT in FlatCAM, but do not delete script ;)
set objnames [split [get_names] "\n" ]; list
set i 0
set l_obj [llength $objnames]
while {$i < $l_obj} {
set obj [lindex $objnames $i]
if !{[string match "*.FlatScript" $obj]} {
delete $obj -f 1
}
incr i
}
# SET UP PATHS AND FILENAMES
set kicad_gerber_path "$kicad_path/$kicad_name/gerber"; list
if {$output_path != ""} {
set flatcam_output_path "$output_path/$kicad_name"
file mkdir $flatcam_output_path
} else {
set flatcam_output_path "$kicad_gerber_path"
# DELETE PREVIOUS OUTPUT FILES FROM OUTPUT_PATH
file delete -force -- $flatcam_output_path
file mkdir $flatcam_output_path
}
# SETUP FILE NAMES
set gerber_front_copper "$kicad_gerber_path/$kicad_name-F_Cu.gbr"; list
set gerber_back_copper "$kicad_gerber_path/$kicad_name-B_Cu.gbr"; list
set gerber_cutout "$kicad_gerber_path/$kicad_name-Edge_Cuts.gbr"; list
set gerber_drills_pth "$kicad_gerber_path/$kicad_name-PTH.drl"; list
set gerber_front_annot "$kicad_gerber_path/$kicad_name-User_Eco1.gbr"; list
set gerber_back_annot "$kicad_gerber_path/$kicad_name-User_Eco2.gbr"; list
set gerber_front_mask "$kicad_gerber_path/$kicad_name-F_Mask.gbr"; list
set gerber_back_mask "$kicad_gerber_path/$kicad_name-B_Mask.gbr"; list
set gerber_front_ncc "$kicad_gerber_path/$kicad_name-User_1.gbr"; list
set gerber_back_ncc "$kicad_gerber_path/$kicad_name-User_2.gbr"; list
# OPEN SOURCE FILES
open_gerber $gerber_front_copper -outname FrontCopper
open_gerber $gerber_back_copper -outname BackCopper
open_gerber $gerber_cutout -outname CutOut
open_gerber $gerber_back_annot -outname BackAnnot
open_gerber $gerber_front_annot -outname FrontAnnot
open_gerber $gerber_front_mask -outname FrontMask
open_gerber $gerber_back_mask -outname BackMask
open_gerber $gerber_front_ncc -outname FrontNCC
open_gerber $gerber_back_ncc -outname BackNCC
open_excellon $gerber_drills_pth -outname Holes
# panelize "FrontCopper_iso" -box "xCutOut" -spacing_columns $panel_spacing_x -spacing_rows $panel_spacing_y -columns $panel_count_x -rows $panel_count_y -outname "gFrontCopper_iso"
# panelize "BackCopper_iso" -box "xCutOut" -spacing_columns $panel_spacing_x -spacing_rows $panel_spacing_y -columns $panel_count_x -rows $panel_count_y -outname "gBackCopper_iso"
# panelize "CutOut" -box "xCutOut" -spacing_columns $panel_spacing_x -spacing_rows $panel_spacing_y -columns $panel_count_x -rows $panel_count_y -outname "gCutOut"
# panelize "BackAnnot" -box "xCutOut" -spacing_columns $panel_spacing_x -spacing_rows $panel_spacing_y -columns $panel_count_x -rows $panel_count_y -outname "gBackAnnot_paint"
# panelize "FrontAnnot_paint" -box "xCutOut" -spacing_columns $panel_spacing_x -spacing_rows $panel_spacing_y -columns $panel_count_x -rows $panel_count_y -outname "gFrontAnnot_paint"
# panelize "FrontMask" -box "xCutOut" -spacing_columns $panel_spacing_x -spacing_rows $panel_spacing_y -columns $panel_count_x -rows $panel_count_y -outname "gFrontMask"
# panelize "BackMask" -box "xCutOut" -spacing_columns $panel_spacing_x -spacing_rows $panel_spacing_y -columns $panel_count_x -rows $panel_count_y -outname "gBackMask"
# panelize "Holes" -box "xCutOut" -spacing_columns $panel_spacing_x -spacing_rows $panel_spacing_y -columns $panel_count_x -rows $panel_count_y -outname "gHoles"
#temporarily set mirrored flag as ""
set mirrored ""
#1. ISOLATE FRONT COPPER
if {[lsearch [get_names] FrontCopper]>=0} {
isolate "FrontCopper" -dia $vbit_iso_width -passes $iso_passes -overlap $isolation_overlap -combine 1 -outname "FrontCopper_iso"
cncjob "FrontCopper_iso" -dia $vbit_tip -z_cut $track_z_cut -z_move 1 -feedrate $track_xy_feed -feedrate_z $z_feedrate -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endxy 0,0 -endz 30 -pp "grbl_11" -outname "FrontCopper_iso_cnc"
write_gcode "FrontCopper_iso_cnc" "$flatcam_output_path/1_45V_FrontCopper.nc"
}
#1a. ENGRAVE FRONT ANNOTATIONS with same tool (negative/carved-out text on copper) - Eco1_User layer
if {[lsearch [get_names] FrontAnnot]>=0} {
paint "FrontAnnot" -tooldia $vbit_tip -offset 0 -method standard -all -outname "FrontAnnot_paint"
cncjob "FrontAnnot_paint" -dia $vbit_tip -z_cut $annot_z_cut -z_move 1 -feedrate $track_xy_feed -feedrate_z $z_feedrate -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endxy 0,0 -endz 30 -pp "grbl_11" -outname "FrontAnnot_paint_cnc"
write_gcode "FrontAnnot_paint_cnc" "$flatcam_output_path/1a_45V_FrontAnnot.nc"
}
#1b. PAINT FRONT NCC preferably 1-1.5mm flat 2-3flute - User_1 layer
if {[lsearch [get_names] FrontNCC]>=0} {
paint "FrontNCC" -tooldia $ncc_tool_dia -offset 0 -method standard -all -outname "FrontNCC_paint"
cncjob "FrontNCC_paint" -dia $ncc_tool_dia -z_cut $ncc_z_cut -z_move 1 -feedrate $ncc_xy_feed -feedrate_z $ncc_z_feed -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endxy 0,0 -endz 30 -pp "grbl_11" -outname "FrontNCC_paint_cnc"
write_gcode "FrontNCC_paint_cnc" "$flatcam_output_path/1b_1F5_FrontNCC.nc"
}
#2. CREATE ALIGNMENT DRILLS
if {[lsearch [get_names] CutOut]>=0} {
if {[lsearch [get_names] BackCopper]>=0} {
aligndrill "CutOut" -axis $mirror_axis -box "CutOut" -dia $align_holes_dia -grid 1 -gridoffset 1 -minoffset 1 -outname "AlignmentDrills"
drillcncjob "AlignmentDrills" -drilled_dias $align_holes_dia -diatol 5 -drillz $align_holes_depth -travelz 1 -feedrate_z 80 -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endz 30 -endxy 0,0 -outname "AlignmentDrills_cnc"
write_gcode "AlignmentDrills_cnc" "$flatcam_output_path/2_1D5_AlignmentDrills.nc"
}
}
#3. DRILL SHALLOW HOLES on FRONT copper (those with 0.3mm, those of 0.35mm are drilled on BACK)
if {[lsearch [get_names] Holes]>=0} {
drillcncjob "Holes" -drilled_dias $shallow_hole_diam_front -diatol 5 -drillz $shallow_hole_depth -travelz 1 -feedrate_z 80 -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endz 30 -endxy 0,0 -outname "FrontShallowDrills_cnc"
write_gcode "FrontShallowDrills_cnc" "$flatcam_output_path/3_0D6_FrontShallowDrills.nc"
}
# DO WE HAVE BACKCOPPER ?? - ie. two sided board requested
#!!! ROTATE BOARD on $MIRROR_AXIS using Alignment holes !!!
#4. MIRROR & ISOLATE BACK COPPER
if {[lsearch [get_names] BackCopper]>=0} {
mirror "BackCopper" -box "CutOut" -axis $mirror_axis
isolate "BackCopper" -dia $vbit_iso_width -passes $iso_passes -overlap $isolation_overlap -combine 1 -outname "BackCopper_iso"
cncjob "BackCopper_iso" -dia $vbit_tip -z_cut $track_z_cut -z_move 1 -feedrate $track_xy_feed -feedrate_z $z_feedrate -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endxy 0,0 -endz 30 -pp "grbl_11" -outname "BackCopper_iso_cnc"
write_gcode "BackCopper_iso_cnc" "$flatcam_output_path/4M_45V_BackCopper.nc"
#4a. MIRROR & PAINT BACK ANNOTATIONS (Eco2_User) layer
if {[lsearch [get_names] BackAnnot]>=0} {
mirror "BackAnnot" -box "CutOut" -axis $mirror_axis
paint "BackAnnot" -tooldia $vbit_tip -offset 0 -method standard -all -outname "BackAnnot_paint"
cncjob "BackAnnot_paint" -dia $vbit_tip -z_cut $annot_z_cut -z_move 1 -feedrate $track_xy_feed -feedrate_z $z_feedrate -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endxy 0,0 -endz 30 -pp "grbl_11" -outname "BackAnnot_paint_cnc"
write_gcode "BackAnnot_paint_cnc" "$flatcam_output_path/5M_45V_BackAnnot.nc"
}
#4b. PAINT BACK NCC preferably 1-1.5mm flat 2-3flute - User_1 layer
if {[lsearch [get_names] BackNCC]>=0} {
mirror "BackNCC" -box "CutOut" -axis $mirror_axis
paint "BackNCC" -tooldia $ncc_tool_dia -offset 0 -method standard -all -outname "BackNCC_paint"
cncjob "BackNCC_paint" -dia $ncc_tool_dia -z_cut $ncc_z_cut -z_move 1 -feedrate $ncc_xy_feed -feedrate_z $ncc_z_feed -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endxy 0,0 -endz 30 -pp "grbl_11" -outname "BackNCC_paint_cnc"
write_gcode "BackNCC_paint_cnc" "$flatcam_output_path/6M_1F5_BackNCC.nc"
}
#5. MIRROR HOLES, DRILL 1.0mm then 0.6mm then SHALLOW 0.6mm on BACK (coded as 0.35mm)
if {[lsearch [get_names] Holes]>=0} {
if {$thruhole_mirrored == "Y"} {
mirror "Holes" -box "CutOut" -axis $mirror_axis
}
}
#5a. V-CARVE front cutout for better board edge quality, best use 90deg V-bit
if {[lsearch [get_names] CutOut]>=0} {
if {[lsearch [get_names] FrontCopper]>=0} {
geocutout "CutOut" -dia $cutout_carve_path_width -gapsize 0 -gaps "none" -outname "FrontCutOutCrv_geo"
cncjob "FrontCutOutCrv_geo" -dia $cutout_carve_path_width -z_cut $cutout_carve_z_cut -z_move 1 -feedrate $cutout_feedrate_xy -feedrate_z $cutout_feedrate_z -endxy 0,0 -endz 30 -pp "grbl_11" -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -outname "FrontCutOutCrv_geo_cnc"
write_gcode "FrontCutOutCrv_geo_cnc" "$flatcam_output_path/4_90V_FrontCutOutCrv.nc"
}
}
#6. CUTOUT
if {[lsearch [get_names] CutOut]>=0} {
mirror "CutOut" -box "CutOut" -axis $mirror_axis
}
# set filename number postfix
set mirrored "M"
} else { # if BackCopper object exist ?
# set filename number postfix
# NO BACKCOPPER object - single sided version
# no mirroring of layers...
# nothing to do right now, proceed to common part
}
#5. HOLES
if {[lsearch [get_names] Holes]>=0} {
# drillcncjob "Holes" -drilled_dias 1.9 -diatol 5 -drillz $thruhole_z -travelz 1 -feedrate_z 50 -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endz 30 -endxy 0,0 -outname "Holes1.9mm_cnc"
# milldrills "Holes" -milled_dias "2.0" -tooldia 1.5 -diatol 30 -outname "HolesUp1.5mm_Milled"
# cncjob "HolesUp1.5mm_Milled" -dia "1.5" -z_cut $thruhole_z -z_move 1 -feedrate 50 -feedrate_z $z_feedrate -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endxy 0,0 -endz 40 -pp "grbl_11" -outname "HolesUp1.5mm_Milled_cnc"
# write_gcode "HolesUp1.5mm_Milled_cnc" "$flatcam_output_path/6${mirrored}_1D5_HolesMilledUp1_5mm.nc"
# drillcncjob "Holes" -drilled_dias 1.7 -diatol 5 -drillz $thruhole_z -travelz 1 -feedrate_z 50 -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endz 30 -endxy 0,0 -outname "Holes1.7mm_cnc"
# write_gcode "Holes1.7mm_cnc" "$flatcam_output_path/6${mirrored}_1D2_Holes1mm7.nc"
drillcncjob "Holes" -drilled_dias 1.5 -diatol 5 -drillz $thruhole_z -travelz 1 -feedrate_z 60 -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endz 30 -endxy 0,0 -outname "Holes1.5mm_cnc"
write_gcode "Holes1.5mm_cnc" "$flatcam_output_path/6${mirrored}_1D5_Holes1mm5.nc"
drillcncjob "Holes" -drilled_dias 1.2 -diatol 5 -drillz $thruhole_z -travelz 1 -feedrate_z 80 -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endz 30 -endxy 0,0 -outname "Holes1.2mm_cnc"
write_gcode "Holes1.2mm_cnc" "$flatcam_output_path/6${mirrored}_1D2_Holes1mm2.nc"
drillcncjob "Holes" -drilled_dias 1.0 -diatol 5 -drillz $thruhole_z -travelz 1 -feedrate_z 80 -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endz 30 -endxy 0,0 -outname "Holes1.0mm_cnc"
write_gcode "Holes1.0mm_cnc" "$flatcam_output_path/7${mirrored}_1D0_Holes1mm0.nc"
drillcncjob "Holes" -drilled_dias 0.8 -diatol 5 -drillz $thruhole_z -travelz 1 -feedrate_z 80 -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endz 30 -endxy 0,0 -outname "Holes0.8mm_cnc"
write_gcode "Holes0.8mm_cnc" "$flatcam_output_path/8${mirrored}_0D8_Holes0mm8.nc"
drillcncjob "Holes" -drilled_dias 0.6 -diatol 5 -drillz $thruhole_z -travelz 1 -feedrate_z 80 -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endz 30 -endxy 0,0 -outname "Holes0.6mm_cnc"
write_gcode "Holes0.6mm_cnc" "$flatcam_output_path/9${mirrored}_0D6_Holes0mm6.nc"
drillcncjob "Holes" -drilled_dias 0.5 -diatol 5 -drillz $thruhole_z -travelz 1 -feedrate_z 80 -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endz 30 -endxy 0,0 -outname "Holes0.5mm_cnc"
write_gcode "Holes0.5mm_cnc" "$flatcam_output_path/10${mirrored}_0D5_Holes0mm5.nc"
drillcncjob "Holes" -drilled_dias $shallow_hole_diam_back -diatol 5 -drillz $shallow_hole_depth -travelz 1 -feedrate_z 80 -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endz 30 -endxy 0,0 -outname "BackShallowDrills_cnc"
write_gcode "BackShallowDrills_cnc" "$flatcam_output_path/11${mirrored}_0D6_BackShallowDrills.nc"
}
#6. CUTOUT
if {[lsearch [get_names] CutOut]>=0} {
if {$add_cutout_offset == "Y"} {
set cutout_dia [ expr { $cutout_tool_dia+$cutout_carve_path_width/2 }]
} else {
set cutout_dia [ $cutout_tool_dia ]
}
geocutout "CutOut" -dia $cutout_dia -gapsize 0 -gaps "none" -outname "CutOut_geo"
cncjob "CutOut_geo" -dia $cutout_tool_dia -z_cut $cutout_z_cut -z_move 1 -feedrate $cutout_feedrate_xy -feedrate_z $cutout_feedrate_z -dpp $cutout_cut_per_pass -endxy 0,0 -endz 30 -pp "grbl_11" -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -outname "CutOut_geo_cnc"
write_gcode "CutOut_geo_cnc" "$flatcam_output_path/13${mirrored}_1F5_CutOut.nc"
}
#7. FRONT MASK (best with floating engraver - to remove UV mask @ pads)
if {[lsearch [get_names] FrontMask]>=0} {
paint "FrontMask" -tooldia $mask_vbit_tip -offset 0 -connect 1 -contour 1 -method standard -all -outname "FrontMask_paint"
cncjob "FrontMask_paint" -dia $mask_vbit_tip -z_cut $mask_z_cut -z_move $mask_z_travel -feedrate $mask_xy_feed -feedrate_z $mask_z_feed -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endxy 0,0 -endz 30 -pp "grbl_11" -outname "FrontMask_paint_cnc"
write_gcode "FrontMask_paint_cnc" "$flatcam_output_path/1b_FET_45V_FrontMask.nc"
}
#8. V-CARVE back cutout for better board edge quality, best use 90deg V-bit
if {[lsearch [get_names] CutOut]>=0} {
geocutout "CutOut" -dia $cutout_carve_path_width -gapsize 0 -gaps "none" -outname "BackCutOutCrv_geo"
cncjob "BackCutOutCrv_geo" -dia $cutout_carve_path_width -z_cut $cutout_carve_z_cut -z_move 1 -feedrate $cutout_feedrate_xy -feedrate_z $cutout_feedrate_z -endxy 0,0 -endz 30 -pp "grbl_11" -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -outname "BackCutOutCrv_geo_cnc"
write_gcode "BackCutOutCrv_geo_cnc" "$flatcam_output_path/12${mirrored}_90V_BackCutOutCrv.nc"
}
#9. BACK MASK
if {[lsearch [get_names] BackMask]>=0} {
mirror "BackMask" -box "CutOut" -axis $mirror_axis
paint "BackMask" -tooldia $mask_vbit_tip -offset 0 -connect 1 -contour 1 -method standard -all -outname "BackMask_paint"
cncjob "BackMask_paint" -dia $mask_vbit_tip -z_cut $mask_z_cut -z_move $mask_z_travel -feedrate $mask_xy_feed -feedrate_z $mask_z_feed -spindlespeed $spindle_rpm -dwelltime $spindle_dwell -endxy 0,0 -endz 30 -pp "grbl_11" -outname "BackMask_paint_cnc"
write_gcode "BackMask_paint_cnc" "$flatcam_output_path/4Mb_FET_45V_BackMask.nc"
}
# DON'T REDRAW - its time consuming...
#plot_all
puts "FINISHED! --------------------------------------------------------------------------------"
puts "Bit tip: ${vbit_tip} angle: ${vbit_angle} z_cut: ${track_z_cut}"
puts "Effective isolation width: $vbit_iso_width"