void PropertyConstraintList::setPyObject(PyObject *value) { if (PyList_Check(value)) { Py_ssize_t nSize = PyList_Size(value); std::vector<Constraint*> values; values.resize(nSize); for (Py_ssize_t i=0; i < nSize; ++i) { PyObject* item = PyList_GetItem(value, i); if (!PyObject_TypeCheck(item, &(ConstraintPy::Type))) { std::string error = std::string("types in list must be 'Constraint', not "); error += item->ob_type->tp_name; throw Base::TypeError(error); } values[i] = static_cast<ConstraintPy*>(item)->getConstraintPtr(); } setValues(values); } else if (PyObject_TypeCheck(value, &(ConstraintPy::Type))) { ConstraintPy *pcObject = static_cast<ConstraintPy*>(value); setValue(pcObject->getConstraintPtr()); } else { std::string error = std::string("type must be 'Constraint' or list of 'Constraint', not "); error += value->ob_type->tp_name; throw Base::TypeError(error); } }
PyObject* SketchPy::addConstraint(PyObject *args) { int ret = -1; PyObject *pcObj; if (!PyArg_ParseTuple(args, "O", &pcObj)) return 0; if (PyList_Check(pcObj)) { Py_ssize_t nSize = PyList_Size(pcObj); std::vector<Constraint*> values; values.resize(nSize); for (Py_ssize_t i=0; i<nSize;++i) { PyObject* item = PyList_GetItem(pcObj, i); if (!PyObject_TypeCheck(item, &(ConstraintPy::Type))) { std::string error = std::string("types in list must be 'Constraint', not "); error += item->ob_type->tp_name; throw Py::TypeError(error); } values[i] = static_cast<ConstraintPy*>(item)->getConstraintPtr(); } ret = getSketchPtr()->addConstraints(values); } else if(PyObject_TypeCheck(pcObj, &(ConstraintPy::Type))) { ConstraintPy *pcObject = static_cast<ConstraintPy*>(pcObj); ret = getSketchPtr()->addConstraint(pcObject->getConstraintPtr()); } else { std::string error = std::string("type must be 'Constraint' or list of 'Constraint', not "); error += pcObj->ob_type->tp_name; throw Py::TypeError(error); } return Py::new_reference_to(Py::Int(ret)); }
PyObject* SketchPy::addConstraint(PyObject *args) { PyObject *pcObj; if (!PyArg_ParseTuple(args, "O", &pcObj)) return 0; if (PyObject_TypeCheck(pcObj, &(PyList_Type)) || PyObject_TypeCheck(pcObj, &(PyTuple_Type))) { std::vector<Constraint*> values; Py::Sequence list(pcObj); for (Py::Sequence::iterator it = list.begin(); it != list.end(); ++it) { if (PyObject_TypeCheck((*it).ptr(), &(ConstraintPy::Type))) { Constraint *con = static_cast<ConstraintPy*>((*it).ptr())->getConstraintPtr(); values.push_back(con); } } int ret = getSketchPtr()->addConstraints(values) + 1; std::size_t numCon = values.size(); Py::Tuple tuple(numCon); for (std::size_t i=0; i<numCon; ++i) { int conId = ret - int(numCon - i); tuple.setItem(i, Py::Int(conId)); } return Py::new_reference_to(tuple); } else if(PyObject_TypeCheck(pcObj, &(ConstraintPy::Type))) { ConstraintPy *pcObject = static_cast<ConstraintPy*>(pcObj); int ret = getSketchPtr()->addConstraint(pcObject->getConstraintPtr()); return Py::new_reference_to(Py::Int(ret)); } else { std::string error = std::string("type must be 'Constraint' or list of 'Constraint', not "); error += pcObj->ob_type->tp_name; throw Py::TypeError(error); } }