From 173f1988acc18fc5296a09cc29740cee84864a64 Mon Sep 17 00:00:00 2001 From: abhishekm71 Date: Sat, 8 Feb 2014 18:17:10 +0000 Subject: [PATCH] List of Drawings: DXF export added and multple sheets for large project added. Pending work: - folio string to be formatted correctly. - thorough testing to be done because lot of changes to addDiagram / removeDiagram had to be done to add the feature of multiple folio list sheets git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@2836 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- sources/diagramfoliolist.cpp | 133 ++++++++++++++++++++++++++++------- sources/diagramfoliolist.h | 18 ++++- sources/exportdialog.cpp | 117 +++++++++++++++++++++++++++--- sources/exportdialog.h | 1 + sources/projectview.cpp | 6 +- sources/qetdiagrameditor.cpp | 8 ++- sources/qetproject.cpp | 31 +++++--- sources/qetproject.h | 3 - 8 files changed, 264 insertions(+), 53 deletions(-) diff --git a/sources/diagramfoliolist.cpp b/sources/diagramfoliolist.cpp index 7583564d5..6ba5328f9 100644 --- a/sources/diagramfoliolist.cpp +++ b/sources/diagramfoliolist.cpp @@ -18,6 +18,33 @@ #include "diagramfoliolist.h" #include +int DiagramFolioList::folioList_quantity = 0; +qreal DiagramFolioList::colWidths[4] = {0.1, 0.55, 0.2, 0.15}; + +DiagramFolioList::DiagramFolioList(QObject *parent) : Diagram(parent) +{ + list_lines_.clear(); + list_rectangles_.clear(); + + id = folioList_quantity; + folioList_quantity++; + + qreal width = border_and_titleblock.columnsTotalWidth(); + qreal height = border_and_titleblock.rowsTotalHeight(); + + //top left corner of drawable area + qreal x0 = border_and_titleblock.rowsHeaderWidth(); + qreal y0 = border_and_titleblock.columnsHeaderHeight(); + QRectF row_RectF(x0, y0, width, height); + + buildGrid(row_RectF,30,2,colWidths); +} + +DiagramFolioList::~DiagramFolioList() +{ + if (folioList_quantity > 0) + folioList_quantity--; +} void DiagramFolioList::drawBackground(QPainter *p, const QRectF &r) { @@ -30,37 +57,51 @@ void DiagramFolioList::drawBackground(QPainter *p, const QRectF &r) // dessine un fond blanc p -> setPen(Qt::NoPen); - //set brush color to present background color. p -> setBrush(Diagram::background_color); p -> drawRect(r); - p -> setPen(Qt::black); - qreal width = border_and_titleblock.columnsTotalWidth(); - qreal height = border_and_titleblock.rowsTotalHeight(); - - QList diagram_list = project() -> diagrams(); - - //top left corner of drawable area - qreal x0 = border_and_titleblock.rowsHeaderWidth(); - qreal y0 = border_and_titleblock.columnsHeaderHeight(); - qreal drawings_quantity = diagram_list.size(); - qreal rowHeight = height / (drawings_quantity+1) * 0.8; - rowHeight = (rowHeight > height*0.05) ? height*0.05 : rowHeight; - QRectF row_RectF(x0 + width*.1, y0 + height*.05, width*0.8, rowHeight); QString authorTranslatable = tr("Auteur"); QString titleTranslatable = tr("Titre"); QString folioTranslatable = tr("Folio"); QString dateTranslatable = tr("Date"); + qreal x0 = list_rectangles_[0] -> topLeft().x(); + qreal y0 = list_rectangles_[0] -> topLeft().y(); + qreal rowHeight = (list_rectangles_[0] -> height())/30; + QRectF row_RectF(x0, y0, list_rectangles_[0] -> width(), rowHeight); + fillRow(p, row_RectF, authorTranslatable, titleTranslatable, folioTranslatable, dateTranslatable); - foreach (Diagram *diagram, diagram_list) { + QList diagram_list = project() -> diagrams(); + + int startDiagram = id * 58; + + for (int i = startDiagram; i < startDiagram+29 && i < diagram_list.size(); ++i) { y0 += rowHeight; - QRectF row_rect(x0 + width*.1, y0 + height*.05, width*0.8, rowHeight); - fillRow(p, row_rect, diagram -> border_and_titleblock.author(), diagram -> border_and_titleblock.title(), - diagram -> border_and_titleblock.folio(), diagram -> border_and_titleblock.date().toString("dd/MM/yyyy")); + QRectF row_rect(x0, y0, list_rectangles_[0] -> width(), rowHeight); + fillRow(p, row_rect, diagram_list[i] -> border_and_titleblock.author(), + diagram_list[i] -> border_and_titleblock.title(), + diagram_list[i] -> border_and_titleblock.folio(), + diagram_list[i] -> border_and_titleblock.date().toString("dd/MM/yyyy")); } - p -> setPen(Qt::NoPen); + + x0 = list_rectangles_[1] -> topLeft().x(); + y0 = list_rectangles_[1] -> topLeft().y(); + rowHeight = (list_rectangles_[1] -> height())/30; + QRectF row_RectF2(x0, y0, list_rectangles_[1] -> width(), rowHeight); + fillRow(p, row_RectF2, authorTranslatable, titleTranslatable, folioTranslatable, dateTranslatable); + + startDiagram += 29; + + for (int i = startDiagram; i < startDiagram+29 && i < diagram_list.size(); ++i) { + y0 += rowHeight; + QRectF row_rect(x0, y0, list_rectangles_[1] -> width(), rowHeight); + fillRow(p, row_rect, diagram_list[i] -> border_and_titleblock.author(), + diagram_list[i] -> border_and_titleblock.title(), + diagram_list[i] -> border_and_titleblock.folio(), + diagram_list[i] -> border_and_titleblock.date().toString("dd/MM/yyyy")); + } + border_and_titleblock.draw(p, margin, margin); p -> restore(); } @@ -68,16 +109,54 @@ void DiagramFolioList::drawBackground(QPainter *p, const QRectF &r) void DiagramFolioList::fillRow(QPainter *qp, const QRectF &row_rect, QString author, QString title, QString folio, QString date) { - qp -> drawRect(row_rect); qreal x = row_rect.topLeft().x(); qreal y = row_rect.topLeft().y(); - qreal column_width = row_rect.width() / 4; - qp -> drawText(QRectF(x, y, column_width, row_rect.height()), Qt::AlignCenter, folio); - qp -> drawText(QRectF(x + column_width, y, column_width, row_rect.height()), Qt::AlignCenter, title); - qp -> drawText(QRectF(x + 2*column_width, y, column_width, row_rect.height()), Qt::AlignCenter, author); - qp -> drawText(QRectF(x + 3*column_width, y, column_width, row_rect.height()), Qt::AlignCenter, date); + qp -> drawText(QRectF(x, y, colWidths[0]*row_rect.width(), row_rect.height()), Qt::AlignCenter, folio); + x += colWidths[0]*row_rect.width(); - for (int i = 1; i <= 3; i++ ) - qp -> drawLine(x + i*column_width, y, x + i*column_width, y + row_rect.height()); + qp -> drawText(QRectF(x, y, colWidths[1]*row_rect.width(), row_rect.height()), Qt::AlignCenter, title); + x += colWidths[1]*row_rect.width(); + + qp -> drawText(QRectF(x, y, colWidths[2]*row_rect.width(), row_rect.height()), Qt::AlignCenter, author); + x += colWidths[2]*row_rect.width(); + + qp -> drawText(QRectF(x, y, colWidths[3]*row_rect.width(), row_rect.height()), Qt::AlignCenter, date); +} + +void DiagramFolioList::buildGrid(const QRectF &rect, int rows, int tables, qreal colWidths[]) +{ + qreal sum = 0; + for (int i = 0; i < 4; i++ ) + sum += colWidths[i]; + if ( sum < 0.99 || sum > 1.01 ) { + qDebug() << "Invalid input: Column widths do not sum to 1"; + return; + } + + qreal tablesSpacing = rect.height() * 0.02; + qreal tableWidth = (rect.width() - tablesSpacing*(tables+1) ) / tables; + qreal rowHeight = (rect.height() - 2*tablesSpacing) / rows; + int cols = 4;//colWidths.size(); + + qreal x0 = tablesSpacing + rect.topLeft().x(); + qreal y0 = tablesSpacing + rect.topLeft().y(); + + for (int i = 0; i < tables; ++i) { + QRectF *tableRect = new QRectF(x0, y0, tableWidth, rect.height() - 2*tablesSpacing); + addRect(*tableRect); + list_rectangles_.push_back(tableRect); + for (int j = 1; j < rows; ++j) { + QLineF *line = new QLineF(x0, y0 + j*rowHeight, x0 + tableWidth,y0 + j*rowHeight); + addLine(*line); + list_lines_.push_back(line); + } + for (int j = 0; j < cols-1; ++j) { + QLineF *line = new QLineF(x0 + colWidths[j]*tableWidth, y0, x0 + colWidths[j]*tableWidth,y0 + rows*rowHeight); + addLine(*line); + list_lines_.push_back(line); + x0 += colWidths[j]*tableWidth; + } + x0 += colWidths[cols-1]*tableWidth + tablesSpacing; + } } diff --git a/sources/diagramfoliolist.h b/sources/diagramfoliolist.h index f7f834cf1..8ef9076e4 100644 --- a/sources/diagramfoliolist.h +++ b/sources/diagramfoliolist.h @@ -19,18 +19,32 @@ #define DIAGRAMFOLIOLIST_H #include "diagram.h" +#include "qetgraphicsitem/independenttextitem.h" class DiagramFolioList : public Diagram { public: - DiagramFolioList(QObject *parent = 0) : Diagram(parent) {} - virtual ~DiagramFolioList() {} + DiagramFolioList(QObject *parent = 0); + virtual ~DiagramFolioList(); + virtual QList lines() const {return list_lines_;} + virtual QList rectangles() const {return list_rectangles_;} + void setId(int i) {id = i;} + int getId() const {return id;} + + static int folioList_quantity; + static qreal colWidths[4]; protected: void drawBackground(QPainter *, const QRectF &); private: void fillRow(QPainter *, const QRectF &, QString, QString, QString, QString); + void buildGrid(const QRectF &, int, int, qreal[]); + + + QList list_lines_; + QList list_rectangles_; + int id; }; diff --git a/sources/exportdialog.cpp b/sources/exportdialog.cpp index 65ebce197..d5b4e48ea 100644 --- a/sources/exportdialog.cpp +++ b/sources/exportdialog.cpp @@ -33,6 +33,7 @@ #include "qetgraphicsitem/ghostelement.h" #include "qetgraphicsitem/independenttextitem.h" #include "qetgraphicsitem/diagramimageitem.h" +#include "diagramfoliolist.h" /** Constructeur @@ -390,18 +391,87 @@ void ExportDialog::generateDxf(Diagram *diagram, int width, int height, bool kee QList list_conductors; QList list_texts; QList list_images; + QList list_lines; + QList list_rectangles; - // Determine les elements a "XMLiser" - foreach(QGraphicsItem *qgi, diagram -> items()) { - if (Element *elmt = qgraphicsitem_cast(qgi)) { - list_elements << elmt; - } else if (Conductor *f = qgraphicsitem_cast(qgi)) { - list_conductors << f; - } else if (IndependentTextItem *iti = qgraphicsitem_cast(qgi)) { - list_texts << iti; - } else if (DiagramImageItem *dii = qgraphicsitem_cast(qgi)) { - list_images << dii; + DiagramFolioList *ptr; + if (ptr = dynamic_cast(diagram)) { + list_lines = ptr -> lines(); + list_rectangles = ptr -> rectangles(); + + // fill the rows with text. + QString authorTranslatable = tr("Auteur"); + QString titleTranslatable = tr("Titre"); + QString folioTranslatable = tr("Folio"); + QString dateTranslatable = tr("Date"); + + qreal x0 = list_rectangles[0] -> topLeft().x(); + qreal y0 = list_rectangles[0] -> topLeft().y(); + qreal rowHeight = (list_rectangles[0] -> height())/30; + QRectF row_RectF(x0, y0, list_rectangles[0] -> width(), rowHeight); + + fillRow(file_path, row_RectF, authorTranslatable, titleTranslatable, folioTranslatable, dateTranslatable); + QList diagram_list = ptr -> project() -> diagrams(); + + int startDiagram = (ptr -> getId()) * 58; + + for (int i = startDiagram; i < startDiagram+29 && i < diagram_list.size(); ++i) { + y0 += rowHeight; + QRectF row_rect(x0, y0, list_rectangles[0] -> width(), rowHeight); + fillRow(file_path, row_rect, diagram_list[i] -> border_and_titleblock.author(), + diagram_list[i] -> border_and_titleblock.title(), + diagram_list[i] -> border_and_titleblock.folio(), + diagram_list[i] -> border_and_titleblock.date().toString("dd/MM/yyyy")); } + + x0 = list_rectangles[1] -> topLeft().x(); + y0 = list_rectangles[1] -> topLeft().y(); + rowHeight = (list_rectangles[1] -> height())/30; + QRectF row_RectF2(x0, y0, list_rectangles[1] -> width(), rowHeight); + fillRow(file_path, row_RectF2, authorTranslatable, titleTranslatable, folioTranslatable, dateTranslatable); + + startDiagram += 29; + + for (int i = startDiagram; i < startDiagram+29 && i < diagram_list.size(); ++i) { + y0 += rowHeight; + QRectF row_rect(x0, y0, list_rectangles[1] -> width(), rowHeight); + fillRow(file_path, row_rect, diagram_list[i] -> border_and_titleblock.author(), + diagram_list[i] -> border_and_titleblock.title(), + diagram_list[i] -> border_and_titleblock.folio(), + diagram_list[i] -> border_and_titleblock.date().toString("dd/MM/yyyy")); + } + + } else { + // Determine les elements a "XMLiser" + foreach(QGraphicsItem *qgi, diagram -> items()) { + if (Element *elmt = qgraphicsitem_cast(qgi)) { + list_elements << elmt; + } else if (Conductor *f = qgraphicsitem_cast(qgi)) { + list_conductors << f; + } else if (IndependentTextItem *iti = qgraphicsitem_cast(qgi)) { + list_texts << iti; + } else if (DiagramImageItem *dii = qgraphicsitem_cast(qgi)) { + list_images << dii; + } + } + } + + //draw lines + foreach(QLineF *line, list_lines) { + qreal x1 = (line -> p1().x()) * Createdxf::xScale; + qreal y1 = Createdxf::sheetHeight - (line -> p1().y()) * Createdxf::yScale; + qreal x2 = (line -> p2().x()) * Createdxf::xScale; + qreal y2 = Createdxf::sheetHeight - (line -> p2().y()) * Createdxf::yScale; + Createdxf::drawLine(file_path, x1, y1, x2, y2, 0); + } + + //draw rectangles + foreach(QRectF *rect, list_rectangles) { + qreal x1 = (rect -> bottomLeft().x()) * Createdxf::xScale; + qreal y1 = Createdxf::sheetHeight - (rect -> bottomLeft().y()) * Createdxf::yScale; + qreal w = rect -> width() * Createdxf::xScale; + qreal h = rect -> height() * Createdxf::yScale; + Createdxf::drawRectangle(file_path, x1, y1, w, h, 0); } //Draw elements @@ -743,6 +813,33 @@ void ExportDialog::drawDxfArcEllipse(QString file_path, qreal x, qreal y, qreal } } +void ExportDialog::fillRow(QString file_path, const QRectF &row_rect, QString author, QString title, + QString folio, QString date) +{ + qreal x = row_rect.bottomLeft().x(); + qreal y = row_rect.bottomLeft().y(); + + x *= Createdxf::xScale; + y = Createdxf::sheetHeight - y * Createdxf::yScale; + qreal height = row_rect.height() * Createdxf::yScale *0.75; + y += height*0.2; + + Createdxf::drawTextAligned(file_path, folio, x, y+height*0.1, height*0.8, 0, 0, 1, 0, + x + DiagramFolioList::colWidths[0]*row_rect.width()*Createdxf::xScale/2, 0); + x += DiagramFolioList::colWidths[0]*row_rect.width()*Createdxf::xScale; + + Createdxf::drawTextAligned(file_path, title, x, y+height*0.1, height*0.8, 0, 0, 1, 0, + x + DiagramFolioList::colWidths[1]*row_rect.width()*Createdxf::xScale/2, 0); + x += DiagramFolioList::colWidths[1]*row_rect.width()*Createdxf::xScale; + + Createdxf::drawTextAligned(file_path, author, x, y+height*0.1, height*0.8, 0, 0, 1, 0, + x + DiagramFolioList::colWidths[2]*row_rect.width()*Createdxf::xScale/2, 0); + x += DiagramFolioList::colWidths[2]*row_rect.width()*Createdxf::xScale; + + Createdxf::drawTextAligned(file_path, date, x, y+height*0.1, height*0.8, 0, 0, 1, 0, + x + DiagramFolioList::colWidths[3]*row_rect.width()*Createdxf::xScale/2, 0); +} + QPointF ExportDialog::rotation_transformed(qreal px, qreal py , qreal origin_x, qreal origin_y, qreal angle) { angle *= -3.14159265 / 180; diff --git a/sources/exportdialog.h b/sources/exportdialog.h index ab1f28712..d0ce11f80 100644 --- a/sources/exportdialog.h +++ b/sources/exportdialog.h @@ -85,6 +85,7 @@ class ExportDialog : public QDialog { void saveReloadDiagramParameters(Diagram *, bool = true); void generateSvg(Diagram *, int, int, bool, QIODevice &); void generateDxf(Diagram *, int, int, bool, QString &); + void fillRow(QString, const QRectF &, QString, QString, QString, QString); QImage generateImage(Diagram *, int, int, bool); void exportDiagram(ExportDiagramLine *); qreal diagramRatio(Diagram *); diff --git a/sources/projectview.cpp b/sources/projectview.cpp index a4d23170f..f98946f65 100644 --- a/sources/projectview.cpp +++ b/sources/projectview.cpp @@ -35,6 +35,7 @@ #include "qetmessagebox.h" #include "qettabbar.h" #include "qettemplateeditor.h" +#include "diagramfoliolist.h" /** Constructeur @@ -303,11 +304,14 @@ void ProjectView::addNewDiagram() { Diagram *new_diagram = project_ -> addNewDiagram(); DiagramView *new_diagram_view = new DiagramView(new_diagram); addDiagram(new_diagram_view); + + if (project_ -> diagrams().size() % 58 == 1 && DiagramFolioList::folioList_quantity != 0) + addNewDiagramFolioList(); showDiagram(new_diagram_view); } void ProjectView::addNewDiagramFolioList() { - if (project_ -> isReadOnly() || project_ -> isFolioListAdded()) return; + if (project_ -> isReadOnly()) return; Diagram *new_diagram = project_ -> addNewDiagramFolioList(); DiagramView *new_diagram_view = new DiagramView(new_diagram); diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index c74b1528b..28f8a582e 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -33,6 +33,7 @@ #include "qetresult.h" #include "genericpanel.h" #include "nomenclature.h" +#include "diagramfoliolist.h" #include "ui/dialogautonum.h" @@ -1682,8 +1683,11 @@ void QETDiagramEditor::addDiagramToProject() { } void QETDiagramEditor::addDiagramFolioListToProject() { - if (ProjectView *current_project = currentProject()) { - current_project -> addNewDiagramFolioList(); + ProjectView *current_project = currentProject(); + if (current_project && DiagramFolioList::folioList_quantity == 0) { + int diagram_qty = current_project -> diagrams().size(); + for (int i = 0; i <= diagram_qty/58; i++) + current_project -> addNewDiagramFolioList(); } } diff --git a/sources/qetproject.cpp b/sources/qetproject.cpp index fb732c47f..97ca76819 100644 --- a/sources/qetproject.cpp +++ b/sources/qetproject.cpp @@ -46,8 +46,7 @@ QETProject::QETProject(int diagrams, QObject *parent) : project_qet_version_(-1), modified_(false), read_only_(false), - titleblocks_(this), - folio_list_added_(false) + titleblocks_(this) { // 0 a n schema(s) vide(s) int diagrams_count = qMax(0, diagrams); @@ -847,7 +846,6 @@ Diagram *QETProject::addNewDiagramFolioList() { diagram_folio_list -> border_and_titleblock.setTitle(title); addDiagram(diagram_folio_list); - folio_list_added_ = true; emit(diagramAdded(this, diagram_folio_list)); return(diagram_folio_list); } @@ -861,14 +859,31 @@ void QETProject::removeDiagram(Diagram *diagram) { if (isReadOnly()) return; if (!diagram || !diagrams_.contains(diagram)) return; - - if (diagrams_.removeAll(diagram)) { - DiagramFolioList *ptr = dynamic_cast(diagram); - if (ptr) - folio_list_added_ = false; + DiagramFolioList *ptr = dynamic_cast(diagram); + if (ptr) { + foreach (Diagram *diag, diagrams_) { + ptr = dynamic_cast(diag); + if (ptr) { + diagrams_.removeAll(ptr); + emit(diagramRemoved(this, ptr)); + delete ptr; + } + } + } else if (diagrams_.removeAll(diagram)) { emit(diagramRemoved(this, diagram)); delete diagram; + if (diagrams_.size() % 58 == 0) { + foreach (Diagram *diag, diagrams_) { + ptr = dynamic_cast(diag); + if (ptr && ptr -> getId() == DiagramFolioList::folioList_quantity-1) { + diagrams_.removeAll(ptr); + emit(diagramRemoved(this, ptr)); + delete ptr; + break; + } + } + } } updateDiagramsFolioData(); diff --git a/sources/qetproject.h b/sources/qetproject.h index 357fe5a1f..8be3ae23a 100644 --- a/sources/qetproject.h +++ b/sources/qetproject.h @@ -121,7 +121,6 @@ class QETProject : public QObject { DiagramContext projectProperties(); void setProjectProperties(const DiagramContext &); QUndoStack* undoStack() {return undo_stack_;} - bool isFolioListAdded() {return folio_list_added_;} public slots: void componentWritten(); @@ -186,8 +185,6 @@ class QETProject : public QObject { bool modified_; /// Whether the project is read only bool read_only_; - /// Whether folio_list has been added. - bool folio_list_added_; /// Filepath for which this project is considered read only QString read_only_file_path_; /// Name of the category used when automatically integrating elements within the embedded collection