From 731f76f52d6adba933fa94e5708e67497efa6331 Mon Sep 17 00:00:00 2001 From: WandererFan Date: Mon, 13 Jun 2016 19:36:52 -0400 Subject: [PATCH] Hatch using svgItem --- src/Mod/TechDraw/Gui/MDIViewPage.cpp | 1 + src/Mod/TechDraw/Gui/QGCustomSvg.cpp | 15 ++++- src/Mod/TechDraw/Gui/QGCustomSvg.h | 7 ++- src/Mod/TechDraw/Gui/QGIFace.cpp | 71 +++++++++++++++++++++++ src/Mod/TechDraw/Gui/QGIFace.h | 17 +++++- src/Mod/TechDraw/Gui/QGIViewPart.cpp | 18 +----- src/Mod/TechDraw/Gui/QGIViewPart.h | 2 - src/Mod/TechDraw/Gui/QGIViewSymbol.cpp | 13 +---- src/Mod/TechDraw/Gui/QGIViewSymbol.h | 5 +- src/Mod/TechDraw/Gui/QGVPage.cpp | 1 + src/Mod/TechDraw/Gui/ViewProviderPage.cpp | 2 +- 11 files changed, 112 insertions(+), 40 deletions(-) diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.cpp b/src/Mod/TechDraw/Gui/MDIViewPage.cpp index 9084ac863..88fea04eb 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.cpp +++ b/src/Mod/TechDraw/Gui/MDIViewPage.cpp @@ -103,6 +103,7 @@ MDIViewPage::MDIViewPage(ViewProviderPage *pageVp, Gui::Document* doc, QWidget* m_exportSVGAction = new QAction(tr("&Export SVG"), this); connect(m_exportSVGAction, SIGNAL(triggered()), this, SLOT(saveSVG())); + //m_outlineAction is obs? never set to Enabled? m_outlineAction = new QAction(tr("&Outline"), this); m_outlineAction->setEnabled(false); m_outlineAction->setCheckable(true); diff --git a/src/Mod/TechDraw/Gui/QGCustomSvg.cpp b/src/Mod/TechDraw/Gui/QGCustomSvg.cpp index c746eda99..aa5153b62 100644 --- a/src/Mod/TechDraw/Gui/QGCustomSvg.cpp +++ b/src/Mod/TechDraw/Gui/QGCustomSvg.cpp @@ -37,6 +37,13 @@ QGCustomSvg::QGCustomSvg() setAcceptHoverEvents(false); setFlag(QGraphicsItem::ItemIsSelectable, false); setFlag(QGraphicsItem::ItemIsMovable, false); + + m_svgRender = new QSvgRenderer(); +} + +QGCustomSvg::~QGCustomSvg() +{ + delete m_svgRender; } void QGCustomSvg::centerAt(QPointF centerPos) @@ -59,10 +66,16 @@ void QGCustomSvg::centerAt(double cX, double cY) setPos(newX,newY); } +bool QGCustomSvg::load(QByteArray *svgBytes) +{ + bool success = m_svgRender->load(*svgBytes); + setSharedRenderer(m_svgRender); + return(success); +} + void QGCustomSvg::paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) { QStyleOptionGraphicsItem myOption(*option); myOption.state &= ~QStyle::State_Selected; QGraphicsSvgItem::paint (painter, &myOption, widget); } - diff --git a/src/Mod/TechDraw/Gui/QGCustomSvg.h b/src/Mod/TechDraw/Gui/QGCustomSvg.h index 732f1ad73..9a600cb12 100644 --- a/src/Mod/TechDraw/Gui/QGCustomSvg.h +++ b/src/Mod/TechDraw/Gui/QGCustomSvg.h @@ -26,6 +26,8 @@ #include #include #include +#include +#include QT_BEGIN_NAMESPACE class QPainter; @@ -39,7 +41,7 @@ class TechDrawGuiExport QGCustomSvg : public QGraphicsSvgItem { public: explicit QGCustomSvg(void); - ~QGCustomSvg() {} + ~QGCustomSvg(); enum {Type = QGraphicsItem::UserType + 131}; int type() const { return Type;} @@ -47,8 +49,10 @@ public: virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ); virtual void centerAt(QPointF centerPos); virtual void centerAt(double cX, double cY); + virtual bool load(QByteArray *svgString); protected: + QSvgRenderer *m_svgRender; private: @@ -57,4 +61,3 @@ private: } // namespace MDIViewPageGui #endif // DRAWINGGUI_QGCUSTOMSVG_H - diff --git a/src/Mod/TechDraw/Gui/QGIFace.cpp b/src/Mod/TechDraw/Gui/QGIFace.cpp index f0f1da38d..c8caa0b57 100644 --- a/src/Mod/TechDraw/Gui/QGIFace.cpp +++ b/src/Mod/TechDraw/Gui/QGIFace.cpp @@ -33,6 +33,13 @@ #include #endif +#include +#include +#include +#include + +#include + #include #include #include @@ -54,6 +61,8 @@ QGIFace::QGIFace(int index) : setFlag(QGraphicsItem::ItemIsMovable, false); setFlag(QGraphicsItem::ItemSendsScenePositionChanges, true); setFlag(QGraphicsItem::ItemSendsGeometryChanges,true); + setFlag(QGraphicsItem::QGraphicsItem::ItemClipsChildrenToShape,true); + //setFiltersChildEvents(true); setAcceptHoverEvents(true); isHighlighted = false; @@ -80,6 +89,16 @@ QGIFace::QGIFace(int index) : m_brushPre.setStyle(m_styleSelect); m_brushSel.setColor(m_colSel); m_brushSel.setStyle(m_styleSelect); + + m_svg = new QGCustomSvg(); + + m_rect = new QGCustomRect(); + m_rect->setParentItem(this); +} + +QGIFace::~QGIFace() +{ + //nothing to do. every item is a child of QGIFace & will get removed/deleted when QGIF is deleted } QVariant QGIFace::itemChange(GraphicsItemChange change, const QVariant &value) @@ -163,6 +182,58 @@ void QGIFace::setFill(QBrush b) { m_brushNormal = b; } +void QGIFace::setHatch(std::string fileSpec) +{ + QString qfs(QString::fromStdString(fileSpec)); + QFile f(qfs); + if (!f.open(QFile::ReadOnly | QFile::Text)) { + Base::Console().Error("QGIFace could not read %s\n",fileSpec.c_str()); + return; + } + m_qba = f.readAll(); + if (!m_svg->load(&m_qba)) { + Base::Console().Error("Error - Could not load hatch into SVG renderer for %s\n", fileSpec.c_str()); + return; + } + + buildHatch(); +} + +void QGIFace::setPath(const QPainterPath & path) +{ + QGraphicsPathItem::setPath(path); + if (!m_qba.isEmpty()) { + buildHatch(); + } +} + +void QGIFace::buildHatch() +{ + m_brushNormal.setStyle(Qt::NoBrush ); + double w = boundingRect().width(); + double h = boundingRect().height(); + QRectF r = boundingRect(); + QPointF fCenter = r.center(); + double nw = ceil(w / SVGSIZEW); + double nh = ceil(h / SVGSIZEH); + w = nw * SVGSIZEW; + h = nh * SVGSIZEW; + m_rect->setRect(0.,0.,w,-h); + m_rect->centerAt(fCenter); + QPointF rPos = m_rect->pos(); + r = m_rect->rect(); + for (int iw = 0; iw < int(nw); iw++) { + for (int ih = 0; ih < int(nh); ih++) { + QGCustomSvg* tile = new QGCustomSvg(); + if (tile->load(&m_qba)) { + tile->setParentItem(m_rect); + tile->setPos(iw*SVGSIZEW,-h + ih*SVGSIZEH); + } + } + } + +} + void QGIFace::resetFill() { m_colNormalFill = m_colDefFill; //m_styleCurr = m_styleDef; diff --git a/src/Mod/TechDraw/Gui/QGIFace.h b/src/Mod/TechDraw/Gui/QGIFace.h index 4ba5a4ccf..d2e4df2b2 100644 --- a/src/Mod/TechDraw/Gui/QGIFace.h +++ b/src/Mod/TechDraw/Gui/QGIFace.h @@ -25,6 +25,11 @@ #include #include +#include +#include + +#include "QGCustomSvg.h" +#include "QGCustomRect.h" QT_BEGIN_NAMESPACE class QPainter; @@ -38,11 +43,14 @@ class BaseGeom; namespace TechDrawGui { + const double SVGSIZEW = 64.0; //width and height of standard FC SVG pattern + const double SVGSIZEH = 64.0; + class QGIFace : public QGraphicsPathItem { public: explicit QGIFace(int index = -1); - ~QGIFace() {} + ~QGIFace(); enum {Type = QGraphicsItem::UserType + 104}; int type() const { return Type;} @@ -59,7 +67,10 @@ public: void setPrettySel(); void setFill(QColor c, Qt::BrushStyle s); void setFill(QBrush b); + void setHatch(std::string fileSpec); void resetFill(void); + void setPath(const QPainterPath & path); + void buildHatch(void); virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent * event); @@ -70,10 +81,14 @@ protected: // Selection detection QVariant itemChange(GraphicsItemChange change, const QVariant &value); virtual void mousePressEvent(QGraphicsSceneMouseEvent * event); + bool load(QByteArray *svgBytes); protected: int projIndex; //index of face in Projection. -1 for SectionFace. bool isHighlighted; + QGCustomRect *m_rect; + QGCustomSvg *m_svg; + QByteArray m_qba; private: QPen m_pen; diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index 78e974969..846a7d858 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -313,9 +313,7 @@ void QGIViewPart::drawViewPart() TechDraw::DrawHatch* fHatch = faceIsHatched(i,hatchObjs); if (fHatch) { if (!fHatch->HatchPattern.isEmpty()) { - QBrush fBrush = brushFromFile(fHatch->HatchPattern.getValue()); - fBrush.setColor(fHatch->HatchColor.getValue().asValue()); - newFace->setFill(fBrush); + newFace->setHatch(fHatch->HatchPattern.getValue()); } } newFace->setZValue(ZVALUE::FACE); @@ -407,7 +405,6 @@ QGIFace* QGIViewPart::drawFace(TechDrawGeometry::Face* f, int idx) //faceId << "facePath " << idx; //_dumpPath(faceId.str().c_str(),facePath); - //gFace->setFlag(QGraphicsItem::ItemIsSelectable, true); ??? return gFace; } @@ -565,19 +562,6 @@ void QGIViewPart::toggleVertices(bool state) } } -QBrush QGIViewPart::brushFromFile(std::string fillSpec) -{ - QBrush result; - QString qs(QString::fromStdString(fillSpec)); - QSvgRenderer renderer(qs); - QBitmap pixMap(renderer.defaultSize()); - pixMap.fill(Qt::white); //try Qt::transparent? - QPainter painter(&pixMap); - renderer.render(&painter); //svg texture -> bitmap - result.setTexture(pixMap); - return result; -} - TechDraw::DrawHatch* QGIViewPart::faceIsHatched(int i,std::vector hatchObjs) const { TechDraw::DrawHatch* result = nullptr; diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.h b/src/Mod/TechDraw/Gui/QGIViewPart.h index 1ffee412b..5b8d70d5e 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.h +++ b/src/Mod/TechDraw/Gui/QGIViewPart.h @@ -85,8 +85,6 @@ protected: virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; - //hatching routines - QBrush brushFromFile(std::string fillSpec); TechDraw::DrawHatch* faceIsHatched(int i,std::vector hatchObjs) const; QColor m_colHid; diff --git a/src/Mod/TechDraw/Gui/QGIViewSymbol.cpp b/src/Mod/TechDraw/Gui/QGIViewSymbol.cpp index ed05ab9a1..e59ab7a87 100644 --- a/src/Mod/TechDraw/Gui/QGIViewSymbol.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewSymbol.cpp @@ -53,8 +53,6 @@ QGIViewSymbol::QGIViewSymbol() setFlag(QGraphicsItem::ItemIsMovable, true); setFlag(QGraphicsItem::ItemIsSelectable, true); - m_svgRender = new QSvgRenderer(); - m_svgItem = new QGCustomSvg(); addToGroup(m_svgItem); m_svgItem->setPos(0.,0.); @@ -63,7 +61,6 @@ QGIViewSymbol::QGIViewSymbol() QGIViewSymbol::~QGIViewSymbol() { // m_svgItem belongs to this group and will be deleted by Qt - delete(m_svgRender); } QVariant QGIViewSymbol::itemChange(GraphicsItemChange change, const QVariant &value) @@ -131,7 +128,7 @@ void QGIViewSymbol::symbolToSvg(QString qs) QByteArray qba; qba.append(qs); - if (!load(&qba)) { + if (!m_svgItem->load(&qba)) { Base::Console().Error("Error - Could not load Symbol into SVG renderer for %s\n", getViewObject()->getNameInDocument()); } m_svgItem->setPos(0.,0.); @@ -141,11 +138,3 @@ QRectF QGIViewSymbol::boundingRect() const { return childrenBoundingRect(); } - -bool QGIViewSymbol::load(QByteArray *svgBytes) -{ - bool success = m_svgRender->load(*svgBytes); - m_svgItem->setSharedRenderer(m_svgRender); - return(success); -} - diff --git a/src/Mod/TechDraw/Gui/QGIViewSymbol.h b/src/Mod/TechDraw/Gui/QGIViewSymbol.h index 9daf869b1..eef5a0d25 100644 --- a/src/Mod/TechDraw/Gui/QGIViewSymbol.h +++ b/src/Mod/TechDraw/Gui/QGIViewSymbol.h @@ -57,15 +57,12 @@ public: virtual QRectF boundingRect() const override; protected: - bool load(QByteArray *svgString); virtual void drawSvg(); void symbolToSvg(QString qs); QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; QGCustomSvg *m_svgItem; - QSvgRenderer *m_svgRender; }; -} // namespace MDIViewPageGui - +} // namespace #endif // DRAWINGGUI_QGRAPHICSITEMVIEWSYMBOL_H diff --git a/src/Mod/TechDraw/Gui/QGVPage.cpp b/src/Mod/TechDraw/Gui/QGVPage.cpp index 0f0df72f6..82f91c005 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.cpp +++ b/src/Mod/TechDraw/Gui/QGVPage.cpp @@ -123,6 +123,7 @@ QGVPage::~QGVPage() void QGVPage::drawBackground(QPainter *p, const QRectF &) { +//Note: Background is not part of scene() if(!drawBkg) return; diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp index 9383d04c4..f7f4919a3 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp @@ -302,7 +302,7 @@ void ViewProviderPage::onSelectionChanged(const Gui::SelectionChanges& msg) } } } - } + } //else (Gui::SelectionChanges::SetPreselect) } }