예제 #1
0
static PyObject *bpy_bmlayercollection_subscript_str(BPy_BMLayerCollection *self, const char *keyname)
{
	CustomData *data;
	int index;

	BPY_BM_CHECK_OBJ(self);

	data = bpy_bm_customdata_get(self->bm, self->htype);
	index = CustomData_get_named_layer(data, self->type, keyname);  /* type relative */

	if (index != -1) {
		return BPy_BMLayerItem_CreatePyObject(self->bm, self->htype, self->type, index);
	}
	else {
		PyErr_Format(PyExc_KeyError,
		             "BMLayerCollection[key]: key \"%.200s\" not found", keyname);
		return NULL;
	}
}
예제 #2
0
static PyObject *bpy_bmeditselseq_subscript_slice(BPy_BMEditSelSeq *self, Py_ssize_t start, Py_ssize_t stop)
{
	int count = 0;
	bool ok;

	PyObject *list;
	PyObject *item;
	BMEditSelection *ese;

	BPY_BM_CHECK_OBJ(self);

	list = PyList_New(0);

	ese = self->bm->selected.first;

	ok = (ese != NULL);

	if (UNLIKELY(ok == false)) {
		return list;
	}

	/* first loop up-until the start */
	for (ok = true; ok; ok = ((ese = ese->next) != NULL)) {
		if (count == start) {
			break;
		}
		count++;
	}

	/* add items until stop */
	while ((ese = ese->next)) {
		item = BPy_BMElem_CreatePyObject(self->bm, &ese->ele->head);
		PyList_Append(list, item);
		Py_DECREF(item);

		count++;
		if (count == stop) {
			break;
		}
	}

	return list;
}
예제 #3
0
static PyObject *bpy_bmeditselseq_add(BPy_BMEditSelSeq *self, BPy_BMElem *value)
{
	BPY_BM_CHECK_OBJ(self);

	if ((BPy_BMVert_Check(value) ||
	     BPy_BMEdge_Check(value) ||
	     BPy_BMFace_Check(value)) == false)
	{
		PyErr_Format(PyExc_TypeError,
		             "Expected a BMVert/BMedge/BMFace not a %.200s", Py_TYPE(value)->tp_name);
		return NULL;
	}

	BPY_BM_CHECK_SOURCE_OBJ(value, self->bm, "select_history.add()");

	BM_select_history_store(self->bm, value->ele);

	Py_RETURN_NONE;
}
예제 #4
0
static PyObject *bpy_bmlayercollection_subscript_slice(BPy_BMLayerCollection *self, Py_ssize_t start, Py_ssize_t stop)
{
	Py_ssize_t len = bpy_bmlayercollection_length(self);
	int count = 0;

	PyObject *tuple;

	BPY_BM_CHECK_OBJ(self);

	if (start >= len) start = len - 1;
	if (stop  >= len) stop  = len - 1;

	tuple = PyTuple_New(stop - start);

	for (count = start; count < stop; count++) {
		PyTuple_SET_ITEM(tuple, count - start, BPy_BMLayerItem_CreatePyObject(self->bm, self->htype, self->type, count));
	}

	return tuple;
}
예제 #5
0
static PyObject *bpy_bmlayercollection_verify(BPy_BMLayerCollection *self)
{
	int index;
	CustomData *data;

	BPY_BM_CHECK_OBJ(self);

	data = bpy_bm_customdata_get(self->bm, self->htype);

	index = CustomData_get_active_layer(data, self->type);  /* type relative */

	if (index == -1) {
		BM_data_layer_add(self->bm, data, self->type);
		index = 0;
	}

	BLI_assert(index >= 0);

	return BPy_BMLayerItem_CreatePyObject(self->bm, self->htype, self->type, index);
}
static PyObject *bpy_bmeditselseq_subscript_int(BPy_BMEditSelSeq *self, int keynum)
{
	BMEditSelection *ese;

	BPY_BM_CHECK_OBJ(self);

	if (keynum < 0) {
		ese = BLI_rfindlink(&self->bm->selected, -1 - keynum);
	}
	else {
		ese = BLI_findlink(&self->bm->selected, keynum);
	}

	if (ese) {
		return BPy_BMElem_CreatePyObject(self->bm, &ese->ele->head);
	}
	else {
		PyErr_Format(PyExc_IndexError,
		             "BMElemSeq[index]: index %d out of range", keynum);
		return NULL;
	}
}
예제 #7
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_old, *v_new;

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

	bm = py_face->bm;

	BPY_BM_CHECK_OBJ(py_face);
	BPY_BM_CHECK_SOURCE_OBJ(bm, "face_vert_separate()", py_vert);

	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_old = l->v;
	v_new = BM_face_loop_separate(bm, l);

	if (v_new != v_old) {
		return BPy_BMVert_CreatePyObject(bm, v_new);
	}
	else {
		Py_RETURN_NONE;
	}
}
static PyObject *bpy_bmeditselseq_remove(BPy_BMEditSelSeq *self, BPy_BMElem *value)
{
	BPY_BM_CHECK_OBJ(self);

	if ((BPy_BMVert_Check(value) ||
	     BPy_BMEdge_Check(value) ||
	     BPy_BMFace_Check(value)) == FALSE)
	{
		PyErr_Format(PyExc_TypeError,
		             "Expected a BMVert/BMedge/BMFace not a %.200s", Py_TYPE(value)->tp_name);
		return NULL;
	}

	BPY_BM_CHECK_SOURCE_OBJ(value, self->bm, "select_history.remove()");

	if (BM_select_history_remove(self->bm, value->ele) == FALSE) {
		PyErr_SetString(PyExc_ValueError,
		                "Element not found in selection history");
		return NULL;
	}

	Py_RETURN_NONE;
}
예제 #9
0
static PyObject *bpy_bmlayercollection_values(BPy_BMLayerCollection *self)
{
	PyObject *ret;
	PyObject *item;
	int index;
	CustomData *data;
	int tot, i;

	BPY_BM_CHECK_OBJ(self);

	data = bpy_bm_customdata_get(self->bm, self->htype);
	index = CustomData_get_layer_index(data, self->type);
	tot = (index != -1) ? CustomData_number_of_layers(data, self->type) : 0;

	ret = PyList_New(tot);

	for (i = 0; tot-- > 0; index++) {
		item = BPy_BMLayerItem_CreatePyObject(self->bm, self->htype, self->type, i);
		PyList_SET_ITEM(ret, i++, item);
	}

	return ret;
}
예제 #10
0
static PyObject *bpy_bmlayercollection_keys(BPy_BMLayerCollection *self)
{
	PyObject *ret;
	PyObject *item;
	int index;
	CustomData *data;
	int tot, i;

	BPY_BM_CHECK_OBJ(self);

	data = bpy_bm_customdata_get(self->bm, self->htype);
	index = CustomData_get_layer_index(data, self->type); /* absolute, but no need to make relative */
	tot = (index != -1) ? CustomData_number_of_layers(data, self->type) : 0;

	ret = PyList_New(tot);

	for (i = 0; tot-- > 0; index++) {
		item = PyUnicode_FromString(data->layers[index].name);
		PyList_SET_ITEM(ret, i++, item);
	}

	return ret;
}
예제 #11
0
static PyObject *bpy_bmlayeritem_copy_from(BPy_BMLayerItem *self, BPy_BMLayerItem *value)
{
	CustomData *data;

	if (!BPy_BMLayerItem_Check(value)) {
		PyErr_Format(PyExc_TypeError,
		             "layer.copy_from(x): expected BMLayerItem, not '%.200s'",
		             Py_TYPE(value)->tp_name);
		return NULL;
	}

	BPY_BM_CHECK_OBJ(self);
	BPY_BM_CHECK_SOURCE_OBJ(self->bm, "layer.copy_from()", value);

	if ((self->htype != value->htype) ||
	    (self->type  != value->type))
	{
		PyErr_SetString(PyExc_ValueError,
		                "layer.copy_from(other): layer type mismatch");
	}

	else if (self->index == value->index) {
		Py_RETURN_NONE;
	}

	data = bpy_bm_customdata_get(self->bm, self->htype);

	if ((bpy_bmlayeritem_get(self) == NULL) ||
	    (bpy_bmlayeritem_get(value) == NULL))
	{
		return NULL;
	}

	BM_data_layer_copy(self->bm, data, self->type, value->index, self->index);

	Py_RETURN_NONE;
}
예제 #12
0
static PyObject *bpy_bmlayercollection_get(BPy_BMLayerCollection *self, PyObject *args)
{
	const char *key;
	PyObject *def = Py_None;

	BPY_BM_CHECK_OBJ(self);

	if (!PyArg_ParseTuple(args, "s|O:get", &key, &def)) {
		return NULL;
	}
	else {
		CustomData *data;
		int index;

		data = bpy_bm_customdata_get(self->bm, self->htype);
		index = CustomData_get_named_layer(data, self->type, key);  /* type relative */

		if (index != -1) {
			return BPy_BMLayerItem_CreatePyObject(self->bm, self->htype, self->type, index);
		}
	}

	return Py_INCREF_RET(def);
}
예제 #13
0
static PyObject *bpy_bm_geometry_intersect_face_point(BPy_BMFace *UNUSED(self), PyObject *args)
{
	BPy_BMFace *py_face;
	PyObject *py_point;
	float point[3];
	bool ret;

	if (!PyArg_ParseTuple(args,
	                      "O!O:intersect_face_point",
	                      &BPy_BMFace_Type, &py_face,
	                      &py_point))
	{
		return NULL;
	}

	BPY_BM_CHECK_OBJ(py_face);
	if (mathutils_array_parse(point, 3, 3, py_point, "intersect_face_point") == -1) {
		return NULL;
	}

	ret = BM_face_point_inside_test(py_face->f, point);

	return PyBool_FromLong(ret);
}
static PyObject *bpy_bmeditselseq_clear(BPy_BMEditSelSeq *self)
{
	BPY_BM_CHECK_OBJ(self);
	BM_select_history_clear(self->bm);
	Py_RETURN_NONE;
}
예제 #15
0
static PyObject *bpy_bm_utils_face_split(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
	static const char *kwlist[] = {"face", "vert_a", "vert_b",
	                               "coords", "use_exist", "example", NULL};

	BPy_BMFace *py_face;
	BPy_BMVert *py_vert_a;
	BPy_BMVert *py_vert_b;

	/* optional */
	PyObject *py_coords = NULL;
	int edge_exists = TRUE;
	BPy_BMEdge *py_edge_example = NULL;

	float *coords;
	int ncoords = 0;

	BMesh *bm;
	BMFace *f_new = NULL;
	BMLoop *l_new = NULL;

	if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!O!|OiO!:face_split", (char **)kwlist,
	                                 &BPy_BMFace_Type, &py_face,
	                                 &BPy_BMVert_Type, &py_vert_a,
	                                 &BPy_BMVert_Type, &py_vert_b,
	                                 &py_coords,
	                                 &edge_exists,
	                                 &BPy_BMEdge_Type, &py_edge_example))
	{
		return NULL;
	}

	BPY_BM_CHECK_OBJ(py_face);
	BPY_BM_CHECK_OBJ(py_vert_a);
	BPY_BM_CHECK_OBJ(py_vert_b);

	if (py_edge_example) {
		BPY_BM_CHECK_OBJ(py_edge_example);
	}

	/* this doubles for checking that the verts are in the same mesh */
	if (BM_vert_in_face(py_face->f, py_vert_a->v) == FALSE ||
	    BM_vert_in_face(py_face->f, py_vert_b->v) == FALSE)
	{
		PyErr_SetString(PyExc_ValueError,
		                "face_split(...): one of the verts passed is not found in the face");
		return NULL;
	}

	if (py_vert_a->v == py_vert_b->v) {
		PyErr_SetString(PyExc_ValueError,
		                "face_split(...): vert arguments must differ");
		return NULL;
	}

	if (py_coords) {
		ncoords = mathutils_array_parse_alloc_v(&coords, 3, py_coords, "face_split(...): ");
		if (ncoords == -1) {
			return NULL;
		}
	}

	/* --- main function body --- */
	bm = py_face->bm;

	if (ncoords) {
		f_new = BM_face_split_n(bm, py_face->f,
		                        py_vert_a->v, py_vert_b->v,
		                        (float (*)[3])coords, ncoords,
		                        &l_new, py_edge_example ? py_edge_example->e : NULL);
	}
	else {
		f_new = BM_face_split(bm, py_face->f,
		                      py_vert_a->v, py_vert_b->v,
		                      &l_new, py_edge_example ? py_edge_example->e : NULL, edge_exists);
	}

	if (f_new && l_new) {
		PyObject *ret = PyTuple_New(2);
		PyTuple_SET_ITEM(ret, 0, BPy_BMFace_CreatePyObject(bm, f_new));
		PyTuple_SET_ITEM(ret, 1, BPy_BMLoop_CreatePyObject(bm, l_new));
		return ret;
	}
	else {
		PyErr_SetString(PyExc_ValueError,
		                "face_split(...): couldn't split the face, internal error");
		return NULL;
	}
}
예제 #16
0
static PyObject *bpy_bmlayercollection_is_singleton_get(BPy_BMLayerItem *self, void *UNUSED(flag))
{
	BPY_BM_CHECK_OBJ(self);

	return PyBool_FromLong(CustomData_layertype_is_singleton(self->type));
}