forked from bartvdbraak/blender
GPencil: Added operators to select first and last points of strokes
These are useful for removing overshoots at the end of closed strokes (for fills)
This commit is contained in:
parent
0578d3ef3e
commit
dc4c3ce592
@ -992,6 +992,11 @@ class VIEW3D_MT_select_gpencil(Menu):
|
|||||||
|
|
||||||
layout.separator()
|
layout.separator()
|
||||||
|
|
||||||
|
layout.operator("gpencil.select_first")
|
||||||
|
layout.operator("gpencil.select_last")
|
||||||
|
|
||||||
|
layout.separator()
|
||||||
|
|
||||||
layout.operator("gpencil.select_more")
|
layout.operator("gpencil.select_more")
|
||||||
layout.operator("gpencil.select_less")
|
layout.operator("gpencil.select_less")
|
||||||
|
|
||||||
|
@ -177,6 +177,8 @@ void GPENCIL_OT_select_linked(struct wmOperatorType *ot);
|
|||||||
void GPENCIL_OT_select_grouped(struct wmOperatorType *ot);
|
void GPENCIL_OT_select_grouped(struct wmOperatorType *ot);
|
||||||
void GPENCIL_OT_select_more(struct wmOperatorType *ot);
|
void GPENCIL_OT_select_more(struct wmOperatorType *ot);
|
||||||
void GPENCIL_OT_select_less(struct wmOperatorType *ot);
|
void GPENCIL_OT_select_less(struct wmOperatorType *ot);
|
||||||
|
void GPENCIL_OT_select_first(struct wmOperatorType *ot);
|
||||||
|
void GPENCIL_OT_select_last(struct wmOperatorType *ot);
|
||||||
|
|
||||||
void GPENCIL_OT_duplicate(struct wmOperatorType *ot);
|
void GPENCIL_OT_duplicate(struct wmOperatorType *ot);
|
||||||
void GPENCIL_OT_delete(struct wmOperatorType *ot);
|
void GPENCIL_OT_delete(struct wmOperatorType *ot);
|
||||||
|
@ -323,6 +323,8 @@ void ED_operatortypes_gpencil(void)
|
|||||||
WM_operatortype_append(GPENCIL_OT_select_grouped);
|
WM_operatortype_append(GPENCIL_OT_select_grouped);
|
||||||
WM_operatortype_append(GPENCIL_OT_select_more);
|
WM_operatortype_append(GPENCIL_OT_select_more);
|
||||||
WM_operatortype_append(GPENCIL_OT_select_less);
|
WM_operatortype_append(GPENCIL_OT_select_less);
|
||||||
|
WM_operatortype_append(GPENCIL_OT_select_first);
|
||||||
|
WM_operatortype_append(GPENCIL_OT_select_last);
|
||||||
|
|
||||||
WM_operatortype_append(GPENCIL_OT_duplicate);
|
WM_operatortype_append(GPENCIL_OT_duplicate);
|
||||||
WM_operatortype_append(GPENCIL_OT_delete);
|
WM_operatortype_append(GPENCIL_OT_delete);
|
||||||
|
@ -348,6 +348,126 @@ void GPENCIL_OT_select_grouped(wmOperatorType *ot)
|
|||||||
ot->prop = RNA_def_enum(ot->srna, "type", prop_select_grouped_types, GP_SEL_SAME_LAYER, "Type", "");
|
ot->prop = RNA_def_enum(ot->srna, "type", prop_select_grouped_types, GP_SEL_SAME_LAYER, "Type", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ********************************************** */
|
||||||
|
/* Select First */
|
||||||
|
|
||||||
|
static int gpencil_select_first_exec(bContext *C, wmOperator *op)
|
||||||
|
{
|
||||||
|
const bool only_selected = RNA_boolean_get(op->ptr, "only_selected_strokes");
|
||||||
|
const bool extend = RNA_boolean_get(op->ptr, "extend");
|
||||||
|
|
||||||
|
CTX_DATA_BEGIN(C, bGPDstroke *, gps, editable_gpencil_strokes)
|
||||||
|
{
|
||||||
|
/* skip stroke if we're only manipulating selected strokes */
|
||||||
|
if (only_selected && !(gps->flag & GP_STROKE_SELECT)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* select first point */
|
||||||
|
BLI_assert(gps->totpoints >= 1);
|
||||||
|
|
||||||
|
gps->points->flag |= GP_SPOINT_SELECT;
|
||||||
|
gps->flag |= GP_STROKE_SELECT;
|
||||||
|
|
||||||
|
/* deselect rest? */
|
||||||
|
if ((extend == false) && (gps->totpoints > 1)) {
|
||||||
|
/* start from index 1, to skip the first point that we'd just selected... */
|
||||||
|
bGPDspoint *pt = &gps->points[1];
|
||||||
|
int i = 1;
|
||||||
|
|
||||||
|
for (; i < gps->totpoints; i++, pt++) {
|
||||||
|
pt->flag &= ~GP_SPOINT_SELECT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CTX_DATA_END;
|
||||||
|
|
||||||
|
/* updates */
|
||||||
|
WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, NULL);
|
||||||
|
return OPERATOR_FINISHED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GPENCIL_OT_select_first(wmOperatorType *ot)
|
||||||
|
{
|
||||||
|
/* identifiers */
|
||||||
|
ot->name = "Select First";
|
||||||
|
ot->idname = "GPENCIL_OT_select_first";
|
||||||
|
ot->description = "Select first point in Grease Pencil strokes";
|
||||||
|
|
||||||
|
/* callbacks */
|
||||||
|
ot->exec = gpencil_select_first_exec;
|
||||||
|
ot->poll = gpencil_select_poll;
|
||||||
|
|
||||||
|
/* flags */
|
||||||
|
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||||
|
|
||||||
|
/* properties */
|
||||||
|
RNA_def_boolean(ot->srna, "only_selected_strokes", false, "Selected Strokes Only",
|
||||||
|
"Only select the first point of strokes that already have points selected");
|
||||||
|
|
||||||
|
RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend selection instead of deselecting all other selected points");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ********************************************** */
|
||||||
|
/* Select First */
|
||||||
|
|
||||||
|
static int gpencil_select_last_exec(bContext *C, wmOperator *op)
|
||||||
|
{
|
||||||
|
const bool only_selected = RNA_boolean_get(op->ptr, "only_selected_strokes");
|
||||||
|
const bool extend = RNA_boolean_get(op->ptr, "extend");
|
||||||
|
|
||||||
|
CTX_DATA_BEGIN(C, bGPDstroke *, gps, editable_gpencil_strokes)
|
||||||
|
{
|
||||||
|
/* skip stroke if we're only manipulating selected strokes */
|
||||||
|
if (only_selected && !(gps->flag & GP_STROKE_SELECT)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* select last point */
|
||||||
|
BLI_assert(gps->totpoints >= 1);
|
||||||
|
|
||||||
|
gps->points[gps->totpoints - 1].flag |= GP_SPOINT_SELECT;
|
||||||
|
gps->flag |= GP_STROKE_SELECT;
|
||||||
|
|
||||||
|
/* deselect rest? */
|
||||||
|
if ((extend == false) && (gps->totpoints > 1)) {
|
||||||
|
/* don't include the last point... */
|
||||||
|
bGPDspoint *pt = gps->points;
|
||||||
|
int i = 1;
|
||||||
|
|
||||||
|
for (; i < gps->totpoints - 1; i++, pt++) {
|
||||||
|
pt->flag &= ~GP_SPOINT_SELECT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CTX_DATA_END;
|
||||||
|
|
||||||
|
/* updates */
|
||||||
|
WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, NULL);
|
||||||
|
return OPERATOR_FINISHED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GPENCIL_OT_select_last(wmOperatorType *ot)
|
||||||
|
{
|
||||||
|
/* identifiers */
|
||||||
|
ot->name = "Select Last";
|
||||||
|
ot->idname = "GPENCIL_OT_select_last";
|
||||||
|
ot->description = "Select last point in Grease Pencil strokes";
|
||||||
|
|
||||||
|
/* callbacks */
|
||||||
|
ot->exec = gpencil_select_last_exec;
|
||||||
|
ot->poll = gpencil_select_poll;
|
||||||
|
|
||||||
|
/* flags */
|
||||||
|
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||||
|
|
||||||
|
/* properties */
|
||||||
|
RNA_def_boolean(ot->srna, "only_selected_strokes", false, "Selected Strokes Only",
|
||||||
|
"Only select the last point of strokes that already have points selected");
|
||||||
|
|
||||||
|
RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend selection instead of deselecting all other selected points");
|
||||||
|
}
|
||||||
|
|
||||||
/* ********************************************** */
|
/* ********************************************** */
|
||||||
/* Select More */
|
/* Select More */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user