Changeset 35
- Timestamp:
- 05/23/07 13:24:31 (2 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/pygetsetcall/src/nrnpython/nrnpy_hoc.cpp
r32 r35 68 68 static PyTypeObject* hocvector_type; 69 69 70 // Type checks 71 #define PyHocObject_Check(op) PyObject_TypeCheck(op, hocobject_type) 72 #define PyHocObject_CheckExact(op) ((op)->ob_type == hocobject_type) 73 #define PyHocVector_Check(op) PyObject_TypeCheck(op, hocvector_type) 74 #define PyHocVector_CheckExact(op) ((op)->ob_type == hocvector_type) 75 76 70 77 static PyObject* nrnexec(PyObject* self, PyObject* args) { 71 78 const char* cmd; … … 261 268 case OBJECTVAR: 262 269 case OBJECTTMP: 263 result = hocobj_new(hocobject_type, 0, 0); 264 d = hoc_objpop(); 270 d = hoc_objpop(); 271 272 if (is_obj_type(*d,"Vector")){ 273 result = hocobj_new(hocvector_type, 0, 0); 274 } 275 else { 276 result = hocobj_new(hocobject_type, 0, 0); 277 } 278 265 279 ((PyHocObject*)result)->ho_ = *d; 266 280 ((PyHocObject*)result)->type_ = 1; … … 295 309 case OBJECTVAR: 296 310 PyHocObject* pho; 297 if (PyArg_Parse(po, "O!", hocobject_type, &pho) == 1) { 311 if (PyHocObject_Check(po)) { 312 pho = (PyHocObject*)po; 298 313 Object** pobj = hoc_objpop(); 299 314 if (pho->sym_) { … … 359 374 } 360 375 }else{ 361 return NULL; 376 PyErr_SetString(PyExc_TypeError, "object not callable"); 377 return NULL; 378 362 379 } 363 380 } … … 463 480 464 481 if (self->type_ == 1 && !self->ho_) { 465 Py_DECREF(name); 466 PyErr_SetString(PyExc_TypeError, "not a compound type"); 467 //return Py_BuildValue(""); 468 return NULL; 482 //Py_DECREF(name); 483 //PyErr_SetString(PyExc_TypeError, "symbol not yet defined"); 484 //return NULL; 485 486 return PyObject_GenericGetAttr((PyObject*)self, name); 487 469 488 } 470 489 Symbol* sym = getsym(n, self->ho_, 0); … … 590 609 591 610 if (self->type_ == 1 && !self->ho_) { 592 return 1; 611 return PyObject_GenericSetAttr((PyObject*)self, name, value); 612 //return 1; 593 613 } 594 614 Py_INCREF(name); 595 615 char* n = PyString_AsString(name); 596 616 //printf("hocobj_setattro %s\n", n); 597 Symbol* sym = getsym(n, self->ho_, 1);617 Symbol* sym = getsym(n, self->ho_, 0); 598 618 Py_DECREF(name); 599 619 if (!sym) { 600 return -1; 620 //return -1; 621 return PyObject_GenericSetAttr((PyObject*)self, name, value); 601 622 } 602 623 if (self->ho_) { // use the component fork. … … 861 882 } 862 883 else { 863 PyErr_SetString(PyExc_TypeError, "expected HocVector .");884 PyErr_SetString(PyExc_TypeError, "expected HocVector for self."); 864 885 return NULL; 865 886 } … … 876 897 877 898 } 899 900 901 static PyObject* hocvec_fromnumpy(PyObject* self, PyObject* args) { 902 903 904 905 #ifdef WITH_NUMPY 906 907 PyHocObject * ho = (PyHocObject*)self; 908 PyArrayObject *pa = NULL; 909 910 int size; 911 912 if (!PyArg_ParseTuple(args, "O!",&PyArray_Type,&pa)) { 913 return NULL; 914 } 915 916 // check the array arg has the correct type and dimensions 917 918 if (pa->nd != 1 || pa->descr->type_num != PyArray_DOUBLE) { 919 PyErr_SetString(PyExc_TypeError,"array arg 'a' not of correct type: (1D,PyArray_DOUBLE)"); 920 return false; 921 } 922 923 924 if (is_obj_type(ho->ho_,"Vector")) { 925 // we can deal with vectors 926 927 size = pa->dimensions[0]; 928 929 Vect* v = (Vect*)ho->ho_->u.this_pointer; 930 v->resize(size); 931 int i; 932 933 for (i=0;i<size;i++) { 934 (*v)[i] = *(double*)(pa->data + i*pa->strides[0]); 935 } 936 937 return Py_BuildValue(""); 938 939 } 940 else { 941 PyErr_SetString(PyExc_TypeError, "expected HocVector for self."); 942 return NULL; 943 } 944 945 946 #else 947 948 PyErr_SetString(PyExc_RuntimeError, "numpy support was not enabled at build time."); 949 return NULL; 950 951 952 #endif //WITH_NUMPY 953 954 955 } 956 957 878 958 879 959 … … 1073 1153 static PyMethodDef hocvec_methods[] = { 1074 1154 {"toarray",hocvec_tonumpy,METH_VARARGS,"toarray(self) returns a numpy array of self."}, 1155 {"fromarray",hocvec_fromnumpy,METH_VARARGS,"fromarray(self,a) sets vector contents using array (sizes must match)."}, 1075 1156 {NULL, NULL, 0, NULL} 1076 1157 }; … … 1155 1236 0,//hocobj_members, /* tp_members */ 1156 1237 0, /* tp_getset */ 1157 0,/* tp_base */1238 &nrnpy_HocObjectType, /* tp_base */ 1158 1239 0, /* tp_dict */ 1159 1240 0, /* tp_descr_get */ … … 1169 1250 1170 1251 1252 1253 1171 1254 myPyMODINIT_FUNC nrnpy_hoc() { 1172 1255 PyObject* m;

