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++)
71 toDouble(tolerances[i][0]));
74 if (diffFile.hasGroup(
"IgnoreKeys")) {
75 PvlGroup ignoreKeys = diffFile.findGroup(
"IgnoreKeys");
76 for (
int i = 0; i < ignoreKeys.keywords(); i++)
92 PvlObject report(
"Differences");
94 diff(
"Filename", net1Name.name(), net2Name.name(), report);
106 Pvl net1Pvl = cnv1.
toPvl();
107 Pvl net2Pvl = cnv2.
toPvl();
109 PvlObject &net1Obj = net1Pvl.findObject(
"ControlNetwork");
110 PvlObject &net2Obj = net2Pvl.findObject(
"ControlNetwork");
114 for (
int p = 0; p < net1NumPts; p++) {
115 PvlObject &point = net1Obj.object(p);
116 pointMap[point.findKeyword(
"PointId")[0]].insert(
120 for (
int p = 0; p < net2NumPts; p++) {
121 PvlObject &point = net2Obj.object(p);
122 pointMap[point.findKeyword(
"PointId")[0]].insert(
128 for (
int i = 0; i < pointNames.size(); 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);
156 PvlObject pointReport(
"Point");
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();
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(
182 for (
int i = 0; i < measureNames.size(); 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)
196 report.addObject(pointReport);
213 PvlGroup measureReport(
"Measure");
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));
219 PvlContainer &groupReport = g1.hasKeyword(
"SerialNumber") ?
220 (PvlContainer &) measureReport : (PvlContainer &) report;
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]);
229 for (
int i = 0; i < keywordNames.size(); 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();
267 diff(name, toDouble(k1[0]), toDouble(k2[0]), (*
m_tolerances)[name], report);
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);
303 if (v1 != v2) report.addKeyword(
makeKeyword(name, v1, v2));
318 PvlKeyword keyword(name);
319 keyword.addValue(v1);
320 if (v1 != v2) keyword.addValue(v2);
340 if (fabs(v1 - v2) > tol) report.addKeyword(
makeKeyword(name, v1, v2, tol));
357 PvlKeyword keyword(name);
359 if (fabs(v1 - v2) > tol) {
377 PvlObject point(
"Point");
379 PvlKeyword keyword(label);
380 keyword.addValue(v1);
381 keyword.addValue(v2);
382 point.addKeyword(keyword);
384 parent.addObject(point);
399 PvlGroup measure(
"Measure");
401 PvlKeyword keyword(label);
402 keyword.addValue(v1);
403 keyword.addValue(v2);
404 measure.addKeyword(keyword);
406 parent.addGroup(measure);
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.
int numPoints() const
Returns the number of points that have been read in or are ready to write out.
QString netId() const
Returns the ID for the network.
Pvl toPvl()
Generates a Pvl file from the currently stored control points and header.
QString targetName() const
Returns the target for the network.
This is free and unencumbered software released into the public domain.
This is free and unencumbered software released into the public domain.
This is free and unencumbered software released into the public domain.
This is free and unencumbered software released into the public domain.
QString toString(const LinearAlgebra::Vector &vector, int precision)
A global function to format LinearAlgebra::Vector as a QString with the given precision.