1 #include "MosaicGridTool.h"
3 #include <QApplication>
6 #include <QDoubleValidator>
7 #include <QGraphicsScene>
12 #include <QMessageBox>
14 #include <QPushButton>
20 #include "GridGraphicsItem.h"
24 #include "MosaicGraphicsView.h"
25 #include "MosaicGridToolConfigDialog.h"
28 #include "MosaicSceneWidget.h"
142 if (getWidget()->getProjection()) {
161 if (getWidget()->getProjection()) {
304 Projection *proj = getWidget()->getProjection();
313 QRectF boundingRect = getWidget()->cubesBoundingRect();
315 double topLeft = 100;
316 double topRight = 100;
317 double bottomLeft = 100;
318 double bottomRight = 100;
319 bool cubeRectWorked =
true;
329 if (tproj->
SetCoordinate(boundingRect.topLeft().x(), -boundingRect.topLeft().y())) {
333 cubeRectWorked =
false;
335 if (tproj->
SetCoordinate(boundingRect.topRight().x(), -boundingRect.topRight().y())) {
339 cubeRectWorked =
false;
341 if (tproj->
SetCoordinate(boundingRect.bottomLeft().x(), -boundingRect.bottomLeft().y())) {
345 cubeRectWorked =
false;
348 -boundingRect.bottomRight().y())) {
352 cubeRectWorked =
false;
355 if (cubeRectWorked) {
357 std::min(bottomLeft, bottomRight)), mappingGroup,
359 m_maxLat =
Latitude(std::max(std::max(topLeft, topRight),
360 std::max(bottomLeft, bottomRight)), mappingGroup,
364 boundingRect.contains(QPointF(tproj->
XCoord(), -tproj->
YCoord()))) {
369 boundingRect.contains(QPointF(tproj->
XCoord(), -tproj->
YCoord()))) {
378 static Projection *lastProjWithThisError = NULL;
380 if (proj != lastProjWithThisError) {
381 lastProjWithThisError = proj;
382 QMessageBox::warning(NULL, tr(
"Latitude Extent Failure"),
383 tr(
"<p/>Could not extract latitude extents from the cubes.<br/>"
384 "<br/>The option <strong>\"Compute From Images\"</strong> "
385 "will default to using the <strong>Manual</strong> option "
386 "for latitude extents with a range of -90 to 90."));
428 Projection *proj = getWidget()->getProjection();
431 QRectF boundingRect = getWidget()->cubesBoundingRect();
435 double bottomLeft = 0;
436 double bottomRight = 0;
437 bool cubeRectWorked =
true;
447 if (tproj->
SetCoordinate(boundingRect.topLeft().x(), -boundingRect.topLeft().y())) {
451 cubeRectWorked =
false;
453 if (tproj->
SetCoordinate(boundingRect.topRight().x(), -boundingRect.topRight().y())) {
457 cubeRectWorked =
false;
459 if (tproj->
SetCoordinate(boundingRect.bottomLeft().x(), -boundingRect.bottomLeft().y())) {
463 cubeRectWorked =
false;
466 -boundingRect.bottomRight().y())) {
470 cubeRectWorked =
false;
473 if (cubeRectWorked) {
475 std::min(bottomLeft, bottomRight)),
477 m_maxLon =
Longitude(std::max(std::max(topLeft, topRight),
478 std::max(bottomLeft, bottomRight)),
483 if (m_maxLon > domainMaxLon()) {
484 m_maxLon = domainMaxLon();
490 m_maxLon = domainMaxLon();
495 m_maxLon = domainMaxLon();
498 static Projection *lastProjWithThisError = NULL;
500 if (proj != lastProjWithThisError) {
501 lastProjWithThisError = proj;
502 QMessageBox::warning(NULL, tr(
"Longitude Extent Failure"),
503 tr(
"<p/>Could not extract longitude extents from the cubes.<br/>"
504 "<br/>The option <strong>\"Compute From Images\"</strong> "
505 "will default to using the <strong>Manual</strong> option "
506 "for longitude extents with a range of 0 to 360."));
532 if (lonInc > lonRange)
556 Projection *proj = getWidget()->getProjection();
565 if (obj[
"BaseLatitude"][0] !=
"Null")
569 if (obj[
"BaseLongitude"][0] !=
"Null")
572 if (obj[
"LatitudeIncrement"][0] !=
"Null")
575 if (obj[
"LongitudeIncrement"][0] !=
"Null")
579 if (obj[
"LatitudeExtentType"][0] !=
"Null")
584 if (obj[
"MinimumLatitude"][0] !=
"Null")
590 if (obj[
"MaximumLatitude"][0] !=
"Null")
596 if (obj[
"LongitudeExtentType"][0] !=
"Null")
601 if (obj[
"MinimumLongitude"][0] !=
"Null")
606 if (obj[
"MaximumLongitude"][0] !=
"Null")
610 if (obj[
"Density"][0] !=
"Null")
615 if (obj[
"CheckTheBoxes"][0] !=
"Null") {
620 if(
toBool(obj[
"Visible"][0])) {
633 return "MosaicGridTool";
668 Longitude MosaicGridTool::domainMinLon() {
671 if (getWidget() && getWidget()->getProjection()) {
686 Longitude MosaicGridTool::domainMaxLon() {
689 if (getWidget() && getWidget()->getProjection()) {
691 TProjection *tproj = (TProjection *) getWidget()->getProjection();
692 if (tproj->Has360Domain()) {
713 FileName(QString(
"$HOME/.Isis/%1/mosaicSceneGridTool.config")
714 .arg(QApplication::applicationName())).expanded(),
715 QSettings::NativeFormat);
716 settings.setValue(
"autoGrid", draw);
718 Projection *proj = getWidget()->getProjection();
721 QRectF boundingRect = getWidget()->cubesBoundingRect();
723 if (!boundingRect.isNull()) {
730 if (tproj->
Mapping()[
"LatitudeType"][0] ==
"Planetographic") {
753 double latOffsetMultiplier = pow(10, qFloor(log10(latRange) - 1));
754 double lonOffsetMultiplier = pow(10, qFloor(log10(lonRange) - 1));
756 double idealLatInc = latRange / 10.0;
757 double idealLonInc = lonRange / 10.0;
759 double roundedLatInc = qRound(idealLatInc / latOffsetMultiplier) * latOffsetMultiplier ;
760 double roundedLonInc = qRound(idealLonInc / lonOffsetMultiplier) * lonOffsetMultiplier ;
777 if(m_gridItem != NULL) {
778 disconnect(getWidget(), SIGNAL(projectionChanged(
Projection *)),
781 getWidget()->getScene()->removeItem(m_gridItem);
795 qobject_cast<QWidget *>(parent()));
796 configDialog->setAttribute(Qt::WA_DeleteOnClose);
797 configDialog->show();
807 if(m_gridItem != NULL) {
817 if (!getWidget()->getProjection()) {
818 QString msg =
"Please set the mosaic scene's projection before trying to "
819 "draw a grid. This means either open a cube (a projection "
820 "will be calculated) or set the projection explicitly";
821 QMessageBox::warning(NULL, tr(
"Grid Tool Requires Projection"), msg);
829 connect(getWidget(), SIGNAL(projectionChanged(
Projection *)),
830 this, SLOT(
drawGrid()), Qt::UniqueConnection);
832 connect(getWidget(), SIGNAL(cubesChanged()),
835 if (m_gridItem != NULL)
836 getWidget()->getScene()->addItem(m_gridItem);
868 emit boundingRectChanged();
872 getWidget()->getView()->update();
873 QApplication::processEvents();
887 FileName(QString(
"$HOME/.Isis/%1/mosaicSceneGridTool.config")
888 .arg(QApplication::applicationName())).expanded(),
889 QSettings::NativeFormat);
891 bool drawAuto = settings.value(
"autoGrid",
true).toBool();
931 m_action->setIcon(
getIcon(
"grid.png"));
932 m_action->setToolTip(
"Grid (g)");
933 m_action->setShortcut(Qt::Key_G);
935 "<b>Function:</b> Superimpose a map grid over the area of displayed "
936 "footprints in the 'mosaic scene.'<br><br>"
937 "This tool allows you to overlay a ground grid onto the mosaic scene. "
938 "The inputs are standard ground grid parameters and a grid density."
939 "<p><b>Shortcut:</b> g</p> ";
940 m_action->setWhatsThis(text);
954 QHBoxLayout *actionLayout =
new QHBoxLayout();
956 QString autoGridWhatsThis =
957 "Draws a grid based on the current lat/lon extents (from the cubes, map, or user).";
967 QPushButton *optionsButton =
new QPushButton(
"Grid Options");
968 optionsButton->setWhatsThis(
"Opens a dialog box that has the options to change the base"
969 " latitude, base longitude, latitude increment, longitude"
970 " increment, and grid density.");
971 connect(optionsButton, SIGNAL(clicked()),
this, SLOT(
configure()));
972 actionLayout->addWidget(optionsButton);
974 QString drawGridWhatsThis =
975 "Draws a grid based on the current lat/lon extents (from the cubes, map, or user).";
976 QLabel *drawGridLabel =
new QLabel(
"Show Grid");
977 drawGridLabel->setWhatsThis(drawGridWhatsThis);
981 actionLayout->addWidget(drawGridLabel);
984 connect(
this, SIGNAL(activated(
bool)),
this, SLOT(
onToolOpen(
bool)));
986 actionLayout->addStretch(1);
987 actionLayout->setMargin(0);
990 toolBarWidget->setLayout(actionLayout);
992 return toolBarWidget;