if (name_declared("pkgversions") != 4 ) { execute("strdef pkgversions") } sprint(pkgversions,"%sVarList = $Revision: 1.17 $, ",pkgversions) load_file("FormatFile.hoc") load_file("ObjectClass.hoc") // // DoubleVar // begintemplate DoubleVar public name, ptr, type, action public printf, fprint strdef name, tmpstr, action objref ptr // new Var("name") proc init() { sprint(name,"%s",$s1) ptr = new Pointer(name) if (numarg() >= 2) { sprint(action,"%s",$s2) } if (numarg() >= 3) { sprint(tmpstr,"units(&%s,\"%s\")",name,$s3) execute(tmpstr) } } proc printf() { print name, " = ", ptr.val } proc fprint() { $o1.printdouble(name, ptr.val) } endtemplate DoubleVar // // StringVar // begintemplate StringVar public name, ptr, type, str, action public printf, fprint strdef name, cmd, str, action objref this // new Var("name") proc init() { sprint(name,"%s",$s1) if (numarg() >= 2) { sprint(action,"%s",$s2) } } proc printf() { sprint(cmd,"%s.str = %s",this, name) execute1(cmd) print name, " = ", str } proc fprint() { sprint(cmd,"%s.str = %s",this, name) execute1(cmd) $o1.printstr(name,str) } endtemplate StringVar // // VectorVar // begintemplate VectorVar public name, ptr, type, action public printf, fprint strdef name, cmd, action objref ptr, this objref oc // new Var("name") proc init() { sprint(name,"%s",$s1) if (numarg() >= 2) { sprint(action,"%s",$s2) } oc = new ObjectClass() } func vector_exists() { sprint(cmd,"%s.ptr = %s", this, name) execute1(cmd) if (oc.object_is(ptr,"NULLobject")) { print "VarList: Warning: ", name, " is NULLobject" return 0 } return 1 } proc printf() { if (vector_exists()) { print name, " = ", ptr.printf() } } proc fprint() { if (vector_exists()) { $o1.printvec(name, ptr) } } endtemplate VectorVar begintemplate MatrixVar public name, ptr, type, action public printf, fprint strdef name, cmd, action objref ptr, this objref oc proc init() { sprint(name,"%s",$s1) if (numarg() >= 2) { sprint(action,"%s",$s2) } oc = new ObjectClass() } func matrix_exists() { sprint(cmd,"%s.ptr = %s", this, name) execute1(cmd) if (oc.object_is(ptr,"NULLobject")) { print "VarList: Warning: ", name, " is NULLobject" return 0 } return 1 } proc printf() { if (matrix_exists()) { print name, " = ", ptr.printf() } } proc fprint() { if (matrix_exists()) { $o1.printmat(name, ptr) } } endtemplate MatrixVar // // ListVar // begintemplate ListVar public name, ptr, type, action public printf, fprint strdef name, cmd, action objref ptr, this objref oc // new Var("name") proc init() { sprint(name,"%s",$s1) if (numarg() >= 2) { sprint(action,"%s",$s2) } oc = new ObjectClass() } func list_exists() { sprint(cmd,"%s.ptr = %s", this, name) execute1(cmd) if (oc.object_is(ptr,"NULLobject")) { print "VarList: Warning: ", name, " is NULLobject" return 0 } return 1 } proc printf() { if (list_exists()) { print name, " = " for i=0, ptr.count()-1 { ptr.o(i).printf() } } } proc fprint() { if (list_exists()) { $o1.printlist(name, ptr) } } endtemplate ListVar // // VectorListVar // begintemplate VectorListVar public name, ptr, type, action public printf, fprint strdef name, cmd, action objref ptr, this objref oc // new Var("name") proc init() { init_value = 0 sprint(name,"%s",$s1) if (numarg() >= 2) { sprint(action,"%s",$s2) } if (numarg() >= 3) { init_value = $3 } oc = new ObjectClass() } func vectorlist_exists() { sprint(cmd,"%s.ptr = %s", this, name) execute1(cmd) if (oc.object_is(ptr,"NULLobject")) { print "VarList: Warning: ", name, " is NULLobject" return 0 } return 1 } proc printf() { local i if (vectorlist_exists()) { print name, " = " for i=0,ptr.count()-1 { ptr.object(i).printf() } } } proc fprint() { if (vectorlist_exists()) { $o1.printlistasmat(name, ptr, init_value) } } endtemplate VectorListVar // // VarList // begintemplate VarList public append public appendDouble, appendSetDouble public appendString, appendSetString public appendVector public appendVectorList public appendMatrix public appendList public remove public printVarNames public printf, printf_actions public fprint, fprint_actions public save, load public execute_actions public xstatebutton, xvalue, xradiobuttons objref l, f, this, ldfile strdef tmpstr, path proc init() { l = new List() } proc append() { l.append($o1) } proc appendDouble() { remove($s1) if (numarg() == 3) { l.append(new DoubleVar($s1, $s2, $s3)) } if (numarg() == 2) { l.append(new DoubleVar($s1, $s2)) } if (numarg() == 1) { l.append(new DoubleVar($s1)) } } proc appendSetDouble() { sprint(tmpstr,"%s = %g",$s1, $2) execute1(tmpstr) if (numarg() == 4) { appendDouble($s1, $s3, $s4) } if (numarg() == 3) { appendDouble($s1, $s3) } if (numarg() == 2) { appendDouble($s1) } } proc appendString() { remove($s1) if ( numarg() >= 2 ) { l.append(new StringVar($s1,$s2)) } else { l.append(new StringVar($s1)) } } proc appendSetString() { sprint(tmpstr, "strdef %s", $s1) execute(tmpstr) sprint(tmpstr,"%s = \"%s\"",$s1, $s2) execute(tmpstr) if ( numarg() >= 3 ) { appendString($s1,$s3) } else { appendString($s1) } } proc appendVector() { remove($s1) if ( numarg() >= 2 ) { l.append(new VectorVar($s1,$s2)) } else { l.append(new VectorVar($s1)) } } proc appendVectorList() { remove($s1) if ( numarg() == 3 ) { l.append(new VectorListVar($s1,$s2,$3)) } if ( numarg() == 2 ) { l.append(new VectorListVar($s1,$s2)) } if ( numarg() == 1 ) { l.append(new VectorListVar($s1)) } } proc appendMatrix() { remove($s1) if ( numarg() >= 2 ) { l.append(new MatrixVar($s1,$s2)) } else { l.append(new MatrixVar($s1)) } } proc appendList() { remove($s1) if ( numarg() >= 2 ) { l.append(new ListVar($s1,$s2)) } else { l.append(new ListVar($s1)) } } proc printVarNames() { local i for i=0, l.count()-1 { print l.object(i).name } } proc printf() { local i for i= 0, l.count()-1 { l.object(i).printf() } } proc printf_actions() { local i for i= 0, l.count()-1 { print l.object(i).action } } // fprint(FormatFile f) proc fprint() { local i for i= 0, l.count()-1 { l.object(i).fprint($o1) } } proc fprint_actions() { local i for i= 0, l.count()-1 { $o1.printf("{%s}\n",l.object(i).action) } } proc execute_actions() { local i for i= 0, l.count()-1 { execute(l.object(i).action) } } // save() brings up chooser // save("filename.hoc") saves to "filename.hoc" // save("","dir") brings up chooser starting in "dir" proc save() { if ((numarg() == 0) || numarg() == 2) { f = new FormatFile("","hoc") if (numarg() == 2) { f.chooser("w","Save Parameters to file","*.hoc","Save","Cancel",$s2) } else { f.chooser("w","Save Parameters to file","*.hoc","Save","Cancel") } f.chooser() } else { f = new FormatFile($s1,"hoc") } f.wopen() fprint(f) fprint_actions(f) f.close() } // Procedure to load from file adapted from stdrun.hoc // load() brings up chooser // load("filename.hoc") loads "filename.hoc" // load("","dir") brings up chooser starting in "dir" proc load() { path = "." if (numarg() == 2) { sprint(path,"%s/%s",path,$s2) } if ((numarg() == 0) || numarg() == 2) { if (object_id(ldfile) == 0) { ldfile = new File() } ldfile.chooser("r", "Load", "*.hoc", "Load", "Cancel", path) if (ldfile.chooser()) { load_file(1, ldfile.getname) } } else { load_file(1, $s1) } } func find() { local i for i=0, l.count()-1 { if (!strcmp(l.object(i).name,$s1)) { return i } } return -1 } proc remove() { local ind if ((ind = find($s1)) != -1) { l.remove(ind) } } proc xstatebutton() { local ind ind = find($s2) if ( ind==-1 ) { print this, "xstatebutton(): ", $s2, " not a member of VarList" stop } sprint(tmpstr,"xstatebutton(\"%s\",&%s,\"%s\")",$s1,$s2,l.object(ind).action) execute(tmpstr) } proc xvalue() { local ind ind = find($s2) if ( ind==-1 ) { print this, " xvalue(): ", $s2, " not a member of VarList" stop } sprint(tmpstr,"xvalue(\"%s\",\"%s\",1,\"%s\")",$s1,$s2,l.object(ind).action) execute(tmpstr) } proc xradiobuttons() { local ind, i ind = find($s2) if ( ind==-1 ) { print this, " xvalue(): ", $s2, " not a member of VarList" stop } sprint(tmpstr,"xlabel(\"%s\")",$s1) execute(tmpstr) for i=3,numarg() { sprint(tmpstr,"xradiobutton(\"%s\",\"%s=%d\")",$si,$s2,i-2) execute(tmpstr) } } endtemplate VarList