// $Id: boxes.hoc,v 1.58 2010/08/12 14:20:15 billl Exp $ print "Loading boxes.hoc..." {load_file("grvec.hoc")} // load_file("boxes.hoc") proc boxes () {} objref boxer, boxerl boxerl = new List() // factor(num) finds the factors that are closest together // NB: must be at top since declared external in template BX func factor () { local num, srt, ii num = $1 srt = int(sqrt(num)) for (ii=srt;iinum/ii) ii=num/ii // return smaller factor return ii } // template for putting up trays and decks begintemplate BX public mktray,mkdeck,name,boxes,map,unmap,closebox public min,max,attrnum,rows,cols,size,trnum,gl,stub,label,getg external factor,boxerl objref boxes[3], ob, gitem,gl,XO, nil, this double min[1],max[1],trnum[1] strdef temp_string_,name proc init () { min = -1 max = -1 trnum=$1 gl = new List() } //mktray(panattr) graph out from llist of a panattr proc mktray () { local ci, ri, gi, m1, m2, bi ob = $o1 cols=$3 rows=$2 size=rows*cols if (numarg()==5) {xs=$4 ys=$5} else {xs=100 ys=50} ri = 0 // count the rows gi = 0 // count the graphs boxes[0] = new VBox() boxes[0].dismiss_action("closebox()") boxes[0].intercept(1) xpanel("",1) xvarlabel(name) xpanel() for ri=0,rows-1 { boxes[2] = new HBox() boxes[2].intercept(1) for ci=0,cols-1 { gitem = new Graph(0) gitem.view(0,-100,1000,50,0,0,xs,ys) gl.append(gitem) if (ob!=nil) ob.glist.append(gitem) gi = gi+1 } boxes[2].intercept(0) boxes[2].map("") } boxes[0].intercept(0) if (strcmp(name,"")==0 && ob!=nil) name=ob.filename sprint(name,"%d:%s",trnum,name) boxes[0].map(name) } proc map() { boxes[0].map() } proc unmap() { boxes[0].unmap() } proc closebox () { local ii,ix ix=boxerl.index(this) for (ii=gl.count-1;ii>=0;ii-=1) { XO=gl.object(ii) XO.unmap } if (ob!=nil) ob.glist.remove_all gl.remove_all boxes[0].unmap boxes[0]=nil boxes[2]=nil boxerl.remove(ix) } obfunc getg () { return gl.o($1*cols+$2) } proc mkdeck () { local rows, cols, ci, ri, gi, m1, m2 ob = $o1 if (min==-1 || max==-1) { m1 = 0 m2 = ob.llist.count()-1 } else { m1=min m2=max } cnt = m2-m1+1 cols=factor(cnt) rows=cnt/factor(cnt) ri = 0 // count the rows gi = 0 // count the graphs boxes[0] = new VBox() boxes[0].intercept(1) xpanel("",1) xbutton("Next","boxes[1].flip_to(decknum=decknum+1)") xbutton("Previous","boxes[1].flip_to(decknum=decknum-1)") xpanel() boxes[1] = new Deck() boxes[1].intercept(1) for ri=0,rows-1 { boxes[2] = new HBox() boxes[2].intercept(1) for ci=0,cols-1 { ob.rv(gi+m1) gi = gi+1 } boxes[2].intercept(0) boxes[2].map("") } boxes[1].intercept(0) boxes[1].map("") boxes[0].intercept(0) boxes[0].map("Deck") decknum = 0 boxes[1].flip_to(decknum) if (! ob.attr0) { for ii = 0,gi-1 { ob.glist.object(ii).label(0.3,0.5,ob.llist.object(ii).name) } } } endtemplate BX obfunc mktray () { local i,na,rows,cols,xsz,ysz localobj o if (numarg()==0) { print "mktray(attrnum,rows,cols[,xsize,ysize,label])" print "Create a tray for attr panel ATTRNUM to superimpose upon." return nil } boxer = new BX(boxerl.count) boxerl.append(boxer) trnum=boxer.trnum if (argtype(numarg())==2) { na=numarg()-1 i=numarg() boxer.name=$si } else { na=numarg() } if (na==2) o=panobj else if (argtype(1)==0) o=GRV[$1] else if (argtype(1)==1) o=$o1 if (o!=nil) o.super = 1 if (argtype(1)==2) { boxer.name=$s1 xsz=100 ysz=50 if (na/2==int(na/2)) {rows=factor($2) cols=$2/rows i=3} else {rows=$2 cols=$3 i=4} if (argtype(i)==0) {xsz=$i i+=1 ysz=$i} // size of graphs boxer.mktray(nil,rows,cols,xsz,ysz) } else if (na==5) { boxer.mktray(o,$2,$3,$4,$5) } else if (na==3) { boxer.mktray(o,$2,$3) } else if (na==2) { boxer.mktray(o,$1,$2) printf("Mapping trays to %s\n",o) } return boxer } proc rmtray () { local ix ix=$1 if (boxerl.count<=1) boxerl.remove_all else { for (ii=boxerl.count-1;ii>=0;ii-=1) { if (boxerl.object(ii).attrnum==attrnum) boxerl.remove(ii) }} remgrs(attrnum) GRV[ix].super=0 } proc trsz () { if (boxerl.count>0) for ltr (XO,boxerl) printf("%d:%d x %d\n",XO.attrnum,XO.rows,XO.cols) } proc mktrpanl () { xgetargs("Make Tray","mktray","Which","rows","cols","xsize","ysize","0,2,3,100,50") } //* disptray() redisp() redispv() proc disptray () { local ix,ii,jj,kk if (numarg()==0) {print "disptray(ix[,cols])" return} ix=$1 ii=GRV[ix].llist.count if (numarg()==2) jj=$2 else jj=factor(ii) kk=GRV[ix].glist.count mktray(GRV[ix],round(ii/jj),jj,100,50) GRV[ix].grall(0,ii-1) for ltr(XO,GRV[ix].glist) if(i1>=kk) { XO.size(&x[0]) XO.size(x[0],x[1],x[2],x[3]) } } proc redisp () { local supsav panobj=$o1 if (numarg()>=2) trnum=$2 supsav=panobj.super panobj.super=1 for ltr(graphItem,boxerl.object(trnum).gl) { graphItem.erase_all() panobj.rv(i1) } panobj.super=supsav } // for bxit () {} go through all the graphs in tray trnum // for bxit (g1,g2,g3,g4) {} go through selected graphs // for bxit (-1,g1,g2) {} go through g1-g2 bxn=-1 proc bxop () { g=boxerl.object(trnum).gl.object($1) graphItem=g} proc bxinc () { if (bxn>=boxerl.object(trnum).gl.count) bxn=0 else bxn+=1 g=boxerl.object(trnum).gl.object(bxn) graphItem=g } iterator bxit () { local i,ii i1=0 if (numarg()>0) { if (numarg()==3 && $1==-1) { for ii = $2, $3 { g=boxerl.object(trnum).gl.object(ii) graphItem=g iterator_statement i1+=1 } } else { for i = 1, numarg() { if (numarg()==1) XO=$o1.object(ii) g=boxerl.object(trnum).gl.object($i) graphItem=g iterator_statement i1+=1 } } } else { for ii=0,boxerl.object(trnum).gl.count-1 { g=boxerl.object(trnum).gl.object(ii) graphItem=g iterator_statement i1+=1 } } } // redispv(VEC,ATTRNUM,TRNUM) -- all args optional proc redispv () { local supsav panobj=$o1 if (numarg()>=2) trnum=$2 supsav=panobj.super panobj.super=1 for bxit() { g.erase_all() if (numarg()>0) panobj.rv($o1.x[i1]) else panobj.rv(vec.x[i1]) } panobj.super=supsav } proc bxcomm () { if (numarg()==1) boxerl.object(boxerl.count-1).name=$s1 else { boxerl.object(boxerl.count-1).name=comment } } //* gin() search through param strings to graph particular members of llist // eg regexp="SPCX SPTC SPSM " then 'gin(1)' to create regexp: 'SPCX.+%sSPTC.+%sSPSM.+%s' // gin("5","","") will find examples with SPCX=5 and graph SPTC against SPSM // ginpr() will search through llist and just print out the file names // meant to be used after running dir2pr() to get a summary file strdef regexp proc gin () { local i,a a=allocvecs(1) revec(mso[a]) tstr=regexp for i=1,numarg() repl_str(tstr,"%s",$si,temp_string2_) // replace sprint for ltr(XO,panobj.llist,&y) if (strm(XO.name,tstr)) mso[a].append(y) if (mso[a].size!=boxer.rows*boxer.cols) { printf("gin() ERR: %d!=%dx%d\n",mso[a].size,boxer.rows,boxer.cols) dealloc(a) return } geall(1) for bxit() panobj.rv(mso[a].x[i1]) tstr=regexp repl_mstr(tstr,".\\+%s","=%s,",temp_string2_) chop(tstr) for i=1,numarg() repl_str(tstr,"%s",$si,temp_string2_) sprint(tstr,"%s: %s",panobj.filename,tstr) bxcomm(tstr) print tstr dealloc(a) } proc ginpr () { local base,i if (numarg()==0) { print "Set regexp to begin: eg\n\tregexp=\"SMTC SPSM NSTC \" (space at end)" print "Then call ginpr(regexp) to reset regexp" print "Then call eg ginpr(\"0.015\",\"\",\"\") to list or gin(...) to graph" return } if (numarg()==1) { regexp=$s1 repl_mstr(regexp," ",".+%s,",tstr) chop(regexp,",") print regexp return } base=1 tstr=regexp // where they start numbering for i=1,numarg() repl_str(tstr,"%s",$si,temp_string2_) // replace sprint for ltr(XO,panobj.llist,&y) if (strm(XO.name,tstr)) printf("%03d %s\n",base+y,XO.name) }