[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56520] trunk/blender/source/blender: expose bmesh volume calculation to python api (use for print toolbox addon ).

Campbell Barton ideasman42 at gmail.com
Tue May 7 02:00:32 CEST 2013


Revision: 56520
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56520
Author:   campbellbarton
Date:     2013-05-07 00:00:32 +0000 (Tue, 07 May 2013)
Log Message:
-----------
expose bmesh volume calculation to python api (use for print toolbox addon).

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
    trunk/blender/source/blender/bmesh/operators/bmo_smooth_laplacian.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2013-05-06 22:53:11 UTC (rev 56519)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2013-05-07 00:00:32 UTC (rev 56520)
@@ -1720,7 +1720,7 @@
 		*r_vol += (1.0f / 6.0f) * dot_v3v3(p1, cross);
 	}
 }
-float BM_mesh_calc_volume(BMesh *bm)
+float BM_mesh_calc_volume(BMesh *bm, bool is_signed)
 {
 	/* warning, calls own tessellation function, may be slow */
 	float vol = 0.0f;
@@ -1731,5 +1731,9 @@
 		bm_mesh_calc_volume_face(f, &vol);
 	}
 
-	return fabsf(vol);
+	if (is_signed == false) {
+		vol = fabsf(vol);
+	}
+
+	return vol;
 }

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.h	2013-05-06 22:53:11 UTC (rev 56519)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.h	2013-05-07 00:00:32 UTC (rev 56520)
@@ -113,6 +113,6 @@
 bool BM_face_is_any_vert_flag_test(BMFace *f, const char hflag);
 bool BM_face_is_any_edge_flag_test(BMFace *f, const char hflag);
 
-float BM_mesh_calc_volume(BMesh *bm);
+float BM_mesh_calc_volume(BMesh *bm, bool is_signed);
 
 #endif /* __BMESH_QUERIES_H__ */

Modified: trunk/blender/source/blender/bmesh/operators/bmo_smooth_laplacian.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_smooth_laplacian.c	2013-05-06 22:53:11 UTC (rev 56519)
+++ trunk/blender/source/blender/bmesh/operators/bmo_smooth_laplacian.c	2013-05-07 00:00:32 UTC (rev 56520)
@@ -464,7 +464,7 @@
 	}
 
 	if (preserve_volume) {
-		vini = BM_mesh_calc_volume(sys->bm);
+		vini = BM_mesh_calc_volume(sys->bm, false);
 	}
 	BMO_ITER (v, &siter, sys->op->slots_in, "verts", BM_VERT) {
 		m_vertex_id = BM_elem_index_get(v);
@@ -481,7 +481,7 @@
 		}
 	}
 	if (preserve_volume) {
-		vend = BM_mesh_calc_volume(sys->bm);
+		vend = BM_mesh_calc_volume(sys->bm, false);
 		volume_preservation(sys->op, vini, vend, usex, usey, usez);
 	}
 

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types.c	2013-05-06 22:53:11 UTC (rev 56519)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types.c	2013-05-07 00:00:32 UTC (rev 56520)
@@ -1171,7 +1171,36 @@
 	Py_RETURN_NONE;
 }
 
+PyDoc_STRVAR(bpy_bmesh_calc_volume_doc,
+".. method:: calc_volume(signed=False)\n"
+"\n"
+"   Calculate mesh volume based on face normals.\n"
+"\n"
+"   :arg signed: when signed is true, negative values may be returned.\n"
+"   :type signed: bool\n"
+"   :return: The volume of the mesh.\n"
+"   :rtype: float\n"
+);
+static PyObject *bpy_bmesh_calc_volume(BPy_BMElem *self, PyObject *args, PyObject *kw)
+{
+	static const char *kwlist[] = {"signed", NULL};
+	PyObject *is_signed = Py_False;
 
+	BPY_BM_CHECK_OBJ(self);
+
+	if (!PyArg_ParseTupleAndKeywords(args, kw,
+	                                 "|O!:calc_volume",
+	                                 (char **)kwlist,
+	                                 &PyBool_Type, &is_signed))
+	{
+		return NULL;
+	}
+	else {
+		return PyFloat_FromDouble(BM_mesh_calc_volume(self->bm, is_signed != Py_False));
+	}
+}
+
+
 /* Elem
  * ---- */
 
@@ -2454,6 +2483,9 @@
 	{"select_flush", (PyCFunction)bpy_bmesh_select_flush, METH_O, bpy_bmesh_select_flush_doc},
 	{"normal_update", (PyCFunction)bpy_bmesh_normal_update, METH_NOARGS, bpy_bmesh_normal_update_doc},
 	{"transform", (PyCFunction)bpy_bmesh_transform, METH_VARARGS | METH_KEYWORDS, bpy_bmesh_transform_doc},
+
+	/* calculations */
+	{"calc_volume", (PyCFunction)bpy_bmesh_calc_volume, METH_VARARGS | METH_KEYWORDS, bpy_bmesh_calc_volume_doc},
 	{NULL, NULL, 0, NULL}
 };
 




More information about the Bf-blender-cvs mailing list