/* GED_MS (GED) -- GED Mouse Action */ /* GED_MS (GED) -- GED Mausaktion */ /* -- EXECUTED AFTER LEFT MOUSE BUTTON ACTIVATION IN WORK AREA -- */ /* // Copyright (c) 1999-2013 Bartels System GmbH, Muenchen // Author: Roman Ludwig // Changes History: // rl (131029) RELEASED FOR BAE V8.0. // rl (120427) RELEASED FOR BAE V7.8. // rl (111104) ENHANCEMENT: // Added corner delete loop functionality. // rl (101019) RELEASED FOR BAE V7.6. // rl (100305) ENHANCEMENT: // Added drag&drop functionality. // rl (091021) RELEASED FOR BAE V7.4. // rl (081014) RELEASED FOR BAE V7.2. // rl (080723) ENHANCEMENT: // Added element loop operation mode. // rl (080401) ENHANCEMENT: // Added center/pan window function. // rl (080114) ENHANCEMENT: // Added multiline text context functions. // rl (071029) RELEASED FOR BAE V7.0. // rl (060829) RELEASED FOR BAE V6.8. // rl (051208) ENHANCEMENT: // Added left/right rotate element functions. // Added support for control and alt keys. // rl (050913) RELEASED FOR BAE V6.6. // rl (050530) ENHANCEMENT: // Added support for element attached context functions. // rl (040906) RELEASED FOR BAE V6.4. // rl (040109) ENHANCEMENT: // Added pad macro load support on padstack level. // rl (031121) ENHANCEMENT: // Added trace segment movement support in move mode. // Changed polygon move mode to corner/segment move. // rl (030904) RELEASED FOR BAE V6.2. // rl (030312) ENHANCEMENT: // Added full pick element selection support. // rl (021209) RELEASED FOR BAE V6.0. // rl (021026) ENHANCEMENT: // Added figure element type set support. // rl (020618) RELEASED FOR BAE V5.4. // rl (010718) BUGFIX/PATCH: // Context menu Place Data Query function call fixed. // rl (010625) RELEASED FOR BAE V5.0. // rl (010621) ENHANCEMENT: // Added program calling sequence support. // Added placement query to context functions. // rl (001113) ENHANCEMENT: // Implemented mouse operation mode. // rl (000823) RELEASED FOR BAE V4.6. // rl (000823) ENHANCEMENT: // Added pad functions on padstack level. // rl (000124) ENHANCEMENT: // Added macro load function. // rl (991102) ORIGINAL CODING. // // DESCRIPTION // // The ged_ms User Language program is automatically activated when // pressing the left mouse button in the work area while the program is idle. // Depending on the activated mouse mode ged_ms lists a menu of functions for // the element at the given mouse position or performs the specified action // for the element. */ // Includes #include "pop.ulh" // User Language popup utilities #include "lay.ulh" // User Language layout utilities // Disable undo state request #pragma ULCALLERNOUNDO // Messages string UPRABORT = M_UPRABORT(); string UPRMOUSEDRAG = M("Mausparameter","Mouse Settings"); string UPRMODE = M("Maus Dragmodus","Mouse Drag Mode"); string UPRMODE1 = M("&Mausklickselektion","&Click to Move"); string UPRMODE2 = M("&Drag && Drop","&Drag && Drop"); string UPREDLOOP = M("Ecke(n) Modus","Corner(s) Mode"); string UPREDLOOP1 = M("E&inzelecke","&Single Corner"); string UPREDLOOP2 = M("&Ecken","&Corners"); string UPRANGREL = M("Winkelfreigabe","Angle Release"); string UPRANGREL1 = M("&Default","&Default"); string UPRANGREL2 = M("&Automatisch","&Automatisch"); string UPRSELGELEM = M("Elemente zur Gruppe selektieren/deselektieren! ESC/RMB Ende.", "Group select/deselect elements! ESC/RMB end."); string UPRSELG1ELEM = M("Element zur Gruppe selektieren/deselektieren!", "Group select/deselect element!"); string UPRSELDCORN = M("Zu loeschende Ecken selektieren! ESC/RMB Ende.", "Select corner to delete! ESC/RMB end."); string UPRSELD1CORN = M("Zu loeschende Ecke selektieren!", "Select corners to delete!"); string UPRSELDELEM = M("Zu loeschende Elemente selektieren! ESC/RMB Ende.", "Select elements to delete! ESC/RMB end."); string UPRSELD1ELEM = M("Zu loeschendes Element selektieren!", "Select element to delete!"); string UPRSELMELEM = M("Zu bewegende Elemente selektieren (packen)! ESC/RMB Ende.", "Select elements to move (drag)! ESC/RMB end."); string UPRSELM1ELEM = M("Zu bewegendes Element selektieren!", "Select element to move (drag)!"); string UPRSELEELEM = M("Editierpunkte/-segmente selektieren! ESC/RMB Ende.", "Select points/segments to edit! ESC/RMB end."); string UPRSELE1ELEM = M("Editierpunkt/-segment selektieren!", "Select point/segment to edit!"); string REPDELELEM = M("%d Elemente geloescht.","%d elements deleted."); string REPDEL1ELEM = M("1 Element geloescht.","1 element deleted."); string REPDELCORN = M("%d Ecken geloescht.","%d corners deleted."); string REPDEL1CORN = M("1 Ecke geloescht.","1 corner deleted."); string REPMOVELEM = M("%d Elemente bewegt.","%d elements moved."); string REPMOV1ELEM = M("1 Element bewegt.","1 element moved."); string REPEDTELEM = M("%d Elemente editiert.","%d elements edited."); string REPEDT1ELEM = M("1 Element editiert.","1 element edited."); string ERRRUTMODE = M("Funktion im Routermodus nicht erlaubt!", "Function not permitted in Router mode!"); // Menu names string GED_3_0 = M("%Neues Bau&teil" ,"%Add &Part"); string GED_3_1 = M("&Bewegen Bauteil" ,"&Move Part"); string GED_3_2 = M("&Loeschen Bauteil" ,"&Delete Part"); string GED_3_3 = M("Nae&chstes Bauteil","Place Ne&xt Part"); string GED_3_4 = M("%Na&men aendern" ,"%&Change Part Name"); string GED_3_5 = M("&Name in Netzliste","Ne&tlist Part Name"); string GED_3_6 = M("%Pin/&Gate Swap" ,"%Pin/Gate &Swap"); string GED_3_14 = M("Pin Bewegen" ,"Move Pin"); string GED_4_0 = M("%Neue &Leiterbahn" ,"%&Add Trace"); string GED_4_19 = M("Neue fix. Leiterbahn","Add Fixed Trace"); string GED_4_23 = M("Paar/Bus platzieren","Add Pair/Bus"); string GED_4_1 = M("&Ecke einfuegen" ,"Insert &Corner"); string GED_4_2 = M("E&cke bewegen" ,"&Move Corner"); string GED_4_2A = M("Ec&ke(n) bewegen" ,"Mov&e Corner(s)"); string GED_4_18 = M("Ecke loeschen" ,"&Delete Corner"); string GED_4_3 = M("%Segment e&infuegen","%&Insert Segment"); string GED_4_4 = M("Se&gment bewegen" ,"&Move Segment"); string GED_4_5 = M("Segment &teilen" ,"&Break Segment"); string GED_4_6 = M("Segment l&oeschen" ,"Delete &Segment"); string GED_4_15 = M("%Bahn bewegen" ,"Move Trace"); string GED_4_16 = M("Bahn kopieren" ,"Copy Trace"); string GED_4_7 = M("&Bahn loeschen" ,"Delete &Trace"); string GED_4_8 = M("&Netz loeschen" ,"Delete &Net"); string GED_4_9 = M("%Bahn fi&xieren" ,"%Fi&x Trace"); string GED_4_9M = M("Bahnen fi&xieren" ,"%Fi&x Traces"); string GED_4_9A = M("Netz fixieren" ,"Fix Net"); string GED_4_10 = M("Bahn &freigeben" ,"Un&fix Trace"); string GED_4_10A = M("Netz freigeben" ,"Unfix Net"); string GED_4_12 = M("&Highlight Netz" ,"Hi&ghlight Net"); string GED_4_13 = M("&Via platzieren" ,"Place &Via"); string GED_4_14 = M("V&ia bewegen" ,"M&ove Via"); string GED_4_22 = M("Segmentbuendel bewegen","Move Segment Bundle"); string GED_5_0 = M("%Neue &Kupferflaeche","%Add Passive &Copper"); string GED_5_1 = M("Neue &Potentialflaeche","Add Acti&ve Copper"); string GED_COF = M("Neuer Fuellbereich","Add Copper Fill Area"); string GED_5_2 = M("Neue &Sperrflaeche","Add &Keep Out Area"); string GED_5_3 = M("Neue U&mrandung" ,"Add &Board Outline"); string GED_5_4 = M("Neue Dokumentarl&inie","Add Document &Line"); string GED_5_5 = M("Neue &Dokumentarflaeche","Add &Document Area"); string GED_5_7 = M("Flaeche &bewegen" ,"&Move Area"); string GED_5_8 = M("Flaeche kop&ieren" ,"&Copy Area"); string GED_5_9 = M("Flaeche g&roesser" ,"&Resize Area"); string GED_5_10 = M("Flaeche l&oeschen" ,"D&elete Area"); string GED_5_11 = M("%&Ecke einfuegen" ,"%I&nsert Corner"); string GED_5_12 = M("E&cke bewegen" ,"Move C&orner"); string GED_5_12A= M("Ecke(&n) bewegen" ,"Move Corner(&s)"); string GED_5_15 = M("Ecke loeschen" ,"Delete Corner"); string GED_5_13 = M("Se&gment bewegen" ,"Move &Segment"); string GED_5_14 = M("%Segme&nt einfuegen","%&Insert Segment"); string GED_9_10 = M("%Spiegel-Sic&ht" ,"%M&irror Display"); string GED_6_0 = M("%Neuer Te&xt" ,"%Add &Text"); string GED_6_1 = M("Text &bewegen" ,"&Move Text"); string GED_6_2 = M("Text &kopieren" ,"&Copy Text"); string GED_6_2A = M("Text ableiten" ,"Derive Text"); string GED_6_3 = M("Text &aendern" ,"&Edit Text"); string GED_6_4 = M("Text &loeschen" ,"&Delete Text"); string GED_6_5 = M("%Nam&en bewegen" ,"%Move &Name"); string GED_6_8 = M("Bohrung l&oeschen" ,"Delete Drill H&ole"); string GED_6_9 = M("Att&ribut bewegen" ,"Move A&ttribute"); string GED_6_10 = M("Bohrun&g aendern" ,"Ed&it Drill Hole"); string MI_CFILL = M("%Auffuellen einzeln","%Fill single area"); string MI_CFDEL = M("Entfernen einzeln" ,"Clear single area"); string MI_NEW = M("&Neu" ,"&New"); string MI_OPEN = M("&Laden" ,"L&oad"); string MI_RUTMODE = M("Routermodus verlassen","Terminate Router Mode"); string MI_RUT1 = M("Einzelnetz Vollrouter","Single Net Full Router"); string MI_RUT2 = M("Einzelnetz Initialrouter","Single Net Initial Router"); string MI_RUT3 = M("Einzelnetz Optimierer","Single Net Optimizer"); string MI_PARAM = M("%&Einstellungen","%&Settings"); string MI_UPBOUND = M("&Obere Elementgrenze","&Upper/Right Border"); string MI_LOBOUND = M("&Untere Elementgrenze","&Lower/Left Border"); string MI_BOUNDRCT = M("Neues Workspace &Rechteck","New Workspace &Rectangle"); string MI_SEL = M("%Selektieren/Deselektieren","%Select/Deselect"); string MI_CSEL = M("Inhalt Selektieren/Deselektieren","Select/Deselect Content"); string MI_CCSEL = M("Inhalt kreuzend Selektieren/Deselektieren","Select/Deselect Content Crossing"); string MI_TSEL = M("Bahnzug Selektieren/Deselektieren","Select/Deselect Whole Route"); string MI_MACL = M("%Laden Makr&o" ,"%Load Macr&o"); string MI_MACLW = M("Laden Makro neues Fenster" ,"Load Macro New Window"); string MI_ZOOMPAN = M("%Fenster &Mitte" ,"%Center/&Pan Window"); string MI_MSMOD = M("%Mausmodus" ,"%Mouse mode"); string MI_QPART = M("%Placedaten Ab&frage","%Place Data &Query"); string MI_FSPRT = M("%Suchen SCM-S&ymbol","%Find SCM S&ymbol"); string MI_PPART = M("Pinanschlussbauteil platzieren","Place Pin Connection Part"); string MI_VIAD = M("Via l&oeschen" ,"&Delete Via"); string MI_TWID = M("%Text St&iftbreite setzen","%Set Text Plot &Width"); string MI_UPPER = M("%Text Gro&ssschreibung","%Text &Upper Case"); string MI_LOWER = M("Text Klei&nschreibung","Text L&ower Case"); string MI_LEXT = M("%Link zu ex&terner Datei","%Li&nk to External File"); string MI_DOCU = M("Dokumentation","Documentation"); string MI_RESETGROUP = M("%&Gruppe ruecksetzen","%Reset &Group"); string MI_RESETHL = M("%Highlight/Colorieren ruecksetzen","%Reset Highlight/Color"); string MI_MOVENGROUP = M("%%Gruppe %s bewegen","%%Move Group %s"); string MI_MOVEGROUP = M("%Gruppe &bewegen","%&Move Group"); string MI_COPYGROUP = M("Gruppe &kopieren","&Copy Group"); string MI_PATTR = M("%Ba&uteilattribute","%P&art Attributes"); string MI_ATTRDEF = M("Attribute &Defaultwerte","Attributes Default &Values"); string MI_MTADD = M("Neuer Mehrzeilentext","Add Multi Line Text"); string MI_MTSIZE = M("%&Groesse setzen","%Set Si&ze"); string MI_MTLAYER = M("Lage set&zen","Set &Layer"); string MI_MDRL = M("Bohrung &bewegen","&Move Drill Hole"); string MI_PROP = M("%Eigenschaften\tP","%Properties\tP"); string MI_PRULES = M("%Planregeln","%Plan Rules"); string MI_PPREDS = M("Plan String Predikate","Plan String Predicates"); string MI_PPREDD = M("Plan Double Predikate","Plan Double Predicates"); string MI_PPREDI = M("Plan Integer Predikate","Plan Integer Predicates"); string MI_RULES = M("Regeln","Rules"); string MI_PREDS = M("String Predikate","String Predicates"); string MI_PREDD = M("Double Predikate","Double Predicates"); string MI_PREDI = M("Integer Predikate","Integer Predicates"); string UPRPART = M("Bauteil '%s'/'%s'.","Part '%s'/'%s'."); string UPRPATH = M("Leiterbahn '%s' %s, %smm.","Trace '%s' %s, %smm."); string UPRBPATH = M("Leiterbahnpaar/-bus.","Trace Pair/Bus."); string UPRPOLY = M("%s %s.","%s %s."); string UPRPOLYN = M("%s '%s' %s.","%s '%s' %s."); string UPRTEXT = M("Text '%s' %s.","Text '%s' %s."); string UPRMTEXT = M("Mehrzeilentext.","Multi Line Text."); // INI file parameter name definitions #define PAR_GROUPLOOP "GROUPLOOP_STD" // Group sel. loop mode #define PAR_MOUSEREP "MOUSEREP_STD" // Mouse command repeat mode #define PAR_MOUSEDRAG "MOUSEDRAG_STD" // Mouse drag mode #define PAR_CEDITLOOP "CEDITLOOP_STD" // Corner edit loop mode #define PAR_CEDITANGR "CEDITANGR_STD" // Corner edit angle angle release mode #define PAR_SETPOS "SETTINGMPOS_STD"// Settings menu position // Pick definitions #define L_FIGMTEXT 0x100 // Multiline text #define L_FIGTRCBUS 0x101 // Trace bus #define GV_PROPCALL "propcall" // Property function call flag #define GV_PROPX "propx" // Property query x coordinate #define GV_PROPY "propy" // Property query y coordinate int SETPOS = bae_iniintval(PAR_SETPOS,0) /* Settings menu position */; int GROUPLOOP = bae_iniintval(PAR_GROUPLOOP,0) /* Group selection pick loop */; int MOUSEREP = bae_iniintval(PAR_MOUSEREP,0) /* Mouse command repeat mode */; int MOUSEDRAG = bae_iniintval(PAR_MOUSEDRAG,0) /* Mouse drag mode */; int CEDITLOOP = bae_iniintval(PAR_CEDITLOOP,0) /* Corner edit loop mode */; int CEDITANGR = bae_iniintval(PAR_CEDITANGR,1) /* Corner edit angle release mode */; int rutmode /* Autorouter active flag */; typedef struct mnudes { // Menu definition descriptro string t /* Menu text */; string p /* Menu program name */; int c /* Class restriction */; int t2 /* Secondary type */; } MNUITEML[] /* Menu item list */; typedef struct fmnudes { // Figure index menu def. descriptor int typ /* Figure list element type */; MNUITEML iteml /* Menu item list */; } FMNUL[] /* Figure index menu list definition */; typedef struct factdes { // Figure index action descriptor int typ /* Figure list element type */; string p /* Figure list elem. program name */; string p2 /* Figure list elem. 2nd prog. name */; string p3 /* Figure list elem. 3nd prog. name */; string t /* Menu text */; string t2 /* 2nd menu text */; string t3 /* 3nd menu text */; } FACTL[] /* Figure index action list def. */; static FMNUL fmnul = { { L_FIGNREF, { // Named reference functions { MI_RUTMODE,"#417:s4:s17",DDBCLAPAR,(-1) }, { MI_RUT1,"#417:s12:ml:s17",DDBCLAPAR,(-1) }, { MI_RUT2,"#417:s13:ml:s17",DDBCLAPAR,(-1) }, { MI_RUT3,"#417:s14:ml:s17",DDBCLAPAR,(-1) }, { GED_4_8,"#408:ml",DDBCLAPAR,(-1) }, { GED_3_1,"#301:ml",(-4),(-1) }, { GED_3_2,"#302:ml",(-4),(-1) }, { MI_MOVENGROUP,"#movengrp",(-5),(-1) }, { MI_SEL,"#702:s0:s2:ml"+(GROUPLOOP ? "" : ":mr"),(-1),(-1) }, { GED_3_4,"#304:ml",(-4),(-1) }, { GED_3_5,"#305:ml",(-4),(-1) }, { GED_6_5,"#605:ml",(-4),(-1) }, { GED_6_9,"#609:ml",(-4),(-1) }, { GED_3_14,"#314:ml",DDBCLLAY,(-1) }, { GED_4_0,"#400:ml",DDBCLLAY,(-1) }, { GED_4_0,"#400:ml",DDBCLLPRT,(-1) }, { GED_4_19,"#419:ml",DDBCLLAY,(-1) }, { GED_4_19,"#419:ml",DDBCLLPRT,(-1) }, { MI_PPART,"gedpart:sl14:sl1:ml",DDBCLLAY,(-1) }, { GED_4_12,"#412:sl0:ml:mr",(-1),(-1) }, { MI_QPART,"gedpart:sl8:ml:t:mr",DDBCLLAR,(-1) }, { MI_DOCU,"gedpart:sl18:ml",DDBCLLAY,(-1) }, { MI_PATTR,"gedrule:sl10",DDBCLLAY,(-1) }, { GED_3_6,"#306:ml",(-4),(-1) }, { MI_MACL,"gedmacl:ml",(-1),(-1) }, { (bae_swconfig(0)==BAE_HighEnd ? "" : ",")+MI_MACLW,"gedmacl:'launch':ml",(-1),(-1) }, { (bae_swconfig(0)==BAE_HighEnd ? "" : ",")+MI_FSPRT, "gedpart:sl16:ml",DDBCLLAR,(-1) }, { MI_PROP,"lpintrc",(-1),(-1) }, { MI_RULES,"gedrule:sl2:ml:'single'",(-1),(-1) }, { MI_PREDS,"gedrule:sl2:ml:'string'",(-1),(-1) }, { MI_PREDD,"gedrule:sl2:ml:'double'",(-1),(-1) }, { MI_PREDI,"gedrule:sl2:ml:'integer'",(-1),(-1) }, { MI_ZOOMPAN,"#105:ml",(-1),(-1) }, { MI_MSMOD,"msmode",(-1),(-1) } } }, { L_FIGPATH, { // Trace functions { MI_RUTMODE,"#417:s4:s17",DDBCLAPAR,(-1) }, { MI_RUT1,"#417:s12:ml:s17",DDBCLAPAR,(-1) }, { MI_RUT2,"#417:s13:ml:s17",DDBCLAPAR,(-1) }, { MI_RUT3,"#417:s14:ml:s17",DDBCLAPAR,(-1) }, { GED_4_1,"#401:ml",(-4),(-1) }, { GED_4_2,"#402:ml",(-4),(-1) }, { GED_4_2A,"#402:ml",(-4),(-1) }, { GED_4_18,"#418:ml",(-4),(-1) }, { GED_4_3,"#403:ml",(-4),(-1) }, { GED_4_4,"#404:ml",(-4),(-1) }, { GED_4_22,"#422:ml",(-4),(-1) }, { GED_4_5,"#405:ml",(-4),(-1) }, { GED_4_6,"#406:ml",(-4),(-1) }, { GED_4_0,"#400:ml",(-4),(-1) }, { GED_4_15,"#415:ml",(-4),(-1) }, { GED_4_16,"#416:ml",(-4),(-1) }, { GED_4_7,"#407:ml",(-4),(-1) }, { GED_4_8,"#408:ml",DDBCLLAR,(-1) }, { GED_4_9,"#409:sl0:ml"+(GROUPLOOP ? "" : ":mr"),(-4),(-1) }, { GED_4_9A,"#409:sl1:ml"+(GROUPLOOP ? "" : ":mr"),(-4),(-1) }, { GED_4_10,"#410:sl0:ml"+(GROUPLOOP ? "" : ":mr"),(-4),(-1) }, { GED_4_10A,"#410:sl1:ml"+(GROUPLOOP ? "" : ":mr"),(-4),(-1) }, { MI_MOVENGROUP,"#movengrp",(-5),(-1) }, { MI_SEL,"#702:s1:s2:ml"+(GROUPLOOP ? "" : ":mr"),(-1),(-1) }, { MI_TSEL,"#702:s4:s2:ml"+(GROUPLOOP ? "" : ":mr"),(-1),(-1) }, { "%"+GED_4_12,"#412:sl0:ml:mr",(-1),(-1) }, { MI_PROP,"lpintrc",(-1),(-1) }, { MI_RULES,"gedrule:sl1:ml:'single'",(-1),(-1) }, { MI_PREDS,"gedrule:sl1:ml:'string'",(-1),(-1) }, { MI_PREDD,"gedrule:sl1:ml:'double'",(-1),(-1) }, { MI_PREDI,"gedrule:sl1:ml:'integer'",(-1),(-1) }, { MI_ZOOMPAN,"#105:ml",(-1),(-1) }, { MI_MSMOD,"msmode",(-1),(-1) } } }, { L_FIGTRCBUS, { // Trace bus functions { MI_RUTMODE,"#417:s4:s17",DDBCLAPAR,(-1) }, { GED_4_1,"#401:ml",(-4),(-1) }, { GED_4_2,"#402:ml",(-4),(-1) }, { GED_4_2A,"#402:ml",(-4),(-1) }, { GED_4_3,"#403:ml",(-4),(-1) }, { GED_4_4,"#404:ml",(-4),(-1) }, { GED_4_5,"#405:ml",(-4),(-1) }, { GED_4_0,"#400:ml",(-4),(-1) }, { GED_4_15,"#507:ml",(-4),(-1) }, { GED_4_16,"#508:ml",(-4),(-1) }, { GED_4_7,"#407:ml",(-4),(-1) }, { MI_MOVENGROUP,"#movengrp",(-5),(-1) }, { MI_SEL,"#702:s1:s2:ml"+(GROUPLOOP ? "" : ":mr"),(-1),(-1) }, { MI_TSEL,"#702:s4:s2:ml"+(GROUPLOOP ? "" : ":mr"),(-1),(-1) }, { "%"+GED_4_12,"#412:sl0:ml:mr",(-1),(-1) }, { MI_PROP,"lpintrc",(-1),(-1) }, { MI_RULES,"gedrule:sl0:ml:'single'",(-1),(-1) }, { MI_PREDS,"gedrule:sl0:ml:'string'",(-1),(-1) }, { MI_PREDD,"gedrule:sl0:ml:'double'",(-1),(-1) }, { MI_PREDI,"gedrule:sl0:ml:'integer'",(-1),(-1) }, { MI_ZOOMPAN,"#105:ml",(-1),(-1) }, { MI_MSMOD,"msmode",(-1),(-1) } } }, { L_FIGPOLY, { // Polygon functions { MI_RUTMODE,"#417:s4:s17",DDBCLAPAR,(-1) }, { GED_5_7,"#507:ml",(-4),(-1) }, { GED_5_8,"#508:ml",(-4),(-1) }, { GED_5_9,"#509:ml",(-4),(-1) }, { GED_5_10,"#510:ml",(-4),(-1) }, { GED_5_11,"#511:ml",(-4),(-1) }, { GED_5_12,"#512:ml",(-4),(-1) }, { GED_5_12A,"#512:ml",(-4),(-1) }, { GED_5_15,"#515:ml",(-4),(-1) }, { GED_5_14,"#514:ml",(-4),(-1) }, { GED_5_13,"#513:ml",(-4),(-1) }, { MI_MOVENGROUP,"#movengrp",(-5),(-1) }, { MI_SEL,"#702:s2:s2:ml"+(GROUPLOOP ? "" : ":mr"),(-1),(-1) }, { GED_9_10,"#909:ml",DDBCLLPRT,(-1) }, { GED_9_10,"#909:ml",DDBCLLSTK,(-1) }, { GED_9_10,"#909:ml",DDBCLLPAD,(-1) }, { MI_CSEL,"#701:s4:s2:mr:s7:ml",(-1),(-1) }, { MI_CCSEL,"#701:s4:s2:mr:s8:mr:s7:ml",(-1),(-1) }, { "%"+GED_4_12,"#412:sl0:ml:mr",(-1),L_POLYCOPFILL }, { "%"+GED_4_12,"#412:sl0:ml:mr",(-1),L_POLYCOPACT }, { "%"+GED_4_12,"#412:sl0:ml:mr",(-1),L_POLYCOPPASS }, { MI_CFILL,"#5007:s1:ml",(-1),L_POLYCOPFILL }, { MI_CFDEL,"#5007:s5:ml",(-1),L_POLYCOPFILL }, { MI_PROP,"lpintrc",(-1),(-1) }, { MI_RULES,"gedrule:sl0:ml:'single'",(-1),(-1) }, { MI_PREDS,"gedrule:sl0:ml:'string'",(-1),(-1) }, { MI_PREDD,"gedrule:sl0:ml:'double'",(-1),(-1) }, { MI_PREDI,"gedrule:sl0:ml:'integer'",(-1),(-1) }, { MI_ZOOMPAN,"#105:ml",(-1),(-1) }, { MI_MSMOD,"msmode",(-1),(-1) } } }, { L_FIGDRILL, { // Drill functions { MI_MDRL,"#610:ml:s3",(-1),(-1) }, { GED_6_8,"#608:ml",(-1),(-1) }, { GED_6_10,"#610:ml",(-1),(-1) }, { MI_MOVENGROUP,"#movengrp",(-5),(-1) }, { MI_SEL,"#702:s5:s2:ml"+(GROUPLOOP ? "" : ":mr"),(-1),(-1) }, { MI_PROP,"lpintrc",(-1),(-1) }, { MI_RULES,"gedrule:sl5:ml:'single'",(-1),(-1) }, { MI_PREDS,"gedrule:sl5:ml:'string'",(-1),(-1) }, { MI_PREDD,"gedrule:sl5:ml:'double'",(-1),(-1) }, { MI_PREDI,"gedrule:sl5:ml:'integer'",(-1),(-1) }, { MI_ZOOMPAN,"#105:ml",(-1),(-1) }, { MI_MSMOD,"msmode",(-1),(-1) } } }, { L_FIGUREF, { // Unnamed reference functions { MI_RUTMODE,"#417:s4:s17",DDBCLAPAR,(-1) }, { MI_RUT1,"#417:s12:ml:s17",DDBCLAPAR,(-1) }, { MI_RUT2,"#417:s13:ml:s17",DDBCLAPAR,(-1) }, { MI_RUT3,"#417:s14:ml:s17",DDBCLAPAR,(-1) }, { GED_4_14,"#414:ml",DDBCLLSTK,(-1) }, { MI_VIAD,"gedvia:sl6:ml:mr",DDBCLLSTK,(-1) }, { GED_3_1,"#301:ml:s3",DDBCLLPAD,(-1) }, { GED_3_2,"#302:ml",DDBCLLPAD,(-1) }, { GED_4_0,"#400:ml",DDBCLLSTK,(-1) }, { MI_MOVENGROUP,"#movengrp",(-5),(-1) }, { MI_SEL,"#702:s1:s2:ml"+(GROUPLOOP ? "" : ":mr"),DDBCLLAR,(-1) }, { MI_SEL,"#702:s0:s2:ml"+(GROUPLOOP ? "" : ":mr"),DDBCLLPAD,(-1) }, { "%"+GED_4_12,"#412:sl0:ml:mr",DDBCLLAR,(-1) }, { MI_MACL,"gedmacl:ml",DDBCLLPAD,(-1) }, { (bae_swconfig(0)==BAE_HighEnd ? "" : ",")+MI_MACLW,"gedmacl:'launch':ml",DDBCLLPAD,(-1) }, { MI_MACL,"gedvia:sl14:ml",DDBCLLAR,(-1) }, { (bae_swconfig(0)==BAE_HighEnd ? "" : ",")+MI_MACLW,"gedvia:sl14:'launch':ml",DDBCLLAR,(-1) }, { MI_PROP,"lpintrc",(-1),(-1) }, { MI_RULES,"gedrule:sl3:ml:'single'",(-1),(-1) }, { MI_PREDS,"gedrule:sl3:ml:'string'",(-1),(-1) }, { MI_PREDD,"gedrule:sl3:ml:'double'",(-1),(-1) }, { MI_PREDI,"gedrule:sl3:ml:'integer'",(-1),(-1) }, { MI_ZOOMPAN,"#105:ml",(-1),(-1) }, { MI_MSMOD,"msmode",(-1),(-1) } } }, { L_FIGTEXT, { // Text functions { MI_RUTMODE,"#417:s4:s17",DDBCLAPAR,(-1) }, { GED_6_1,"#601:ml",(-4),(-1) }, { GED_6_2,"#602:ml",(-4),(-1) }, { GED_6_2A,"tbdvlay:'t1022':ml",(-4),(-1) }, { GED_6_3,"#603:ml",(-4),(-1) }, { GED_6_4,"#604:ml",(-4),(-1) }, { MI_MOVENGROUP,"#movengrp",(-5),(-1) }, { MI_SEL,"#702:s3:s2:ml"+(GROUPLOOP ? "" : ":mr"),(-1),(-1) }, { MI_TWID,"gedtext:sl2:sl0:ml:mr",(-4),(-1) }, { MI_UPPER,"gedtext:sl6:ml:mr",(-4),(-1) }, { MI_LOWER,"gedtext:sl7:ml:mr",(-4),(-1) }, { MI_LEXT,"gedtext:sl13:ml",(-4),(-1) }, { MI_ATTRDEF,"gedrule:sl10",DDBCLLPRT,(-1) }, { MI_PROP,"lpintrc",(-1),(-1) }, { MI_RULES,"gedrule:sl4:ml:'single'",(-1),(-1) }, { MI_PREDS,"gedrule:sl4:ml:'string'",(-1),(-1) }, { MI_PREDD,"gedrule:sl4:ml:'double'",(-1),(-1) }, { MI_PREDI,"gedrule:sl4:ml:'integer'",(-1),(-1) }, { MI_ZOOMPAN,"#105:ml",(-1),(-1) }, { MI_MSMOD,"msmode",(-1),(-1) } } }, { L_FIGMTEXT, { // Multiline text functions { GED_6_1,"gedtext:sl12:sl1:ml",(-4),(-1) }, { GED_6_2,"gedtext:sl12:sl2:ml",(-4),(-1) }, { GED_6_3,"gedtext:sl12:sl3:ml",(-4),(-1) }, { GED_6_4,"gedtext:sl12:sl4:ml",(-4),(-1) }, { MI_MTSIZE,"gedtext:sl12:sl5:ml",(-4),(-1) }, { MI_MTLAYER,"gedtext:sl12:sl6:ml",(-4),(-1) }, { MI_MOVENGROUP,"#movengrp",(-5),(-1) }, { MI_SEL,"gedtext:sl12:sl9:ml",(-1),(-1) }, { MI_PROP,"lpintrc",(-1),(-1) }, { MI_RULES,"gedrule:sl4:ml:'single'",(-1),(-1) }, { MI_PREDS,"gedrule:sl4:ml:'string'",(-1),(-1) }, { MI_PREDD,"gedrule:sl4:ml:'double'",(-1),(-1) }, { MI_PREDI,"gedrule:sl4:ml:'integer'",(-1),(-1) }, { MI_ZOOMPAN,"#105:ml",(-1),(-1) }, { MI_MSMOD,"msmode",(-1),(-1) } } }, { (-1), { // New element functions { MI_RUTMODE,"#417:s4:s17",DDBCLAPAR,(-1) }, { MI_PARAM,"#5006",SETPOS ? 105 : (-1),(-1) }, { MI_UPBOUND,"#802",(-2),(-1) }, { MI_BOUNDRCT,"gedbound:s2",(-2),(-1) }, { MI_LOBOUND,"#803",(-3),(-1) }, { MI_BOUNDRCT,"gedbound:s2",(-3),(-1) }, { GED_3_0,"#300",DDBCLLAY,(-1) }, { GED_3_0,"#300",DDBCLLPRT,(-1) }, { GED_3_0,"#300",DDBCLLSTK,(-1) }, { GED_3_3,"#303",DDBCLLAY,(-1) }, { GED_3_3,"#303",DDBCLLPRT,(-1) }, { GED_4_0,"#400",DDBCLLAY,(-1) }, { GED_4_0,"#400",DDBCLLPRT,(-1) }, { GED_4_19,"#419",DDBCLLAY,(-1) }, { GED_4_19,"#419",DDBCLLPRT,(-1) }, { GED_4_23,"#423:ml",DDBCLLAY,(-1) }, { GED_4_23,"#423:ml",DDBCLLPRT,(-1) }, { GED_4_13,"#413",DDBCLLAY,(-1) }, { GED_4_13,"#413",DDBCLLSTK,(-1) }, { GED_4_9M,"#409:sl1",DDBCLLAY,(-1) }, { GED_4_9M,"#409:sl1",DDBCLLSTK,(-1) }, { GED_5_0,"#500",DDBCLLAY,(-1) }, { GED_5_0,"#500",DDBCLLPRT,(-1) }, { GED_5_0,"#500",DDBCLLPAD,(-1) }, { GED_5_1,"#501",DDBCLLAY,(-1) }, { GED_5_1,"#501",DDBCLLPRT,(-1) }, { GED_5_1,"#501",DDBCLLSTK,(-1) }, { GED_COF,"#5014",DDBCLLAY,(-1) }, { GED_5_2,"#502",DDBCLLAY,(-1) }, { GED_5_2,"#502",DDBCLLPRT,(-1) }, { GED_5_2,"#502",DDBCLLSTK,(-1) }, { GED_5_3,"#503",DDBCLLAY,(-1) }, { GED_5_4,"#504",DDBCLLAY,(-1) }, { GED_5_4,"#504",DDBCLLPRT,(-1) }, { GED_5_4,"#504",DDBCLLSTK,(-1) }, { GED_5_4,"#504",DDBCLLPAD,(-1) }, { GED_5_5,"#505",DDBCLLAY,(-1) }, { GED_5_5,"#505",DDBCLLPRT,(-1) }, { GED_5_5,"#505",DDBCLLSTK,(-1) }, { GED_5_5,"#505",DDBCLLPAD,(-1) }, { GED_6_0,"tbdvlay:'t1023'",DDBCLLAY,(-1) }, { GED_6_0,"tbdvlay:'t1023'",DDBCLLPRT,(-1) }, { GED_6_0,"tbdvlay:'t1023'",DDBCLLSTK,(-1) }, { GED_6_0,"tbdvlay:'t1023'",DDBCLLPAD,(-1) }, { MI_MTADD,"gedtext:sl12:sl0:ml",DDBCLLAY,(-1) }, { MI_MTADD,"gedtext:sl12:sl0:ml",DDBCLLPRT,(-1) }, { MI_MTADD,"gedtext:sl12:sl0:ml",DDBCLLSTK,(-1) }, { MI_MTADD,"gedtext:sl12:sl0:ml",DDBCLLPAD,(-1) }, { MI_PARAM,"#5006",SETPOS ? (-1) : 105,(-1) }, { MI_PRULES,"gedrule:sl6",DDBCLLAY,(-1) }, { MI_PRULES,"gedrule:sl6",DDBCLLPRT,(-1) }, { MI_PRULES,"gedrule:sl6",DDBCLLSTK,(-1) }, { MI_PRULES,"gedrule:sl6",DDBCLLPAD,(-1) }, { MI_PPREDS,"gedrule:sl6:'string'",DDBCLLAY,(-1) }, { MI_PPREDS,"gedrule:sl6:'string'",DDBCLLPRT,(-1) }, { MI_PPREDS,"gedrule:sl6:'string'",DDBCLLSTK,(-1) }, { MI_PPREDS,"gedrule:sl6:'string'",DDBCLLPAD,(-1) }, { MI_PPREDD,"gedrule:sl6:'double'",DDBCLLAY,(-1) }, { MI_PPREDD,"gedrule:sl6:'double'",DDBCLLPRT,(-1) }, { MI_PPREDD,"gedrule:sl6:'double'",DDBCLLSTK,(-1) }, { MI_PPREDD,"gedrule:sl6:'double'",DDBCLLPAD,(-1) }, { MI_PPREDI,"gedrule:sl6:'integer'",DDBCLLAY,(-1) }, { MI_PPREDI,"gedrule:sl6:'integer'",DDBCLLPRT,(-1) }, { MI_PPREDI,"gedrule:sl6:'integer'",DDBCLLSTK,(-1) }, { MI_PPREDI,"gedrule:sl6:'integer'",DDBCLLPAD,(-1) }, { MI_RESETHL,"#412:sl2",DDBCLLAY,(-1) }, { MI_RESETGROUP,"#700",(-1),(-1) }, { MI_MOVEGROUP,"#703",(-1),(-1) }, { MI_COPYGROUP,"#704",(-1),(-1) }, { MI_ZOOMPAN,"#105:ml",(-1),(-1) }, { MI_MSMOD,"msmode",(-1),(-1) } } } }; static FACTL fmovl = { { L_FIGNREF,"#301:ml","","",GED_3_1,"","" }, // Named reference { L_FIGPATH,"#402:ml","#404:ml","",GED_4_2,GED_4_4,"" }, // Trace { L_FIGTRCBUS,"#402:ml","#404:ml","",GED_4_2,GED_4_4,"" }, // Trace bus { L_FIGPOLY,"#512:ml","#513:ml","",GED_5_12,GED_5_13,"" }, // Polygon { L_FIGDRILL,"#610:ml:s3","","",GED_6_10,"","" }, // Drill { L_FIGUREF,"#414:ml","","",GED_4_14,"",""}, // Unnamed reference { L_FIGTEXT,"#601:ml","","",GED_6_1,"","" }, // Text { L_FIGMTEXT,"gedtext:sl12:sl1:ml","","",GED_6_1,"","" } // Multiline text }; static FACTL fedtl = { { L_FIGPATH,"#402:ml","#404:ml","#401:ml",GED_4_2,GED_4_4,GED_4_1 }, // Trace { L_FIGTRCBUS,"#402:ml","#404:ml","#401:ml",GED_4_2,GED_4_4,GED_4_1 }, // Trace bus { L_FIGPOLY,"#512:ml","#513:ml","#511:ml",GED_5_12,GED_5_13,GED_5_11 } // Polygon }; static FACTL fdell = { { L_FIGNREF,"#302:ml","","",GED_3_2,"","" }, // Named reference { L_FIGPATH,"#407:ml","","",GED_4_7,"","" }, // Trace { L_FIGTRCBUS,"#407:ml","","",GED_4_7,"","" }, // Trace bus { L_FIGPOLY,"#510:ml","","",GED_5_10,"","" }, // Polygon { L_FIGDRILL,"#608:ml","","",GED_6_8,"",""}, // Drill { L_FIGUREF,"gedvia:sl6:ml:mr","","",MI_VIAD,"","" }, // Unnamed reference { L_FIGTEXT,"#604:ml","","",GED_6_4,"","" }, // Text { L_FIGMTEXT,"gedtext:sl12:sl4:ml","","",GED_6_4,"","" } // Multiline text }; static FACTL fcdell = { { L_FIGPATH,"#418:ml","","",GED_4_18,"","" }, // Trace { L_FIGTRCBUS,"#418:ml","","",GED_4_18,"","" }, // Trace bus { L_FIGPOLY,"#515:ml","","",GED_5_15,"","" } // Polygon }; // Global variables double PI = cvtangle(180.0,1,2) /* PI-value */; double x,y /* Mouse position */; int figdis /* Figure list disable bits */; int ddbcl = bae_planddbclass() /* DDB class */; // Main program void main() { string cmdstr /* Command string */; double rotang /* Rotation angle */; int rangedis /* Range check disabled flag */; int lastpmode /* Last pick point display mode */; int lastgridlock /* Last grid lock mode */; int lastanglock /* Last angle lock mode */; int lastcornins /* Last corner insert mode */; int msmode /* Mouse context operation mode */; int rmbflag = 0 /* Right mouse button activation */; int oneelem = 0 /* Process one element only flag */; int cnt = 0 /* Element count */; int lastmsnodbl /* Old mouse double click mode */; int mspickdbl /* Pick mouse double click mode */; // Check if no element loaded if (ddbcl==DDBCLUNDEF) { // Query the function selection switch (bae_askmenu(4,MI_OPEN,MI_NEW,MI_MSMOD,UPRABORT)) { // Load case 0 : if (MOUSEREP&0x02) bae_storecmdbuf(0, "#200",bae_plainmenutext(MI_OPEN)); bae_callmenu(200); break; // New case 1 : if (MOUSEREP&0x02) bae_storecmdbuf(0, "#203",bae_plainmenutext(MI_NEW)); bae_callmenu(203); break; // Mouse mode case 2 : if (MOUSEREP&0x02) bae_storecmdbuf(0, "msmode",bae_plainmenutext(MI_MSMOD)); ulsystem("msmode",0); break; default : ; } bae_clriactqueue(); return; } // Get the figure list element type set if (varget(VAR_MSFIGDIS,figdis)) figdis=0; ged_getintpar(107,rutmode); // Check if loop operation mode requested if (bae_peekiact()) { // Get the command string if ((cmdstr=askstr("",MAXKEYLEN))==UINPOPABORT) error_abort(); if (cmdstr=="!") { rmbflag=1; if ((cmdstr=askstr("",MAXKEYLEN))==UINPOPABORT) error_abort(); } x=bae_planwsnx(); y=bae_planwsny(); switch (cmdstr[0]) { case 'G' : oneelem=1; case 'g' : lastgridlock=bae_getgridlock(); bae_setgridlock(0); bae_getintpar(39,lastmsnodbl); bae_getintpar(40,mspickdbl); bae_setintpar(39,mspickdbl ? 1 : 2); bae_promptdialog(oneelem ? UPRSELG1ELEM : UPRSELGELEM); while (bae_inpoint(x,y,x,y,14)==0) { bae_setgridlock(lastgridlock); if (grpfunc()==0) cnt++; if (oneelem) break; bae_setgridlock(0); } bae_setgridlock(lastgridlock); bae_setintpar(39,lastmsnodbl); if (cnt==0) error_abort(); exit(0); case 'D' : oneelem=1; case 'd' : chkrutmode(); lastgridlock=bae_getgridlock(); bae_setgridlock(0); bae_getintpar(39,lastmsnodbl); bae_getintpar(40,mspickdbl); bae_setintpar(39,mspickdbl ? 1 : 2); if (rmbflag) { while (bae_promptdialog( oneelem ? UPRSELD1CORN : UPRSELDCORN), bae_inpoint(x,y,x,y,14)==0) { bae_setgridlock(lastgridlock); if (elfunc(fcdell)==0) cnt++; if (oneelem) break; bae_setgridlock(0); } } else { while (bae_promptdialog( oneelem ? UPRSELD1ELEM : UPRSELDELEM), bae_inpoint(x,y,x,y,14)==0) { bae_setgridlock(lastgridlock); if (elfunc(fdell)==0) cnt++; if (oneelem) break; bae_setgridlock(0); } } bae_setgridlock(lastgridlock); bae_setintpar(39,lastmsnodbl); if (cnt==0) error_abort(); if (rmbflag) { if (cnt==1) cmdstr=REPDEL1CORN; else sprintf(cmdstr,REPDELCORN,cnt); } else { if (cnt==1) cmdstr=REPDEL1ELEM; else sprintf(cmdstr,REPDELELEM,cnt); } bae_prtdialog(cmdstr); exit(0); case 'M' : oneelem=1; case 'm' : if (rmbflag) { setdragmode(); exit(0); } chkrutmode(); lastgridlock=bae_getgridlock(); bae_setgridlock(0); bae_getintpar(39,lastmsnodbl); bae_getintpar(40,mspickdbl); bae_setintpar(39,mspickdbl ? 1 : 2); if (MOUSEDRAG) bae_setintpar(33,1); while ( bae_promptdialog(oneelem ? UPRSELM1ELEM : UPRSELMELEM), bae_inpoint(x,y,x,y,14)==0) { bae_setgridlock(lastgridlock); if (!CEDITLOOP) ged_setintpar(109,1); if (MOUSEDRAG) bae_setintpar(33,3); if (elfunc(fmovl)==0) cnt++; ged_setintpar(109,0); if (MOUSEDRAG) bae_setintpar(33,1); if (oneelem) break; bae_setgridlock(0); } bae_setintpar(33,0); bae_setgridlock(lastgridlock); bae_setintpar(39,lastmsnodbl); if (cnt==0) error_abort(); if (cnt==1) cmdstr=REPMOV1ELEM; else sprintf(cmdstr,REPMOVELEM,cnt); bae_prtdialog(cmdstr); exit(0); case 'E' : oneelem=1; case 'e' : if (rmbflag) { setdragmode(); exit(0); } chkrutmode(); ged_getintpar(0,lastpmode); ged_setintpar(0,3); screenredraw(); lastanglock=bae_getanglelock(); lastcornins=ged_getautocornins(); if (CEDITANGR) { bae_setanglelock(0); ged_setautocornins(0); } lastgridlock=bae_getgridlock(); bae_setgridlock(0); bae_getintpar(39,lastmsnodbl); bae_getintpar(40,mspickdbl); bae_setintpar(39,mspickdbl ? 1 : 2); if (MOUSEDRAG) bae_setintpar(33,1); while ( bae_promptdialog(oneelem ? UPRSELE1ELEM : UPRSELEELEM), bae_inpoint(x,y,x,y,14)==0) { bae_setgridlock(lastgridlock); if (!CEDITLOOP) ged_setintpar(109,1); if (MOUSEDRAG) bae_setintpar(33,3); if (elfunc(fedtl)==0) cnt++; ged_setintpar(109,0); if (MOUSEDRAG) bae_setintpar(33,1); if (oneelem) break; bae_setgridlock(0); } bae_setintpar(33,0); bae_setgridlock(lastgridlock); bae_setanglelock(lastanglock); ged_setautocornins(lastcornins); ged_setintpar(0,lastpmode); bae_setintpar(39,lastmsnodbl); screenredraw(); if (cnt==0) error_abort(); if (cnt==1) cmdstr=REPEDT1ELEM; else sprintf(cmdstr,REPEDTELEM,cnt); bae_prtdialog(cmdstr); exit(0); default : } } // Get the mouse position bae_wsmouse(x,y,0); // Check if shift and/or ctrl activated switch (kbstate()&0x0F) { case 0 : // Get the mouse mode if (varget(VAR_MSMODE,msmode)) msmode=MS_CONT; break; // Shift button pressed case 1 : // Get the mouse mode if (varget(VAR_MSMODES,msmode)) msmode=MS_MOVE; break; // Ctrl button pressed case 2 : // Get the mouse mode if (varget(VAR_MSMODEC,msmode)) msmode=MS_DEL; break; // Shift and Ctrl buttons pressed case 3 : // Get the mouse mode if (varget(VAR_MSMODESC,msmode)) msmode=MS_GSEL; break; // Alt left button pressed case 4 : // Get the mouse mode if (varget(VAR_MSMODEAL,msmode)) msmode=MS_LROT; break; // Alt right button pressed case 8 : case 10 : // Get the mouse mode if (varget(VAR_MSMODEAR,msmode)) msmode=MS_RROT; break; default : exit(0); } // Evaluate mouse action switch (msmode) { // Context function mode case MS_CONT : contextfunc(); break; // Delete mode case MS_DEL : chkrutmode(); elfunc(fdell); break; // Move mode case MS_MOVE : chkrutmode(); elfunc(fmovl); break; // Group selection mode case MS_GSEL : case MS_GCSEL : grpfunc(); break; // Left rotate mode case MS_LROT : chkrutmode(); if (varget(VAR_ROTANGLE,rotang)!=0) rotang=90.0; rotate(cvtangle(rotang,1,0)); break; // Right rotate mode case MS_RROT : chkrutmode(); if (varget(VAR_ROTANGLE,rotang)!=0) rotang=90.0; rotate(-cvtangle(rotang,1,0)); break; // Center/pan window mode case MS_PANW : // Warp to given position bae_clriactqueue(); bae_storemouseiact(1,x,y,2,LMB); bae_callmenu(MNU_BAEZOOMPAN); // Disable range check bae_getintpar(0,rangedis); bae_setintpar(0,1); // Set mouse cursor to new position bae_clriactqueue(); bae_storemouseiact(1,x,y,0x06,LMB); bae_inpoint(0.0,0.0,0.0,0.0,0); // Restore old range check state bae_setintpar(0,rangedis); break; case MS_NONE : default : } bae_clriactqueue(); } void contextfunc() { index L_FIGURE fig /* Figure list index */; index L_MACRO macro /* Macro index */; index L_CNET net /* Netlist index */; int ftyp /* Figure list element type */; int typ /* Current lement type */; int found /* Element found flag */; int tidx /* Type index */; int tcount /* Type count */; int icount /* Item count */; int iclass /* Current item class */; int mcount = 0 /* Menu item count */; STRINGS mnul /* Menu item list */; STRINGS seql /* Menu sequence list */; int mnuidxl[] /* Menu index list */; string msg /* Message buffer */; string predname /* Predicate name */; string grpname /* Group name */; string figgrp /* Figure element group name */; string callseq /* Call sequence */; int actflag = 0 /* Active element flag */; int res /* Menu selection result */; int i /* Loop control variable */; // Try to pick element at given position bae_clriactqueue(); bae_storemouseiact(1,x,y,2,LMB); found=ged_pickanyelem(fig, ~(figdis|(1<=0) for (mcount=0;mcount<30;mcount++) { sprintf(predname,RS_FCTSEQ,mcount); if (lay_rulequery(RS_OCFIG,fig, RS_PCBSUBJ,predname,"?s", seql[mcount])<1 || seql[mcount]=="") break; sprintf(predname,RS_FCTNAME,mcount); if (lay_rulequery(RS_OCFIG,fig, RS_PCBSUBJ,predname,"?s", mnul[mcount])<1) mnul[mcount]=""; } if (mcount==0 && (typ==L_FIGNREF || typ==L_FIGUREF)) { if (typ==L_FIGNREF) macro=fig.NREF.MACRO; else macro=fig.UREF.MACRO ; for (mcount=0;mcount<30;mcount++) { sprintf(predname,RS_FCTSEQ,mcount); if (lay_rulequery(RS_OCPOOL,macro, RS_PCBSUBJ,predname,"?s", seql[mcount])<1 || seql[mcount]=="") break; sprintf(predname,RS_FCTNAME,mcount); if (lay_rulequery(RS_OCPOOL,macro, RS_PCBSUBJ,predname,"?s", mnul[mcount])<1) mnul[mcount]=""; } } if (mcount==1) { // Call the element program if (MOUSEREP&0x02) bae_storecmdbuf(0,seql[0], bae_plainmenutext(mnul[0])); ulsystem(seql[0],0); exit(0); } } if (mcount) { actflag=1; } else { // Build the function menu icount=arylength(fmnul[tidx].iteml); // Transform router mode/group name classes for (i=0;i=bae_planwsux() && y>=bae_planwsuy()) || (iclass==(-3) && x<=bae_planwslx() && y<=bae_planwsly()) || iclass==(-1) || (typ==L_FIGUREF && iclass==fig.UREF.MACRO.CLASS) || (typ!=L_FIGUREF && iclass==ddbcl)) { // Check if restricted polygon type if (typ==L_FIGPOLY && fmnul[tidx].iteml[i].t2!=(-1) && fmnul[tidx].iteml[i].t2!=fig.POLY.TYP) continue; mnuidxl[mcount]=i; mnul[mcount]=fmnul[tidx].iteml[i].t; mcount++; } } } mnul[mcount]=UPRABORT; for (i=mcount+1;i<30;i++) mnul[i]=""; switch (typ) { case L_FIGNREF : sprintf(msg,UPRPART,fig.NAME,fig.NREF.MACRO.NAME); bae_prtdialog(msg); break; case L_FIGTEXT : sprintf(msg,UPRTEXT,fig.NAME,layername(fig.LAYER)); bae_prtdialog(msg); break; case L_FIGMTEXT : bae_prtdialog(UPRMTEXT); break; case L_FIGPATH : sprintf(msg,UPRPATH, lay_gettreeidx(fig.TREE,net) ? "" : net.NAME, layername(fig.LAYER), bae_numstring(cvtlength(fig.LINE.WIDTH,0,2),2)); bae_prtdialog(msg); break; case L_FIGTRCBUS : bae_prtdialog(UPRBPATH); break; case L_FIGPOLY : if (fig.POLY.TYP==L_POLYCOPACT || fig.POLY.TYP==L_POLYCOPFILL) sprintf(msg,UPRPOLYN, bae_plainmenutext(polytypename(fig.POLY.TYP)), lay_gettreeidx(fig.TREE,net) ? "" : net.NAME, layername(fig.LAYER)); else sprintf(msg,UPRPOLY, bae_plainmenutext(polytypename(fig.POLY.TYP)), layername(fig.LAYER)); bae_prtdialog(msg); break; } // Query the function selection bae_defmenusel(-1); bae_setstrpar(8,fig.NAME); if ((res=bae_askmenu(mcount+1,mnul[0],mnul[1],mnul[2],mnul[3], mnul[4],mnul[5],mnul[6],mnul[7],mnul[8],mnul[9],mnul[10], mnul[11],mnul[12],mnul[13],mnul[14],mnul[15],mnul[16], mnul[17],mnul[18],mnul[19],mnul[20],mnul[21],mnul[22], mnul[23],mnul[24],mnul[25],mnul[26],mnul[27],mnul[28], mnul[29],mnul[30]))<0 || res>=mcount) break; // Pre-select element if (typ!=(-1) && ged_getpickmode()) ged_setpickelem(fig); // Call the element program if (actflag) { if (MOUSEREP&0x02) bae_storecmdbuf(0, seql[res],bae_plainmenutext(mnul[res])); ulsystem(seql[res],0); } else { callseq=fmnul[tidx].iteml[mnuidxl[res]].p; if (callseq=="lpintrc" || callseq=="gedrule:sl10" || callseq=="gedpart:sl14:sl1:ml") { if (MOUSEREP&0x02) bae_storecmdbuf(0,callseq+":ml", bae_plainmenutext( fmnul[tidx].iteml[mnuidxl[res]].t)); varset(GV_PROPCALL,0); varset(GV_PROPX,x); varset(GV_PROPY,y); ulsystem(callseq,0); vardelete(GV_PROPCALL); vardelete(GV_PROPX); vardelete(GV_PROPY); } else if (callseq=="#movengrp") { bae_callmenu(MNU_GEDGRPRESE); forall (fig where fig.RULEOBJID>=0) // Query group name predicate if (lay_rulequery(RS_OCFIG,fig, RS_PCBSUBJ,RS_GROUPNAME,"?s", figgrp)>0 && figgrp==grpname) ged_elemgrpchg(fig,1); ulsystem("#703:ml",0); bae_callmenu(MNU_GEDGRPRESE); } else { if (MOUSEREP&0x02) bae_storecmdbuf(0,callseq, bae_plainmenutext( fmnul[tidx].iteml[mnuidxl[res]].t)); if (mnul[res]==GED_4_2 || mnul[res]==GED_5_12) ged_setintpar(109,1); ulsystem(callseq,0); ged_setintpar(109,0); } } break; } } int elfunc(FACTL fctl) /* // Element function // Return value : // zero if element found or (-1) on element not found // Parameter : // FACTL fctl : Element action list */ { index L_FIGURE fig /* Figure list index */; index L_FIGURE lastfig /* Last figure list element */; index L_FIGURE newfig /* New figure list element */; int lastexists /* Last element exists flag */; int ftyp /* Figure list element type */; int typ /* Current element type */; int tidx /* Type index */; int tcount /* Type count */; int abortflag /* Abort flag */; // Try to pick element at given position bae_clriactqueue(); bae_storemouseiact(1,x,y,2,LMB); if (ged_pickanyelem(fig, ~(figdis|(1<=0 && lay_rulequery(RS_OCFIG,fig,RS_PCBSUBJ,RS_MTEXTID,"?s","")>0) { ged_setpickelem(fig); ulsystem("gedtext:sl12:sl9:ml",0); } else { ged_elemgrpchg(fig,6); ged_drawelem(fig,DM_SET); // Check if pattern highlight if ((bae_getcolor(LAYERHLG)&0x300000)==0x300000) screenredraw(); } return(0); } bae_prtdialog(""); return(-1); } void chkrutmode() /* // Check if autorouter mode active */ { if (rutmode) error(ERRRUTMODE); } void setdragmode() /* // Set mouse drag mode */ { double pcol = 15.0 /* Parameter column */; double cy /* Dialog box current y coordinate */; int modidx = (-1) /* Drag mode dialog box item idx. */; int clidx = (-1) /* Corner loop dialog box item idx. */; int aridx = (-1) /* Ang. release dialog box item idx. */; int repflag /* Repeat flag */; int res /* Result */; int varidx /* INI variable index */; // Check for dialog support if (bae_dialclr()) { // Set default selection bae_defmenusel(MOUSEDRAG); // Select the mouse drag mode bae_selectprompt(UPRMODE); if ((MOUSEDRAG=bae_askmenu(3, UPRMODE1,UPRMODE2,UPRABORT))<0 || MOUSEDRAG>1) error_abort(); // Set default selection bae_defmenusel(CEDITLOOP); // Select the corner edit loop mode bae_selectprompt(UPREDLOOP); if ((CEDITLOOP=bae_askmenu(3, UPREDLOOP1,UPREDLOOP2,UPRABORT))<0 || CEDITLOOP>1) error_abort(); // Set default selection bae_defmenusel(CEDITANGR); // Select the corner edit angle release mode bae_selectprompt(UPRANGREL); if ((CEDITANGR=bae_askmenu(3, UPRANGREL1,UPRANGREL2,UPRABORT))<0 || CEDITANGR>1) error_abort(); } else { // Perform the dialog input loop repflag=1; do { bae_dialclr(); // Init. the y coordinate cy=DIAL_TOPMARG; // Store row offset mode controls modidx=dial_selboxpar(UPRMODE,MOUSEDRAG,pcol,cy); dial_sbentry(0,0,UPRMODE1); dial_sbentry(0,1,UPRMODE2); // Store corner edit loop mode controls clidx=dial_selboxpar(UPREDLOOP,CEDITLOOP,pcol,cy); dial_sbentry(0,0,UPREDLOOP1); dial_sbentry(0,1,UPREDLOOP2); // Store angle release mode controls aridx=dial_selboxpar(UPRANGREL,CEDITANGR,pcol,cy); dial_sbentry(0,0,UPRANGREL1); dial_sbentry(0,1,UPRANGREL2); dial_hsep(cy); dial_okabortini(cy,34.0+DIAL_RIGHTSMARG,28); // Call the dialog function bae_setintpar(16,3106); res=bae_dialaskparams(UPRMOUSEDRAG,0, DIAL_LEFTMARG+pcol+19.0+DIAL_RIGHTSMARG,cy); bae_dialgetdata(modidx,MOUSEDRAG,0.0,""); bae_dialgetdata(clidx,CEDITLOOP,0.0,""); bae_dialgetdata(aridx,CEDITANGR,0.0,""); switch (res) { case 0 : repflag=0; break; case 28 : varidx=0; bae_iniintset(varidx,PAR_MOUSEDRAG,MOUSEDRAG); bae_iniintset(varidx,PAR_CEDITLOOP,CEDITLOOP); bae_iniintset(varidx,PAR_CEDITANGR,CEDITANGR); bae_iniwrite(varidx); break; // Fail/abort case (-1) : default : error_abort(); } // Stop if no further repeat requests } while (repflag); } // Store the new mouse drag mode to global variable varset(PAR_MOUSEDRAG,MOUSEDRAG); varset(PAR_CEDITLOOP,CEDITLOOP); varset(PAR_CEDITANGR,CEDITANGR); exit(0); } int gettransfigtyp(index L_FIGURE fig) /* // Get the translated figure list element type // Return value : // translatd figure list element type // Parameter : // index L_FIGURE fig : Figure list index */ { int ftyp /* Figure list element type */; // Query the multiline text status if ((ftyp=fig.TYP)==L_FIGTEXT && fig.RULEOBJID>=0 && lay_rulequery(RS_OCFIG,fig,RS_PCBSUBJ,RS_MTEXTID,"?s","")>0) // Transform to virtual type ftyp=L_FIGMTEXT; // Query the trace bus status else if (ftyp==L_FIGPOLY && fig.POLY.TYP==L_POLYHTCHCOP && (fig.POLY.SUBTYP&L_POLYTRCBUS)!=0) // Transform to virtual type ftyp=L_FIGTRCBUS; return(ftyp); } // User Language program end