/* Delete selected grease-pencil layers */ void delete_gpencil_layers (void) { ListBase act_data = {NULL, NULL}; bActListElem *ale, *next; void *data; short datatype; int filter; /* determine what type of data we are operating on */ data = get_action_context(&datatype); if (data == NULL) return; if (datatype != ACTCONT_GPENCIL) return; /* filter data */ filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_CHANNELS | ACTFILTER_SEL); actdata_filter(&act_data, filter, data, datatype); /* clean up grease-pencil layers */ for (ale= act_data.first; ale; ale= next) { bGPdata *gpd= (bGPdata *)ale->owner; bGPDlayer *gpl= (bGPDlayer *)ale->data; next= ale->next; /* free layer and its data */ if (SEL_GPL(gpl)) { free_gpencil_frames(gpl); BLI_freelinkN(&gpd->layers, gpl); } /* free temp memory */ BLI_freelinkN(&act_data, ale); } BIF_undo_push("Delete GPencil Layers"); }
void paste_gpdata (Scene *scene) { ListBase act_data = {NULL, NULL}; bActListElem *ale; int filter; void *data; short datatype; const int offset = (CFRA - gpcopy_firstframe); short no_name= 0; /* check if buffer is empty */ if (ELEM(NULL, gpcopybuf.first, gpcopybuf.last)) { error("No data in buffer to paste"); return; } /* check if single channel in buffer (disregard names if so) */ if (gpcopybuf.first == gpcopybuf.last) no_name= 1; /* get data */ data= get_action_context(&datatype); if (data == NULL) return; if (datatype != ACTCONT_GPENCIL) return; /* filter data */ filter= (ACTFILTER_VISIBLE | ACTFILTER_SEL | ACTFILTER_FOREDIT); actdata_filter(&act_data, filter, data, datatype); /* from selected channels */ for (ale= act_data.first; ale; ale= ale->next) { bGPDlayer *gpld= (bGPDlayer *)ale->data; bGPDlayer *gpls= NULL; bGPDframe *gpfs, *gpf; /* find suitable layer from buffer to use to paste from */ for (gpls= gpcopybuf.first; gpls; gpls= gpls->next) { /* check if layer name matches */ if ((no_name) || (strcmp(gpls->info, gpld->info)==0)) break; } /* this situation might occur! */ if (gpls == NULL) continue; /* add frames from buffer */ for (gpfs= gpls->frames.first; gpfs; gpfs= gpfs->next) { /* temporarily apply offset to buffer-frame while copying */ gpfs->framenum += offset; /* get frame to copy data into (if no frame returned, then just ignore) */ gpf= gpencil_layer_getframe(gpld, gpfs->framenum, 1); if (gpf) { bGPDstroke *gps, *gpsn; ScrArea *sa; /* get area that gp-data comes from */ //sa= gpencil_data_findowner((bGPdata *)ale->owner); sa = NULL; /* this should be the right frame... as it may be a pre-existing frame, * must make sure that only compatible stroke types get copied over * - we cannot just add a duplicate frame, as that would cause errors * - need to check for compatible types to minimise memory usage (copying 'junk' over) */ for (gps= gpfs->strokes.first; gps; gps= gps->next) { short stroke_ok; /* if there's an area, check that it supports this type of stroke */ if (sa) { stroke_ok= 0; /* check if spacetype supports this type of stroke * - NOTE: must sync this with gp_paint_initstroke() in gpencil.c */ switch (sa->spacetype) { case SPACE_VIEW3D: /* 3D-View: either screen-aligned or 3d-space */ if ((gps->flag == 0) || (gps->flag & GP_STROKE_3DSPACE)) stroke_ok= 1; break; case SPACE_NODE: /* Nodes Editor: either screen-aligned or view-aligned */ case SPACE_IMAGE: /* Image Editor: either screen-aligned or view\image-aligned */ if ((gps->flag == 0) || (gps->flag & GP_STROKE_2DSPACE)) stroke_ok= 1; break; case SPACE_SEQ: /* Sequence Editor: either screen-aligned or view-aligned */ if ((gps->flag == 0) || (gps->flag & GP_STROKE_2DIMAGE)) stroke_ok= 1; break; } } else stroke_ok= 1; /* if stroke is ok, we make a copy of this stroke and add to frame */ if (stroke_ok) { /* make a copy of stroke, then of its points array */ gpsn= MEM_dupallocN(gps); gpsn->points= MEM_dupallocN(gps->points); /* append stroke to frame */ BLI_addtail(&gpf->strokes, gpsn); } } /* if no strokes (i.e. new frame) added, free gpf */ if (gpf->strokes.first == NULL) gpencil_layer_delframe(gpld, gpf); } /* unapply offset from buffer-frame */ gpfs->framenum -= offset; } } /* free temp memory */ BLI_freelistN(&act_data); /* undo and redraw stuff */ BIF_undo_push("Paste Grease Pencil Frames"); }
void remake_editMesh(Scene *scene, Object *ob) { make_editMesh(scene, ob); DAG_id_tag_update(&ob->id, OB_RECALC_DATA); BIF_undo_push("Undo all changes"); }