/* CAMBATDB (CAM) -- CAM Batch Database */ /* CAMBATDB (CAM) -- CAM Datenbank fuer Ausgabebatch-Betrieb */ /* // Copyright (c) 2003-2012 Oliver Bartels F+E, Muenchen // Author: Roman Ludwig // Changes History: // rl (120427) RELEASED FOR BAE V7.8. // rl (111202) ENHANCEMENT: // Added variant output loop option. // rl (100720) ENHANCEMENT: // Added monochrome bitmap outline milling support. // rl (101019) RELEASED FOR BAE V7.6. // rl (090611) ENHANCEMENT: // Added monochrome bitmap output support. // rl (091027) RELEASED FOR BAE V7.4. // rl (090318) ENHANCEMENT: // Added batch call batch step support. // rl (081014) RELEASED FOR BAE V7.2. // rl (080527) ENHANCEMENT: // Added full change directory support. // rl (071219) BUGFIX: // Fixed problem with preset drill output file names. // rl (071029) RELEASED FOR BAE V7.0. // rl (070604) ENHANCEMENT: // Added metric output options. // rl (070216) ENHANCEMENT: // Added project directory skip option. // rl (070201) ENHANCEMENT: // Added warning control batch step. // rl (070109) ENHANCEMENT: // Suppressed drill class warnings if no drill output at all. // rl (060829) RELEASED FOR BAE V6.8. // rl (060724) ENHANCEMENT: // Added CAM origin reference option. // rl (060713) ENHANCEMENT: // Added generic inssertion data output support. // rl (060425) ENHANCEMENT: // Added warnings for missing drill class output. // Suppressed output of unused drill classes. // rl (060112) ENHANCEMENT: // Fixed problem with dynamic aperture table generation. // rl (051108) ENHANCEMENT: // Added comment string to drill parameters. // rl (051027) ENHANCEMENT: // Added output step order option. // rl (051024) ENHANCEMENT: // Added short file names for report option. // rl (050906) RELEASED FOR BAE V6.6. // rl (050425) ENHANCEMENT: // Added DDB element output support. // rl (041005) ENHANCEMENT: // Added batch name sorting. // rl (040811) RELEASED FOR BAE V6.4. // rl (040721) ENHANCEMENT: // Added report output support. // Added command call step support. // Added ULC program call step support. // rl (040709) ENHANCEMENT: // Added insertion data batch step support. // Added coordinate origin reference option. // rl (040706) ENHANCEMENT: // Added remote batch call support. // rl (040401) BUGFIX: // Fixed problem with import/export of multilayer plots. // rl (031219) ENHANCEMENT: // Added CAM View layer parameter to gerber batch steps. // rl (030927) BUGFIX: // Fixed output problem with text only layers. // rl (030904) RELEASED FOR BAE V6.2. // rl (030731) ENHANCEMENT: // Added EPS/PDF batch output support. // rl (030730) ENHANCEMENT: // Added combined layer output support. // Added output to folder option. // rl (030502) ORIGINAL CODING // // DESCRIPTION // // The cambatdb User Language program provides utilities to // maintain a set of CAM data output batches in a SQL database. // cambatdb can only be run in Windows/Motif environments. */ // Includes #include "pop.ulh" // User Language popup utilities #include "lay.ulh" // User Language layout utilities #include "sql.ulh" // User Language SQL utilities #include "baeparam.ulh" // User Language BAE param. access // Messages string REPGBRPLT = M("Gerber-Plotausgabe Lage %s...", "Gerber Plot in progress for layer %s..."); string REPHPPLT = M("HPGL-Plotausgabe Lage %s...", "HPGL Plot in progress for layer %s..."); string REPLAYCVPLT = M("Lagenbedeckungsabfrage Lage %s...", "Layer coverage query layer %s..."); string REPINSPLT = M("Bestueckdatenausgabe Lage %s...", "Insertion Data Output in progress for layer %s..."); string REPBMPOUT = M("Monochrom-Bitmap-Ausgabe Lage %s...", "Monochrom Bitmap output in progress for layer %s..."); string REPGPOUT = M("Generic/Windows Druckerausgabe Lage %s...", "Generic/Windows printer output in progress for layer %s..."); string REPDDBPLT = M("DDB-Elementausgabe Lage %s...", "DDB Element Output in progress for layer %s..."); string REPHEADER = M("CAM Batch Report:","CAM Batch Report:"); string REPJOB = M(" Projektdatei ........................: '%s'", " Project File ...........................: '%s'"); string REPLAYOUT = M(" Layout ..............................: '%s'", " Layout .................................: '%s'"); string REPVARIANT = M(" Variante : '%s'"," Variant : '%s'"); string REPDRLTFILE = M(" Bohrer Werkzeugdatei ................: '%s'", " Drill Tool Table File ...................: '%s'"); string REPDRLDFILE = M(" Bohrdaten-Datei (%-19s): '%s'", " Drill Data File (%-22s): '%s'"); string REPDRLCLASS = M("Klasse '%s'","Class '%s'"); string REPGBRFILE = M(" Gerber Datei (%-22s): '%s'", " Gerber Plotfile (%-22s): '%s'"); string REPGBREP0 = M(" Gerber-Plot Report :"," Gerber Plot Report :"); string REPGBREP1 = M(" Anzahl blitzbelichteter Strukturen .....: %ld", " Number of Flash Structures .............: %ld"); string REPGBREP2 = M(" Anzahl rechteck-gezeichneter Flaechen ..: %ld", " Number of Rectangle Drawn Areas ........: %ld"); string REPGBREP3 = M(" Anzahl kreis-gezeichneter Flaechen .....: %ld", " Number of Circle Drawn Areas ...........: %ld"); string REPGBREP4 = M(" Anzahl Multiblenden Flaechen ...........: %ld", " Number of Multi Aperture Areas .........: %ld"); string REPGBREP5 = M(" Anzahl liniengefuellter Flaechen .......: %ld", " Number of Line Filled Areas ............: %ld"); string REPGBREP6 = M(" Anzahl gezeichneter Waermefallen .......: %ld", " Number of Heat Traps ...................: %ld"); string REPGBREP7 = M(" Anzahl Ueberzeichnungs-Fehler ..........: %ld", " Number of Overdraw Errors ..............: %ld"); string REPHPFILE = M(" HPGL Datei (%-22s): '%s'", " HPGL Plotfile (%-22s): '%s'"); string REPINSFILE = M(" Bestueckdaten Datei (%-22s): '%s'", " Insertion Data File (%-22s): '%s'"); string REPLAYCV = M(" %s %s: %.1f %%, (%.1f von %.1f mm^2)", " %s %s: %.1f %%, (%.1f of %.1f mm^2)"); string REPBMPFILE = M(" Monochrom-Bitmap Datei (%-22s): '%s'", " Monochrome Bitmap file (%-22s): '%s'"); string REPGPPRINT = M(" Generic Ausgabe Drucker (%-22s): '%s'", " Generic Output Printer (%-22s): '%s'"); string REPDDBFILE = M(" DDB Ausgabeelement (%-22s): '%s'/'%s'", " DDB Output Element (%-22s): '%s'/'%s'"); string REPULCCALL = M(" ULC-Programmaufruf: '%s'", " ULC Program Call: '%s'"); string REPCMDCALL = M(" Kommandoaufruf: '%s'"," Command Call: '%s'"); string REPCMDCDDIR = M(" Wechsel ins Projektverzeichnis", " Change to Project Directory"); string REPCMDADIR = M(" Wechsel ins Verzeichnis '%s'", " Change to Directory '%s'"); string REPHPREP0 = M(" HPGL-Plot Report :"," HPGL Plot Report :"); string REPLAYWARNHD = M("Ausgabelagenwarnung","Output layer warning"); string REPLAYWARNMSG0 = M("Lage '%s' wurde nicht als Ausgabelage definiert, ", "Layer '%s' is not defined as output layer, "); string REPLAYWARNMSG1 = M("enthaelt aber relevante Connectivity-Daten!", "but contains connectivity relevant data!"); string REPDRLWARNHD = M("Ausgabebohrklassenwarnung", "Output drill class warning"); string REPDRLWARNMSG0 = M("Bohrklasse '%c' wurde nicht als Ausgabeklasse", "Drill class '%c' is not defined as output class,"); string REPDRLWARNMSG1 = M(" definiert, enthaelt aber Bohrdaten!", "but contains drill data!"); string REPGBRSTEP = M("Gerberausgabe %s","Gerber Output %s"); string REPHPSTEP = M("HPGL-Ausgabe %s","HPGL Output %s"); string REPLAYCVSTEP = M("Report Lagenbedeckung %s", "Report Layer Coverage %s"); string REPLAYCVTEXT = M("Lagenbedeckung","Layer Coverage"); string REPLAYCVNEG = M(", negiert",", inverted"); string REPBMPMASK = M(", Umrandungsmaske ",", Board Outline Mask"); string REPRES = M(", %.2f mm Aufloesung",", %.2f mm Resolution"); string REPCOMMSTEP = M("Kommentarausgabe '%s...'", "Comment Output '%s...'"); string REPINSSTEP = M("Bestueckdatenausgabe %s", "Insertion Data Output %s"); string REPBMPSTEP = M("Monochrom-Bitmap-Ausgabe %s", "Monochrome Bitmap Output %s"); string REPGPSTEP = M("Generic-Ausgabe %s","Generic Output %s"); string REPDDBSTEP = M("DDB-Elementausgabe %s","DDB Element Output %s"); string REPCMDSTEP = M("Kommandoaufruf %s","Command Call %s"); string REPCDDIRSTEP = M("Wechsel ins Projektverzeichnis", "Change to Project Directory"); string REPADIRSTEP = M("Wechsel ins Verzeichnis '%s'", "Change to Directory '%s'"); string REPULCSTEP = M("ULC-Programmaufruf %s","ULC Program Call %s"); string REPWRNSTEP = M("Warnungskontrolle:","Warning Control:"); string REPREPSTEP = M("Reportausgabe","Report Output"); string REPVARSTEP = M("Variable %s setzen","Set Variable %s"); string REPFEXT = M("Dateiendung ","File Extension "); string REPFDIR = M("Ausgabeverzeichnis ","Output Folder "); string REPPDIR = M("Verzeichnis ","Folder "); string REPFNAME = M("Dateiname ","File Name "); string REPGBRSTDLINE = M("%.2f mm Std. Linienbreite", "%.2f mm Default Line Width"); string REPGBRSYMTOL = M("%.2f mm Symboltoleranz", "%.2f mm Symbol Tolerance"); string REPHPPEN = M("Stift %d, %.2f mm Stiftbreite", "Pen %d, %.2f mm Pen Width"); string REPHPSCALE = M("Skalierung %.2f","Scale Factor %.2f"); string REPDRLFEXT = M("Bohrungsdateiendung ","Drill File Extension "); string REPDRLFNAME = M("Bohrungsdateiname ","Drill File Name "); string REPTOLFEXT = M("Werkzeugtabellendateiendung ", "Tool Table File Extension "); string REPTOLFNAME = M("Werkzeugtabellendateiname ", "Tool Table File Name "); string REPEXCSTEP = M("Excellonbohrdatenausgabe %s", "Excellon Drill Data Output %s"); string REPSMSTEP = M("Sieb & Meyer-Bohrdatenausgabe %s", "Sieb & Meyer Drill Data Output %s"); string REPTOOLTOL = M(" mm Werkzeugtoleranz"," mm Tool Range"); string REPEPSSTEP = M("EPS/PDF-Batchausgabe %s", "EPS/PDF Batch Output %s"); string REPSEPSSTEP = M("SCM EPS/PDF-Batchausgabe %s", "SCM EPS/PDF Batch Output %s"); string REPVLSTEP = M("Variantenausgabeschleife","Variant Output Loop"); string REPCAMVSTEP = M("CAM-View Kontrollaufruf","CAM View Call"); string REPBATCHSTEP = M("CAM-Batchausgabe %s","CAM Batch Output %s"); string REPGINSTEP = M("Bestueckdatenausgabe %s", "Insertion Data Output %s"); string REPDIREXT = M("Dateiverzeichnis '%s' / Extension '%s' :", "Directory '%s' / Extension '%s' :"); string REPDIRINV = M("-- Ungueltiger Verzeichnisname! --", "-- Invalid Directory Path Name! --"); string REPDIRINC = M("-- Auflistung abgebrochen/unvollstaendig! --", "-- Listing aborted/incomplete! --"); string REPVARBASE = M("Basisvariante","Base Variant"); string REPVARUNNAMED = M("Variante %d","Variant %d"); string UPRABORT = M_UPRABORT(); string UPRFCT1 = M("&Starten","&Run"); string UPRFCT2 = M("&Anlegen","&New"); string UPRFCT3 = M("A&endern","&Edit"); string UPRFCT4 = M("&Kopieren","&Copy"); string UPRFCT5 = M("&Import","&Import"); string UPRFCT6 = M("E&xport","E&xport"); string UPRFCT7 = M("&Loeschen","&Delete"); string UPRBATNAME = M("Batchauswahl","Batch Selection"); string UPROBATNAME = M("Ausgabe Batchname :","Output Batch Name :"); string UPRNBATNAME = M("Neuer Batchname :","New Batch Name :"); string UPRBATSTEPS = M("Batchausgabeschritte :","Batch Output Steps :"); string UPRBATDEL = M("Batch '%s' loeschen?","Delete Batch '%s'?"); string UPREBATNAME = M("EPS/PDF Batchauswahl","EPS/PDF Batch Selection"); string UPRSEBATNAME = M("SCM EPS/PDF Batchauswahl", "SCM EPS/PDF Batch Selection"); string UPRCOLTAB = M("Farbtabelle ? ","Color Table ? "); string UPRDCOLTAB = M("Farbtabelle :","Color Table :"); string UPRISFFILE = M("Formatbeschreibungsdatei ? ", "Format Description File ? "); string UPRSTEPDEL = M("Schritt '%s' loeschen?","Delete Step '%s'?"); string UPRSELTYP = M("Ausgabetyp waehlen!","Select Output Type!"); string UPRTYP1 = M("&Gerberausgabe","&Gerber Output"); string UPRTYP2 = M("&HPGL-Ausgabe","&HPGL Output"); string UPRTYP3 = M("Generic/Windows-Druckerausgabe", "Generic/Windows Printer Output"); string UPRTYP4 = M("&Excellon Bohrdaten","&Excellon Drill Data"); string UPRTYP5 = M("&Sieb && Meyer Bohrdaten", "&Sieb && Meyer Drill Data"); string UPRTYP6 = M("E&PS/PDF Batchausgabe","E&PS/PDF Batch Output"); string UPRTYP7 = M("S&CM EPS/PDF Batchausgabe", "SC&M EPS/PDF Batch Output"); string UPRTYP8 = M("&Bestueckdatenausgabe","&Insertion Data Output"); string UPRTYP9 = M("Ge&nerische Bestueckdatenausgabe", "Ge&neric Insertion Data Output"); string UPRTYP10 = M("&Monochrom-Bitmapausgabe", "Monochrome &Bitmap Output"); string UPRTYP11 = M("&DDB-Elementausgabe","&DDB Element Output"); string UPRTYP12 = M("&Kommandoaufruf","&Command Call"); string UPRTYP13 = M("&ULC-Programmaufruf","&ULC Program Call"); string UPRTYP14 = M("&Warnungskontrolle","&Warning Control"); string UPRTYP15 = M("Report &Lagenabdeckung","Report &Layer Coverage"); string UPRTYP16 = M("K&ommentarzeile fuer Report", "C&omment Line Output"); string UPRTYP17 = M("CAM-Ba&tchaufruf","CAM Ba&tch Call"); string UPRTYP18 = M("&Reportausgabe","Output &Report"); string UPRTYP19 = M("&Variable setzen","Set &Variable"); string UPRTYP20 = M("Variantenausgabeschleife","Variant Output Loop"); string UPRTYP21 = M("C&AM-View Kontrollaufruf","C&AM View Call"); string UPRSFCT1 = M("A&endern","&Edit"); string UPRSFCT2 = M("&Neu","&New"); string UPRSFCT3 = M("&Ableiten/Kopieren","Deri&ve/Copy"); string UPRSFCT4 = M("&Loeschen","&Delete"); string UPRSFCT5 = M("&Fertig","D&one"); string UPRDIALGBPAR = M("Gerberparameter %s","Gerber Settings %s"); string UPRDIALHPPAR = M("HPGL-Parameter %s","HPGL Settings %s"); string UPRDIALINSPAR = M("Bestueckdatenparameter %s", "Insertion Data Settings %s"); string UPRDIALGINPAR = M("Generische Bestueckdatenparameter", "Generic Insertion Data Settings"); string UPRDIALBMPPAR = M("Monochrom Bitmap-Parameter %s", "Monochrome Bitmap Settings %s"); string UPRDIALGPPAR = M("Generic Ausgabe-Parameter %s", "Generic Output Settings %s"); string UPRDIALDDBPAR = M("DDB-Elementausgabeparameter %s", "DDB Element Output Settings %s"); string UPRDIALCMDPAR = M("Kommandoparameter","Command Settings"); string UPRDIALWRNPAR = M("Warnungskontrolle","Warning Control"); string UPRDIALLAYCVPAR = M("Lagenbedeckungsreport","Layer Coverage Report"); string UPRDIALREPPAR = M("Reportausgabedatei","Report Output File"); string UPRREPALL = M("Gesamtreport","Total Report"); string UPRREPVAR = M("Report Variante","Report Variant"); string UPRDIALVARPAR = M("Variable setzen Parameter","Variable Settings"); string UPRDOUTFILE = M("Ausgabedatei :","Output File :"); string UPRDGINFILE = M("Format Datei :","Format File :"); string UPRDOUTELEM = M("Ausgabeelement :","Output Element :"); string UPRINDEX = M("Ausgabereihenfolge Index ? ", "Output Order Index ? "); string UPRDINDEX = M("Ausgabereihenfolge Index :", "Output Order Index :"); string UPRDPARFILE = M("Datei :","File :"); string UPRDPARPRINT = M("Drucker (\\\\host\\printer) :", "Printer Nam (\\\\host\\printer) :"); string UPRSTDPRINTER = M("Standarddrucker","Default Printer"); string UPRSELPRINTER = M("Manuelle Druckerauswahl", "With manual printer selection"); string UPRDOUTEXT = M("Dateiendung :","File Extension :"); string UPRDOUTDIR = M("Ausgabeverzeichnis :","Output Folder :"); string UPRDPARDIR = M("Verzeichnis :","Folder :"); string UPRDFMODE = M("Dateinamensmodus: ","File Name Mode :"); string UPRFMODE0 = M("Dateiendung","File Extension"); string UPRFMODE1 = M("Fester Dateiname","Fix File Name"); string UPRDGPSMODE = M("Skalierungsmodus :","Scale Mode :"); string UPRGPSMODE0 = M("Feste Skalierung","Use Scale Factor"); string UPRGPSMODE1 = M("Auf Blattgroesse skalieren","Scale to Paper Size"); string UPRDGPCMODE = M("Zeichenmodus :","Drawing Mode :"); string UPRGPCMODE0 = M("Deckend zeichnen","Opaque Colors"); string UPRGPCMODE1 = M("Farbmischung","Merged Colors"); string UPRDLAYCOMM = M("Lagenkommentar :","Layer Comment :"); string UPRDLAYCVTEXT = M("Ausgabetext :","Output Text :"); string UPRDRES = M("Rasteraufloesung :","Grid Resolution :"); string UPRDLAYCVNEG = M("Negativausgabe","Inverted Output"); string UPRDCLCOMM = M("Klassenkommentar :","Class Comment :"); string UPRDCMDFILE = M("Kommandostart :","Command Start :"); string UPRDCMDPARAM = M("Kommandoparameterteil","Command Parameter"); string UPRDCMDEND = M("Kommandoende :","Command End :"); string UPRDCMDLAUNCH = M("Auf Beenden warten","Wait for Completion"); string UPRDVARNAME = M("Variable :","Variable :"); string UPRDVARVAL = M("Defaultwert :","Default Value :"); string UPRDGBRSLW = M("Std. Linienbreite :","Default Line Width :"); string UPRDGBRFMT = M("Gerber Format :","Gerber Format :"); #define UPRGBRFMT23 "Format 2.&3 Inch" #define UPRGBRFMT24 "Format 2.&4 Inch" #define UPRGBRFMT25 "Format 2.&5 Inch" #define UPRGBRFMT26 "Format 2.&6 Inch" string UPRGBRFMT33 = M("Format 3.3 metrisch","Format 3.3 metric"); string UPRGBRFMT34 = M("Format 3.4 metrisch","Format 3.4 metric"); string UPRGBRFMT35 = M("Format 3.5 metrisch","Format 3.5 metric"); string UPRGBRFMT36 = M("Format 3.6 metrisch","Format 3.6 metric"); string UPRDGBROPTM = M("Optimierung :","Optimization :"); string UPRRBOFF = M("&Aus","O&ff"); string UPRRBON = M("&Ein","&On"); string UPRDGBRFILLM = M("Gerber Fuellmodus :","Gerber Fill Mode :"); string UPRGBRFILLM0 = M("&Linienfuellen","&Line Fill"); string UPRGBRFILLM1 = M("&Multiblendenfuell.","&Multi Apert. Fill"); string UPRGBRFILLM2 = M("&G36/G37 Fuellen","&G36/G37 Fill"); string UPRDGBRARCM = M("Gerber Kreisboegen :", "Gerber Arc Mode :"); string UPRGBRARCM0 = M("&Kreisinterpolation","A&pprox. Arcs"); string UPRGBRARCM1 = M("&Gerberkreisbefehle","&Gerber Arcs"); string UPRDGBREXTM = M("Extended Gerber :", "Extended Gerber :"); string UPRGBREXTM0 = M("&Kein Ext. Gerber","&No Extended Gerber"); string UPRGBREXTM1 = M("Ext. Gerber &fest","Ext. Gerber &fix."); string UPRGBREXTM2 = M("Ext. Gerber &dyn.","Ext. Gerber &dyn."); string UPRAPTTAB = M("Blendentabelle ? ","Aperture Table ? "); string UPRDGBRAPTN = M("Blendentabelle :","Aperture Table :"); string UPRDHPPENN = M("Stiftnummer :","Pen Number :"); string UPRDHPPENW = M("Stiftbreite :","Pen Width :"); string UPRDHPSCAL = M("Skalierung :","Scale Factor :"); string UPRDHPSPEED = M("Geschwindigkeit :","Plotter Speed :"); string UPRDHPMSPEED = M("max.","max."); string UPRDHPCMSPEED = M("cm/s","cm/s"); string UPRDNOINP = M("--------","--------"); string UPRDHPFILLM = M("Flaechenausgabe :","Area Output :"); string UPRDHPFILLM1 = M("Umrandung","Outline"); string UPRDHPFILLM2 = M("Gefuellt","Filled"); string UPRALLLAY = M("Alle Lagen Modus :","All Layers Mode :"); string UPRALLM1 = M("&Getrennte Lage","Plot &Separate"); string UPRALLM2 = M("&Zusammenplotten","Plot &Together"); string UPRALLM3 = M("&Angeschlossene","Plot &Connected"); string UPRALLM4 = M("&Pins && ang. Vias","Pins && con. Vias"); string UPRALLM5 = M("&Vias && ang. Pins","Vias && con. Pins"); string UPRBORDM = M("Umrandung Modus :","Border Mode :"); string UPRBORD1 = M("&Keine Umrandung","Plot Border &Off"); string UPRBORD2 = M("&Umrandung plotten","&Plot Border On"); string UPRBORDMASK = M("Umrandungsmaske :","Border Mask :"); string UPRBORDM1 = M("&Keine Maske","&No Mask"); string UPRBORDM2 = M("&Umrandung als Maske","Use &Border Mask"); string UPRBORDM3 = M("&Negativ in Umrandung","Border with &Cutout"); string UPRSYMTOL = M("Symboltoleranz :","Symbol Tolerance :"); string UPRFIDM = M("Passermarken Lage :","Reg. Marks Mode :"); string UPRROTM = M("Plot/CAM drehen :","Plot/CAM Rotate :"); string UPRROT1 = M("Drehung &0 Grad","&No Rotate"); string UPRROT2 = M("Drehung &90 Grad","&Left Rotate"); string UPRMIRRM = M("Plot/CAM spiegeln :","Plot/CAM Mirror :"); string UPRMIRR1 = M("Spiegeln a&us","Mirroring &Off"); string UPRMIRR2 = M("&Spiegeln ein","&Mirroring On"); string UPRMIRR3 = M("&X-Ruecks. (S:aus)","&X-Backside (M:Off)"); string UPRMIRR4 = M("X-Ruecks. (S:&ein)","X-&Backside (M:On)"); string UPRMIRR5 = M("&Y-Ruecks. (S:aus)","&Y-Backside (M:Off)"); string UPRMIRR6 = M("Y-Ruecks. (S:e&in)","Y-Backside (M:O&n)"); string UPRDORGSYM = M("Nullpunktsymbol :","Origin Macro :"); string UPRCVLAY = M("CAM-View Lage : ","CAM-View Layer : "); string UPRCVLAYN = M("---------","---------"); string UPRHTDMD = M("V-WF-Min.-Abstand :","P-HT Min. Distance :"); string UPRHTANG = M("V-WF-Basiswinkel","P-HT Base Angle"); string UPRISDMD = M("V-IS-Min.-Abstand :","P-IS Min. Distance :"); string UPRHTTOL = M("V-WF-Toleranz :","P-HT Tolerance :"); string UPRISTOL = M("V-IS-Toleranz :","P-IS Tolerance :"); string UPRBRDWD = M("V-Lagen-Umrandung :","Power Layer Border :"); string UPRSPPIS = M("V-Lagen-Isolation :","Power Layer Isol. :"); string UPRHTANG1 = M("&0 Grad","&0"); string UPRHTANG2 = M("&45 Grad","&45 Degree"); string UPRDUNIT = M("Einheiten :","Units :"); string UPRDUNITMM = M("mm","mm"); string UPRDUNITMIL = M("mil","mil"); string UPRBRWFILENAME = M("Browse","Browse"); string UPRBRWCVLAY = M("Setzen","Set"); string UPRDIALSM = M("Sieb && Meyer-Bohrdatenausgabe Parameter", "Sieb && Meyer Drill Data Output Settings"); string UPRDIALEXC = M("Excellon-Bohrdatenausgabe Parameter", "Excellon Drill Data Output Settings"); string UPRDDRLCLASS = M("Bohrungsklasse (-,A..Z) :", "Drill Class (-,A..Z) :"); string UPRDTOOLTOL = M("Werkzeugtoleranz [mm] :","Tool Range [mm] :"); string UPRDDRLFILE = M("Bohrungsdateiname :","Drill Output File :"); string UPRDDRLEXT = M("Bohrungsdateiendung :","Drill File Extension :"); string UPRDTOLFILE = M("Werkzeugtabellendateiname :", "Tool Table Output File :"); string UPRDTOLEXT = M("Werkzeugtabellendateiendung :", "Tool Table File Extension :"); string UPRCMDFILE = M("Kommandoname :","Command Name :"); string UPRULCPROG = M("Programmname :","Program Name :"); string UPRULCPROGS = M("Programmsequenz :","Program Call Sequence :"); string UPRCOMMENT = M("Kommentarzeile :","Comment Line :"); string UPRSRCFILE = M("Quelldatei ? ","Source File ? "); string UPRDSTFILE = M("!Zieldatei ? ","!Destination File ? "); string UPRDRLMARK = M("Bohrklassenwarnungen unterdruecken", "Suppress drill class warnings"); string UPRSLAYMARK = M("Signallagenwarnungen unterdruecken", "Suppress signal layer output warnings"); string UPRPLAYMARK = M("Versorgungslagenwarnungen unterdruecken", "Suppress power layer output warnings"); string WRNDUPCAMV = M("Nur ein CAM-View-Aufruf pro Batch erlaubt!", "Multiple CAM View calls not supported!"); string WRNDUPVL = M("Variantenschleife ist bereits konfiguriert!", "Variant loop already configured!"); string ERRNOBATCH = M("Batch '%s' nicht gefunden!", "Batch '%s' not found!"); string ERRSTEPCNT = M("Batch enthaelt mehr als 1000 Schritte! (Rekursion?)", "Batch has more than 100 steps! (Recursion?)"); string ERRNOFILEN = M("Kein Ausgabedateiname definiert!", "No Output File Name defined!"); string ERRNOELEMN = M("Kein Ausgabeelementname definiert!", "No Output Element Name defined!"); string ERRNOCMD = M("Kein Kommandoname definiert!", "No Command Name defined!"); string ERRILLCLASS = M("Ungueltige Bohrungsklasse '%s'!", "Invalid Drill Class '%s'!"); string ERRINVELEM = M("Operation fuer dieses Element nicht erlaubt!", "Operation not allowed for this element!"); string ERRNOGBROS = M("Kein Symbol '%s' fuer Gerber-CAM-Nullpunkt platziert!", "No Gerber CAM origin symbol '%s' placed!"); string ERRMULGBROS = M("Symbol '%s' fuer Gerber-CAM-Nullpunkt mehrfach platziert!", "Multiple Gerber CAM origin symbols '%s' placed!"); string ERRNOHPOS = M("Kein Symbol '%s' fuer HPGL-CAM-Nullpunkt platziert!", "No HPGL CAM origin symbol '%s' placed!"); string ERRMULHPOS = M("Symbol '%s' fuer HPGL-CAM-Nullpunkt mehrfach platziert!", "Multiple HPGL CAM origin symbols '%s' placed!"); string ERRNODRLOS = M("Kein Symbol '%s' fuer Bohrdaten-CAM-Nullpunkt platziert!", "No Drill CAM origin symbol '%s' placed!"); string ERRMULDRLOS = M("Symbol '%s' fuer Bohrdaten-CAM-Nullpunkt mehrfach platziert!", "Multiple Drill CAM origin symbols '%s' placed!"); string ERRNOINSOS = M("Kein Symbol '%s' fuer Bestueckdaten-CAM-Nullpunkt platziert!", "No Drill CAM origin symbol '%s' placed!"); string ERRMULINSOS = M("Symbol '%s' f. Bestueckdaten-CAM-Nullpunkt mehrfach platz.!", "Multiple Drill CAM origin symbols '%s' placed!"); string ERRSETGENPAR = M("Fehler beim Setzen der allgemeinen Plotparameter!", "Error setting general plot parameters!"); string ERRSETPOWPAR = M("Fehler beim Setzen der Versorgungslagen-Plotparameter!", "Error setting power layer plot parameters!"); string ERRNOGBRAPT = M("Gerber Blenden-Tabelle '%s' nicht gefunden!", "Gerber aperture table '%s' not found!"); string ERRGBRLDAPT = M("Fehler beim Laden der Gerber-Blendentabelle '%s'!", "Error loading Gerber aperture table '%s'!"); string ERRGBRSLWAPT = M("Keine passende Gerber-Blende fuer Standard-Linienbreite!", "No matching Gerber aperture for standard line width!"); string ERRGBRPLTOUT = M("Gerber-Plotausgabe nach '%s' fehlgeschlagen!", "Gerber plot output to '%s' failure!"); string ERRHPGLPLTOUT = M("HPGL-Plotausgabe nach '%s' fehlgeschlagen!", "HPGL plot output to '%s' failure!"); string ERRDRLTTOL = M("Bohrdaten-Werkzeugtoleranz-Einstellung fehlgeschlagen!", "Error setting drill tool tolerance!"); string ERRDRLOTOOL = M("Bohrdaten-Werkzeugtabellen-Ausgabe '%s' fehlgeschlagen!", "Error writing drill tool table '%s'!"); string ERRDRLODATA = M("Bohrdatenausgabe '%s' fehlgeschlagen!", "Error writing drill data '%s'!"); string ERRDBLELEM = M("DDB-Datei '%s Element '%s' bereits vorhanden!", "DDB File '%s' Element '%s' already exists!"); string ERRELEMOUT = M("Ausgabe DDB-Datei '%s Element '%s' fehlgeschlagen!", "Output DDB File '%s' Element '%s' failed!"); string ERRDBLBATCH = M("Batch '%s' bereits vorhanden!", "Batch '%s' already defined!"); string ERRDBINIT = M("SQL/DB-Datei '%s' kann nicht initialisiert werden!", "Error initialyzing SQL/DB file '%s'!"); // INI file parameter name definitions #define PAR_SHORTFN "REPSHORTFN_CAM" // Short file names in report flag #define PAR_IFSFEXT "IFSFEXT_CAM" // Insertion spec. file name ext. #define PAR_IFSFDIR "IFSFDIR_CAM" // Insertion spec. file directory #define PAR_PIXRESOL "PIXRESOL_CAM" // Plot pixmap resolution #define PAR_BMPRESOL "BMPRESOL_CAM" // Plot bitmap resolution // Global program variables string BAECAMDAT = strgetconffilename(CAMLIBVNAME,CAMLIBNAME,1); // BAE CAM data file name string BAECAMBDAT = strgetconffilename(CAMBLIBVNAME,CAMBLIBNAME,1); // BAE CAM batch data file name string BAEEPSBDAT = strgetconffilename(EPSBLIBVNAME,EPSBLIBNAME,1); // BAE EPS batch data file name string GEDDAT = strgetconffilename(GEDLIBVNAME,GEDLIBNAME,1) /* GED data file */; int SHORTFN = bae_iniintval(PAR_SHORTFN,0); // Report short file names flag #define GV_EPSBAT "EPS_BATNAME" // Remote control operation batch name #define GV_INSFORMAT "GIN_FORMAT" // Remote control operation format name #define GV_BATCALL "BAT_CALL" // Remote control operation flag #define GV_BATREPCNT "BAT_REPCNT" // Remote control op. report count #define GV_BATREPLINE "BAT_REPL_" // Remote control op. report line #define DATEXT ".dat" // Data file extension #define ORGREF "!" // Origin reference string #define CAMORGREF "#" // CAM origin reference string // Dialog box definitions #define SB_WIDTH 19.0 // Selection box width #define CCOLOFF2 20.0 // Second control column offset #define SCOLOFF2 41.0 // Second column set offset #define BBUTWIDTH 8.0 // Batch menu action button width #define BBUTXSTEP 10.0 // Batch menu action button x step #define MBUTWIDTH 13.0 // Menu action button width #define MBUTXSTEP 15.0 // Menu action button x step #define SELBOXWIDTH 95.0 // Step selection box width #define SELBOXHEIGHT 16.0 // Selection box height // Power layer plot parameter definitions #define POWPLTHTDMD 0.0004 // Heat trap to drill min. dist. #define POWPLTHTANG 0 // Heat trap base angle #define POWPLTISDMD 0.0004 // Isolation to drill min. dist. #define POWPLTHTTOL 0.0001 // Heat trap tolerance #define POWPLTISTOL 0.0001 // Isolation tolerance #define POWPLTBRDWD 0.0021 // Border width #define POWPLTSPPIS 0.0003 // Split power plane isol. width // General output definitions #define CHKLAYER_0 0 // Layer check off flag #define CHKLAYER_1 1 // Layer check on flag int CHKLAYERFLAG = CHKLAYER_1 /* Layer check flag */; #define COMPTOL 0.000000001 // Compare tolerance // Gerber plot output definitions #define GBRFMT_23 0.0000254 // Gerber format 2.3 #define GBRFMT_24 0.00000254 // Gerber format 2.4 #define GBRFMT_25 0.000000254 // Gerber format 2.5 #define GBRFMT_26 0.0000000254 // Gerber format 2.6 #define GBRFMT_33 0.000001 // Gerber format 3.3 metric #define GBRFMT_34 0.0000001 // Gerber format 3.4 metric #define GBRFMT_35 0.00000001 // Gerber format 3.5 metric #define GBRFMT_36 0.000000001 // Gerber format 3.6 metric #define GBROPTF_0 0 // Gerber optimization off flag #define GBROPTF_1 1 // Gerber optimization on flag #define GBRFILLM_0 0 // Gerber line fill mode #define GBRFILLM_1 1 // Gerber multi fill mode #define GBRFILLM_2 2 // Gerber G36/G37 fill mode #define GBRARCM_0 0 // Gerber arc circle interpolation #define GBRARCM_1 1 // Gerber arc circle commands #define GBREXTM_0 0 // Gerber no extended mode #define GBREXTM_1 1 // Gerber static extended mode #define GBREXTM_2 2 // Gerber dynamic extended mode #define GBRSLW_3 0.0003 // Gerber std. line width 0.3mm #define HPSLW_1 0.0001 // HPGL std. pen width 0.1mm #define GBRAPTTAB "standard" // Gerber aperture table #define GBRSYMTOL 0.00005 // Gerber symbol tolerance [m] #define GBRORIGSYM "" // Gerber CAM origin symbol int GBROPTFLAG = GBROPTF_0 /* Gerber optimization flag */; int GBRFILLMODE = GBRFILLM_1 /* Gerber fill mode */; int GBRARCMODE = GBRARCM_0 /* Gerber arc mode */; int GBREXTMODE = GBREXTM_0 /* Gerber extended mode */; // Gerber output parameters #define PARGBRFILE 0 // Output file name #define PARGBRLAYER 1 // Output layer #define PARGBRFORMAT 2 // Gerber format (conversion factor) #define PARGBROPTFLAG 3 // Optimization flag #define PARGBRFILLMODE 4 // Fill mode #define PARGBRARCMODE 5 // Arc mode #define PARGBREXTMODE 6 // Extended mode #define PARGBRSTDLINEW 7 // Standard line width #define PARGBRSYMTOL 8 // Symbol tolerance #define PARGBRORGSYM 9 // Origin symbol name #define PARGBRPHTDMD 10 // Heat trap to drill min. distance #define PARGBRPISDMD 11 // Isolation to drill min. distance #define PARGBRPHTTOL 12 // Heat trap tolerance #define PARGBRPISTOL 13 // Isolation tolerance #define PARGBRPBRDWD 14 // Border width #define PARGBRPSPPIS 15 // Split power plane isolation width #define PARGBRFMODE 16 // Output file mode #define PARGBRDIR 17 // Output file directory #define PARGBRALLMODE 18 // All layer mode #define PARGBRBRDMODE 19 // Board outline mode #define PARGBRMRKMODE 20 // Registration marks mode #define PARGBRROTMODE 21 // Rotation mode #define PARGBRMIRMODE 22 // Mirror mode #define PARGBRAPTTAB 23 // Aperture table name #define PARGBRCVLAYER 24 // CAM View import layer #define PARGBRCOMMENT 25 // Output layer comment #define PARGBRIDX 26 // Output step index #define PARGBRPHTANG 27 // Heat trap base angle #define PARGBRCNT 28 // Gerber parameter count // HPGL output parameters #define PARHPFILE 0 // Output file name #define PARHPLAYER 1 // Output layer #define PARHPPENNUM 2 // Pen number #define PARHPPENWIDTH 3 // Pen width #define PARHPSCALE 4 // Output scale #define PARHPSPEED 5 // Output speed #define PARHPFILLMODE 6 // Fill mode #define PARHPSYMTOL 7 // Symbol tolerance #define PARHPORGSYM 8 // Origin symbol name #define PARHPPHTDMD 9 // Heat trap to drill min. distance #define PARHPPISDMD 10 // Isolation to drill min. distance #define PARHPPHTTOL 11 // Heat trap tolerance #define PARHPPISTOL 12 // Isolation tolerance #define PARHPPBRDWD 13 // Border width #define PARHPPSPPIS 14 // Split power plane isolation width #define PARHPFMODE 15 // Output file mode #define PARHPDIR 16 // Output file directory #define PARHPALLMODE 17 // All layer mode #define PARHPBRDMODE 18 // Board outline mode #define PARHPMRKMODE 19 // Registration marks mode #define PARHPROTMODE 20 // Rotation mode #define PARHPMIRMODE 21 // Mirror mode #define PARHPCOMMENT 22 // Output layer comment #define PARHPIDX 23 // Output step index #define PARHPPHTANG 24 // Heat trap base angle #define PARHPCNT 25 // HPGL parameter count // Excellon output parameters #define PAREXCFILE 0 // Output file name #define PAREXCCLASS 1 // Output class #define PAREXCDRLTOL 2 // Drill tool tolerance #define PAREXCORGSYM 3 // Origin symbol name #define PAREXCFMODE 4 // Output file mode #define PAREXCDIR 5 // Output file directory #define PAREXCROTMODE 6 // Rotation mode #define PAREXCMIRMODE 7 // Mirror mode #define PAREXCIDX 8 // Output step index #define PAREXCCOMMENT 9 // Output step comment #define PAREXCCNT 10 // Excellon parameter count // Sieb & Meyer output parameters #define PARSMFILE 0 // Drill output file name #define PARSMCLASS 1 // Output drill class #define PARSMDRLTOL 2 // Drill tool tolerance #define PARSMORGSYM 3 // Origin symbol name #define PARSMFMODE 4 // Drill output file mode #define PARSMDIR 5 // Drill output file directory #define PARSMTFILE 6 // Tool output file name #define PARSMTFMODE 7 // Tool output file mode #define PARSMTDIR 8 // Tool output file directory #define PARSMROTMODE 9 // Rotation mode #define PARSMMIRMODE 10 // Mirror mode #define PARSMIDX 11 // Output step index #define PARSMCOMMENT 12 // Output step comment #define PARSMCNT 13 // Sieb & Meyer parameter count // Drill data output definitions #define DRLTOOLTOL "0.1" // Drill tool tolerance (mm) // EPS/PDF batch output parameters #define PAREPSBAT 0 // Batch name #define PAREPSIDX 1 // Output step index #define PAREPSCNT 2 // EPS/PDF batch parameter count // SCM EPS/PDF batch output parameters #define PARSEPSBAT 0 // Batch name #define PARSEPSIDX 1 // Output step index #define PARSEPSCNT 2 // SCM EPS/PDF batch parameter count // CAM View batch parameters #define PARCAMVBAT 0 // Batch name #define PARCAMVIDX 1 // Output step index #define PARCAMVCNT 2 // CAM View batch parameter count // Insertion data output parameters #define PARINSFILE 0 // Insertion data output file name #define PARINSORGSYM 1 // Origin symbol name #define PARINSFMODE 2 // Insertion data output file mode #define PARINSDIR 3 // Insertion data output file directory #define PARINSLAYER 4 // Insertion data output layer #define PARINSROTMODE 5 // Rotation mode #define PARINSMIRMODE 6 // Mirror mode #define PARINSCOMMENT 7 // Output layer comment #define PARINSIDX 8 // Output step index #define PARINSCNT 9 // Insertion data parameter count // Generic insertion data output parameters #define PARGINFRM 0 // Format description name #define PARGINIDX 1 // Output step index #define PARGINCNT 2 // Insertion data parameter count // Monochrome bitmap output parameters #define PARBMPFILE 0 // Output file name #define PARBMPLAYER 1 // Output layer #define PARBMPSTDLINEW 2 // Standard line width #define PARBMPRES 3 // Output scale #define PARBMPPHTDMD 4 // Heat trap to drill min. distance #define PARBMPPISDMD 5 // Isolation to drill min. distance #define PARBMPPHTTOL 6 // Heat trap tolerance #define PARBMPPISTOL 7 // Isolation tolerance #define PARBMPPBRDWD 8 // Border width #define PARBMPPSPPIS 9 // Split power plane isolation width #define PARBMPFMODE 10 // Output file mode #define PARBMPDIR 11 // Output file directory #define PARBMPALLMODE 12 // All layer mode #define PARBMPBRDMODE 13 // Board outline mode #define PARBMPMRKMODE 14 // Registration marks mode #define PARBMPROTMODE 15 // Rotation mode #define PARBMPMIRMODE 16 // Mirror mode #define PARBMPCOMMENT 17 // Output layer comment #define PARBMPIDX 18 // Output step index #define PARBMPPHTANG 19 // Heat trap base angle #define PARBMPCNT 20 // BMP parameter count // Generic output parameters #define PARGPPRINT 0 // Output printer name #define PARGPLAYER 1 // Output layer #define PARGPSTDLINEW 2 // Standard line width #define PARGPPHTDMD 3 // Heat trap to drill min. distance #define PARGPPISDMD 4 // Isolation to drill min. distance #define PARGPPHTTOL 5 // Heat trap tolerance #define PARGPPISTOL 6 // Isolation tolerance #define PARGPPBRDWD 7 // Border width #define PARGPPSPPIS 8 // Split power plane isolation width #define PARGPALLMODE 9 // All layer mode #define PARGPBRDMODE 10 // Board outline mode #define PARGPMRKMODE 11 // Registration marks mode #define PARGPROTMODE 12 // Rotation mode #define PARGPMIRMODE 13 // Mirror mode #define PARGPCOMMENT 14 // Output layer comment #define PARGPIDX 15 // Output step index #define PARGPPHTANG 16 // Heat trap base angle #define PARGPSCALE 17 // Output scale #define PARGPSMODE 18 // Scale mode #define PARGPCMODE 19 // Color mix mode #define PARGPCOLTAB 20 // Color table name #define PARGPCNT 21 // Generic output parameter count // DDB element output parameters #define PARDDBFILE 0 // Output file name #define PARDDBLAYER 1 // Output layer #define PARDDBFMODE 2 // Output file mode #define PARDDBDIR 3 // Output file directory #define PARDDBELEM 4 // Output element name #define PARDDBALLMODE 5 // All layer mode #define PARDDBBRDMODE 6 // Board outline mode #define PARDDBMRKMODE 7 // Registration marks mode #define PARDDBCOMMENT 8 // Output layer comment #define PARDDBIDX 9 // Output step index #define PARDDBCNT 10 // DDB output parameter count // ULC program call parameters #define PARULCPSTR 0 // ULC program call string #define PARULCIDX 1 // Output step index #define PARULCCNT 2 // ULC program call parameter count // Warning level parameters #define PARWRNIDX 0 // Output step index #define PARWRNDRL 1 // Suppress drill warnings flag #define PARWRNSLAY 2 // Suppress signal layer warnings flag #define PARWRNPLAY 3 // Suppress power layer warnings flag #define PARWRNCNT 4 // Warning ctrl. call parameter count // Command call parameters #define PARCMDPREF 0 // Command prefix #define PARCMDSUFF 1 // Command suffix #define PARCMDPFILE 2 // Command parameter file name #define PARCMDPMODE 3 // Command parameter mode #define PARCMDPDIR 4 // Command parameter file directory #define PARCMDLAUNCH 5 // Command launch flag #define PARCMDIDX 6 // Output step index #define PARCMDCNT 7 // Command parameter count // Report file parameters #define PARREPFILE 0 // Report file name #define PARREPFMODE 1 // Report mode #define PARREPDIR 2 // Report file directory #define PARREPIDX 3 // Output step index #define PARREPVAR 4 // Variant report step flag #define PARREPCNT 5 // Report count // Variable set parameters #define PARVARNAME 0 // Variable name #define PARVARVAL 1 // Variable default value #define PARVARIDX 2 // Output step index #define PARVARCNT 3 // Report count // Comment output parameters #define PARCOMMTEXT 0 // Comment text string #define PARCOMMIDX 1 // Output step index #define PARCOMCNT 2 // Comment text line parameter count // Layer coverage report parameters #define PARLAYCVRES 0 // Layer coverage bitmap resolution #define PARLAYCVLAYER 1 // Check layer #define PARLAYCVIDX 2 // Output step index #define PARLAYCVTEXT 3 // Check layer #define PARLAYCVPHTDMD 4 // Heat trap to drill min. distance #define PARLAYCVPISDMD 5 // Isolation to drill min. distance #define PARLAYCVPHTTOL 6 // Heat trap tolerance #define PARLAYCVPISTOL 7 // Isolation tolerance #define PARLAYCVPBRDWD 8 // Border width #define PARLAYCVPSPPIS 9 // Split power plane isolation width #define PARLAYCVALLMODE 10 // All layer mode #define PARLAYCVBRDMODE 11 // Board outline mode #define PARLAYCVMRKMODE 12 // Registration marks mode #define PARLAYCVROTMODE 13 // Rotation mode #define PARLAYCVMIRMODE 14 // Mirror mode #define PARLAYCVPHTANG 15 // Heat trap base angle #define PARLAYCVNEG 16 // Inverted layer #define PARLAYCVCNT 17 // Layer coverage parameter count // Variant loop parameters #define PARVLIDX 0 // Output step index #define PARVLCNT 1 // Variant loop parameter count // CAM batch parameters #define PARCAMBBAT 0 // Batch name #define PARCAMBIDX 1 // Output step index #define PARCAMBCNT 2 // CAM batch parameter count // Plot statistic counters summary int sflash,srect,scirc,smulti,sline,sheat,serr,hpserr; // Layer usage check variables int slayusel[] /* Signal layer usage list */; int playusel[] /* Power layer usage list */; int toplayer /* Plan top layer */; int chklayer1 /* First output check layer */; int chklayer2 /* Second output check layer */; int layerused /* Layer used flag */; int curlayer /* Current layer code */; int classused /* Drill class used flag */; int curclass /* Current drill class */; int drlclusel[] /* Drill class usage list */; index L_FIGURE curfig /* Current figure list index */; int curpidx /* Current scan padstack index */; int curruleid /* Current scan rule object ID */; string envvar /* Environment variable name */; int firstgerb /* First gerber output flag */; int firsthpgl /* First HPGL output flag */; STRINGS el /* Popup entry list */; int en /* Popup entry count */; int venbase = 0 /* Variant base entry */; int nopopup = 0 /* Don't display report flag */; string IFSEXT = bae_inistrval(PAR_IFSFEXT,".ifs"); // Insertion format spec. file ext. string IFSDIR = bae_inistrval(PAR_IFSFDIR,""); // Insertion format spec. file dir. STRINGS extlist = { // Insertion spec. file extensions IFSEXT }; // SQL command definitions #define B_CREATE "create table batchnames (batchname string);" #define B_HELP "help batchnames;" #define B_INSERT "insert into batchnames values(%s);" #define B_SELECT "select batchname from batchnames;" #define B_DELETE "delete from batchnames where batchname=%s;" #define E_SELECT "select batchname from epsbatches;" #define SE_SELECT "select batchname from sepsbatches;" #define SI_CREATE "create table stepid (maxstepid integer);" #define SI_HELP "help stepid;" #define SI_INSERT "insert into stepid values(%d);" #define SI_SELECT "select maxstepid from stepid;" #define SI_DELETE "delete from stepid;" #define S_CREATE1 "create table batchsteps (batchname string," #define S_CREATE2 "id integer,typ integer);" #define S_HELP "help batchsteps;" #define S_INSERT "insert into batchsteps values(%s,%d,%d);" #define S_SELECT "select id,typ from batchsteps where batchname=%s;" #define S_DELETE "delete from batchsteps where batchname=%s;" #define S_DELETES "delete from batchsteps where batchname=%s AND id=%d;" #define P_CREATE1 "create table paramtab (batchname string,stepid integer," #define P_CREATE2 "pidx integer,ival integer,dval float,sval string);" #define P_HELP "help paramtab;" #define P_INSERT "insert into paramtab values(%s,%d,%d,%d,%.20f,%s);" #define P_SELECT1 "select pidx,ival,dval,sval from paramtab where " #define P_SELECT2 "batchname=%s AND stepid=%d;" #define P_DELETE "delete from paramtab where batchname=%s;" #define P_DELETES "delete from paramtab where batchname=%s AND stepid=%d;" #define C_CREATE1 "create table pentab (batchname string,stepid integer," #define C_CREATE2 "layer integer,pen integer);" #define C_HELP "help pentab;" #define C_INSERT "insert into pentab values(%s,%d,%d,%d);" #define C_SELECT1 "select layer,pen from pentab where " #define C_SELECT2 "batchname=%s AND stepid=%d;" #define C_DELETE "delete from pentab where batchname=%s;" #define C_DELETES "delete from pentab where batchname=%s AND stepid=%d;" #define V_SELECTA "select from varinfo;" string sqlcommand /* SQL command string */; int queryid = 0 /* ID query buffer */; // Batch definitions #define STEP_GBR 0 // Gerber output step #define STEP_EXC 1 // Excellon drill data output step #define STEP_SM 2 // Sieb & Meyer drill data output step #define STEP_EPS 3 // EPS/PDF batch data output step #define STEP_HP 4 // HPGL output step #define STEP_INS 5 // Insertion data output step #define STEP_DDB 6 // DDB element output step #define STEP_GIN 7 // Generic insertion data output step #define STEP_BMP 8 // BMP output step #define STEP_GP 9 // Generic printer output step #define STEP_VL 49 // Variant loop step #define STEP_BATCH 50 // Batch call step #define STEP_COMM 96 // Comment output step #define STEP_LAYCV 97 // Layer coverage report step #define STEP_VAR 98 // Variable set step #define STEP_WRN 99 // Warning control step #define STEP_ULC 100 // ULC program call step #define STEP_CMD 101 // Command call step #define STEP_REP 102 // Report output step #define STEP_SEPS 999 // SCM EPS/PDF batch data output step #define STEP_CAMV 1000 // CAM view batch step string batl[] /* Batch name list */; int batn /* Batch count */; int curstep = (-1) /* Current batch step */; string curbatname /* Current batch name */; int curpar /* Current parameter index */; struct pardes { // Batch step parameter descriptor int ival /* Batch step integer parameter */; double dval /* Batch step double parameter */; string sval /* Batch step string parameter */; }; struct stepdes { // Batch step descriptor string batname /* Batch name */; int id /* Batch step ID */; int typ /* Batch step type */; int parn /* Batch step parameter count */; struct pardes parl[] /* Batch step parameter list */; } stepl[] /* Batch step list */; int stepn = 0 /* Batch step count */; int menuoff = lay_menulaylinecnt() /* Layer selection menu offset */; struct vardesc { // Variant descriptor int varnum /* Variant number */; string varname /* Variant name */; } varl[] /* Variant list */; static int varn = 0 /* Variant count */; static int act_flag = 0 /* Active variant defined flag */; static int curvarnum /* Current variant number */; static int varnumber = 0 /* Variant number */; static int unsavedplan = baegetintpar(21) /* Unsaved plan flag */; // Main program void main() { string batname /* Batch name */; double butx /* Dialog box button x coordinate */; double cy /* Dialog box current y coordinate */; double dialwidth /* Dialog box width */; double dialheight /* Dialog box height */; double baseheight /* Dialog box base height */; int lbidx = (-1) /* List box item index */; int dialres /* Dialog box result buffer */; int repflag = 0 /* Dialog box repeat flag */; int i /* Loop control variable */; // Check if dialog box support if (bae_dialclr()) { // Get the output batch name if ((batname=bae_readedittext(UPROBATNAME,"",MAXTEXTLEN))=="" || batname==UINPOPABORT) error_abort(); // Check if report disabled if (batname[0]=='!') { batname=strextract(batname,1,strlen(batname)); nopopup=1; } runbatch(batname); exit(0); } // Init. the batch database dbinit(BAECAMBDAT); baseheight=DIAL_TOPMARG+DIAL_SEPVSTEP+DIAL_BUTVSTEP+0.2; // Perform input loop do { // Get batch entries batn=0; if (sqlcmd(BAECAMBDAT,B_SELECT,batnamefunc)!=0) // SQL/DB error sql_dberror(0); bae_dialclr(); dial_getboxsizemin(3001,dialwidth,dialheight, DIAL_LEFTMARG+SELBOXWIDTH+DIAL_RIGHTSMARG,baseheight+16.0, DIAL_LEFTMARG+80.0,baseheight+2.0); repflag=0; butx=DIAL_LEFTMARG; cy=DIAL_TOPMARG; // Store function buttons butx=DIAL_LEFTMARG; if (bae_planddbclass()!=DDBCLUNDEF) { bae_dialaddcontrol(PA_ACT,0,0,0,0.0,0.0,0.0,"",0, butx,cy,BBUTWIDTH,UPRFCT1); butx+=BBUTXSTEP; } bae_dialaddcontrol( PA_ACT,0,1,0,0.0,0.0,0.0,"",0,butx,cy,BBUTWIDTH,UPRFCT2); butx+=BBUTXSTEP; bae_dialaddcontrol( PA_ACT,0,2,0,0.0,0.0,0.0,"",0,butx,cy,BBUTWIDTH,UPRFCT3); butx+=BBUTXSTEP; bae_dialaddcontrol( PA_ACT,0,3,0,0.0,0.0,0.0,"",0,butx,cy,BBUTWIDTH,UPRFCT4); butx+=BBUTXSTEP; bae_dialaddcontrol( PA_ACT,0,4,0,0.0,0.0,0.0,"",0,butx,cy,BBUTWIDTH,UPRFCT5); butx+=BBUTXSTEP; bae_dialaddcontrol( PA_ACT,0,5,0,0.0,0.0,0.0,"",0,butx,cy,BBUTWIDTH,UPRFCT6); butx+=BBUTXSTEP; bae_dialaddcontrol( PA_ACT,0,6,0,0.0,0.0,0.0,"",0,butx,cy,BBUTWIDTH,UPRFCT7); butx+=BBUTXSTEP; // Store abort button bae_dialaddcontrol(PA_ABORT,0,0,0,0.0,0.0,0.0,"",0, butx,cy,0.0,""); cy+=DIAL_BUTVSTEP; // Store list box lbidx=bae_dialadvcontrol( PA_LB|PA_OKSEL|PA_HSCROLL|PA_HBRDREL|PA_VBRDREL, (-1),0,(-1),0.0,0.0,0.0,"",0, DIAL_LEFTMARG,cy,DIAL_RIGHTSMARG,DIAL_SEPVSTEP+0.2,""); // Store list box entries for (i=0;i=0 && i=0 && layer=POWLAYBASE && layer<(POWLAYBASE+POWLAYMAX)) playusel[layer-POWLAYBASE]=1; break; // Others default : ; } // Return without errors return(0); } int layupath(index L_LINE path,int layer,int pathinws,index L_LEVEL level) /* // Check a path data block for layer usage // Return value : // zero if done or (-1) on file error // Parameters : // index L_LINE path : Path // int layer : Path layer // int pathinws : Path in workspace flag // index L_LEVEL level : Path level */ { int layscanign /* Layer scan ignore */; // Query the path layer scan status if (lay_rulequery(RS_OCPOOL,path,RS_PCBSUBJ, RS_LAYSCANIGN,"?d",layscanign)<1) // Set default layer scan mode layscanign=0; // Query the layer usage flag if (layscanign) // Path disabled for layer usage scan return(0); // Set the layer usage flag if (layer>=0 && layer=POWLAYBASE && layer<(POWLAYBASE+POWLAYMAX)) playusel[layer-POWLAYBASE]=1; // Return without errors return(0); } int layudrill(index L_DRILL drill,double x,double y, int drillinws,int tree,index L_LEVEL level) /* // Drill class usage scan function // Return value : // zero if done or (-1) on file error // Parameters : // index L_DRILL drill : Drill data block // double x : Drill X coordinate // double y : Drill Y coordinate // int drillinws : Drill in workspace flag // int tree : Drill tree number // index L_LEVEL level : Drill level */ { index L_NREF nref /* Named reference index */; string rulename /* Rule name */; int pstkdis /* Padstack disable flag */; int drlclass /* Drill class */; // Check if disabled padstack (double drill mark) */ if (curruleid>=0) { sprintf(rulename,RS_PSTKDDFLAG,curpidx); if (lay_rulequery(RS_OCFIG,curfig,RS_PCBSUBJ, rulename,"?d",pstkdis)>0 && pstkdis) // Padstack disabled return(0); } // Get the effective drill class drlclass= ((drill.CLASS&DRLCMIRR) && (nref=lay_getscpartrpidx())>=0 && nref.MIRROR) ? (drill.CLASS&DRLCMASK2)>>DRLCSHFT2 : drill.CLASS&DRLCMASK1 ; // Set the class usage flag drlclusel[drlclass]=1; // Return without errors return(0); } int layulchk(int layer) /* // Layer usage check routine // Return value : // zero if scan break requested, 1 if scan allowed // Parameters : // int layer : Layer code */ { // Check layer return((layer>toplayer && layer=POWLAYBASE && layer<(POWLAYBASE+POWLAYMAX))); } int layhmacro(index L_MACRO macro,index L_POOL pool, int macinws,string refname,index L_LEVEL level) /* // Check a macro data block for layer hit // Return value : // 0 if out of workspace, 1 if inside, 2 if unknown, or (-1) on error // Parameters : // index L_MACRO macro : Macro index // index L_POOL pool : Macro pool index // int macinws : Macro in workspace flag // string refname : Macro reference name // index L_LEVEL level : Macro level */ { int layscanign /* Layer scan ignore */; // Query the macro layer scan status if (lay_rulequery(RS_OCPOOL,pool,RS_PCBSUBJ, RS_LAYSCANIGN,"?d",layscanign)<1) // Set default layer scan mode layscanign=0; // Return macro scan status return(layscanign ? 0 : 1); } int layhpoly(index L_POLY poly,int layer, int polyinws,int tree,index L_LEVEL level) /* // Check a polygon data block for layer hit // Return value : // zero if done or (-1) on file error // Parameters : // index L_POLY poly : Polygon // int layer : Polygon layer // int polyinws : Poly in workspace flag // int tree : Polygon tree number // index L_LEVEL level : Polygon level */ { int layscanign /* Layer scan ignore */; // Check the polygon type switch (poly.TYP) { // Copper case L_POLYCOPPASS : // Connected copper case L_POLYCOPACT : // Split power plane area case L_POLYSPPAREA : // Hatched copper case L_POLYHTCHCOP : // Documentary line case L_POLYDOCLINE : // Documentary area case L_POLYDOCAREA : // Board outline case L_POLYBRDOUT : // Query the polygon layer scan status if (lay_rulequery(RS_OCPOOL,poly,RS_PCBSUBJ, RS_LAYSCANIGN,"?d",layscanign)<1) // Set default layer scan mode layscanign=0; if (!layscanign) layerused=1; // Abort the scan return(-1); break; // Others default : ; } // Return without errors return(0); } int layhpath(index L_LINE path,int layer,int pathinws,index L_LEVEL level) /* // Check a path data block for layer usage // Return value : // zero if done or (-1) on file error // Parameters : // index L_LINE path : Path // int layer : Path layer // int pathinws : Path in workspace flag // index L_LEVEL level : Path level */ { int layscanign /* Layer scan ignore */; // Query the path layer scan status if (lay_rulequery(RS_OCPOOL,path,RS_PCBSUBJ, RS_LAYSCANIGN,"?d",layscanign)<1) // Set default layer scan mode layscanign=0; // Set the layer usage flag if (!layscanign) layerused=1; // Abort the scan return(-1); } int layhtext(index L_TEXT textp,double tx,double ty,double tangle, int mirrflag,int layer,double tsize,string tstr,int textinws) /* // Check a text data block for layer usage // Return value : // zero if done or (-1) on error // Parameters : // index L_TEXT textp : Text index // double tx : Text X coordinate // double ty : Text Y coordinate // double tangle : Text rotation angle // int mirrflag : Text mirror flag // int layer : Text layer code // double tsize : Text size // string tstr : Text string // int textinws : Text in workspace flag */ { int layscanign /* Layer scan ignore */; // Query the text layer scan status if (lay_rulequery(RS_OCPOOL,textp,RS_PCBSUBJ, RS_LAYSCANIGN,"?d",layscanign)<1) // Set default layer scan mode layscanign=0; // Set the layer usage flag if (!layscanign) layerused=1; // Abort the scan return(-1); } int layhlchk(int layer) /* // Layer usage check routine // Return value : // zero if scan break requested, 1 if scan allowed // Parameters : // int layer : Layer code */ { // Check the layer return(layer==chklayer1 || layer==chklayer2); } int drlmacfunc(index L_MACRO macro,index L_POOL pool, int macinws,string refname,index L_LEVEL level) /* // Drill class usage scan macro function // Return value : // 0 if out of workspace, 1 if inside, 2 if unknown, or (-1) on error // Parameters : // index L_MACRO macro : Macro index // index L_POOL pool : Macro pool index // int macinws : Macro in workspace flag // string refname : Macro reference name // index L_LEVEL level : Macro level */ { int layscanign /* Layer scan ignore */; // Query the macro layer scan status if (lay_rulequery(RS_OCPOOL,pool,RS_PCBSUBJ, RS_LAYSCANIGN,"?d",layscanign)<1) // Set default layer scan mode layscanign=0; // Check class switch (macro.CLASS) { case DDBCLLPRT : return(layscanign ? 0 : 1); case DDBCLLSTK : // Update padstack index curpidx++; return(layscanign ? 0 : 1); default : ; } // Abort scan return(0); } int drlfunc(index L_DRILL drill,double x,double y, int drillinws,int tree,index L_LEVEL level) /* // Drill class usage scan function // Return value : // zero if done or (-1) on file error // Parameters : // index L_DRILL drill : Drill data block // double x : Drill X coordinate // double y : Drill Y coordinate // int drillinws : Drill in workspace flag // int tree : Drill tree number // index L_LEVEL level : Drill level */ { index L_NREF nref /* Named reference index */; string rulename /* Rule name */; int pstkdis /* Padstack disable flag */; int drlclass /* Drill class */; // Check if disabled padstack (double drill mark) */ if (curruleid>=0) { sprintf(rulename,RS_PSTKDDFLAG,curpidx); if (lay_rulequery(RS_OCFIG,curfig,RS_PCBSUBJ, rulename,"?d",pstkdis)>0 && pstkdis) // Padstack disabled return(0); } // Get the effective drill class drlclass= ((drill.CLASS&DRLCMIRR) && (nref=lay_getscpartrpidx())>=0 && nref.MIRROR) ? (drill.CLASS&DRLCMASK2)>>DRLCSHFT2 : drill.CLASS&DRLCMASK1 ; // Check if scanned class if (drlclass==curclass) { // Class used abort scan classused=1; return(-1); } // Return without errors return(0); } int get_camorig(string os, double ox=bae_planwslx(),double oy=bae_planwsly()) /* // Get the CAM origin // Return value : // zero if done, 1 if multiple origin symbol, (-1) if no origin symbol // Parameters : // string os : Origin symbol // double ox=bae_planwslx(): Origin X coordinate // double oy=bae_planwsly(): Origin Y coordinate */ { index L_NREF nref /* Named reference index */; int osmatch = 0 /* Origin symbol match count */; // Test the origin symbol name if (os=="") // No origin symbol; return without errors return(0); strlower(os); // Check if coordinate origin reference if (os==ORGREF) { // Coordinate origin ox=bae_planwsnx(); oy=bae_planwsny(); return(0); } // Check if CAM coordinate origin reference if (os==CAMORGREF) { // CAM coordinate origin cam_getgenpltparam(0,0,0,0,0,0,ox,oy); return(0); } // Search the origin symbol forall (nref where nref.NAME==os) { // Set the origin coordinates ox=nref.X; oy=nref.Y; osmatch++; } // Test the origin symbol match count if (osmatch==1) // Origin symbol matched return(0); if (osmatch>1) // Multiple origin symbol match return(1); // No origin symbol matched return(-1); } // Data check routines int dataonlayer(int laynum,int allmode) /* // Test if data is on given layer // Return value : // zero if no data on layer, nonzero otherwise // Parameters : // int laynum : Layer number // int allmode : All layer mode */ { index L_FIGURE fig /* Figure list index */; index L_POWLAYER powlay /* Power layer index */; int layscanign /* Element layer scan ignore flag */; // Check on power layers if (laynum>=POWLAYBASE && laynum-POWLAYBASE=DOCLAYBASE && allmode ? (laynum&~0x03)|0x02 : laynum ; layerused=0; // Scan the layer usage forall (fig) { // Check element's layer scan status if (fig.RULEOBJID>=0 && lay_rulequery(RS_OCFIG,fig,RS_PCBSUBJ, RS_LAYSCANIGN,"?d",layscanign)>0 && layscanign) continue; lay_scanfelem(fig,0.0,0.0,0.0,1,1,layhmacro,layhpoly, layhpath,layhtext,NULL,layhlchk,NULL); if (layerused) break; } // Return the layer usage return(layerused); } int drlclassused(int class) /* // Test if drill class is used // Return value : // zero if no drill with given class, nonzero otherwise // Parameters : // int class : Drill class */ { int layscanign /* Element layer scan ignore flag */; // Set the check data curclass=class; classused=0; // Scan the drill class usage forall (curfig) { // Set padstack scan data curpidx=(-1); curruleid=curfig.RULEOBJID; // Check element's layer scan status if (curruleid>=0 && lay_rulequery(RS_OCFIG,curfig,RS_PCBSUBJ, RS_LAYSCANIGN,"?d",layscanign)>0 && layscanign) continue; lay_scanfelem(curfig,0.0,0.0,0.0,1,1,drlmacfunc,NULL, NULL,NULL,drlfunc,NULL,NULL); if (classused) break; } // Return the drill class usage return(classused); } /*________________________________________________________________*/ // SQL database access routines void dbinit(string dbname) /* // Initialize database // Parameter : // string dbname : Database name */ { // Create/init database file if (sqlinit(dbname,0)==(-1) && sqlinit(dbname,1)==(-1)) // SQL/DB creation error errormsg(ERRDBINIT,dbname); // Create tables in database if (sqlcmd(bae_planfname(),B_HELP,NULL)!=0) if (sqlcmd(dbname,B_CREATE,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); if (sqlcmd(bae_planfname(),SI_HELP,NULL)!=0) if (sqlcmd(dbname,SI_CREATE,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); if (sqlcmd(bae_planfname(),S_HELP,NULL)!=0) if (sqlcmd(dbname,S_CREATE1+S_CREATE2,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); if (sqlcmd(bae_planfname(),P_HELP,NULL)!=0) if (sqlcmd(dbname,P_CREATE1+P_CREATE2,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); if (sqlcmd(bae_planfname(),C_HELP,NULL)!=0) if (sqlcmd(dbname,C_CREATE1+C_CREATE2,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); } int idfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Any ID query callback function // Return value : // zero if done or (-1) on data error // Parameters : // string dstr : String/Date data // int dint : Integer/Boolean data // double ddbl : Float data // int dval : Data valid flag // int dtype : Data type // string dtable : Data table name // string dfield : Data field name // int didx : Data output field index */ { // Get ID queryid=dint; // Return without errors return(0); } int batnamefunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Batch name list callback function // Return value : // zero if done or (-1) on data error // Parameters : // string dstr : String/Date data // int dint : Integer/Boolean data // double ddbl : Float data // int dval : Data valid flag // int dtype : Data type // string dtable : Data table name // string dfield : Data field name // int didx : Data output field index */ { int i /* Loop control variable */; switch (didx) { // Name case 1 : for (i=batn;i>0;i--) if (batl[i-1]>dstr) batl[i]=batl[i-1]; else break; batl[i]=dstr; batn++; break; } // Return without errors return(0); } int stepfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Step list callback function // Return value : // zero if done or (-1) on data error // Parameters : // string dstr : String/Date data // int dint : Integer/Boolean data // double ddbl : Float data // int dval : Data valid flag // int dtype : Data type // string dtable : Data table name // string dfield : Data field name // int didx : Data output field index */ { switch (didx) { // ID case 1 : stepl[stepn].id=dint; stepl[stepn].batname=curbatname; break; // Type case 2 : stepl[stepn].typ=dint; stepn++; break; } // Return without errors return(0); } int paramfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Parameter list callback function // Return value : // zero if done or (-1) on data error // Parameters : // string dstr : String/Date data // int dint : Integer/Boolean data // double ddbl : Float data // int dval : Data valid flag // int dtype : Data type // string dtable : Data table name // string dfield : Data field name // int didx : Data output field index */ { switch (didx) { // Parameter index case 1 : curpar=dint; break; // Integer value case 2 : stepl[curstep].parl[curpar].ival=dint; break; // Double value case 3 : stepl[curstep].parl[curpar].dval=ddbl; break; // String value case 4 : stepl[curstep].parl[curpar].sval=dstr; break; } // Return without errors return(0); } int penfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Combined layer pen list callback function // Return value : // zero if done or (-1) on data error // Parameters : // string dstr : String/Date data // int dint : Integer/Boolean data // double ddbl : Float data // int dval : Data valid flag // int dtype : Data type // string dtable : Data table name // string dfield : Data field name // int didx : Data output field index */ { switch (didx) { // Layer code case 1 : curlayer=dint; break; // Pen number case 2 : cam_setplotlaycode(curlayer,dint); // Set the layer usage flag if (curlayer>=0 && curlayer=POWLAYBASE && curlayer<(POWLAYBASE+POWLAYMAX)) playusel[curlayer-POWLAYBASE]=0; break; } // Return without errors return(0); } void readbatch(string batname,int runflag) /* // Read and sort batch steps // Parameter : // string batname : Batch name // int runflag : Batch run flag */ { int curname /* Current step file name */; int curtyp /* Current step type */; int curlay /* Current step layer */; int curidx /* Current step index */; int minname /* Min. step file name */; int mintyp /* Min. step type */; int minlay /* Min. step layer */; int minidx /* Min. step index */; int minsrc /* Min. step source index */; struct stepdes step /* Step buffer */; int i /* Loop control variable */; // Query the batch steps stepn=0; sprintf(sqlcommand,S_SELECT,sql_quotestr(batname)); curbatname=batname; if (sqlcmd(BAECAMBDAT,sqlcommand,stepfunc)!=0) // SQL/DB error sql_dberror(0); for (curstep=0;curstep1000) error(ERRSTEPCNT); } } // Sort the steps for (i=0;i=i;curstep--) { // Check batch type switch (curtyp=stepl[curstep].typ) { case STEP_GBR : curname=stepl[curstep].parl[PARGBRFILE].sval; curidx=stepl[curstep].parl[PARGBRIDX].ival; curlay=stepl[curstep].parl[PARGBRLAYER].ival; break; case STEP_HP : curname=stepl[curstep].parl[PARHPFILE].sval; curidx=stepl[curstep].parl[PARHPIDX].ival; curlay=stepl[curstep].parl[PARHPLAYER].ival; break; case STEP_EXC : curname=stepl[curstep].parl[PAREXCFILE].sval; curidx=stepl[curstep].parl[PAREXCIDX].ival; curlay=stepl[curstep].parl[PAREXCCLASS].ival; break; case STEP_SM : curname=stepl[curstep].parl[PARSMFILE].sval; curidx=stepl[curstep].parl[PARSMIDX].ival; curlay=stepl[curstep].parl[PARSMCLASS].ival; break; case STEP_EPS : curname=stepl[curstep].parl[PAREPSBAT].sval; curidx=stepl[curstep].parl[PAREPSIDX].ival; curlay=0; break; case STEP_SEPS : curname=stepl[curstep].parl[PARSEPSBAT].sval; curidx=stepl[curstep].parl[PARSEPSIDX].ival; curlay=0; break; case STEP_CAMV : curname=stepl[curstep].parl[PARCAMVBAT].sval; curidx=stepl[curstep].parl[PARCAMVIDX].ival; curlay=0; break; case STEP_BATCH : curname=stepl[curstep].parl[PARCAMBBAT].sval; curidx=stepl[curstep].parl[PARCAMBIDX].ival; curlay=0; break; case STEP_INS : curname=stepl[curstep].parl[PARINSFILE].sval; curidx=stepl[curstep].parl[PARINSIDX].ival; curlay=stepl[curstep].parl[PARINSLAYER].ival; break; case STEP_GIN : curname=stepl[curstep].parl[PARGINFRM].sval; curidx=stepl[curstep].parl[PARGINIDX].ival; curlay=0; break; case STEP_BMP : curname=stepl[curstep].parl[PARBMPFILE].sval; curidx=stepl[curstep].parl[PARBMPIDX].ival; curlay=stepl[curstep].parl[PARBMPLAYER].ival; break; case STEP_GP : curname=stepl[curstep].parl[PARGPPRINT].sval; curidx=stepl[curstep].parl[PARGPIDX].ival; curlay=stepl[curstep].parl[PARGPLAYER].ival; break; case STEP_DDB : curname=stepl[curstep].parl[PARDDBFILE].sval; curidx=stepl[curstep].parl[PARDDBIDX].ival; curlay=stepl[curstep].parl[PARDDBLAYER].ival; break; case STEP_WRN : curname=""; curidx=stepl[curstep].parl[PARWRNIDX].ival; curlay=0; break; case STEP_CMD : curname=stepl[curstep].parl[PARCMDPREF].sval; curidx=stepl[curstep].parl[PARCMDIDX].ival; curlay=0; break; case STEP_ULC : curname=stepl[curstep].parl[PARULCPSTR].sval; curidx=stepl[curstep].parl[PARULCIDX].ival; curlay=0; break; case STEP_LAYCV : curname=stepl[curstep].parl[PARLAYCVTEXT].sval; curidx=stepl[curstep].parl[PARLAYCVIDX].ival; curlay=stepl[curstep].parl[PARLAYCVLAYER].ival; break; case STEP_COMM : curname=stepl[curstep].parl[PARCOMMTEXT].sval; curidx=stepl[curstep].parl[PARCOMMIDX].ival; curlay=0; break; case STEP_REP : curname=stepl[curstep].parl[PARREPFILE].sval; curidx=stepl[curstep].parl[PARREPIDX].ival; curlay=0; break; case STEP_VAR : curname=stepl[curstep].parl[PARVARNAME].sval; curidx=stepl[curstep].parl[PARVARIDX].ival; curlay=0; break; case STEP_VL : curname=""; curidx=stepl[curstep].parl[PARVLIDX].ival; curlay=0; break; } if (curidx=0 && lay_rulequery(RS_OCFIG,fig,RS_PCBSUBJ, RS_LAYSCANIGN,"?d",layscanign)>0 && layscanign) continue; if (lay_scanfelem(fig,0.0,0.0,0.0,1,1,layumacro, layupoly,layupath,NULL,layudrill,layulchk,NULL)!=0) error_scan(); } } // Print the report header hl[0]=REPHEADER; hl[1]=""; hn=2; en=0; // List job file and layout name sprintf(el[en],REPJOB, SHORTFN ? convstring(bae_planfname(),1) : bae_planfname()); en++; sprintf(el[en],REPLAYOUT,bae_planename()); en++; // Perform all batch steps readbatch(batname,1); firstgerb=1; firsthpgl=1; sflash=srect=scirc=smulti=sline=sheat=serr=hpserr=0; // Check if variant loop for (i=0;i=POWLAYBASE && stepl[i].parl[PARGBRLAYER].ival<(POWLAYBASE+POWLAYMAX))) { phtdmd=stepl[i].parl[PARGBRPHTDMD].dval; pisdmd=stepl[i].parl[PARGBRPISDMD].dval; phttol=stepl[i].parl[PARGBRPHTTOL].dval; pistol=stepl[i].parl[PARGBRPISTOL].dval; powpar=1; break; } // Clear the extra diameter list cam_setdblpar(0,0.0); // Add all used gerber line parameter widthes for (i=0;i= (POWLAYBASE+POWLAYMAX))) { stepl[i].parl[PARGBRPHTDMD].dval=phtdmd; stepl[i].parl[PARGBRPISDMD].dval=pisdmd; stepl[i].parl[PARGBRPHTTOL].dval=phttol; stepl[i].parl[PARGBRPISTOL].dval=pistol; } } for (i=0;i=0 && layer=POWLAYBASE && layer=0 && layer=POWLAYBASE && layer=0 && layer=POWLAYBASE && layer=0 && layer=POWLAYBASE && layer=0 && layer=POWLAYBASE && layer=0 && layer=POWLAYBASE && layer0 ? 1 : 0, step.parl[PARBMPROTMODE].ival,step.parl[PARBMPMIRMODE].ival, step.parl[PARBMPMRKMODE].ival,symboltol,camorigx,camorigy)) error(ERRSETGENPAR); // Set the pen width cam_plothpgl(0,1,"",hpglscale,hpglspeed, step.parl[PARBMPSTDLINEW].dval,hpglfill,0,0); cam_setintpar(10,step.parl[PARBMPBRDMODE].ival==2 ? 1 : 0); // Write bitmap bae_clriactqueue(); layersel(layer); sprintf(msg,"%.8fmm", cvtlength(step.parl[PARBMPRES].dval,0,2)); bae_storetextiact(1,msg); bae_storetextiact(1,outfname); cam_setintpar(12,1); bae_callmenu(213); cam_setintpar(12,0); // Restore the general plot parameters cam_setintpar(10,0); cam_setgenpltparam(alllaymode,bordermode,rotmode, mirrmode,regmode,symboltol,camorigx,camorigy); cam_setpowpltparam(powplthtdmd,powpltisdmd, powplthttol,powpltistol,powpltbrdwd,powpltsppis); cam_plothpgl( 0,1,"",hpglscale,hpglspeed,hpglpwidth,hpglfill,0,0); cam_setintpar(1,powplthtang); // Check the output layer if (layer>=0 && layer=POWLAYBASE && layer=0 && layer=POWLAYBASE && layer=0 && layer=POWLAYBASE && layer=0 && layer=POWLAYBASE && layer=0 && layer=0 && layer=POWLAYBASE && layer=0 && i=batn) { sprintf(msg,ERRNOBATCH,ebatname); bae_msgbox(2,msg,""); return; } step.parl[PAREPSBAT].sval=ebatname; } newidx=step.parl[PAREPSIDX].ival; if (askint(newidx,UPRINDEX,10)) return; step.parl[PAREPSIDX].ival=newidx; break; // SCM EPS/PDF batch output case STEP_SEPS : if (step.id<0) { // Get batch entries batn=0; if (sqlcmd(BAEEPSBDAT,SE_SELECT,batnamefunc)!=0) // SQL/DB error sql_dberror(0); // Select batch name bae_setintpar(16,3013); if ((ebatname=popupmenu(1,UPRSEBATNAME,batl,0,batl,batn, UINPOPABORT,0,1,1,batn+2,0,0,""))=="" || ebatname==UINPOPABORT) return; // Search original batch name for (i=0;i=batn) { sprintf(msg,ERRNOBATCH,ebatname); bae_msgbox(2,msg,""); return; } step.parl[PARSEPSBAT].sval=ebatname; } step.parl[PARSEPSIDX].ival=0x7FFFFFFE; break; // CAM View batch output case STEP_CAMV : step.parl[PARCAMVBAT].sval=""; step.parl[PARCAMVIDX].ival=0x7FFFFFFF; break; // CAM batch output case STEP_BATCH : if (step.id<0) { // Get batch entries batn=0; if (sqlcmd(BAECAMBDAT,B_SELECT,batnamefunc)!=0) // SQL/DB error sql_dberror(0); bae_setintpar(16,3013); if ((ebatname=popupmenu(1,UPRBATNAME,batl,0,batl,batn, UINPOPABORT,0,1,1,batn+2,0,0,""))=="" || ebatname==UINPOPABORT) error_abort(); step.parl[PARCAMBBAT].sval=ebatname; } step.parl[PARCAMBIDX].ival=0; break; // Insertion data output case STEP_INS : if (step.id<0) { step.parl[PARINSLAYER].ival=LAYERINV; if (cam_askplotlayer(step.parl[PARINSLAYER].ival)!=0) return; } else if (step.parl[PARINSLAYER].ival==LAYERCOMB) { readpens(BAECAMBDAT,batname,step.id); step.parl[PARINSLAYER].ival=LAYERINV; bae_clriactqueue(); bae_storemenuiact(1,8+menuoff,LMB); if (cam_askplotlayer(step.parl[PARINSLAYER].ival)!=0) return; } if (editinsstep(step)) return; penflag= step.parl[PARINSLAYER].ival==LAYERCOMB ? 1 : 0; break; // Generic insertion data output case STEP_GIN : if (step.id<0) { // Check if special format description directory defined if (IFSDIR!="") { // Init the header list hl[hn-1]=""; // Report the directory list header sprintf(hl[0],REPDIREXT,IFSDIR,IFSEXT); // Clear the file name entry list en=0; // Build the file name list (with abort enabled) switch (filelist( el,en,IFSDIR,IFSEXT,"",0,0,0,0,1,1)) { // Invalid directory path name case (-1) : el[en++]=REPDIRINV; break; // Directory listing aborted case 1 : el[en++]=REPDIRINC; break; } // Show the file menu with select disabled bae_setintpar(16,3014); if ((frmname=popupmenu(4,"",hl,hn,el,en, UINPOPABORT,0,0,-1,hn+en+2,100,0, UINPOPABORT))=="" || frmname==UINPOPABORT) error_abort(); } else { // Select the insertion format spec. input file if ((frmname=askfile(UPRISFFILE,extlist,0))=="") error_abort(); } step.parl[PARGINFRM].sval=frmname; } if (editginstep(step)) return; break; // BMP output case STEP_BMP : if (step.id<0) { step.parl[PARBMPLAYER].ival=LAYERINV+1; if (cam_askplotlayer(step.parl[PARBMPLAYER].ival)!=0) return; } else if (step.parl[PARBMPLAYER].ival==LAYERCOMB) { readpens(BAECAMBDAT,batname,step.id); step.parl[PARBMPLAYER].ival=LAYERINV+1; bae_clriactqueue(); bae_storemenuiact(1,8+menuoff,LMB); if (cam_askplotlayer(step.parl[PARBMPLAYER].ival)!=0) return; } if (editbmpstep(step)) return; penflag= step.parl[PARBMPLAYER].ival==LAYERCOMB ? 1 : 0; break; // Generic output case STEP_GP : if (step.id<0) { step.parl[PARGPLAYER].ival=LAYERINV+1; if (cam_askplotlayer(step.parl[PARGPLAYER].ival)!=0) return; } else if (step.parl[PARGPLAYER].ival==LAYERCOMB) { readpens(BAECAMBDAT,batname,step.id); step.parl[PARGPLAYER].ival=LAYERINV+1; bae_clriactqueue(); bae_storemenuiact(1,8+menuoff,LMB); if (cam_askplotlayer(step.parl[PARGPLAYER].ival)!=0) return; } if (editgpstep(step)) return; penflag= step.parl[PARGPLAYER].ival==LAYERCOMB ? 1 : 0; break; // DDB element output case STEP_DDB : if (step.id<0) { step.parl[PARDDBLAYER].ival=LAYERINV; if (cam_askplotlayer(step.parl[PARDDBLAYER].ival)!=0) return; } else if (step.parl[PARDDBLAYER].ival==LAYERCOMB) { readpens(BAECAMBDAT,batname,step.id); step.parl[PARDDBLAYER].ival=LAYERINV; bae_clriactqueue(); bae_storemenuiact(1,8+menuoff,LMB); if (cam_askplotlayer(step.parl[PARDDBLAYER].ival)!=0) return; } if (editddbstep(step)) return; penflag= step.parl[PARDDBLAYER].ival==LAYERCOMB ? 1 : 0; break; // Warning control case STEP_WRN : if (editwarncontrol(step)) return; break; // Command call case STEP_CMD : if (step.id<0) // Query command name if (bae_askfilename(step.parl[PARCMDPREF].sval, (bae_swconfig(3)==BAE_MotifStd || bae_swconfig(3)==BAE_MotifPdwn) ? bae_swversion(3) : ".exe",UPRCMDFILE)) return; if (editcmdstep(step)) return; break; // ULC program call case STEP_ULC: if (step.id<0) // Query ULC program name if (bae_askddbename(step.parl[PARULCPSTR].sval, strgetconffilename(ULDEFPRGVNAME,ULDEFPRGFNAME,1), DDBCLUL,UPRULCPROG)) return; // Get the ULC programm call sequence if ((step.parl[PARULCPSTR].sval=bae_readedittext( UPRULCPROGS,step.parl[PARULCPSTR].sval,MAXPATHLEN))=="" || step.parl[PARULCPSTR].sval==UINPOPABORT) return; newidx=step.parl[PARULCIDX].ival; if (askint(newidx,UPRINDEX,10)) return; step.parl[PARULCIDX].ival=newidx; break; // Layer coverage report case STEP_LAYCV : if (step.id<0) { step.parl[PARLAYCVLAYER].ival=LAYERINV+1; if (cam_askplotlayer(step.parl[PARLAYCVLAYER].ival)!=0) return; } else if (step.parl[PARLAYCVLAYER].ival==LAYERCOMB) { readpens(BAECAMBDAT,batname,step.id); step.parl[PARLAYCVLAYER].ival=LAYERINV+1; bae_clriactqueue(); bae_storemenuiact(1,8+menuoff,LMB); if (cam_askplotlayer(step.parl[PARLAYCVLAYER].ival)!=0) return; } if (editlaycvstep(step)) return; penflag= step.parl[PARLAYCVLAYER].ival==LAYERCOMB ? 1 : 0; break; // Comment output case STEP_COMM : if (step.id<0) step.parl[PARCOMMTEXT].sval=""; // Get the comment text if ((step.parl[PARCOMMTEXT].sval=bae_readedittext( UPRCOMMENT,step.parl[PARCOMMTEXT].sval,MAXPATHLEN))=="" || step.parl[PARCOMMTEXT].sval==UINPOPABORT) return; newidx=step.parl[PARCOMMIDX].ival; if (askint(newidx,UPRINDEX,10)) return; step.parl[PARCOMMIDX].ival=newidx; break; // Report data output case STEP_REP : if (editrepstep(step)) return; break; // Variable set case STEP_VAR : if (editvarstep(step)) return; break; // Variant loop case STEP_VL : break; } // Check if new step if (step.id<0) { // Query last ID if (sqlcmd(BAECAMBDAT,SI_SELECT,idfunc)!=0) // SQL/DB error sql_dberror(0); // Delete last ID if (sqlcmd(BAECAMBDAT,SI_DELETE,NULL)!=0) // SQL/DB error sql_dberror(29); // Allocate next ID queryid++; // Store new ID sprintf(sqlcommand,SI_INSERT,queryid); if (sqlcmd(BAECAMBDAT,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(0); // Use new ID step.id=queryid; } // Delete any old step data sprintf(sqlcommand,S_DELETES,sql_quotestr(batname),step.id); if (sqlcmd(BAECAMBDAT,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(29); sprintf(sqlcommand,P_DELETES,sql_quotestr(batname),step.id); if (sqlcmd(BAECAMBDAT,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(29); sprintf(sqlcommand,C_DELETES,sql_quotestr(batname),step.id); if (sqlcmd(BAECAMBDAT,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(29); // Store step data sprintf(sqlcommand,S_INSERT,sql_quotestr(batname),step.id,step.typ); if (sqlcmd(BAECAMBDAT,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(0); // Store step parameter data for (i=0;i1 && (step.parl[PARGBRDIR].sval[len-1]=='\\' || step.parl[PARGBRDIR].sval[len-1]=='/')) step.parl[PARGBRDIR].sval[len-1]='\0'; bae_dialsetdata(fdidx,PA_STR,0,0.0, step.parl[PARGBRDIR].sval); } break; // Fail/abort case (-1) : default : return(1); } // Stop if no further repeat requests } while (repflag); return(0); } int edithpglstep(struct stepdes step) /* // Edit HPGL step parameters // Return value : // zero if done or 1 on abort // Parameters : // struct stepdes step : Step data */ { string msg /* Message string */; double sy /* Dialog box sep. y coordinate */; double cy /* Dialog box current y coordinate */; int repflag /* Dialog box repeat flag */; int fnlidx /* File name label parameter index */; int fnidx /* File name parameter index */; int fmidx /* File name mode parameter index */; int fdidx /* Folder name parameter index */; int lcidx /* Layer comment parameter index */; int pnidx /* Pen number index */; int pwidx /* Pen width index */; int scidx /* Output scale index */; int hpfmidx /* HPGL fill mode parameter index */; int hpsidx /* HPGL pen speed parameter index */; int alidx /* All layer mode index */; int boidx /* Board outline mode index */; int stidx /* Symbol tolerance index */; int fididx /* Fiducial marks mode index */; int rotidx /* Rotation mode index */; int miridx /* Mirror mode index */; int osidx /* Origin symbol index */; int htmidx /* Heat trap min. dist. index */; int htaidx /* Heat trap angle index */; int ismidx /* Isolation min. dist. index */; int brwidx /* Border width index */; int spiidx /* Split power plan isol. index */; int outidx /* Output index index */; int cunits /* Coordinate display units */; int len /* Name length */; bae_dialclr(); // Init. the y coordinate cy=DIAL_TOPMARG; // Store output index controls dial_label(SCOLOFF2,cy,UPRDINDEX); outidx=bae_dialaddcontrol(PA_INT|PA_CHKLL|PA_HBRDREL,0, 0,step.parl[PARHPIDX].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,DIAL_RIGHTEMARG,""); // Store the OK and abort button dial_okabort(cy); cy-=DIAL_SEPVSTEP; dial_hsep(cy); // Store file name controls fnlidx=dial_label(0.0,cy,UPRDOUTEXT); fnidx=dial_string(step.parl[PARHPFILE].sval,MAXPATHLEN,CCOLOFF2,cy); // Store file name mode controls dial_label(0.0,cy,UPRDFMODE); fmidx=dial_selbox(step.parl[PARHPFMODE].ival,CCOLOFF2,cy); dial_sbentry(1,0,UPRFMODE0); dial_sbentry(1,1,UPRFMODE1); // Store folder name controls dial_label(0.0,cy,UPRDOUTDIR); fdidx=bae_dialaddcontrol(PA_STR,0,0,0,0.0,0.0,0.0, step.parl[PARHPDIR].sval,MAXPATHLEN,DIAL_LEFTMARG+CCOLOFF2,cy, SCOLOFF2+32.0-CCOLOFF2,""); bae_dialaddcontrol(PA_ACT,0,6,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+33.0,cy,0.0,UPRBRWFILENAME); cy+=DIAL_CTRVSTEP; // Store layer comment controls dial_label(0.0,cy,UPRDLAYCOMM); lcidx=dial_string(step.parl[PARHPCOMMENT].sval,MAXPATHLEN,CCOLOFF2,cy); sy=cy; dial_hsep(cy); // Store HPGL pen number controls dial_label(0.0,cy,UPRDHPPENN); pnidx=bae_dialaddcontrol(PA_INT|PA_CHKLL|PA_CHKUL,1, 99,step.parl[PARHPPENNUM].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store all layer mode controls dial_label(SCOLOFF2,cy,UPRALLLAY); alidx=dial_selbox(step.parl[PARHPALLMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRALLM1); dial_sbentry(0,1,UPRALLM2); dial_sbentry(0,2,UPRALLM3); dial_sbentry(0,3,UPRALLM4); dial_sbentry(0,4,UPRALLM5); // Store HPGL pen width controls dial_label(0.0,cy,UPRDHPPENW); pwidx=bae_dialaddcontrol(PA_DBL|PA_DIST|PA_CHKLL|PA_CHKUL,0, 5,0,0.00001,0.01,step.parl[PARHPPENWIDTH].dval,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store border output mode controls dial_label(SCOLOFF2,cy,UPRBORDM); boidx=dial_selbox(step.parl[PARHPBRDMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRBORD1); dial_sbentry(0,1,UPRBORD2); // Store pen speed controls dial_label(0.0,cy,UPRDHPSPEED); bae_dialaddcontrol(PA_RBF,0,4,step.parl[PARHPSPEED].dval<0.0 ? 0 : 1, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG+CCOLOFF2,cy,0.0,UPRDHPMSPEED); bae_dialaddcontrol(PA_RBN,1,5,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+CCOLOFF2+7.0,cy,0.0,UPRDHPCMSPEED); // Store HPGL symbol tolerance controls dial_label(SCOLOFF2,cy,UPRSYMTOL); stidx=dial_dist(5,step.parl[PARHPSYMTOL].dval,SCOLOFF2+CCOLOFF2,cy); hpsidx=bae_dialaddcontrol(PA_DBL|PA_CHKLL|PA_CHKUL,0, 5,0,0.0,99.0,step.parl[PARHPSPEED].dval,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store fiducial markers output mode controls dial_label(SCOLOFF2,cy,UPRFIDM); fididx=bae_dialaddcontrol(PA_RBF,0,0,step.parl[PARHPMRKMODE].ival, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,0.0,UPRRBOFF); bae_dialaddcontrol(PA_RBN,1,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2+7.0,cy,0.0,UPRRBON); cy+=DIAL_CTRVSTEP; // Store HPGL scale factor controls dial_label(0.0,cy,UPRDHPSCAL); scidx=bae_dialaddcontrol(PA_DBL|PA_CHKLL|PA_CHKUL,0, 5,0,0.1,100.0,step.parl[PARHPSCALE].dval,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store rotation mode controls dial_label(SCOLOFF2,cy,UPRROTM); rotidx=dial_selbox(step.parl[PARHPROTMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRROT1); dial_sbentry(0,1,UPRROT2); // Store fill mode controls dial_label(0.0,cy,UPRDHPFILLM); hpfmidx=bae_dialaddcontrol(PA_SB,0,0,step.parl[PARHPFILLMODE].ival, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); dial_sbentry(0,0,UPRDHPFILLM1); dial_sbentry(0,1,UPRDHPFILLM2); // Store mirror mode controls dial_label(SCOLOFF2,cy,UPRMIRRM); miridx=dial_selbox(step.parl[PARHPMIRMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRMIRR1); dial_sbentry(0,1,UPRMIRR2); dial_sbentry(0,2,UPRMIRR3); dial_sbentry(0,3,UPRMIRR4); dial_sbentry(0,4,UPRMIRR5); dial_sbentry(0,5,UPRMIRR6); // Store origin symbol name controls dial_label(SCOLOFF2,cy,UPRDORGSYM); osidx=dial_namestring( step.parl[PARHPORGSYM].sval,MAXKEYLEN,SCOLOFF2+CCOLOFF2,cy); bae_dialaddcontrol(PA_VSEP,0,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+SCOLOFF2-0.8,sy,cy-sy,""); if (step.parl[PARHPLAYER].ival>=POWLAYBASE && step.parl[PARHPLAYER].ival<(POWLAYBASE+POWLAYMAX)) { dial_hsep(cy); // Store heat trap angle controls dial_label(0.0,cy,UPRHTANG); htaidx=bae_dialaddcontrol(PA_RBF,0,0, step.parl[PARHPPHTANG].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,0.0,UPRHTANG1); bae_dialaddcontrol(PA_RBN,1,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+CCOLOFF2+7.0,cy,0.0,UPRHTANG2); cy+=DIAL_CTRVSTEP; // Store heat trap min. distance controls dial_label(0.0,cy,UPRHTDMD); htmidx=bae_dialaddcontrol(PA_DBL|PA_DIST|PA_CHKLL,0, 5,0,0.0,0.0,step.parl[PARHPPHTDMD].dval,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store isolation min. distance controls dial_label(SCOLOFF2,cy,UPRISDMD); ismidx= dial_dist(5,step.parl[PARHPPISDMD].dval,CCOLOFF2+SCOLOFF2,cy); // Store border width controls dial_label(0.0,cy,UPRBRDWD); brwidx=bae_dialaddcontrol(PA_DBL|PA_DIST|PA_CHKLL,0, 5,0,0.0,0.0,step.parl[PARHPPBRDWD].dval,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store power plane isolation width controls dial_label(SCOLOFF2,cy,UPRSPPIS); spiidx= dial_dist(5,step.parl[PARHPPSPPIS].dval,CCOLOFF2+SCOLOFF2,cy); } dial_hsep(cy); // Store coordinate unit controls cunits= bae_getcoorddisp() ? 2 : 0; dial_label(0.0,cy,UPRDUNIT); bae_dialaddcontrol(PA_RBF,0,2,cunits,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+CCOLOFF2,cy,0.0,UPRDUNITMM); bae_dialaddcontrol(PA_RBN,2,3,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+CCOLOFF2+7.0,cy,0.0,UPRDUNITMIL); cy+=DIAL_CTRVSTEP+DIAL_SEPVSTEP; // Perform the dialog input loop repflag=1; do { bae_dialsetdata(fnlidx,PA_LAB,0,0.0, step.parl[PARHPFMODE].ival ? UPRDOUTFILE : UPRDOUTEXT); bae_dialgetdata(hpsidx,0,step.parl[PARHPSPEED].dval,""); bae_dialsetdata(hpsidx,step.parl[PARHPSPEED].dval<0.0 ? PA_LAB : PA_DBL|PA_CHKLL|PA_CHKUL,0, step.parl[PARHPSPEED].dval,UPRDNOINP); // Call the dialog function sprintf(msg, UPRDIALHPPAR,layername(step.parl[PARHPLAYER].ival)); bae_setintpar(16,3004); switch (bae_dialaskparams(msg,cunits,DIAL_LEFTMARG+81.7,cy)) { case 0 : // Get data from dialog box entries bae_dialgetdata( fnidx,0,0.0,step.parl[PARHPFILE].sval); if (step.parl[PARHPFILE].sval=="") { bae_msgbox(2,ERRNOFILEN,""); break; } bae_dialgetdata( fdidx,0,0.0,step.parl[PARHPDIR].sval); bae_dialgetdata( fmidx,step.parl[PARHPFMODE].ival,0.0,""); bae_dialgetdata( lcidx,0,0.0,step.parl[PARHPCOMMENT].sval); bae_dialgetdata( pnidx,step.parl[PARHPPENNUM].ival,0.0,""); bae_dialgetdata( pwidx,0,step.parl[PARHPPENWIDTH].dval,""); bae_dialgetdata( scidx,0,step.parl[PARHPSCALE].dval,""); bae_dialgetdata( hpsidx,0,step.parl[PARHPSPEED].dval,""); bae_dialgetdata( hpfmidx,step.parl[PARHPFILLMODE].ival,0.0,""); bae_dialgetdata( stidx,0,step.parl[PARHPSYMTOL].dval,""); bae_dialgetdata( alidx,step.parl[PARHPALLMODE].ival,0.0,""); bae_dialgetdata( boidx,step.parl[PARHPBRDMODE].ival,0.0,""); bae_dialgetdata( fididx,step.parl[PARHPMRKMODE].ival,0.0,""); bae_dialgetdata( miridx,step.parl[PARHPMIRMODE].ival,0.0,""); bae_dialgetdata( rotidx,step.parl[PARHPROTMODE].ival,0.0,""); bae_dialgetdata( osidx,0,0.0,step.parl[PARHPORGSYM].sval); if (step.parl[PARHPLAYER].ival>=POWLAYBASE && step.parl[PARHPLAYER].ival<(POWLAYBASE+POWLAYMAX)) { bae_dialgetdata( htmidx,0,step.parl[PARHPPHTDMD].dval,""); bae_dialgetdata( htaidx,step.parl[PARHPPHTANG].ival,0.0,""); bae_dialgetdata( ismidx,0,step.parl[PARHPPISDMD].dval,""); bae_dialgetdata( brwidx,0,step.parl[PARHPPBRDWD].dval,""); bae_dialgetdata( spiidx,0,step.parl[PARHPPSPPIS].dval,""); } bae_dialgetdata( outidx,step.parl[PARHPIDX].ival,0.0,""); repflag=0; break; // File mode change case 1 : bae_dialgetdata( fmidx,step.parl[PARHPFMODE].ival,0.0,""); break; // Switch to mm units case 2 : cunits=0; break; // Switch to mil units case 3 : cunits=2; break; // Set max. speed case 4 : bae_dialsetdata(hpsidx,PA_LAB,0,-1.0,""); break; // Set user defined speed case 5 : bae_dialgetdata( hpsidx,0,step.parl[PARHPSPEED].dval,""); bae_dialsetdata(hpsidx,PA_DBL|PA_CHKLL|PA_CHKUL,0, step.parl[PARHPSPEED].dval<0.0 ? 0.0 : step.parl[PARHPSPEED].dval,""); break; // Browse output folder case 6 : bae_dialgetdata( fdidx,0,0.0,step.parl[PARHPDIR].sval); if (bae_askdirname(step.parl[PARHPDIR].sval, step.parl[PARHPDIR].sval,UPRDOUTDIR)==0) { if ((len=strlen(step.parl[PARHPDIR].sval))>1 && (step.parl[PARHPDIR].sval[len-1]=='\\' || step.parl[PARHPDIR].sval[len-1]=='/')) step.parl[PARHPDIR].sval[len-1]='\0'; bae_dialsetdata(fdidx,PA_STR,0,0.0, step.parl[PARHPDIR].sval); } break; // Fail/abort case (-1) : default : return(1); } // Stop if no further repeat requests } while (repflag); return(0); } int editexcstep(struct stepdes step) /* // Edit excellon drill step parameters // Return value : // zero if done or 1 on abort // Parameters : // struct stepdes step : Step data */ { string msg /* Message string */; double cy /* Dialog box current y coordinate */; int repflag /* Dialog box repeat flag */; int dfnlidx /* Drill file name label index */; int dfnidx /* Drill file name index */; int dfdidx /* Drill folder name index */; int dfmidx /* Drill file name mode index */; int rotidx /* Rotation mode index */; int miridx /* Mirror mode index */; int osidx /* Origin symbol index */; int dclidx /* Drill class index */; int ccidx /* Class comment parameter index */; int dtidx /* Drill tool tolerance index */; int outidx /* Output index index */; int len /* Name length */; bae_dialclr(); // Init. the y coordinate cy=DIAL_TOPMARG; // Store output index controls dial_label(SCOLOFF2,cy,UPRDINDEX); outidx=bae_dialaddcontrol(PA_INT|PA_CHKLL|PA_HBRDREL,0, 0,step.parl[PAREXCIDX].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,DIAL_RIGHTEMARG,""); // Store the OK and abort button dial_okabort(cy); cy-=DIAL_SEPVSTEP; dial_hsep(cy); // Store drill file name controls dfnlidx=dial_label(0.0,cy,UPRDDRLEXT); dfnidx=dial_string(step.parl[PAREXCFILE].sval,MAXPATHLEN,CCOLOFF2,cy); // Store drill file name mode controls dial_label(0.0,cy,UPRDFMODE); dfmidx=dial_selbox(step.parl[PAREXCFMODE].ival,CCOLOFF2,cy); dial_sbentry(1,0,UPRFMODE0); dial_sbentry(1,1,UPRFMODE1); // Store folder name controls dial_label(0.0,cy,UPRDOUTDIR); dfdidx=bae_dialaddcontrol(PA_STR,0,0,0,0.0,0.0,0.0, step.parl[PAREXCDIR].sval,MAXPATHLEN,DIAL_LEFTMARG+CCOLOFF2,cy, SCOLOFF2+32.0-CCOLOFF2,""); bae_dialaddcontrol(PA_ACT,0,2,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+33.0,cy,0.0,UPRBRWFILENAME); cy+=DIAL_CTRVSTEP; dial_hsep(cy); // Store drill class name controls dial_label(0.0,cy,UPRDDRLCLASS); sprintf(msg,"%c",step.parl[PAREXCCLASS].ival ? 'A'-1+ step.parl[PAREXCCLASS].ival : '-'); dclidx=dial_string(msg,1,CCOLOFF2,cy); // Store class comment controls dial_label(0.0,cy,UPRDCLCOMM); ccidx=dial_string(step.parl[PAREXCCOMMENT].sval,MAXPATHLEN,CCOLOFF2,cy); // Store tool tolerance name controls dial_label(0.0,cy,UPRDTOOLTOL); dtidx=dial_string(step.parl[PAREXCDRLTOL].sval,MAXKEYLEN,CCOLOFF2,cy); // Store rotation mode controls dial_label(0.0,cy,UPRROTM); rotidx=dial_selbox(step.parl[PAREXCROTMODE].ival,CCOLOFF2,cy); dial_sbentry(0,0,UPRROT1); dial_sbentry(0,1,UPRROT2); // Store mirror mode controls dial_label(0.0,cy,UPRMIRRM); miridx=dial_selbox(step.parl[PAREXCMIRMODE].ival,CCOLOFF2,cy); dial_sbentry(0,0,UPRMIRR1); dial_sbentry(0,1,UPRMIRR2); dial_sbentry(0,2,UPRMIRR3); dial_sbentry(0,3,UPRMIRR4); dial_sbentry(0,4,UPRMIRR5); dial_sbentry(0,5,UPRMIRR6); // Store origin symbol name controls dial_label(0.0,cy,UPRDORGSYM); osidx= dial_namestring(step.parl[PAREXCORGSYM].sval,MAXKEYLEN,CCOLOFF2,cy); cy+=DIAL_SEPVSTEP; // Perform the dialog input loop repflag=1; do { bae_dialsetdata(dfnlidx,PA_LAB,0,0.0, step.parl[PAREXCFMODE].ival ? UPRDDRLFILE : UPRDDRLEXT); // Call the dialog function bae_setintpar(16,3005); switch (bae_dialaskparams(UPRDIALEXC,0,DIAL_LEFTMARG+81.7,cy)) { case 0 : // Get data from dialog box entries bae_dialgetdata( dfnidx,0,0.0,step.parl[PAREXCFILE].sval); if (step.parl[PAREXCFILE].sval=="") { bae_msgbox(2,ERRNOFILEN,""); break; } bae_dialgetdata( dfdidx,0,0.0,step.parl[PAREXCDIR].sval); bae_dialgetdata( dfmidx,step.parl[PAREXCFMODE].ival,0.0,""); bae_dialgetdata(dclidx,0,0.0,msg); strupper(msg); if (msg!="" && msg[0]<'A' && msg[0]>'Z') { sprintf(msg,ERRILLCLASS,msg); bae_msgbox(2,msg,""); break; } step.parl[PAREXCCLASS].ival= msg=="-" ? 0 : msg[0]-'A'+1; bae_dialgetdata( ccidx,0,0.0,step.parl[PAREXCCOMMENT].sval); bae_dialgetdata( dtidx,0,0.0,step.parl[PAREXCDRLTOL].sval); bae_dialgetdata( miridx,step.parl[PAREXCMIRMODE].ival,0.0,""); bae_dialgetdata( rotidx,step.parl[PAREXCROTMODE].ival,0.0,""); bae_dialgetdata( osidx,0,0.0,step.parl[PAREXCORGSYM].sval); bae_dialgetdata( outidx,step.parl[PAREXCIDX].ival,0.0,""); repflag=0; break; // File mode change case 1 : bae_dialgetdata( dfmidx,step.parl[PAREXCFMODE].ival,0.0,""); break; // Browse output folder case 2 : bae_dialgetdata( dfdidx,0,0.0,step.parl[PAREXCDIR].sval); if (bae_askdirname(step.parl[PAREXCDIR].sval, step.parl[PAREXCDIR].sval,UPRDOUTDIR)==0) { if ((len=strlen(step.parl[PAREXCDIR].sval))>1 && (step.parl[PAREXCDIR].sval[len-1]=='\\' || step.parl[PAREXCDIR].sval[len-1]=='/')) step.parl[PAREXCDIR].sval[len-1]='\0'; bae_dialsetdata(dfdidx,PA_STR,0,0.0, step.parl[PAREXCDIR].sval); } break; // Fail/abort case (-1) : default : return(1); } // Stop if no further repeat requests } while (repflag); return(0); } int editsmstep(struct stepdes step) /* // Edit Sieb & Meyer drill step parameters // Return value : // zero if done or 1 on abort // Parameters : // struct stepdes step : Step data */ { string msg /* Message string */; double cy /* Dialog box current y coordinate */; int repflag /* Dialog box repeat flag */; int dfnlidx /* Drill file name label index */; int dfnidx /* Drill file name index */; int dfdidx /* Drill folder name index */; int dfmidx /* Drill file name mode index */; int tfnlidx /* Tool file name label index */; int tfnidx /* Tool file name index */; int tfdidx /* Tool folder name index */; int tfmidx /* Tool file name mode index */; int rotidx /* Rotation mode index */; int miridx /* Mirror mode index */; int osidx /* Origin symbol index */; int dclidx /* Drill class index */; int ccidx /* Class comment parameter index */; int dtidx /* Drill tool tolerance index */; int outidx /* Output index index */; int len /* Name length */; bae_dialclr(); // Init. the y coordinate cy=DIAL_TOPMARG; // Store output index controls dial_label(SCOLOFF2,cy,UPRDINDEX); outidx=bae_dialaddcontrol(PA_INT|PA_CHKLL|PA_HBRDREL,0, 0,step.parl[PARSMIDX].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,DIAL_RIGHTEMARG,""); // Store the OK and abort button dial_okabort(cy); cy-=DIAL_SEPVSTEP; dial_hsep(cy); // Store drill file name controls dfnlidx=dial_label(0.0,cy,UPRDDRLEXT); dfnidx=dial_string(step.parl[PARSMFILE].sval,MAXPATHLEN,CCOLOFF2,cy); // Store drill file name mode controls dial_label(0.0,cy,UPRDFMODE); dfmidx=dial_selbox(step.parl[PARSMFMODE].ival,CCOLOFF2,cy); dial_sbentry(1,0,UPRFMODE0); dial_sbentry(1,1,UPRFMODE1); // Store folder name controls dial_label(0.0,cy,UPRDOUTDIR); dfdidx=bae_dialaddcontrol(PA_STR,0,0,0,0.0,0.0,0.0, step.parl[PARSMDIR].sval,MAXPATHLEN,DIAL_LEFTMARG+CCOLOFF2,cy, SCOLOFF2+32.0-CCOLOFF2,""); bae_dialaddcontrol(PA_ACT,0,2,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+33.0,cy,0.0,UPRBRWFILENAME); cy+=DIAL_CTRVSTEP; dial_hsep(cy); // Store tool file name controls tfnlidx=dial_label(0.0,cy,UPRDTOLEXT); tfnidx=dial_string(step.parl[PARSMTFILE].sval,MAXPATHLEN,CCOLOFF2,cy); // Store tool file name mode controls dial_label(0.0,cy,UPRDFMODE); tfmidx=dial_selbox(step.parl[PARSMTFMODE].ival,CCOLOFF2,cy); dial_sbentry(1,0,UPRFMODE0); dial_sbentry(1,1,UPRFMODE1); // Store folder name controls dial_label(0.0,cy,UPRDOUTDIR); tfdidx=bae_dialaddcontrol(PA_STR,0,0,0,0.0,0.0,0.0, step.parl[PARSMTDIR].sval,MAXPATHLEN,DIAL_LEFTMARG+CCOLOFF2,cy, SCOLOFF2+32.0-CCOLOFF2,""); bae_dialaddcontrol(PA_ACT,0,3,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+33.0,cy,0.0,UPRBRWFILENAME); cy+=DIAL_CTRVSTEP; dial_hsep(cy); // Store drill class name controls dial_label(0.0,cy,UPRDDRLCLASS); sprintf(msg,"%c",step.parl[PARSMCLASS].ival ? 'A'-1+ step.parl[PARSMCLASS].ival : '-'); dclidx=dial_string(msg,1,CCOLOFF2,cy); // Store class comment controls dial_label(0.0,cy,UPRDCLCOMM); ccidx=dial_string(step.parl[PARSMCOMMENT].sval,MAXPATHLEN,CCOLOFF2,cy); // Store tool tolerance name controls dial_label(0.0,cy,UPRDTOOLTOL); dtidx=dial_string(step.parl[PARSMDRLTOL].sval,MAXKEYLEN,CCOLOFF2,cy); // Store rotation mode controls dial_label(0.0,cy,UPRROTM); rotidx=dial_selbox(step.parl[PARSMROTMODE].ival,CCOLOFF2,cy); dial_sbentry(0,0,UPRROT1); dial_sbentry(0,1,UPRROT2); // Store mirror mode controls dial_label(0.0,cy,UPRMIRRM); miridx=dial_selbox(step.parl[PARSMMIRMODE].ival,CCOLOFF2,cy); dial_sbentry(0,0,UPRMIRR1); dial_sbentry(0,1,UPRMIRR2); dial_sbentry(0,2,UPRMIRR3); dial_sbentry(0,3,UPRMIRR4); dial_sbentry(0,4,UPRMIRR5); dial_sbentry(0,5,UPRMIRR6); // Store origin symbol name controls dial_label(0.0,cy,UPRDORGSYM); osidx= dial_namestring(step.parl[PARSMORGSYM].sval,MAXKEYLEN,CCOLOFF2,cy); cy+=DIAL_SEPVSTEP; // Perform the dialog input loop repflag=1; do { bae_dialsetdata(dfnlidx,PA_LAB,0,0.0, step.parl[PARSMFMODE].ival ? UPRDDRLFILE : UPRDDRLEXT); bae_dialsetdata(tfnlidx,PA_LAB,0,0.0, step.parl[PARSMTFMODE].ival ? UPRDTOLFILE : UPRDTOLEXT); // Call the dialog function bae_setintpar(16,3006); switch (bae_dialaskparams(UPRDIALSM,0,DIAL_LEFTMARG+81.7,cy)) { case 0 : // Get data from dialog box entries bae_dialgetdata( dfnidx,0,0.0,step.parl[PARSMFILE].sval); bae_dialgetdata( tfnidx,0,0.0,step.parl[PARSMTFILE].sval); if (step.parl[PARSMFILE].sval=="") { bae_msgbox(2,ERRNOFILEN,""); break; } bae_dialgetdata( dfdidx,0,0.0,step.parl[PARSMDIR].sval); bae_dialgetdata( tfdidx,0,0.0,step.parl[PARSMTDIR].sval); bae_dialgetdata( dfmidx,step.parl[PARSMFMODE].ival,0.0,""); bae_dialgetdata( tfmidx,step.parl[PARSMTFMODE].ival,0.0,""); bae_dialgetdata(dclidx,0,0.0,msg); strupper(msg); if (msg!="" && msg[0]<'A' && msg[0]>'Z') { sprintf(msg,ERRILLCLASS,msg); bae_msgbox(2,msg,""); break; } step.parl[PARSMCLASS].ival= msg=="-" ? 0 : msg[0]-'A'+1; bae_dialgetdata( ccidx,0,0.0,step.parl[PARSMCOMMENT].sval); bae_dialgetdata( dtidx,0,0.0,step.parl[PARSMDRLTOL].sval); bae_dialgetdata( osidx,0,0.0,step.parl[PARSMORGSYM].sval); bae_dialgetdata( miridx,step.parl[PARSMMIRMODE].ival,0.0,""); bae_dialgetdata( rotidx,step.parl[PARSMROTMODE].ival,0.0,""); bae_dialgetdata( outidx,step.parl[PARSMIDX].ival,0.0,""); repflag=0; break; // File mode change case 1 : bae_dialgetdata( dfmidx,step.parl[PARSMFMODE].ival,0.0,""); bae_dialgetdata( tfmidx,step.parl[PARSMTFMODE].ival,0.0,""); break; // Browse drill output folder case 2 : bae_dialgetdata( dfdidx,0,0.0,step.parl[PARSMDIR].sval); if (bae_askdirname(step.parl[PARSMDIR].sval, step.parl[PARSMDIR].sval,UPRDOUTDIR)==0) { if ((len=strlen(step.parl[PARSMDIR].sval))>1 && (step.parl[PARSMDIR].sval[len-1]=='\\' || step.parl[PARSMDIR].sval[len-1]=='/')) step.parl[PARSMDIR].sval[len-1]='\0'; bae_dialsetdata(dfdidx,PA_STR,0,0.0, step.parl[PARSMDIR].sval); } break; // Browse tool output folder case 3 : bae_dialgetdata( tfdidx,0,0.0,step.parl[PARSMTDIR].sval); if (bae_askdirname(step.parl[PARSMTDIR].sval, step.parl[PARSMTDIR].sval,UPRDOUTDIR)==0) { if ((len=strlen(step.parl[PARSMTDIR].sval))>1 && (step.parl[PARSMTDIR].sval[len-1]=='\\' || step.parl[PARSMTDIR].sval[len-1]=='/')) step.parl[PARSMTDIR].sval[len-1]='\0'; bae_dialsetdata(tfdidx,PA_STR,0,0.0, step.parl[PARSMTDIR].sval); } break; // Fail/abort case (-1) : default : return(1); } // Stop if no further repeat requests } while (repflag); return(0); } int editinsstep(struct stepdes step) /* // Edit insertion data step parameters // Return value : // zero if done or 1 on abort // Parameters : // struct stepdes step : Step data */ { string msg /* Message string */; double cy /* Dialog box current y coordinate */; int repflag /* Dialog box repeat flag */; int fnlidx /* File name label parameter index */; int fnidx /* File name parameter index */; int fmidx /* File name mode parameter index */; int fdidx /* Folder name parameter index */; int lcidx /* Layer comment parameter index */; int rotidx /* Rotation mode index */; int miridx /* Mirror mode index */; int osidx /* Origin symbol index */; int outidx /* Output index index */; int cunits /* Coordinate display units */; int len /* Name length */; bae_dialclr(); // Init. the y coordinate cy=DIAL_TOPMARG; // Store output index controls dial_label(SCOLOFF2,cy,UPRDINDEX); outidx=bae_dialaddcontrol(PA_INT|PA_CHKLL|PA_HBRDREL,0, 0,step.parl[PARINSIDX].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,DIAL_RIGHTEMARG,""); // Store the OK and abort button dial_okabort(cy); cy-=DIAL_SEPVSTEP; dial_hsep(cy); // Store file name controls fnlidx=dial_label(0.0,cy,UPRDOUTEXT); fnidx=dial_string(step.parl[PARINSFILE].sval,MAXPATHLEN,CCOLOFF2,cy); // Store file name mode controls dial_label(0.0,cy,UPRDFMODE); fmidx=dial_selbox(step.parl[PARINSFMODE].ival,CCOLOFF2,cy); dial_sbentry(1,0,UPRFMODE0); dial_sbentry(1,1,UPRFMODE1); // Store folder name controls dial_label(0.0,cy,UPRDOUTDIR); fdidx=bae_dialaddcontrol(PA_STR,0,0,0,0.0,0.0,0.0, step.parl[PARINSDIR].sval,MAXPATHLEN,DIAL_LEFTMARG+CCOLOFF2,cy, SCOLOFF2+32.0-CCOLOFF2,""); bae_dialaddcontrol(PA_ACT,0,4,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+33.0,cy,0.0,UPRBRWFILENAME); cy+=DIAL_CTRVSTEP; // Store layer comment controls dial_label(0.0,cy,UPRDLAYCOMM); lcidx=dial_string(step.parl[PARINSCOMMENT].sval,MAXPATHLEN,CCOLOFF2,cy); dial_hsep(cy); // Store rotation mode controls dial_label(0.0,cy,UPRROTM); rotidx=dial_selbox(step.parl[PARINSROTMODE].ival,CCOLOFF2,cy); dial_sbentry(0,0,UPRROT1); dial_sbentry(0,1,UPRROT2); // Store mirror mode controls dial_label(0.0,cy,UPRMIRRM); miridx=dial_selbox(step.parl[PARINSMIRMODE].ival,CCOLOFF2,cy); dial_sbentry(0,0,UPRMIRR1); dial_sbentry(0,1,UPRMIRR2); dial_sbentry(0,2,UPRMIRR3); dial_sbentry(0,3,UPRMIRR4); dial_sbentry(0,4,UPRMIRR5); dial_sbentry(0,5,UPRMIRR6); // Store origin symbol name controls dial_label(0.0,cy,UPRDORGSYM); osidx= dial_namestring(step.parl[PARINSORGSYM].sval,MAXKEYLEN,CCOLOFF2,cy); dial_hsep(cy); // Store coordinate unit controls cunits= bae_getcoorddisp() ? 2 : 0; dial_label(0.0,cy,UPRDUNIT); bae_dialaddcontrol(PA_RBF,0,2,cunits,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+CCOLOFF2,cy,0.0,UPRDUNITMM); bae_dialaddcontrol(PA_RBN,2,3,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+CCOLOFF2+7.0,cy,0.0,UPRDUNITMIL); cy+=DIAL_CTRVSTEP+DIAL_SEPVSTEP; // Perform the dialog input loop repflag=1; do { bae_dialsetdata(fnlidx,PA_LAB,0,0.0, step.parl[PARINSFMODE].ival ? UPRDOUTFILE : UPRDOUTEXT); // Call the dialog function sprintf(msg, UPRDIALINSPAR,layername(step.parl[PARINSLAYER].ival)); bae_setintpar(16,3007); switch (bae_dialaskparams(msg,cunits,DIAL_LEFTMARG+81.7,cy)) { case 0 : // Get data from dialog box entries bae_dialgetdata( fnidx,0,0.0,step.parl[PARINSFILE].sval); if (step.parl[PARINSFILE].sval=="") { bae_msgbox(2,ERRNOFILEN,""); break; } bae_dialgetdata( fdidx,0,0.0,step.parl[PARINSDIR].sval); bae_dialgetdata( fmidx,step.parl[PARINSFMODE].ival,0.0,""); bae_dialgetdata( lcidx,0,0.0,step.parl[PARINSCOMMENT].sval); bae_dialgetdata( miridx,step.parl[PARINSMIRMODE].ival,0.0,""); bae_dialgetdata( rotidx,step.parl[PARINSROTMODE].ival,0.0,""); bae_dialgetdata( osidx,0,0.0,step.parl[PARINSORGSYM].sval); bae_dialgetdata( outidx,step.parl[PARINSIDX].ival,0.0,""); repflag=0; break; // File mode change case 1 : bae_dialgetdata( fmidx,step.parl[PARINSFMODE].ival,0.0,""); break; // Switch to mm units case 2 : cunits=0; break; // Switch to mil units case 3 : cunits=2; break; // Browse output folder case 4 : bae_dialgetdata( fdidx,0,0.0,step.parl[PARINSDIR].sval); if (bae_askdirname(step.parl[PARINSDIR].sval, step.parl[PARINSDIR].sval,UPRDOUTDIR)==0) { if ((len=strlen(step.parl[PARINSDIR].sval))>1 && (step.parl[PARINSDIR].sval[len-1]=='\\' || step.parl[PARINSDIR].sval[len-1]=='/')) step.parl[PARINSDIR].sval[len-1]='\0'; bae_dialsetdata(fdidx,PA_STR,0,0.0, step.parl[PARINSDIR].sval); } break; // Fail/abort case (-1) : default : return(1); } // Stop if no further repeat requests } while (repflag); return(0); } int editginstep(struct stepdes step) /* // Edit generic insertion data step parameters // Return value : // zero if done or 1 on abort // Parameters : // struct stepdes step : Step data */ { string msg /* Message string */; double cy /* Dialog box current y coordinate */; int repflag /* Dialog box repeat flag */; int fnidx /* File name parameter index */; int outidx /* Output index index */; int cunits /* Coordinate display units */; int len /* Name length */; bae_dialclr(); // Init. the y coordinate cy=DIAL_TOPMARG; // Store output index controls dial_label(SCOLOFF2,cy,UPRDINDEX); outidx=bae_dialaddcontrol(PA_INT|PA_CHKLL|PA_HBRDREL,0, 0,step.parl[PARGINIDX].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,DIAL_RIGHTEMARG,""); // Store the OK and abort button dial_okabort(cy); cy-=DIAL_SEPVSTEP; dial_hsep(cy); // Store file name controls dial_label(0.0,cy,UPRDGINFILE); fnidx=bae_dialaddcontrol(PA_STR,0,0,0,0.0,0.0,0.0, step.parl[PARGINFRM].sval,MAXPATHLEN,DIAL_LEFTMARG+CCOLOFF2,cy, SCOLOFF2+32.0-CCOLOFF2,""); bae_dialaddcontrol(PA_ACT,0,1,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+33.0,cy,0.0,UPRBRWFILENAME); cy+=DIAL_CTRVSTEP+DIAL_SEPVSTEP; // Perform the dialog input loop repflag=1; do { // Call the dialog function bae_setintpar(16,3022); switch (bae_dialaskparams(UPRDIALGINPAR,cunits, DIAL_LEFTMARG+81.7,cy)) { case 0 : // Get data from dialog box entries bae_dialgetdata( fnidx,0,0.0,step.parl[PARGINFRM].sval); if (step.parl[PARGINFRM].sval=="") { bae_msgbox(2,ERRNOFILEN,""); break; } bae_dialgetdata( outidx,step.parl[PARGINIDX].ival,0.0,""); repflag=0; break; // Browse output folder case 1 : bae_dialgetdata(fnidx,0,0.0,step.parl[PARGINFRM].sval); if (bae_askfilename(step.parl[PARCMDPREF].sval, IFSEXT,UPRISFFILE)==0) bae_dialsetdata(fnidx,PA_STR,0,0.0, step.parl[PARGINFRM].sval); break; // Fail/abort case (-1) : default : return(1); } // Stop if no further repeat requests } while (repflag); return(0); } int editbmpstep(struct stepdes step) /* // Edit BMP step parameters // Return value : // zero if done or 1 on abort // Parameters : // struct stepdes step : Step data */ { string msg /* Message string */; double sy /* Dialog box sep. y coordinate */; double cy /* Dialog box current y coordinate */; int repflag /* Dialog box repeat flag */; int fnlidx /* File name label parameter index */; int fnidx /* File name parameter index */; int fmidx /* File name mode parameter index */; int fdidx /* Folder name parameter index */; int lcidx /* Layer comment parameter index */; int bridx /* Bitmap resolution parameter index */; int pwidx /* Pen width index */; int alidx /* All layer mode index */; int boidx /* Board outline mode index */; int fididx /* Fiducial marks mode index */; int rotidx /* Rotation mode index */; int miridx /* Mirror mode index */; int htmidx /* Heat trap min. dist. index */; int htaidx /* Heat trap angle index */; int ismidx /* Isolation min. dist. index */; int brwidx /* Border width index */; int spiidx /* Split power plan isol. index */; int outidx /* Output index index */; int cunits /* Coordinate display units */; int len /* Name length */; bae_dialclr(); // Init. the y coordinate cy=DIAL_TOPMARG; // Store output index controls dial_label(SCOLOFF2,cy,UPRDINDEX); outidx=bae_dialaddcontrol(PA_INT|PA_CHKLL|PA_HBRDREL,0, 0,step.parl[PARBMPIDX].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,DIAL_RIGHTEMARG,""); // Store the OK and abort button dial_okabort(cy); cy-=DIAL_SEPVSTEP; dial_hsep(cy); // Store file name controls fnlidx=dial_label(0.0,cy,UPRDOUTEXT); fnidx=dial_string(step.parl[PARBMPFILE].sval,MAXPATHLEN,CCOLOFF2,cy); // Store file name mode controls dial_label(0.0,cy,UPRDFMODE); fmidx=dial_selbox(step.parl[PARBMPFMODE].ival,CCOLOFF2,cy); dial_sbentry(1,0,UPRFMODE0); dial_sbentry(1,1,UPRFMODE1); // Store folder name controls dial_label(0.0,cy,UPRDOUTDIR); fdidx=bae_dialaddcontrol(PA_STR,0,0,0,0.0,0.0,0.0, step.parl[PARBMPDIR].sval,MAXPATHLEN,DIAL_LEFTMARG+CCOLOFF2,cy, SCOLOFF2+32.0-CCOLOFF2,""); bae_dialaddcontrol(PA_ACT,0,6,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+33.0,cy,0.0,UPRBRWFILENAME); cy+=DIAL_CTRVSTEP; // Store layer comment controls dial_label(0.0,cy,UPRDLAYCOMM); lcidx=dial_string(step.parl[PARBMPCOMMENT].sval,MAXPATHLEN,CCOLOFF2,cy); sy=cy; dial_hsep(cy); dial_label(0.0,cy,UPRDRES); bridx=bae_dialaddcontrol(PA_DBL|PA_DIST|PA_CHKLL,0,4,0,0.00001,0.0, step.parl[PARBMPRES].dval,"",0,DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store all layer mode controls dial_label(SCOLOFF2,cy,UPRALLLAY); alidx=dial_selbox(step.parl[PARBMPALLMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRALLM1); dial_sbentry(0,1,UPRALLM2); dial_sbentry(0,2,UPRALLM3); dial_sbentry(0,3,UPRALLM4); dial_sbentry(0,4,UPRALLM5); // Store BMP pen width controls dial_label(0.0,cy,UPRDHPPENW); pwidx=bae_dialaddcontrol(PA_DBL|PA_DIST|PA_CHKLL|PA_CHKUL,0, 5,0,0.00001,0.01,step.parl[PARBMPSTDLINEW].dval,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store border output mode controls dial_label(SCOLOFF2,cy,UPRBORDMASK); boidx=dial_selbox(step.parl[PARBMPBRDMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRBORDM1); dial_sbentry(0,1,UPRBORDM2); dial_sbentry(0,2,UPRBORDM3); // Store fiducial markers output mode controls dial_label(SCOLOFF2,cy,UPRFIDM); fididx=bae_dialaddcontrol(PA_RBF,0,0,step.parl[PARBMPMRKMODE].ival, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,0.0,UPRRBOFF); bae_dialaddcontrol(PA_RBN,1,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2+7.0,cy,0.0,UPRRBON); cy+=DIAL_CTRVSTEP; // Store rotation mode controls dial_label(SCOLOFF2,cy,UPRROTM); rotidx=dial_selbox(step.parl[PARBMPROTMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRROT1); dial_sbentry(0,1,UPRROT2); // Store mirror mode controls dial_label(SCOLOFF2,cy,UPRMIRRM); miridx=dial_selbox(step.parl[PARBMPMIRMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRMIRR1); dial_sbentry(0,1,UPRMIRR2); dial_sbentry(0,2,UPRMIRR3); dial_sbentry(0,3,UPRMIRR4); dial_sbentry(0,4,UPRMIRR5); dial_sbentry(0,5,UPRMIRR6); bae_dialaddcontrol(PA_VSEP,0,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+SCOLOFF2-0.8,sy,cy-sy,""); if (step.parl[PARBMPLAYER].ival>=POWLAYBASE && step.parl[PARBMPLAYER].ival<(POWLAYBASE+POWLAYMAX)) { dial_hsep(cy); // Store heat trap angle controls dial_label(0.0,cy,UPRHTANG); htaidx=bae_dialaddcontrol(PA_RBF,0,0, step.parl[PARBMPPHTANG].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,0.0,UPRHTANG1); bae_dialaddcontrol(PA_RBN,1,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+CCOLOFF2+7.0,cy,0.0,UPRHTANG2); cy+=DIAL_CTRVSTEP; // Store heat trap min. distance controls dial_label(0.0,cy,UPRHTDMD); htmidx=bae_dialaddcontrol(PA_DBL|PA_DIST|PA_CHKLL,0, 5,0,0.0,0.0,step.parl[PARBMPPHTDMD].dval,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store isolation min. distance controls dial_label(SCOLOFF2,cy,UPRISDMD); ismidx= dial_dist(5,step.parl[PARBMPPISDMD].dval,CCOLOFF2+SCOLOFF2,cy); // Store border width controls dial_label(0.0,cy,UPRBRDWD); brwidx=bae_dialaddcontrol(PA_DBL|PA_DIST|PA_CHKLL,0, 5,0,0.0,0.0,step.parl[PARBMPPBRDWD].dval,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store power plane isolation width controls dial_label(SCOLOFF2,cy,UPRSPPIS); spiidx= dial_dist(5,step.parl[PARBMPPSPPIS].dval,CCOLOFF2+SCOLOFF2,cy); } dial_hsep(cy); // Store coordinate unit controls cunits= bae_getcoorddisp() ? 2 : 0; dial_label(0.0,cy,UPRDUNIT); bae_dialaddcontrol(PA_RBF,0,2,cunits,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+CCOLOFF2,cy,0.0,UPRDUNITMM); bae_dialaddcontrol(PA_RBN,2,3,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+CCOLOFF2+7.0,cy,0.0,UPRDUNITMIL); cy+=DIAL_CTRVSTEP+DIAL_SEPVSTEP; // Perform the dialog input loop repflag=1; do { bae_dialsetdata(fnlidx,PA_LAB,0,0.0, step.parl[PARBMPFMODE].ival ? UPRDOUTFILE : UPRDOUTEXT); // Call the dialog function sprintf(msg, UPRDIALBMPPAR,layername(step.parl[PARBMPLAYER].ival)); bae_setintpar(16,3020); switch (bae_dialaskparams(msg,cunits,DIAL_LEFTMARG+81.7,cy)) { case 0 : // Get data from dialog box entries bae_dialgetdata( fnidx,0,0.0,step.parl[PARBMPFILE].sval); if (step.parl[PARBMPFILE].sval=="") { bae_msgbox(2,ERRNOFILEN,""); break; } bae_dialgetdata( fdidx,0,0.0,step.parl[PARBMPDIR].sval); bae_dialgetdata( fmidx,step.parl[PARBMPFMODE].ival,0.0,""); bae_dialgetdata( lcidx,0,0.0,step.parl[PARBMPCOMMENT].sval); bae_dialgetdata( bridx,0,step.parl[PARBMPRES].dval,""); bae_dialgetdata( pwidx,0,step.parl[PARBMPSTDLINEW].dval,""); bae_dialgetdata( alidx,step.parl[PARBMPALLMODE].ival,0.0,""); bae_dialgetdata( boidx,step.parl[PARBMPBRDMODE].ival,0.0,""); bae_dialgetdata( fididx,step.parl[PARBMPMRKMODE].ival,0.0,""); bae_dialgetdata( miridx,step.parl[PARBMPMIRMODE].ival,0.0,""); bae_dialgetdata( rotidx,step.parl[PARBMPROTMODE].ival,0.0,""); if (step.parl[PARBMPLAYER].ival>=POWLAYBASE && step.parl[PARBMPLAYER].ival<(POWLAYBASE+POWLAYMAX)) { bae_dialgetdata( htmidx,0,step.parl[PARBMPPHTDMD].dval,""); bae_dialgetdata( htaidx,step.parl[PARBMPPHTANG].ival,0.0,""); bae_dialgetdata( ismidx,0,step.parl[PARBMPPISDMD].dval,""); bae_dialgetdata( brwidx,0,step.parl[PARBMPPBRDWD].dval,""); bae_dialgetdata( spiidx,0,step.parl[PARBMPPSPPIS].dval,""); } bae_dialgetdata( outidx,step.parl[PARBMPIDX].ival,0.0,""); repflag=0; break; // File mode change case 1 : bae_dialgetdata( fmidx,step.parl[PARBMPFMODE].ival,0.0,""); break; // Switch to mm units case 2 : cunits=0; break; // Switch to mil units case 3 : cunits=2; break; // Browse output folder case 6 : bae_dialgetdata( fdidx,0,0.0,step.parl[PARBMPDIR].sval); if (bae_askdirname(step.parl[PARBMPDIR].sval, step.parl[PARBMPDIR].sval,UPRDOUTDIR)==0) { if ((len=strlen(step.parl[PARBMPDIR].sval))>1 && (step.parl[PARBMPDIR].sval[len-1]=='\\' || step.parl[PARBMPDIR].sval[len-1]=='/')) step.parl[PARBMPDIR].sval[len-1]='\0'; bae_dialsetdata(fdidx,PA_STR,0,0.0, step.parl[PARBMPDIR].sval); } break; // Fail/abort case (-1) : default : return(1); } // Stop if no further repeat requests } while (repflag); return(0); } int editgpstep(struct stepdes step) /* // Edit Generic output step parameters // Return value : // zero if done or 1 on abort // Parameters : // struct stepdes step : Step data */ { string msg /* Message string */; string coltab /* Color table name */; double sy /* Dialog box sep. y coordinate */; double cy /* Dialog box current y coordinate */; int repflag /* Dialog box repeat flag */; int pnidx /* Printer name parameter index */; int lcidx /* Layer comment parameter index */; int pwidx /* Pen width index */; int scidx /* Output scale index */; int smidx /* Scale mode index */; int cmidx /* Color mode index */; int ctidx = (-1) /* Color table index */; int alidx /* All layer mode index */; int boidx /* Board outline mode index */; int fididx /* Fiducial marks mode index */; int rotidx /* Rotation mode index */; int miridx /* Mirror mode index */; int htmidx /* Heat trap min. dist. index */; int htaidx /* Heat trap angle index */; int ismidx /* Isolation min. dist. index */; int brwidx /* Border width index */; int spiidx /* Split power plan isol. index */; int outidx /* Output index index */; int cunits /* Coordinate display units */; int len /* Name length */; bae_dialclr(); // Init. the y coordinate cy=DIAL_TOPMARG; // Store output index controls dial_label(SCOLOFF2,cy,UPRDINDEX); outidx=bae_dialaddcontrol(PA_INT|PA_CHKLL|PA_HBRDREL,0, 0,step.parl[PARGPIDX].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,DIAL_RIGHTEMARG,""); // Store the OK and abort button dial_okabort(cy); cy-=DIAL_SEPVSTEP; dial_hsep(cy); // Store printer name controls dial_label(0.0,cy,UPRDPARPRINT); pnidx=bae_dialaddcontrol(PA_STR,0,0,0,0.0,0.0,0.0, step.parl[PARGPPRINT].sval,MAXPATHLEN,DIAL_LEFTMARG+CCOLOFF2,cy, SCOLOFF2-1.0,""); bae_dialaddcontrol(PA_ACT,0,6,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,0.0,UPRSTDPRINTER); cy+=DIAL_CTRVSTEP; // Store layer comment controls dial_label(0.0,cy,UPRDLAYCOMM); lcidx=dial_string(step.parl[PARGPCOMMENT].sval,MAXPATHLEN,CCOLOFF2,cy); sy=cy; dial_hsep(cy); if (step.parl[PARGPLAYER].ival==LAYERCOMB) { // Store color table name controls dial_label(0.0,cy,UPRDCOLTAB); ctidx=bae_dialaddcontrol(PA_STR,0,0,0,0.0,0.0,0.0, step.parl[PARGPCOLTAB].sval,MAXKEYLEN,DIAL_LEFTMARG+CCOLOFF2, cy,SCOLOFF2-1.0,""); bae_dialaddcontrol(PA_ACT,0,4,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,0.0,UPRBRWFILENAME); cy+=DIAL_CTRVSTEP; sy=cy; dial_hsep(cy); } // Store generic printer pen width controls dial_label(0.0,cy,UPRDHPPENW); pwidx=bae_dialaddcontrol(PA_DBL|PA_DIST|PA_CHKLL|PA_CHKUL,0, 5,0,0.00001,0.01,step.parl[PARGPSTDLINEW].dval,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store all layer mode controls dial_label(SCOLOFF2,cy,UPRALLLAY); alidx=dial_selbox(step.parl[PARGPALLMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRALLM1); dial_sbentry(0,1,UPRALLM2); dial_sbentry(0,2,UPRALLM3); dial_sbentry(0,3,UPRALLM4); dial_sbentry(0,4,UPRALLM5); // Store scale factor controls dial_label(0.0,cy,UPRDHPSCAL); scidx=bae_dialaddcontrol(PA_DBL|PA_CHKLL|PA_CHKUL,0, 5,0,0.1,100.0,step.parl[PARGPSCALE].dval,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store border output mode controls dial_label(SCOLOFF2,cy,UPRBORDM); boidx=dial_selbox(step.parl[PARHPBRDMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRBORD1); dial_sbentry(0,1,UPRBORD2); // Store scale mode controls dial_label(0.0,cy,UPRDGPSMODE); smidx=bae_dialaddcontrol(PA_SB,0,0,step.parl[PARGPSMODE].ival, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); dial_sbentry(0,0,UPRGPSMODE0); dial_sbentry(0,1,UPRGPSMODE1); // Store fiducial markers output mode controls dial_label(SCOLOFF2,cy,UPRFIDM); fididx=bae_dialaddcontrol(PA_RBF,0,0,step.parl[PARGPMRKMODE].ival, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,0.0,UPRRBOFF); bae_dialaddcontrol(PA_RBN,1,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2+7.0,cy,0.0,UPRRBON); cy+=DIAL_CTRVSTEP; // Store color mix mode controls dial_label(0.0,cy,UPRDGPCMODE); cmidx=bae_dialaddcontrol(PA_SB,0,0,step.parl[PARGPCMODE].ival, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); dial_sbentry(0,0,UPRGPCMODE0); dial_sbentry(0,1,UPRGPCMODE1); // Store rotation mode controls dial_label(SCOLOFF2,cy,UPRROTM); rotidx=dial_selbox(step.parl[PARGPROTMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRROT1); dial_sbentry(0,1,UPRROT2); // Store mirror mode controls dial_label(SCOLOFF2,cy,UPRMIRRM); miridx=dial_selbox(step.parl[PARGPMIRMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRMIRR1); dial_sbentry(0,1,UPRMIRR2); dial_sbentry(0,2,UPRMIRR3); dial_sbentry(0,3,UPRMIRR4); dial_sbentry(0,4,UPRMIRR5); dial_sbentry(0,5,UPRMIRR6); bae_dialaddcontrol(PA_VSEP,0,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+SCOLOFF2-0.8,sy,cy-sy,""); if (step.parl[PARGPLAYER].ival>=POWLAYBASE && step.parl[PARGPLAYER].ival<(POWLAYBASE+POWLAYMAX)) { dial_hsep(cy); // Store heat trap angle controls dial_label(0.0,cy,UPRHTANG); htaidx=bae_dialaddcontrol(PA_RBF,0,0, step.parl[PARGPPHTANG].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,0.0,UPRHTANG1); bae_dialaddcontrol(PA_RBN,1,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+CCOLOFF2+7.0,cy,0.0,UPRHTANG2); cy+=DIAL_CTRVSTEP; // Store heat trap min. distance controls dial_label(0.0,cy,UPRHTDMD); htmidx=bae_dialaddcontrol(PA_DBL|PA_DIST|PA_CHKLL,0, 5,0,0.0,0.0,step.parl[PARGPPHTDMD].dval,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store isolation min. distance controls dial_label(SCOLOFF2,cy,UPRISDMD); ismidx= dial_dist(5,step.parl[PARGPPISDMD].dval,CCOLOFF2+SCOLOFF2,cy); // Store border width controls dial_label(0.0,cy,UPRBRDWD); brwidx=bae_dialaddcontrol(PA_DBL|PA_DIST|PA_CHKLL,0, 5,0,0.0,0.0,step.parl[PARGPPBRDWD].dval,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store power plane isolation width controls dial_label(SCOLOFF2,cy,UPRSPPIS); spiidx= dial_dist(5,step.parl[PARGPPSPPIS].dval,CCOLOFF2+SCOLOFF2,cy); } dial_hsep(cy); // Store coordinate unit controls cunits= bae_getcoorddisp() ? 2 : 0; dial_label(0.0,cy,UPRDUNIT); bae_dialaddcontrol(PA_RBF,0,2,cunits,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+CCOLOFF2,cy,0.0,UPRDUNITMM); bae_dialaddcontrol(PA_RBN,2,3,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+CCOLOFF2+7.0,cy,0.0,UPRDUNITMIL); cy+=DIAL_CTRVSTEP+DIAL_SEPVSTEP; // Perform the dialog input loop repflag=1; do { // Call the dialog function sprintf(msg, UPRDIALGPPAR,layername(step.parl[PARGPLAYER].ival)); bae_setintpar(16,3021); switch (bae_dialaskparams(msg,cunits,DIAL_LEFTMARG+81.7,cy)) { case 0 : // Get data from dialog box entries bae_dialgetdata(pnidx,0,0.0,step.parl[PARGPPRINT].sval); if (ctidx!=(-1)) bae_dialgetdata(ctidx,0,0.0, step.parl[PARGPCOLTAB].sval); bae_dialgetdata( lcidx,0,0.0,step.parl[PARGPCOMMENT].sval); bae_dialgetdata( pwidx,0,step.parl[PARGPSTDLINEW].dval,""); bae_dialgetdata( alidx,step.parl[PARGPALLMODE].ival,0.0,""); bae_dialgetdata( boidx,step.parl[PARGPBRDMODE].ival,0.0,""); bae_dialgetdata( fididx,step.parl[PARGPMRKMODE].ival,0.0,""); bae_dialgetdata( miridx,step.parl[PARGPMIRMODE].ival,0.0,""); bae_dialgetdata( scidx,0,step.parl[PARGPSCALE].dval,""); bae_dialgetdata( cmidx,step.parl[PARGPCMODE].ival,0.0,""); bae_dialgetdata( smidx,step.parl[PARGPSMODE].ival,0.0,""); bae_dialgetdata( rotidx,step.parl[PARGPROTMODE].ival,0.0,""); if (step.parl[PARGPLAYER].ival>=POWLAYBASE && step.parl[PARGPLAYER].ival<(POWLAYBASE+POWLAYMAX)) { bae_dialgetdata( htmidx,0,step.parl[PARGPPHTDMD].dval,""); bae_dialgetdata( htaidx,step.parl[PARGPPHTANG].ival,0.0,""); bae_dialgetdata( ismidx,0,step.parl[PARGPPISDMD].dval,""); bae_dialgetdata( brwidx,0,step.parl[PARGPPBRDWD].dval,""); bae_dialgetdata( spiidx,0,step.parl[PARGPPSPPIS].dval,""); } bae_dialgetdata( outidx,step.parl[PARGPIDX].ival,0.0,""); repflag=0; break; // Switch to mm units case 2 : cunits=0; break; // Switch to mil units case 3 : cunits=2; break; // Browse color table name case 4 : bae_dialgetdata(ctidx,0,0.0,coltab); if (bae_askddbename( coltab,GEDDAT,DDBCLLCOL,UPRCOLTAB)==0) bae_dialsetdata(ctidx,PA_STR,0,0.0,coltab); break; // Set default printer name case 6 : bae_dialsetdata(pnidx,PA_STR,0,0.0,"standard"); break; // Fail/abort case (-1) : default : return(1); } // Stop if no further repeat requests } while (repflag); return(0); } int editddbstep(struct stepdes step) /* // Edit DDB step parameters // Return value : // zero if done or 1 on abort // Parameters : // struct stepdes step : Step data */ { string msg /* Message string */; double cy /* Dialog box current y coordinate */; int repflag /* Dialog box repeat flag */; int fnlidx /* File name label parameter index */; int fnidx /* File name parameter index */; int fmidx /* File name mode parameter index */; int enidx /* Element name parameter index */; int fdidx /* Folder name parameter index */; int lcidx /* Layer comment parameter index */; int alidx /* All layer mode index */; int boidx /* Board outline mode index */; int fididx /* Fiducial marks mode index */; int outidx /* Output index index */; int cunits /* Coordinate display units */; int len /* Name length */; bae_dialclr(); // Init. the y coordinate cy=DIAL_TOPMARG; // Store output index controls dial_label(SCOLOFF2,cy,UPRDINDEX); outidx=bae_dialaddcontrol(PA_INT|PA_CHKLL|PA_HBRDREL,0, 0,step.parl[PARDDBIDX].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,DIAL_RIGHTEMARG,""); // Store the OK and abort button dial_okabort(cy); cy-=DIAL_SEPVSTEP; dial_hsep(cy); // Store file name controls fnlidx=dial_label(0.0,cy,UPRDOUTEXT); fnidx=dial_string(step.parl[PARDDBFILE].sval,MAXPATHLEN,CCOLOFF2,cy); // Store file name mode controls dial_label(0.0,cy,UPRDFMODE); fmidx=dial_selbox(step.parl[PARDDBFMODE].ival,CCOLOFF2,cy); dial_sbentry(1,0,UPRFMODE0); dial_sbentry(1,1,UPRFMODE1); // Store folder name controls dial_label(0.0,cy,UPRDOUTDIR); fdidx=bae_dialaddcontrol(PA_STR,0,0,0,0.0,0.0,0.0, step.parl[PARDDBDIR].sval,MAXPATHLEN,DIAL_LEFTMARG+CCOLOFF2,cy, SCOLOFF2+32.0-CCOLOFF2,""); bae_dialaddcontrol(PA_ACT,0,4,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+33.0,cy,0.0,UPRBRWFILENAME); cy+=DIAL_CTRVSTEP; // Store element name controls dial_label(0.0,cy,UPRDOUTELEM); enidx=dial_string(step.parl[PARDDBELEM].sval,MAXKEYLEN,CCOLOFF2,cy); // Store layer comment controls dial_label(0.0,cy,UPRDLAYCOMM); lcidx=dial_string(step.parl[PARDDBCOMMENT].sval,MAXPATHLEN,CCOLOFF2,cy); if (step.parl[PARDDBLAYER].ival!=LAYERCOMB) { dial_hsep(cy); // Store all layer mode controls dial_label(0.0,cy,UPRALLLAY); alidx=dial_selbox(step.parl[PARDDBALLMODE].ival,CCOLOFF2,cy); dial_sbentry(0,0,UPRALLM1); dial_sbentry(0,1,UPRALLM2); dial_sbentry(0,2,UPRALLM3); dial_sbentry(0,3,UPRALLM4); dial_sbentry(0,4,UPRALLM5); // Store border output mode controls dial_label(0.0,cy,UPRBORDM); boidx=dial_selbox(step.parl[PARDDBBRDMODE].ival,CCOLOFF2,cy); dial_sbentry(0,0,UPRBORD1); dial_sbentry(0,1,UPRBORD2); // Store fiducial markers output mode controls dial_label(0.0,cy,UPRFIDM); fididx=bae_dialaddcontrol(PA_RBF,0,0, step.parl[PARDDBMRKMODE].ival, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG+CCOLOFF2,cy,0.0,UPRRBOFF); bae_dialaddcontrol(PA_RBN,1,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+CCOLOFF2+7.0,cy,0.0,UPRRBON); cy+=DIAL_CTRVSTEP; } dial_hsep(cy); // Store coordinate unit controls cunits= bae_getcoorddisp() ? 2 : 0; dial_label(0.0,cy,UPRDUNIT); bae_dialaddcontrol(PA_RBF,0,2,cunits,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+CCOLOFF2,cy,0.0,UPRDUNITMM); bae_dialaddcontrol(PA_RBN,2,3,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+CCOLOFF2+7.0,cy,0.0,UPRDUNITMIL); cy+=DIAL_CTRVSTEP+DIAL_SEPVSTEP; // Perform the dialog input loop repflag=1; do { bae_dialsetdata(fnlidx,PA_LAB,0,0.0, step.parl[PARDDBFMODE].ival ? UPRDOUTFILE : UPRDOUTEXT); // Call the dialog function sprintf(msg, UPRDIALDDBPAR,layername(step.parl[PARDDBLAYER].ival)); bae_setintpar(16,3008); switch (bae_dialaskparams(msg,cunits,DIAL_LEFTMARG+81.7,cy)) { case 0 : // Get data from dialog box entries bae_dialgetdata(fnidx,0,0.0,step.parl[PARDDBFILE].sval); if (step.parl[PARDDBFILE].sval=="") { bae_msgbox(2,ERRNOFILEN,""); break; } bae_dialgetdata(enidx,0,0.0,step.parl[PARDDBELEM].sval); if (step.parl[PARDDBELEM].sval=="") { bae_msgbox(2,ERRNOELEMN,""); break; } bae_dialgetdata(fdidx,0,0.0,step.parl[PARDDBDIR].sval); bae_dialgetdata( fmidx,step.parl[PARDDBFMODE].ival,0.0,""); bae_dialgetdata( lcidx,0,0.0,step.parl[PARDDBCOMMENT].sval); if (step.parl[PARDDBLAYER].ival!=LAYERCOMB) { bae_dialgetdata( alidx,step.parl[PARDDBALLMODE].ival,0.0,""); bae_dialgetdata( boidx,step.parl[PARDDBBRDMODE].ival,0.0,""); bae_dialgetdata( fididx,step.parl[PARDDBMRKMODE].ival,0.0,""); } else { step.parl[PARDDBALLMODE].ival=0; step.parl[PARDDBBRDMODE].ival=0; step.parl[PARDDBMRKMODE].ival=0; } bae_dialgetdata( outidx,step.parl[PARDDBIDX].ival,0.0,""); repflag=0; break; // File mode change case 1 : bae_dialgetdata( fmidx,step.parl[PARDDBFMODE].ival,0.0,""); break; // Switch to mm units case 2 : cunits=0; break; // Switch to mil units case 3 : cunits=2; break; // Browse output folder case 4 : bae_dialgetdata( fdidx,0,0.0,step.parl[PARDDBDIR].sval); if (bae_askdirname(step.parl[PARDDBDIR].sval, step.parl[PARDDBDIR].sval,UPRDOUTDIR)==0) { if ((len=strlen(step.parl[PARDDBDIR].sval))>1 && (step.parl[PARDDBDIR].sval[len-1]=='\\' || step.parl[PARDDBDIR].sval[len-1]=='/')) step.parl[PARDDBDIR].sval[len-1]='\0'; bae_dialsetdata(fdidx,PA_STR,0,0.0, step.parl[PARDDBDIR].sval); } break; // Fail/abort case (-1) : default : return(1); } // Stop if no further repeat requests } while (repflag); return(0); } int editwarncontrol(struct stepdes step) /* // Edit warning control step parameters // Return value : // zero if done or 1 on abort // Parameters : // struct stepdes step : Step data */ { double cy /* Dialog box current y coordinate */; int repflag /* Dialog box repeat flag */; int slayidx /* Signal layer parameter index */; int playidx /* Power layer parameter index */; int drlcidx /* Drill class parameter index */; int outidx /* Output index index */; bae_dialclr(); // Init. the y coordinate cy=DIAL_TOPMARG; // Store output index controls dial_label(SCOLOFF2,cy,UPRDINDEX); outidx=bae_dialaddcontrol(PA_INT|PA_CHKLL|PA_HBRDREL,0, 0,step.parl[PARWRNIDX].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,DIAL_RIGHTEMARG,""); // Store the OK and abort button dial_okabort(cy); cy-=DIAL_SEPVSTEP; dial_hsep(cy); // Store signal layer warning controls slayidx=bae_dialaddcontrol(PA_TOGGLE,0,0,step.parl[PARWRNSLAY].ival, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG,cy,0.0,UPRSLAYMARK); cy+=DIAL_BUTVSTEP; // Store power layer warning controls playidx=bae_dialaddcontrol(PA_TOGGLE,0,0,step.parl[PARWRNPLAY].ival, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG,cy,0.0,UPRPLAYMARK); cy+=DIAL_BUTVSTEP; // Store drill class warning controls drlcidx=bae_dialaddcontrol(PA_TOGGLE,0,0,step.parl[PARWRNDRL].ival, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG,cy,0.0,UPRDRLMARK); cy+=DIAL_BUTVSTEP+DIAL_SEPVSTEP; // Perform the dialog input loop repflag=1; do { // Call the dialog function bae_setintpar(16,3017); switch (bae_dialaskparams( UPRDIALWRNPAR,0,DIAL_LEFTMARG+81.7,cy)) { case 0 : // Get data from dialog box entries bae_dialgetdata( slayidx,step.parl[PARWRNSLAY].ival,0.0,""); bae_dialgetdata( playidx,step.parl[PARWRNPLAY].ival,0.0,""); bae_dialgetdata( drlcidx,step.parl[PARWRNDRL].ival,0.0,""); bae_dialgetdata( outidx,step.parl[PARWRNIDX].ival,0.0,""); repflag=0; break; // Fail/abort case (-1) : default : return(1); } // Stop if no further repeat requests } while (repflag); return(0); } int editcmdstep(struct stepdes step) /* // Edit command call step parameters // Return value : // zero if done or 1 on abort // Parameters : // struct stepdes step : Step data */ { double cy /* Dialog box current y coordinate */; int repflag /* Dialog box repeat flag */; int cpidx /* Command prefix index */; int csidx /* Command suffix index */; int fnlidx /* File name label parameter index */; int fnidx /* File name parameter index */; int fmidx /* File name mode parameter index */; int fdidx /* Folder name parameter index */; int lauidx /* Command launch parameter index */; int outidx /* Output index index */; int len /* Name length */; bae_dialclr(); // Init. the y coordinate cy=DIAL_TOPMARG; // Store output index controls dial_label(SCOLOFF2,cy,UPRDINDEX); outidx=bae_dialaddcontrol(PA_INT|PA_CHKLL|PA_HBRDREL,0, 0,step.parl[PARCMDIDX].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,DIAL_RIGHTEMARG,""); // Store the OK and abort button dial_okabort(cy); cy-=DIAL_SEPVSTEP; dial_hsep(cy); // Store command suffix controls dial_label(0.0,cy,UPRDCMDFILE); cpidx=dial_string(step.parl[PARCMDPREF].sval,MAXPATHLEN,CCOLOFF2,cy); dial_label(0.0,cy,UPRDCMDPARAM); cy+=DIAL_CTRVSTEP; // Store file name controls fnlidx=dial_label(0.0,cy," "+UPRDOUTEXT); fnidx=dial_string(step.parl[PARCMDPFILE].sval,MAXPATHLEN,CCOLOFF2,cy); // Store file name mode controls dial_label(0.0,cy," "+UPRDFMODE); fmidx=dial_selbox(step.parl[PARCMDPMODE].ival,CCOLOFF2,cy); dial_sbentry(1,0,UPRFMODE0); dial_sbentry(1,1,UPRFMODE1); // Store folder name controls dial_label(0.0,cy," "+UPRDPARDIR); fdidx=bae_dialaddcontrol(PA_STR,0,0,0,0.0,0.0,0.0, step.parl[PARCMDPDIR].sval,MAXPATHLEN,DIAL_LEFTMARG+CCOLOFF2,cy, SCOLOFF2+32.0-CCOLOFF2,""); bae_dialaddcontrol(PA_ACT,0,2,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+33.0,cy,0.0,UPRBRWFILENAME); cy+=DIAL_CTRVSTEP; // Store command suffix controls dial_label(0.0,cy,UPRDCMDEND); csidx=dial_string(step.parl[PARCMDSUFF].sval,MAXTEXTLEN,CCOLOFF2,cy); // Store command launch controls lauidx=bae_dialaddcontrol(PA_TOGGLE,0,0,1-step.parl[PARCMDLAUNCH].ival, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG,cy,0.0,UPRDCMDLAUNCH); cy+=DIAL_BUTVSTEP+DIAL_SEPVSTEP; // Perform the dialog input loop repflag=1; do { bae_dialsetdata(fnlidx,PA_LAB,0,0.0," "+ (step.parl[PARCMDPMODE].ival ? UPRDPARFILE : UPRDOUTEXT)); // Call the dialog function bae_setintpar(16,3009); switch (bae_dialaskparams( UPRDIALCMDPAR,0,DIAL_LEFTMARG+81.7,cy)) { case 0 : // Get data from dialog box entries bae_dialgetdata( cpidx,0,0.0,step.parl[PARCMDPREF].sval); if (step.parl[PARCMDPREF].sval=="") { bae_msgbox(2,ERRNOCMD,""); break; } bae_dialgetdata( fnidx,0,0.0,step.parl[PARCMDPFILE].sval); bae_dialgetdata( fdidx,0,0.0,step.parl[PARCMDPDIR].sval); bae_dialgetdata( fmidx,step.parl[PARCMDPMODE].ival,0.0,""); bae_dialgetdata( csidx,0,0.0,step.parl[PARCMDSUFF].sval); bae_dialgetdata( lauidx,step.parl[PARCMDLAUNCH].ival,0.0,""); step.parl[PARCMDLAUNCH].ival= 1-step.parl[PARCMDLAUNCH].ival; bae_dialgetdata( outidx,step.parl[PARCMDIDX].ival,0.0,""); repflag=0; break; // File mode change case 1 : bae_dialgetdata( fmidx,step.parl[PARCMDPMODE].ival,0.0,""); break; // Browse output folder case 2 : bae_dialgetdata( fdidx,0,0.0,step.parl[PARCMDPDIR].sval); if (bae_askdirname(step.parl[PARCMDPDIR].sval, step.parl[PARCMDPDIR].sval,UPRDOUTDIR)==0) { if ((len=strlen(step.parl[PARCMDPDIR].sval))>1 && (step.parl[PARCMDPDIR].sval[len-1]=='\\' || step.parl[PARCMDPDIR].sval[len-1]=='/')) step.parl[PARCMDPDIR].sval[len-1]='\0'; bae_dialsetdata(fdidx,PA_STR,0,0.0, step.parl[PARCMDPDIR].sval); } break; // Fail/abort case (-1) : default : return(1); } // Stop if no further repeat requests } while (repflag); return(0); } int editlaycvstep(struct stepdes step) /* // Edit layer coverage report step parameters // Return value : // zero if done or 1 on abort // Parameters : // struct stepdes step : Step data */ { string msg /* Message string */; double sy /* Dialog box sep. y coordinate */; double cy /* Dialog box current y coordinate */; int repflag /* Dialog box repeat flag */; int otidx /* Output text parameter index */; int bridx /* Bitmap resolution parameter index */; int noidx /* Negative output parameter index */; int alidx /* All layer mode index */; int boidx /* Board outline mode index */; int fididx /* Fiducial marks mode index */; int rotidx /* Rotation mode index */; int miridx /* Mirror mode index */; int htmidx /* Heat trap min. dist. index */; int htaidx /* Heat trap angle index */; int ismidx /* Isolation min. dist. index */; int brwidx /* Border width index */; int spiidx /* Split power plan isol. index */; int outidx /* Output index index */; int cunits /* Coordinate display units */; bae_dialclr(); // Init. the y coordinate cy=DIAL_TOPMARG; // Store output index controls dial_label(SCOLOFF2,cy,UPRDINDEX); outidx=bae_dialaddcontrol(PA_INT|PA_CHKLL|PA_HBRDREL,0, 0,step.parl[PARLAYCVIDX].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,DIAL_RIGHTEMARG,""); // Store the OK and abort button dial_okabort(cy); cy-=DIAL_SEPVSTEP; dial_hsep(cy); // Store layer comment controls dial_label(0.0,cy,UPRDLAYCVTEXT); otidx=dial_string(step.parl[PARLAYCVTEXT].sval,MAXPATHLEN,CCOLOFF2,cy); dial_label(0.0,cy,UPRDRES); bridx=dial_dist(4,step.parl[PARLAYCVRES].dval,CCOLOFF2,cy); if (step.parl[PARLAYCVLAYER].ival>=DOCLAYBASE) noidx=bae_dialaddcontrol(PA_TOGGLE,0,0, step.parl[PARLAYCVNEG].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG,cy,0.0,UPRDLAYCVNEG); cy+=DIAL_CTRVSTEP; sy=cy; dial_hsep(cy); // Store all layer mode controls dial_label(SCOLOFF2,cy,UPRALLLAY); alidx=dial_selbox(step.parl[PARLAYCVALLMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRALLM1); dial_sbentry(0,1,UPRALLM2); dial_sbentry(0,2,UPRALLM3); dial_sbentry(0,3,UPRALLM4); dial_sbentry(0,4,UPRALLM5); // Store border output mode controls dial_label(SCOLOFF2,cy,UPRBORDM); boidx=dial_selbox(step.parl[PARLAYCVBRDMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRBORD1); dial_sbentry(0,1,UPRBORD2); // Store fiducial markers output mode controls dial_label(SCOLOFF2,cy,UPRFIDM); fididx=bae_dialaddcontrol(PA_RBF,0,0,step.parl[PARLAYCVMRKMODE].ival, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,0.0,UPRRBOFF); bae_dialaddcontrol(PA_RBN,1,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2+7.0,cy,0.0,UPRRBON); cy+=DIAL_CTRVSTEP; // Store rotation mode controls dial_label(SCOLOFF2,cy,UPRROTM); rotidx= dial_selbox(step.parl[PARLAYCVROTMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRROT1); dial_sbentry(0,1,UPRROT2); // Store mirror mode controls dial_label(SCOLOFF2,cy,UPRMIRRM); miridx= dial_selbox(step.parl[PARLAYCVMIRMODE].ival,SCOLOFF2+CCOLOFF2,cy); dial_sbentry(0,0,UPRMIRR1); dial_sbentry(0,1,UPRMIRR2); dial_sbentry(0,2,UPRMIRR3); dial_sbentry(0,3,UPRMIRR4); dial_sbentry(0,4,UPRMIRR5); dial_sbentry(0,5,UPRMIRR6); bae_dialaddcontrol(PA_VSEP,0,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+SCOLOFF2-0.8,sy,cy-sy,""); if (step.parl[PARLAYCVLAYER].ival>=POWLAYBASE && step.parl[PARLAYCVLAYER].ival<(POWLAYBASE+POWLAYMAX)) { dial_hsep(cy); // Store heat trap angle controls dial_label(0.0,cy,UPRHTANG); htaidx=bae_dialaddcontrol(PA_RBF,0,0, step.parl[PARLAYCVPHTANG].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,0.0,UPRHTANG1); bae_dialaddcontrol(PA_RBN,1,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+CCOLOFF2+7.0,cy,0.0,UPRHTANG2); cy+=DIAL_CTRVSTEP; // Store heat trap min. distance controls dial_label(0.0,cy,UPRHTDMD); htmidx=bae_dialaddcontrol(PA_DBL|PA_DIST|PA_CHKLL,0, 5,0,0.0,0.0,step.parl[PARLAYCVPHTDMD].dval,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store isolation min. distance controls dial_label(SCOLOFF2,cy,UPRISDMD); ismidx=dial_dist(5, step.parl[PARLAYCVPISDMD].dval,CCOLOFF2+SCOLOFF2,cy); // Store border width controls dial_label(0.0,cy,UPRBRDWD); brwidx=bae_dialaddcontrol(PA_DBL|PA_DIST|PA_CHKLL,0, 5,0,0.0,0.0,step.parl[PARLAYCVPBRDWD].dval,"",0, DIAL_LEFTMARG+CCOLOFF2,cy,SB_WIDTH,""); // Store power plane isolation width controls dial_label(SCOLOFF2,cy,UPRSPPIS); spiidx=dial_dist(5, step.parl[PARLAYCVPSPPIS].dval,CCOLOFF2+SCOLOFF2,cy); } dial_hsep(cy); // Store coordinate unit controls cunits= bae_getcoorddisp() ? 2 : 0; dial_label(0.0,cy,UPRDUNIT); bae_dialaddcontrol(PA_RBF,0,2,cunits,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+CCOLOFF2,cy,0.0,UPRDUNITMM); bae_dialaddcontrol(PA_RBN,2,3,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+CCOLOFF2+7.0,cy,0.0,UPRDUNITMIL); cy+=DIAL_CTRVSTEP+DIAL_SEPVSTEP; // Perform the dialog input loop repflag=1; do { // Call the dialog function sprintf(msg, UPRDIALLAYCVPAR,layername(step.parl[PARLAYCVLAYER].ival)); bae_setintpar(16,3004); switch (bae_dialaskparams(msg,cunits,DIAL_LEFTMARG+81.7,cy)) { case 0 : bae_dialgetdata( otidx,0,0.0,step.parl[PARLAYCVTEXT].sval); bae_dialgetdata( bridx,0,step.parl[PARLAYCVRES].dval,""); if (step.parl[PARLAYCVLAYER].ival>=DOCLAYBASE) bae_dialgetdata( noidx,step.parl[PARLAYCVNEG].ival,0.0,""); else step.parl[PARLAYCVNEG].ival=0; bae_dialgetdata( alidx,step.parl[PARLAYCVALLMODE].ival,0.0,""); bae_dialgetdata( boidx,step.parl[PARLAYCVBRDMODE].ival,0.0,""); bae_dialgetdata( fididx,step.parl[PARLAYCVMRKMODE].ival,0.0,""); bae_dialgetdata( miridx,step.parl[PARLAYCVMIRMODE].ival,0.0,""); bae_dialgetdata( rotidx,step.parl[PARLAYCVROTMODE].ival,0.0,""); if (step.parl[PARLAYCVLAYER].ival>=POWLAYBASE && step.parl[PARLAYCVLAYER].ival<(POWLAYBASE+POWLAYMAX)) { bae_dialgetdata( htmidx,0,step.parl[PARLAYCVPHTDMD].dval,""); bae_dialgetdata( htaidx,step.parl[PARLAYCVPHTANG].ival,0.0,""); bae_dialgetdata( ismidx,0,step.parl[PARLAYCVPISDMD].dval,""); bae_dialgetdata( brwidx,0,step.parl[PARLAYCVPBRDWD].dval,""); bae_dialgetdata( spiidx,0,step.parl[PARLAYCVPSPPIS].dval,""); } bae_dialgetdata( outidx,step.parl[PARLAYCVIDX].ival,0.0,""); repflag=0; break; // Switch to mm units case 2 : cunits=0; break; // Switch to mil units case 3 : cunits=2; break; // Fail/abort case (-1) : default : return(1); } // Stop if no further repeat requests } while (repflag); return(0); } int editrepstep(struct stepdes step) /* // Edit report data step parameters // Return value : // zero if done or 1 on abort // Parameters : // struct stepdes step : Step data */ { double cy /* Dialog box current y coordinate */; int repflag /* Dialog box repeat flag */; int fnlidx /* File name label parameter index */; int fnidx /* File name parameter index */; int fmidx /* File name mode parameter index */; int fdidx /* Folder name parameter index */; int outidx /* Output index index */; int varidx /* Variant report index */; int len /* Name length */; bae_dialclr(); // Init. the y coordinate cy=DIAL_TOPMARG; // Store output index controls dial_label(SCOLOFF2,cy,UPRDINDEX); outidx=bae_dialaddcontrol(PA_INT|PA_CHKLL|PA_HBRDREL,0, 0,step.parl[PARREPIDX].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,DIAL_RIGHTEMARG,""); // Store the OK and abort button dial_okabort(cy); cy-=DIAL_SEPVSTEP; dial_hsep(cy); // Store file name controls fnlidx=dial_label(0.0,cy,UPRDOUTEXT); fnidx=dial_string(step.parl[PARREPFILE].sval,MAXPATHLEN,CCOLOFF2,cy); // Store file name mode controls dial_label(0.0,cy,UPRDFMODE); fmidx=dial_selbox(step.parl[PARREPFMODE].ival,CCOLOFF2,cy); dial_sbentry(1,0,UPRFMODE0); dial_sbentry(1,1,UPRFMODE1); // Store folder name controls dial_label(0.0,cy,UPRDOUTDIR); fdidx=bae_dialaddcontrol(PA_STR,0,0,0,0.0,0.0,0.0, step.parl[PARREPDIR].sval,MAXPATHLEN,DIAL_LEFTMARG+CCOLOFF2,cy, SCOLOFF2+32.0-CCOLOFF2,""); bae_dialaddcontrol(PA_ACT,0,2,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+33.0,cy,0.0,UPRBRWFILENAME); cy+=DIAL_CTRVSTEP; varidx=bae_dialaddcontrol(PA_RBF,0,0,step.parl[PARREPVAR].ival, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG,cy,0.0,UPRREPALL); bae_dialaddcontrol(PA_RBN,1,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+15.0,cy,0.0,UPRREPVAR); cy+=DIAL_CTRVSTEP+DIAL_SEPVSTEP; // Perform the dialog input loop repflag=1; do { bae_dialsetdata(fnlidx,PA_LAB,0,0.0, step.parl[PARREPFMODE].ival ? UPRDOUTFILE : UPRDOUTEXT); // Call the dialog function bae_setintpar(16,3010); switch (bae_dialaskparams( UPRDIALREPPAR,0,DIAL_LEFTMARG+81.7,cy)) { case 0 : // Get data from dialog box entries bae_dialgetdata( fnidx,0,0.0,step.parl[PARREPFILE].sval); if (step.parl[PARREPFILE].sval=="") { bae_msgbox(2,ERRNOFILEN,""); break; } bae_dialgetdata( fdidx,0,0.0,step.parl[PARREPDIR].sval); bae_dialgetdata( fmidx,step.parl[PARREPFMODE].ival,0.0,""); bae_dialgetdata( outidx,step.parl[PARREPIDX].ival,0.0,""); bae_dialgetdata( varidx,step.parl[PARREPVAR].ival,0.0,""); repflag=0; break; // File mode change case 1 : bae_dialgetdata( fmidx,step.parl[PARREPFMODE].ival,0.0,""); break; // Browse output folder case 2 : bae_dialgetdata( fdidx,0,0.0,step.parl[PARREPDIR].sval); if (bae_askdirname(step.parl[PARREPDIR].sval, step.parl[PARREPDIR].sval,UPRDOUTDIR)==0) { if ((len=strlen(step.parl[PARREPDIR].sval))>1 && (step.parl[PARREPDIR].sval[len-1]=='\\' || step.parl[PARREPDIR].sval[len-1]=='/')) step.parl[PARREPDIR].sval[len-1]='\0'; bae_dialsetdata(fdidx,PA_STR,0,0.0, step.parl[PARREPDIR].sval); } break; // Fail/abort case (-1) : default : return(1); } // Stop if no further repeat requests } while (repflag); return(0); } int editvarstep(struct stepdes step) /* // Edit variable set step parameters // Return value : // zero if done or 1 on abort // Parameters : // struct stepdes step : Step data */ { double cy /* Dialog box current y coordinate */; int vnidx /* Variable name parameter index */; int vvidx /* Variable value parameter index */; int outidx /* Output index index */; bae_dialclr(); // Init. the y coordinate cy=DIAL_TOPMARG; // Store output index controls dial_label(SCOLOFF2,cy,UPRDINDEX); outidx=bae_dialaddcontrol(PA_INT|PA_CHKLL|PA_HBRDREL,0, 0,step.parl[PARVARIDX].ival,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+SCOLOFF2+CCOLOFF2,cy,DIAL_RIGHTEMARG,""); // Store the OK and abort button dial_okabort(cy); cy-=DIAL_SEPVSTEP; dial_hsep(cy); // Store variable name controls dial_label(0.0,cy,UPRDVARNAME); vnidx=dial_string(step.parl[PARVARNAME].sval,MAXPATHLEN,10.0,cy); // Store variable value controls dial_label(0.0,cy,UPRDVARVAL); vvidx=dial_string(step.parl[PARVARVAL].sval,MAXPATHLEN,10.0,cy); cy+=DIAL_SEPVSTEP; // Call the dialog function bae_setintpar(16,3018); if (bae_dialaskparams(UPRDIALVARPAR,0,DIAL_LEFTMARG+71.7,cy)) return(1); // Get data from dialog box entries bae_dialgetdata(outidx,step.parl[PARVARIDX].ival,0.0,""); bae_dialgetdata(vnidx,0,0.0,step.parl[PARVARNAME].sval); bae_dialgetdata(vvidx,0,0.0,step.parl[PARVARVAL].sval); return(0); } void initstep(struct stepdes step) /* // Init. batch step parameters // Parameters : // struct stepdes step : Step data */ { int i /* Loop control variable */; // Check the step type switch (step.typ) { // Gerber output case STEP_GBR : step.parn=PARGBRCNT; // Clear all parameters for (i=0;i=batn) errormsg(ERRNOBATCH,batname); } newbatname=batname; // Get batch entries batn=0; if (sqlcmd(dstdb,B_SELECT,batnamefunc)!=0) // SQL/DB error sql_dberror(0); // Search batch for (i=0;imaxid) maxid=stepl[curstep].id; } // Query last ID queryid=0; if (sqlcmd(dstdb,SI_SELECT,idfunc)!=0) // SQL/DB error sql_dberror(0); if (maxid>queryid) { // Delete last ID if (sqlcmd(dstdb,SI_DELETE,NULL)!=0) // SQL/DB error sql_dberror(29); // Store new ID sprintf(sqlcommand,SI_INSERT,maxid); if (sqlcmd(dstdb,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(0); } // Store step data for (curstep=0;curstep=1) { sprintf(sqlcommand,C_INSERT, sql_quotestr(batname),stepid,i,pen); if (sqlcmd(dbname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(0); } for (i=0;i=1) { sprintf(sqlcommand,C_INSERT, sql_quotestr(batname),stepid,lay,pen); if (sqlcmd(dbname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(0); } } for (i=0;i=1) { sprintf(sqlcommand,C_INSERT, sql_quotestr(batname),stepid,lay,pen); if (sqlcmd(dbname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(0); } lay++; if ((pen=cam_getplotlaycode(lay))>=1) { sprintf(sqlcommand,C_INSERT, sql_quotestr(batname),stepid,lay,pen); if (sqlcmd(dbname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(0); } lay++; if ((pen=cam_getplotlaycode(lay))>=1) { sprintf(sqlcommand,C_INSERT, sql_quotestr(batname),stepid,lay,pen); if (sqlcmd(dbname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(0); } } if ((pen=cam_getplotlaycode(LAYERALL))>=1) { sprintf(sqlcommand,C_INSERT, sql_quotestr(batname),stepid,LAYERALL,pen); if (sqlcmd(dbname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(0); } if ((pen=cam_getplotlaycode(LAYERBRD))>=1) { sprintf(sqlcommand,C_INSERT, sql_quotestr(batname),stepid,LAYERBRD,pen); if (sqlcmd(dbname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(0); } if ((pen=cam_getplotlaycode(LAYERBTW))>=1) { sprintf(sqlcommand,C_INSERT, sql_quotestr(batname),stepid,LAYERBTW,pen); if (sqlcmd(dbname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(0); } } string outfilename(int nmode,string nspec,string dir) /* // Build output file name string // Return value : // Output file name string // Parameters : // int nmode : File name mode // string nspec : File name specification // string dir : Directory name */ { string fname /* File name */; string fpath = "" /* File path name */; int i /* Loop control variable */; // Search folder delimiter in file name fname=bae_planfname(); for (i=strlen(fname)-1;i>=0;i--) if (fname[i]=='/' || fname[i]=='\\' || fname[i]==':') // Delimiter found break; if (i>=0) fpath=strextract(bae_planfname(),0,i); // Check if output to folder if (dir!="" && dir[0]!='\\' && dir[1]!='\\') { // Check if sub folder if (fpath!="" && dir[0]!='\\' && dir[0]!='/' && dir[0]!='$' && (strlen(dir)<2 || dir[1]!=':')) dir=fpath+dir; // Check if output folder exists if (filetype(dir)!=0) bae_createdir(dir); } switch (nmode) { // File extension */ case 0 : fname=convstring(bae_planfname(),0)+nspec; if (dir!="") // Combine path and pure file name fname=dir+bae_swversion(4)+ strextract(fname,i+1,strlen(fname)); break; // Fixed file name */ case 1 : default : fname=nspec; if (dir!="") fname=dir+bae_swversion(4)+nspec; else fname=fpath+nspec; } return(strgetvarfilename(fname)); } int envtext(index L_TEXT textp,double tx,double ty,double tangle, int mirrflag,int layer,double tsize,string tstr,int textinws) /* // Scan environment variable texts // Return value : // zero if done or (-1) on error // Parameters : // index L_TEXT textp : Text index // double tx : Text X coordinate // double ty : Text Y coordinate // double tangle : Text rotation angle // int mirrflag : Text mirror flag // int layer : Text layer code // double tsize : Text size // string tstr : Text string // int textinws : Text in workspace flag */ { // Query the variable name if (envvar!="" || lay_rulequery(RS_OCPOOL,textp,RS_PCBSUBJ,RS_ENVVAR,"?s",envvar)>0) { putenv(envvar,tstr); envvar=""; } return(0); } int layersel(int layer) /* // Perform layer selection // Return value : // 0 on done, (-1) on unsopprted layer // Parameters : // int layer : Layer code */ { string dstr /* Documentary layer string */; // Check if standard signal layer if (layer>=0 && layer=POWLAYBASE && layer<(POWLAYBASE+POWLAYMAX)) { bae_storemenuiact(1,menuoff+3,LMB); bae_storetextiact(1,itoa(layer-POWLAYBASE+1)); return(0); } // Check if all layers if (layer==LAYERALL) { bae_storemenuiact(1,menuoff+4,LMB); return(0); } // Check if inner layers if (layer==LAYERBTW) { bae_storemenuiact(1,menuoff+5,LMB); return(0); } // Check if documentary layer if (layer>=DOCLAYBASE) { bae_storemenuiact(1,menuoff+6,LMB); // Do the layer selection sprintf(dstr,"d%ds",(layer-DOCLAYBASE)/DOCLAYSHIFT+1); // Check if both sides layer code if (layer%4==2) dstr+="a"; else dstr+=itoa((layer%4)+1); bae_storetextiact(1,dstr); return(0); } // Check if board outline if (layer==LAYERBRD) { bae_storemenuiact(1,menuoff+7,LMB); return(0); } // Check if combined output if (layer==LAYERCOMB) { bae_storemenuiact(1,menuoff+8,LMB); bae_storetextiact(1,""); return(0); } // Unsupported layer return(-1); } void getvardata() /* // Get variant data */ { int i /* Loop control variable */; // Query the current active variant if (bae_planddbclass()!=DDBCLLAY || lay_rulequery(RS_OCPLAN,0,RS_PCBSUBJ,RS_VARIANT,"?d",varnumber)<1) // Set default variant varnumber=0; act_flag=0; // Select all table entries varn=0; sqlcmd(bae_planfname(),V_SELECTA,datafunc); // Check if active variant defined if (!act_flag && varnumber!=0) { for (i=varn;i>0;i--) if (varl[i-1].varnum0;i--) varl[i]=varl[i-1]; // Insert variant data varl[0].varnum=0; varl[0].varname=REPVARBASE; varn++; } } int datafunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Data query callback function // Return value : // zero if done or (-1) on data error // Parameters : // string dstr : String/Date data // int dint : Integer/Boolean data // double ddbl : Float data // int dval : Data valid flag // int dtype : Data type // string dtable : Data table name // string dfield : Data field name // int didx : Data output field index */ { int i /* Loop control variable */; // Check the data field switch (didx) { case 1 : curvarnum=dint; break; case 2 : // Search the insert position for (i=varn;i>0;i--) if (varl[i-1].varnum