// connect(host, port) static PyObject *imdconnect(PyObject *self, PyObject *args, PyObject *keywds) { char *host; int port; static char *kwlist[] = { (char *)"host", (char *)"port", NULL }; if (!PyArg_ParseTupleAndKeywords(args, keywds, (char *)"si", kwlist, &host, &port)) return NULL; VMDApp *app = get_vmdapp(); Molecule *mol = app->moleculeList->top(); if (!mol) { PyErr_SetString(PyExc_ValueError, (char *)"No molecule loaded"); return NULL; } if (app->imdMgr->connected()) { PyErr_SetString(PyExc_ValueError, (char *)"Can't create new IMD connection: already connected."); return NULL; } if (!app->imd_connect(mol->id(), host, port)) { PyErr_SetString(PyExc_ValueError, (char *)"Unable to connect to IMD server"); return NULL; } Py_INCREF(Py_None); return Py_None; }
static PyObject *set_scale(PyObject *self, PyObject *args, PyObject *keywds) { static char *kwlist[] = { (char *)"method", (char *)"midpoint", (char *)"min", (char *)"max", NULL }; char *method = NULL; float midpoint = -1, min = -1, max = -1; VMDApp *app = get_vmdapp(); app->colorscale_info(&midpoint, &min, &max); if (!PyArg_ParseTupleAndKeywords(args, keywds, (char *)"|sfff", kwlist, &method, &midpoint, &min, &max)) return NULL; if (method) { int ind = app->colorscale_method_index(method); if (ind < 0) { PyErr_SetString(PyExc_ValueError, (char *)"Invalid color scale method"); return NULL; } app->colorscale_setmethod(ind); } app->colorscale_setvalues(midpoint, min, max); Py_INCREF(Py_None); return Py_None; }
static PyObject* py_scale_methods(PyObject *self, PyObject *args) { PyObject *newlist = NULL; VMDApp *app; int i, num; if (!(app = get_vmdapp())) return NULL; num = app->num_colorscale_methods(); if (!(newlist = PyList_New(num))) goto failure; for (i = 0; i < num; i++) { PyList_SET_ITEM(newlist, i, as_pystring(app->colorscale_method_name(i))); if (PyErr_Occurred()) goto failure; } return newlist; failure: PyErr_SetString(PyExc_RuntimeError, "Problem listing colorscales"); Py_XDECREF(newlist); return NULL; }
void MainFltkMenu::savefile_cb(Fl_Widget *w, void *v) { VMDApp *app = (VMDApp *)(w->user_data()); int selmol = ((MainFltkMenu *) v)->get_selected_molecule(); app->menu_select_mol("save", selmol); app->menu_show("save", 0); app->menu_show("save", 1); }
static PyObject* py_set_colorid(PyObject *self, PyObject *args, PyObject *kwargs) { const char *kwnames[] = {"id", "rgb", NULL}; float rgb[3]; int colorid; VMDApp *app; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i(fff):color.set_colorid", (char**) kwnames, &colorid, &rgb[0], &rgb[1], &rgb[2])) return NULL; if (!(app = get_vmdapp())) return NULL; if (colorid >= app->num_regular_colors() || colorid < 0) { PyErr_Format(PyExc_ValueError, "color index '%d' out of range", colorid); return NULL; } app->color_change_rgb(app->color_name(colorid), rgb[0], rgb[1], rgb[2]); Py_INCREF(Py_None); return Py_None; }
static PyObject* py_set_scale(PyObject *self, PyObject *args, PyObject *kwargs) { const char *kwnames[] = {"method", "midpoint", "min", "max", NULL}; float midpoint = -1, min = -1, max = -1; char *method = NULL; VMDApp *app; // Set midpoint, min and max to the current values if (!(app = get_vmdapp())) return NULL; app->colorscale_info(&midpoint, &min, &max); if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|zfff:color.set_scale", (char**) kwnames, &method, &midpoint, &min, &max)) return NULL; if (method) { int ind = app->colorscale_method_index(method); if (ind < 0) { PyErr_SetString(PyExc_ValueError, "Invalid color scale method"); return NULL; } app->colorscale_setmethod(ind); } app->colorscale_setvalues(midpoint, min, max); Py_INCREF(Py_None); return Py_None; }
// colors: Takes one argument, either a tuple of three floats, a string // color name, or an integer color index static PyObject *graphics_color(PyObject *self, PyObject *args) { int id; PyObject *obj; int result = -1; if (!PyArg_ParseTuple(args, (char *)"iO:graphics.color", &id, &obj)) return NULL; MoleculeGraphics *mol = mol_from_id(id); if (!mol) return NULL; if (PyInt_Check(obj)) { int index = PyInt_AsLong(obj); if (index >= 0 && index < MAXCOLORS) result = mol->use_color(index); } else if (PyString_Check(obj)) { char *name = PyString_AsString(obj); VMDApp *app = get_vmdapp(); int index = app->color_index(name); if (index >= 0) result = mol->use_color(index); } if (result >= 0) return PyInt_FromLong(result); PyErr_SetString(PyExc_ValueError, (char *)"Invalid color"); return NULL; }
// delete(category, labeldict) // XXX cut 'n paste from show... static PyObject *label_delete(PyObject *self, PyObject *args) { char *type; PyObject *labeldict; if (!PyArg_ParseTuple(args, (char *)"sO!:label.delete", &type, &PyDict_Type, &labeldict)) return NULL; VMDApp *app = get_vmdapp(); int cat = app->geometryList->geom_list_index(type); if (cat < 0) { PyErr_SetString(PyExc_ValueError, (char *)"Unknown label category"); return NULL; } GeomListPtr glist = app->geometryList->geom_list(cat); int gnum = glist->num(); for (int i=0; i<gnum; i++) { if (dict2geom(labeldict, (*glist)[i])) { app->label_delete(type, i); // XXX check return code Py_INCREF(Py_None); return Py_None; } } PyErr_SetString(PyExc_ValueError, "Invalid labeldict."); return NULL; }
static void reverse_cb(Fl_Widget *w, void *v) { Fl_Button *button = (Fl_Button *)w; VMDApp *app = (VMDApp *)v; if (button->value()) app->animation_set_dir(Animation::ANIM_REVERSE); else app->animation_set_dir(Animation::ANIM_PAUSE); }
static void forward_cb(Fl_Widget *w, void *v) { Fl_Button *button = (Fl_Button *)w; VMDApp *app = (VMDApp *)v; if (button->value()) app->animation_set_dir(Animation::ANIM_FORWARD); else app->animation_set_dir(Animation::ANIM_PAUSE); }
// add(category, (molids), (atomids)) static PyObject *label_add(PyObject *self, PyObject *args) { char *type; PyObject *molids, *atomids; int i; if (!PyArg_ParseTuple(args, (char *)"sO!O!:label.add", &type, &PyTuple_Type, &molids, &PyTuple_Type, &atomids)) return NULL; VMDApp *app = get_vmdapp(); MoleculeList *mlist = app->moleculeList; int cat = app->geometryList->geom_list_index(type); if (cat < 0) { PyErr_SetString(PyExc_ValueError, (char *)"Unknown label category"); return NULL; } int numitems; if (PyTuple_Size(molids) == 1 && PyTuple_Size(atomids) == 1) numitems = 1; else if (PyTuple_Size(molids) == 2 && PyTuple_Size(atomids) == 2) numitems = 2; else if (PyTuple_Size(molids) == 3 && PyTuple_Size(atomids) == 3) numitems = 3; else if (PyTuple_Size(molids) == 4 && PyTuple_Size(atomids) == 4) numitems = 4; else { PyErr_SetString(PyExc_TypeError, (char *)"label.add: 2nd and 3rd arguments" " must be tuples of size 1, 2, 3, or 4"); return NULL; } int m[4], a[4]; for (i=0; i<numitems; i++) { m[i] = PyInt_AsLong(PyTuple_GET_ITEM(molids, i)); a[i] = PyInt_AsLong(PyTuple_GET_ITEM(atomids, i)); if (PyErr_Occurred()) return NULL; Molecule *mol = mlist->mol_from_id(m[i]); if (!mol) { PyErr_SetString(PyExc_ValueError, (char *)"Invalid molecule id"); return NULL; } if (a[i] < 0 || a[i] >= mol->nAtoms) { PyErr_SetString(PyExc_ValueError, (char *)"Invalid atom id"); return NULL; } } // Add the label, but don't toggle the on/off status. int ind = app->label_add(type, numitems, m, a, NULL, 0.0f, 0); if (ind < 0) { Py_INCREF(Py_None); return Py_None; } // Get the dict corresponding to this label. The dict we return // corresponds to either the label we just created, or to an existing // label whose state we have not changed. This makes it safe to use // label.add to get a proxy to a VMD label. GeomListPtr glist = app->geometryList->geom_list(cat); return geom2dict((*glist)[ind]); }
static void curframe_cb(Fl_Widget *w, void *v) { Fl_Input *inp = (Fl_Input *)w; VMDApp *app = (VMDApp *)v; int val = atoi(inp->value()); int max = app->molecule_numframes(app->molecule_top()); if (val < 0) val = 0; if (val >= max) val = max-1; app->animation_set_frame(val); }
static void stereoswap_cb(Fl_Widget *w, void *v) { Fl_Menu_ *m = (Fl_Menu_ *)w; VMDApp *app = (VMDApp *)v; if (!strcmp("On", m->text())) { app->display_set_stereo_swap(1); } else { app->display_set_stereo_swap(0); } }
static void backgroundmode_cb(Fl_Widget *w, void *v) { Fl_Menu_ *m = (Fl_Menu_ *)w; VMDApp *app = (VMDApp *)(w->user_data()); if (!strcmp("Gradient", m->text())) { app->display_set_background_mode(1); } else { app->display_set_background_mode(0); } }
static PyObject *py_vmdupdate(PyObject *self, PyObject *args) { VMDApp *app = get_vmdapp(); if (!app) { fprintf(stderr, "no app!!\n"); Py_INCREF(Py_None); return Py_None; } return Py_BuildValue("i", app->VMDupdate(1)); }
static PyObject *scale_method(PyObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, (char *)"")) return NULL; VMDApp *app = get_vmdapp(); const char *method = app->colorscale_method_name(app->colorscale_method_current()); return PyString_FromString(method); }
static void shadowmode_cb(Fl_Widget *w, void *v) { const char *mode = ((Fl_Choice *)w)->text(); VMDApp *app = (VMDApp *)v; if (!strcmp(mode, "On")) { app->display_set_shadows(1); } else { app->display_set_shadows(0); } }
static PyObject *mousemode(PyObject *self, PyObject *args) { int mode, submode = -1; if (!PyArg_ParseTuple(args, (char *)"i|i", &mode, &submode)) return NULL; VMDApp *app = get_vmdapp(); app->mouse_set_mode(mode, submode); Py_INCREF(Py_None); return Py_None; }
// edit menu callbacks static void mol_top_cb(Fl_Widget *w, void *v) { VMDApp *app = (VMDApp *)w->user_data(); MolBrowser *browser = (MolBrowser *)v; for (int i=0; i<browser->size(); i++) { if (browser->selected(i+1)) { app->molecule_make_top(app->molecule_id(i)); break; } } }
static void mol_cancel_cb(Fl_Widget *w, void *v) { VMDApp *app = (VMDApp *)w->user_data(); MolBrowser *browser = (MolBrowser *)v; for (int i=0; i<browser->size(); i++) { if (browser->selected(i+1)) { int molid = app->molecule_id(i); app->molecule_cancel_io(molid); } } }
static PyObject *reverse(PyObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, (char *)"")) return NULL; VMDApp *app = get_vmdapp(); app->animation_set_dir(Animation::ANIM_REVERSE); Py_INCREF(Py_None); return Py_None; }
static PyObject *loop(PyObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, (char *)"")) return NULL; VMDApp *app = get_vmdapp(); app->animation_set_style(Animation::ANIM_LOOP); Py_INCREF(Py_None); return Py_None; }
static PyObject *listall(PyObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, (char *)"")) return NULL; PyObject *newlist = PyList_New(0); VMDApp *app = get_vmdapp(); for (int i=0; i<app->filerender_num(); i++) PyList_Append(newlist, PyString_FromString(app->filerender_name(i))); return newlist; }
static PyObject* py_scale_max(PyObject *self, PyObject *args) { float mid, min, max; VMDApp *app; if (!(app = get_vmdapp())) return NULL; app->colorscale_info(&mid, &min, &max); return PyFloat_FromDouble(max); }
static PyObject *show(PyObject *self, PyObject *args) { char *name; int onoff; if (!PyArg_ParseTuple(args, (char *)"s|i", &name, &onoff)) return NULL; VMDApp *app = get_vmdapp(); if (PyTuple_GET_SIZE(args) > 1) { app->menu_show(name, onoff); } return Py_BuildValue("i", app->menu_status(name)); }
static PyObject *label_textthickness(PyObject *self, PyObject *args) { float newthick = -1; if (!PyArg_ParseTuple(args, (char *)"|f:label.textthickness", &newthick)) return NULL; VMDApp *app = get_vmdapp(); if (newthick > 0) { app->label_set_text_thickness(newthick); } return Py_BuildValue("%f", app->label_get_text_thickness()); }
static PyObject *label_textsize(PyObject *self, PyObject *args) { float newsize = -1; if (!PyArg_ParseTuple(args, (char *)"|f:label.textsize", &newsize)) return NULL; VMDApp *app = get_vmdapp(); if (newsize > 0) { app->label_set_text_size(newsize); } return Py_BuildValue("%f", app->label_get_text_size()); }
static PyObject *skip(PyObject *self, PyObject *args) { int value = 0; if (!PyArg_ParseTuple(args, (char *)"|i",&value)) return NULL; VMDApp *app = get_vmdapp(); if (value > 0) { app->animation_set_stride(value); } return PyInt_FromLong(app->anim->skip()); }
static PyObject *anim_goto(PyObject *self, PyObject *args) { int frame; if (!PyArg_ParseTuple(args, (char *)"i", &frame)) return NULL; VMDApp *app = get_vmdapp(); app->animation_set_frame(frame); Py_INCREF(Py_None); return Py_None; }
static int text_cmd_quit(ClientData cd, Tcl_Interp *interp, int argc, const char *argv[]) { VMDApp *app = (VMDApp *)cd; // Trigger exit sequence on next display update. // Avoid calling VMDexit more than once. if (!app->exitFlag) app->VMDexit("",0,0); // return TCL_ERROR so that execution of procs or sourcing of files // stops here as well. return TCL_ERROR; }