From 21efae348eb1b80918bc4202595ed9889c99f63a Mon Sep 17 00:00:00 2001 From: wandererfan Date: Thu, 18 Jul 2019 20:12:28 -0400 Subject: [PATCH] [TD]Fix #4017 Crash on bad hatch scale --- src/Mod/TechDraw/Gui/QGIFace.cpp | 13 +++++++++++++ src/Mod/TechDraw/Gui/QGIFace.h | 1 + src/Mod/TechDraw/Gui/QGIViewPart.cpp | 10 ++++++++-- src/Mod/TechDraw/Gui/ViewProviderHatch.cpp | 17 ++++++++++++----- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/Mod/TechDraw/Gui/QGIFace.cpp b/src/Mod/TechDraw/Gui/QGIFace.cpp index d5bb180101..2dfb03bac6 100644 --- a/src/Mod/TechDraw/Gui/QGIFace.cpp +++ b/src/Mod/TechDraw/Gui/QGIFace.cpp @@ -517,6 +517,7 @@ void QGIFace::buildSvgHatch() before.append(QString::fromStdString(SVGCOLPREFIX + SVGCOLDEFAULT)); after.append(QString::fromStdString(SVGCOLPREFIX + m_svgCol)); QByteArray colorXML = m_svgXML.replace(before,after); + long int tileCount = 0; for (int iw = 0; iw < int(nw); iw++) { for (int ih = 0; ih < int(nh); ih++) { QGCustomSvg* tile = new QGCustomSvg(); @@ -525,6 +526,14 @@ void QGIFace::buildSvgHatch() tile->setParentItem(m_rect); tile->setPos(iw*wTile,-h + ih*hTile); } + tileCount++; + if (tileCount > m_maxTile) { + Base::Console().Warning("SVG tile count exceeded: %ld\n",tileCount); + break; + } + } + if (tileCount > m_maxTile) { + break; } } } @@ -611,6 +620,10 @@ void QGIFace::getParameters(void) .GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/PAT"); m_maxSeg = hGrp->GetInt("MaxSeg",10000l); + + hGrp = App::GetApplication().GetUserParameter() + .GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/Decorations"); + m_maxTile = hGrp->GetInt("MaxSVGTile",10000l); } diff --git a/src/Mod/TechDraw/Gui/QGIFace.h b/src/Mod/TechDraw/Gui/QGIFace.h index 5fb8c4079b..ad224a192b 100644 --- a/src/Mod/TechDraw/Gui/QGIFace.h +++ b/src/Mod/TechDraw/Gui/QGIFace.h @@ -147,6 +147,7 @@ protected: std::vector m_dashSpecs; long int m_segCount; long int m_maxSeg; + long int m_maxTile; private: diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index f57fb288f9..0e826fb2b4 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -386,7 +386,10 @@ void QGIViewPart::drawViewPart() } newFace->isHatched(true); newFace->setFillMode(QGIFace::GeomHatchFill); - newFace->setHatchScale(fGeom->ScalePattern.getValue()); + double hatchScale = fGeom->ScalePattern.getValue(); + if (hatchScale > 0.0) { + newFace->setHatchScale(fGeom->ScalePattern.getValue()); + } newFace->setHatchFile(fGeom->FilePattern.getValue()); Gui::ViewProvider* gvp = QGIView::getViewProvider(fGeom); ViewProviderGeomHatch* geomVp = dynamic_cast(gvp); @@ -404,7 +407,10 @@ void QGIViewPart::drawViewPart() Gui::ViewProvider* gvp = QGIView::getViewProvider(fHatch); ViewProviderHatch* hatchVp = dynamic_cast(gvp); if (hatchVp != nullptr) { - newFace->setHatchScale(hatchVp->HatchScale.getValue()); + double hatchScale = hatchVp->HatchScale.getValue(); + if (hatchScale > 0.0) { + newFace->setHatchScale(hatchVp->HatchScale.getValue()); + } newFace->setHatchColor(hatchVp->HatchColor.getValue()); } } diff --git a/src/Mod/TechDraw/Gui/ViewProviderHatch.cpp b/src/Mod/TechDraw/Gui/ViewProviderHatch.cpp index da2c94194c..c91614ee4d 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderHatch.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderHatch.cpp @@ -47,8 +47,13 @@ using namespace TechDrawGui; -App::PropertyFloatConstraint::Constraints ViewProviderHatch::scaleRange = {Precision::Confusion(), - std::numeric_limits::max(), +//scaleRange = {lowerLimit, upperLimit, stepSize} +//original range is far too broad for drawing. causes massive loop counts. +//App::PropertyFloatConstraint::Constraints ViewProviderHatch::scaleRange = {Precision::Confusion(), +// std::numeric_limits::max(), +// pow(10,- Base::UnitsApi::getDecimals())}; +App::PropertyFloatConstraint::Constraints ViewProviderHatch::scaleRange = {pow(10,- Base::UnitsApi::getDecimals()), + 1000.0, pow(10,- Base::UnitsApi::getDecimals())}; @@ -99,9 +104,11 @@ void ViewProviderHatch::onChanged(const App::Property* prop) { if ((prop == &HatchScale) || (prop == &HatchColor)) { - TechDraw::DrawViewPart* parent = getViewObject()->getSourceView(); - if (parent) { - parent->requestPaint(); + if (HatchScale.getValue() > 0.0) { + TechDraw::DrawViewPart* parent = getViewObject()->getSourceView(); + if (parent) { + parent->requestPaint(); + } } } }