/* SCMVAR (SCM) -- Schematic Sheet Variant Selection */ /* SCMVAR (SCM) -- Auswahl Schaltplanvariante */ /* // Copyright (c) 1999-2012 Oliver Bartels F+E, Muenchen // Author: Roman Ludwig // Changes History: // rl (120427) RELEASED FOR BAE V7.8. // rl (101019) RELEASED FOR BAE V7.6. // rl (091027) RELEASED FOR BAE V7.4. // rl (081014) RELEASED FOR BAE V7.2. // rl (080526) ENHANCEMENT: // Added variant oprhant data check for new variants. // rl (071029) RELEASED FOR BAE V7.0. // rl (070126) ENHANCEMENT: // Added user specific program call support. // rl (060829) RELEASED FOR BAE V6.8. // rl (060227) ENHANCEMENT: // Added variant data scan and delete functions. // rl (050906) RELEASED FOR BAE V6.6. // rl (040811) RELEASED FOR BAE V6.4. // rl (030904) RELEASED FOR BAE V6.2. // rl (021209) RELEASED FOR BAE V6.0. // rl (021106) ENHANCEMENT: // Added processing of multiple sheets for variant functions. // rl (020618) RELEASED FOR BAE V5.4. // rl (010702) RELEASED FOR BAE V5.0. // rl (010702) ENHANCEMENT: // Added optional transfer of variant specific data from // current to new variant. // rl (000509) RELEASED FOR BAE V4.6. // rl (990803) RELEASED FOR BAE V4.4. // rl (990511) ORIGINAL CODING. // // DESCRIPTION // // The scmvar User Language program enables the user to add/select // variants for the currently loaded schematic sheet. */ // Includes #include "pop.ulh" // User Language popup utilities #include "sql.ulh" // User Language SQL utilities #include "scm.ulh" // User Language SCM utilities // Disable undo state request #pragma ULCALLERNOUNDO // Messages string UPRABORT = M_UPRABORT(); string UPRVARIANT = M("Variante/Funktion selektieren!", "Select Variant/Function!"); string UPRVARADD = M("(Neue Variante)","(New Variant)"); string UPRVARSCAN = M("(Plan Variantendatenscan)", "(Sheet Variant Data Scan)"); string UPRVARDDEL = M("(Plan ALLE Plotsichtbarkeiten und Variantenattribute loeschen)", "(Sheet Deletion of ALL Plot Visibilities and Variant Attributes)"); string UPRVARNUM = M("Variantennumer ? ","Variant number ? "); string UPRVARNAME = M("Name fuer Variante %d ? ","Name of Variant %d ? "); string UPRVARFCT = M("Funktion fuer Variante %d '%s' waehlen!", "Select Function for Variant %d '%s'!"); string UPRVARFCT1 = M("A&ktivieren","A&ctivate"); string UPRVARFCT2 = M("&Umbenennen","&Rename"); string UPRVARFCT3 = M("&Loeschen","&Delete"); string UPRVARFCT4 = M("&Variante Plotsichtbarkeiten und Attribute loeschen", "Delete &Variant Plot Visiblities and Attributes"); string UPRCOPYVAR = M("Einstellungen der aktuellen Variante uebertragen ?", "Copy definitions of current variant ?"); string UPRDELVDATA = M("Alle Plotsichtbarkeiten und Variantenattribute dieses Schaltplans loeschen ? ", "Delete all plot visibilities and variant attributes of current sheet ? "); string UPRVDCONF1 = M("Variantenabhaengige Attribute und/oder Plotsichtbarkeiten ", "Found variant dependant attributes/plot visibilities "); string UPRVDCONF2 = M("fuer neue Variante gefunden! Loeschen ?", "for new variant! Delete ?"); string UPRVACONF = M("Variante %d komplett loeschen ?", "Delete variant %d ?"); string UPRVCONF1 = M("Variantenabhaengige Attribute und/oder Plotsichtbarkeiten ", "Delete variant dependant attributes/plot visibilities "); string UPRVCONF2 = M("fuer Variante %d loeschen ?", "for variant %d ?"); string REPVARIANT1 = M("Datei : %s","File : %s"); string REPVARIANT2 = M("Plan : %s","Sheet : %s"); string REPVARIANT3 = M("Varianten :","Variants :"); string REPVARIANT3A = M("Varianten mit eigenen Daten :", "Variants with data :"); string REPVARENT = M("%s%2d %s","%s%2d %s"); string REPVARBASE = M("Basisvariante","Base Variant"); string REPVARNAMED = M("Variante %d '%s' :","Variant %d '%s' :"); string REPVARUNNAMED = M("Variante %d unbenannt :","Variant %d unnamed :"); string REPATTRDATA = M(" variantenspezifische Attribute", " variant specific attributes"); string REPPDISDATA = M(" variantenspezifische Plotsichtbarkeiten", " variant specific plot visibilities"); string REPNOVDATA = M("Keine variantenspezifischen Daten gefunden!", "No variant specific data found!"); string ERRINVNUM = M("Ungueltige Variantennummer!", "Invalid variant number!"); string ERRVARUNDEF = M("Im Projekt ist keine Variante '%s' definiert!", "Project contans no variant named '%s'!"); string ERRVARDBL = M("Variante %d ist bereits definiert!", "Variant %d is already defined!"); string ERRVARACT = M("Variante %d ist aktiviert!", "Variant %d is activ!"); string ERRVARBASE = M("Basisvariante ist nicht loeschbar!", "Base Variant cannot be deleted!"); string ERRVARMAX = M("Maximal %d Varianten erlaubt!", "Maximum of %d variants exceeded!"); string ERRVARUSE = M("Variantenname '%s' bereits fuer Variante %d vergeben!", "Variant name '%s' already in use for variant %d!"); string ERRDBCREA = M("SQL/DB-Datei '%s' kann nicht angelegt werden!", "Error creating SQL/DB file '%s'!"); // INI file parameter name definitions #define PAR_VARATTRCHK "VARATTRCHK_SCM"// Variant attribute check flag #define PAR_USERVPROG "USERVPROG_STD" // User defined var. set program name #define PAR_CHECKPVIS "NOPLCCHK_SCM" // SCM part $noplc consistency check // SQL command definitions #define V_CREATE "create table varinfo (variant integer,name string);" #define V_DELETE "delete from varinfo where variant=%d;" #define V_INSERT "insert into varinfo values(%d,%s);" #define V_HELP "help varinfo;" #define V_SELECTA "select from varinfo;" #define V_SELECTI "select variant from varinfo where name=%s;" #define V_SELECTN "select name from varinfo where variant=%d;" #define V_SELECTC "select variant from varinfo where name=%s;" string sqlcommand /* SQL command string */; // Globals #define UL_BAEZOOM "bae_zoom" // ULP: Zoom Action static string uservprog = bae_inistrval(PAR_USERVPROG,"") /* User definied var. set prog. name */; struct vardesc { // Variant descriptor int varnum /* Variant number */; int attrflag /* Variant attribute data */; int pdisflag /* Variant plot disable data */; string varname /* Variant name */; } varl[] /* Variant list */; int varn = 0 /* Variant count */; int maxvar = 0 /* Max. variant number */; int act_var = 0 /* Active variant */; int act_flag = 0 /* Active variant defined flag */; int curvarnum /* Current variant number */; string curvarname /* Current variant name */; struct varscandesc { // Variant scan descriptor int attrflag /* Variant attribute data */; int pdisflag /* Variant plot disable data */; string varname /* Variant name */; } vdatl[] /* Variant data list */; STRINGS headl /* Menu header string list */; int headn = 0 /* Menu header string count */; STRINGS entryl /* Menu entry string list */; int entryn = 0 /* Menu entry string count */; int cflag = 0 /* Change flag */; // Main program void main() { index C_FIGURE fig /* Figure list index */; index C_CONSEG conseg /* Connection segment index */; index C_NREF nref /* Named reference index */; index C_ATTRIBUTE attr /* Attribute index */; int alen /* Attribute name length */; int abortflag = 0 /* Loop abort flag */; int plotdis /* Plot disable flag */; int varnum /* Variant number */; string varname /* Variant name */; string msg /* Message string */; string answer /* Answer string */; string plotdispred /* Act. var. plot dis. pred. name */; string rulename /* Predicate rule name */; string attrsuffix /* Attribute name suffix */; string lastname /* Last reference name */; string fname /* File name */; string ename /* Element name */; string oename /* Old element name */; string rulel[] /* Rule list */; int rulen /* Rule count */; string rn /* Rule name buffer */; int rnc /* Rule name count */; int vidx /* Variant index */; int sidx, eidx /* Variant number start/end index */; int fct /* Menu function */; int chkpvis /* Check plot visibility flag */; int intval /* Integer value */; int i /* Loop control variable */; // Abort if invalid plan class if (bae_planddbclass()!=DDBCLSCM) error_class(); // Init. database dbinit(); do { // Build the variant name menu sprintf(headl[0],REPVARIANT1,fname=bae_planfname()); sprintf(headl[1],REPVARIANT2,oename=bae_planename()); headl[2]=REPVARIANT3; headl[3]=""; headn=4; // Get the active variant act_flag=0; // Select all table entries varn=0; sqlcmd(fname,V_SELECTA,datafunc); // Check if active variant defined if (!act_flag) { 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++; } // Add the new variant list item entryl[0]=UPRVARADD; entryl[1]=UPRVARSCAN; entryl[2]=UPRVARDDEL; entryn=3; // Build the variant selection list maxvar=0; for (i=0;imaxvar) maxvar=varl[i].varnum; entryn++; } bae_setintpar(16,3077); switch (answer=popupmenu(4,UPRVARIANT,headl,headn,entryl, entryn,UINPOPABORT,0,0,0,headn+entryn+2,0,0,"")) { // Add variant case UPRVARADD : // Suggest next after current highest variant number varnum=0; for (i=0;i=varnum) varnum=varl[i].varnum; varnum++; // Ask for variant number if (askint(varnum,UPRVARNUM,2) || varnum<0) error(ERRINVNUM); if (varnum>MAXVARIANT) { sprintf(msg,ERRVARMAX,varnum); bae_msgbox(2,msg,""); break; } if (varnum>maxvar) maxvar=varnum; // Select variant table entry sprintf(sqlcommand,V_SELECTN,varnum); curvarname=""; sqlcmd(fname,sqlcommand,ndatafunc); if (curvarname!="") { sprintf(msg,ERRVARDBL,varnum); bae_msgbox(2,msg,""); break; } // Get destination table name sprintf(msg,UPRVARNAME,varnum); if ((varname=askstr(msg,MAXTEXTLEN))=="" || varname==UINPOPABORT) error_abort(); curvarnum=(-1); sprintf(sqlcommand,V_SELECTI,sql_quotestr(varname)); sqlcmd(fname,sqlcommand,datafunc); if (curvarnum!=(-1)) { sprintf(msg,ERRVARUSE,varname,curvarnum); bae_msgbox(2,msg,""); break; } // Insert the new variant definition sprintf(sqlcommand,V_INSERT,varnum,sql_quotestr(varname)); sqlcmd(fname,sqlcommand,NULL); // Check if orphant data for new variant if (varattrcheck(varnum)) break; if (verify(UPRCOPYVAR,0)!=1) break; // Save current state for undo if (cflag==0) { bae_callmenu(MNU_BAESAVESTATE); cflag=1; } // Activate variant rsc_assplanintpred(1,RS_VARIANT,varnum,0,"scm_variant_*"); rsc_assplanstrpred(1,RS_VARNAME,varname,"",""); rsc_assplanintpred(1,RS_MAXVAR,maxvar,0,""); bae_postprocess(); chkpvis=bae_iniintval(PAR_CHECKPVIS,0); intval=0; varset(PAR_CHECKPVIS,intval); bae_setintpar(22,1); bae_callmenu(MNU_SCMSAVELEM); bae_setintpar(22,0); // Get source attribute suffix name sprintf(attrsuffix,"\003%02d\003",act_var); // Build the plot disable predicate name sprintf(plotdispred,"%s%d",RS_VARPLOTDIS,act_var); // Build the plot disable predicate rule name sprintf(rulename,":%s:%s%d=1;",RS_SCMSUBJ,RS_VARPLOTDIS,varnum); act_var=varnum; // Loop for all sheets ename=""; while (scanddbenames(fname,DDBCLSCM,ename)==1) { // Save current plan bae_setintpar(22,1); bae_callmenu(MNU_SCMSAVELEM); bae_setintpar(22,0); // Load next plan if (bae_planename()!=ename) { if (bae_planfname()==fname) bae_setintpar(22,1); loadddbelem(fname,ename,DDBCLSCM); } // Transfer figure list plot disable flags forall (fig where fig.TYP!=C_FIGCON && fig.RULEOBJID>=0 && cap_rulequery(RS_OCFIG,fig,RS_SCMSUBJ, plotdispred,"?d",plotdis)>0 && plotdis==1) { // Get the rule list rulen=rsc_getfigrules(fig,rulel); // Add new rule rulel[rulen]=rulename; if (cap_rulefigatt(fig,rulel)) rsc_error(-1); } // Transfer connection segment plot disable flags forall (conseg where conseg.RULEOBJID>=0 && cap_rulequery(RS_OCCON,conseg,RS_SCMSUBJ, plotdispred,"?d",plotdis)>0 && plotdis==1) { // Get the rule list rulen=rsc_getconrules(conseg,rulel); // Add new rule rulel[rulen]=rulename; // Add new rule if (cap_ruleconatt(conseg,rulel)) rsc_error(-1); } } bae_postprocess(); bae_setintpar(22,1); bae_callmenu(MNU_SCMSAVELEM); bae_setintpar(22,0); varset(PAR_CHECKPVIS,chkpvis); // Loop for all sheets ename=""; while (scanddbenames(fname,DDBCLSCM,ename)==1) { // Load next plan if (bae_planename()!=ename) { if (bae_planfname()==fname) bae_setintpar(22,1); loadddbelem(fname,ename,DDBCLSCM); } lastname=""; forall (nref) { if (nref.NAME==lastname) continue; forall (attr of nref) { // Get attribute name length alen=strlen(attr.NAME); // Check if source variant attr. if (strextract(attr.NAME,alen-4,alen)== attrsuffix) scm_setpartattrib(nref.NAME, strextract(attr.NAME,0,alen-5), attr.VALUE,3); } lastname=nref.NAME; } bae_setintpar(22,1); bae_callmenu(MNU_SCMSAVELEM); bae_setintpar(22,0); } // Reload original plan if (bae_planename()!=oename) { bae_setintpar(22,2); loadddbelem(fname,oename,DDBCLSCM); } else { // Redraw the screen bae_callmenu(MNU_BAEREDISPL); } // Redisplay variant number ulsystem(UL_BAEZOOM,0); break; // Scan variant specific data case UPRVARSCAN : // Init. data for (i=0;i=0) if ((rnc=cap_getrulecnt(RS_OCFIG,fig))>0) // Scan the rule name list for (i=0;i0;eidx--) if (rn[eidx]=='=') break; for (sidx=eidx-1;sidx>0;sidx--) if (!isdigit(rn[sidx])) break; vdatl[atoi(strextract( rn,sidx+1,eidx))].pdisflag=1; } forall (conseg where conseg.RULEOBJID>=0) if ((rnc=cap_getrulecnt(RS_OCCON,conseg))>0) // Scan the rule name list for (i=0;i0;eidx--) if (rn[eidx]=='=') break; for (sidx=eidx-1;sidx>0;sidx--) if (!isdigit(rn[sidx])) break; vdatl[atoi(strextract( rn,sidx+1,eidx))].pdisflag=1; } // Get attribute suffix pattern attrsuffix="*\003*\003"; forall (nref) forall (attr of nref) // Check if deleted variant attr. if (strmatch(attr.NAME,attrsuffix)) { eidx=strlen(attr.NAME); vdatl[atoi(strextract( attr.NAME,eidx-3,eidx-1))].attrflag=1; } // Display report sprintf(headl[0],REPVARIANT1,fname=bae_planfname()); sprintf(headl[1],REPVARIANT2,oename=bae_planename()); headl[2]=REPVARIANT3A; headn=3; entryn=0; for (i=0;i=0) { // Get the rule list rulen=rsc_getfigrules(fig,rulel); // Search variant rules for (i=0;i=0) { // Get the rule list rulen=rsc_getconrules(conseg,rulel); // Search variant rules for (i=0;i=varn) vidx=0; } } else if (answer=="-") { if (varn==1) { vidx=act_var; } else { if ((vidx=act_var-1)<0) vidx=varn-1; } } else { // Check if variant entry selected for (vidx=0;vidx=varn) { if (!isdigit(answer[0]) || (varnum=atoi(answer))<0) { if (answer!="") errormsg(ERRVARUNDEF,answer); abortflag=1; break; } for (vidx=0;vidx=varn) { if (answer!="") errormsg(ERRVARUNDEF,answer); abortflag=1; break; } } // Select the variant process function sprintf(msg,UPRVARFCT, varl[vidx].varnum,varl[vidx].varname); bae_promptdialog(msg); switch (fct=bae_askmenu(5, (act_var==varl[vidx].varnum ? "," : "")+UPRVARFCT1,UPRVARFCT2, (varl[vidx].varnum==0 ? "," : "")+UPRVARFCT3,UPRVARFCT4, UPRABORT)) { // Activate case 0 : if (act_var==varl[vidx].varnum) break; // Save current state for undo if (cflag==0) { bae_callmenu(MNU_BAESAVESTATE); cflag=1; } act_var=varl[vidx].varnum; rsc_assplanintpred(1,RS_VARIANT, act_var,0,"scm_variant_*"); rsc_assplanstrpred(1,RS_VARNAME, varl[vidx].varname,"",""); rsc_assplanintpred(1,RS_MAXVAR,maxvar,0,""); // Redraw the screen bae_callmenu(MNU_BAEREDISPL); // Redisplay variant number ulsystem(UL_BAEZOOM,0); // Check if extra user specific ULC call requested if (uservprog!="") ulsystem(uservprog,0); abortflag=1; break; // Rename case 1 : // Get destination table name sprintf(msg,UPRVARNAME,varl[vidx].varnum); if ((varname=bae_readedittext(msg,varl[vidx].varname, MAXTEXTLEN))=="" || varname==UINPOPABORT) error_abort(); curvarnum=(-1); sprintf(sqlcommand,V_SELECTC,sql_quotestr(varname)); sqlcmd(fname,sqlcommand,datafunc); if (curvarnum!=(-1)) { sprintf(msg,ERRVARUSE,varname, curvarnum); bae_msgbox(2,msg,""); break; } // Delete the old variant entry sprintf(sqlcommand,V_DELETE,varl[vidx].varnum); sqlcmd(fname,sqlcommand,NULL); // Insert the new variant definition sprintf(sqlcommand,V_INSERT,varl[vidx].varnum, sql_quotestr(varname)); sqlcmd(fname,sqlcommand,NULL); varl[vidx].varname=varname; // Save current state for undo if (cflag==0) { bae_callmenu(MNU_BAESAVESTATE); cflag=1; } if (varl[vidx].varnum==act_var) { rsc_assplanstrpred(1,RS_VARNAME,varname,"",""); // Redraw the screen bae_callmenu(MNU_BAEREDISPL); } break; // Delete case 2 : // Delete variant data only case 3 : if (fct==2) { if ((varnum=varl[vidx].varnum)==0) { bae_msgbox(2,ERRVARBASE,""); break; } if (act_var==varnum) { sprintf(msg,ERRVARACT,varnum); bae_msgbox(2,msg,""); break; } sprintf(msg,UPRVACONF,varnum); } else { varnum=varl[vidx].varnum; sprintf(msg,UPRVCONF1+UPRVCONF2,varnum); } // Confirm variant data deletion if (!bae_msgboxverify(msg,"")) break; // Save current state for undo if (cflag==0) { bae_callmenu(MNU_BAESAVESTATE); cflag=1; } if (fct==2) { sprintf(sqlcommand,V_DELETE,varnum); sqlcmd(fname,sqlcommand,NULL); } // Build the plot disable predicate name sprintf(plotdispred,"%s%d", RS_VARPLOTDIS,varnum); // Build the plot disable predicate rule name sprintf(rulename,":%s:%s%d=1;", RS_SCMSUBJ,RS_VARPLOTDIS,varnum); // Loop for all sheets ename=""; while (scanddbenames(fname,DDBCLSCM,ename)==1) { bae_setintpar(22,1); bae_callmenu(MNU_SCMSAVELEM); bae_setintpar(22,0); // Load next plan if (bae_planename()!=ename) { if (bae_planfname()==fname) bae_setintpar(22,1); loadddbelem(fname,ename,DDBCLSCM); } // Delete figure list plot disable flags forall (fig where fig.TYP!=C_FIGCON && fig.RULEOBJID>=0 && cap_rulequery(RS_OCFIG,fig,RS_SCMSUBJ, plotdispred,"?d",plotdis)>0 && plotdis==1) { // Get the rule list rulen=rsc_getfigrules(fig,rulel); // Search rule for (i=0;i=0 && cap_rulequery(RS_OCCON,conseg,RS_SCMSUBJ, plotdispred,"?d",plotdis)>0 && plotdis==1) { // Get the rule list rulen=rsc_getconrules(conseg,rulel); // Search rule for (i=0;i0;i--) if (varl[i-1].varnum=0 && (rn=rsc_getfigrules(fig,rl))>0) for (i=0;i=0 && (rn=rsc_getconrules(conseg,rl))>0) for (i=0;i=0 && (rn=rsc_getfigrules(fig,rl))>0) { varpfound=0; for (i=0;i=0 && (rn=rsc_getconrules(conseg,rl))>0) { varpfound=0; for (i=0;i