Commit: d7a366930409ab59c69c645ceded358af15fc8aa
Author: Antonio Vazquez
Date:   Fri Feb 2 16:59:10 2018 +0100
Branches: greasepencil-object
https://developer.blender.org/rBd7a366930409ab59c69c645ceded358af15fc8aa

New Split operator

Split selected points in a new stroke in the same frame. The stroke is not 
created in the current frame, but in the frame of the original stroke.

Shortcut: V

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

M       release/scripts/startup/bl_ui/properties_grease_pencil_common.py
M       release/scripts/startup/bl_ui/space_view3d.py
M       source/blender/editors/gpencil/gpencil_edit.c
M       source/blender/editors/gpencil/gpencil_intern.h
M       source/blender/editors/gpencil/gpencil_ops.c

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

diff --git a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py 
b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
index be0705d8a76..60f9590872e 100644
--- a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
+++ b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
@@ -238,6 +238,9 @@ class GreasePencilStrokeEditPanel:
         col.operator("gpencil.stroke_separate", text="Separate Stroke").mode = 
'STROKE'
         col.operator("gpencil.stroke_separate", text="Separate Layer").mode = 
'LAYER'
 
+        col.separator()
+        col.operator("gpencil.stroke_split", text="Split")
+
         col.separator()
         col.operator("gpencil.stroke_flip", text="Flip Direction")
 
@@ -1039,6 +1042,9 @@ class GPENCIL_MT_gpencil_edit_specials(Menu):
         layout.separator()
         layout.menu("GPENCIL_MT_separate", text="Separate")
 
+        layout.separator()
+        layout.operator("gpencil.stroke_split", text="Split")
+
         layout.separator()
 
         layout.operator("gpencil.stroke_join", text="Join").type = 'JOIN'
diff --git a/release/scripts/startup/bl_ui/space_view3d.py 
b/release/scripts/startup/bl_ui/space_view3d.py
index f047baf1b93..dd3fa8dcb97 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3327,6 +3327,7 @@ class VIEW3D_MT_edit_gpencil(Menu):
         layout.separator()
 
         layout.operator_menu_enum("gpencil.stroke_separate", "mode", 
text="Separate...")
+        layout.operator("gpencil.stroke_split", text="Split")
         layout.operator_menu_enum("gpencil.stroke_join", "type", 
text="Join...")
         layout.operator("gpencil.stroke_flip", text="Flip Direction")
 
diff --git a/source/blender/editors/gpencil/gpencil_edit.c 
b/source/blender/editors/gpencil/gpencil_edit.c
index 2f191b258ef..3f00edc29d1 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -3250,3 +3250,97 @@ void GPENCIL_OT_stroke_separate(wmOperatorType *ot)
        /* properties */
        ot->prop = RNA_def_enum(ot->srna, "mode", separate_type, 
GP_SEPARATE_POINT, "Mode", "");
 }
