Beispiel #1
0
PyObject *Any_BPy_Interface0D_from_Interface0D(Interface0D& if0D)
{
	if (typeid(if0D) == typeid(CurvePoint)) {
		return BPy_CurvePoint_from_CurvePoint(dynamic_cast<CurvePoint&>(if0D));
	}
	else if (typeid(if0D) == typeid(StrokeVertex)) {
		return BPy_StrokeVertex_from_StrokeVertex(dynamic_cast<StrokeVertex&>(if0D));
	}
	else if (typeid(if0D) == typeid(SVertex)) {
		return BPy_SVertex_from_SVertex(dynamic_cast<SVertex&>(if0D));
	}
	else if (typeid(if0D) == typeid(ViewVertex)) {
		return BPy_ViewVertex_from_ViewVertex(dynamic_cast<ViewVertex&>(if0D));
	}
	else if (typeid(if0D) == typeid(NonTVertex)) {
		return BPy_NonTVertex_from_NonTVertex(dynamic_cast<NonTVertex&>(if0D));
	}
	else if (typeid(if0D) == typeid(TVertex)) {
		return BPy_TVertex_from_TVertex(dynamic_cast<TVertex&>(if0D));
	}
	else if (typeid(if0D) == typeid(Interface0D)) {
		return BPy_Interface0D_from_Interface0D(if0D);
	}
	string msg("unexpected type: " + if0D.getExactTypeName());
	PyErr_SetString(PyExc_TypeError, msg.c_str());
	return NULL;
}
static PyObject *StrokeVertexIterator_object_get(BPy_StrokeVertexIterator *self, void *UNUSED(closure))
{
	if (!self->reversed && self->sv_it->isEnd())
		Py_RETURN_NONE;
	StrokeVertex *sv = self->sv_it->operator->();
	if (sv)
		return BPy_StrokeVertex_from_StrokeVertex(*sv);
	Py_RETURN_NONE;
}
Beispiel #3
0
static PyObject *Stroke_sq_item(BPy_Stroke *self, int keynum)
{
	if (keynum < 0)
		keynum += Stroke_sq_length(self);
	if (keynum < 0 || keynum >= Stroke_sq_length(self)) {
		PyErr_Format(PyExc_IndexError, "Stroke[index]: index %d out of range", keynum);
		return NULL;
	}
	return BPy_StrokeVertex_from_StrokeVertex(self->s->strokeVerticeAt(keynum));
}
static PyObject *StrokeVertexIterator_object_get(BPy_StrokeVertexIterator *self, void *UNUSED(closure))
{
	if (self->sv_it->isEnd()) {
		PyErr_SetString(PyExc_RuntimeError, "iteration has stopped");
		return NULL;
	}
	StrokeVertex *sv = self->sv_it->operator->();
	if (sv)
		return BPy_StrokeVertex_from_StrokeVertex(*sv);
	Py_RETURN_NONE;
}
static PyObject *StrokeVertexIterator_iternext(BPy_StrokeVertexIterator *self)
{
	StrokeVertex *sv;

	if (self->reversed) {
		if (self->sv_it->isBegin()) {
			PyErr_SetNone(PyExc_StopIteration);
			return NULL;
		}
		self->sv_it->decrement();
		sv = self->sv_it->operator->();
	}
	else {
		if (self->sv_it->isEnd()) {
			PyErr_SetNone(PyExc_StopIteration);
			return NULL;
		}
		sv = self->sv_it->operator->();
		self->sv_it->increment();
	}
	return BPy_StrokeVertex_from_StrokeVertex(*sv);
}
static PyObject *StrokeVertexIterator_iternext(BPy_StrokeVertexIterator *self)
{
	/* Because Freestyle iterators for which it.isEnd() holds true have no valid object
	 * (referencing it.object in this case leads to a crash), we must check if it.object
	 * is valid after incrementing, to prevent crashes in Python.
	 * Additionally, the at_start attribute is used to keep Freestyle iterator objects
	 * and Python for loops in sync. */

	if (self->reversed) {
		if (self->sv_it->isBegin()) {
			PyErr_SetNone(PyExc_StopIteration);
			return NULL;
		}
		self->sv_it->decrement();
	}
	else {
		if (self->sv_it->isEnd()) {
			PyErr_SetNone(PyExc_StopIteration);
			return NULL;
		}
		/* if at the start of the iterator, only return the object
		 * and don't increment, to keep for-loops in sync */
		if (self->at_start)
			self->at_start = false;
		/* after incrementing, check if the iterator is at its end
		 * exit the loop if it is. not doing so will result in a crash */
		else {
			self->sv_it->increment();
			if (self->sv_it->isEnd()) {
				PyErr_SetNone(PyExc_StopIteration);
				return NULL;
			}
		}
	}
	StrokeVertex *sv = self->sv_it->operator->();
	return BPy_StrokeVertex_from_StrokeVertex(*sv);
}