- Replace QCheckBox::stateChanged with checkStateChanged in: - lts_dialog.cpp - simple_esri_layer.cpp (2 occurrences) - layer_control_widget.cpp - symbol_dialog.cpp - Replace LocationViewshed with ExploratoryLocationViewshed (ArcGIS SDK v300): - viewshed_analysis.h/.cpp - ViewshedLocation.h/.cpp - function_dialog.cpp (include) - Update ViewshedLocation member variable type to ExploratoryLocationViewshed Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
379 lines
11 KiB
C++
Executable File
379 lines
11 KiB
C++
Executable File
/**
|
|
* @RDE_HEADER@
|
|
* FunctionDialog
|
|
* $Id$
|
|
* $HeadURL$
|
|
* $Author$
|
|
*/
|
|
|
|
#include "simple_esri_layer.h"
|
|
|
|
#include <Map.h>
|
|
|
|
#include <MapImpl/map_impl.h>
|
|
#include <Map.h>
|
|
#include <MapGraphicsView.h>
|
|
#include <LayerListModel.h>
|
|
#include <ArcGISTiledLayer.h>
|
|
|
|
|
|
// for overview
|
|
#include <QDebug>
|
|
#include <QDialog>
|
|
#include <QLabel>
|
|
#include <QCheckBox>
|
|
#include <QPushButton>
|
|
#include <QSlider>
|
|
#include <QGridLayout>
|
|
#include <QStandardItemModel>
|
|
|
|
|
|
namespace SituationMap
|
|
{
|
|
|
|
Esri::ArcGISRuntime::Layer *getEsriBasemap_Layer(Esri::ArcGISRuntime::Map *map,
|
|
const QString &layername)
|
|
{
|
|
if (!(map &&
|
|
map->basemap() &&
|
|
map->basemap()->baseLayers())
|
|
)
|
|
return nullptr;
|
|
|
|
Esri::ArcGISRuntime::Layer *layerFound = nullptr;
|
|
|
|
const Esri::ArcGISRuntime::LayerListModel *model = map->basemap()->baseLayers();
|
|
for (int i = 0; i < model->size(); ++i)
|
|
{
|
|
const Esri::ArcGISRuntime::Layer *curLayer = model->at(i);
|
|
const QString &curName = curLayer->name();
|
|
if (QString::compare(layername, curName) == 0)
|
|
{
|
|
layerFound = model->at(i);
|
|
break;
|
|
}
|
|
} // for
|
|
return layerFound;
|
|
}
|
|
|
|
|
|
Esri::ArcGISRuntime::ArcGISTiledLayer *getEsriBasemap_ArcGISTiledLayer(Esri::ArcGISRuntime::Map *map,
|
|
const QString &layername)
|
|
{
|
|
Esri::ArcGISRuntime::Layer *layerFound = getEsriBasemap_Layer(map, layername);
|
|
if (! layerFound)
|
|
return nullptr;
|
|
|
|
if (layerFound->layerType() == Esri::ArcGISRuntime::LayerType::ArcGISTiledLayer)
|
|
{
|
|
Esri::ArcGISRuntime::ArcGISTiledLayer *layer2 =
|
|
static_cast<Esri::ArcGISRuntime::ArcGISTiledLayer *>(layerFound);
|
|
return layer2;
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
|
|
|
|
class SimpleEsriLayer::Private
|
|
{
|
|
|
|
public:
|
|
Private()
|
|
{
|
|
}
|
|
|
|
~Private()
|
|
{
|
|
}
|
|
|
|
// ESRI data:
|
|
Esri::ArcGISRuntime::Map *m_map = nullptr;
|
|
Esri::ArcGISRuntime::MapGraphicsView *m_mapView = nullptr;
|
|
|
|
// OWN data:
|
|
QGridLayout *m_layout = nullptr;
|
|
|
|
|
|
}; // class SimpleEsriLayer::Private
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
SimpleEsriLayer::SimpleEsriLayer(QWidget *parent, Esri::ArcGISRuntime::MapGraphicsView *mapView)
|
|
: QWidget(parent)
|
|
, d(new Private)
|
|
{
|
|
d->m_mapView = mapView;
|
|
if (d->m_mapView)
|
|
d->m_map = d->m_mapView->map();
|
|
|
|
d->m_layout = new QGridLayout(this);
|
|
|
|
updatePanel();
|
|
}
|
|
|
|
SimpleEsriLayer::~SimpleEsriLayer()
|
|
{
|
|
delete d;
|
|
}
|
|
|
|
bool SimpleEsriLayer::updatePanel()
|
|
{
|
|
|
|
for (int row = 0; row < d->m_layout->rowCount(); ++row)
|
|
{
|
|
for (int col = 0; col < d->m_layout->columnCount(); ++col)
|
|
{
|
|
QLayoutItem *item = d->m_layout->itemAtPosition(row, col);
|
|
if (item)
|
|
{
|
|
QWidget *w = item->widget();
|
|
delete w;
|
|
}
|
|
}
|
|
}
|
|
|
|
delete d->m_layout;
|
|
d->m_layout = new QGridLayout(this);
|
|
|
|
|
|
if (d->m_map)
|
|
{
|
|
// Header
|
|
int row = 0;
|
|
int col = 0;
|
|
for (const char *name : { "OnOff", "Opac", "Brightness", "Contrast", "Gamma" })
|
|
d->m_layout->addWidget(new QLabel(QString::fromLatin1(name)), row, col++);
|
|
|
|
|
|
row = d->m_layout->rowCount();
|
|
|
|
// GraphicalOverlay
|
|
Esri::ArcGISRuntime::GraphicsOverlayListModel *graphicsOverlayListModel = d->m_mapView->graphicsOverlays();
|
|
if (graphicsOverlayListModel)
|
|
{
|
|
int graphicsOverlaySize = graphicsOverlayListModel->size();
|
|
// qDebug() << LOGFUNCTION << " graphicsOverlayListModel -> size=" << graphicsOverlaySize;
|
|
|
|
row += graphicsOverlaySize;
|
|
|
|
for (int i = 0; i < graphicsOverlaySize; ++i)
|
|
{
|
|
--row;
|
|
col = 0;
|
|
// qDebug() << LOGFUNCTION << " graphicsOverlayListModel handle layer i='" << i;
|
|
|
|
Esri::ArcGISRuntime::GraphicsOverlay *gOverlay = graphicsOverlayListModel->at(i);
|
|
if (! gOverlay)
|
|
{
|
|
qWarning() << LOGFUNCTION << " gOverlay is nil";
|
|
return false;
|
|
}
|
|
|
|
const QString &layername = gOverlay->objectName();
|
|
|
|
QCheckBox *cbOnOff = new QCheckBox(layername);
|
|
cbOnOff->setChecked(gOverlay->isVisible());
|
|
|
|
connect(cbOnOff, &QCheckBox::checkStateChanged, this, &SimpleEsriLayer::layerOnOff);
|
|
d->m_layout->addWidget(cbOnOff, row, col++);
|
|
|
|
SimpleEsriLayerSlider *sl_opac = new SimpleEsriLayerSlider(layername, 0, 100);
|
|
sl_opac->setValue(gOverlay->opacity() * 100);
|
|
connect(sl_opac, &SimpleEsriLayerSlider::valueChanged, this, &SimpleEsriLayer::opacity);
|
|
d->m_layout->addWidget(sl_opac, row, col++);
|
|
|
|
} // for
|
|
} // if (graphicsOverlayListModel)
|
|
|
|
|
|
|
|
// BasemapLayer
|
|
row = d->m_layout->rowCount();
|
|
|
|
Esri::ArcGISRuntime::LayerListModel *baseLayerModel = d->m_map->basemap()->baseLayers();
|
|
if (baseLayerModel)
|
|
{
|
|
int baseLayerModelSize = baseLayerModel->size();
|
|
qWarning() << LOGFUNCTION << " baseLayerModel -> size=" << baseLayerModelSize;
|
|
|
|
row += baseLayerModelSize;
|
|
|
|
for (int i = 0; i < baseLayerModelSize; ++i)
|
|
{
|
|
col = 0;
|
|
--row;
|
|
qWarning() << LOGFUNCTION << " baseLayerModel handle layer i=" << i;
|
|
Esri::ArcGISRuntime::Layer *layer = baseLayerModel->at(i);
|
|
if (! layer)
|
|
{
|
|
qWarning() << LOGFUNCTION << " layer is nil";
|
|
return false;
|
|
}
|
|
|
|
const QString &layername = layer->name();
|
|
|
|
QCheckBox *cbOnOff = new QCheckBox(layername);
|
|
cbOnOff->setChecked(layer->isVisible());
|
|
|
|
// QString tooltip = layer->url();
|
|
// if (!l->serviceDescription().isEmpty())
|
|
// tooltip += QLatin1String(" ; ") % l->serviceDescription();
|
|
// if (!tooltip.isEmpty())
|
|
// cbOnOff->setToolTip(tooltip);
|
|
|
|
connect(cbOnOff, &QCheckBox::checkStateChanged, this, &SimpleEsriLayer::layerOnOff);
|
|
d->m_layout->addWidget(cbOnOff, row, col++);
|
|
|
|
SimpleEsriLayerSlider *sl_opac = new SimpleEsriLayerSlider(layername, 0, 100);
|
|
sl_opac->setValue(layer->opacity() * 100);
|
|
connect(sl_opac, &SimpleEsriLayerSlider::valueChanged, this, &SimpleEsriLayer::opacity);
|
|
d->m_layout->addWidget(sl_opac, row, col++);
|
|
|
|
|
|
if (layer->layerType() == Esri::ArcGISRuntime::LayerType::ArcGISTiledLayer
|
|
// || layer->type() == EsriRuntimeQt::LayerType::ArcGISTiledMapService
|
|
)
|
|
{
|
|
|
|
Esri::ArcGISRuntime::ArcGISTiledLayer *realLayer =
|
|
dynamic_cast<Esri::ArcGISRuntime::ArcGISTiledLayer *>(layer);
|
|
if (realLayer)
|
|
{
|
|
float brightness = realLayer->brightness();
|
|
float contrast = realLayer->contrast();
|
|
float gamma = realLayer->gamma();
|
|
|
|
qWarning() << " brightness=" << brightness; // QuartzBeta1 -> not supported
|
|
qWarning() << " contrast=" << contrast; // QuartzBeta1 -> not supported
|
|
qWarning() << " gamma=" << gamma; // QuartzBeta1 -> not supported
|
|
|
|
SimpleEsriLayerSlider *sl_brightness = new SimpleEsriLayerSlider(layername, -100, 100);
|
|
sl_brightness->setValue(brightness * 100);
|
|
connect(sl_brightness, &SimpleEsriLayerSlider::valueChanged, this, &SimpleEsriLayer::brightness);
|
|
d->m_layout->addWidget(sl_brightness, row, col++);
|
|
|
|
SimpleEsriLayerSlider *sl_contrast = new SimpleEsriLayerSlider(layername, -100, 100);
|
|
sl_contrast->setValue(contrast * 100);
|
|
connect(sl_contrast, &SimpleEsriLayerSlider::valueChanged, this, &SimpleEsriLayer::contrast);
|
|
d->m_layout->addWidget(sl_contrast, row, col++);
|
|
|
|
SimpleEsriLayerSlider *sl_gamma = new SimpleEsriLayerSlider(layername, -100, 100);
|
|
sl_gamma->setValue(gamma * 100);
|
|
connect(sl_gamma, &SimpleEsriLayerSlider::valueChanged, this, &SimpleEsriLayer::gamma);
|
|
d->m_layout->addWidget(sl_gamma, row, col++);
|
|
} // ir (realLayer)
|
|
|
|
} // if (layer->type() == Es
|
|
} // for
|
|
} // if (baseLayerModel)
|
|
|
|
|
|
QPushButton *pbMaximizeExtent = new QPushButton(QLatin1String("maximize scale of 1st basemap"));
|
|
d->m_layout->addWidget(pbMaximizeExtent, 9999, 0);
|
|
connect(pbMaximizeExtent, &QPushButton::clicked, this, [this]()
|
|
{
|
|
if (d->m_map)
|
|
{
|
|
d->m_map->setMinScale(500000000); // 5e+08
|
|
d->m_map->setMaxScale(100);
|
|
}
|
|
});
|
|
|
|
}
|
|
else
|
|
qWarning() << LOGFUNCTION << " no map !!! ";
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
void SimpleEsriLayer::layerOnOff()
|
|
{
|
|
QCheckBox *cb = qobject_cast<QCheckBox *>(sender());
|
|
if (!cb)
|
|
return;
|
|
|
|
QString layername = cb->text();
|
|
qDebug() << LOGFUNCTION << " layername=" << layername;
|
|
|
|
Esri::ArcGISRuntime::Layer *l = getEsriBasemap_Layer(d->m_map, layername);
|
|
if (l)
|
|
l->setVisible(cb->isChecked());
|
|
else
|
|
qDebug() << LOGFUNCTION << " no layer!!!, layername=" << layername;
|
|
}
|
|
|
|
void SimpleEsriLayer::opacity(int)
|
|
{
|
|
SimpleEsriLayerSlider *sl = qobject_cast<SimpleEsriLayerSlider *>(sender());
|
|
if (!sl)
|
|
return;
|
|
|
|
QString layername = sl->m_layername;
|
|
double value = sl->value() / 100.0;
|
|
|
|
Esri::ArcGISRuntime::Layer *l = getEsriBasemap_Layer(d->m_map, layername);
|
|
if (l)
|
|
{
|
|
qDebug() << LOGFUNCTION << " layername=" << layername << " set to val=" << value;
|
|
l->setOpacity(value);
|
|
}
|
|
else
|
|
qWarning() << LOGFUNCTION << " no layer!!!, layername=" << layername;
|
|
}
|
|
|
|
void SimpleEsriLayer::brightness(int)
|
|
{
|
|
SimpleEsriLayerSlider *sl = qobject_cast<SimpleEsriLayerSlider *>(sender());
|
|
if (!sl)
|
|
return;
|
|
|
|
QString layername = sl->m_layername;
|
|
Esri::ArcGISRuntime::ArcGISTiledLayer *l = getEsriBasemap_ArcGISTiledLayer(d->m_map, layername);
|
|
|
|
double value = sl->value() / 100.0;
|
|
// double value = sl->value();
|
|
|
|
qDebug() << LOGFUNCTION << " layername=" << layername << " set to val=" << value;
|
|
|
|
l->setBrightness(value);
|
|
}
|
|
|
|
void SimpleEsriLayer::contrast(int)
|
|
{
|
|
SimpleEsriLayerSlider *sl = qobject_cast<SimpleEsriLayerSlider *>(sender());
|
|
if (!sl)
|
|
return;
|
|
|
|
QString layername = sl->m_layername;
|
|
Esri::ArcGISRuntime::ArcGISTiledLayer *l = getEsriBasemap_ArcGISTiledLayer(d->m_map, layername);
|
|
|
|
double value = sl->value() / 100.0;
|
|
// double value = sl->value();
|
|
|
|
qDebug() << LOGFUNCTION << " layername=" << layername << " set to val=" << value;
|
|
|
|
l->setContrast(value);
|
|
}
|
|
|
|
void SimpleEsriLayer::gamma(int)
|
|
{
|
|
SimpleEsriLayerSlider *sl = qobject_cast<SimpleEsriLayerSlider *>(sender());
|
|
if (!sl)
|
|
return;
|
|
|
|
QString layername = sl->m_layername;
|
|
Esri::ArcGISRuntime::ArcGISTiledLayer *l = getEsriBasemap_ArcGISTiledLayer(d->m_map, layername);
|
|
|
|
double value = sl->value() / 100.0;
|
|
// double value = sl->value();
|
|
|
|
qDebug() << LOGFUNCTION << " layername=" << layername << " set to val=" << value;
|
|
|
|
l->setGamma(value);
|
|
}
|
|
|
|
} // namespace SituationMap
|