static PyObject * PyDiaObject_GetAttr(PyDiaObject *self, gchar *attr) { if (!strcmp(attr, "__members__")) return Py_BuildValue("[sssss]", "bounding_box", "connections", "handles", "properties", "type"); else if (!strcmp(attr, "type")) return PyDiaObjectType_New(self->object->type); else if (!strcmp(attr, "bounding_box")) return PyDiaRectangle_New(&(self->object->bounding_box), NULL); else if (!strcmp(attr, "handles")) { int i; PyObject *ret = PyTuple_New(self->object->num_handles); for (i = 0; i < self->object->num_handles; i++) PyTuple_SetItem(ret, i, PyDiaHandle_New(self->object->handles[i], self->object)); return ret; } else if (!strcmp(attr, "connections")) { int i; PyObject *ret = PyTuple_New(self->object->num_connections); for (i = 0; i < self->object->num_connections; i++) PyTuple_SetItem(ret, i, PyDiaConnectionPoint_New( self->object->connections[i])); return ret; } else if (!strcmp(attr, "properties")) { return PyDiaProperties_New(self->object); } return Py_FindMethod(PyDiaObject_Methods, (PyObject *)self, attr); }
static PyObject * PyDiaDiagram_FindClosestConnectionPoint(PyDiaDiagram *self, PyObject *args) { Point p; double dist; ConnectionPoint *cpoint; PyObject *ret; PyDiaObject *obj = NULL; if (!PyArg_ParseTuple(args, "dd|O!:Diagram.find_closest_connectionpoint", &p.x, &p.y, PyDiaObject_Type, &obj)) return NULL; dist = diagram_find_closest_connectionpoint(self->dia, &cpoint, &p, obj ? obj->object : NULL); ret = PyTuple_New(2); PyTuple_SetItem(ret, 0, PyFloat_FromDouble(dist)); if (cpoint) PyTuple_SetItem(ret, 1, PyDiaConnectionPoint_New(cpoint)); else { Py_INCREF(Py_None); PyTuple_SetItem(ret, 1, Py_None); } return ret; }