3 #include <QApplication> 
   11 #include <QMessageBox> 
   12 #include <QPushButton> 
   13 #include <QToolButton> 
   21 #include "Longitude.h" 
   22 #include "MainWindow.h" 
   23 #include "MdiCubeViewport.h" 
   24 #include "Projection.h" 
   25 #include "SurfacePoint.h" 
   28 #include "UniversalGroundMap.h" 
   29 #include "Workspace.h" 
   41     p_showDialogButton = NULL;
 
   42     p_linkViewportsButton = NULL;
 
   53     p_pointVisible = 
true;
 
   59     p_findPoint = 
new QAction(parent);
 
   60     p_findPoint->setShortcut(Qt::CTRL + Qt::Key_F);
 
   61     p_findPoint->setText(
"&Find Point");
 
   62     p_findPoint->setIcon( QPixmap(
toolIconDir() + 
"/find.png") );
 
   64       "<b>Function:</b> Centers all linked viewports to the selected lat/lon. \ 
   65       The user can click anywhere on the image to have that point centered, or \ 
   66       they can use the shortcut or button to bring up a window that they can \ 
   67       enter a specific lat/lon position into. \ 
   68       <p><b>Shortcut: </b> Ctrl+F </p> \ 
   69       <p><b>Hint: </b> This option will only work if the image has a camera \ 
   70             model or is projected, and will only center the point on images  \ 
   71             where the selected lat/lon position exists.</p>";
 
   72     p_findPoint->setWhatsThis(text);
 
   73     p_findPoint->setEnabled(
false); 
 
   74     connect( p_findPoint, SIGNAL( triggered() ),
 
   75              p_dialog, SLOT( show() ) ); 
 
   78   FindTool::~FindTool() {
 
   91     p_tabWidget = 
new QTabWidget(p_dialog);
 
   92     p_dialog->setWindowTitle(
"Find Latitude/Longitude Coordinate");
 
   96     p_tabWidget->addTab(p_imageTab, 
"Image");
 
   97     p_tabWidget->addTab(p_groundTab, 
"Ground");
 
  100     QPushButton *okButton = 
new QPushButton(
"Ok");
 
  101     connect( okButton, SIGNAL( clicked() ), 
 
  104     QPushButton *recordButton = 
new QPushButton(
"Record Point");
 
  105     connect( recordButton, SIGNAL( clicked() ), 
 
  108     QPushButton *closeButton = 
new QPushButton(
"Close");
 
  109     connect( closeButton, SIGNAL( clicked() ), 
 
  110              p_dialog, SLOT( hide() ) );
 
  113     QHBoxLayout *actionLayout = 
new QHBoxLayout();
 
  114     actionLayout->addWidget(okButton);
 
  115     actionLayout->addWidget(recordButton);
 
  116     actionLayout->addWidget(closeButton);
 
  118     QVBoxLayout *dialogLayout = 
new QVBoxLayout;
 
  119     dialogLayout->addWidget(p_tabWidget);
 
  120     dialogLayout->addLayout(actionLayout);
 
  121     p_dialog->setLayout(dialogLayout);
 
  133     p_latLineEdit->setValidator( 
new QDoubleValidator(-90.0, 90.0, 99, parent) );
 
  137     QLabel *latLabel = 
new QLabel(
"Latitude");
 
  138     QLabel *lonLabel = 
new QLabel(
"Longitude");
 
  141     QGridLayout *gridLayout = 
new QGridLayout();
 
  142     gridLayout->addWidget(latLabel, 0, 0);
 
  144     gridLayout->addWidget(lonLabel, 1, 0);
 
  146     setLayout(gridLayout);
 
  160     QLabel *sampleLabel = 
new QLabel(
"Sample");
 
  161     QLabel *lineLabel = 
new QLabel(
"Line");
 
  164     QGridLayout *gridLayout = 
new QGridLayout();
 
  165     gridLayout->addWidget(sampleLabel, 0, 0);
 
  167     gridLayout->addWidget(lineLabel, 1, 0);
 
  169     setLayout(gridLayout);
 
  182     action->setIcon( QPixmap(
toolIconDir() + 
"/find.png") );
 
  183     action->setToolTip(
"Find (F)");
 
  184     action->setShortcut(Qt::Key_F);
 
  186       "<b>Function:</b>  Find a lat/lon or line/sample coordinate in this cube. \ 
  187       <p><b>Shortcut:</b>F</p> ";
 
  188     action->setWhatsThis(text);
 
  199     menu->addAction(p_findPoint);
 
  213     p_showDialogButton = 
new QToolButton(hbox);
 
  214     p_showDialogButton->setIcon( QPixmap(
toolIconDir() + 
"/find.png") );
 
  215     p_showDialogButton->setToolTip(
"Find Point");
 
  217       "<b>Function:</b> Centers all linked viewports to the selected lat/lon. \ 
  218       The user can click anywhere on the image to have that point centered, or \ 
  219       they can use the shortcut or button to bring up a window that they can \ 
  220       enter a specific lat/lon position into. \ 
  221       <p><b>Shortcut: </b> Ctrl+F </p> \ 
  222       <p><b>Hint: </b> This option will only work if the image has a camera \ 
  223             model or is projected, and will only center the point on images  \ 
  224             where the selected lat/lon position exists.</p>";
 
  225     p_showDialogButton->setWhatsThis(text);
 
  226     connect( p_showDialogButton, SIGNAL( clicked() ), 
 
  227              p_dialog, SLOT( show() ) );
 
  228     p_showDialogButton->setAutoRaise(
true);
 
  229     p_showDialogButton->setIconSize( QSize(22, 22) );
 
  231     p_syncScale = 
new QCheckBox(
"Sync Scale");
 
  232     p_syncScale->setChecked(
true);
 
  233     p_syncScale->setToolTip(
"Synchronize Scale");
 
  234     text = 
"<b>Function:</b> Syncronizes the scale of all linked viewports.";
 
  235     p_syncScale->setWhatsThis(text);
 
  237     p_linkViewportsButton = 
new QToolButton(hbox);
 
  238     p_linkViewportsButton->setIcon( QPixmap(
toolIconDir() + 
"/link_valid.png") );
 
  239     p_linkViewportsButton->setToolTip(
"Link Georeferenced Images");
 
  240     p_linkViewportsButton->setWhatsThis(
"<b>Function: </b> Links all open images that have\ 
  241                               a camera model or are map projections");
 
  242     connect( p_linkViewportsButton, SIGNAL( clicked() ), 
 
  244     p_linkViewportsButton->setAutoRaise(
true);
 
  245     p_linkViewportsButton->setIconSize( QSize(22, 22) );
 
  247     p_togglePointVisibleButton = 
new QToolButton(hbox);
 
  248     p_togglePointVisibleButton->setIcon( QPixmap(
toolIconDir() + 
"/redDot.png") );
 
  249     p_togglePointVisibleButton->setToolTip(
"Hide red dot");
 
  250     p_togglePointVisibleButton->setCheckable(
true);
 
  251     p_togglePointVisibleButton->setChecked(
true);
 
  252     connect( p_togglePointVisibleButton, SIGNAL( clicked() ), 
 
  255     p_statusEdit = 
new QLineEdit();
 
  256     p_statusEdit->setReadOnly(
true);
 
  257     p_statusEdit->setToolTip(
"Cube Type");
 
  258     p_statusEdit->setWhatsThis(
"<b>Function: </b> Displays whether the active cube \ 
  259                            is a camera model, projection, both, or none. <p> \ 
  260                            <b>Hint: </b> If the cube is 'None' the find tool \ 
  261                            will not be active</p>");
 
  263     QHBoxLayout *layout = 
new QHBoxLayout(hbox);
 
  264     layout->setMargin(0);
 
  265     layout->addWidget(p_statusEdit);
 
  266     layout->addWidget(p_showDialogButton);
 
  267     layout->addWidget(p_linkViewportsButton);
 
  268     layout->addWidget(p_togglePointVisibleButton);
 
  269     layout->addWidget(p_syncScale);
 
  270     layout->addStretch(1);
 
  271     hbox->setLayout(layout);
 
  291     if (activeViewport == NULL) {
 
  292       p_linkViewportsButton->setEnabled(
false);
 
  293       p_findPoint->setEnabled(
false);
 
  294       p_showDialogButton->setEnabled(
false);
 
  295       p_syncScale->setEnabled(
false);
 
  296       p_statusEdit->setText(
"None");
 
  297       if ( p_dialog->isVisible() ) {
 
  302       p_findPoint->setEnabled(
true);
 
  303       p_showDialogButton->setEnabled(
true);
 
  304       p_statusEdit->setText(
"None");
 
  307         p_linkViewportsButton->setEnabled(
true);
 
  308         p_syncScale->setEnabled(
true);
 
  311         p_linkViewportsButton->setEnabled(
false);
 
  312         p_syncScale->setEnabled(
false);
 
  315       if (activeViewport->
camera() != NULL) {
 
  316         p_statusEdit->setText(
"Camera");
 
  318           p_statusEdit->setText(
"Both");
 
  321       else if (activeViewport->
projection() != NULL) {
 
  322         p_statusEdit->setText(
"Projection");
 
  330       if (p_samp != DBL_MAX && p_line != DBL_MAX) {
 
  331         if ( groundMap && groundMap->
SetImage(p_samp, p_line) ) {
 
  345       else if (p_lat != DBL_MAX && p_lon != DBL_MAX) {
 
  348           QString lineStr = QString::number( groundMap->
Line() );
 
  349           QString sampStr = QString::number( groundMap->
Sample() );
 
  358         p_groundTab->
p_latLineEdit->setText( QString::number(p_lat) );
 
  359         p_groundTab->
p_lonLineEdit->setText( QString::number(p_lon) );
 
  378     if (p_tabWidget->tabText( p_tabWidget->currentIndex() ) == 
"Ground") {
 
  381       if (p_lat > 90 || p_lat < -90) {
 
  382         QString mess = QString::number(p_lat) + 
" is an invalid latitude value. " 
  383                          + 
"Please enter a latitude between -90 and 90.";
 
  384         QMessageBox::warning((
QWidget *)parent(), 
"Warning", mess);
 
  389     else if (p_tabWidget->tabText( p_tabWidget->currentIndex() ) == 
"Image") {
 
  416     double line = p_line;
 
  417     double samp = p_samp;
 
  419     if (p_lat != DBL_MAX && p_lon != DBL_MAX) {
 
  425           line = groundMap->
Line();
 
  426           samp = groundMap->
Sample();
 
  431     if (line != DBL_MAX && samp != DBL_MAX) {
 
  461       if ( groundMap->
SetImage(samp, line) ) {
 
  492       double samp = p_samp;
 
  493       double line = p_line;
 
  497       if (p_lat != DBL_MAX && p_lon != DBL_MAX && groundMap) {
 
  499           samp = groundMap->
Sample();
 
  500           line = groundMap->
Line();
 
  504       if (samp != DBL_MAX && line != DBL_MAX) {
 
  512         pen.setStyle(Qt::SolidLine);
 
  513         painter->setPen(pen);
 
  514         painter->drawRoundRect(x - 2, y - 2, 4, 4);
 
  523     p_pointVisible = !p_pointVisible;
 
  526     if (p_pointVisible) {
 
  527       p_togglePointVisibleButton->setChecked(
true);
 
  528       p_togglePointVisibleButton->setToolTip(
"Hide red dot");
 
  531       p_togglePointVisibleButton->setChecked(
false);
 
  532       p_togglePointVisibleButton->setToolTip(
"Show red dot");
 
  557     bool syncScale = p_syncScale->isChecked();
 
  573       if ( viewport == activeViewport ||
 
  576         double otherViewportZoomFactor = viewport->
scale();
 
  578         if ( groundMap && !
IsSpecial(p_lat) && p_lat != DBL_MAX &&
 
  581           double samp = groundMap->
Sample();
 
  582           double line = groundMap->
Line();
 
  584           if ( viewportResolutionToMatch.
isValid() ) {
 
  587             otherViewportZoomFactor = activeViewport->
scale() *
 
  588                 (otherViewportResolution / viewportResolutionToMatch);
 
  591           if (p_lat != DBL_MAX && p_lon != DBL_MAX && groundMap) {
 
  592             viewport->
setScale(otherViewportZoomFactor, samp, line);
 
  596         if (p_line != DBL_MAX && p_samp != DBL_MAX) {
 
  597           viewport->
setScale(otherViewportZoomFactor, p_samp, p_line);
 
  621                                       double lat, 
double lon) {
 
  627            lat != DBL_MAX && lon != DBL_MAX &&
 
  631         double samp = groundMap->
Sample();
 
  632         double line = groundMap->
Line();
 
  634         if ( groundMap->
SetImage(samp - 0.5, line - 0.5) ) {
 
  638           if ( groundMap->
SetImage(samp + 0.5, line + 0.5) ) {
 
  667     return viewportResolution;
 
  678         vp->viewport()->repaint();