From 62209935a83364b779cda377b16ee485334cd246 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rnar=20Grip=20Fj=C3=A6r?= Date: Tue, 23 May 2017 09:35:17 +0200 Subject: [PATCH] #1498 Fishbones : Assign individual colors to fishbones --- ...NewFishbonesSubsAtMeasuredDepthFeature.cpp | 2 +- .../RicNewFishbonesSubsFeature.cpp | 2 +- .../RivFishbonesSubsPartMgr.cpp | 2 +- .../Fishbones/RimFishbonesCollection.cpp | 45 +++++++++++++++++++ .../Fishbones/RimFishbonesCollection.h | 6 +++ .../Fishbones/RimFishbonesMultipleSubs.cpp | 8 ++++ .../Fishbones/RimFishbonesMultipleSubs.h | 7 +++ 7 files changed, 69 insertions(+), 3 deletions(-) diff --git a/ApplicationCode/Commands/FishbonesCommands/RicNewFishbonesSubsAtMeasuredDepthFeature.cpp b/ApplicationCode/Commands/FishbonesCommands/RicNewFishbonesSubsAtMeasuredDepthFeature.cpp index f5813e7377..3d3e5685f4 100644 --- a/ApplicationCode/Commands/FishbonesCommands/RicNewFishbonesSubsAtMeasuredDepthFeature.cpp +++ b/ApplicationCode/Commands/FishbonesCommands/RicNewFishbonesSubsAtMeasuredDepthFeature.cpp @@ -47,7 +47,7 @@ void RicNewFishbonesSubsAtMeasuredDepthFeature::onActionTriggered(bool isChecked CVF_ASSERT(wellPath); RimFishbonesMultipleSubs* obj = new RimFishbonesMultipleSubs; - wellPath->fishbonesCollection()->fishbonesSubs.push_back(obj); + wellPath->fishbonesCollection()->appendFishbonesSubs(obj); obj->setName(QString("Fishbones Subs (%1)").arg(wellPath->fishbonesCollection()->fishbonesSubs.size())); int integerValue = wellPathSelItem->m_measuredDepth; diff --git a/ApplicationCode/Commands/FishbonesCommands/RicNewFishbonesSubsFeature.cpp b/ApplicationCode/Commands/FishbonesCommands/RicNewFishbonesSubsFeature.cpp index 2eb4748bec..7d071ecd63 100644 --- a/ApplicationCode/Commands/FishbonesCommands/RicNewFishbonesSubsFeature.cpp +++ b/ApplicationCode/Commands/FishbonesCommands/RicNewFishbonesSubsFeature.cpp @@ -46,7 +46,7 @@ void RicNewFishbonesSubsFeature::onActionTriggered(bool isChecked) RimFishbonesMultipleSubs* obj = new RimFishbonesMultipleSubs; obj->setName(QString("Fishbones Subs (%1)").arg(fishbonesCollection->fishbonesSubs.size())); - fishbonesCollection->fishbonesSubs.push_back(obj); + fishbonesCollection->appendFishbonesSubs(obj); RicNewFishbonesSubsFeature::askUserToSetUsefulScaling(fishbonesCollection); diff --git a/ApplicationCode/ModelVisualization/RivFishbonesSubsPartMgr.cpp b/ApplicationCode/ModelVisualization/RivFishbonesSubsPartMgr.cpp index 30a7ebab8f..446a3503c8 100644 --- a/ApplicationCode/ModelVisualization/RivFishbonesSubsPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivFishbonesSubsPartMgr.cpp @@ -101,7 +101,7 @@ void RivFishbonesSubsPartMgr::buildParts(caf::DisplayCoordTransform* displayCoor displayCoords.push_back(displayCoordTransform->transformToDisplayCoord(domainCoord)); } - geoGenerator.cylinderWithCenterLineParts(&m_parts, displayCoords, wellPath->wellPathColor(), wellPath->combinedScaleFactor() * characteristicCellSize * 0.5); + geoGenerator.cylinderWithCenterLineParts(&m_parts, displayCoords, m_rimFishbonesSubs->fishbonesColor(), wellPath->combinedScaleFactor() * characteristicCellSize * 0.5); } } diff --git a/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesCollection.cpp b/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesCollection.cpp index f1bf07844b..15f2063c48 100644 --- a/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesCollection.cpp @@ -25,6 +25,9 @@ #include "RimFishboneWellPathCollection.h" #include "RimFishbonesMultipleSubs.h" #include "RimProject.h" +#include "RimWellPath.h" + +#include CAF_PDM_SOURCE_INIT(RimFishbonesCollection, "FishbonesCollection"); @@ -68,3 +71,45 @@ void RimFishbonesCollection::fieldChangedByUi(const caf::PdmFieldHandle* changed proj->createDisplayModelAndRedrawAllViews(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimFishbonesCollection::appendFishbonesSubs(RimFishbonesMultipleSubs* subs) +{ + subs->fishbonesColor = nextFishbonesColor(); + fishbonesSubs.push_back(subs); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Color3f RimFishbonesCollection::nextFishbonesColor() const +{ + RimWellPath* wellPath; + firstAncestorOrThisOfType(wellPath); + cvf::Color3ub wellPathColor(wellPath->wellPathColor()); + QColor qWellPathColor = QColor(wellPathColor.r(), wellPathColor.g(), wellPathColor.b()); + + if (qWellPathColor.value() == 0) + { + // If the color is black, using `lighter` or `darker` will not have any effect, since they multiply `value` by a percentage. + // In this case, `value` is set specifically to make `lighter`/`darker` possible. + qWellPathColor.setHsl(qWellPathColor.hue(), qWellPathColor.saturation(), 25); + } + + QColor qFishbonesColor; + + int newIndex = static_cast(fishbonesSubs.size()); + + if (qWellPathColor.lightnessF() < 0.5) + { + qFishbonesColor = qWellPathColor.lighter(150 + 50 * newIndex); + } + else + { + qFishbonesColor = qWellPathColor.darker(150 + 50 * newIndex); + } + + return cvf::Color3f::fromByteColor(qFishbonesColor.red(), qFishbonesColor.green(), qFishbonesColor.blue()); +} + diff --git a/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesCollection.h b/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesCollection.h index 3ad0e84eee..a91fbd4fcc 100644 --- a/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesCollection.h +++ b/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesCollection.h @@ -22,6 +22,9 @@ #include "cafPdmChildArrayField.h" #include "cafPdmChildField.h" +#include "cafPdmFieldCvfColor.h" + +#include "cvfColor3.h" class RimFishbonesMultipleSubs; class RimFishboneWellPathCollection; @@ -39,6 +42,7 @@ public: RimFishbonesCollection(); RimFishboneWellPathCollection* wellPathCollection() const; + void appendFishbonesSubs(RimFishbonesMultipleSubs* subs); caf::PdmChildArrayField fishbonesSubs; @@ -46,5 +50,7 @@ protected: virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; private: + cvf::Color3f nextFishbonesColor() const; + caf::PdmChildField m_wellPathCollection; }; diff --git a/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesMultipleSubs.cpp b/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesMultipleSubs.cpp index e3743ba9c4..641a562c10 100644 --- a/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesMultipleSubs.cpp +++ b/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesMultipleSubs.cpp @@ -59,6 +59,8 @@ RimFishbonesMultipleSubs::RimFishbonesMultipleSubs() { CAF_PDM_InitObject("FishbonesMultipleSubs", ":/Default.png", "", ""); + CAF_PDM_InitField(&fishbonesColor, "FishbonesColor", cvf::Color3f(0.999f, 0.333f, 0.999f), "Fishbones Color", "", "", ""); + CAF_PDM_InitField(&m_lateralCountPerSub, "LateralCountPerSub", size_t(3), "Laterals Per Sub", "", "", ""); CAF_PDM_InitField(&m_lateralLength, "LateralLength", QString("12.0"), "Length(s) [m]", "", "Specify multiple length values if the sub lengths differ", ""); @@ -323,6 +325,12 @@ void RimFishbonesMultipleSubs::computeRangesAndLocations() //-------------------------------------------------------------------------------------------------- void RimFishbonesMultipleSubs::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) { + { + caf::PdmUiGroup* group = uiOrdering.addNewGroup("Appearance"); + + group->add(&fishbonesColor); + } + { caf::PdmUiGroup* group = uiOrdering.addNewGroup("Location"); diff --git a/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesMultipleSubs.h b/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesMultipleSubs.h index de8c8eff03..4e1c0f55f6 100644 --- a/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesMultipleSubs.h +++ b/ApplicationCode/ProjectDataModel/Fishbones/RimFishbonesMultipleSubs.h @@ -23,6 +23,10 @@ #include "cvfBase.h" #include "cvfVector3.h" +#include "cvfColor3.h" + +// Include to make Pdm work for cvf::Color +#include "cafPdmFieldCvfColor.h" #include #include @@ -76,6 +80,9 @@ public: // Override from Rim3dPropertiesInterface virtual cvf::BoundingBox boundingBoxInDomainCoords() override; +public: + caf::PdmField fishbonesColor; + protected: virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override;