From 3901d2fe8269c491282b7bd90a781995eee6a5e8 Mon Sep 17 00:00:00 2001 From: WandererFan Date: Sat, 27 Aug 2016 20:24:40 -0400 Subject: [PATCH] Add View centerlines --- src/Mod/TechDraw/App/DrawViewPart.cpp | 6 +- src/Mod/TechDraw/App/DrawViewPart.h | 2 + src/Mod/TechDraw/Gui/CMakeLists.txt | 2 + src/Mod/TechDraw/Gui/QGICenterLine.cpp | 99 ++++++++++++++++++++++++++ src/Mod/TechDraw/Gui/QGICenterLine.h | 65 +++++++++++++++++ src/Mod/TechDraw/Gui/QGIUserTypes.h | 1 + src/Mod/TechDraw/Gui/QGIViewPart.cpp | 47 ++++++++++++ src/Mod/TechDraw/Gui/QGIViewPart.h | 1 + 8 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 src/Mod/TechDraw/Gui/QGICenterLine.cpp create mode 100644 src/Mod/TechDraw/Gui/QGICenterLine.h diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index 2d594e1add70..1965dccd161a 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -110,6 +110,8 @@ DrawViewPart::DrawViewPart(void) : geometryObject(0) ADD_PROPERTY_TYPE(HiddenWidth,(0.15),fgroup,App::Prop_None,"The thickness of hidden lines, if enabled"); ADD_PROPERTY_TYPE(ShowCenters ,(true),fgroup,App::Prop_None,"Center marks on/off"); ADD_PROPERTY_TYPE(CenterScale,(2.0),fgroup,App::Prop_None,"Center mark size adjustment, if enabled"); + ADD_PROPERTY_TYPE(HorizCenterLine ,(false),fgroup,App::Prop_None,"Show a horizontal centerline through view"); + ADD_PROPERTY_TYPE(VertCenterLine ,(false),fgroup,App::Prop_None,"Show a vertical centerline through view"); ADD_PROPERTY_TYPE(ShowSectionLine ,(true) ,lgroup,App::Prop_None,"Show/hide section line if applicable"); ADD_PROPERTY_TYPE(HorizSectionLine ,(true) ,lgroup,App::Prop_None,"Section line is horizontal"); @@ -218,7 +220,9 @@ void DrawViewPart::onChanged(const App::Property* prop) prop == &ShowSectionLine || prop == &HorizSectionLine || prop == &ArrowUpSection || - prop == &SymbolSection ) { + prop == &SymbolSection || + prop == &HorizCenterLine || + prop == &VertCenterLine) { try { App::DocumentObjectExecReturn *ret = recompute(); delete ret; diff --git a/src/Mod/TechDraw/App/DrawViewPart.h b/src/Mod/TechDraw/App/DrawViewPart.h index 85e643793161..cc4584958d83 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.h +++ b/src/Mod/TechDraw/App/DrawViewPart.h @@ -74,6 +74,8 @@ class TechDrawExport DrawViewPart : public DrawView App::PropertyBool ShowCenters; App::PropertyFloat CenterScale; App::PropertyFloatConstraint Tolerance; + App::PropertyBool HorizCenterLine; + App::PropertyBool VertCenterLine; App::PropertyBool ShowSectionLine; App::PropertyBool HorizSectionLine; //true(horiz)/false(vert) diff --git a/src/Mod/TechDraw/Gui/CMakeLists.txt b/src/Mod/TechDraw/Gui/CMakeLists.txt index 902046b05cdb..852d15f2fe55 100644 --- a/src/Mod/TechDraw/Gui/CMakeLists.txt +++ b/src/Mod/TechDraw/Gui/CMakeLists.txt @@ -143,6 +143,8 @@ SET(TechDrawGuiView_SRCS QGISectionLine.h QGIDecoration.cpp QGIDecoration.h + QGICenterLine.cpp + QGICenterLine.h TemplateTextField.cpp TemplateTextField.h ZVALUE.h diff --git a/src/Mod/TechDraw/Gui/QGICenterLine.cpp b/src/Mod/TechDraw/Gui/QGICenterLine.cpp new file mode 100644 index 000000000000..c167e747e21f --- /dev/null +++ b/src/Mod/TechDraw/Gui/QGICenterLine.cpp @@ -0,0 +1,99 @@ +/*************************************************************************** + * Copyright (c) 2016 WandererFan * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + +#include "PreCompiled.h" +#ifndef _PreComp_ +#include +#include +#endif + +#include +#include +#include +#include + +#include "QGICenterLine.h" + +using namespace TechDrawGui; + +QGICenterLine::QGICenterLine() +{ + m_line = new QGraphicsPathItem(); + addToGroup(m_line); + setWidth(0.0); + setStyle(getCenterStyle()); + setColor(getCenterColor()); +} + +void QGICenterLine::draw() +{ + prepareGeometryChange(); + makeLine(); + update(); +} + +void QGICenterLine::makeLine() +{ + QPainterPath pp; + pp.moveTo(m_start); + pp.lineTo(m_end); + m_line->setPath(pp); +} + + +void QGICenterLine::setBounds(double x1,double y1,double x2,double y2) +{ + m_start = QPointF(x1,y1); + m_end = QPointF(x2,y2); +} + +QColor QGICenterLine::getCenterColor() +{ + Base::Reference hGrp = App::GetApplication().GetUserParameter() + .GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/Colors"); + App::Color fcColor = App::Color((uint32_t) hGrp->GetUnsigned("CenterColor", 0x08080800)); + return fcColor.asValue(); +} + +Qt::PenStyle QGICenterLine::getCenterStyle() +{ + Base::Reference hGrp = App::GetApplication().GetUserParameter().GetGroup("BaseApp")-> + GetGroup("Preferences")->GetGroup("Mod/TechDraw"); + Qt::PenStyle centerStyle = static_cast (hGrp->GetInt("CenterLine",3)); + return centerStyle; +} + +void QGICenterLine::paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) { + QStyleOptionGraphicsItem myOption(*option); + myOption.state &= ~QStyle::State_Selected; + + setTools(); + QGIDecoration::paint (painter, &myOption, widget); +} + +void QGICenterLine::setTools() +{ + m_pen.setWidthF(m_width); + m_pen.setColor(m_colCurrent); + m_pen.setStyle(m_styleCurrent); + m_line->setPen(m_pen); +} diff --git a/src/Mod/TechDraw/Gui/QGICenterLine.h b/src/Mod/TechDraw/Gui/QGICenterLine.h new file mode 100644 index 000000000000..09108f795d1e --- /dev/null +++ b/src/Mod/TechDraw/Gui/QGICenterLine.h @@ -0,0 +1,65 @@ +/*************************************************************************** + * Copyright (c) 2016 WandererFan * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + +#ifndef TECHDRAWGUI_QGICENTERLINE_H +#define TECHDRAWGUI_QGICENTERLINE_H + +#include +#include +#include + +#include + +#include "QGIDecoration.h" + +namespace TechDrawGui +{ + +class TechDrawGuiExport QGICenterLine : public QGIDecoration +{ +public: + explicit QGICenterLine(); + ~QGICenterLine() {} + + enum {Type = QGraphicsItem::UserType + 174}; + int type() const { return Type;} + + virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ); + + void setBounds(double x1,double y1,double x2,double y2); + virtual void draw(); + +protected: + QColor getCenterColor(); + Qt::PenStyle getCenterStyle(); + void makeLine(); + void setTools(); + +private: + QGraphicsPathItem* m_line; //primpath? + QPointF m_start; + QPointF m_end; +}; + +} + +#endif // TECHDRAWGUI_QGICENTERLINE_H diff --git a/src/Mod/TechDraw/Gui/QGIUserTypes.h b/src/Mod/TechDraw/Gui/QGIUserTypes.h index b5ef6a8180b9..4f2f67bae0fa 100644 --- a/src/Mod/TechDraw/Gui/QGIUserTypes.h +++ b/src/Mod/TechDraw/Gui/QGIUserTypes.h @@ -33,6 +33,7 @@ QGIPrimPath: 170 QGICMark: 171 QGISectionLine: 172 QGIDecoration: 173 +QGICenterLine: 174 */ /* diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index 317834427bf8..872fb1e2a51a 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -59,6 +59,7 @@ #include "QGIVertex.h" #include "QGICMark.h" #include "QGISectionLine.h" +#include "QGICenterLine.h" #include "QGCustomBorder.h" #include "QGCustomLabel.h" #include "QGIViewPart.h" @@ -381,6 +382,8 @@ void QGIViewPart::drawViewPart() viewPart->getSectionRef() ) { drawSectionLine(true); } + //draw center lines + drawCenterLines(true); } QGIFace* QGIViewPart::drawFace(TechDrawGeometry::Face* f, int idx) @@ -505,6 +508,50 @@ void QGIViewPart::drawSectionLine(bool b) } } +void QGIViewPart::drawCenterLines(bool b) +{ + TechDraw::DrawViewPart *viewPart = dynamic_cast(getViewObject()); + if (!viewPart) { + return; + + } + if (b) { + //Base::Vector3d vertDir(0,1,0); + //Base::Vector3d horizDir(1,0,0); + bool horiz = viewPart->HorizCenterLine.getValue(); + bool vert = viewPart->VertCenterLine.getValue(); + + //centroid of part is at (0,0) + QGICenterLine* centerLine; + double sectionSpan; + double sectionFudge = 10.0; + double xVal, yVal; + if (horiz) { + centerLine = new QGICenterLine(); + addToGroup(centerLine); + centerLine->setPos(0.0,0.0); + sectionSpan = m_border->rect().width() + sectionFudge; + xVal = sectionSpan / 2.0; + yVal = 0.0; + centerLine->setBounds(-xVal,-yVal,xVal,yVal); + //centerLine->setWidth(viewPart->LineWidth.getValue()); + centerLine->setZValue(ZVALUE::SECTIONLINE); + centerLine->draw(); + } + if (vert) { + centerLine = new QGICenterLine(); + addToGroup(centerLine); + centerLine->setPos(0.0,0.0); + sectionSpan = (m_border->rect().height() - m_label->boundingRect().height()) + sectionFudge; + xVal = 0.0; + yVal = sectionSpan / 2.0; + centerLine->setBounds(-xVal,-yVal,xVal,yVal); + //centerLine->setWidth(viewPart->LineWidth.getValue()); + centerLine->setZValue(ZVALUE::SECTIONLINE); + centerLine->draw(); + } + } +} // As called by arc of ellipse case: // pathArc(path, geom->major, geom->minor, geom->angle, geom->largeArc, geom->cw, diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.h b/src/Mod/TechDraw/Gui/QGIViewPart.h index d4bdadff76de..01c32259885b 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.h +++ b/src/Mod/TechDraw/Gui/QGIViewPart.h @@ -58,6 +58,7 @@ class TechDrawGuiExport QGIViewPart : public QGIView void tidy(); virtual QRectF boundingRect() const override; virtual void drawSectionLine(bool b); + virtual void drawCenterLines(bool b); bool showSection; virtual void draw() override;