mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#3706 Annotations. Simple drilling reach circle
This commit is contained in:
parent
4dc5c66b03
commit
6286a8729b
@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
CAF_CMD_SOURCE_INIT(RicNewAnnotationFeature, "RicNewAnnotationFeature");
|
CAF_CMD_SOURCE_INIT(RicNewAnnotationFeature, "RicNewAnnotationFeature");
|
||||||
CAF_CMD_SOURCE_INIT(RicNewTextAnnotationFeature, "RicNewTextAnnotationFeature");
|
CAF_CMD_SOURCE_INIT(RicNewTextAnnotationFeature, "RicNewTextAnnotationFeature");
|
||||||
|
CAF_CMD_SOURCE_INIT(RicNewReachCircleAnnotationFeature, "RicNewReachCircleAnnotationFeature");
|
||||||
CAF_CMD_SOURCE_INIT(RicNewPolylineAnnotationFeature, "RicNewPolygonAnnotationFeature");
|
CAF_CMD_SOURCE_INIT(RicNewPolylineAnnotationFeature, "RicNewPolygonAnnotationFeature");
|
||||||
|
|
||||||
|
|
||||||
@ -99,6 +100,30 @@ void RicNewTextAnnotationFeature::setupActionLook(QAction* actionToSetup)
|
|||||||
actionToSetup->setText("New Text Annotation");
|
actionToSetup->setText("New Text Annotation");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RicNewReachCircleAnnotationFeature::onActionTriggered(bool isChecked)
|
||||||
|
{
|
||||||
|
auto coll = annotationCollection();
|
||||||
|
if (coll)
|
||||||
|
{
|
||||||
|
auto newAnnotation = new RimReachCircleAnnotation();
|
||||||
|
coll->addAnnotation(newAnnotation);
|
||||||
|
coll->updateConnectedEditors();
|
||||||
|
RiuMainWindow::instance()->selectAsCurrentItem(newAnnotation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RicNewReachCircleAnnotationFeature::setupActionLook(QAction* actionToSetup)
|
||||||
|
{
|
||||||
|
actionToSetup->setIcon(QIcon(":/Plus.png"));
|
||||||
|
actionToSetup->setText("New Reach Circle Annotation");
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
@ -57,6 +57,19 @@ protected:
|
|||||||
void setupActionLook(QAction* actionToSetup) override;
|
void setupActionLook(QAction* actionToSetup) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
///
|
||||||
|
//==================================================================================================
|
||||||
|
class RicNewReachCircleAnnotationFeature : public RicNewAnnotationFeature
|
||||||
|
{
|
||||||
|
CAF_CMD_HEADER_INIT;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// Overrides
|
||||||
|
void onActionTriggered(bool isChecked) override;
|
||||||
|
void setupActionLook(QAction* actionToSetup) override;
|
||||||
|
};
|
||||||
|
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
///
|
///
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
|
@ -109,10 +109,10 @@ void RivAnnotationsPartMgr::createAnnotationPartManagers()
|
|||||||
auto reachCircleAnnotations = proj->reachCircleAnnotations();
|
auto reachCircleAnnotations = proj->reachCircleAnnotations();
|
||||||
auto polylineAnnotations = proj->polylineAnnotations();
|
auto polylineAnnotations = proj->polylineAnnotations();
|
||||||
|
|
||||||
|
clearGeometryCache();
|
||||||
|
|
||||||
if (m_textAnnotationPartMgrs.size() != textAnnotations.size())
|
if (m_textAnnotationPartMgrs.size() != textAnnotations.size())
|
||||||
{
|
{
|
||||||
clearGeometryCache();
|
|
||||||
|
|
||||||
for (auto annotation : textAnnotations)
|
for (auto annotation : textAnnotations)
|
||||||
{
|
{
|
||||||
auto* apm = new RivTextAnnotationPartMgr(annotation);
|
auto* apm = new RivTextAnnotationPartMgr(annotation);
|
||||||
@ -122,8 +122,6 @@ void RivAnnotationsPartMgr::createAnnotationPartManagers()
|
|||||||
}
|
}
|
||||||
if (m_reachCircleAnnotationPartMgrs.size() != reachCircleAnnotations.size())
|
if (m_reachCircleAnnotationPartMgrs.size() != reachCircleAnnotations.size())
|
||||||
{
|
{
|
||||||
clearGeometryCache();
|
|
||||||
|
|
||||||
for (auto annotation : reachCircleAnnotations)
|
for (auto annotation : reachCircleAnnotations)
|
||||||
{
|
{
|
||||||
auto* apm = new RivReachCircleAnnotationPartMgr(annotation);
|
auto* apm = new RivReachCircleAnnotationPartMgr(annotation);
|
||||||
@ -133,8 +131,6 @@ void RivAnnotationsPartMgr::createAnnotationPartManagers()
|
|||||||
}
|
}
|
||||||
if (m_polylineAnnotationPartMgrs.size() != polylineAnnotations.size())
|
if (m_polylineAnnotationPartMgrs.size() != polylineAnnotations.size())
|
||||||
{
|
{
|
||||||
clearGeometryCache();
|
|
||||||
|
|
||||||
for (auto annotation : polylineAnnotations)
|
for (auto annotation : polylineAnnotations)
|
||||||
{
|
{
|
||||||
auto* apm = new RivPolylineAnnotationPartMgr(annotation);
|
auto* apm = new RivPolylineAnnotationPartMgr(annotation);
|
||||||
|
@ -22,42 +22,20 @@
|
|||||||
|
|
||||||
#include "RivReachCircleAnnotationPartMgr.h"
|
#include "RivReachCircleAnnotationPartMgr.h"
|
||||||
|
|
||||||
#include "RiaApplication.h"
|
|
||||||
|
|
||||||
#include "RigActiveCellInfo.h"
|
|
||||||
#include "RigCell.h"
|
|
||||||
#include "RigEclipseCaseData.h"
|
|
||||||
#include "RigMainGrid.h"
|
|
||||||
#include "RigSimWellData.h"
|
|
||||||
|
|
||||||
//#include "RimAnnotationInView.h"
|
|
||||||
#include "RimReachCircleAnnotation.h"
|
#include "RimReachCircleAnnotation.h"
|
||||||
#include "RimAnnotationInViewCollection.h"
|
|
||||||
#include "RimEclipseCase.h"
|
|
||||||
#include "RimEclipseView.h"
|
|
||||||
#include "RimSimWellInViewCollection.h"
|
|
||||||
#include "RimSimWellInView.h"
|
|
||||||
|
|
||||||
#include "RivPipeGeometryGenerator.h"
|
|
||||||
#include "RivPolylineGenerator.h"
|
#include "RivPolylineGenerator.h"
|
||||||
#include "RivPartPriority.h"
|
#include "RivPartPriority.h"
|
||||||
#include "RivReachCircleAnnotationSourceInfo.h"
|
#include "RivReachCircleAnnotationSourceInfo.h"
|
||||||
|
|
||||||
#include "cafEffectGenerator.h"
|
#include "cafEffectGenerator.h"
|
||||||
|
|
||||||
#include "cvfArrowGenerator.h"
|
|
||||||
#include "cvfDrawableGeo.h"
|
#include "cvfDrawableGeo.h"
|
||||||
#include "cvfDrawableText.h"
|
|
||||||
#include "cvfGeometryBuilderFaceList.h"
|
|
||||||
#include "cvfModelBasicList.h"
|
#include "cvfModelBasicList.h"
|
||||||
#include "cvfPart.h"
|
#include "cvfPart.h"
|
||||||
#include "cvfTransform.h"
|
|
||||||
#include "cvfqtUtils.h"
|
|
||||||
#include "cafDisplayCoordTransform.h"
|
#include "cafDisplayCoordTransform.h"
|
||||||
#include "RivSectionFlattner.h"
|
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
static RimSimWellInViewCollection* simWellInViewCollection() { return nullptr; }
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
@ -76,84 +54,64 @@ RivReachCircleAnnotationPartMgr::~RivReachCircleAnnotationPartMgr()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RivReachCircleAnnotationPartMgr::clearAllGeometry()
|
void RivReachCircleAnnotationPartMgr::buildParts(const caf::DisplayCoordTransform* displayXf, bool doFlatten, double xOffset)
|
||||||
{
|
{
|
||||||
m_part = nullptr;
|
clearAllGeometry();
|
||||||
|
|
||||||
|
cvf::ref<RivReachCircleAnnotationSourceInfo> sourceInfo = new RivReachCircleAnnotationSourceInfo(m_rimAnnotation);
|
||||||
|
|
||||||
|
Vec3d centerPosition = displayXf->transformToDisplayCoord(m_rimAnnotation->centerPoint());
|
||||||
|
double radius = m_rimAnnotation->radius();
|
||||||
|
|
||||||
|
// Circle part
|
||||||
|
{
|
||||||
|
int numPoints = 36;
|
||||||
|
std::vector<Vec3d> points;
|
||||||
|
for (int i = 0; i < numPoints; i++)
|
||||||
|
{
|
||||||
|
double rad = 2 * cvf::PI_D * (double)i / (double)numPoints;
|
||||||
|
Vec3d pt(centerPosition.x() + cos(rad) * radius, centerPosition.y() + sin(rad) * radius , centerPosition.z());
|
||||||
|
points.push_back(pt);
|
||||||
|
}
|
||||||
|
points.push_back(points.front());
|
||||||
|
|
||||||
|
cvf::ref<cvf::DrawableGeo> drawableGeo = RivPolylineGenerator::createLineAlongPolylineDrawable(points);
|
||||||
|
|
||||||
|
cvf::ref<cvf::Part> part = new cvf::Part;
|
||||||
|
part->setDrawable(drawableGeo.p());
|
||||||
|
|
||||||
|
caf::MeshEffectGenerator colorEffgen(cvf::Color3f::RED);
|
||||||
|
cvf::ref<cvf::Effect> eff = colorEffgen.generateUnCachedEffect();
|
||||||
|
|
||||||
|
part->setEffect(eff.p());
|
||||||
|
part->setPriority(RivPartPriority::PartType::MeshLines);
|
||||||
|
part->setSourceInfo(sourceInfo.p());
|
||||||
|
|
||||||
|
m_circlePart = part;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RivReachCircleAnnotationPartMgr::appendDynamicGeometryPartsToModel(cvf::ModelBasicList* model,
|
void RivReachCircleAnnotationPartMgr::clearAllGeometry()
|
||||||
const caf::DisplayCoordTransform * displayXf)
|
{
|
||||||
|
m_circlePart = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RivReachCircleAnnotationPartMgr::appendDynamicGeometryPartsToModel(cvf::ModelBasicList* model,
|
||||||
|
const caf::DisplayCoordTransform* displayXf)
|
||||||
{
|
{
|
||||||
if (m_rimAnnotation.isNull()) return;
|
if (m_rimAnnotation.isNull()) return;
|
||||||
if (!validateAnnotation(m_rimAnnotation)) return;
|
if (!validateAnnotation(m_rimAnnotation)) return;
|
||||||
|
|
||||||
}
|
buildParts(displayXf, false, 0.0);
|
||||||
|
model->addPart(m_circlePart.p());
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
void RivReachCircleAnnotationPartMgr::appendFlattenedDynamicGeometryPartsToModel(cvf::ModelBasicList* model,
|
|
||||||
size_t frameIndex,
|
|
||||||
const caf::DisplayCoordTransform * displayXf,
|
|
||||||
double xOffset)
|
|
||||||
{
|
|
||||||
///////////////////////////////////////////
|
|
||||||
caf::PdmPointer<RimSimWellInView> m_rimWell;
|
|
||||||
cvf::ref<cvf::Part> m_wellHeadPipeSurfacePart;
|
|
||||||
cvf::ref<cvf::Part> m_wellHeadPipeCenterPart;
|
|
||||||
cvf::ref<cvf::Part> m_wellHeadArrowPart;
|
|
||||||
cvf::ref<cvf::Part> m_wellHeadLabelPart;
|
|
||||||
///////////////////////////////////////////
|
|
||||||
|
|
||||||
if (m_rimWell.isNull()) return;
|
|
||||||
if (!viewWithSettings()) return;
|
|
||||||
|
|
||||||
if (!m_rimWell->isWellPipeVisible(frameIndex)) return;
|
|
||||||
|
|
||||||
//buildParts(displayXf, true, xOffset);
|
|
||||||
|
|
||||||
// Always add pipe part of well head
|
|
||||||
if (m_wellHeadPipeCenterPart.notNull()) model->addPart(m_wellHeadPipeCenterPart.p());
|
|
||||||
if (m_wellHeadPipeSurfacePart.notNull()) model->addPart(m_wellHeadPipeSurfacePart.p());
|
|
||||||
|
|
||||||
if (m_rimWell->showWellLabel() &&
|
|
||||||
m_wellHeadLabelPart.notNull())
|
|
||||||
{
|
|
||||||
model->addPart(m_wellHeadLabelPart.p());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_rimWell->showWellHead() &&
|
|
||||||
m_wellHeadArrowPart.notNull())
|
|
||||||
{
|
|
||||||
model->addPart(m_wellHeadArrowPart.p());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
Rim3dView* RivReachCircleAnnotationPartMgr::viewWithSettings()
|
|
||||||
{
|
|
||||||
Rim3dView* view = nullptr;
|
|
||||||
if (m_rimAnnotation) m_rimAnnotation->firstAncestorOrThisOfType(view);
|
|
||||||
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
RimAnnotationInViewCollection* RivReachCircleAnnotationPartMgr::annotatationInViewCollection()
|
|
||||||
{
|
|
||||||
RimAnnotationInViewCollection* coll = nullptr;
|
|
||||||
if (m_rimAnnotation) m_rimAnnotation->firstAncestorOrThisOfType(coll);
|
|
||||||
|
|
||||||
return coll;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -161,6 +119,5 @@ RimAnnotationInViewCollection* RivReachCircleAnnotationPartMgr::annotatationInVi
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
bool RivReachCircleAnnotationPartMgr::validateAnnotation(const RimReachCircleAnnotation* annotation) const
|
bool RivReachCircleAnnotationPartMgr::validateAnnotation(const RimReachCircleAnnotation* annotation) const
|
||||||
{
|
{
|
||||||
return false;
|
return m_rimAnnotation->centerPoint() != cvf::Vec3d::ZERO && m_rimAnnotation->radius() > 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,8 @@
|
|||||||
#include "cvfObject.h"
|
#include "cvfObject.h"
|
||||||
#include "cafPdmPointer.h"
|
#include "cafPdmPointer.h"
|
||||||
|
|
||||||
|
#include "cvfVector3.h"
|
||||||
|
|
||||||
namespace cvf
|
namespace cvf
|
||||||
{
|
{
|
||||||
class Part;
|
class Part;
|
||||||
@ -43,27 +45,20 @@ class RimSimWellInViewCollection;
|
|||||||
|
|
||||||
class RivReachCircleAnnotationPartMgr : public cvf::Object
|
class RivReachCircleAnnotationPartMgr : public cvf::Object
|
||||||
{
|
{
|
||||||
|
using Vec3d = cvf::Vec3d;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RivReachCircleAnnotationPartMgr( RimReachCircleAnnotation* annotation);
|
RivReachCircleAnnotationPartMgr( RimReachCircleAnnotation* annotation);
|
||||||
~RivReachCircleAnnotationPartMgr() override;
|
~RivReachCircleAnnotationPartMgr() override;
|
||||||
|
|
||||||
void appendDynamicGeometryPartsToModel(cvf::ModelBasicList* model,
|
void appendDynamicGeometryPartsToModel(cvf::ModelBasicList* model, const caf::DisplayCoordTransform* displayXf);
|
||||||
const caf::DisplayCoordTransform * displayXf);
|
|
||||||
|
|
||||||
void appendFlattenedDynamicGeometryPartsToModel(cvf::ModelBasicList* model,
|
|
||||||
size_t frameIndex,
|
|
||||||
const caf::DisplayCoordTransform * displayXf,
|
|
||||||
double xOffset);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void buildParts(const caf::DisplayCoordTransform* displayXf, bool doFlatten, double xOffset);
|
||||||
|
|
||||||
void clearAllGeometry();
|
void clearAllGeometry();
|
||||||
Rim3dView* viewWithSettings();
|
bool validateAnnotation(const RimReachCircleAnnotation* annotation) const;
|
||||||
RimAnnotationInViewCollection* annotatationInViewCollection();
|
|
||||||
bool validateAnnotation(const RimReachCircleAnnotation* annotation) const;
|
|
||||||
|
|
||||||
caf::PdmPointer<RimReachCircleAnnotation> m_rimAnnotation;
|
caf::PdmPointer<RimReachCircleAnnotation> m_rimAnnotation;
|
||||||
cvf::ref< cvf::Part > m_part;
|
cvf::ref<cvf::Part> m_circlePart;
|
||||||
};
|
};
|
||||||
|
@ -25,36 +25,20 @@
|
|||||||
#include "RiaApplication.h"
|
#include "RiaApplication.h"
|
||||||
#include "RiaPreferences.h"
|
#include "RiaPreferences.h"
|
||||||
|
|
||||||
#include "RigActiveCellInfo.h"
|
|
||||||
#include "RigCell.h"
|
|
||||||
#include "RigEclipseCaseData.h"
|
|
||||||
#include "RigMainGrid.h"
|
|
||||||
#include "RigSimWellData.h"
|
|
||||||
|
|
||||||
#include "RimTextAnnotation.h"
|
#include "RimTextAnnotation.h"
|
||||||
#include "RimAnnotationInViewCollection.h"
|
|
||||||
#include "RimEclipseCase.h"
|
|
||||||
#include "RimEclipseView.h"
|
|
||||||
#include "RimSimWellInViewCollection.h"
|
|
||||||
#include "RimSimWellInView.h"
|
|
||||||
|
|
||||||
#include "RivPipeGeometryGenerator.h"
|
|
||||||
#include "RivPolylineGenerator.h"
|
#include "RivPolylineGenerator.h"
|
||||||
#include "RivPartPriority.h"
|
#include "RivPartPriority.h"
|
||||||
#include "RivTextAnnotationSourceInfo.h"
|
#include "RivTextAnnotationSourceInfo.h"
|
||||||
|
|
||||||
#include "cafEffectGenerator.h"
|
#include "cafEffectGenerator.h"
|
||||||
|
|
||||||
#include "cvfArrowGenerator.h"
|
|
||||||
#include "cvfDrawableGeo.h"
|
#include "cvfDrawableGeo.h"
|
||||||
#include "cvfDrawableText.h"
|
#include "cvfDrawableText.h"
|
||||||
#include "cvfGeometryBuilderFaceList.h"
|
|
||||||
#include "cvfModelBasicList.h"
|
#include "cvfModelBasicList.h"
|
||||||
#include "cvfPart.h"
|
#include "cvfPart.h"
|
||||||
#include "cvfTransform.h"
|
|
||||||
#include "cvfqtUtils.h"
|
#include "cvfqtUtils.h"
|
||||||
#include "cafDisplayCoordTransform.h"
|
#include "cafDisplayCoordTransform.h"
|
||||||
#include "RivSectionFlattner.h"
|
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
@ -683,6 +683,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection()
|
|||||||
else if (dynamic_cast<RimAnnotationCollection*>(uiItem))
|
else if (dynamic_cast<RimAnnotationCollection*>(uiItem))
|
||||||
{
|
{
|
||||||
menuBuilder << "RicNewTextAnnotationFeature";
|
menuBuilder << "RicNewTextAnnotationFeature";
|
||||||
|
menuBuilder << "RicNewReachCircleAnnotationFeature";
|
||||||
menuBuilder << "RicNewPolygonAnnotationFeature";
|
menuBuilder << "RicNewPolygonAnnotationFeature";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,9 +76,9 @@ RimReachCircleAnnotation::RimReachCircleAnnotation()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RimReachCircleAnnotation::setRadius(double radius)
|
cvf::Vec3d RimReachCircleAnnotation::centerPoint() const
|
||||||
{
|
{
|
||||||
m_radius = radius;
|
return m_centerPoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
@ -54,7 +54,7 @@ class RimReachCircleAnnotation : public caf::PdmObject
|
|||||||
public:
|
public:
|
||||||
RimReachCircleAnnotation();
|
RimReachCircleAnnotation();
|
||||||
|
|
||||||
void setRadius(double radius);
|
Vec3d centerPoint() const;
|
||||||
double radius() const;
|
double radius() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
Loading…
Reference in New Issue
Block a user