/*! \brief Copy a box to a list. * \par Function Description * The function #geda_box_object_copy() creates a verbatim copy of the object * pointed by <B>o_current</B> describing a box. * * \param [in] toplevel The TOPLEVEL object. * \param [in] o_current BOX OBJECT to copy. * \return The new OBJECT */ OBJECT* geda_box_object_copy(TOPLEVEL *toplevel, OBJECT *o_current) { OBJECT *new_obj; /* A new box object is created with #geda_box_object_new(). * Values for its fields are default and need to be modified. */ new_obj = geda_box_object_new (toplevel, OBJ_BOX, o_current->color, 0, 0, 0, 0); /* * The dimensions of the new box are set with the ones of the original box. * The two boxes have the same line type and the same filling options. */ new_obj->box->upper_x = o_current->box->upper_x; new_obj->box->upper_y = o_current->box->upper_y; new_obj->box->lower_x = o_current->box->lower_x; new_obj->box->lower_y = o_current->box->lower_y; o_set_line_options(toplevel, new_obj, o_current->line_end, o_current->line_type, o_current->line_width, o_current->line_length, o_current->line_space); o_set_fill_options(toplevel, new_obj, o_current->fill_type, o_current->fill_width, o_current->fill_pitch1, o_current->fill_angle1, o_current->fill_pitch2, o_current->fill_angle2); new_obj->w_bounds_valid_for = NULL; /* new_obj->attribute = 0;*/ return new_obj; }
/*! \brief End the input of a box. * \par Function Description * This function ends the input of the second corner of a box. * The (<B>w_x</B>,<B>w_y</B>) point is set to be this second corner. The box is * then defined by (<B>w_current->first_wx</B>,<B>w_current->first_wy</B> and * (<B>w_current->second_wx</B>,<B>w_current->second_wy</B>. * <B>w_x</B> and <B>w_y</B> are in screen unit. * * The temporary box is erased ; a new box object is allocated, initialized * and linked to the object list ; The object is finally drawn on the * current sheet. * * \param [in] w_current The GschemToplevel object. * \param [in] w_x Current x coordinate of pointer in world units. * \param [in] w_y Current y coordinate of pointer in world units. */ void o_box_end(GschemToplevel *w_current, int w_x, int w_y) { OBJECT *new_obj; GschemPageView *page_view = gschem_toplevel_get_current_page_view (w_current); g_return_if_fail (page_view != NULL); g_assert( w_current->inside_action != 0 ); PAGE *page = gschem_page_view_get_page (page_view); g_return_if_fail (page != NULL); TOPLEVEL *toplevel = page->toplevel; g_return_if_fail (toplevel != NULL); int box_width, box_height; int box_left, box_top; /* get the last coords of the pointer */ w_current->second_wx = w_x; w_current->second_wy = w_y; /* erase the temporary box */ /* o_box_invalidate_rubber (w_current); */ w_current->rubber_visible = 0; box_width = GET_BOX_WIDTH (w_current); box_height = GET_BOX_HEIGHT(w_current); box_left = GET_BOX_LEFT (w_current); box_top = GET_BOX_TOP (w_current); /* boxes with null width or height are not allowed */ if ((box_width == 0) || (box_height == 0)) { /* cancel the object creation */ w_current->first_wx = (-1); w_current->first_wy = (-1); w_current->second_wx = (-1); w_current->second_wy = (-1); } else { /* create the object */ new_obj = geda_box_object_new (toplevel, OBJ_BOX, GRAPHIC_COLOR, box_left, box_top, box_left + box_width, box_top - box_height); s_page_append (toplevel, page, new_obj); #if DEBUG printf("coords: %d %d %d %d\n", box_left, box_top, box_width, box_height); #endif w_current->first_wx = (-1); w_current->first_wy = (-1); w_current->second_wx = (-1); w_current->second_wy = (-1); /* Call add-objects-hook */ g_run_hook_object (w_current, "%add-objects-hook", new_obj); gschem_toplevel_page_content_changed (w_current, page); o_undo_savestate(w_current, page, UNDO_ALL); } i_action_stop (w_current); }
/*! \brief Create a box from a character string. * \par Function Description * This function gets the description of a box from the <B>*buf</B> character * string. * * Depending on <B>*version</B>, the correct file format is considered. * Currently two file format revisions are supported : * <DL> * <DT>*</DT><DD>the file format used until 20000704 release * <DT>*</DT><DD>the file format used for the releases after 2000704. * </DL> * * \param [in] toplevel The TOPLEVEL object. * \param [in] buf Character string with box description. * \param [in] release_ver libgeda release version number. * \param [in] fileformat_ver libgeda file format version number. * \return The BOX OBJECT that was created, or NULL on error. */ OBJECT *o_box_read (TOPLEVEL *toplevel, const char buf[], unsigned int release_ver, unsigned int fileformat_ver, GError **err) { OBJECT *new_obj; char type; int x1, y1; int width, height; int d_x1, d_y1; int d_x2, d_y2; int color; int box_width, box_space, box_length; int fill_width, angle1, pitch1, angle2, pitch2; int box_end; int box_type; int box_filling; if (release_ver <= VERSION_20000704) { /*! \note * The old geda file format, i.e. releases 20000704 and older, does not * handle the line type and the filling of the box object. They are set * to default. */ if (sscanf (buf, "%c %d %d %d %d %d\n", &type, &x1, &y1, &width, &height, &color) != 6) { g_set_error(err, EDA_ERROR, EDA_ERROR_PARSE, _("Failed to parse box object")); return NULL; } box_width = 0; box_end = END_NONE; box_type = TYPE_SOLID; box_length = -1; box_space = -1; box_filling = FILLING_HOLLOW; fill_width = 0; angle1 = -1; pitch1 = -1; angle2 = -1; pitch2 = -1; } else { /*! \note * The current line format to describe a box is a space separated list of * characters and numbers in plain ASCII on a single line. The meaning of * each item is described in the file format documentation. */ if (sscanf (buf, "%c %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", &type, &x1, &y1, &width, &height, &color, &box_width, &box_end, &box_type, &box_length, &box_space, &box_filling, &fill_width, &angle1, &pitch1, &angle2, &pitch2) != 17) { g_set_error(err, EDA_ERROR, EDA_ERROR_PARSE, _("Failed to parse box object")); return NULL; } } if (width == 0 || height == 0) { s_log_message (_("Found a zero width/height box [ %c %d %d %d %d %d ]\n"), type, x1, y1, width, height, color); } if (color < 0 || color > MAX_COLORS) { s_log_message (_("Found an invalid color [ %s ]\n"), buf); s_log_message (_("Setting color to default color\n")); color = DEFAULT_COLOR; } /*! \note * A box is internally described by its lower right and upper left corner * whereas the line describe it with the lower left corner and the width * and height. * * A new object is allocated, initialized and added to the object list. * Its filling and line type are set according to the values of the field * on the line. */ /* upper left corner of the box */ d_x1 = x1; d_y1 = y1 + height; /* move box origin to top left */ /* lower right corner of the box */ d_x2 = x1 + width; /* end points of the box */ d_y2 = y1; /* create a new box */ new_obj = geda_box_object_new (toplevel, type, color, d_x1, d_y1, d_x2, d_y2); /* set its line options */ o_set_line_options (toplevel, new_obj, box_end, box_type, box_width, box_length, box_space); /* set its fill options */ o_set_fill_options (toplevel, new_obj, box_filling, fill_width, pitch1, angle1, pitch2, angle2); return new_obj; }