+
+/* ***************** Split Strokes ********************** */
+static int gp_stroke_split_exec(bContext *C, wmOperator *op)
+{
+       Scene *scene = CTX_data_scene(C);
+       bGPdata *gpd = ED_gpencil_data_get_active(C);
+       bGPDspoint *pt;
+       int i;
+
+       /* sanity checks */
+       if (ELEM(NULL, gpd)) {
+               return OPERATOR_CANCELLED;
+       }
+       bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+
+       /* loop strokes and split parts */
+       CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers)
+       {
+               bGPDframe *init_gpf = gpl->actframe;
+               if (is_multiedit) {
+                       init_gpf = gpl->frames.first;
+               }
+
+               for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) {
+                       if ((gpf == gpl->actframe) || ((gpf->flag & 
GP_FRAME_SELECT) && (is_multiedit))) {
+                               bGPDstroke *gps, *gpsn;
+
+                               if (gpf == NULL) {
+                                       continue;
+                               }
+
+                               for (gps = gpf->strokes.first; gps; gps = gpsn) 
{
+                                       gpsn = gps->next;
+
+                                       /* skip strokes that are invalid for 
current view */
+                                       if (ED_gpencil_stroke_can_use(C, gps) 
== false) {
+                                               continue;
+                                       }
+                                       /* check if the color is editable */
+                                       if (ED_gpencil_stroke_color_use(gpl, 
gps) == false) {
+                                               continue;
+                                       }
+                                       /*  split selected strokes */
+                                       if (gps->flag & GP_STROKE_SELECT) {
+                                               /* make copy of source stroke */
+                                               bGPDstroke *gps_dst = 
BKE_gpencil_stroke_duplicate(gps);
+
+                                               /* link to destination frame */
+                                               BLI_addtail(&gpf->strokes, 
gps_dst);
+
+                                               /* Invert selection status of 
all points in destination stroke */
+                                               for (i = 0, pt = 
gps_dst->points; i < gps_dst->totpoints; i++, pt++) {
+                                                       pt->flag ^= 
GP_SPOINT_SELECT;
+                                               }
+
+                                               /* delete selected points from 
destination stroke */
+                                               bGPDstroke *new_gps = NULL;
+                                               
gp_stroke_delete_tagged_points(gpf, gps_dst, new_gps, GP_SPOINT_SELECT);
+
+                                               /* delete selected points from 
origin stroke */
+                                               
gp_stroke_delete_tagged_points(gpf, gps, gpsn, GP_SPOINT_SELECT);
+                                       }
+                               }
+                       }
+
+                       /* if not multiedit, exit loop*/
+                       if (!is_multiedit) {
+                               break;
+                       }
+               }
+       }
+       CTX_DATA_END;
+
+       BKE_gpencil_batch_cache_dirty(gpd);
+
+       WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
+
+       return OPERATOR_FINISHED;
+}
+
+void GPENCIL_OT_stroke_split(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Split Strokes";
+       ot->idname = "GPENCIL_OT_stroke_split";
+       ot->description = "Split selected points as new stroke on same frame";
+
+       /* callbacks */
+       ot->exec = gp_stroke_split_exec;
+       ot->poll = gp_strokes_edit3d_poll;
+
+       /* flags */
+       ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
diff --git a/source/blender/editors/gpencil/gpencil_intern.h 
b/source/blender/editors/gpencil/gpencil_intern.h
index ca8bae77e65..6c7b5bc4e52 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -440,6 +440,7 @@ void GPENCIL_OT_stroke_subdivide(struct wmOperatorType *ot);
 void GPENCIL_OT_stroke_simplify(struct wmOperatorType *ot);
 void GPENCIL_OT_stroke_simplify_fixed(struct wmOperatorType *ot);
 void GPENCIL_OT_stroke_separate(struct wmOperatorType *ot);
+void GPENCIL_OT_stroke_split(struct wmOperatorType *ot);
 
 void GPENCIL_OT_brush_add(struct wmOperatorType *ot);
 void GPENCIL_OT_brush_remove(struct wmOperatorType *ot);
diff --git a/source/blender/editors/gpencil/gpencil_ops.c 
b/source/blender/editors/gpencil/gpencil_ops.c
index 70ac5493f79..f14df660485 100644
--- a/source/blender/editors/gpencil/gpencil_ops.c
+++ b/source/blender/editors/gpencil/gpencil_ops.c
@@ -342,6 +342,9 @@ static void ed_keymap_gpencil_editing(wmKeyConfig *keyconf)
        /* menu separate */
        WM_keymap_add_menu(keymap, "GPENCIL_MT_separate", PKEY, KM_PRESS, 0, 0);
 
+       /* split strokes */
+       WM_keymap_add_item(keymap, "GPENCIL_OT_stroke_split", VKEY, KM_PRESS, 
0, 0);
+
        /* join strokes */
        WM_keymap_add_item(keymap, "GPENCIL_OT_stroke_join", JKEY, KM_PRESS, 
KM_CTRL, 0);
        
@@ -767,6 +770,7 @@ void ED_operatortypes_gpencil(void)
        WM_operatortype_append(GPENCIL_OT_stroke_simplify);
        WM_operatortype_append(GPENCIL_OT_stroke_simplify_fixed);
        WM_operatortype_append(GPENCIL_OT_stroke_separate);
+       WM_operatortype_append(GPENCIL_OT_stroke_split);
 
        WM_operatortype_append(GPENCIL_OT_brush_add);
        WM_operatortype_append(GPENCIL_OT_brush_remove);

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to