[Bf-blender-cvs] [6d04affdd72] greasepencil-object: GPencil: More changes to trace image

Antonio Vazquez noreply at git.blender.org
Wed Jul 22 15:34:40 CEST 2020


Commit: 6d04affdd72efa80fd9e9a3c0e30033842f40894
Author: Antonio Vazquez
Date:   Wed Jul 22 15:33:09 2020 +0200
Branches: greasepencil-object
https://developer.blender.org/rB6d04affdd72efa80fd9e9a3c0e30033842f40894

GPencil: More changes to trace image

Cleanup code and tweaks

===================================================================

M	release/scripts/startup/bl_operators/gpencil_trace_image.py
M	source/blender/editors/gpencil/gpencil_trace_ops.c

===================================================================

diff --git a/release/scripts/startup/bl_operators/gpencil_trace_image.py b/release/scripts/startup/bl_operators/gpencil_trace_image.py
index f8ab61faac3..a8366909381 100644
--- a/release/scripts/startup/bl_operators/gpencil_trace_image.py
+++ b/release/scripts/startup/bl_operators/gpencil_trace_image.py
@@ -116,16 +116,19 @@ class GPENCIL_OT_trace(Operator):
         return context.space_data.type == 'IMAGE_EDITOR'
 
     def execute(self, context):
-        bpy.ops.gpencil.trace_image(
-            target=self.target,
-            frame_target=self.frame_target,
-            thickness=self.thickness,
-            resolution=self.resolution,
-            scale=self.scale,
-            sample=self.sample,
-            threshold=self.threshold,
-            turnpolicy=self.turnpolicy
-        )
+        try:
+            bpy.ops.gpencil.trace_image(
+                target=self.target,
+                frame_target=self.frame_target,
+                thickness=self.thickness,
+                resolution=self.resolution,
+                scale=self.scale,
+                sample=self.sample,
+                threshold=self.threshold,
+                turnpolicy=self.turnpolicy
+            )
+        except:
+            print("Unable to complete trace")
 
         return {'FINISHED'}
 
diff --git a/source/blender/editors/gpencil/gpencil_trace_ops.c b/source/blender/editors/gpencil/gpencil_trace_ops.c
index bd08ba17745..dc0b68bd15f 100644
--- a/source/blender/editors/gpencil/gpencil_trace_ops.c
+++ b/source/blender/editors/gpencil/gpencil_trace_ops.c
@@ -60,33 +60,23 @@
 #include "gpencil_trace.h"
 #include "potracelib.h"
 
-/* Trace Image to Grease Pencil. */
-static bool gpencil_trace_image_poll(bContext *C)
-{
-  SpaceLink *sl = CTX_wm_space_data(C);
-  if ((sl != NULL) && (sl->spacetype == SPACE_IMAGE)) {
-    SpaceImage *sima = CTX_wm_space_image(C);
-    return (sima->image != NULL);
-  }
-
-  return false;
-}
-
-static int gpencil_trace_image_exec(bContext *C, wmOperator *op)
+/**
+ * Trace a image.
+ * \param C: Context
+ * \param op: Operator
+ * \param ob: Grease pencil object, can be NULL
+ * \param ima: Image
+ * \param gpf: Destination frame
+ */
+static bool gpencil_trace_image(
+    bContext *C, wmOperator *op, Object *ob, Image *ima, bGPDframe *gpf)
 {
   Main *bmain = CTX_data_main(C);
-  Scene *scene = CTX_data_scene(C);
-  View3D *v3d = CTX_wm_view3d(C);
-  SpaceImage *sima = CTX_wm_space_image(C);
-  Object *ob_gpencil = NULL;
 
   potrace_bitmap_t *bm = NULL;
   potrace_param_t *param = NULL;
   potrace_state_t *st = NULL;
 
-  char target[64];
-  RNA_string_get(op->ptr, "target", target);
-  const int frame_target = RNA_int_get(op->ptr, "frame_target");
   const float threshold = RNA_float_get(op->ptr, "threshold");
   const float scale = RNA_float_get(op->ptr, "scale");
   const float sample = RNA_float_get(op->ptr, "sample");
@@ -96,51 +86,22 @@ static int gpencil_trace_image_exec(bContext *C, wmOperator *op)
 
   ImBuf *ibuf;
   void *lock;
-  ibuf = BKE_image_acquire_ibuf(sima->image, NULL, &lock);
+  ibuf = BKE_image_acquire_ibuf(ima, NULL, &lock);
 
   /* Create an empty BW bitmap. */
   bm = ED_gpencil_trace_bm_new(ibuf->x, ibuf->y);
   if (!bm) {
-    return OPERATOR_CANCELLED;
+    return false;
   }
 
   /* Set tracing parameters, starting from defaults */
   param = potrace_param_default();
   if (!param) {
-    return OPERATOR_CANCELLED;
+    return false;
   }
   param->turdsize = 0;
   param->turnpolicy = turnpolicy;
 
-  /* Create a new grease pencil object in origin. */
-  bool newob = false;
-  if (STREQ(target, "*NEW")) {
-    ushort local_view_bits = (v3d && v3d->localvd) ? v3d->local_view_uuid : 0;
-    float loc[3] = {0.0f, 0.0f, 0.0f};
-    ob_gpencil = ED_gpencil_add_object(C, loc, local_view_bits);
-    newob = true;
-  }
-  else {
-    ob_gpencil = BLI_findstring(&bmain->objects, target, offsetof(ID, name) + 2);
-  }
-
-  if ((ob_gpencil == NULL) || (ob_gpencil->type != OB_GPENCIL)) {
-    BKE_report(op->reports, RPT_ERROR, "Target grease pencil object not valid");
-    return OPERATOR_CANCELLED;
-  }
-  bGPdata *gpd = (bGPdata *)ob_gpencil->data;
-
-  /* Create Layer and frame. */
-  bGPDlayer *gpl = NULL;
-  if (!newob) {
-    gpl = BKE_gpencil_layer_active_get(gpd);
-  }
-
-  if (gpl == NULL) {
-    gpl = BKE_gpencil_layer_addnew(gpd, DATA_("Trace"), true);
-  }
-  bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, frame_target, GP_GETFRAME_ADD_NEW);
-
   /* Load BW bitmap with image. */
   ED_gpencil_trace_image_to_bm(ibuf, bm, threshold);
 
