[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45653] trunk/blender/source/blender: make ngon_perimeter into a public api function and expose to python.

Campbell Barton ideasman42 at gmail.com
Sun Apr 15 12:09:27 CEST 2012


Revision: 45653
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45653
Author:   campbellbarton
Date:     2012-04-15 10:09:27 +0000 (Sun, 15 Apr 2012)
Log Message:
-----------
make ngon_perimeter into a public api function and expose to python.

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

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c	2012-04-15 10:07:57 UTC (rev 45652)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c	2012-04-15 10:09:27 UTC (rev 45653)
@@ -191,6 +191,22 @@
 }
 
 /**
+ * compute the perimeter of an ngon
+ */
+float BM_face_perimeter_calc(BMesh *UNUSED(bm), BMFace *f)
+{
+	BMLoop *l_iter, *l_first;
+	float perimeter = 0.0f;
+
+	l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+	do {
+		perimeter += len_v3v3(l_iter->v->co, l_iter->next->v->co);
+	} while ((l_iter = l_iter->next) != l_first);
+
+	return perimeter;
+}
+
+/**
  * computes center of face in 3d.  uses center of bounding box.
  */
 void BM_face_center_bounds_calc(BMesh *UNUSED(bm), BMFace *f, float r_cent[3])

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h	2012-04-15 10:07:57 UTC (rev 45652)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h	2012-04-15 10:09:27 UTC (rev 45653)
@@ -28,6 +28,7 @@
  */
 
 float BM_face_area_calc(BMesh *bm, BMFace *f);
+float BM_face_perimeter_calc(BMesh *bm, BMFace *f);
 void  BM_face_center_bounds_calc(BMesh *bm, BMFace *f, float center[3]);
 void  BM_face_center_mean_calc(BMesh *bm, BMFace *f, float center[3]);
 

Modified: trunk/blender/source/blender/bmesh/operators/bmo_utils.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_utils.c	2012-04-15 10:07:57 UTC (rev 45652)
+++ trunk/blender/source/blender/bmesh/operators/bmo_utils.c	2012-04-15 10:09:27 UTC (rev 45653)
@@ -459,36 +459,6 @@
 }
 
 /*
- * compute the perimeter of an ngon
- *
- * NOTE: This should probably go to bmesh_polygon.c
- */
-static float ngon_perimeter(BMesh *bm, BMFace *f)
-{
-	BMIter  liter;
-	BMLoop *l;
-	int     num_verts = 0;
-	float   v[3], sv[3];
-	float   perimeter = 0.0f;
-
-	BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
-		if (num_verts == 0) {
-			copy_v3_v3(v, l->v->co);
-			copy_v3_v3(sv, l->v->co);
-		}
-		else {
-			perimeter += len_v3v3(v, l->v->co);
-			copy_v3_v3(v, l->v->co);
-		}
-		num_verts++;
-	}
-
-	perimeter += len_v3v3(v, sv);
-
-	return perimeter;
-}
-
-/*
  * compute the fake surface of an ngon
  * This is done by decomposing the ngon into triangles who share the centroid of the ngon
  * while this method is far from being exact, it should garantee an invariance.
@@ -593,7 +563,7 @@
 			switch (type) {
 				case SIMFACE_PERIMETER:
 					/* set the perimeter */
-					f_ext[i].perim = ngon_perimeter(bm, f_ext[i].f);
+					f_ext[i].perim = BM_face_perimeter_calc(bm, f_ext[i].f);
 					break;
 
 				case SIMFACE_COPLANAR:

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types.c	2012-04-15 10:07:57 UTC (rev 45652)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types.c	2012-04-15 10:09:27 UTC (rev 45653)
@@ -1400,6 +1400,21 @@
 }
 
 
+PyDoc_STRVAR(bpy_bmface_calc_perimeter_doc,
+".. method:: calc_perimeter()\n"
+"\n"
+"   Return the perimeter of the face.\n"
+"\n"
+"   :return: Return the perimeter of the face.\n"
+"   :rtype: float\n"
+);
+static PyObject *bpy_bmface_calc_perimeter(BPy_BMFace *self)
+{
+	BPY_BM_CHECK_OBJ(self);
+	return PyFloat_FromDouble(BM_face_perimeter_calc(self->bm, self->f));
+}
+
+
 PyDoc_STRVAR(bpy_bmface_calc_center_mean_doc,
 ".. method:: calc_center_median()\n"
 "\n"
@@ -2081,6 +2096,7 @@
     {"copy", (PyCFunction)bpy_bmface_copy, METH_VARARGS|METH_KEYWORDS, bpy_bmface_copy_doc},
 
     {"calc_area",          (PyCFunction)bpy_bmface_calc_area,          METH_NOARGS, bpy_bmface_calc_area_doc},
+    {"calc_perimeter",     (PyCFunction)bpy_bmface_calc_perimeter,     METH_NOARGS, bpy_bmface_calc_perimeter_doc},
     {"calc_center_median", (PyCFunction)bpy_bmface_calc_center_mean,   METH_NOARGS, bpy_bmface_calc_center_mean_doc},
     {"calc_center_bounds", (PyCFunction)bpy_bmface_calc_center_bounds, METH_NOARGS, bpy_bmface_calc_center_bounds_doc},
 




More information about the Bf-blender-cvs mailing list