From 81cbd2643ff5566e701102e88f972b1f8147f111 Mon Sep 17 00:00:00 2001 From: wmayer Date: Mon, 17 Feb 2014 15:27:59 +0100 Subject: [PATCH] + draw additional dashed line in brush tool --- src/Gui/GLPainter.cpp | 12 ++++++++++++ src/Gui/GLPainter.h | 2 ++ src/Gui/MouseSelection.cpp | 21 +++++++++++++++++++++ src/Gui/MouseSelection.h | 2 ++ src/Mod/Mesh/Gui/MeshSelection.cpp | 1 + 5 files changed, 38 insertions(+) diff --git a/src/Gui/GLPainter.cpp b/src/Gui/GLPainter.cpp index bfece7710..330d647d6 100644 --- a/src/Gui/GLPainter.cpp +++ b/src/Gui/GLPainter.cpp @@ -138,6 +138,12 @@ void GLPainter::setLogicOp(GLenum mode) this->logicOp = true; } +void GLPainter::resetLogicOp() +{ + glDisable(GL_COLOR_LOGIC_OP); + this->logicOp = false; +} + void GLPainter::setDrawBuffer(GLenum mode) { glDrawBuffer(mode); @@ -150,6 +156,12 @@ void GLPainter::setLineStipple(GLint factor, GLushort pattern) this->lineStipple = true; } +void GLPainter::resetLineStipple() +{ + glDisable(GL_LINE_STIPPLE); + this->lineStipple = false; +} + // Draw routines void GLPainter::drawRect(int x1, int y1, int x2, int y2) { diff --git a/src/Gui/GLPainter.h b/src/Gui/GLPainter.h index 287c9d1e2..b5e5eefde 100644 --- a/src/Gui/GLPainter.h +++ b/src/Gui/GLPainter.h @@ -53,8 +53,10 @@ public: void setPointSize(float); void setColor(float, float, float, float=0); void setLogicOp(GLenum); + void resetLogicOp(); void setDrawBuffer(GLenum); void setLineStipple(GLint factor, GLushort pattern); + void resetLineStipple(); //@} /** @name Draw routines */ diff --git a/src/Gui/MouseSelection.cpp b/src/Gui/MouseSelection.cpp index 2aec13351..e75ba5237 100644 --- a/src/Gui/MouseSelection.cpp +++ b/src/Gui/MouseSelection.cpp @@ -481,6 +481,7 @@ BrushSelection::BrushSelection() { m_iNodes = 0; m_bWorking = false; + m_bClose = false; } void BrushSelection::initialize() @@ -507,6 +508,11 @@ void BrushSelection::setLineWidth(float l) this->l = l; } +void BrushSelection::setClosed(bool on) +{ + this->m_bClose = on; +} + void BrushSelection::draw () { if (mustRedraw){ @@ -532,6 +538,21 @@ void BrushSelection::draw () p.begin(_pcView3D); p.setLineWidth(this->l); p.setColor(this->r, this->g, this->b, this->a); + if (m_bClose && !_cNodeVector.empty()) { + // We have to redraw the whole polyline when using XOR because otherwise the curve looks 'dirty'. + QPoint start = _cNodeVector.front(); + for (std::vector::iterator it = _cNodeVector.begin()+1; it != _cNodeVector.end(); ++it) { + p.drawLine(start.x(),start.y(),it->x(), it->y()); + start = *it; + } + start = _cNodeVector.front(); + p.setLineStipple(2, 0x3F3F); + p.setLogicOp(GL_XOR); + p.drawLine(m_iXold, m_iYold, start.x(),start.y()); + p.drawLine(m_iXnew, m_iYnew, start.x(),start.y()); + p.resetLogicOp(); + p.resetLineStipple(); + } p.drawLine(m_iXnew, m_iYnew, m_iXold, m_iYold); p.end(); } diff --git a/src/Gui/MouseSelection.h b/src/Gui/MouseSelection.h index 70aa8548d..54d282a4b 100644 --- a/src/Gui/MouseSelection.h +++ b/src/Gui/MouseSelection.h @@ -175,6 +175,7 @@ public: // Settings void setColor(float r, float g, float b, float a=0); void setLineWidth(float); + void setClosed(bool); protected: virtual int mouseButtonEvent( const SoMouseButtonEvent * const e, const QPoint& pos ); @@ -189,6 +190,7 @@ protected: std::vector _cNodeVector; int m_iNodes; bool m_bWorking; + bool m_bClose; private: float r,g,b,a,l; diff --git a/src/Mod/Mesh/Gui/MeshSelection.cpp b/src/Mod/Mesh/Gui/MeshSelection.cpp index 0df1e8490..395c7f4b9 100644 --- a/src/Mod/Mesh/Gui/MeshSelection.cpp +++ b/src/Mod/Mesh/Gui/MeshSelection.cpp @@ -171,6 +171,7 @@ void MeshSelection::prepareBrushSelection(bool add,SoEventCallbackCB *cb) startInteractiveCallback(viewer, cb); // set cross cursor Gui::BrushSelection* brush = new Gui::BrushSelection(); + brush->setClosed(true); brush->setColor(1.0f,0.0f,0.0f); brush->setLineWidth(3.0f); viewer->navigationStyle()->startSelection(brush);