X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ffileio.cpp;h=ad303f469cdcb0713a9afcb4e67533c1b428c3f3;hb=3c890e51a9763ffcee49e15753453a7da248272b;hp=ace5bfa247713a3adc4aabee61f0dc3871a4c0aa;hpb=790c1a6d97f73f7457c7fad7e82fa29e5b6accd5;p=architektonas diff --git a/src/fileio.cpp b/src/fileio.cpp index ace5bfa..ad303f4 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -61,7 +61,7 @@ Connect() function. Or, instead of a point, a parameter value? Doing that, with the Line and a parameter "t", if t == 0 we have endpoint 1. if t == 1, then we have endpoint 2. With a Circle, the parameter is a number -between 0 and 1 (scaled to 0 to 2π). With an Arc, the parameter goes from 0 to +between 0 and 1 (scaled to 0 to tau). With an Arc, the parameter goes from 0 to 1, 0 being enpoint 1 and 1 being endpoint 2. How does this work for moving objects that are connected? Again, with the Line @@ -108,18 +108,13 @@ OTHER CONSIDERATIONS: - Need to figure out how to store the Layer list (should layer list be optional?) - Need to figure out how to store the Block list and blocks - */ -//enum ObjectTypeFile { OTFContainer, OTFContainerEnd, OTFLine, OTFCircle, OTFArc, -// OTFDimension, OTFPolygon, OTFText, OTFImage, OTFBlock, OTFEndOfFile }; enum ObjectTypeFile { OTFContainer, OTFContainerEnd, OTFObject, OTFEndOfFile }; - // Instantiate class variables /*static*/ int FileIO::objectFileType = OTFObject; - /*static*/ bool FileIO::SaveAtnsFile(FILE * file, Container * c) { /* Approach: loop through the container, doing a depth-first traversal. Any @@ -129,6 +124,12 @@ enum ObjectTypeFile { OTFContainer, OTFContainerEnd, OTFObject, OTFEndOfFile }; Container, otherwise it enumerates all objects within itself. */ fprintf(file, "ARCHITEKTONAS DRAWING V1.2\n"); + fprintf(file, "PROPERTIES 4\n"); + fprintf(file, "BASE_UNIT %i\n", c->baseUnit); + fprintf(file, "UNIT_STYLE %i\n", c->unitStyle); + fprintf(file, "DEC_PREC %i\n", c->decimalPrecision); + fprintf(file, "FRAC_PREC %i\n", c->fractionalPrecision); + fprintf(file, "LAYERS %i\n", Global::numLayers); for(int i=0; ibaseUnit)); + fscanf(file, "UNIT_STYLE %i\n", &(drawing->unitStyle)); + fscanf(file, "DEC_PREC %i\n", &(drawing->decimalPrecision)); + fscanf(file, "FRAC_PREC %i\n", &(drawing->fractionalPrecision)); + } + + // Load layer information next fscanf(file, "LAYERS %i\n", &Global::numLayers); for(int i=0; icolor, &obj->thickness, &obj->style); + + for(int i=0; ip[0].x, &po->p[0].y, &po->length); + ((Polyline *)obj)->Add(po); + } + } else if (strcmp(buffer, "TEXT") == 0) { Point p; @@ -415,8 +434,13 @@ if (errno) { Point p1, p2; DimensionType type; + double offset = 0; fscanf(file, "(%lf,%lf) (%lf,%lf) %i", &p1.x, &p1.y, &p2.x, &p2.y, (int *)&type); - obj = (Object *)new Dimension(p1, p2, type); + + if (ext2) + fscanf(file, " %lf", &offset); + + obj = (Object *)new Dimension(p1, p2, type, offset); } else if (strcmp(buffer, "CONTAINER") == 0) { @@ -438,16 +462,15 @@ if (errno) { obj->layer = foundLayer; - if (extended && (obj->type != OTContainer)) + if (extended && (obj->type != OTContainer) && (obj->type != OTPolyline)) { - fscanf(file, " (%i, %f, %i)", &obj->color, &obj->thickness, &obj->style); + fscanf(file, " (%i, %f, %i)\n", &obj->color, &obj->thickness, &obj->style); } } return obj; } - /*static*/ bool FileIO::WriteObjectToFile(FILE * file, Object * obj) { // Sanity check @@ -457,21 +480,31 @@ if (errno) switch (obj->type) { case OTLine: - fprintf(file, "LINE %i (%lf,%lf) (%lf,%lf)", obj->layer, obj->p[0].x, obj->p[0].y, obj->p[1].x, obj->p[1].y); + fprintf(file, "LINE %i (%.16lf,%.16lf) (%.16lf,%.16lf)", obj->layer, obj->p[0].x, obj->p[0].y, obj->p[1].x, obj->p[1].y); break; case OTCircle: - fprintf(file, "CIRCLE %i (%lf,%lf) %lf", obj->layer, obj->p[0].x, obj->p[0].y, obj->radius[0]); + fprintf(file, "CIRCLE %i (%.16lf,%.16lf) %.16lf", obj->layer, obj->p[0].x, obj->p[0].y, obj->radius[0]); break; case OTEllipse: break; case OTArc: - fprintf(file, "ARC %i (%lf,%lf) %lf, %lf, %lf", obj->layer, obj->p[0].x, obj->p[0].y, obj->radius[0], obj->angle[0], obj->angle[1]); + fprintf(file, "ARC %i (%.16lf,%.16lf) %.16lf, %.16lf, %.16lf", obj->layer, obj->p[0].x, obj->p[0].y, obj->radius[0], obj->angle[0], obj->angle[1]); break; - case OTPolygon: + case OTPolyline: + { + Polyline * p = (Polyline *)obj; + fprintf(file, "POLYLINE %i (%li)", p->layer, p->points.size()); + fprintf(file, " (%i, %f, %i)\n", obj->color, obj->thickness, obj->style); + + for(VPVectorIter i=p->points.begin(); i!=p->points.end(); i++) + { + Object * po = (Object *)(*i); + fprintf(file, "(%.16lf,%.16lf,%.16lf)\n", po->p[0].x, po->p[0].y, po->length); + } + } break; case OTDimension: -// fprintf(file, "DIMENSION %i (%lf,%lf) (%lf,%lf) %i\n", layer, position.x, position.y, endpoint.x, endpoint.y, dimensionType); - fprintf(file, "DIMENSION %i (%lf,%lf) (%lf,%lf) %i", obj->layer, obj->p[0].x, obj->p[0].y, obj->p[1].x, obj->p[1].y, ((Dimension *)obj)->subtype); + fprintf(file, "DIMENSION %i (%.16lf,%.16lf) (%.16lf,%.16lf) %i %lf", obj->layer, obj->p[0].x, obj->p[0].y, obj->p[1].x, obj->p[1].y, ((Dimension *)obj)->subtype, ((Dimension *)obj)->offset); break; case OTSpline: break; @@ -499,9 +532,8 @@ if (errno) break; } - if (obj->type != OTContainer) + if ((obj->type != OTContainer) && (obj->type != OTPolyline)) fprintf(file, " (%i, %f, %i)\n", obj->color, obj->thickness, obj->style); return true; } -