-
Notifications
You must be signed in to change notification settings - Fork 2
/
mill-outlines.ulp
5464 lines (5013 loc) · 239 KB
/
mill-outlines.ulp
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
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#usage "en: <b>Export milling data for a board layout in SCRIPT, HPGL, ISEL, CNC</b>\n"
"<p>"
"<author>Author: support@cadsoft.de</author>"
,
"de: <b>Export von Fräsdaten aus einem Board in SCRIPT, HPGL, ISEL, CNC</b>"
"<p>"
"<author>Author: support@cadsoft.de</author>"
#require 6.0500
// ****************** History *************************************************
// place VIA with SIGNAL '~_REAL_OUTLINEMILL_~' in to break through for milling
// this as outside contour.
// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED
// 2002-05-08 - reverse milling
// 2002-06-23 - Polygon:CHANGE THERMAL OFF
// 2003-05-14 - With REFERENCE-Circle (Drill) to mirror for drilling machine
// - Switch On/Off 2. isolate/copper pouring
// 2003-09-02 - Switch On/Off drills
// 2004-04-24 - String ulp_path no longer necessary
// 2004-07-21 - expand reference package menu
// by selecting layer, switch mirror on/off
// place VIAs with SIGNAL '~_REAL_OUTLINEMILL_~'
// into break through for milling as outside contour.
// Language en/de
// 2004-08-12 - ISEL Interface/Isel-Zwischenformat
// Referenz:
// | Übersicht des isel Zwischenformat zur Maschinensteuerung
// | "isel ZF in deutsch.pdf" Stand 08.11.1999
// 2004-10-18 - Abfrage ob DRC fehlerfrei durchlaufen wurde
// - bei vorhandener def-Datei werden diese Parameter als Default geladen.
// - Sichern der Einstellungen in def-Datei.
// 2005-05-18 - ** output no shorter filling wires than MillToolFree diameter **
// - Hinweis auf den erfolgreichen (fehlerfreien) Design-Rule-Check
// damit man im voraus abklären kann, ob auch alles mit dem
// benutzten Fräser isoliert (gefräst) werden kann.
// - Überprüfung der CLASS-Clearance mit dem Durchmesser des
// Isolationsfräsers Tool#1.
// 2005-05-23 - UseRack: (switch), you can also use a rack with HPGL and NC machine code
// for users with a machine with automatic tool change.
// UseRack: Wenn mehr als die 3 Standarddurchmesser benutzt werden,
// werden zusätzliche Tools (1/10mm gerundet) fürs Bohren generiert
// (auch in HPGL --> SPxx / Script) für Anwender, die eine Fräsmaschine mit
// automatischen Werkzeugwechsel besitzen.
// - SP8 in HPGL bedeutet: Die Platine muß auf dem Frästisch umgedreht werden
// ** nur HPGL ** www.cnc-papst.de * reiner_marcus@hotmail.com **
// 2005-06-16 - Isel-Zwischenformat Extension ".cnp"
// 2005-06-23 - Drilling path optimised / Bohrwege streckenoptimiert
// - Beim RubOut wird der Fräser nicht angehoben, wenn sich die X-Koordinate
// weniger als der Fräserradius ändert.
// Schalter 'Lift_Off' wird nicht im Menu angezeigt, sondern ist fix im ULP.
// - Zusätzlicher (plus) Layer zum Fräsen von Texten in Kupferflächen (Polygon).
// - Maschinen-Menu kann abgeschaltet werden für _nur_ Benutzer von HPGL
// Schalter 'MachineMenuOn'
// ** nur HPGL ** www.cnc-papst.de * reiner_marcus@hotmail.com **
//
// 2005-09-28 *** für LPKF laut Hr. Böhm (agfeo) keine Formatbeschreibung zu erhalten
// *** wird also wieder gecancelt ***
//
// 2005-09-30 - Device-Reinit bei Layer 45 Holes nicht Offset 100 addieren.
// - CNC
//
// 2005-11-21 - LPKF entfernt
//
// 2005-12-22 - Unit & Format bei [Masch. Nullpunkt] [Lade Beispiel] auf mm und 2.4 setzen
// 2006-01-23 - Only Drills gibt jetzt nur die Drills aus
// (ohne Meldung von fehlerhaften Parametern bzw. Layern)
// 2006-01-25 - $ in temporären Namen in ~ (Tilde) geändert.
// - Temporäre Files werden mit "wtD" geöffnet
// - !Generatedrills; keine Abfrage der Bohrdurchmeser auf Gültigkeit
// 2006-02-13 - Wegen Rechenungenauigkeit muß für Fräswege zwischen den Leiterbahnen und
// einem evtl. vorhandenem Füll-Polygon die Spurbreite (Clearance/Isolate)
// zu WIRE (Arc) um Inaccurateness breiter eingestellt werden, da es sonst
// an gebogenen Leiterbahnsegmenten zu fehlerhaften nicht berechneten Fräswegen
// kommen kann. Also die gefräste Isolation nicht komplett geschlossen ist.
// * Nur Isolationsfräsen:
// Hier wird die Drehrichtung (Rotation) der berechneten Polygon-Kontur
// zu der Kontur von Signal-Polygonen ermittelt, da sich die Kontur der Füllung
// einmal rechts-drehend an den Leiterzug (WIRE/PAD/VIA-Struktur) und einmal
// links-drehend an ein evtl. vorhandenes Polygon (Versorgungs-Polygon)um den
// Leiterzug anschmiegt.
// Dadurch würde die Isolation, also der Fräsweg, doppelt ausgegeben werden.
// Bei inaktiven [] Rub out werden nur linksdrehende Polygonkonturen ausgegeben
// um den Fräsaufwand zum reinen Isolieren zu minimieren.
// Bei aktiven [] Rub out werden linksdrehende wie auch rechtsdrehende Polygon-
// konturen ausgegeben, um der geätzten Version einer Leiterplatte so nah wie
// möglich zu kommen. *
//
// 2006-07-26 - Generate separated layer +100 +101 +102 for milling tools.
// - check polygons for Rank 6.
// - Use Rank 1 for polygon to generate real outline contour
// to mill out from holder.
// - Correct Rank on all generated Polygons.
// 2006-08-01 - Check if POLYGON is placed. If Yes, check if CLASS-Clearance 0.005 mm > Tool#1
// but if problem with routed WIRE out of 0 45 90 Degree.
// Es kann vorkommen, dass durch math. Rundung der Koordinaten das Polygon
// nicht in die Isolationskanäle fliessen kann.
// 2006-11-07 - Ausfräsen aus dem Träger (Dimensionlinie) berichtigt; war nur bei Script aktiv.
// - dru Datei wird gelesen um den tatsächlichen Copper-Dimension Wert zu erhalten.
// Ist keine .dru gespeichert, wird der Defaultvalue benutzt und darauf hingewiesen.
// 2006-12-11 - Maschinen-Menu aus/einschalten mit Checkbox.
//
// 2007-10-08 - Fräserbreiten ab 5 micron zulassen wg. Laser.
//
// 2008-11-12 - Layerzuordnung berichtigt; nicht das Flag, sondern die Layernummer benutzen.
// - Delete von Polygon mit SHIFT und Via mit Ripup.
// - Layerzuweisung vor Kontour fräsen.
//
// 2009-02-04 - Clear via airwire
// 2009-02-05 - Correct mill tool for millout
// 2009-03-31 - Correct coordinates; delete special polygon and via # alf@cadsoft.de
// Corrected layer to millout (if only Layer 16 selected)
// Holder spacing in script
// Check if Dimension placed
//
// 2010-01-20 - Check DRC-Layer-Setup (1*16)
// Check counts of outlines in layer Dimension
//
// 2010-01-25 - Use contour option positiv/negativ (rotation)
// to switch on/off draw also polygon inside contours
//
// 2010-02-02 - Check and Set DRC-Layer-Setup and CLASS clearance to mill tool #1 + Inaccurateness
//
// 2010-04-08 - Milling always inner contour of pouring
// CNC data finished
//
// 2010-08-06 - Info Durchbrüche als Dialog
// Die gespeicherten Designregeln dürfen bis zu 30 Sekunden alt sein.
//
// 2010-10-28 - Prüfe die Designrules und benutze CLASSen, falls CLASSen benutzt sind.
// Sonst ändere die Design-Regeln.
//
// 2011-01-27 - Z-Achse in CNC-Device G00 / G01 Z..
// Referenzfahrt am Anfang
// Z_down -> Actualmilldeep, zum Hochfahren mit -1 multipliziert (pos. Vorzeichen)
//
// 2011-02-02 - Wenn 2. Milling (und Rubout) abgeschaltet waren, dann wurde auch das 1. mal nicht isoliert.
// Milling [ ] innercontour BitMap waren vertauscht.
// Wählbare Auflösung 3.2 3.3 3.4 im CNC Menu.
// Programmierter Halt für Umdrehen der Platine.
//
// 2011-02-03 - Auflösung in mit und ohne Kommastelle.
// Mill_z_safety, Drill_z_deep, Z_down, Z_dimension als Option bei RUN ...
//
// 2011-02-09 - Generiere ein Refpackage mit 2 Circle und platziere dieses Package
// an der berechneten linken unteren Ecke.
// * Anfrage am 2010-10-13 *
// ISEL-Device berichtigt: MOVE Z -> MOVEABS Z
// Überprüfung der Erzeugungszeit der DRU-Datei auf 120 Sekunden erhöht.
// Ist ein Refpackge platziert, darf die Dimension nicht gefräst werden,
// sonst würde man in die Haltestifte fräsen!
// Abfrage ob trotzdem gefräst werden soll.
//
// 2011-03-10 Nur Kontur fräsen
//
// 2011-06-17 Fehlermeldung bezüglich Mehrfachkonturen (Dimension) um außerhalb der Dimension
// stehende Texte oder Logos erweitert.
//
// 2011-09-28 Holderspacing corrected und Stegbreite 0.2mm, unabhängig vom Fräserdurchmesser
// WIRE_BEND wieder auf 2 (diagonal stellen).
//
// 2011-10-04 Durchbrüche/Mehrfachkonturen berichtigt, Info Durchbrüche erweitert.
//
// 2011-10-20 Hinweis auf "Only milling Dimension".
// Berichtigt: Bohrungen fräsen bei Holes größer maximal vorkommenden Fräserdurchmesser.
// Milling und Z-Achsen menu auf Tabs getrennt.
//
// 2011-11-21 Isel-Format: Fräser Z-Achse wieder hoch.
//
// 2012-01-12 Auflösung mit 8 Nachkommastellen. Wird der erweiterten internen Auflösung gerecht,
// da es sonst zu fehlenden Wires kommen kann.
//
// 2012-01-13 Dimension immer in Layer 103 zeichnen.
// ScriptDrillFile wird nicht mehr automatisch eingelesen,
// da sonst die Holes doppelt vorhanden sind und DRC-Fehler erzeugen.
// Im Device SCRIPT wird je nach benutztem Layer die Außenkontur im Layer 103 bzw. 118 erzeugt.
//
// 2012-01-16 Überprüfung der CLASSen vor der Überprüfung der Design-Regeln.
// Die Design-Regeln werden jetzt immer zuerst gespeichert.
//
// 2012-01-20 Menu Prüfe Einstellungen "OK" Button geändert [Change &Tool #1]
//
// 2012-01-25 MillOnlyContour : Nur aus Träger fräsen berichtigt.
// Layer 103 bzw. 118 anlegen.
// Jetzt mit Tool #1 an DRC-Clearance / CLASS-Clearance anpassen und nicht die Clearance ändern.
//
// 2012-02-09 Korrigierte DRC-Parameter (minDistWireWire) Überprüfung.
// Wenn der Parameter minDistWireWire groß genug ist, dann
// werden die CLASSen nicht mehr geprüft.
//
// 2012-03-09 Zum Ändern der Breite des Fräs-Polygons wurde das B.area. benutzt,
// was aber nicht den Koordinaten des "Fräs-Polygons" entsprach!
// Dadurch wurde unter Umständen ein anderes Element gewählt.
// Jetzt wird eine Wire-Koordinate des Fräs-Polygons selbst herangezogen.
//
// 2012-03-20 Behandlung der Bohrungen (HOLE) größer Max. drill diam berichtigt.
// Die Fräswege werden in der Option Script im Layer 118 erzeugt und in die *_drl.scr geschrieben.
//
// 2013-03-05 Holder Spacing berichtigt.
// Drills und Holes werden in die Scriptdatei geschrieben und im Layer 144 145 gezeichnet
// ScriptDrillFile und *_drl.scr wird nicht mehr benötigt.
// Bohrungen größer Maxdrill berichtigt, in Script + HPGL.
// Fehlermeldung bez. der Vias des Signals '~_REAL_OUTLINEMILL_~' ohne Option Tool#2 blow up berichtigt.
// GRID (last) zurückstellen.
// Kommentarzeilen in HPGL entfernt (Markierung #HPGLxxxx), da GC-Prevue damit Probleme hat.
//
// 2013-04-18 Tool 9 eingerichtet, zum Fräs-Bohren von Drills größer Max_Drill_Diameter
// Initialisierung bei HPGL nur einmal
// 2013-04-19 Abfrage bez. des Ausfräsens aus dem Trägermaterial bei platzierten Fangzapfen
// Menüpunkt und Parameter zum Bohren der Referenzbohrungen auskommentiert.
// 2013-04-30 Versatz/Offset berichtigt, beim Fräsen von nur Bottom-Seite und platziertem Referenz-Package
// HPGL wird nun in zwei Dateien geschrieben, da die Fräse der FU-Berlin die Tools
// zu einem optimierten Fräsweg zusammenfasst.
// 2014-10-06 HPGL_TOP_ext = "_top.plt" Namenserweiterung bei HPGL für Daten des Top-Layers.
// Am Ende wird eine Nachricht ausgegeben, in welche Datei die Fräsdaten geschrieben wurden;
// wichtig bei HPGL, da auf Wunsch der FU Berlin nun je Seite (Top/Bottom) eine Datei erzeugt wird.
// 2014-11-26 InfoREFPack in englisch
//
// 2015-03-24 RIPUP der VIA '~_REAL_OUTLINEMILL_~' innerhalb eines Innendurchbruchs erst am Ende löschen
// Devices SCRIPT wird am Ende wieder eingelesen
//
// 2016-06-07 Überarbeitung aller Texte im ULP
/* ** to do :
Scalierung bei HPGL vorwahl 2/5/10
** */
string Version = "Version 6.2.3"; // 2016-06-07 support@cadsoft.de
string Header = "Outlines generator for PCB milling.";
int test = 0; // Flag zum debuggen
int test2 = 0; // 2. Flag zum debuggen
/* ****************************************************
Complete the following steps to add a new output device definition:
1. Add a new member to the 'enum { devScript = 1, ...'
2. Add the new (unique!) device name to 'DeviceNames[]'
3. Add the necessary 'case dev...' branches to
'DeviceInit()',
'DeviceReInit()',
'DeviceDraw()',
'CircleDraw()',
'ArcDraw()'
and 'DeviceEnd()'
4. Add also new Tool values to
'toolFiles()'
and 'ValueInit()'
***************************************************** */
// Actually draw a line on the output device.
// 'state' is defined as
// 0 = this is the first line of a partial polygon
// 1 = this is a "middle" line (neither the first nor the last one)
// 2 = this is the last line of a partial polygon
// 3 = this is a drill coordinate
// 4 = this is one line (polygon fillings)
/* *********************************************************************************
2006-02-08
Achtung bei Kupferflächen, die durch ein POLYGON gefüllt sind!
Durch die Rechenungenauigkeit (max. Auflösung der Eagle-Einheit) muß man
die CLASS-Clearance um den Betrag breiter angegeben werden, da sonst um
gekrümmte Leiterbahnen (Arc) teilweise keine Polygon-Kontur berechnet wird.
Aber nur wenn Isolate kleiner der Fräserbreite + dem Ungenauigkeitsfaktor ist.
************************************************************************************ */
real Inaccurateness = 0.005; // 2006-02-08
string DRC_CopperDimension = "mdCopperDimension"; // der Parameter in der .dru
enum { false = -1 };
enum { First_line, Middle_line, Last_line, Drill_coord, One_line } ;
string INFOhelp = usage;
string INFOhelpBut = "Help";
string CANCEL = "-Cancel";
string BACK = "-Back";
string ACCEPT = "Accept";
string YES = "YES";
string NO = "NO";
string ON = "ON";
string OFF = "OFF";
string BREAK = "<--";
string NEXT = "Further";
string DRCCHECK = "Check CLASS";
string DRC_checked = "Before milling the PCB, start the DRC (Design Rule Check) " +
"with the milling diameter (isolate) in CLASS clearance.<br>" +
"<nobr><font color=\"red\">All Clearance ERRORs define a not isolated wire track!</font><br></nobr>";
int Class_used[];
string SClass[]; // 2010-02-02
string INFOpolyClass;
sprintf(INFOpolyClass, "<nobr>If there is a copper polygon in the board, please check the value for Clearance of Design Rules/Classes . It has <br>" +
"to be %.8f mm bigger as Milling Tool #1. Otherwise it could happen that traces laid out in another angle than 0°, 45° or 90° <br>" +
"will not be calculated correctly (due to calculation inaccurateness).</nobr>", Inaccurateness);
string SavePar = "&Save parameter";
string Machine_Menu_Info = "<nobr>Switch On/ff the machine's menu for Z-Axis machines!<br>" +
"If this is changed, the ULP saves the current parameters and restarts!</nobr>";
string Z_Machine_Menu = "Z axis menu";
string INFOinside = "Info break through";
string INFOinnerContour = "<nobr>If there are one or more break throughs in the board, you can place a VIA with signal name <br>" +
"'~_REAL_OUTLINEMILL_~' to have this milled.</nobr>";
string PlaceVIA = "Place VIA";
string DRCinfo = "<qt><b>Distance info:</b><br>Distance Copper/Dimension (see <b>DRC</b>). That's the distance between <br>"
"the polygon and the board outline.<br>"
"<nobr><font color=\"red\">Do not use value <b>0</b> for <b>Copper/Dimension</b> in Design Rules Distance (DRC).<br></font></nobr>";
"</qt>";
string Ref_pac = "_REFERENCE_HOLE_"; // *** special package for mirror milling data ***
string InfoREFERENCE = "<nobr>Create a special package with<br>" +
"REFERENCE circles in layer 45, Holes.<br>" +
"Place it in the layout for milling and <br>" +
"mirroring (bottom side) with offset and <br>" +
"start this ULP again.<br>" +
"The position of the circles are defined<br>" +
"in the NC drill data file which comes<br>" +
"from the NC machine (eg. Excellon).</nobr><p>";
string InfoREFPack = "<font color=\"red\">There is placed a reference package in order to take the catching pins of the " +
"milling machine for calculating the axis of reflection. " +
"For this case milling the board out of the carrier should be switched off!</font><br>" +
"However, if you prefer to have the board contour milled out, please check the distance "
"between the circles and the Dimension layer!";
string A_refpack = "A reference package is placed!";
string InfoRefHole = "Drill reference holes (fixing bolt) ";
string InfoRefOff = "Drill reference holes OFF.";
string InfoRefOn = "Drill reference holes ON.";
string DrBrowse = "Browse";
string REFdialog = " - generate reference and place on board";
string LoadRefFile = "&Load ref. file";
string Example_Ref = "Load example";
string DRILLref = "Select drill reference file (holes)";
string PLACErefpac1 = "<font color=blue>After reference package is placed start the<br></font><font color=\"#004F00\">";
string PLACErefpac2 = "</font><br><font color=blue>to set back the <b>USE</b>ed libraries.</font>";
string SHOWRackFile = "Show rack file";
string SAVE_file = "Save outlines file";
string REFinfo2 = "<nobr>Click button <b><font color=yellow>Zero reference</font></b> to generate a reference package from a NC drill file<br>" +
"to place kind of reference spigots (circles) in the board for accurate mirroring of the bottom side<br>" +
"on the milling machine.</nobr>";
string ZeroRef = "Zero refere&nce";
string No_reftext = "!No reference file loaded.";
string Script_Used = "<nobr>SCRIPT used!<br>Returns the milling paths as WIREs to board editor.<br></nobr>";
string OnlyDrillHpgl = "<nobr>Generate drill file only.</nobr>";
string INFOtext1_on = "<nobr>Milling top side.</nobr>";
string INFOtext16_on = "<nobr>Milling bottom side (<font color=red>mirror</font>).</nobr>";
string INFOtext1_off = "<nobr>Milling top side.</nobr>";
string INFOtext16_off = "<nobr>Milling bottom side (<font color=red>mirror</font>).</nobr>";
string TextInfoPlus = "<nobr>Plus milling layer (to mill text inverted in a polygon).</nobr><br>" +
"Can be used with Top or Bottom layer only.";
string TOOLdiamIso = "<nobr>Tool diameter for isolate.</nobr><br>";
string OVERlapIso = "<nobr>Overlap isolate - blow up percentage (%).</nobr>";
string OVERlapRubOut = "<nobr>Overlap rub-out diameter percentage %.</nobr>";
string TOOLdiamBlow = "<nobr>Tool diameter for blow-up/rub-out<br>If value set to <b>0</b>, <b>no</b> blow-up (2nd isolate)<br>and rub-out (free milling) is generated.</nobr>";
string TOOLdiamRub = "<nobr>Rub-out is off!<br>Tool diameter for 2nd isolate<br>If value set, Blow-Up (second isolate) is generated.</nobr>";
string MILLfreeYes = "<nobr>You have to set a value for blow-up.</nobr>";
string MILLfreeNo = "<nobr>No blow-up and rub-out is generated if value is set to 0.</nobr>";
string INFOmirror0 = "<nobr>Layer 16 (Bottom) not mirrored.</nobr>";
string INFOmirror1 = "<nobr>Layer 16 (Bottom) is mirrored.</nobr>";
string GENdrilON = "<nobr>Generate drill data.</nobr>";
string GENdrilOFF = "<nobr>Drills (PAD, VIA, HOLE) are disabled.<br>";
string PADdrildiam = "<nobr>PAD drill diameter</nobr>";
string VIAdrilldiam = "<nobr>VIA drill diameter</nobr>";
string HOLEdrildiam = "<nobr>HOLE drill diameter</nobr>";
string USErackON = "<nobr>Use drill rack (1/10mm). See also Tool Assignment.</nobr>";
string USErackOFF = "<nobr>Use only 3 drills (Pad, Via, Hole).</nobr>";
string DrillLabel = "<nobr><font color=\"#004f00\">HPGL file includes drills</font></nobr>";
string DIMmiltoolOFF = "<nobr>Mill diameter for cut-out.<br>Cut-out <b>OFF</b>.</nobr>";
string DIMmiltoolON = "<nobr>Mill diameter for cut-out.<br>Cut-out <b>ON</b>.</nobr>";
string INFOspacing = "This value determins the minimum length of an edge where a spacer will be set.<p>" +
"Spacers will be set on vertical & horizontal edges and in HPGL-Format only.<p>" +
"The width of the spacer depends on the diameter of Mill Board/Dim.<br>" +
"Value 0 switches this function off.";
string INFOresolution = "<nobr>Integer digits, fractional digits."; // 2011-02-02
string INFOdeep = "<nobr>Drilling depth value.</nobr>";
string INFOzsafety = "<nobr>This is the value for lifting the milling tool to change the tool.</nobr>";
string INFOzAxisUp = "<nobr>This is the value for lifting the milling tool to move fast (safety).</nobr>";
string INFOzAxisDown = "<nobr>This is the value for the cutting depth in the PCB.</nobr>";
string INFOvdrill = "<nobr>Drilling speed mm/s.</nobr>";
string INFOvelocity = "<nobr>Cutting speed mm/s.</nobr>";
string INFOfastVel = "<nobr>Movement speed (no milling) mm/s.</nobr>";
string INFOrpm = "<nobr>Spindle rotation per minute.</nobr>";
string INFOmaxdrill = "<nobr>The maximum drill diameter used.</nobr>";
string DIMdown = "<nobr>The z parameter for milling board dimensions.</nobr>";
string PARKinfo = "<nobr>The park position of milling tool to mirror the board.</nobr>";
string SaveInfo = "<nobr>Menu parameter saved!<\nobr>";
string FaultDRCdist1 = "!<qt><nobr>The value for Copper/Dimension is bigger than the Mill Board/&Dim diameter.<p>" +
"Check/change Distance Copper/Dimension in Design Rules <b>DRC</b><p>" +
"or accept a distance of ";
string FaultDRCdist2 = "mm to board dimension.</nobr></qt>";
string Error5 = "<nobr>The CLASS clearance value is less than the diameter of milling tool #1!<br>" +
"Before milling the PCB, start the DRC (Design Rule Check)<br>" +
"with the milling diameter (isolate) in CLASS clearance.<br>" +
"<font color=\"red\">All clearance ERRORs can cause not isolated wire tracks!</font><br></nobr>"; // 2005-12-22 alf@cadsoft.de
string INFOInaccurat = "Due to possible arithmetic imprecision you have to increase " +
"the value for the track width the cutter uses for milling between " +
"traces and possible copper planes - Clearance/Isolate to Wire" +
"(Arc) - by %.3f mm. Otherwise it could happen that curved wires " +
"won't be milled correctly and the isolating area won't have a " +
"closed contour.";
string Mill_mInner_contour = "Process also inner milling contours. For example, the isolation "
"of thermal reliefs inside polygons.";
string MissingDimension = "!Missing Dimension.\nFirst place dimension outline in layer 20.";
string RefDrillDiameter = "Drill diameter ";
string RefDrillDeep = " Depth ";
string Get_Board_Zero = "Set board &zero"; // 2010-10-13
string Info_Board_Zero = "Generate a package with two circles<br>and place this package at the<br>left bottom corner to mark the<br>machine's zero point.<br>"; // 2011-02-07
/***** Deutsche Sprache *****/
if (language() == "de") {
INFOhelp = usage;
INFOhelpBut = "Hilfe";
CANCEL = "-Abbruch";
BACK = "-Zurück";
ACCEPT = "Akzeptieren";
YES = "JA";
NO = "NEIN";
ON = "EIN";
OFF = "AUS";
BREAK = "<--";
NEXT = "Weiter";
DRCCHECK = "Prüfe &CLASS";
sprintf(DRC_checked, "<b>Bevor Sie die Fräsdatengenerierung starten, müssen Sie zuerst das Layout mit dem " +
"DRC (Design Rule Check) überprüfen.</b> " +
"Stellen Sie die Clearance der benutzten CLASS(en) um mindestens %.3f mm größer dem Fräserdurchmesser ein.<br>" +
"<font color=\"red\"><b>Jeder Clearance-ERROR bedeutet eine nicht isolierte Leiterbahn!</b></font><br>", Inaccurateness);
sprintf(INFOpolyClass, "Ist ein füllendes Polygon im Board plaziert, muss die Clearance der Design-Rules/Class um %.3f mm größer <br>" +
"als der Fräserdurchmesser sein. Damit werden bei Leiterbahnen, die nicht im 0° 45° oder 90° Winkel, also mit <br>" +
"beliebigen Winkel verlegt sind, eventuelle Füllprobleme wegen Rechenungenauigkeit vermieden.", Inaccurateness);
SavePar = "Parameter &sichern";
Machine_Menu_Info = "<nobr>Ein/Ausschalten der Maschinenparameter für die Z-Achse.<br>Nach Änderung des Parameters werden die aktuellen Einstellungen<br>gespeichert und das ULP neu gestartet.</nobr>";
Z_Machine_Menu = "Z-Achsen-Menü";
Script_Used = "<nobr>SCRIPT-Ausgabe!<br>Die Fräsbahnen (-daten) werden als WIREs in das Board geladen.<br></nobr>";
INFOinside = "Info Durchbrüche";
INFOinnerContour = "<nobr><p>Damit Durchbrüche innerhalb der Platine ebenfalls ausgefräst werden,<br>" +
"muss in jedem Durchbruch ein VIA mit dem Signalnamen<br>" +
"'~_REAL_OUTLINEMILL_~' platziert werden.<br>" +
"Ein Durchbruch darf <font color=\"red\">kein HOLE</font> sein! Das bedeutet bei kreisrunden <br>"
"Durchbrüchen, dass ein CIRCLE im Layer Dimension gezeichnet werden muss.</nobr>"; // 2011-10-04
DRCinfo = "<qt><b>Distance info:</b><p>" + // geändert 2010-08-04
"Distance Copper/Dimension (siehe auch <b>DRC</b>) ist der Abstand <br>" + // der Wert wird jetzt aus den Design-Regeln gelesen,
"zwischen dem Polygon (in Kupfer) und der Kontur im Layer 20 Dimension des Board.<p>"+ // daher wird der Hinweis nicht mehr benötigt.
"<font color=\"red\"><nobr>" +
"<b>Dieser Wert wird aus den Design-Rules gelesen!</b></nobr><br>" +
"Benutzen Sie nicht den Wert <b>0</b> für <b>Copper/Dimension</b> <br>" +
"in den Design-Rules - Distance.<br></font>" +
"</qt>";
InfoREFERENCE = "<nobr>Generiert ein spezielles Package mit Referenzkreisen (Circle) im Layer 45, Holes.<br>" +
"Platzieren Sie das Package im Layout für fräsen und spiegeln (Bottom-Seite) <br>" +
"mit Offset und starten Sie das ULP erneut.<br>" +
"Als Dateneingabe für die Koordinaten dieser Kreise kann die NC-Drill-Datei <br>" +
"der NC-Maschine (Excellon) benutzt werden.<br>" +
"Man kann jedes andere Package mit der Bezeichnung <i>" + Ref_pac + " </i><br>" +
"als Referenz für den Maschinennullpunkt und die Spiegellinie benutzen. " +
"</nobr><p>" +
"<font color=\"red\">Achtung: Die Referenz-Fangzapfen dürfen nicht über das Maß von Leiterplattenstärke "
"minus Frästiefe hinausragen. Sonst werden diese Fangzapfen angefräst, was zum Bruch des Fräsers "
"führen kann.</font>" +
""; // 2011-02-09
REFinfo2 = "<nobr>Klicken Sie auf <b><font color=yellow>Masch. Nullpunkt</font></b> zum Erzeugen " +
"eines Referenzpackages aus <br>" +
"NC-Drill-Daten um Referenz-Fangzapfen (Circles) im Board zu platzieren. Diese sind notwendig für <br>" +
"die exakte Berechnung der Fräsdaten bezogen auf den Nullpunkt der <br>" +
"NC-Anlage und für die Spiegelung der Unterseite.</nobr>";
InfoREFPack = "<font color=\"red\">Es ist ein Referenz-Package platziert, um die Fangzapfen der Fräsmaschine zur Berechnung der " +
"Spiegelachse heranzuziehen. Dadurch darf das Ausfräsen aus dem Träger an der Dimension unter Umständen nicht " +
"eingeschaltet werden!</font><br>Wollen Sie die Platine trotzdem aus dem Träger fräsen, überprüfen Sie die " +
"Abstände der Circles zum Layer Dimension!"; // englisch!?
ZeroRef = "Masch. &Nullpunkt";
No_reftext = "!Keine Referenzdatei geladen.";
DrBrowse = "Durchsuchen";
LoadRefFile = "&Lade Ref. Datei";
Example_Ref = "Lade Beispiel";
REFdialog = " - Generiere Referenz-Package und platziere auf Board";
DRILLref = " Wähle Drill Reference Datei (Holes)";
A_refpack = "Ein Referenz-Package ist platziert!";
InfoRefHole = " Fangzapfen bohren ";
InfoRefOff = "Bohren der Fangzapfen AUS.";
InfoRefOn = "Bohren der Fangzapfen EIN.";
PLACErefpac1 = "<nobr><font color=blue>Starten Sie nach dem Platzieren des Referenz-Packages das Script</font><br><font color=\"#004F00\">";
PLACErefpac2 = "</font><br><font color=blue>um die erzeugte LBR aus der <b>USE</b>-Liste zu löschen.</font>";
SHOWRackFile = "Bohrer-Definition";
SAVE_file = "Outline-Datei sichern";
DrillLabel = "<nobr><font color=\"#004f00\">Drills in HPGL-Datei enthalten</font></nobr>";
OnlyDrillHpgl = "<nobr>Nur Bohrdaten erzeugen!</nobr>";
INFOtext1_on = "<nobr>Top-Layer (Oberseite) wird gefräst.</nobr>";
INFOtext16_on = "<nobr>Bottom-Layer (Unterseite) wird gefräst (<font color=red>gespiegelt</font>) </nobr>";
INFOtext1_off = "<nobr>Top-Layer (Oberseite) AUS.</nobr>";
INFOtext16_off = "<nobr>Bottom-Layer (Unterseite) AUS.</nobr>";
TextInfoPlus = "<nobr>Zusätzlicher Layer zum Fräsen von Texten für Frontplatten<br>" +
"(bzw. um Texte in einem Polygon invertiert zu fräsen). </nobr>" +
"Kann nur in Verbindung mit dem Top- oder Bottom-Layer benutzt werden.";
TOOLdiamIso = "<nobr>Werkzeugdurchmesser zum Isolationsfräsen.</nobr><br>";
OVERlapIso = "<nobr>Überlappung von 1. Isolation zu 2. Isolation/Freifräsung in Prozent (%).</nobr>";
OVERlapRubOut = "<nobr>Überlappung innerhalb der Freifräsung in Prozent %.</nobr>";
TOOLdiamBlow = "<nobr>Werkzeugdurchmesser für erweiterte Isolation und Freifräsung.<br>" +
"Wird der Wert auf <b>0</b> gesetzt, wird <b>keine</b> erweiterte Isolation<br>" +
"und Freifräsung generiert.</nobr>";
TOOLdiamRub = "<nobr>Freifräsung (Rub-Out) ist ausgeschaltet!<br>" +
"Es werden nur die Fräswege für eine 2. Isolation generiert.</nobr><br>" +
"Wird der Wert auf <b>0</b> gesetzt, wird <b>keine</b> erweiterte Isolation<br>" +
"und Freifräsung generiert.";
MILLfreeYes = "<nobr>Es muss ein Wert in Blow-Up (Freifräsung) gesetzt sein.</nobr>";
MILLfreeNo = "<nobr>Es wird kein 2. Isolationsfräsen plus Freifräsen generiert,<br>da der Wert auf 0 gesetzt ist.</nobr>";
INFOmirror0 = "<nobr>Layer 16 (Bottom) wird <b>NICHT</b> gespiegelt.</nobr>";
INFOmirror1 = "<nobr>Layer 16 (Bottom) wird <b>gespiegelt</b>.</nobr>";
GENdrilON = "<nobr>Bohrdaten-Erzeugung <b>aktiv</b>.</nobr>";
GENdrilOFF = "<nobr>Bohrdaten-Erzeugung (PAD, VIA, HOLE) <b>ausgeschaltet</b>.<br>";
PADdrildiam = "<nobr>PAD Bohrdurchmesser.<p>" +
"Wird kein Rack benutzt, werden alle PADs<br>" +
"mit diesem Durchmesser gebohrt.<br>" +
"Wenn <b>[] Use Rack</b> aktiviert ist, werden die PADs<br>" +
"in 1/10 mm Abstufung gebohrt.<br>Siehe Tool Assignment.</nobr>";
VIAdrilldiam = "<nobr>VIA Bohrdurchmesser.<p>" +
"Wird kein Rack benutzt, werden alle VIAs<br>" +
"mit diesem Durchmesser gebohrt.<br>" +
"Wenn <b>[] Use Rack</b> aktiviert ist, werden die VIAs<br>" +
"in 1/10 mm Abstufung gebohrt.<br>Siehe Tool Assignment.</nobr>";
HOLEdrildiam = "<nobr>HOLE Bohrdurchmesser.<p>" +
"Wenn kein Rack benutzt wird, werden alle HOLEs<br>"
"mit diesem Durchmesser gebohrt.<br>" +
"Wenn <b>[] Use Rack</b> aktiviert ist, werden die HOLEs<br>" +
"in 1/10 mm Abstufung gebohrt.<br>Siehe Tool Assignment.</nobr>";
USErackON = "<nobr>Benutze Bohrertabelle (1/10mm), siehe auch Tool Assignment.<br>" +
"Die Bohrungen werden auf 1/10 mm gerundet gebohrt.</nobr>";
USErackOFF = "<nobr>Benutze nur 3 Bohrer für Pads, Vias, Holes.<p>" +
"Alle Pads, Vias und Holes werden mit den im Menu<br>" +
"angegeben Werten gebohrt.</nobr>";
DIMmiltoolOFF = "<nobr>Fräserdurchmeser zum Ausfräsen aus dem Träger.<br>Ausfräsen <b>AUS</b>.</nobr>";
DIMmiltoolON = "<nobr>Fräserdurchmeser zum Ausfräsen aus dem Träger.<br>Ausfräsen <b>EIN</b>.</nobr>";
INFOspacing = "<nobr>Dieser Wert definiert die Mindestkantenlänge der Platine damit <br>" +
"ein Haltesteg (Spacer) erzeugt wird.<br>" +
"Haltestege werden nur an horizontalen oder vertikalen Kanten erzeugt.<br>" +
"Die Breite der Stege ist abhängig vom Durchmesser des Fräsers<br>" +
"(Mill Board/Dim).<br>Der Wert 0 schaltet die Funktion ab.</nobr>";
INFOresolution = "<nobr>Auflösung, Vor- und Nachkommastellen der Koordinaten.</nobr>"; // 2011-02-02
INFOdeep = "<nobr>Bohrtiefe in/durch die Platine.</nobr>";
INFOzsafety = "<nobr>Der Wert um den der Fräser in der Z-Achse über das Werkstück <br>" +
"gefahren wird, z.B. für Werkzeugwechsel (Rueckzugsebene).</nobr>";
INFOzAxisUp = "<nobr>Der Wert um den der Fräser in der Z-Achse über das Werkstück <br>" +
"gefahren wird, für Schnellvorschub (Sicherheitsabstand).</nobr>";
INFOzAxisDown = "<nobr>Die Frästiefe der Z-Achse.</nobr>";
INFOvdrill = "<nobr>Bohrgeschwindigkeit mm/s</nobr>";
INFOvelocity = "<nobr>Fräsgeschwindgkeit mm/s</nobr>";
INFOfastVel = "<nobr>Schnellvorschub mm/s</nobr>";
INFOrpm = "<nobr>Spindelumdrehungen pro Minute</nobr>";
INFOmaxdrill = "<nobr>Der maximal nutzbare Bohrerdurchmesser.<br>" +
"Grössere Bohrungen werden gefräst!<br>" +
"Siehe auch Tool Assignment.</nobr>";
DIMdown = "<nobr>Z-Parameter für ausfräsen der Boardkontur.</nobr>";
PARKinfo = "<nobr>Die Parkposition des Fräskopfs zum Umdrehen der Leiterplatte.</nobr>";
SaveInfo = "<nobr>Einstellungen gespeichert!<\nobr>";
FaultDRCdist1 = "!<qt><nobr>Der Wert von Copper/Dimension ist größer als der Radius von Mill Board/Dim.<br>" +
"Überprüfen Sie den Wert von Distance Copper/Dimension in den Design Rules (<b>DRC</b>)<br>" +
"oder akzeptieren Sie die Distanz von <b>";
FaultDRCdist2 = " mm zur Board-Außenkante</b>.</nobr></qt>";
PlaceVIA = "Platziere VIA";
Error5 = "<nobr>Die CLASS-Clearance ist kleiner als der Fäserdurchmesser von Tool #1!<br>" +
"Dadurch kann nicht alles isoliert (gefräst) werden.<br>" +
"Stellen Sie die CLASS-Clearance auf den Fräserdurchmesser und starten Sie den DRC.<br>" +
"<font color=\"red\"><b>Jeder Clearance-Error bedeutet eine nicht isolierte Leiterbahn!</b></font></nobr>";
sprintf(INFOInaccurat, "Wegen Rechenungenauigkeiten muss für Fräswege zwischen den Leiterbahnen und " + // 2006-02-15
"einem evtl. vorhandenem Füll-Polygon die Spurbreite (Clearance/Isolate) zu WIRE (Arc) um " +
"%.3f mm breiter eingestellt werden, da es sonst an gebogenen Leiterbahnsegmenten " +
"zu fehlerhaften nicht berechneten Fräswegen kommen kann. D.h. die gefräste Isolation ist nicht " +
"komplett geschlossen. ",
Inaccurateness);
Mill_mInner_contour = "Auch Innenkonturen fräsen (z.B. die Isolation von Thermal-Stegen von Polygonen). <br>" + // 2010-01-25
"Wenn ein (Masse-)Polygon im Layout vorhanden ist, kann es dadurch vorkommen, " +
"dass die Isolation doppelt, mit entsprechendem Versatz, gefräst wird.<br>" +
"Die Ursache ist, dass sich eine Kontur an den Leiterbahnzug und eine entgegengesetzt " +
"verlaufende Kontur an die berechnete Kontur des (Masse)-Polygon anlegt. <br>" +
"Soll ein eventuelles doppeltes Freifräsen verhindert werden, schalten " +
"Sie die Option<br><b>Milling [] inner contour</b><br>einfach ab.";
MissingDimension = "!Keine Dimension.\nPlatzierern Sie zuerst die Aussenkontur in Layer 20.";
RefDrillDiameter = "Bohrduchmesser ";
RefDrillDeep = "Tiefe ";
Get_Board_Zero = "Setze Maschinen-&Nullpunkt an linke untere Ecke"; // 2010-10-13
Info_Board_Zero = "<nobr>Erzeugt ein Package mit zwei Kreisen und platziert es an der <br>linken unteren Ecke des Board als Maschinen-Nullpunkt.</nobr>"; // 2011-02-07
} // *** ende language de ***
// ###########################
// The various output devices
// ###########################
enum { none, devScript, devHPGL, devISEL, devCNC };
int Defaultdevice = devScript; // set default device
int SelectedDevice = Defaultdevice; // overwritten by load_menu_values()
int LastSelectedDevice;
string HPGL_TOP_ext = "_top.plt"; // Namenserweierung bei HPGL für Daten des Top-Layers 2014-10-06
string Device;
string Layer1, Layer16;
int SelectedLayer1 = 0;
int SelectedLayer16 = 0;
int SelectedPlusLayerTop = 0; // 2005-06-08
int SelectedPlusLayerBot = 0; // to mill a text inverted in a copper polygon
int Mirror_On = 1; // flag can switch mirror off for layer 16
int ToMillLayer1 = 0;
int ToMillLayer16 = 0;
int OutlineMillSignalLayer; // 2004-10-05
string DeviceNames[] = { "Select a device", "SCRIPT", "HPGL", "ISEL", "CNC" };
string DeviceExt[] = { ".~~~" , ".scr", ".plt", ".ncp", ".ncd" };
string DefaultSuffix = DeviceExt[SelectedDevice];
string Ftop = ""; // Fräsdaten für HPGL in zwei Dateien schreiben. 2013-04-30
// Die Fräse der FU Berlin optimiert die Fräs- und Bohrwege,
// so dass alle Bohrungen und Fräswege mit demselben Werkzeug zusammengefasst werden.
real GridDistance;
int GridUnit;
int GridUnitdist;
string Gridunit[];
Gridunit[GRID_UNIT_MIC] = "mic";
Gridunit[GRID_UNIT_MM] = "MM";
Gridunit[GRID_UNIT_MIL] = "mil";
Gridunit[GRID_UNIT_INCH] = "INCH";
int InitDone = 0; // nur einmal Initialisieren, siehe DeviceInit()
// * set default device and values *
// Parameters
// *** The milling tool diameter ***
real MillToolOutl = 0.2;
real MillToolIsolate = 0.0; // das Isolate des Polygons zum Isolationsfräsen
real minClearance = 0.15; // check if the complete aray with the
// special polygon width can be filled
int OverlapOutlPercent = 20; // percentage, to avoid fine copper lines while milling out the area
real MillToolFree = 0.8; // Blow up & free pouring
int Millfreeyes = 1; // free pouring on/off
int MInner_contour = 1; // milling positiv/negativ polygon contour 2010-01-25
int Lift_Off = 1; // ** do not lift up the tool for rub out of polygon filling **
// ** if changing the direction and X-coordinate < tool radius **
int OverlapRubOutPercent = 20; // percentage, to avoid fine copper lines while milling out the area
real DrillPad = 0.8;
real DrillVia = 0.8;
real DrillHole = 0.8;
int Onlydrill = 0; // output only drill on HPGL
int Generatedrills = 1; // activate drills only in one export file
// while drills crashed in 2. run.
real Max_Drill_Diameter = 2.0; // the maximum of drill diameter in mm of T-Code table for ISEL and CNC
// editierbar gemacht 2004-12-01
real DimensionMillTool = 2.0; // milling board outline from holder
int Dim_on_off = 1; // 2006-01-25
int MillOnlyContour = 0; // 2011-03-10 nur Kontur fräsen
enum { Res32, Res33, Res34, Res3_2, Res3_3, Res3_4 }; // CNC-Resolution ohne und mit Komma 2011-02-03
int CNCmillResolution = Res3_2; // Auflösung der Koorinaten Vor-/Nachkommastellen 2011-02-02
real Drill_z_deep = -3.8; // drill depth for drilling pads, vias, holes
real Mill_z_safety = 2.0; // safety distance to pcb for tool change
real Z_down = -2.0; // cutting depth for z-axis
real Actualmilldeep; // 2011-01-27 in den Funktionen wird nur die aktuelle Frästiefe benutzt
int Spindle_rpm = 15000; // spindle rotation per minute
real Tool_vel = 2; // cutting speed
real TmpTool_vel = 2;
real Fast_vel = 5; // fast move for tool
real Drill_Vel = 0.5; // drilling speed
real ParkZposition = 80.0; // 80mm parking position to turn pcb for 2nd side milling
real ParkXposition = 10.0; // 10mm parking position to turn pcb for 2nd side milling
real ParkYposition = 10.0; // 10mm parking position to turn pcb for 2nd side milling
real Z_dimension = -3.8; // 3.8mm Z-Down for milling dimension (contur)
real DistanceDimension;
real Distance_Copper_Dimension = 0.0001; // default value
real Holder_Spacing = 10.0; // in mm, the distance to make a holder spacing for outline milling
// Class check
string Clearance_check;
// Design Rules Check 2010-10-28
int UseClass = 0;
int MinDistCLass = 0;
string drufile = "";
string DRUvalues[];
int DRUlcnt = 0;
int DRC_changed = 0;
string DRC_changed_message = "";
// Design Rules Check - Values from .dru 2010-01-26
real mtCopper[];
real mtIsolate[];
real minDistWireWire;
real minDistWirePad;
real minDistWireVia;
real minDistPadPad;
real minDistPadVia;
real minDistViaVia;
real minDistSmdPad;
real minDistSmdVia;
real minDistSmdSmd;
real MOI = 0.0; // round((MillToolOutl + Inaccurateness) *1000) / 1000; // Problem bei Vergleich von Realzahlen
real MDW = 0.0; // round(minDistWireWire * 1000) / 1000;
string LayerStack;
string DelPoly; // 2012-01-13 to delete virtual polygon and via outside of board
// The HPGL PEN list
enum { PadDrill = 1, ViaDrill, Contour, BlowUp_RubOut, HoleDrill, DimensionLine, DrillRef, MirrorPCB, nrMaxDrillDiameter } // HPGL Pen select "SP.."
/*** MirrorPCB = TOOL (PEN) #8 is reserved for switch PCB on milling machine for milling second side ***/
/*** nrMaxDrillDiameter == TOOL (PEN) 9 is reserved for milling drills bigger than max drill diameter ***/
string PenList[];
PenList[PadDrill] = "PadDrill";
PenList[ViaDrill] = "ViaDrill";
PenList[Contour] = "Contour";
PenList[BlowUp_RubOut] = "Blow-Up/Rub-Out";
PenList[HoleDrill] = "HoleDrill";
PenList[DimensionLine] = "DimensionLine";
PenList[DrillRef] = "DrillRef";
PenList[MirrorPCB] = "MirrorPCB";
PenList[nrMaxDrillDiameter] = "max.Drill-Diameter"; // 2013-04-18
string sToolValue[]; // Tool diameter as string
enum { HPGLsolution = 1016 } // Inch/1016 = 0.025 mm
enum { ISELsolution = 1000 } // mm/1000 Isel format
enum { CNCrevolution = 60 } // mm/min gcode format
real Mirror = 1.0;
int Mill_OffsetX = 0;
int MillMirr_Offset = 0;
int Ref_null_offsetY = 0;
int Ref_offsetX[];
int Ref_offsetY[];
int Ref_cnto = 0;
real RefHoleCircle = 5.5; // Der Durchmesser für den Circle der im Referenz-Package für den Maschinennullpunkt
// benutzt wird.
string Mirror_axis;
real Drill_mirrorPCB = -1; // for message to mirror the PCB by operator
int MachineMenuOn = 1; // 2011-10-20 maschine menu in separate tab
// * for www.cnc-papst.de * 2005-06-23
int DrillRefOn = 0; // drill reference holes first to fix the pcb on machine
real DrillRefDiameter = 5.5; // the diameter of reference holes
real DrillRefDeep = -6; // the depth of reference holes
// to swap for menu
real MDrillPad = DrillPad;
real MDrillVia = DrillVia;
real MDrillHole = DrillHole;
real MDimensionMillTool = DimensionMillTool;
real MHolder_Spacing = Holder_Spacing;
real MMillToolOutl = MillToolOutl;
real MOverlapOutlPercent = OverlapOutlPercent;
real MMillToolFree = MillToolFree;
real MOverlapRubOutPercent = OverlapRubOutPercent;
int Mmillfreeyes = Millfreeyes;
real Mz_down = Z_down;
real Mdrill_z_deep = Drill_z_deep; // drilling depth for drilling pads, vias, holes
real Mmill_z_safety = Mill_z_safety; // safety distance to pcb for tool change
int Mspindle_rpm = Spindle_rpm; // spindle rotation per minute
real Mtool_vel = Tool_vel;
real Mfast_vel = Fast_vel;
real MDrill_Vel = Drill_Vel;
real MparkXposition = ParkXposition;
real MparkYposition = ParkYposition;
real MparkZposition = ParkZposition;
real Mz_dimension = Z_dimension;
int Mdim_on_off = Dim_on_off;
int MCNCmillResolution = CNCmillResolution;
real CNCsolution = 100; // mm/100 CNC format (default)
int MdrillRefOn = 0;
real MdrillRefDiameter = 3.0;
real MdrillRefDeep = -6.0;
string TrueOutline_coordinate; // generated polygon outlines for the milling polygon 2009-03-31
// get polygon coordinates from actual design.
string ReservedOutlineSignalName = "_OUTLINES_"; // reserved signal name for special polygon
string OutlineMillSignal = "~_REAL_OUTLINEMILL_~"; // used signal name for calculating the real outline
string PassDimensionPoly = "PASSDIMESION"; // the real output line, defined by layer 20, Dimension
string Pass2 = "PASS_2";
string PassPour = "PASS_POUR";
string PassOutmill = "PASS_OUTLINE";
string InPassDimensionPoly;
string InPass2;
string InPassPour;
string InPassOutmill;
int menu = 0;
int cntcontvia = 0; // 2011-10-04
string Showpic[];
string info; // 2011-10-20 first tab
string Infotext;
string zinfo; // 2011-10-20 second tab
string zInfotext;
string Path;
string Xfile, MillFileName;
string Fillstyle16 = "CloseDot";
string Fillstyle1 = "Interleave"; // fill style for layer to return the milling paths
// as wire into the board (if Device == SCRIPT)
string Machineparameter = "";
// ------------- use a rack for drilling; extend the tool list ---------------------
int UseRack = 0; // use drills with 1/10 mm as in generated rack
// or use only 3 different tools 2005-05-23
real Drill_tools[]; // 2005-05-24
string Drill_comment[];
int Cnt_tools = MirrorPCB+2; // the last milling tool
string Tool_Rack_string;
string Drilltoolsplus;
int Nc_drill[];
int Nc_drilld[];
real Nc_drilldround[];
int Nc_drillx[];
int Nc_drilly[];
int Cnt_ncdrill = 0;
int Dindex[];
int index[];
//int Mark = -1;
int Cntpcw; // the counter of contour wire 2006-02-08
int Pcwx[], Pcwy[]; // the polygon countour coordinates to calcultae
int maxX = INT_MIN; // 2010-10-13
int minX = INT_MAX;
int maxY = INT_MIN;
int minY = INT_MAX;
/* -------------------------------------------------------------------------------
? weiterer Isolationswert (noch eine Fräserbreite) zwischen Isolation und Blow up
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CNC-Programmierung:
datron.de:
Vom CAT3D Konverter unterstützte Befehle der DIN 66025 (ISO)
G 00 Positionierung / Eilgang
G 01 Linearinterpolation
G 02 Kreisinterpolation UZ
Schraubenlinieninterpolation UZ
G 03 Kreisinterpolation GUZ
Schraubenlinieninterpolation GUZ
G 20 Maßangaben Zoll
G 21 Maßangabe metrisch
G 40 Werkzeugradiuskorrektur, Löschung
G 41 Werkzeugradiuskorrektur, links
G 42 Werkzeugradiuskorrektur, rechts
G 90 Absolute Maßangabe
G 91 Inkrementale Maßangabe
Weitere ISO-Code Befehle, die vom CATPC berücksichtigt werden:
N Satznummer wird ignoriert
F Vorschub
T Werkzeugwechsel
ENGELHARDT GmbH - BedienPCNC.pdf
G00 POSITIONIEREN IM EILGANG
G01 LINEARINTERPOLATION
G36 WERKZEUGWECHSEL
G74 REFERENZPUNKT FAHREN
M00 PROGRAMMIERTER HALT
M01 PROGRAMMIERTER HALT MIT AKUSTISCHEM SIGNAL
------------------------------------------------------------------------------- */
/************* Functions ******************/
int viewtest(string nachricht, string cmd) {
dlgDialog("Debug/Test") {
dlgLabel(nachricht);
dlgHBoxLayout dlgSpacing(900);
dlgHBoxLayout {
dlgTextEdit(cmd);
dlgVBoxLayout dlgSpacing(250);
}
dlgHBoxLayout {
dlgPushButton("OK") dlgAccept();
dlgSpacing(400);
dlgPushButton(CANCEL) { dlgReject(); return -1; }
}
};
return 0;
}
string filenametop(string s) { // wenn Device HPGL, dann extra Dateiname für Top-Layer
if (SelectedDevice == devHPGL) {
return filesetext(s, HPGL_TOP_ext); // 2014-10-06
}
return s;
}
// wait in seconds
void wait(int sec) {
int t = time();
while(t+sec > time() );
return;
}
void Warning(string Message, string Details) {
dlgMessageBox("<b>Warning: " + Message + "</b> " + Details, "OK");
return;
}
void Fatal(string Message, string Details) {
dlgMessageBox("<b>ERROR: " + Message + "</b><hr><p>\n" + Details);
exit(1);
}
int Error(string Message, string Details, string butt_ok, string butt_esc) {
if (butt_esc) return dlgMessageBox("!<b>ERROR: " + Message + "</b><p>" + Details, butt_ok, butt_esc);
return dlgMessageBox("!<b>ERROR: " + Message + "</b><p>" + Details, butt_ok);
}
if (!board) Fatal("No board!", "This program can only work in the board editor.");
void dirtest(void) {
string a[];
int n = fileglob(a, "*.*");
if (n) {
dlgMessageBox("Working directory:\n" + filedir(a[0]), "OK");
}
return;
}
string vunit(int val, int unit) {
string s;
if (unit) sprintf(s, "%.8f", u2mm(val));
else sprintf(s, "%.8f",u2inch(val));
return s;
}