9#include "ControlNetDiff.h" 
   15#include "ControlMeasure.h" 
   16#include "ControlNet.h" 
   17#include "ControlNetVersioner.h" 
   18#include "ControlPoint.h" 
   21#include "PvlContainer.h" 
   23#include "PvlKeyword.h" 
   67    if (diffFile.hasGroup(
"Tolerances")) {
 
   68      PvlGroup tolerances = diffFile.findGroup(
"Tolerances");
 
   69      for (
int i = 0; i < tolerances.keywords(); i++)
 
   74    if (diffFile.hasGroup(
"IgnoreKeys")) {
 
   75      PvlGroup ignoreKeys = diffFile.findGroup(
"IgnoreKeys");
 
   76      for (
int i = 0; i < ignoreKeys.keywords(); i++)
 
 
   94    diff(
"Filename", net1Name.name(), net2Name.name(), report);
 
   99    BigInt net1NumPts = cnv1.numPoints();
 
  100    BigInt net2NumPts = cnv2.numPoints();
 
  103    diff(
"NetworkId", cnv1.netId(), cnv2.netId(), report);
 
  104    diff(
"TargetName", cnv1.targetName(), cnv2.targetName(), report);
 
  106    Pvl net1Pvl = cnv1.toPvl();
 
  107    Pvl net2Pvl = cnv2.toPvl();
 
  112    QMap< QString, QMap<int, PvlObject> > pointMap;
 
  114    for (
int p = 0; p < net1NumPts; p++) {
 
  120    for (
int p = 0; p < net2NumPts; p++) {
 
  126    QList<QString> pointNames = pointMap.keys();
 
  128    for (
int i = 0; i < pointNames.size(); i++) {
 
  129      QMap<int, PvlObject> idMap = pointMap[pointNames[i]];
 
  130      if (idMap.size() == 2) {
 
  131        compare(idMap[0], idMap[1], report);
 
  133      else if (idMap.contains(0)) {
 
  134        addUniquePoint(
"PointId", idMap[0].findKeyword(
"PointId")[0], 
"N/A", report);
 
  136      else if (idMap.contains(1)) {
 
  137        addUniquePoint(
"PointId", 
"N/A", idMap[1].findKeyword(
"PointId")[0], report);
 
  141    results.addObject(report);
 
 
  158    QString id1 = point1Pvl.findKeyword(
"PointId")[0];
 
  159    QString id2 = point2Pvl.findKeyword(
"PointId")[0];
 
  160    pointReport.addKeyword(
makeKeyword(
"PointId", id1, id2));
 
  162    int p1Measures = point1Pvl.groups();
 
  163    int p2Measures = point2Pvl.groups();
 
  168    QMap< QString, QMap<int, PvlGroup> > measureMap;
 
  169    for (
int m = 0; m < p1Measures; m++) {
 
  170      PvlGroup &measure = point1Pvl.group(m);
 
  171      measureMap[measure.findKeyword(
"SerialNumber")[0]].insert(
 
  175    for (
int m = 0; m < p2Measures; m++) {
 
  176      PvlGroup &measure = point2Pvl.group(m);
 
  177      measureMap[measure.findKeyword(
"SerialNumber")[0]].insert(
 
  181    QList<QString> measureNames = measureMap.keys();
 
  182    for (
int i = 0; i < measureNames.size(); i++) {
 
  183      QMap<int, PvlGroup> idMap = measureMap[measureNames[i]];
 
  184      if (idMap.size() == 2) {
 
  187      else if (idMap.contains(0)) {
 
  188        addUniqueMeasure(
"SerialNumber", idMap[0].findKeyword(
"SerialNumber")[0], 
"N/A", pointReport);
 
  190      else if (idMap.contains(1)) {
 
  191        addUniqueMeasure(
"SerialNumber", 
"N/A", idMap[1].findKeyword(
"SerialNumber")[0], pointReport);
 
  195    if (pointReport.keywords() > 2 || pointReport.groups() > 0)
 
 
  214    if (g1.hasKeyword(
"SerialNumber")) {
 
  215      QString sn1 = g1.findKeyword(
"SerialNumber")[0];
 
  216      QString sn2 = g1.findKeyword(
"SerialNumber")[0];
 
  217      measureReport.addKeyword(
makeKeyword(
"SerialNumber", sn1, sn2));
 
  222    QMap< QString, QMap<int, PvlKeyword> > keywordMap;
 
  223    for (
int k = 0; k < g1.keywords(); k++)
 
  224      keywordMap[g1[k].name()].insert(0, g1[k]);
 
  225    for (
int k = 0; k < g2.keywords(); k++)
 
  226      keywordMap[g2[k].name()].insert(1, g2[k]);
 
  228    QList<QString> keywordNames = keywordMap.keys();
 
  229    for (
int i = 0; i < keywordNames.size(); i++) {
 
  230      QMap<int, PvlKeyword> idMap = keywordMap[keywordNames[i]];
 
  231      if (idMap.size() == 2) {
 
  232        compare(idMap[0], idMap[1], groupReport);
 
  234      else if (idMap.contains(0)) {
 
  235        QString name = idMap[0].name();
 
  237          diff(name, idMap[0][0], 
"N/A", groupReport);
 
  239      else if (idMap.contains(1)) {
 
  240        QString name = idMap[1].name();
 
  242          diff(name, 
"N/A", idMap[1][0], groupReport);
 
  246    if (measureReport.keywords() > 1) report.
addGroup(measureReport);
 
 
  265    QString name = k1.
name();
 
  269      diff(name, k1[0], k2[0], report);
 
 
  284    QString v1 = o1[name][0];
 
  285    QString v2 = o2[name][0];
 
  286    diff(name, v1, v2, report);
 
 
  359    if (fabs(v1 - v2) > tol) {
 
 
  404    measure.addKeyword(keyword);
 
 
void diff(QString name, PvlObject &o1, PvlObject &o2, PvlContainer &report)
Add a new difference keyword to the given report if the PvlObjects have different values for the keyw...
 
void addTolerances(Pvl &diffFile)
Add the given ignore keys and tolerances to the persisent collections of such values.
 
QMap< QString, double > * m_tolerances
The map of tolerances going from keyword name to tolerance value.
 
void addUniquePoint(QString label, QString v1, QString v2, PvlObject &parent)
Add a new keyword for the given point to the parent object.
 
ControlNetDiff()
Create a ControlNetDiff without any tolerances.
 
void init()
Initialize the persistent structures used to maintain the state of this instance: its ignore keys and...
 
void addUniqueMeasure(QString label, QString v1, QString v2, PvlObject &parent)
Add a new keyword for the given measure to the parent object.
 
QSet< QString > * m_ignoreKeys
The set of keywords to ignore by name.
 
PvlKeyword makeKeyword(QString name, QString v1, QString v2)
Create a new keyword with the given label name and the given values.
 
void compareGroups(PvlContainer &g1, PvlContainer &g2, PvlObject &report)
Compare two collections, or groupings, of PvlKeywords.
 
virtual ~ControlNetDiff()
Destroy the ControlNetDiff.
 
Pvl compare(FileName &net1Name, FileName &net2Name)
Compare two Control Networks given their file names, and return their differences.
 
Handle various control network file format versions.
 
File name manipulation and expansion.
 
Contains more than one keyword-value pair.
 
bool hasKeyword(const QString &name) const
Check to see if a keyword exists.
 
QString name() const
Returns the container name.
 
void addKeyword(const PvlKeyword &keyword, const InsertMode mode=Append)
Add a keyword to the container.
 
Contains multiple PvlContainers.
 
Container for cube-like labels.
 
A single keyword-value pair.
 
void addValue(QString value, QString unit="")
Adds a value with units.
 
Contains Pvl Groups and Pvl Objects.
 
PvlObjectIterator findObject(const QString &name, PvlObjectIterator beg, PvlObjectIterator end)
Find the index of object with a specified name, between two indexes.
 
PvlObject & object(const int index)
Return the object at the specified index.
 
void addObject(const PvlObject &object)
Add a PvlObject.
 
PvlKeyword & findKeyword(const QString &kname, FindOptions opts)
Finds a keyword in the current PvlObject, or deeper inside other PvlObjects and Pvlgroups within this...
 
void addGroup(const Isis::PvlGroup &group)
Add a group to the object.
 
This is free and unencumbered software released into the public domain.
 
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
 
long long int BigInt
Big int.
 
double toDouble(const QString &string)
Global function to convert from a string to a double.