[Bf-blender-cvs] [d7a36693040] greasepencil-object: New Split operator

Antonio Vazquez noreply at git.blender.org
Fri Feb 2 17:43:28 CET 2018


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);



More information about the Bf-blender-cvs mailing list