11 #include <QMutexLocker> 13 #include <QScopedPointer> 15 #include <QStringList> 20 #include <boost/numeric/ublas/symmetric.hpp> 21 #include <boost/numeric/ublas/io.hpp> 44 void ControlNet::nullify() {
62 p_created = Application::DateTime();
63 p_modified = Application::DateTime();
64 m_coordType = coordType;
67 ControlNet::ControlNet(
const ControlNet &other) {
74 for (
int cpIndex = 0; cpIndex < other.
GetNumPoints(); cpIndex++) {
99 ControlNet::ControlNet(
const QString &ptfile,
Progress *progress,
108 m_coordType = coordType;
111 ReadControl(ptfile, progress);
114 QString msg =
"Invalid control network [" + ptfile +
"]";
125 ControlNet::~ControlNet() {
146 emit measureModified(measure, type, oldValue, newValue);
160 emit pointModified(point, type, oldValue, newValue);
172 void ControlNet::clear() {
176 if (GetNumPoints() > 0) {
178 QHashIterator<QString, ControlPoint*> i(*points);
179 while (i.hasNext()) {
181 delete(*points)[i.key()];
182 (*points)[i.key()] = NULL;
190 m_controlGraph.clear();
222 throw IException(IException::Programmer,
"Ownership has already been taken",
231 for (
int i = 0; i < points.size(); i++) {
232 points[i]->parentNetwork = NULL;
263 void ControlNet::ReadControl(
const QString &filename,
Progress *progress) {
268 p_networkId = versionedReader.
netId();
269 p_userName = versionedReader.
userName();
274 int numPoints = versionedReader.
numPoints();
277 progress->
SetText(
"Adding Control Points to Network...");
282 for (
int i = 0; i < numPoints; i++) {
303 void ControlNet::Write(
const QString &ptfile,
bool pvl) {
309 network = versionedWriter.
toPvl();
312 QString msg =
"Failed to convert control network to Pvl format.";
317 network.
write(ptfile);
320 QString msg =
"Failed writing control network to file [" + ptfile +
"]";
329 QString msg =
"Failed writing control network to file [" + ptfile +
"]";
346 IString msg =
"Null pointer passed to ControlNet::AddPoint!";
350 if (ContainsPoint(point->
GetId())) {
351 IString msg =
"ControlPoint must have unique Id";
355 QString pointId = point->
GetId();
356 points->insert(pointId, point);
357 pointIds->append(pointId);
364 emit networkStructureModified();
378 IString msg =
"NULL point passed to " 379 "ControlNet::pointAdded!";
383 if (!ContainsPoint(point->
GetId())) {
384 QString msg =
"ControlNet does not contain the point [";
385 msg += point->
GetId() +
"]";
390 for (
int i = 0; i < point->GetNumMeasures(); i++) {
393 if (!m_vertexMap.contains(sn)) {
395 newImage.serial = sn;
396 ImageVertex newVertex = boost::add_vertex(newImage, m_controlGraph);
397 m_vertexMap.insert(sn, newVertex);
398 emit networkModified(GraphModified);
403 for(
int i = 0; i < measures.size(); i++) {
407 m_controlGraph[m_vertexMap[serial]].measures[measure->Parent()] = measure;
411 if (!point->IsIgnored() && !measure->IsIgnored()) {
412 for (
int j = i + 1; j < measures.size(); j++) {
414 if (!cm->IsIgnored()) {
421 emit newPoint(point);
434 bool ControlNet::addEdge(QString sourceSerial, QString targetSerial) {
441 boost::tie(connection, edgeAdded) = boost::add_edge(m_vertexMap[sourceSerial],
442 m_vertexMap[targetSerial],
444 m_controlGraph[connection].strength++;
446 emit networkModified(GraphModified);
463 bool ControlNet::removeEdge(QString sourceSerial, QString targetSerial) {
466 boost::tie(connection, edgeExists) = boost::edge(m_vertexMap[sourceSerial],
467 m_vertexMap[targetSerial],
470 m_controlGraph[connection].strength--;
471 if (m_controlGraph[connection].strength <= 0) {
472 boost::remove_edge(m_vertexMap[sourceSerial],
473 m_vertexMap[targetSerial],
475 emit networkModified(GraphModified);
489 QString ControlNet::GraphToString()
const {
497 foreach(QString imageSerial, images) {
501 if (!point->IsIgnored()) {
502 pointIds.append(point->
GetId());
506 imagePointIds.insert(imageSerial, pointIds);
509 foreach(QString imageSerial, images) {
510 QStringList adjacentImages = getAdjacentImages(imageSerial);
511 adjacentImages.sort();
512 foreach(QString adjacentSerial, adjacentImages) {
513 if (QString::compare(adjacentSerial, imageSerial) < 0) {
520 while (imageIt != imagePointIds[imageSerial].cend() &&
521 adjacentIt != imagePointIds[adjacentSerial].cend()) {
522 int stringDiff = QString::compare(*imageIt, *adjacentIt);
523 if (stringDiff < 0) {
526 else if(stringDiff == 0) {
527 commonPoints.append(*imageIt);
536 std::pair<ImageConnection, bool> result = boost::edge(m_vertexMap[imageSerial],
537 m_vertexMap[adjacentSerial],
539 QString edgeStrength =
"UNKNOWN";
541 edgeStrength =
toString(m_controlGraph[result.first].strength);
544 graphString.append(imageSerial);
545 graphString.append(
" ----(");
546 graphString.append(edgeStrength);
547 graphString.append(
") [");
548 graphString.append(commonPoints.join(
","));
549 graphString.append(
"]---- ");
550 graphString.append(adjacentSerial);
551 graphString.append(
"\n");
574 IString msg =
"NULL measure passed to " 575 "ControlNet::measureAdded!";
581 IString msg =
"Control measure with NULL parent passed to " 582 "ControlNet::measureAdded!";
586 if (!ContainsPoint(point->
GetId())) {
587 QString msg =
"ControlNet does not contain the point [";
588 msg += point->
GetId() +
"]";
595 if (!m_vertexMap.contains(serial)) {
597 newImage.serial = serial;
598 ImageVertex newVertex = boost::add_vertex(newImage, m_controlGraph);
599 m_vertexMap.insert(serial, newVertex);
600 emit networkModified(GraphModified);
603 m_controlGraph[m_vertexMap[serial]].measures[measure->Parent()] = measure;
607 if (!point->IsIgnored() && !measure->IsIgnored()) {
608 for (
int i = 0; i < point->GetNumMeasures(); i++) {
610 if (!cm->IsIgnored()) {
614 if (QString::compare(sn, serial) != 0) {
620 emit newMeasure(measure);
631 IString msg =
"NULL point passed to " 632 "ControlNet::pointUnIgnored!";
638 for (
int i = 0; i < validMeasures.size(); i++) {
642 if (!ValidateSerialNumber(sourceSerial)) {
643 QString msg =
"Node does not exist for [";
644 msg += sourceSerial +
"]";
648 for(
int j = i+1; j < validMeasures.size(); j++) {
652 if (!ValidateSerialNumber(targetSerial)) {
653 QString msg =
"Node does not exist for [";
654 msg += targetSerial +
"]";
657 addEdge(sourceSerial, targetSerial);
677 IString msg =
"NULL measure passed to " 678 "ControlNet::measureUnIgnored!";
684 IString msg =
"Control measure with NULL parent passed to " 685 "ControlNet::measureUnIgnored!";
689 if (!ContainsPoint(point->
GetId())) {
690 QString msg =
"ControlNet does not contain the point [";
691 msg += point->
GetId() +
"]";
696 for (
int i = 0; i < point->GetNumMeasures(); i++) {
699 if (!adjacentMeasure->IsIgnored() && !m_vertexMap.contains(sn)) {
700 QString msg =
"Node does not exist for [";
706 if (!point->IsIgnored()) {
711 for (
int i = 0; i < point->GetNumMeasures(); i++) {
713 if (!cm->IsIgnored()) {
716 if (QString::compare(sn, serial) != 0) {
733 void ControlNet::UpdatePointReference(
ControlPoint *point, QString oldId) {
734 points->remove(oldId);
735 (*points)[point->
GetId()] = point;
736 (*pointIds)[pointIds->indexOf((QString) oldId)] = (QString)point->
GetId();
749 ASSERT(m_vertexMap.contains(serial));
751 emit measureRemoved(measure);
754 if (!measure->IsIgnored() && !measure->Parent()->IsIgnored()) {
756 measureIgnored(measure);
762 m_controlGraph[m_vertexMap[serial]].measures.remove(measure->Parent());
773 IString msg =
"NULL point passed to " 774 "ControlNet::pointIgnored!";
780 for (
int i = 0; i < validMeasures.size(); i++) {
784 if (!ValidateSerialNumber(sourceSerial)) {
785 QString msg =
"Node does not exist for [";
786 msg += sourceSerial +
"]";
790 for(
int j = i+1; j < validMeasures.size(); j++) {
794 if (!ValidateSerialNumber(targetSerial)) {
795 QString msg =
"Node does not exist for [";
796 msg += targetSerial +
"]";
799 removeEdge(sourceSerial, targetSerial);
815 IString msg =
"NULL measure passed to " 816 "ControlNet::measureIgnored!";
822 IString msg =
"Control measure with NULL parent passed to " 823 "ControlNet::measureIgnored!";
828 if (!ValidateSerialNumber(serial)) {
829 QString msg =
"Node does not exist for [";
836 for (
int i = 0; i < point->GetNumMeasures(); i++) {
839 if (!adjacentMeasure->IsIgnored() && m_vertexMap.contains(sn)) {
840 if (QString::compare(serial, sn) !=0) {
841 removeEdge(serial, sn);
854 m_coordType = coordType;
861 void ControlNet::emitNetworkStructureModified() {
862 emit networkStructureModified();
872 if (points->values().contains(point)) {
873 return DeletePoint(point->
GetId());
878 msg +=
"] does not exist in the network";
891 int ControlNet::DeletePoint(QString pointId) {
892 if (!points->contains(pointId)) {
893 IString msg =
"point Id [" + pointId +
"] does not exist in the network";
899 if (point->IsEditLocked())
900 return ControlPoint::PointLocked;
902 bool wasIgnored = point->IsIgnored();
909 emit pointDeleted(point);
912 points->remove(pointId);
913 pointIds->removeAt(pointIds->indexOf(pointId));
918 emit networkStructureModified();
919 return ControlPoint::Success;
928 int ControlNet::DeletePoint(
int index) {
929 if (index < 0 || index >= pointIds->size()) {
934 return DeletePoint(pointIds->at(index));
943 bool ControlNet::ContainsPoint(QString pointId)
const {
944 return points->contains(pointId);
966 for (
int i = 0; i < serials.size(); i++) {
967 boost::put(indexMapAdaptor, m_vertexMap[serials[i]], i);
972 int numComponents = boost::connected_components(m_controlGraph, componentAdaptor,
973 boost::vertex_index_map(indexMapAdaptor));
976 for (
int i = 0; i < numComponents; i++) {
978 islandStrings.append(tempList);
980 std::map<ImageVertex, size_t>::iterator it = componentMap.begin();
981 while(it != componentMap.end())
983 QString serial = m_controlGraph[it->first].serial;
984 int group = (int) it->second;
985 islandStrings[group].append(serial);
988 return islandStrings;
995 int ControlNet::getEdgeCount()
const {
996 return boost::num_edges(m_controlGraph);
1009 return m_vertexMap.keys();
1021 bool ControlNet::ValidateSerialNumber(QString serialNumber)
const {
1022 return m_vertexMap.contains(serialNumber);
1034 if (!ValidateSerialNumber(serialNumber)) {
1035 QString msg =
"Cube Serial Number [" + serialNumber +
"] not found in " 1043 boost::tie(adjIt, adjEnd) = boost::adjacent_vertices(m_vertexMap[serialNumber], m_controlGraph);
1044 for( ; adjIt != adjEnd; adjIt++) {
1045 adjacentSerials.append(m_controlGraph[*adjIt].serial);
1048 return adjacentSerials;
1058 if( !ValidateSerialNumber(serialNumber) ) {
1059 IString msg =
"Cube Serial Number [" + serialNumber +
"] not found in " 1064 return m_controlGraph[m_vertexMap[serialNumber]].measures.values();
1080 if (!measure->IsIgnored())
1081 validMeasures.append(measure);
1084 return validMeasures;
1096 if (
this != &other) {
1097 this->m_accessor = other.m_accessor;
1110 bool ControlNet::ControlMeasureLessThanFunctor::operator()
1113 return (a->*this->m_accessor)() < (b->*this->m_accessor)();
1126 double min,
double max) {
1132 int nObjPts = this->GetNumPoints();
1133 for (
int i=0;i<nObjPts;i++) {
1135 if (point->IsIgnored())
continue;
1138 int nObs = point->GetNumMeasures();
1139 for (
int j=0;j<nObs;j++) {
1141 if (measure->IsIgnored())
continue;
1142 double temp = (measure->*statFunc)();
1144 if (min <= temp && temp <= max) measures.push_back(measure);
1150 qSort(measures.begin(),measures.end(),lessThan);
1161 void ControlNet::ComputeResiduals() {
1164 QHashIterator< QString, ControlPoint * > i(*points);
1165 while (i.hasNext()) {
1167 i.value()->ComputeResiduals();
1177 void ControlNet::ComputeApriori() {
1179 QHashIterator< QString, ControlPoint * > i(*points);
1180 while (i.hasNext()) {
1183 if ( !point->IsIgnored() )
1195 double ControlNet::AverageResidual() {
1197 double avgResidual = 0.0;
1199 QHashIterator< QString, ControlPoint * > i(*points);
1200 while (i.hasNext()) {
1203 if (!point->IsIgnored()) {
1205 &ControlMeasure::GetResidualMagnitude).
Average();
1211 avgResidual /= count;
1225 return p_cameraList[index];
1236 QString ControlNet::CreatedDate()
const {
1246 QString ControlNet::Description()
const {
1247 return p_description;
1264 double sample,
double line) {
1266 if (!ValidateSerialNumber(serialNumber)) {
1267 QString msg =
"serialNumber [";
1268 msg += serialNumber;
1269 msg +=
"] not found in ControlNet";
1273 const double SEARCH_DISTANCE = 99999999.0;
1274 double minDist = SEARCH_DISTANCE;
1279 for (
int i = 0; i < measures.size(); i++) {
1283 double dx = fabs(sample - measureToCheck->GetSample());
1284 double dy = fabs(line - measureToCheck->GetLine());
1286 double dist = sqrt((dx * dx) + (dy * dy));
1288 if (dist < minDist) {
1290 closestPoint = measureToCheck->Parent();
1294 if (!closestPoint) {
1295 IString msg =
"No point found within ";
1296 msg +=
IString(SEARCH_DISTANCE);
1297 msg +=
"pixels of sample/line [";
1305 return closestPoint;
1315 double ControlNet::GetMaximumResidual() {
1318 double maxResidual = 0.0;
1321 &ControlMeasure::GetResidualMagnitude).
Maximum();
1322 if (residual > maxResidual)
1323 maxResidual = residual;
1330 QString ControlNet::GetNetworkId()
const {
1341 int ControlNet::GetNumEditLockMeasures() {
1342 int numLockedMeasures = 0;
1347 return numLockedMeasures;
1356 int ControlNet::GetNumEditLockPoints() {
1357 int editLockPoints = 0;
1359 if (p->IsEditLocked())
1363 return editLockPoints;
1373 int ControlNet::GetNumIgnoredMeasures() {
1374 int numIgnoredMeasures = 0;
1379 return numIgnoredMeasures;
1391 int ControlNet::GetNumberOfValidMeasuresInImage(
const QString &serialNumber) {
1393 if (p_cameraList.size() > 0) {
1394 return p_cameraValidMeasuresMap[serialNumber];
1396 return GetValidMeasuresInCube(serialNumber).size();
1405 int ControlNet::GetNumberOfJigsawRejectedMeasuresInImage(
const QString &serialNumber) {
1406 return p_cameraRejectedMeasuresMap[serialNumber];
1415 void ControlNet::ClearJigsawRejected() {
1426 void ControlNet::IncrementNumberOfRejectedMeasuresInImage(
const QString &serialNumber) {
1427 p_cameraRejectedMeasuresMap[serialNumber]++;
1435 void ControlNet::DecrementNumberOfRejectedMeasuresInImage(
const QString &serialNumber) {
1436 if (p_cameraRejectedMeasuresMap[serialNumber] > 0)
1437 p_cameraRejectedMeasuresMap[serialNumber]--;
1446 int ControlNet::GetNumMeasures()
const {
1447 int numMeasures = 0;
1449 numMeasures += p->GetNumMeasures();
1457 int ControlNet::GetNumPoints()
const {
1458 return points->size();
1471 int ControlNet::GetNumValidMeasures() {
1472 int numValidMeasures = 0;
1474 if (!p->IsIgnored())
1478 return numValidMeasures;
1487 int ControlNet::GetNumValidPoints() {
1488 int validPoints = 0;
1490 if (!p->IsIgnored())
1499 QString ControlNet::GetTarget()
const {
1500 return p_targetName;
1505 QString ControlNet::GetUserName()
const {
1510 QString ControlNet::GetLastModified()
const {
1519 for (
int i = 0; i < pointIds->size(); i++) {
1520 pointsList.append(GetPoint(i));
1538 void ControlNet::SetCreatedDate(
const QString &date) {
1548 void ControlNet::SetDescription(
const QString &newDescription) {
1549 p_description = newDescription;
1558 void ControlNet::SetImages(
const QString &imageListFile) {
1581 if (p_cameraList.size() > 0) {
1585 if (progress != NULL) {
1586 progress->
SetText(
"Setting input images...");
1591 for (
int i = 0; i < list.
size(); i++) {
1593 QString filename = list.
fileName(i);
1594 Cube cube(filename,
"r");
1598 p_cameraMap[serialNumber] = cam;
1599 p_cameraValidMeasuresMap[serialNumber] = 0;
1600 p_cameraRejectedMeasuresMap[serialNumber] = 0;
1601 p_cameraList.push_back(cam);
1604 QString msg =
"Unable to create camera for cube file ";
1609 if (progress != NULL)
1614 QHashIterator< QString, ControlPoint * > p(*points);
1615 while (p.hasNext()) {
1620 for (
int m = 0; m < serialNums.size(); m++) {
1625 curMeasure->
SetCamera(p_cameraMap[serialNumber]);
1628 if (!curMeasure->IsIgnored()) p_cameraValidMeasuresMap[serialNumber]++;
1633 "] does not have a cube with a matching serial number";
1646 void ControlNet::SetModifiedDate(
const QString &date) {
1658 void ControlNet::SetMutex(QMutex *mutex) {
1668 void ControlNet::SetNetworkId(
const QString &
id) {
1684 void ControlNet::SetTarget(
const QString &target) {
1685 p_targetName = target;
1696 void ControlNet::SetTarget(
Pvl label) {
1700 mapping = label.
findGroup(
"Mapping", Pvl::Traverse);
1704 p_targetName = mapping[
"TargetName"][0];
1707 && label.
findObject(
"IsisCube").hasGroup(
"Instrument")
1708 && label.
findObject(
"IsisCube").findGroup(
"Instrument").hasKeyword(
"TargetName")) {
1709 p_targetName = label.
findObject(
"IsisCube").findGroup(
"Instrument").findKeyword(
"TargetName")[0];
1722 void ControlNet::SetUserName(
const QString &name) {
1742 std::swap(points, other.
points);
1743 std::swap(pointIds, other.
pointIds);
1745 std::swap(m_mutex, other.m_mutex);
1758 QHashIterator< QString, ControlPoint * > i(*points);
1759 while (i.hasNext()) {
1760 i.next().value()->parentNetwork =
this;
1763 QHashIterator< QString, ControlPoint * > i2(*other.
points);
1764 while (i2.hasNext()) {
1765 i2.next().value()->parentNetwork = &other;
1768 m_vertexMap.
clear();
1769 VertexIterator v, vend;
1770 for (boost::tie(v, vend) = vertices(m_controlGraph); v != vend; ++v) {
1771 ImageVertex imVertex = *v;
1772 QString serialNum = m_controlGraph[*v].serial;
1773 m_vertexMap[serialNum] = imVertex;
1776 other.m_vertexMap.clear();
1777 VertexIterator v2, vend2;
1778 for (boost::tie(v2, vend2) = vertices(other.
m_controlGraph); v2 != vend2; ++v2) {
1779 ImageVertex imVertex = *v2;
1781 other.m_vertexMap[serialNum] = imVertex;
1784 emit networkModified(ControlNet::Swapped);
1797 if (
this != &other) {
1807 const ControlPoint *ControlNet::GetPoint(QString
id)
const {
1808 if (!points->contains(
id)) {
1809 IString msg =
"The control network has no control points with an ID " 1810 "equal to [" +
id +
"]";
1814 return points->value(
id);
1818 ControlPoint *ControlNet::GetPoint(QString
id) {
1819 if (!points->contains(
id)) {
1820 IString msg =
"The control network has no control points with an ID " 1821 "equal to [" +
id +
"]";
1822 throw IException(IException::Programmer, msg,
_FILEINFO_);
1825 return (*points)[id];
1829 const ControlPoint *ControlNet::GetPoint(
int index)
const {
1830 if (index < 0 || index >= pointIds->size()) {
1831 IString msg =
"Index [" + IString(index) +
"] out of range";
1832 throw IException(IException::Programmer, msg,
_FILEINFO_);
1835 return GetPoint(pointIds->at(index));
1839 ControlPoint *ControlNet::GetPoint(
int index) {
1840 if (index < 0 || index >= pointIds->size()) {
1841 IString msg =
"Index [" + IString(index) +
"] out of range";
1842 throw IException(IException::Programmer, msg,
_FILEINFO_);
1845 return GetPoint(pointIds->at(index));
1858 const ControlPoint *ControlNet::operator[](QString
id)
const {
1859 return GetPoint(
id);
1863 ControlPoint *ControlNet::operator[](QString
id) {
1864 return GetPoint(
id);
1868 const ControlPoint *ControlNet::operator[](
int index)
const {
1869 return GetPoint(index);
1873 ControlPoint *ControlNet::operator[](
int index) {
1874 return GetPoint(index);
bool hasKeyword(const QString &name) const
Check to see if a keyword exists.
boost::graph_traits< Network >::adjacency_iterator AdjacencyIterator
Iterates over adjacent verticies.
void SetMaximumSteps(const int steps)
This sets the maximum number of steps in the process.
QString p_targetName
Name of the target.
PvlGroupIterator findGroup(const QString &name, PvlGroupIterator beg, PvlGroupIterator end)
Find a group with the specified name, within these indexes.
bool hasSerialNumber(QString sn)
Determines whether or not the requested serial number exists in the list.
QString creationDate() const
Returns the date and time that the network was created.
Used to define the verticies of the graph.
File name manipulation and expansion.
Status ComputeApriori()
Computes a priori lat/lon/radius point coordinates by determining the average lat/lon/radius of all ...
Pvl toPvl()
Generates a Pvl file from the currently stored control points and header.
QStringList * pointIds
The ControlNet graph.
QString lastModificationDate() const
Returns the date and time of the last modification to the network.
const ControlMeasure * GetMeasure(QString serialNumber) const
Get a control measure based on its cube's serial number.
ModType
Control Measure Modification Types.
PvlObjectIterator findObject(const QString &name, PvlObjectIterator beg, PvlObjectIterator end)
Find the index of object with a specified name, between two indexes.
void ClearJigsawRejected()
Set jigsaw rejected flag for all measures to false and set the jigsaw rejected flag for the point its...
QString p_description
Textual Description of network.
boost::associative_property_map< VertexIndexMap > VertexIndexMapAdaptor
Converts VertexIndexMap into the appropriate form to be used by boost.
QMap< QString, Isis::Camera * > p_cameraMap
A map from serialnumber to camera.
QString serialNumber(const QString &filename)
Return a serial number given a filename.
Handle various control network file format versions.
Namespace for the standard library.
QString p_networkId
The Network Id.
ControlNet * parentNetwork
List of Control Measures.
Network m_controlGraph
The serial number -> vertex hash used by the graph.
bool hasGroup(const QString &name) const
Returns a boolean value based on whether the object has the specified group or not.
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Unless noted otherwise, the portions of Isis written by the USGS are public domain.
std::map< ImageVertex, size_t > VertexIndexMap
Represents the edges of the graph.
int GetNumValidMeasures() const
QString p_created
Creation Date.
void CheckStatus()
Checks and updates the status.
Statistics GetStatistic(double(ControlMeasure::*statFunc)() const) const
This function will call a given method on every control measure that this point has.
bool hasObject(const QString &name) const
Returns a boolean value based on whether the object exists in the current PvlObject or not...
QString fileName(const QString &sn)
Return a filename given a serial number.
double Maximum() const
Returns the absolute maximum double found in all data passed through the AddData method.
int GetNumPoints() const
Return the number of control points in the network.
SurfacePoint::CoordinateType m_coordType
The coordinate type of the control points.
Program progress reporter.
QString description() const
Returns the network's description.
QString p_userName
The user who created the network.
int GetNumLockedMeasures() const
Returns the number of locked control measures.
QString GetId() const
Return the Id of the control point.
Status SetCamera(Isis::Camera *camera)
Set pointer to camera associated with a measure.
QMap< QString, int > p_cameraValidMeasuresMap
A map from serialnumber to #measures.
void SetText(const QString &text)
Changes the value of the text string reported just before 0% processed.
void clear()
Clear the contents of this object.
Contains multiple PvlContainers.
QList< QString > getCubeSerialNumbers() const
#define _FILEINFO_
Macro for the filename and line number.
QList< ControlMeasure *> getMeasures(bool excludeIgnored=false) const
Container for cube-like labels.
QHash< QString, ControlPoint *> * points
hash ControlPoints by ControlPoint Id
Network::edge_descriptor ImageConnection
Reprents the verticies of the graph.
CoordinateType
Defines the coordinate typ, units, and coordinate index for some of the output methods.
int size() const
How many serial number / filename combos are in the list.
QString targetName() const
Returns the target for the network.
ModType
Control Point Modification Types.
void write(FileName netFile)
This will write a control net file object to disk.
ControlPoint * takeFirstPoint()
Returns the first point stored in the versioner's internal list.
QVector< Isis::Camera * > p_cameraList
Vector of image number to camera.
QMap< QString, int > p_cameraRejectedMeasuresMap
A map from serialnumber to #rejected measures.
QString netId() const
Returns the ID for the network.
Adds specific functionality to C++ strings.
Namespace for ISIS/Bullet specific routines.
int Delete(ControlMeasure *measure)
Remove a measurement from the control point, deleting reference measure is allowed.
void write(const QString &file)
Opens and writes PVL information to a file and handles the end of line sequence.
QString p_modified
Date Last Modified.
Serial Number list generator.
QString userName() const
Returns the name of the last person or program to modify the network.
double Average() const
Computes and returns the average.
QString GetCubeSerialNumber() const
Return the serial number of the cube containing the coordinate.
IO Handler for Isis Cubes.
int numPoints() const
Returns the number of points that have been read in or are ready to write out.