From d01edd53a235e5118519235add6584453fd88a35 Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Tue, 28 Feb 2023 18:38:40 +0100 Subject: [PATCH] EditCoinManager: Refactor and extend layer support to use VisualLayerList property and ViewProviderSketchGeometryExtension --- src/Mod/Sketcher/Gui/EditModeCoinManager.cpp | 8 +++-- .../Gui/EditModeCoinManagerParameters.h | 35 +++++++++++-------- .../Gui/EditModeConstraintCoinManager.cpp | 6 ++-- .../Gui/EditModeGeometryCoinConverter.cpp | 19 +++++----- .../Gui/EditModeGeometryCoinManager.cpp | 26 ++++++++------ 5 files changed, 55 insertions(+), 39 deletions(-) diff --git a/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp b/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp index 377f072296..60c9917b24 100644 --- a/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp +++ b/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp @@ -493,7 +493,7 @@ EditModeCoinManager::PreselectionResult EditModeCoinManager::detectPreselection( SoPath *path = Point->getPath(); SoNode *tail = path->getTail(); // Tail is directly the node containing points and curves - for(int l = 0; l < geometryLayerParameters.CoinLayers; l++) { + for(int l = 0; l < geometryLayerParameters.getCoinLayerCount(); l++) { // checking for a hit in the points if (tail == editModeScenegraphNodes.PointSet[l]) { const SoDetail *point_detail = Point->getDetail(editModeScenegraphNodes.PointSet[l]); @@ -812,10 +812,12 @@ int EditModeCoinManager::getApplicationLogicalDPIX() const { void EditModeCoinManager::updateInventorNodeSizes() { - for(int l = 0; l < geometryLayerParameters.CoinLayers; l++) { + auto layersconfiguration = viewProvider.VisualLayerList.getValues(); + + for(int l = 0; l < geometryLayerParameters.getCoinLayerCount(); l++) { editModeScenegraphNodes.PointsDrawStyle[l]->pointSize = 8 * drawingParameters.pixelScalingFactor; editModeScenegraphNodes.PointSet[l]->markerIndex = Gui::Inventor::MarkerBitmaps::getMarkerIndex("CIRCLE_FILLED", drawingParameters.markerSize); - editModeScenegraphNodes.CurvesDrawStyle[l]->lineWidth = 3 * drawingParameters.pixelScalingFactor; + editModeScenegraphNodes.CurvesDrawStyle[l]->lineWidth = layersconfiguration[l].getLineWidth() * drawingParameters.pixelScalingFactor; } editModeScenegraphNodes.RootCrossDrawStyle->lineWidth = 2 * drawingParameters.pixelScalingFactor; diff --git a/src/Mod/Sketcher/Gui/EditModeCoinManagerParameters.h b/src/Mod/Sketcher/Gui/EditModeCoinManagerParameters.h index 9e4781a9d5..4820867c3e 100644 --- a/src/Mod/Sketcher/Gui/EditModeCoinManagerParameters.h +++ b/src/Mod/Sketcher/Gui/EditModeCoinManagerParameters.h @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include #include @@ -40,10 +40,12 @@ #include #include - + #include #include +#include "ViewProviderSketchGeometryExtension.h" + namespace Part { class Geometry; @@ -114,14 +116,14 @@ struct DrawingParameters { static SbColor NonDrivingConstrDimColor; // Color used for non-driving (reference) dimensional constraints static SbColor ExprBasedConstrDimColor; // Color used for expression based dimensional constraints static SbColor DeactivatedConstrDimColor; // Color used for deactivated dimensional constraints - static SbColor CursorTextColor; // Color used by the edit mode cursor + static SbColor CursorTextColor; // Color used by the edit mode cursor //@} /** @name Rendering sizes (also to support HDPI monitors) **/ //@{ double pixelScalingFactor = 1.0; // Scaling factor to be used for pixels int coinFontSize = 17; // Font size to be used by coin - int labelFontSize = 17; // Font size to be used by SoDatumLabel, which uses a QPainter and a QFont internally + int labelFontSize = 17; // Font size to be used by SoDatumLabel, which uses a QPainter and a QFont internally int constraintIconSize = 15; // Size of constraint icons int markerSize = 7; // Size used for markers //@} @@ -227,22 +229,26 @@ private: public: void reset() { CoinLayers = 1; - logicalLayer2CoinLayer.clear(); - logicalLayer2CoinLayer.push_back(Default); // Logical layer 1 always maps to CoinLayer 1 } - int getCoinLayer(int logicallayer) { - if(logicallayer < int(logicalLayer2CoinLayer.size())) - return logicalLayer2CoinLayer[logicallayer]; + inline int getSafeCoinLayer(int coinlayer) { + if(coinlayer < CoinLayers) { + return coinlayer; + } return Default; } - int CoinLayers = 1; // defaults to a single Coin Geometry Layer. + int inline getCoinLayerCount() const { + return CoinLayers; + } + + void setCoinLayerCount(int layernumber) { + CoinLayers = layernumber; + } private: - /// This maps a logicalLayer (the one of GeometryFacade) to a CoinLayer (the ones created in the scenegraph) - std::vector logicalLayer2CoinLayer; + int CoinLayers = 1; // defaults to a single Coin Geometry Layer. }; /** @brief Struct to hold the results of analysis performed on geometry @@ -330,8 +336,8 @@ struct EditModeScenegraphNodes { //@{ SoText2 *textX; SoTranslation *textPos; - SoFont *textFont; - SoMaterial *textMaterial; + SoFont *textFont; + SoMaterial *textMaterial; //@} /** @name Constraint nodes*/ @@ -404,7 +410,6 @@ struct CoinMapping { std::map GeoElementId2SetId; }; - } // namespace SketcherGui #endif // SKETCHERGUI_EditModeCoinManagerParameters_H diff --git a/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.cpp b/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.cpp index a56404a6a1..c365b2cede 100644 --- a/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.cpp +++ b/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.cpp @@ -1223,7 +1223,7 @@ void EditModeConstraintCoinManager::updateConstraintColor(const std::vector CurvNum; std::vector color; // curve color - for(int l=0; ldiffuseColor.getNum()); pcolor.push_back(editModeScenegraphNodes.PointsMaterials[l]->diffuseColor.startEditing()); CurvNum.push_back(editModeScenegraphNodes.CurvesMaterials[l]->diffuseColor.getNum()); @@ -1356,7 +1356,7 @@ void EditModeConstraintCoinManager::updateConstraintColor(const std::vectordiffuseColor.finishEditing(); editModeScenegraphNodes.CurvesMaterials[l]->diffuseColor.finishEditing(); } @@ -1440,7 +1440,7 @@ void EditModeConstraintCoinManager::rebuildConstraintNodes(const GeoListFacade & drawingParameters.ConstrDimColor :drawingParameters.NonDrivingConstrDimColor) :drawingParameters.DeactivatedConstrDimColor; - text->size.setValue(drawingParameters.labelFontSize); + text->size.setValue(drawingParameters.labelFontSize); text->lineWidth = 2 * drawingParameters.pixelScalingFactor; text->useAntialiasing = false; SoAnnotation *anno = new SoAnnotation(); diff --git a/src/Mod/Sketcher/Gui/EditModeGeometryCoinConverter.cpp b/src/Mod/Sketcher/Gui/EditModeGeometryCoinConverter.cpp index 4cf4fa6efb..42a894bdcf 100644 --- a/src/Mod/Sketcher/Gui/EditModeGeometryCoinConverter.cpp +++ b/src/Mod/Sketcher/Gui/EditModeGeometryCoinConverter.cpp @@ -28,6 +28,8 @@ #include "EditModeGeometryCoinConverter.h" #include "EditModeCoinManagerParameters.h" #include "ViewProviderSketchCoinAttorney.h" +#include "ViewProviderSketchGeometryExtension.h" +#include "Utils.h" using namespace SketcherGui; @@ -60,7 +62,7 @@ void EditModeGeometryCoinConverter::convert(const Sketcher::GeoListFacade & geol pointCounter.clear(); curveCounter.clear(); - for(int l=0; lgetGeometry()->getTypeId(); - auto layerId = geom->getGeometryLayerId(); - auto coinLayer = geometryLayerParameters.getCoinLayer(layerId); + auto layerId = getSafeGeomLayerId(geom); + + auto coinLayer = geometryLayerParameters.getSafeCoinLayer(layerId); if (type == Part::GeomPoint::getClassTypeId()) { // add a point convert< Part::GeomPoint, @@ -192,7 +195,7 @@ void EditModeGeometryCoinConverter::convert(const Sketcher::GeoListFacade & geol } } - for(int l=0 ; l < geometryLayerParameters.CoinLayers ; l++) { + for(auto l=0 ; l < geometryLayerParameters.getCoinLayerCount() ; l++) { // Coin Nodes Editing geometryLayerNodes.CurvesCoordinate[l]->point.setNum(Coords[l].size()); @@ -231,9 +234,9 @@ template < typename GeoType, EditModeGeometryCoinConverter::AnalyseMode analysemode > void EditModeGeometryCoinConverter::convert(const Sketcher::GeometryFacade * geometryfacade, [[maybe_unused]] int geoid) { auto geo = static_cast(geometryfacade->getGeometry()); - auto layerId = geometryfacade->getGeometryLayerId(); + auto layerId = getSafeGeomLayerId(geometryfacade); - auto coinLayer = geometryLayerParameters.getCoinLayer(layerId); + auto coinLayer = geometryLayerParameters.getSafeCoinLayer(layerId); auto addPoint = [&dMg = boundingBoxMaxMagnitude] (auto & pushvector, Base::Vector3d point) { diff --git a/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.cpp b/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.cpp index 071e493dc6..0c23360ec5 100644 --- a/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.cpp +++ b/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.cpp @@ -71,14 +71,20 @@ EditModeGeometryCoinManager::~EditModeGeometryCoinManager() void EditModeGeometryCoinManager::processGeometry(const GeoListFacade & geolistfacade) { // enable all layers - editModeScenegraphNodes.PointsGroup->enable.setNum(geometryLayerParameters.CoinLayers); - editModeScenegraphNodes.CurvesGroup->enable.setNum(geometryLayerParameters.CoinLayers); + editModeScenegraphNodes.PointsGroup->enable.setNum(geometryLayerParameters.getCoinLayerCount()); + editModeScenegraphNodes.CurvesGroup->enable.setNum(geometryLayerParameters.getCoinLayerCount()); SbBool *swsp = editModeScenegraphNodes.PointsGroup->enable.startEditing(); SbBool *swsc = editModeScenegraphNodes.CurvesGroup->enable.startEditing(); - for(int l=0; lenable.finishEditing(); @@ -152,7 +158,7 @@ void EditModeGeometryCoinManager::updateGeometryColor(const GeoListFacade & geol SbColor *crosscolor = editModeScenegraphNodes.RootCrossMaterials->diffuseColor.startEditing(); auto viewOrientationFactor = ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider); - for(int l=0; ldiffuseColor.getNum(); SbColor *pcolor = editModeScenegraphNodes.PointsMaterials[l]->diffuseColor.startEditing(); @@ -416,7 +422,7 @@ void EditModeGeometryCoinManager::updateGeometryLayersConfiguration() // 2) The number of layers is the same, but the configuration needs to be updated // TODO: Quite some room for improvement here: - geometryLayerParameters.CoinLayers = viewProvider.VisualLayerList.getSize(); + geometryLayerParameters.setCoinLayerCount(viewProvider.VisualLayerList.getSize()); emptyGeometryRootNodes(); createEditModePointInventorNodes(); @@ -433,7 +439,7 @@ void EditModeGeometryCoinManager::createEditModeInventorNodes() { createGeometryRootNodes(); - geometryLayerParameters.CoinLayers = viewProvider.VisualLayerList.getSize(); + geometryLayerParameters.setCoinLayerCount(viewProvider.VisualLayerList.getSize()); createEditModePointInventorNodes(); @@ -460,7 +466,7 @@ void EditModeGeometryCoinManager::emptyGeometryRootNodes() void EditModeGeometryCoinManager::createEditModePointInventorNodes() { - for(int i=0; i < geometryLayerParameters.CoinLayers; i++) { + for(int i=0; i < geometryLayerParameters.getCoinLayerCount(); i++) { SoSeparator * sep = new SoSeparator; sep->ref(); @@ -500,7 +506,7 @@ void EditModeGeometryCoinManager::createEditModeCurveInventorNodes() { auto layersconfigurations = viewProvider.VisualLayerList.getValue(); - for(int i=0; i < geometryLayerParameters.CoinLayers; i++) { + for(int i=0; i < geometryLayerParameters.getCoinLayerCount(); i++) { SoSeparator * sep = new SoSeparator; sep->ref();