@@ -152,7 +113,7 @@ static int gpencil_trace_image_exec(bContext *C, wmOperator *op)
       potrace_state_free(st);
     }
     potrace_param_free(param);
-    return OPERATOR_CANCELLED;
+    return false;
   }
   /* Free BW bitmap. */
   ED_gpencil_trace_bm_free(bm);
@@ -162,7 +123,7 @@ static int gpencil_trace_image_exec(bContext *C, wmOperator *op)
   offset[0] = ibuf->x / 2;
   offset[1] = ibuf->y / 2;
   ED_gpencil_trace_data_to_strokes(
-      bmain, st, ob_gpencil, gpf, offset, scale, sample, resolution, thickness);
+      bmain, st, ob, gpf, offset, scale, sample, resolution, thickness);
 
   /* Free memory. */
   potrace_state_free(st);
@@ -170,13 +131,76 @@ static int gpencil_trace_image_exec(bContext *C, wmOperator *op)
 
   /* Release ibuf. */
   if (ibuf) {
-    BKE_image_release_ibuf(sima->image, ibuf, lock);
+    BKE_image_release_ibuf(ima, ibuf, lock);
+  }
+
+  return true;
+}
+
+/* Trace Image to Grease Pencil. */
+static bool gpencil_trace_image_poll(bContext *C)
+{
+  SpaceLink *sl = CTX_wm_space_data(C);
+  if ((sl != NULL) && (sl->spacetype == SPACE_IMAGE)) {
+    SpaceImage *sima = CTX_wm_space_image(C);
+    return (sima->image != NULL);
+  }
+
+  return false;
+}
+
+static int gpencil_trace_image_exec(bContext *C, wmOperator *op)
+{
+  Main *bmain = CTX_data_main(C);
+  Scene *scene = CTX_data_scene(C);
+  View3D *v3d = CTX_wm_view3d(C);
+  SpaceImage *sima = CTX_wm_space_image(C);
+  Object *ob = NULL;
+  bool ob_created = false;
+
+  if (sima->image->type != IMA_TYPE_IMAGE) {
+    BKE_report(op->reports, RPT_ERROR, "Image format not supported");
+    return OPERATOR_CANCELLED;
   }
 
+  char target[64];
+  RNA_string_get(op->ptr, "target", target);
+  const int frame_target = RNA_int_get(op->ptr, "frame_target");
+
+  /* Create a new grease pencil object in origin. */
+  if (ob == NULL) {
+    if (STREQ(target, "*NEW")) {
+      ushort local_view_bits = (v3d && v3d->localvd) ? v3d->local_view_uuid : 0;
+      float loc[3] = {0.0f, 0.0f, 0.0f};
+      ob = ED_gpencil_add_object(C, loc, local_view_bits);
+      ob_created = true;
+    }
+    else {
+      ob = BLI_findstring(&bmain->objects, target, offsetof(ID, name) + 2);
+    }
+  }
+
+  if ((ob == NULL) || (ob->type != OB_GPENCIL)) {
+    BKE_report(op->reports, RPT_ERROR, "Target grease pencil object not valid");
+    return OPERATOR_CANCELLED;
+  }
+
+  /* Create Layer. */
+  bGPdata *gpd = (bGPdata *)ob->data;
+  bGPDlayer *gpl = BKE_gpencil_layer_active_get(gpd);
+  if (gpl == NULL) {
+    gpl = BKE_gpencil_layer_addnew(gpd, DATA_("Trace"), true);
+  }
+
+  /* Create frame. */
+  bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, frame_target, GP_GETFRAME_ADD_NEW);
+  gpencil_trace_image(C, op, ob, sima->image, gpf);
+
   /* notifiers */
-  if (newob) {
+  if (ob_created) {
     DEG_relations_tag_update(bmain);
   }
+
   DEG_id_tag_update(&scene->id, ID_RECALC_SELECT);
   DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE);



More information about the Bf-blender-cvs mailing list