void delete_splinearrow(F_spline *spline, F_point *prev_point, F_point *selected_point) { if (closed_spline(spline)) return; if (prev_point == NULL) { /* selected_point is the first point */ if (!spline->back_arrow) return; draw_spline(spline, ERASE); saved_back_arrow=spline->back_arrow; if (saved_for_arrow && saved_for_arrow != spline->for_arrow) free((char *) saved_for_arrow); saved_for_arrow = NULL; spline->back_arrow = NULL; redisplay_spline(spline); } else if (selected_point->next == NULL) { /* forward arrow */ if (!spline->for_arrow) return; draw_spline(spline, ERASE); saved_for_arrow=spline->for_arrow; if (saved_back_arrow && saved_back_arrow != spline->back_arrow) free((char *) saved_back_arrow); saved_back_arrow = NULL; spline->for_arrow = NULL; redisplay_spline(spline); } else return; clean_up(); set_last_prevpoint(prev_point); set_last_selectedpoint(selected_point); set_latestspline(spline); set_action_object(F_DELETE_ARROW_HEAD, O_SPLINE); set_modifiedflag(); }
static void init_delete_point(F_line *obj, int type, int x, int y, F_point *p, F_point *q) { int n; switch (type) { case O_POLYLINE: cur_l = (F_line *) obj; /* the search routine will ensure we don't have a box */ n = num_points(cur_l->points); if (cur_l->type == T_POLYGON) { if (n <= 4) { /* count first pt twice for closed object */ put_msg("A polygon cannot have less than 3 points"); beep(); return; } } else if (n <= 1) { /* alternative would be to remove the dot altogether */ put_msg("A dot must have at least 1 point"); beep(); return; } linepoint_deleting(cur_l, p, q); break; case O_SPLINE: cur_s = (F_spline *) obj; n = num_points(cur_s->points); if (closed_spline(cur_s)) { if (n <= CLOSED_SPLINE_MIN_NUM_POINTS) { put_msg("A closed spline cannot have less than %d points", CLOSED_SPLINE_MIN_NUM_POINTS); beep(); return; } } else if (n <= OPEN_SPLINE_MIN_NUM_POINTS) { put_msg("A spline cannot have less than %d points", OPEN_SPLINE_MIN_NUM_POINTS); beep(); return; } splinepoint_deleting(cur_s, p, q); break; default: return; } }
void undo_open_close(void) { switch (last_object) { case O_POLYLINE: if (saved_objects.lines->type == T_POLYGON) { saved_objects.lines->for_arrow = last_for_arrow; saved_objects.lines->back_arrow = last_back_arrow; last_for_arrow = last_back_arrow = NULL; } toggle_polyline_polygon(saved_objects.lines, last_prev_point, last_selected_point); break; case O_SPLINE: if (saved_objects.splines->type == T_OPEN_XSPLINE) { F_sfactor *c_tmp; draw_spline(saved_objects.splines, ERASE); saved_objects.splines->sfactors->s = last_origin_tension; for (c_tmp=saved_objects.splines->sfactors ; c_tmp->next != NULL ; c_tmp=c_tmp->next) ; c_tmp->s = last_extremity_tension; saved_objects.splines->type = T_CLOSED_XSPLINE; draw_spline(saved_objects.splines, PAINT); } else { if (closed_spline(saved_objects.splines)) { saved_objects.splines->for_arrow = last_for_arrow; saved_objects.splines->back_arrow = last_back_arrow; last_for_arrow = last_back_arrow = NULL; } toggle_open_closed_spline(saved_objects.splines, last_prev_point, last_selected_point); } break; } }
void toggle_open_closed_spline(F_spline *spline, F_point *previous_point, F_point *selected_point) { F_point *last_pt; F_sfactor *last_sfactor, *previous_sfactor, *selected_sfactor; if (spline->points->next == NULL || spline->points->next->next == NULL) { put_msg("Not enough points for a spline"); beep(); return; /* less than 3 points - don't close the spline */ } last_pt = last_point(spline->points); last_sfactor = search_sfactor(spline, last_pt); if (previous_point == NULL) { previous_sfactor = NULL; selected_sfactor = spline->sfactors; } else { previous_sfactor = search_sfactor(spline, previous_point); selected_sfactor = previous_sfactor->next; set_last_tension(selected_sfactor->s, previous_sfactor->s); } draw_spline(spline, ERASE); if (closed_spline(spline)) { if (spline->points != selected_point) { last_pt->next = spline->points; last_sfactor->next = spline->sfactors; previous_point->next = NULL; previous_sfactor->next = NULL; previous_sfactor->s = S_SPLINE_ANGULAR; spline->points = selected_point; spline->sfactors = selected_sfactor; } else { last_sfactor->s = S_SPLINE_ANGULAR; } spline->sfactors->s = S_SPLINE_ANGULAR; spline->type = (x_spline(spline)) ? T_OPEN_XSPLINE : (int_spline(spline)) ? T_OPEN_INTERP : T_OPEN_APPROX; clean_up(); } else { int type_tmp; double s_tmp; if(int_spline(spline)) { s_tmp = S_SPLINE_INTERP; type_tmp = T_CLOSED_INTERP; } else if (x_spline(spline)) { s_tmp = S_SPLINE_INTERP; type_tmp = T_CLOSED_XSPLINE; } else { s_tmp = S_SPLINE_APPROX; type_tmp = T_CLOSED_APPROX; } spline->sfactors->s = last_sfactor->s = s_tmp; spline->type = type_tmp; clean_up(); set_last_arrows(spline->for_arrow, spline->back_arrow); spline->back_arrow = spline->for_arrow = NULL; } draw_spline(spline, PAINT); set_action_object(F_OPEN_CLOSE, O_SPLINE); set_last_selectedpoint(spline->points); set_last_prevpoint(NULL); set_latestspline(spline); set_modifiedflag(); }