mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#3996 Shift Measurement text box to not overlap with current segment
* Check if line is tending left or tending right and shift box if it is tending left.
This commit is contained in:
parent
f15d6dd385
commit
d70e94ca85
@ -44,6 +44,7 @@
|
||||
#include "cafFixedAtlasFont.h"
|
||||
|
||||
#include "cvfBoundingBox.h"
|
||||
#include "cvfCamera.h"
|
||||
#include "cvfDrawableGeo.h"
|
||||
#include "cvfDrawableText.h"
|
||||
#include "cvfModelBasicList.h"
|
||||
@ -69,7 +70,8 @@ RivMeasurementPartMgr::~RivMeasurementPartMgr() {}
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RivMeasurementPartMgr::appendGeometryPartsToModel(cvf::ModelBasicList* model,
|
||||
void RivMeasurementPartMgr::appendGeometryPartsToModel(const cvf::Camera* camera,
|
||||
cvf::ModelBasicList* model,
|
||||
const caf::DisplayCoordTransform* displayCoordTransform,
|
||||
const cvf::BoundingBox& boundingBox)
|
||||
{
|
||||
@ -84,7 +86,7 @@ void RivMeasurementPartMgr::appendGeometryPartsToModel(cvf::ModelBasicList*
|
||||
// Check bounding box
|
||||
if (!isPolylinesInBoundingBox(boundingBox)) return;
|
||||
|
||||
buildPolyLineParts(displayCoordTransform);
|
||||
buildPolyLineParts(camera, displayCoordTransform);
|
||||
|
||||
if (m_linePart.notNull())
|
||||
{
|
||||
@ -115,7 +117,8 @@ void RivMeasurementPartMgr::clearGeometryCache()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RivMeasurementPartMgr::buildPolyLineParts(const caf::DisplayCoordTransform* displayCoordTransform)
|
||||
void RivMeasurementPartMgr::buildPolyLineParts(const cvf::Camera* camera,
|
||||
const caf::DisplayCoordTransform* displayCoordTransform)
|
||||
{
|
||||
auto pointsInDisplay = displayCoordTransform->transformToDisplayCoords(m_measurement->pointsInDomainCoords());
|
||||
|
||||
@ -176,15 +179,21 @@ void RivMeasurementPartMgr::buildPolyLineParts(const caf::DisplayCoordTransform*
|
||||
// Text label
|
||||
if (pointsInDisplay.size() > 1)
|
||||
{
|
||||
auto fontSize = RiaFontCache::FONT_SIZE_8;
|
||||
bool negativeXDir = false;
|
||||
cvf::Vec3d lastV = pointsInDisplay[pointsInDisplay.size() - 1] - pointsInDisplay[pointsInDisplay.size() - 2];
|
||||
if (lastV.x() < 0.0)
|
||||
{
|
||||
negativeXDir = true;
|
||||
}
|
||||
|
||||
auto backgroundColor = RiaApplication::instance()->preferences()->defaultViewerBackgroundColor;
|
||||
auto fontColor = cvf::Color3f::BLACK;
|
||||
QString text = m_measurement->label();
|
||||
auto labelPosition = pointsInDisplay.back();
|
||||
auto font = RiaApplication::instance()->customFont();
|
||||
|
||||
auto font = RiaFontCache::getFont(fontSize);
|
||||
cvf::ref<cvf::DrawableText> drawableText = new cvf::DrawableText;
|
||||
drawableText->setFont(font.p());
|
||||
drawableText->setFont(font);
|
||||
drawableText->setCheckPosVisible(false);
|
||||
drawableText->setDrawBorder(true);
|
||||
drawableText->setDrawBackground(true);
|
||||
@ -195,6 +204,21 @@ void RivMeasurementPartMgr::buildPolyLineParts(const caf::DisplayCoordTransform*
|
||||
|
||||
cvf::String cvfString = cvfqt::Utils::toString(text);
|
||||
|
||||
cvf::Vec3d windowLabelPosition;
|
||||
camera->project(labelPosition, &windowLabelPosition);
|
||||
|
||||
cvf::BoundingBox oneCharBB = drawableText->textBoundingBox(cvf::String("A"), cvf::Vec3f(labelPosition));
|
||||
if (negativeXDir)
|
||||
{
|
||||
cvf::BoundingBox textBB = drawableText->textBoundingBox(cvfString, cvf::Vec3f(labelPosition));
|
||||
windowLabelPosition.x() -= textBB.extent().x() + oneCharBB.extent().x();
|
||||
}
|
||||
else
|
||||
{
|
||||
windowLabelPosition.x() += oneCharBB.extent().x();
|
||||
}
|
||||
camera->unproject(windowLabelPosition, &labelPosition);
|
||||
|
||||
cvf::Vec3f textCoord(labelPosition);
|
||||
drawableText->addText(cvfString, textCoord);
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
namespace cvf
|
||||
{
|
||||
class BoundingBox;
|
||||
class Camera;
|
||||
class Part;
|
||||
class ModelBasicList;
|
||||
class Transform;
|
||||
@ -50,14 +51,15 @@ public:
|
||||
RivMeasurementPartMgr(Rim3dView* view);
|
||||
~RivMeasurementPartMgr() override;
|
||||
|
||||
void appendGeometryPartsToModel(cvf::ModelBasicList* model,
|
||||
void appendGeometryPartsToModel(const cvf::Camera* camera,
|
||||
cvf::ModelBasicList* model,
|
||||
const caf::DisplayCoordTransform* displayCoordTransform,
|
||||
const cvf::BoundingBox& boundingBox);
|
||||
|
||||
void clearGeometryCache();
|
||||
|
||||
private:
|
||||
void buildPolyLineParts(const caf::DisplayCoordTransform* displayCoordTransform);
|
||||
void buildPolyLineParts(const cvf::Camera* camera, const caf::DisplayCoordTransform* displayCoordTransform);
|
||||
|
||||
bool isPolylinesInBoundingBox(const cvf::BoundingBox& boundingBox);
|
||||
|
||||
|
@ -758,7 +758,7 @@ void Rim3dView::addMeasurementToModel(cvf::ModelBasicList* wellPathModelBasicLis
|
||||
else
|
||||
{
|
||||
cvf::ref<caf::DisplayCoordTransform> transForm = displayCoordTransform();
|
||||
m_measurementPartManager->appendGeometryPartsToModel(
|
||||
m_measurementPartManager->appendGeometryPartsToModel(m_viewer->mainCamera(),
|
||||
wellPathModelBasicList, transForm.p(), ownerCase()->allCellsBoundingBox());
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user