diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.cpp b/src/Mod/TechDraw/Gui/MDIViewPage.cpp index fe09291cc..b3775bb1a 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.cpp +++ b/src/Mod/TechDraw/Gui/MDIViewPage.cpp @@ -744,7 +744,7 @@ void MDIViewPage::print(QPrinter* printer) static_cast (blockConnection(true)); // avoid to be notified by itself Gui::Selection().clearSelection(); - m_view->toggleEdit(false); + m_view->toggleMarkers(false); m_view->scene()->update(); Gui::Selection().clearSelection(); @@ -752,7 +752,7 @@ void MDIViewPage::print(QPrinter* printer) m_view->scene()->render(&p, rect); // Reset - m_view->toggleEdit(true); + m_view->toggleMarkers(true); } @@ -812,7 +812,7 @@ QPrinter::PageSize MDIViewPage::getPageSize(int w, int h) const void MDIViewPage::setFrameState(bool state) { m_frameState = state; - m_view->toggleEdit(state); + m_view->toggleMarkers(state); m_view->scene()->update(); } diff --git a/src/Mod/TechDraw/Gui/QGIFace.cpp b/src/Mod/TechDraw/Gui/QGIFace.cpp index 559c79265..3722bb6d7 100644 --- a/src/Mod/TechDraw/Gui/QGIFace.cpp +++ b/src/Mod/TechDraw/Gui/QGIFace.cpp @@ -175,6 +175,17 @@ void QGIFace::setHatchColor(std::string c) m_svgCol = c; } +//QtSvg does not handle clipping, so we must be able to turn the hatching on/off +void QGIFace::toggleSvg(bool b) +{ + if (b) { + m_rect->show(); + } else { + m_rect->hide(); + } + update(); +} + QRectF QGIFace::boundingRect() const { return shape().controlPointRect(); diff --git a/src/Mod/TechDraw/Gui/QGIFace.h b/src/Mod/TechDraw/Gui/QGIFace.h index 3eb7addcb..99b8194e5 100644 --- a/src/Mod/TechDraw/Gui/QGIFace.h +++ b/src/Mod/TechDraw/Gui/QGIFace.h @@ -65,6 +65,7 @@ public: void setPath(const QPainterPath & path); void buildHatch(void); void setHatchColor(std::string c); + void toggleSvg(bool b); protected: bool load(QByteArray *svgBytes); diff --git a/src/Mod/TechDraw/Gui/QGITemplate.h b/src/Mod/TechDraw/Gui/QGITemplate.h index 68c79e7b0..4370b0280 100644 --- a/src/Mod/TechDraw/Gui/QGITemplate.h +++ b/src/Mod/TechDraw/Gui/QGITemplate.h @@ -57,6 +57,7 @@ public: inline qreal getY() { return y() * -1; } virtual void updateView(bool update = false); + std::vector getTestFields(void) { return textFields; }; virtual void draw() = 0; diff --git a/src/Mod/TechDraw/Gui/QGIView.cpp b/src/Mod/TechDraw/Gui/QGIView.cpp index a641c6722..0422dc073 100644 --- a/src/Mod/TechDraw/Gui/QGIView.cpp +++ b/src/Mod/TechDraw/Gui/QGIView.cpp @@ -79,8 +79,8 @@ QGIView::QGIView() m_colCurrent = getNormalColor(); m_pen.setColor(m_colCurrent); + //Border/Label styling m_font.setPointSize(5.0); //scene units (mm), not points - m_decorPen.setStyle(Qt::DashLine); m_decorPen.setWidth(0); // 0 => 1px "cosmetic pen" diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index 62ed70945..85ccc7786 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -102,6 +102,7 @@ QVariant QGIViewPart::itemChange(GraphicsItemChange change, const QVariant &valu return QGIView::itemChange(change, value); } +//obs? void QGIViewPart::tidy() { //Delete any leftover items @@ -249,21 +250,6 @@ void QGIViewPart::updateView(bool update) viewPart->ShowHiddenLines.isTouched() || viewPart->ShowSmoothLines.isTouched() || viewPart->ShowSeamLines.isTouched() ) { - // Remove all existing graphical representations (QGIxxxx) otherwise BRect only grows, never shrinks? - // is this where selection messes up? - prepareGeometryChange(); - QList items = childItems(); - for(QList::iterator it = items.begin(); it != items.end(); ++it) { - if (dynamic_cast (*it) || - dynamic_cast(*it) || - dynamic_cast(*it)) { - removeFromGroup(*it); - scene()->removeItem(*it); - - // We store these and delete till later to prevent rendering crash ISSUE - deleteItems.append(*it); - } - } draw(); } else if (update || viewPart->LineWidth.isTouched() || @@ -302,6 +288,7 @@ void QGIViewPart::drawViewPart() float lineWidthHid = viewPart->HiddenWidth.getValue() * lineScaleFactor; prepareGeometryChange(); + removePrimitives(); //clean the slate #if MOD_TECHDRAW_HANDLE_FACES // Draw Faces @@ -344,7 +331,7 @@ void QGIViewPart::drawViewPart() if (showEdge) { item = new QGIEdge(i); addToGroup(item); //item is at scene(0,0), not group(0,0) - item->setPos(0.0,0.0); + item->setPos(0.0,0.0); //now at group(0,0) item->setPath(drawPainterPath(*itEdge)); item->setStrokeWidth(lineWidth); item->setZValue(ZVALUE::EDGE); @@ -405,6 +392,21 @@ QGIFace* QGIViewPart::drawFace(TechDrawGeometry::Face* f, int idx) return gFace; } +//! Remove all existing QGIPrimPath items(Vertex,Edge,Face) +void QGIViewPart::removePrimitives() +{ + QList children = childItems(); + for (auto& c:children) { + QGIPrimPath* prim = dynamic_cast(c); + if (prim) { + removeFromGroup(prim); + scene()->removeItem(prim); +// deleteItems.append(prim); //pretty sure we could just delete here since not in scene anymore + delete prim; + } + } +} + // As called by arc of ellipse case: // pathArc(path, geom->major, geom->minor, geom->angle, geom->largeArc, geom->cw, // geom->endPnt.fX, geom->endPnt.fY, diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.h b/src/Mod/TechDraw/Gui/QGIViewPart.h index 40670583d..b968c4095 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.h +++ b/src/Mod/TechDraw/Gui/QGIViewPart.h @@ -85,6 +85,7 @@ protected: TechDraw::DrawHatch* faceIsHatched(int i,std::vector hatchObjs) const; void dumpPath(const char* text,QPainterPath path); + void removePrimitives(void); private: QList deleteItems; diff --git a/src/Mod/TechDraw/Gui/QGVPage.cpp b/src/Mod/TechDraw/Gui/QGVPage.cpp index 58dde4486..1ab5fd156 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.cpp +++ b/src/Mod/TechDraw/Gui/QGVPage.cpp @@ -28,7 +28,6 @@ # include # include # include -//# include # include # include # include @@ -61,7 +60,9 @@ #include "QGIDrawingTemplate.h" +#include "QGITemplate.h" #include "QGISVGTemplate.h" +#include "TemplateTextField.h" #include "QGIViewCollection.h" #include "QGIViewDimension.h" #include "QGIProjGroup.h" @@ -71,6 +72,7 @@ #include "QGIViewSymbol.h" #include "QGIViewClip.h" #include "QGIViewSpreadsheet.h" +#include "QGIFace.h" #include "ZVALUE.h" #include "ViewProviderPage.h" @@ -101,9 +103,9 @@ QGVPage::QGVPage(ViewProviderPage *vp, QGraphicsScene& s, QWidget *parent) setCursor(QCursor(Qt::ArrowCursor)); setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); - m_backgroundItem = new QGraphicsRectItem(); - m_backgroundItem->setCacheMode(QGraphicsItem::NoCache); - m_backgroundItem->setZValue(ZVALUE::BACKGROUND); + //m_backgroundItem = new QGraphicsRectItem(); + //m_backgroundItem->setCacheMode(QGraphicsItem::NoCache); + //m_backgroundItem->setZValue(ZVALUE::BACKGROUND); // scene()->addItem(m_backgroundItem); // TODO IF SEGFAULTS WITH DRAW ENABLE THIS (REDRAWS ARE SLOWER :s) bkgBrush = new QBrush(QColor::fromRgb(70,70,70)); @@ -113,7 +115,7 @@ QGVPage::QGVPage(ViewProviderPage *vp, QGraphicsScene& s, QWidget *parent) QGVPage::~QGVPage() { delete bkgBrush; - delete m_backgroundItem; + //delete m_backgroundItem; } void QGVPage::drawBackground(QPainter *p, const QRectF &) @@ -465,10 +467,10 @@ void QGVPage::setHighQualityAntialiasing(bool highQualityAntialiasing) void QGVPage::setViewBackground(bool enable) { - if (!m_backgroundItem) - return; +// if (!m_backgroundItem) +// return; - m_backgroundItem->setVisible(enable); +// m_backgroundItem->setVisible(enable); } void QGVPage::setViewOutline(bool enable) @@ -479,46 +481,49 @@ void QGVPage::setViewOutline(bool enable) m_outlineItem->setVisible(enable); } -void QGVPage::toggleEdit(bool enable) +void QGVPage::toggleMarkers(bool enable) { -// TODO: needs fiddling to handle items that don't inherit QGIViewPart: Annotation, Symbol, Templates, Edges, Faces, Vertices,... QList list = scene()->items(); - for (QList::iterator it = list.begin(); it != list.end(); ++it) { QGIView *itemView = dynamic_cast(*it); if(itemView) { - QGIViewPart *viewPart = dynamic_cast(*it); itemView->setSelected(false); + itemView->toggleBorder(enable); + QGIViewPart *viewPart = dynamic_cast(*it); if(viewPart) { - viewPart->toggleCache(enable); - viewPart->toggleCosmeticLines(enable); viewPart->toggleVertices(enable); - viewPart->toggleBorder(enable); - setViewBackground(enable); - } else { - itemView->toggleBorder(enable); } - //itemView->updateView(true); } - - int textItemType = QGraphicsItem::UserType + 160; - QGraphicsItem*item = dynamic_cast(*it); - if(item) { - //item->setCacheMode((enable) ? QGraphicsItem::DeviceCoordinateCache : QGraphicsItem::NoCache); - item->setCacheMode((enable) ? QGraphicsItem::NoCache : QGraphicsItem::NoCache); - item->update(); - if (item->type() == textItemType) { //TODO: move this into SVGTemplate or TemplateTextField + QGISVGTemplate* itemTemplate = dynamic_cast (*it); + if (itemTemplate) { + std::vector textFields = itemTemplate->getTestFields(); + for (auto& t:textFields) { if (enable) { - item->show(); + t->show(); } else { - item->hide(); + t->hide(); + } + } + } + } +} + +void QGVPage::toggleHatch(bool enable) +{ + QList sceneItems = scene()->items(); + for (auto& qgi:sceneItems) { + QGIViewPart* qgiPart = dynamic_cast(qgi); + if(qgiPart) { + QList partChildren = qgiPart->childItems(); + int faceItemType = QGraphicsItem::UserType + 104; + for (auto& c:partChildren) { + if (c->type() == faceItemType) { + QGIFace* f = dynamic_cast(c); + f->toggleSvg(enable); } } } } - scene()->update(); - update(); - viewport()->repaint(); } void QGVPage::saveSvg(QString filename) @@ -545,7 +550,7 @@ void QGVPage::saveSvg(QString filename) // postprocess generated file to mult all font-size attrib by 2.835 to get pts? // duplicate all textItems and only show the appropriate one for screen/print vs export? -// TODO: Was svgGen.setResolution(25.4000508); // mm/inch?? docs say this is DPI +// TODO: Was svgGen.setResolution(25.4000508); // mm/inch?? docs say this is DPI //really "user space units/inch"? svgGen.setResolution(25); // mm/inch?? docs say this is DPI //svgGen.setResolution(600); // resulting page is ~12.5x9mm @@ -555,8 +560,10 @@ void QGVPage::saveSvg(QString filename) Gui::Selection().clearSelection(); - toggleEdit(false); //fiddle cache, cosmetic lines, vertices, etc + toggleMarkers(false); //fiddle cache, vertices, frames, etc + toggleHatch(false); scene()->update(); + viewport()->repaint(); Gui::Selection().clearSelection(); QPainter p; @@ -565,8 +572,10 @@ void QGVPage::saveSvg(QString filename) scene()->render(&p); p.end(); - toggleEdit(true); + toggleMarkers(true); + toggleHatch(true); scene()->update(); + viewport()->repaint(); } diff --git a/src/Mod/TechDraw/Gui/QGVPage.h b/src/Mod/TechDraw/Gui/QGVPage.h index ef6224488..73fe7e1da 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.h +++ b/src/Mod/TechDraw/Gui/QGVPage.h @@ -85,7 +85,8 @@ public: TechDraw::DrawPage * getDrawPage(); - void toggleEdit(bool enable); + void toggleMarkers(bool enable); + void toggleHatch(bool enable); /// Renders the page to SVG with filename. void saveSvg(QString filename);