// Procedures to make global variables if they do not already exist. {load_file("stdlib.hoc")} // $s1 is the name of the global variable // $2 is the value proc default_var() {localobj s s = new String() if (name_declared($s1) < 2) { hoc_ac_ = $2 sprint(s.s, "%s = hoc_ac_", $s1) execute(s.s) } sprint(s.s, "hoc_ac_ = %s", $s1) execute(s.s) printf("%s = %g\n", $s1, hoc_ac_) } // Similar to default_var(), but assigns global strdefs. // $s1 is the name of the global strdef variable // $2 is the value of the strdef proc default_var_str() {localobj s s = new String() if (name_declared($s1) < 2) { sprint(s.s, "strdef %s", $s1) execute(s.s) sprint(s.s, "%s = \"%s\"", $s1, $s2) execute(s.s) } sprint(s.s, "print \"%s = \", %s", $s1, $s1) execute(s.s) } // Similar to default_var(), but assigns global vectors. // $s1 is the name of the global vector variable // $2 are the floating point values of the vector formatted as a // comma delimited string, like "1, 3.14, 9.876". proc default_var_vec() {localobj s, pyobj s = new String() if (name_declared($s1) < 2) { // We write the following Python code: // str = $s2 // str = str.lstrip('[') // str = str.rstrip(']') // stripped = str.split(',') // vals = [] // for elem in stripped: // trimmed = elem.strip() // vals.append(float(trimmed)) // vec_vals = Vector(vals) /// Then put these into the global variable. sprint(s.s, "str = \"%s\"", $s2) nrnpython(s.s) nrnpython("str = str.lstrip(\'[\')") nrnpython("str = str.rstrip(\']\')") nrnpython("stripped = str.split(\',\')") nrnpython("vals = []") nrnpython("for elem in stripped:\n trimmed = elem.strip()\n vals.append(float(trimmed))") pyobj = new PythonObject() sprint(s.s, "objref %s", $s1) execute(s.s) sprint(s.s, "%s = new Vector(%d)", $s1, pyobj.vals.__len__()) execute(s.s) hoc_obj_[0] = pyobj.vals // copy to a global since we are in the scope of a proc sprint(s.s, "%s = %s.from_python(hoc_obj_[0])", $s1, $s1) execute(s.s) } sprint(s.s, "print \"%s = \", %s.printf()", $s1, $s1) execute(s.s) }