1 #include "MosaicSceneItem.h" 6 #include <QApplication> 9 #include <QGraphicsItem> 10 #include <QGraphicsSceneContextMenuEvent> 15 #include <QStyleOptionGraphicsItem> 16 #include <QTreeWidgetItem> 19 #include "DisplayProperties.h" 20 #include "FileDialog.h" 23 #include "ImageList.h" 27 #include "MosaicGraphicsView.h" 28 #include "MosaicSceneWidget.h" 48 if (parent->getProjection() == NULL) {
49 std::string msg =
"Parent does not have projection in MosaicWidget";
55 connect(m_image, SIGNAL(destroyed(
QObject *)),
56 this, SLOT(lostCubeDisplay()));
57 connect(m_image, SIGNAL(destroyed(
QObject *)),
58 this, SLOT(deleteLater()));
62 m_cubeDnStretch = NULL;
64 m_showingLabel =
false;
65 m_ignoreCubeDisplayChanged =
false;
75 setAcceptHoverEvents(
true);
87 if(parent->userHasTools()) {
105 scene()->removeItem(
this);
107 while(m_polygons->size()) {
108 delete m_polygons->takeAt(0);
113 QRectF MosaicSceneItem::boundingRect()
const {
116 QGraphicsPolygonItem *polygon;
117 foreach(polygon, *m_polygons) {
118 boundingRect = boundingRect.united(polygon->boundingRect());
121 foreach(polyChild, polygon->childItems()) {
122 if(polyChild->isVisible()) {
123 boundingRect = boundingRect.united(
124 mapFromItem(polyChild, polyChild->boundingRect()).boundingRect());
141 const QStyleOptionGraphicsItem *option,
QWidget *widget) {
149 if (!childItems().count()) {
150 foreach (QGraphicsPolygonItem *polyItem, *m_polygons) {
151 polyItem->paint(painter, option, widget);
160 void MosaicSceneItem::setupFootprint() {
166 tr(
"Cannot display footprints of images which have no footprints. " 174 catch(IException &e) {
175 m_image->deleteLater();
177 IString msg =
"Could not project the footprint from cube [" +
190 prepareGeometryChange();
196 while(m_polygons->size()) {
197 QGraphicsPolygonItem *polyItem = m_polygons->at(0);
199 if (polyItem->scene()) {
200 polyItem->scene()->removeItem(polyItem);
202 m_polygons->removeAll(polyItem);
224 bool useFullChildrenHierarchy = (mp->getNumGeometries() > 1) || m_showingLabel;
226 for (
unsigned int i = 0; i < mp->getNumGeometries(); i++) {
227 const Geometry *geom = mp->getGeometryN(i);
228 CoordinateSequence *pts;
230 pts = geom->getCoordinates();
238 for (
unsigned int j = 0; j < pts->getSize(); j++) {
242 double x = proj->
XCoord();
243 double y = -1 * (proj->
YCoord());
245 polyPoints.push_back(QPointF(x, y));
249 setFlag(QGraphicsItem::ItemIsSelectable,
true);
250 setFlag(QGraphicsItem::ItemIsFocusable,
true);
252 QGraphicsPolygonItem *polyItem = NULL;
254 if (useFullChildrenHierarchy) {
255 polyItem =
new QGraphicsPolygonItem(
this);
258 polyItem =
new QGraphicsPolygonItem;
261 polyItem->setPolygon(QPolygonF(polyPoints));
263 if (m_showingLabel) {
264 QGraphicsSimpleTextItem *label = NULL;
266 label =
new QGraphicsSimpleTextItem(polyItem);
270 label->setFlag(QGraphicsItem::ItemIsMovable);
271 label->setFont(QFont(
"Helvetica", 10));
272 label->setPos(polyItem->polygon().boundingRect().center());
273 label->setFlag(QGraphicsItem::ItemIgnoresTransformations,
true);
275 QRectF boundingRect = polyItem->boundingRect();
276 if(boundingRect.width() < boundingRect.height())
277 label->setRotation(90.0);
280 m_polygons->append(polyItem);
299 double pixelValue = 0;
306 pixelValue = gryBrick[0];
307 if (pixelValue ==
Null) {
310 if (pixelValue < 0) pixelValue = 0;
311 if (pixelValue > 255) pixelValue = 255;
324 const QStyleOptionGraphicsItem *option) {
326 QApplication::setOverrideCursor(Qt::WaitCursor);
329 QGraphicsPolygonItem *polygon;
330 foreach(polygon, *m_polygons) {
331 QPolygonF polyBounding = polygon->polygon();
332 QRectF sceneRect = polyBounding.boundingRect();
333 QPolygon screenPoly = m_scene->getView()->mapFromScene(sceneRect);
334 QRect visibleBox = screenPoly.boundingRect();
336 int bbWidth = (int)visibleBox.width();
337 int bbHeight = (int)visibleBox.height();
339 int bbLeft = visibleBox.left();
340 int bbTop = visibleBox.top();
341 int bbRight = visibleBox.right();
342 int bbBottom = visibleBox.bottom();
344 QImage image(bbWidth, bbHeight, QImage::Format_ARGB32);
346 for (
int y = bbTop; y <= bbBottom; y++) {
347 QRgb *lineData = (QRgb *)image.scanLine(y - bbTop);
349 for (
int x = bbLeft; x <= bbRight; x++) {
350 lineData[x - bbLeft] = qRgba(0, 0, 0, 0);
354 QPointF scenePos = m_scene->getView()->mapToScene(
357 if(polygon->polygon().containsPoint(scenePos, Qt::OddEvenFill)) {
360 m_scene->getProjection()->SetCoordinate(scenePos.x(),
363 double lat = ((
TProjection *)(m_scene->getProjection()))->UniversalLatitude();
364 double lon = ((
TProjection *)(m_scene->getProjection()))->UniversalLongitude();
390 int stretched = (int)stretch->
Map(dn);
392 lineData[x - bbLeft] = qRgba(stretched, stretched,
402 painter->drawImage(polygon->boundingRect(), image);
409 QApplication::restoreOverrideCursor();
413 QColor MosaicSceneItem::color()
const {
424 if (!m_ignoreCubeDisplayChanged) {
425 bool wasBlocking = m_scene->blockSelectionChange(
true);
427 m_scene->blockSelectionChange(wasBlocking);
429 if (m_showingLabel !=
455 switch (event->type()) {
456 case QEvent::GraphicsSceneContextMenu:
457 scenePos = ((QGraphicsSceneContextMenuEvent *)event)->scenePos();
459 case QEvent::GraphicsSceneHoverEnter:
460 case QEvent::GraphicsSceneHoverMove:
461 case QEvent::GraphicsSceneHoverLeave:
462 scenePos = ((QGraphicsSceneHoverEvent *)event)->scenePos();
464 case QEvent::GraphicsSceneMouseMove:
465 case QEvent::GraphicsSceneMousePress:
466 case QEvent::GraphicsSceneMouseRelease:
467 case QEvent::GraphicsSceneMouseDoubleClick:
468 scenePos = ((QGraphicsSceneMouseEvent *)event)->scenePos();
474 bool ourEvent =
true;
475 if(!scenePos.isNull()) {
480 return QGraphicsObject::sceneEvent(event);
498 QGraphicsPolygonItem * polygon;
499 foreach(polygon, *m_polygons) {
500 if(polygon->contains(p)) {
517 QGraphicsPolygonItem * polygon;
519 m_ignoreCubeDisplayChanged =
true;
525 selected = isSelected();
528 foreach(polygon, *m_polygons) {
529 selected = selected || (polygon->scene() && polygon->isSelected());
535 if(selected != isSelected()) {
536 bool wasBlocking = m_scene->blockSelectionChange(
true);
537 setSelected(selected);
538 m_scene->blockSelectionChange(wasBlocking);
541 foreach(polygon, *m_polygons) {
542 if(polygon->isSelected() != selected) {
543 polygon->setSelected(selected);
547 m_ignoreCubeDisplayChanged =
false;
557 QGraphicsSceneContextMenuEvent *event) {
563 title->setEnabled(
false);
569 Directory *directory = m_scene->directory();
575 displayActs.append(NULL);
580 foreach(displayAct, displayActs) {
581 if (displayAct == NULL) {
585 menu.addAction(displayAct);
590 QAction *removeAction = menu.addAction(
"Close Cube");
592 if (QApplication::applicationName() ==
"qmos") {
593 connect(removeAction, SIGNAL(triggered()),
594 m_image, SLOT(deleteLater()));
597 connect(removeAction, SIGNAL(triggered()), SLOT(
onCloseCube()));
600 menu.exec(event->screenPos());
606 void MosaicSceneItem::lostCubeDisplay() {
615 emit mosaicCubeClosed(m_image);
625 if (childItems().count()) {
626 setFlag(QGraphicsItem::ItemIsSelectable,
false);
629 setFlag(QGraphicsItem::ItemIsSelectable, m_scene->cubesSelectable());
635 foreach(QAbstractGraphicsShapeItem *polygon, *m_polygons) {
638 polygon->setBrush(color());
641 polygon->setBrush(Qt::NoBrush);
645 QColor opaqueColor(color());
646 opaqueColor.setAlpha(255);
649 QPen pen(opaqueColor);
650 pen.setCosmetic(
true);
651 polygon->setPen(pen);
654 polygon->setPen(Qt::NoPen);
657 polygon->setFlag(QGraphicsItem::ItemIsSelectable,
658 m_scene->cubesSelectable());
662 polyChild->setVisible(
665 polyChild->setFlag(QGraphicsItem::ItemIsSelectable,
666 m_scene->cubesSelectable());
670 if(polyChild->type() == 9) {
671 QGraphicsSimpleTextItem * text =
672 (QGraphicsSimpleTextItem *)polyChild;
673 text->setBrush(opaqueColor);
679 emit changed(regionsChanged);
692 if (m_cubeDnStretch != NULL || !m_image)
return m_cubeDnStretch;
703 stats.
AddData(mgr.DoubleBuffer(), mgr.size());
705 for(
int i = 0; i < skip; i++)
709 m_cubeDnStretch =
new Stretch();
714 m_cubeDnStretch->
SetLis(0.0);
715 m_cubeDnStretch->
SetLrs(0.0);
716 m_cubeDnStretch->
SetHis(255.0);
717 m_cubeDnStretch->
SetHrs(255.0);
718 m_cubeDnStretch->SetMinimum(0.0);
719 m_cubeDnStretch->SetMaximum(255.0);
721 return m_cubeDnStretch;
True if the cube should show a fill area if possible (bool)
Internalizes a list of images and allows for operations on the entire list.
const double Null
Value for an Isis Null pixel.
void updateSelection(bool)
Update the selected state.
void reproject()
Called anytime the user reprojects the cube.
The main project for ipce.
geos::geom::MultiPolygon * m_180mp
This item's multipolygon in the -180/180 longitude domain.
QList< QAction * > supportedActions(DataType data)
Returns a list of supported actions for a WorkOrder.
geos::geom::MultiPolygon * m_mp
This item's multipolygon in the 0/360 longitude domain.
double Map(const double value) const
Maps an input value to an output value based on the stretch pairs and/or special pixel mappings...
Base class for Map TProjections.
double BestMaximum(const double percent=99.5) const
This method returns the better of the absolute maximum or the Chebyshev maximum.
void drawImage(QPainter *painter, const QStyleOptionGraphicsItem *option)
This method reads in and draws the image associated with this item.
void SetLis(const double value)
Sets the mapping for LIS pixels.
bool InCube()
This returns true if the current Sample() or Line() value is outside of the cube (meaning the point m...
Buffer for containing a three dimensional section of an image.
QVariant getValue(int property) const
Get a property's associated data.
void SetBasePosition(const int start_sample, const int start_line, const int start_band)
This method is used to set the base position of the shape buffer.
QString displayName() const
Returns the display name.
True if the cube should be outlined (bool)
double XCoord() const
This returns the projection X provided SetGround, SetCoordinate, SetUniversalGround, or SetWorld returned with success.
void setSelected(bool)
Change the selected state associated with this cube.
True if the cube should show DN values if possible (bool)
bool begin()
Moves the shape buffer to the first position.
True if the cube should show its display name (bool)
Buffer manager, for moving through a cube in lines.
double WorldX() const
This returns the world X coordinate provided SetGround, SetCoordinate, SetUniversalGround, or SetWorld returned with success.
This class is used to accumulate statistics on double arrays.
QList< QAction * > supportedActions(Project *project=NULL)
Gets a list of pre-connected actions that have to do with display.
void AddPair(const double input, const double output)
Adds a stretch pair to the list of pairs.
virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
The user right clicked on us (or otherwise requested a context menu).
double BestMinimum(const double percent=99.5) const
This method returns the better of the absolute minimum or the Chebyshev minimum.
This is the GUI communication mechanism for cubes.
void SetHrs(const double value)
Sets the mapping for HRS pixels.
bool Has180Domain() const
This indicates if the longitude domain is -180 to 180 (as opposed to 0 to 360).
void SetLrs(const double value)
Sets the mapping for LRS pixels.
#define _FILEINFO_
Macro for the filename and line number.
void SetHis(const double value)
Sets the mapping for HIS pixels.
double Sample()
Returns the current sample number.
A type of error that could only have occurred due to a mistake on the user's part (e...
virtual bool SetGround(const double lat, const double lon)
This method is used to set the latitude/longitude (assumed to be of the correct LatitudeType, LongitudeDirection, and LongitudeDomain.
A type of error that cannot be classified as any of the other error types.
Isis::Projection * Projection() const
Return the projection associated with the ground map (NULL implies none)
double YCoord() const
This returns the projection Y provided SetGround, SetCoordinate, SetUniversalGround, or SetWorld returned with success.
void read(Blob &blob) const
This method will read data from the specified Blob object.
bool IsSpecial(const double d)
Returns if the input pixel is special.
This represents a cube in a project-based GUI interface.
void onCloseCube()
Emits a signal when Close Cube is selected from the context menu.
ImageDisplayProperties * displayProperties()
Get the display (GUI) properties (information) associated with this image.
void append(Image *const &value)
Appends an image to the image list.
bool contains(const QPointF &) const
Test if we contain the point.
PixelType pixelType() const
Property
This is a list of properties and actions that are possible.
void print() const
Prints a string representation of this exception to stderr.
Data ignored. Tells if the cube supports the zoomFit action.
Data ignored. Tells if the cube supports the "move*" actions.
void addSupport(int property)
Call this with every property you support, otherwise they will not communicate properly between widge...
double Line()
Returns the current line number.
geos::geom::MultiPolygon * footprint()
Get the footprint of this image (if available).
Namespace for ISIS/Bullet specific routines.
Isis::Camera * Camera() const
Return the camera associated with the ground map (NULL implies none)
Project * project() const
Gets the Project for this directory.
bool SetUniversalGround(double lat, double lon)
Returns whether the lat/lon position was set successfully in the camera model or projection.
virtual bool sceneEvent(QEvent *event)
This filters out events that happen within our polygons.
Cube * cube()
Get the Cube pointer associated with this display property.
The selection state of this cube (bool)
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget=0)
Re-paints the item.
Stretch * getStretch()
This gets a Stretch object that will work for the cubeDisplay converting from DN to screen pixel...
~MosaicSceneItem()
Mosaic Item destructor.
The color of the cube, default randomized (QColor)
double getPixelValue(int sample, int line)
Returns the pixel value at the given sample/line.
void AddData(const double *data, const unsigned int count)
Add an array of doubles to the accumulators and counters.
void SetNull(const double value)
Sets the mapping for NULL pixels.
void updateChildren()
This applies the displayProperties and selectability.
void cubeDisplayChanged()
Someone changed something in the cube display properties, re-read the whole thing.
double WorldY() const
This returns the world Y coordinate provided SetGround, SetCoordinate, SetUniversalGround, or SetWorld returned with success.