#include "about.h"
#include "blockwidget.h"
+#include "dimension.h"
#include "drawingview.h"
#include "drawarcaction.h"
#include "drawcircleaction.h"
#include "drawdimensionaction.h"
#include "drawlineaction.h"
+#include "drawsplineaction.h"
#include "fileio.h"
#include "generaltab.h"
#include "geometry.h"
#include "layerwidget.h"
+#include "line.h"
#include "mirroraction.h"
#include "painter.h"
#include "rotateaction.h"
#include "settingsdialog.h"
+#include "triangulateaction.h"
+#include "trimaction.h"
// Class variables
dock2->setObjectName("Blocks");
// Create status bar
- zoomIndicator = new QLabel("Grid: 12.0\" Zoom: 12.5%");
+ zoomIndicator = new QLabel("Grid: 12.0\" BU: Inch");
statusBar()->addPermanentWidget(zoomIndicator);
statusBar()->showMessage(tr("Ready"));
{
QString filename = QFileDialog::getOpenFileName(this, tr("Open Drawing"),
"", tr("Architektonas files (*.drawing)"));
- FILE * file = fopen(filename.toAscii().data(), "r");
+
+ // User cancelled open
+ if (filename.isEmpty())
+ return;
+
+ FILE * file = fopen(filename.toUtf8().data(), "r");
if (file == 0)
{
documentName = QFileDialog::getSaveFileName(this, tr("Save Drawing"),
"", tr("Architektonas drawings (*.drawing)"));
- FILE * file = fopen(documentName.toAscii().data(), "w");
+ FILE * file = fopen(documentName.toUtf8().data(), "w");
if (file == 0)
{
msg.setIcon(QMessageBox::Critical);
msg.exec();
// In this case, we should unlink the created file, since it's not right...
-// unlink(documentName.toAscii().data());
+// unlink(documentName.toUtf8().data());
QFile::remove(documentName);
return;
}
}
+void ApplicationWindow::TrimTool(void)
+{
+ ClearUIToolStatesExcept(trimAct);
+ SetInternalToolStates();
+}
+
+
+void ApplicationWindow::TriangulateTool(void)
+{
+ ClearUIToolStatesExcept(triangulateAct);
+ SetInternalToolStates();
+}
+
+
void ApplicationWindow::AddLineTool(void)
{
ClearUIToolStatesExcept(addLineAct);
}
+void ApplicationWindow::AddSplineTool(void)
+{
+ ClearUIToolStatesExcept(addSplineAct);
+ SetInternalToolStates();
+}
+
+
void ApplicationWindow::ZoomInTool(void)
{
double zoomFactor = 2.0;
if (exception != addPolygonAct)
addPolygonAct->setChecked(false);
+ if (exception != addSplineAct)
+ addSplineAct->setChecked(false);
+
if (exception != deleteAct)
deleteAct->setChecked(false);
if (exception != mirrorAct)
mirrorAct->setChecked(false);
+
+ if (exception != trimAct)
+ trimAct->setChecked(false);
+
+ if (exception != triangulateAct)
+ triangulateAct->setChecked(false);
}
drawing->SetToolActive(addCircleAct->isChecked() ? new DrawCircleAction() : NULL);
drawing->SetToolActive(addArcAct->isChecked() ? new DrawArcAction() : NULL);
drawing->SetToolActive(addDimensionAct->isChecked() ? new DrawDimensionAction() : NULL);
+ drawing->SetToolActive(addSplineAct->isChecked() ? new DrawSplineAction() : NULL);
drawing->SetToolActive(mirrorAct->isChecked() ? new MirrorAction() : NULL);
drawing->SetToolActive(rotateAct->isChecked() ? new RotateAction() : NULL);
+ drawing->SetToolActive(trimAct->isChecked() ? new TrimAction() : NULL);
+ drawing->SetToolActive(triangulateAct->isChecked() ? new TriangulateAction() : NULL);
if (drawing->toolAction)
Object::ignoreClicks = true;
for(int j=i+1; j<itemsSelected; j++)
{
Object * obj2 = drawing->document.SelectedItem(j);
- double t, u;
+ double t, u, v, w;
- if ((obj1->type != OTLine) || (obj2->type != OTLine))
- continue;
+// if ((obj1->type != OTLine) || (obj2->type != OTLine))
+// continue;
+ if ((obj1->type == OTLine) && (obj2->type == OTLine))
+ {
//printf("Testing objects for intersection (%X, %X)...\n", obj1, obj2);
- int intersects = Geometry::Intersects((Line *)obj1, (Line *)obj2, &t, &u);
+ int intersects = Geometry::Intersects((Line *)obj1, (Line *)obj2, &t, &u);
//printf(" (%s) --> t=%lf, u=%lf\n", (intersects ? "true" : "FALSE"), t, u);
- if (intersects)
+ if (intersects)
+ {
+ //printf("Connecting objects (%X, %X)...\n", obj1, obj2);
+ obj1->Connect(obj2, u);
+ obj2->Connect(obj1, t);
+ }
+ }
+ else if (((obj1->type == OTLine) && (obj2->type == OTDimension))
+ || ((obj2->type == OTLine) && (obj1->type == OTDimension)))
{
-printf("Connecting objects (%X, %X)...\n", obj1, obj2);
- obj1->Connect(obj2, u);
- obj2->Connect(obj1, t);
+printf("Testing Line<->Dimension intersection...\n");
+ Line * line = (Line *)(obj1->type == OTLine ? obj1 : obj2);
+ Dimension * dim = (Dimension *)(obj1->type == OTDimension ? obj1 : obj2);
+
+ int intersects = Geometry::Intersects(line, dim, &t, &u);
+printf(" -> intersects = %i, t=%lf, u=%lf\n", intersects, t, u);
+
+ if (intersects)
+ {
+ obj1->Connect(obj2, u);
+ obj2->Connect(obj1, t);
+ }
}
}
}
addPolygonAct = CreateAction(tr("Add &Polygon"), tr("Add Polygon"), tr("Add polygons to the drawing."), QIcon(":/res/add-polygon-tool.png"), QKeySequence("A,P"), true);
connect(addPolygonAct, SIGNAL(triggered()), this, SLOT(AddPolygonTool()));
+ addSplineAct = CreateAction(tr("Add &Spline"), tr("Add Spline"), tr("Add a NURB spline to the drawing."), QIcon(":/res/add-spline-tool.png"), QKeySequence("A,S"), true);
+ connect(addSplineAct, SIGNAL(triggered()), this, SLOT(AddSplineTool()));
+
aboutAct = CreateAction(tr("About &Architektonas"), tr("About Architektonas"), tr("Gives information about this program."), QIcon(":/res/generic-tool.png"), QKeySequence());
connect(aboutAct, SIGNAL(triggered()), this, SLOT(HelpAbout()));
mirrorAct = CreateAction(tr("&Mirror"), tr("Mirror"), tr("Mirror selected objects around a line."), QIcon(":/res/mirror-tool.png"), QKeySequence("m,i"), true);
connect(mirrorAct, SIGNAL(triggered()), this, SLOT(MirrorTool()));
+ trimAct = CreateAction(tr("&Trim"), tr("Trim"), tr("Trim extraneous lines from selected objects."), QIcon(":/res/trim-tool.png"), QKeySequence("t,r"), true);
+ connect(trimAct, SIGNAL(triggered()), this, SLOT(TrimTool()));
+
+ triangulateAct = CreateAction(tr("&Triangulate"), tr("Triangulate"), tr("Make triangles from selected lines, preserving their lengths."), QIcon(":/res/triangulate-tool.png"), QKeySequence("t,g"), true);
+ connect(triangulateAct, SIGNAL(triggered()), this, SLOT(TriangulateTool()));
+
//Hm. I think we'll have to have separate logic to do the "Radio Group Toolbar" thing...
// Yup, in order to turn them off, we'd have to have an "OFF" toolbar button. Ick.
menu->addAction(fixLengthAct);
menu->addAction(rotateAct);
menu->addAction(mirrorAct);
+ menu->addAction(trimAct);
+ menu->addAction(triangulateAct);
menu->addAction(connectAct);
menu->addAction(disconnectAct);
menu->addSeparator();
menu->addAction(addCircleAct);
menu->addAction(addArcAct);
menu->addAction(addPolygonAct);
+ menu->addAction(addSplineAct);
menu->addAction(addDimensionAct);
menu->addSeparator();
menu->addAction(settingsAct);
toolbar->addAction(fixLengthAct);
toolbar->addAction(rotateAct);
toolbar->addAction(mirrorAct);
+ toolbar->addAction(trimAct);
+ toolbar->addAction(triangulateAct);
toolbar->addAction(deleteAct);
toolbar->addAction(connectAct);
toolbar->addAction(disconnectAct);
toolbar->addAction(addCircleAct);
toolbar->addAction(addArcAct);
toolbar->addAction(addPolygonAct);
+ toolbar->addAction(addSplineAct);
toolbar->addAction(addDimensionAct);
spinbox->setRange(4, 256);