Beispiel #1
0
static PyObject *bpy_bm_utils_loop_separate(PyObject *UNUSED(self), BPy_BMLoop *value)
{
	BMesh *bm;
	BMVert *v_new;

	if (!BPy_BMLoop_Check(value)) {
		PyErr_Format(PyExc_TypeError,
		             "loop_separate(loop): BMLoop expected, not '%.200s'",
		             Py_TYPE(value)->tp_name);
		return NULL;
	}

	BPY_BM_CHECK_OBJ(value);

	bm = value->bm;

	v_new = BM_face_loop_separate(bm, value->l);

	if (v_new != value->l->v) {
		return BPy_BMVert_CreatePyObject(bm, v_new);
	}
	else {
		Py_RETURN_NONE;
	}
}
static PyObject *bpy_bm_utils_edge_split(PyObject *UNUSED(self), PyObject *args)
{
	BPy_BMEdge *py_edge;
	BPy_BMVert *py_vert;
	float fac;

	BMesh *bm;
	BMVert *v_new = NULL;
	BMEdge *e_new = NULL;

	if (!PyArg_ParseTuple(args, "O!O!f:edge_split",
	                      &BPy_BMEdge_Type, &py_edge,
	                      &BPy_BMVert_Type, &py_vert,
	                      &fac))
	{
		return NULL;
	}

	BPY_BM_CHECK_OBJ(py_edge);
	BPY_BM_CHECK_OBJ(py_vert);

	/* this doubles for checking that the verts are in the same mesh */
	if (!(py_edge->e->v1 == py_vert->v ||
	      py_edge->e->v2 == py_vert->v))
	{
		PyErr_SetString(PyExc_ValueError,
		                "edge_split(edge, vert): the vertex is not found in the edge");
		return NULL;
	}

	bm = py_edge->bm;

	v_new = BM_edge_split(bm, py_edge->e, py_vert->v, &e_new, CLAMPIS(fac, 0.0f, 1.0f));

	if (v_new && e_new) {
		PyObject *ret = PyTuple_New(2);
		PyTuple_SET_ITEMS(ret,
		        BPy_BMEdge_CreatePyObject(bm, e_new),
		        BPy_BMVert_CreatePyObject(bm, v_new));
		return ret;
	}
	else {
		PyErr_SetString(PyExc_ValueError,
		                "edge_split(edge, vert): couldn't split the edge, internal error");
		return NULL;
	}
}
Beispiel #3
0
static PyObject *bpy_bm_utils_face_vert_separate(PyObject *UNUSED(self), PyObject *args)
{
	BPy_BMFace *py_face;
	BPy_BMVert *py_vert;

	BMesh *bm;
	BMLoop *l;
	BMVert *v_new;

	if (!PyArg_ParseTuple(args, "O!O!:face_vert_separate",
	                      &BPy_BMFace_Type, &py_face,
	                      &BPy_BMVert_Type, &py_vert))
	{
		return NULL;
	}

	BPY_BM_CHECK_OBJ(py_face);
	BPY_BM_CHECK_OBJ(py_vert);

	bm = py_face->bm;

	if (bm != py_vert->bm) {
		PyErr_SetString(PyExc_ValueError,
		                "mesh elements are from different meshes");
		return NULL;
	}

	l = BM_face_vert_share_loop(py_face->f, py_vert->v);

	if (l == NULL) {
		PyErr_SetString(PyExc_ValueError,
		                "vertex not found in face");
		return NULL;
	}

	v_new = BM_face_loop_separate(bm, l);

	if (v_new != l->v) {
		return BPy_BMVert_CreatePyObject(bm, v_new);
	}
	else {
		Py_RETURN_NONE;
	}
}