#include <stdlib.h>
#include <string.h>
#include <vector>
+#include "applicationwindow.h"
+#include "drawingview.h"
+#include "global.h"
#include "structs.h"
/*
virtual Object function that reports the object by itself if it's a non-
Container, otherwise it enumerates all objects within itself. */
- fprintf(file, "ARCHITEKTONAS DRAWING V1.1\n");
+ fprintf(file, "ARCHITEKTONAS DRAWING V1.2\n");
+ fprintf(file, "LAYERS %i\n", Global::numLayers);
+
+ for(int i=0; i<Global::numLayers; i++)
+ fprintf(file, "%i %i \"%s\"\n", (Global::layerHidden[i] ? 1 : 0), (Global::layerLocked[i] ? 1 : 0), Global::layerName[i].c_str());
+
+ fprintf(file, "ACTIVE %i\n", Global::activeLayer);
WriteObjectToFile(file, (Object *)c);
fprintf(file, "END\n");
return true;
{
float version;
- fscanf(file, "ARCHITEKTONAS DRAWING V%f", &version);
+ fscanf(file, "ARCHITEKTONAS DRAWING V%f\n", &version);
+
+ // Clear out layer vectors
+ Global::layerHidden.clear();
+ Global::layerLocked.clear();
+ Global::layerName.clear();
if (version == 1.0f)
return LoadVersion1_0(file, drawing);
else if (version == 1.1f)
return LoadVersion1_1(file, drawing);
+ 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::layerHidden.insert(Global::layerHidden.begin(), false);
+ Global::layerLocked.insert(Global::layerLocked.begin(), false);
+ Global::layerName.insert(Global::layerName.begin(), "Background");
+ Global::numLayers = 1;
+ 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
// This will require a stack to maintain the current Container.
std::vector<Container *> containerStack;
Container * currentTopContainer = drawing;
+ ResetLayerVectors();
while (!feof(file))
{
// This will require a stack to maintain the current Container.
std::vector<Container *> containerStack;
Container * currentTopContainer = drawing;
+ ResetLayerVectors();
while (!feof(file))
{
}
else if (objectFileType == OTFContainerEnd)
{
+ // Add the extents of the current container
+ Rect r = ApplicationWindow::drawing->GetObjectExtents((Object *)currentTopContainer);
+ currentTopContainer->p[0] = r.TopLeft();
+ currentTopContainer->p[1] = r.BottomRight();
+//printf("Container extents: <%lf, %lf>, <%lf, %lf>\n", r.l, r.t, r.r, r.b);
+
// Container is done, so pop the stack to get back the previous TLC
currentTopContainer = containerStack.back();
containerStack.pop_back();
}
-/*static*/ Object * FileIO::GetObjectFromFile(FILE * file, bool extended/*= false*/)
+/*static*/ bool FileIO::LoadVersion1_2(FILE * file, Container * drawing)
+{
+ int hidden, locked;
+ char textBuffer[65536];
+
+ // Load layer information first
+ fscanf(file, "LAYERS %i\n", &Global::numLayers);
+
+ for(int i=0; i<Global::numLayers; i++)
+ {
+ fscanf(file, "%i %i \"%[^\"]\"\n", &hidden, &locked, textBuffer);
+ Global::layerHidden.push_back(hidden ? true : false);
+ Global::layerLocked.push_back(locked ? true : false);
+ Global::layerName.push_back(textBuffer);
+ }
+
+ fscanf(file, "ACTIVE %i\n", &Global::activeLayer);
+
+ // Approach: read each object in the file, one by one. If the object is a
+ // Container, add objects to it until an "endContainer" marker is found.
+ // This will require a stack to maintain the current Container.
+ std::vector<Container *> containerStack;
+ Container * currentTopContainer = drawing;
+
+ while (!feof(file))
+ {
+ // Reconstruct the object (extended format!)
+ Object * obj = GetObjectFromFile(file, true, true);
+
+ // objectFileType is set in GetObjectFromFile()...
+ if (objectFileType == OTFObject)
+ {
+ if (obj == NULL)
+ return false;
+
+ currentTopContainer->objects.push_back(obj);
+//printf("Load: Adding object. Container size = %li (%li)\n", drawing->objects.size(), currentTopContainer->objects.size());
+
+ // If the object is a container, push current TLC on the stack and
+ // set it as the new TLC
+ if (obj->type == OTContainer)
+ {
+ containerStack.push_back(currentTopContainer);
+ currentTopContainer = (Container *)obj;
+ }
+ }
+ else if (objectFileType == OTFContainerEnd)
+ {
+ // Add the extents of the current container
+ Rect r = ApplicationWindow::drawing->GetObjectExtents((Object *)currentTopContainer);
+ currentTopContainer->p[0] = r.TopLeft();
+ currentTopContainer->p[1] = r.BottomRight();
+//printf("Container extents: <%lf, %lf>, <%lf, %lf>\n", r.l, r.t, r.r, r.b);
+
+ // Container is done, so pop the stack to get back the previous TLC
+ currentTopContainer = containerStack.back();
+ containerStack.pop_back();
+ }
+ else if (objectFileType == OTFEndOfFile)
+ {
+//printf("Load: container size = %li\n", drawing->objects.size());
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+/*static*/ Object * FileIO::GetObjectFromFile(FILE * file, bool extended/*= false*/, bool ext2/*= false*/)
{
char buffer[256];
char textBuffer[65536];
}
// Need to add pen attributes as well... do that for v1.1 :-P
+ // And fill attributes... do that for v1.3 (1.2 added layers)
if (strcmp(buffer, "LINE") == 0)
{
Point p1, p2;
{
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)
{
if (extended && (obj->type != OTContainer))
{
- fscanf(file, " (%i, %f, %i)", &obj->color, &obj->thickness, &obj->style);
+ fscanf(file, " (%i, %f, %i)\n", &obj->color, &obj->thickness, &obj->style);
}
}
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 (%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);
break;
case OTSpline:
break;