From 03e9e294597374d4674d872a6d92ceb03372f35a Mon Sep 17 00:00:00 2001 From: wandererfan Date: Sun, 23 Nov 2025 17:58:31 -0500 Subject: [PATCH 1/3] [TD]add preference re alpha/transparency conversion --- src/Mod/TechDraw/App/Preferences.cpp | 7 +++++++ src/Mod/TechDraw/App/Preferences.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/Mod/TechDraw/App/Preferences.cpp b/src/Mod/TechDraw/App/Preferences.cpp index f97c9ed9e9..6c0d5d71f1 100644 --- a/src/Mod/TechDraw/App/Preferences.cpp +++ b/src/Mod/TechDraw/App/Preferences.cpp @@ -719,3 +719,10 @@ bool Preferences::printCenterMarks() { return getPreferenceGroup("Decorations")->GetBool("PrintCenterMarks", false); } + + +//! true if old style transparency values should be converted to new style alpha values for color properties. +bool Preferences::fixColorAlphaOnLoad() +{ + return getPreferenceGroup("General")->GetBool("FixColorAlphaOnLoad", true); +} diff --git a/src/Mod/TechDraw/App/Preferences.h b/src/Mod/TechDraw/App/Preferences.h index 7fe50c9bb5..6afcc7074d 100644 --- a/src/Mod/TechDraw/App/Preferences.h +++ b/src/Mod/TechDraw/App/Preferences.h @@ -169,6 +169,8 @@ public: static bool showCenterMarks(); static bool printCenterMarks(); + static bool fixColorAlphaOnLoad(); + }; From 0ae68113a3d2031a8b68075975456d8a198c4342 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Sun, 23 Nov 2025 18:04:39 -0500 Subject: [PATCH 2/3] [TD]convert transparency to alpha channel --- .../TechDraw/Gui/ViewProviderDrawingView.cpp | 74 ++++++++++++++++--- .../TechDraw/Gui/ViewProviderDrawingView.h | 7 ++ 2 files changed, 70 insertions(+), 11 deletions(-) diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp index 51906c2273..8cee4e87d2 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp @@ -25,7 +25,11 @@ #include #include +#include +#include #include +#include +#include #include #include #include @@ -75,7 +79,6 @@ ViewProviderDrawingView::~ViewProviderDrawingView() void ViewProviderDrawingView::attach(App::DocumentObject *pcFeat) { -// Base::Console().message("VPDV::attach(%s)\n", pcFeat->getNameInDocument()); ViewProviderDocumentObject::attach(pcFeat); //NOLINTBEGIN @@ -209,11 +212,8 @@ void ViewProviderDrawingView::startRestoring() void ViewProviderDrawingView::finishRestoring() { - if (Visibility.getValue()) { - show(); - } else { - hide(); - } + fixColorAlphaValues(); + Gui::ViewProviderDocumentObject::finishRestoring(); } @@ -290,10 +290,10 @@ Gui::MDIView *ViewProviderDrawingView::getMDIView() const void ViewProviderDrawingView::onGuiRepaint(const TechDraw::DrawView* dv) { -// Base::Console().message("VPDV::onGuiRepaint(%s) - this: %x\n", dv->getNameInDocument(), this); Gui::Document* guiDoc = Gui::Application::Instance->getDocument(getViewObject()->getDocument()); - if (!guiDoc) + if (!guiDoc) { return; + } std::vector pages = getViewObject()->findAllParentPages(); if (pages.size() > 1) { @@ -351,9 +351,7 @@ void ViewProviderDrawingView::onProgressMessage(const TechDraw::DrawView* dv, const std::string featureName, const std::string text) { -// Q_UNUSED(featureName) Q_UNUSED(dv) -// Q_UNUSED(text) showProgressMessage(featureName, text); } @@ -481,7 +479,6 @@ TechDraw::DrawView* ViewProviderDrawingView::getViewObject() const //! handled by the undo mechanism, but the QGraphicsScene parentage is not reset. void ViewProviderDrawingView::fixSceneDependencies() { - Base::Console().message("VPDV::fixSceneDependencies()\n"); auto page = getViewProviderPage(); if (!page) { return; @@ -526,3 +523,58 @@ std::vector ViewProviderDrawingView::claimChildren() const return temp; } + +//! convert old style transparency values in PropertyColor to new style alpha channel values +void ViewProviderDrawingView::fixColorAlphaValues() +{ + if (!Preferences::fixColorAlphaOnLoad() || + checkMiniumumDocumentVersion(1, 1)) { + return; + } + + // check every PropertyColor for transparency vs alpha + std::vector allProperties; + getPropertyList(allProperties); + + constexpr double alphaNone{0.0}; + constexpr double alphaFull{1.0}; + + for (auto& prop : allProperties) { + auto* colorProp = freecad_cast(prop); + if (colorProp) { + // Here we are assuming that transparent colors are not used/need not be converted. + // To invert more generally, colorOut.a = 1 - colorIn.a;, but we would need a different + // mechanism to determine when to do the conversion. + Base::Color colorTemp = colorProp->getValue(); + if (colorTemp.a == alphaNone) { + colorTemp.a = alphaFull; + colorProp->setValue(colorTemp); + } + } + } +} + + +//! true if document toBeChecked was written by a program with version >= minMajor.minMinor. +//! note that we can not check point releases as only the major and minor are recorded in the Document.xml +//! file. +//! (ex ) +bool ViewProviderDrawingView::checkMiniumumDocumentVersion(App::Document* toBeChecked, + int minMajor, + int minMinor) +{ + const char* docVersionText = toBeChecked->getProgramVersion(); + int docMajor{0}; + int docMinor{0}; + // stole this bit from App::AttachExtension. + // NOLINTNEXTLINE + if (sscanf(docVersionText, "%d.%d", &docMajor, &docMinor) != 2) { + Base::Console().warning("Failed to retrieve document version number for %s\n", + toBeChecked ? toBeChecked->getName() : "noname"); + return false; // ?? should we fail here? the file appears broken. + } + + return std::tie(docMajor, docMinor) >= std::tie(minMajor, minMinor); +} + + diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h index 195026c57d..247fa61018 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h @@ -28,11 +28,13 @@ #include +#include #include #include #include "ViewProviderDrawingViewExtension.h" + namespace TechDraw { class DrawView; } @@ -102,6 +104,11 @@ public: virtual void fixSceneDependencies(); std::vector claimChildren() const override; + void fixColorAlphaValues(); + bool checkMiniumumDocumentVersion(int minMajor, int minMinor) const + { return checkMiniumumDocumentVersion(this->getDocument()->getDocument(), minMajor, minMinor); } + static bool checkMiniumumDocumentVersion(App::Document* toBeChecked, int minMajor, int minMinor); + private: void multiParentPaint(std::vector& pages); From b28ec26e54afac076ebcc41bb2fda41d50ae1a2e Mon Sep 17 00:00:00 2001 From: wandererfan Date: Mon, 24 Nov 2025 22:48:15 -0500 Subject: [PATCH 3/3] [TD]guard against font size zero --- src/Mod/TechDraw/Gui/QGIViewDimension.cpp | 2 +- .../TechDraw/Gui/ViewProviderDimension.cpp | 38 +++++++++++++++++++ src/Mod/TechDraw/Gui/ViewProviderDimension.h | 3 ++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/Mod/TechDraw/Gui/QGIViewDimension.cpp b/src/Mod/TechDraw/Gui/QGIViewDimension.cpp index 89b01c4c1e..694b7d661b 100644 --- a/src/Mod/TechDraw/Gui/QGIViewDimension.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewDimension.cpp @@ -283,7 +283,7 @@ void QGIViewDimension::updateDim() QFont font = datumLabel->getFont(); font.setFamily(QString::fromUtf8(vp->Font.getValue())); - int fontSize = QGIView::exactFontSize(vp->Font.getValue(), vp->Fontsize.getValue()); + int fontSize = QGIView::exactFontSize(vp->Font.getValue(), std::max(1.0, vp->Fontsize.getValue())); font.setPixelSize(fontSize); datumLabel->setFont(font); diff --git a/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp b/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp index 98377ee8f5..85d01a6dd0 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp @@ -349,3 +349,41 @@ std::vector ViewProviderDimension::claimChildren() const } +void ViewProviderDimension::finishRestoring() +{ + fixTextSize(); + fixArrowSize(); + + ViewProviderDrawingView::finishRestoring(); +} + + +void ViewProviderDimension::fixTextSize() +{ + App::Document* ourDoc = getDocument()->getDocument(); + if (checkMiniumumDocumentVersion(ourDoc, 1, 1)) { + return; + } + + double size = Fontsize.getValue(); + if (size == 0.0) { + size = Preferences::dimFontSizeMM(); + Fontsize.setValue(size); + } +} + + +void ViewProviderDimension::fixArrowSize() +{ + App::Document* ourDoc = getDocument()->getDocument(); + if (checkMiniumumDocumentVersion(ourDoc, 1, 1)) { + return; + } + + double size = Arrowsize.getValue(); + if (size == 0.0) { + size = Preferences::dimFontSizeMM(); + Arrowsize.setValue(size); + } +} + diff --git a/src/Mod/TechDraw/Gui/ViewProviderDimension.h b/src/Mod/TechDraw/Gui/ViewProviderDimension.h index f5a6b6c38c..8ea232e243 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDimension.h +++ b/src/Mod/TechDraw/Gui/ViewProviderDimension.h @@ -78,6 +78,7 @@ public: bool setEdit(int ModNum) override; bool doubleClicked() override; bool onDelete(const std::vector & parms) override; + void finishRestoring() override; TechDraw::DrawViewDimension* getViewObject() const override; @@ -93,6 +94,8 @@ public: std::vector claimChildren() const override; + void fixTextSize(); + void fixArrowSize(); protected: void handleChangedPropertyType(Base::XMLReader &reader, const char *TypeName, App::Property * prop) override;