/*****************************************************************************/ /* LibreDWG - free implementation of the DWG file format */ /* */ /* Copyright (C) 2009, 2023 Free Software Foundation, Inc. */ /* Copyright (C) 2010 Thien-Thi Nguyen */ /* */ /* This library is free software, licensed under the terms of the GNU */ /* General Public License as published by the Free Software Foundation, */ /* either version 3 of the License, or (at your option) any later version. */ /* You should have received a copy of the GNU General Public License */ /* along with this program. If not, see . */ /*****************************************************************************/ /* * load_dwg.c: load a DWG, get lines, text and circles * written by Felipe Castro * modified by Felipe CorrĂȘa da Silva Sances * modified by Thien-Thi Nguyen * modified by Reini Urban */ #include "config.h" #ifdef __STDC_ALLOC_LIB__ /* for strdup */ # define __STDC_WANT_LIB_EXT2__ 1 /* for strdup */ #else # define _USE_BSD 1 #endif #ifndef _XOPEN_SOURCE /* for strdup, snprintf */ # define _XOPEN_SOURCE 700 #endif #include #include #ifndef DISABLE_WRITE # include # include #endif #include "dwg.h" #include "dwg_api.h" #include "../src/bits.h" #include "../programs/suffix.inc" static int help (void); int verbosity (int argc, char **argv, int i, unsigned int *opts); #include "../programs/common.inc" static int usage (void) { printf ("\nUsage: load_dwg [-v[0-9]] DWGFILE\n"); return 1; } static int opt_version (void) { printf ("load_dwg %s\n", PACKAGE_VERSION); return 0; } static int help (void) { printf ("\nUsage: load_dwg [OPTION]... DWGFILE\n"); printf ("Example to add fingerprint elements to a DWG.\n" "\n"); printf (" -v[0-9], --verbose [0-9] verbosity\n"); printf (" --help display this help and exit\n"); printf (" --version output version information and exit\n" "\n"); printf ("GNU LibreDWG online manual: " "\n"); return 0; } static int add_fingerprint (Dwg_Data *dwg, dwg_point_3d *pt) { int error = 0; char text[128]; double height = dwg->header_vars.TEXTSIZE; time_t t = time (NULL); Dwg_Object_BLOCK_HEADER *hdr = dwg_get_block_header (dwg, &error); Dwg_Entity_TEXT *ent; if (error) return 1; #ifdef HAVE_WFORMAT_Y2K GCC46_DIAG_IGNORE (-Wformat-y2k) #endif strftime (text, sizeof (text), "Last updated: %c", localtime (&t)); #ifdef HAVE_WFORMAT_Y2K GCC46_DIAG_RESTORE #endif #ifdef USE_WRITE if ((ent = dwg_add_TEXT (hdr, text, pt, height))) { ent->horiz_alignment = HORIZ_ALIGNMENT_RIGHT; return 0; } else #endif return 1; } static int change_fingerprint (Dwg_Data *dwg, Dwg_Entity_TEXT *_obj) { char text[128]; double height = dwg->header_vars.TEXTSIZE; time_t t = time (NULL); #ifdef HAVE_WFORMAT_Y2K GCC46_DIAG_IGNORE (-Wformat-y2k) #endif strftime (text, sizeof (text), "Last updated: %c", localtime (&t)); #ifdef HAVE_WFORMAT_Y2K GCC46_DIAG_RESTORE #endif if (dwg->header.version < R_2007) { if (strlen (text) < strlen (_obj->text_value)) strcpy (_obj->text_value, text); else { free (_obj->text_value); _obj->text_value = strdup (text); } } else { free (_obj->text_value); _obj->text_value = (BITCODE_TV)bit_utf8_to_TU (text, 0); } return 0; } static int load_dwg (char *filename, unsigned int opts) { BITCODE_BL i; int success, found = 0; Dwg_Data dwg; dwg_point_3d pt; #ifdef USE_WRITE char *new_filename = (char *)malloc (strlen (filename) + 4); char *fn = strdup (filename); char *base = basename (fn); char *p; struct stat st; if ((p = strrchr (base, '.'))) *p = '\0'; sprintf (new_filename, "%s_new.dwg", base); free (fn); #endif memset (&dwg, 0, sizeof (Dwg_Data)); dwg.opts = opts; success = dwg_read_file (filename, &dwg); // get the insertion point for our fingerprint pt.x = dwg.header_vars.LIMMAX.x; pt.y = dwg.header_vars.LIMMAX.y; pt.z = 0.0; // check if a fingerprint already exists there. // if so update it. if not add it for (i = 0; i < dwg.num_objects; i++) { if (dwg.object[i].fixedtype == DWG_TYPE_TEXT) { Dwg_Entity_TEXT *_obj = dwg.object[i].tio.entity->tio.TEXT; if (pt.x == _obj->ins_pt.x && pt.y == _obj->ins_pt.y && _obj->horiz_alignment == HORIZ_ALIGNMENT_RIGHT) { found++; change_fingerprint (&dwg, _obj); fprintf (stderr, "fingerprint updated at (%f, %f)\n", pt.x, pt.y); } } } if (!found) { add_fingerprint (&dwg, &pt); fprintf (stderr, "fingerprint added at (%f, %f)\n", pt.x, pt.y); } #ifdef USE_WRITE if (0 == stat (new_filename, &st)) unlink (new_filename); if (dwg.header.version > R_2000) dwg.header.version = R_2000; success = dwg_write_file (new_filename, &dwg); free (new_filename); #endif dwg_free (&dwg); return success; } int main (int argc, char *argv[]) { int i = 1; unsigned int opts = 0; if (argc < 2) return usage (); #if defined(USE_TRACING) && defined(HAVE_SETENV) setenv ("LIBREDWG_TRACE", "1", 0); #endif if (argc > 2 && (!strcmp (argv[i], "--verbose") || !strncmp (argv[i], "-v", 2))) { int num_args = verbosity (argc, argv, i, &opts); argc -= num_args; i += num_args; } if (argc > 1 && !strcmp (argv[i], "--help")) return help (); if (argc > 1 && !strcmp (argv[i], "--version")) return opt_version (); REQUIRE_INPUT_FILE_ARG (argc); load_dwg (argv[i], opts); return 0; }