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
- 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
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; i<Global::numLayers; i++)
return true;
}
-
/*static*/ bool FileIO::LoadAtnsFile(FILE * file, Container * drawing)
{
float version;
else if (version == 1.2f)
return LoadVersion1_2(file, drawing);
-//printf("LoadAtnsFile: Could not locate version! (version=%f)\n", version);
return false;
}
-
/*static*/ void FileIO::ResetLayerVectors(void)
{
// Set up layer vectors
Global::activeLayer = 0;
}
-
/*static*/ bool FileIO::LoadVersion1_0(FILE * file, Container * drawing)
{
// Approach: read each object in the file, one by one. If the object is a
return false;
}
-
/*static*/ bool FileIO::LoadVersion1_1(FILE * file, Container * drawing)
{
// Approach: read each object in the file, one by one. If the object is a
return false;
}
-
/*static*/ bool FileIO::LoadVersion1_2(FILE * file, Container * drawing)
{
- int hidden, locked;
+ int hidden, locked, props = 0;
char textBuffer[65536];
- // Load layer information first
+ // Load drawing properties, if any, first
+ fscanf(file, "PROPERTIES %i\n", &props);
+
+ if (props == 4)
+ {
+ fscanf(file, "BASE_UNIT %i\n", &(drawing->baseUnit));
+ 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; i<Global::numLayers; i++)
return false;
}
-
/*static*/ Object * FileIO::GetObjectFromFile(FILE * file, bool extended/*= false*/, bool ext2/*= false*/)
{
char buffer[256];
fscanf(file, "(%lf,%lf) %lf, %lf, %lf", &p.x, &p.y, &r, &a1, &a2);
obj = (Object *)new Arc(p, r, a1, a2);
}
+ else if (strcmp(buffer, "POLYLINE") == 0)
+ {
+ long int size;
+ obj = (Object *)new Polyline();
+ fscanf(file, "(%li)", &size);
+ fscanf(file, " (%i, %f, %i)\n", &obj->color, &obj->thickness, &obj->style);
+
+ for(int i=0; i<size; i++)
+ {
+ Object * po = new Object();
+ fscanf(file, "(%lf,%lf,%lf)\n", &po->p[0].x, &po->p[0].y, &po->length);
+ ((Polyline *)obj)->Add(po);
+ }
+ }
else if (strcmp(buffer, "TEXT") == 0)
{
Point p;
{
obj->layer = foundLayer;
- if (extended && (obj->type != OTContainer))
+ if (extended && (obj->type != OTContainer) && (obj->type != OTPolyline))
{
fscanf(file, " (%i, %f, %i)\n", &obj->color, &obj->thickness, &obj->style);
}
return obj;
}
-
/*static*/ bool FileIO::WriteObjectToFile(FILE * file, Object * obj)
{
// Sanity check
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 %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);
+ 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;
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;
}
-