21 typedef std::numeric_limits< double > dbl;
25 #define UNDEFINED_STATUS 2
44 ControlNetFilter::ControlNetFilter(
ControlNet *pCNet, QString &psSerialNumFile,
Progress *pProgress) :
59 QString outName(outFile.expanded());
60 mOstm.open(outName.toAscii().data(), std::ios::out);
61 mOstm.precision(dbl::digits10);
83 if (
mCNet->GetPoint(pindex)->IsEditLocked() ) {
100 QString sn(serialNum);
105 bool pointEditFlag =
false;
106 QString ptId(measure->Parent()->
GetId());
108 if (point->IsEditLocked()) {
110 pointEditFlag =
true;
113 msr->SetEditLock(
false);
114 point->Delete(serialNum);
116 point->SetEditLock(
true);
127 mOstm <<
"PointID, PointType, PointIgnored, PointEditLocked, TotalMeasures, MeasuresIgnored, MeasuresEditLocked, ";
139 <<
", " <<
sBoolean[(int)pcPoint.IsIgnored()] <<
", "
140 <<
sBoolean[(int)pcPoint.IsEditLocked()] <<
", "
141 << pcPoint.GetNumMeasures() <<
", "
164 mOstm <<
"FileName, SerialNumber, ImageTotalPoints, ImagePointsIgnored, ImagePointsEditLocked, ImagePointsFixed, ImagePointsConstrained, ImagePointsFree, ImageConvexHullRatio,";
180 dLesser = fabs((
double)pvlGrp[
"LessThan"]);
184 dGreater = fabs((
double)pvlGrp[
"GreaterThan"]);
187 if (dLesser < 0 || dGreater < 0 || dLesser <= dGreater) {
188 string sErrMsg =
"Invalid Deffile - Check Point_PixelShift Group\n";
194 mOstm <<
"PointID, PointType, PointIgnored, PointEditLocked, FileName, SerialNumber, PixelShift, MeasureType, MeasureIgnored, MeasureEditLocked, Reference, ";
199 for (
int i = (iNumPoints - 1); i >= 0; i--) {
201 int iNumMeasures = cPoint->GetNumMeasures();
203 for (
int j = 0; j < iNumMeasures; j++){
205 double dPixelShift = measure->GetPixelShift();
206 if (dPixelShift <= dLesser && dPixelShift >= dGreater) {
218 for (
int j = 0; j < iNumMeasures; j++) {
220 <<
sBoolean[cPoint->IsIgnored()] <<
", "
221 <<
sBoolean[cPoint->IsEditLocked()] <<
", ";
225 double dPixelShift = measure->GetPixelShift();
228 << sBoolean[measure->IsIgnored()] <<
", "
251 int iLesser = VALID_MAX2;
255 iLesser =
toInt(pvlGrp[
"LessThan"][0]);
259 iGreater =
toInt(pvlGrp[
"GreaterThan"][0]);
262 if (iLesser < 0 || iGreater < 0 || iLesser < iGreater) {
263 string sErrMsg =
"Invalid Deffile - Check Point_MeasureEditLock Group\n";
270 mOstm <<
"FileName, SerialNumber, MeasureType, MeasureIgnored, MeasureEditLocked, Reference" << endl;
274 for (
int i = (iNumPoints - 1); i >= 0; i--) {
278 if (iNumLockedMsr > iLesser || iNumLockedMsr < iGreater) {
283 int iNumMeasures = cPoint->GetNumMeasures();
285 for (
int j = 0; j < iNumMeasures; j++) {
290 <<
sBoolean[cm->IsIgnored()] <<
", "
313 bool editLock =
false;
316 if(pvlGrp[
"EditLock"][0] ==
"1" ||
IString(pvlGrp[
"EditLock"][0]).
DownCase() ==
"true")
326 for (
int i = (iNumPoints - 1); i >= 0; i--) {
328 if (cPoint->IsEditLocked() != editLock) {
334 int iNumMeasures = cPoint->GetNumMeasures();
336 <<
sBoolean[cPoint->IsIgnored()] <<
", "
337 <<
sBoolean[cPoint->IsEditLocked()] <<
", "
338 << iNumMeasures <<
", "
364 if (pvlGrp[
"LessThan"][0] !=
"") {
365 dLesser = fabs((
double)pvlGrp[
"LessThan"]);
370 if (pvlGrp[
"GreaterThan"][0] !=
"") {
371 dGreater = fabs((
double)pvlGrp[
"GreaterThan"]);
375 if (dLesser < 0 || dGreater < 0 || dLesser < dGreater) {
376 string sErrMsg =
"Invalid Deffile - Check Point_ResidualMagnitude Group\n";
382 mOstm <<
"PointID, PointType, PointIgnored, PointEditLocked, FileName, SerialNumber, ResidualMagnitude, MeasureType, MeasureIgnored, MeasureEditLocked, Reference, ";
387 for (
int i = (iNumPoints - 1); i >= 0; i--) {
390 int iNumMeasures = cPoint->GetNumMeasures();
391 for (
int j = 0; j < iNumMeasures; j++) {
394 if (dResMag <= dLesser && dResMag >= dGreater) {
405 else if (pbLastFilter) {
407 for (
int j = 0; j < iNumMeasures; j++) {
409 <<
sBoolean[cPoint->IsIgnored()] <<
", "
410 <<
sBoolean[cPoint->IsEditLocked()] <<
", ";
417 << sBoolean[measure->IsIgnored()] <<
", "
439 QString sPointIDExpr = pvlGrp[
"Expression"][0];
440 QString sSeparator(
"*");
441 QStringList strTokens = sPointIDExpr.split(sSeparator, QString::SkipEmptyParts);
443 int iTokenSize = (int)strTokens.size();
446 odb <<
"Net Size=" << iNumPoints << endl;
454 for (
int i = (iNumPoints - 1); i >= 0; i--) {
456 QString sPointID = cPoint->
GetId();
458 for (
int j = (iTokenSize - 1); j >= 0; j--) {
459 int iLen = strTokens[j].length();
461 int found = sPointID.indexOf(strTokens[j], iPosition);
463 iPosition = found + iLen;
465 if (pbLastFilter && j == (iTokenSize - 1)) {
493 int iLesser = VALID_MAX2, iGreater = 0;
496 if (pvlGrp[
"LessThan"][0] !=
"") {
497 iLesser =
toInt(pvlGrp[
"LessThan"][0]);
502 if (pvlGrp[
"GreaterThan"][0] !=
"") {
503 iGreater =
toInt(pvlGrp[
"GreaterThan"][0]);
507 if (iLesser < 0 || iGreater < 0 || iLesser < iGreater) {
508 string sErrMsg =
"Invalid Deffile - Check Point_NumMeasures Group\n";
515 mOstm <<
"FileName, SerialNum, MeasureType, MeasureIgnore, MeasureEditLock, Reference" << endl;
520 for (
int i = (iNumPoints - 1); i >= 0; i--) {
522 int iNumMeasures = cPoint->GetNumMeasures();
523 if (iNumMeasures > iLesser || iNumMeasures < iGreater) {
528 for (
int j = 0; j < iNumMeasures; j++) {
533 <<
sBoolean[cm->IsIgnored()] <<
", "
555 bool bIgnoredFlag =
false;
556 int iSetIgnoreFlag = 0;
561 if (pvlGrp[
"PointType"][0] !=
"") {
562 sType = pvlGrp[
"PointType"][0];
569 sTemp = pvlGrp[
"Ignore"][0];
570 if (sTemp ==
"1" || sTemp.
DownCase() ==
"true") {
582 for (
int i = (iNumPoints - 1); i >= 0; i--) {
584 bool bPointFound =
false;
585 bool bIgnored = cPoint->IsIgnored();
590 if (!iSetIgnoreFlag || bIgnoredFlag == bIgnored) {
591 if (sType ==
"all" || sType==
"") {
594 else if (sType ==
"fixed" && bFixed) {
597 else if (sType ==
"constrained" && bConstrained) {
600 else if (sType ==
"free" && bFree) {
635 if (pvlGrp[
"MinLat"][0] !=
"") {
636 dMinLat = pvlGrp[
"MinLat"];
641 if (pvlGrp[
"MaxLat"][0] !=
"") {
642 dMaxLat = pvlGrp[
"MaxLat"];
647 if (pvlGrp[
"MinLon"][0] !=
"") {
648 dMinLon = pvlGrp[
"MinLon"];
653 if (pvlGrp[
"MaxLon"][0] !=
"") {
654 dMaxLon = pvlGrp[
"MaxLon"];
658 if (dMinLat > dMaxLat || dMinLon > dMaxLon) {
659 string sErrMsg =
"Invalid Deffile - Check Point_LatLon Group\n";
666 mOstm <<
"Latitude, Longitude, Radius" << endl;
671 for (
int i = (iNumPoints - 1); i >= 0; i--) {
673 SurfacePoint cPointSurfPt = cPoint->GetAdjustedSurfacePoint();
675 if (!cPointSurfPt.Valid()) {
680 Cube cube(filename,
"r");
683 if (camera->
SetImage(cm->GetSample(), cm->GetLine())) {
693 if ((latitude < dMinLat || latitude > dMaxLat) ||
694 (longitude < dMinLon ||longitude > dMaxLon)) {
701 mOstm << latitude <<
", " << longitude <<
", " <<
720 double dMaxDistance = 0;
721 QString sUnits =
"pixels";
724 if (pvlGrp[
"MaxDistance"][0] !=
"") {
725 dMaxDistance = pvlGrp[
"MaxDistance"];
730 sUnits = pvlGrp[
"Units"][0];
735 mOstm <<
"Point#Distance >>, " << endl;
738 bool bMinDistance =
false;
740 for (
int i = (iNumPoints - 1); i >= 0; i--) {
748 if (sUnits ==
"meters") {
749 surfacePt1 = cp1->GetAdjustedSurfacePoint();
751 if (!surfacePt1.Valid()) {
754 Cube cube1(filename1,
"r");
756 if (cam1->
SetImage(cp1RefMeasure->GetSample(),
757 cp1RefMeasure->GetLine())) {
769 dSample1 = cp1RefMeasure->GetSample();
770 dLine1 = cp1RefMeasure->GetLine();
786 if (sUnits ==
"meters") {
787 surfacePt2 = cp2->GetAdjustedSurfacePoint();
789 if (!surfacePt2.Valid()) {
792 Cube cube2(filename2,
"r");
795 if (cam2->
SetImage(cp2RefMeasure->GetSample(),
796 cp2RefMeasure->GetLine())) {
811 dSample2 = cp2RefMeasure->GetSample();
812 dLine2 = cp2RefMeasure->GetLine();
814 double dDeltaSamp = dSample1 - dSample2;
815 double dDeltaLine = dLine1 - dLine2;
817 dDist = sqrt((dDeltaSamp * dDeltaSamp) + (dDeltaLine * dDeltaLine));
820 if (dDist <= dMaxDistance) {
825 mOstm << cp2->
GetId() <<
"#" << dDist <<
", ";
835 if (pbLastFilter && bMinDistance) {
838 bMinDistance =
false;
862 if (pvlGrp[
"LessThan"][0] !=
"") {
863 dLesser = fabs((
double)(pvlGrp[
"LessThan"]));
868 if (pvlGrp[
"GreaterThan"][0] !=
"") {
869 dGreater = fabs((
double)pvlGrp[
"GreaterThan"]);
875 mOstm <<
"FileName, SerialNumber, GoodnessOfFit, MeasureType, MeasureIgnored, MeasureEditLocked, Reference" << endl;
879 for (
int i=(iNumPoints-1); i>=0; i--) {
881 int iNumMeasures = cPoint->GetNumMeasures();
882 bool bMatchFlag=
false;
884 for (
int j=0; j<iNumMeasures; j++) {
887 if (dMsrGFit >= dGreater && dMsrGFit <= dLesser) {
899 int iNumMeasures = cPoint->GetNumMeasures();
901 for (
int j = 0; j < iNumMeasures; j++) {
906 <<
sBoolean[cPoint->IsIgnored()] <<
", " <<
sBoolean[cPoint->IsEditLocked()] <<
", "
911 <<
sBoolean[measure->IsIgnored()] <<
", "
933 int iIgnoredFlag = -1;
949 mOstm <<
"FileName, SerialNumber, MeasureIgnored, MeasureType, MeasureEditLocked, Reference," << endl;
953 for (
int i = (iNumPoints - 1); i >= 0; i--) {
956 int iNumMeasures = cPoint->GetNumMeasures();
957 int iNotMeasureType = 0;
958 for (
int j = 0; j < iNumMeasures; j++) {
960 bool bMeasureIgnored = cMeasure->IsIgnored();
961 bool bMeasureFound =
false;
963 if (iIgnoredFlag == -1 || bMeasureIgnored == iIgnoredFlag) {
964 if (sType ==
"all" || sType ==
"") {
965 bMeasureFound =
true;
968 bMeasureFound =
true;
971 bMeasureFound =
true;
974 bMeasureFound =
true;
977 bMeasureFound =
true;
985 <<
sBoolean[(int) cMeasure->IsIgnored()] <<
", "
996 if (iNotMeasureType == iNumMeasures) {
1015 std::vector <QString> sCubeNames;
1018 for (
int i = 0; i < pvlGrp.
keywords(); i++) {
1019 sCubeNames.push_back(pvlGrp[i][0]);
1022 int size = sCubeNames.size();
1027 mOstm <<
"ImageMeasureIgnored, ImageMeasureEditLocked, ";
1032 for (
int i = (iNumPoints - 1); i >= 0; i--) {
1034 int iNumMeasures = cPoint->GetNumMeasures();
1035 int iNumNoMatch = 0;
1036 bool bMatch =
false;
1037 for (
int j = 0; j < iNumMeasures; j++) {
1039 for (
int k = 0; k < size; k++) {
1049 if (iNumNoMatch == iNumMeasures) {
1060 for (
int i = 0; i < iNumPoints; i++) {
1062 int iNumMeasures = cPoint->GetNumMeasures();
1063 for (
int j = 0; j < iNumMeasures; j++) {
1068 <<
sBoolean[cPoint->IsIgnored()] <<
", "
1069 <<
sBoolean[cPoint->IsEditLocked()] <<
", "
1070 << iNumMeasures <<
", "
1078 << imgStats[imgTotalPoints] <<
", " << imgStats[imgIgnoredPoints] <<
", "
1079 << imgStats[imgLockedPoints] <<
", " << imgStats[imgFixedPoints] <<
", "
1080 << imgStats[imgConstrainedPoints] <<
", " << imgStats[imgFreePoints] <<
", "
1081 << imgStats[imgConvexHullRatio] <<
", "
1104 double dGreater = 0;
1107 if (pvlGrp[
"LessThan"][0] !=
"") {
1108 dLesser = fabs((
double)pvlGrp[
"LessThan"]);
1113 if (pvlGrp[
"GreaterThan"][0] !=
"") {
1114 dGreater = fabs((
double)pvlGrp[
"GreaterThan"]);
1118 if (dLesser < 0 || dGreater < 0 || dLesser <= dGreater) {
1119 string sErrMsg =
"Invalid Deffile - Check Cube_ConvexHullRatio Group\n";
1131 for (
int sn = (iNumCubes - 1); sn >= 0; sn--) {
1134 double convexHullRatio = imgStats[imgConvexHullRatio];
1135 if (convexHullRatio < dGreater || convexHullRatio > dLesser){
1139 else if (pbLastFilter) {
1141 << imgStats[imgTotalPoints] <<
", " << imgStats[imgIgnoredPoints] <<
", " << imgStats[imgLockedPoints] <<
", "
1142 << imgStats[imgFixedPoints] <<
", " << imgStats[imgConstrainedPoints] <<
", " << imgStats[imgFreePoints] <<
", "
1143 << imgStats[imgConvexHullRatio]<< endl;
1161 QString sCubeExpr(
"");
1163 sCubeExpr = QString(pvlGrp[
"Expression"][0]);
1166 QString sSeparator(
"*");
1167 QStringList strTokens = sCubeExpr.split(sSeparator, QString::SkipEmptyParts);
1169 int iTokenSize = (int)strTokens.size();
1177 for (
int i = (iNumCubes - 1); i >= 0; i--) {
1181 for (
int j = (iTokenSize - 1); j >= 0; j--) {
1182 int iLen = strTokens[j].length();
1184 int found = sSerialNum.indexOf(strTokens[j], iPosition);
1186 iPosition = found + iLen;
1188 if (j == (iTokenSize - 1)) {
1206 for (
int i = 0; i < iNumCubes; i++) {
1212 << imgStats[imgTotalPoints] <<
", " << imgStats[imgIgnoredPoints] <<
", " << imgStats[imgLockedPoints] <<
", "
1213 << imgStats[imgFixedPoints] <<
", " << imgStats[imgConstrainedPoints] <<
", " << imgStats[imgFreePoints] <<
", "
1214 << imgStats[imgConvexHullRatio]<< endl;
1229 int iLessPoints = VALID_MAX2, iGreaterPoints = 0;
1231 if (pvlGrp[
"LessThan"][0] !=
"") {
1232 iLessPoints =
toInt(pvlGrp[
"LessThan"][0]);
1236 if (pvlGrp[
"GreaterThan"][0] !=
"") {
1237 iGreaterPoints =
toInt(pvlGrp[
"GreaterThan"][0]);
1241 if (iLessPoints < 0 || iGreaterPoints < 0 || iLessPoints < iGreaterPoints) {
1242 QString sErrMsg =
"Invalid Deffile - Check Cube_NumPoints Group\n";
1253 for (
int sn = (iNumCubes - 1); sn >= 0; sn--) {
1256 double numPoints = imgStats[imgTotalPoints];
1257 if (numPoints < iGreaterPoints || numPoints > iLessPoints){
1261 else if (pbLastFilter) {
1263 << imgStats[imgTotalPoints] <<
", " << imgStats[imgIgnoredPoints] <<
", " << imgStats[imgLockedPoints] <<
", "
1264 << imgStats[imgFixedPoints] <<
", " << imgStats[imgConstrainedPoints] <<
", " << imgStats[imgFreePoints] <<
", "
1265 << imgStats[imgConvexHullRatio] << endl;
1283 double dDistance = 0;
1284 QString sUnits =
"pixels";
1287 if (pvlGrp[
"MaxDistance"][0] !=
"") {
1288 dDistance = pvlGrp[
"MaxDistance"];
1293 sUnits = pvlGrp[
"Units"][0];
1296 if (dDistance <= 0) {
1297 string sErrMsg =
"Invalid Deffile - Check Cube_Distance Group\n";
1304 mOstm <<
"Distance_PointIDs >>, " << endl;
1308 for (
int sn = (iNumCubes - 1); sn >= 0; sn--) {
1313 bool bMatchDistance =
false;
1315 std::vector <int> sPointIndex1;
1316 std::vector <int> sPointIndex2;
1317 std::vector <double> dPointDistance;
1320 int iPointsTotal = 0;
1321 int iPointsIgnored = 0;
1322 int iPointsFixed = 0;
1323 int iPointsConstrained = 0;
1324 int iPointsFree = 0;
1325 int iPointsLocked = 0;
1328 sPointIndex1.clear();
1329 sPointIndex2.clear();
1330 dPointDistance.clear();
1333 for (
int i = 0; i < iNumPoints; i++) {
1336 bool bImageFound =
false;
1337 int iNumMeasures1 = cPoint1->GetNumMeasures();
1338 for (
int j = 0; j < iNumMeasures1; j++) {
1342 if (cPoint1->IsIgnored()) {
1349 iPointsConstrained++;
1354 if (cPoint1->IsEditLocked()) {
1368 double dRadius = 0, dLat1 = 0, dLon1 = 0;
1369 if (sUnits ==
"meters") {
1371 if (cam->SetImage(cMeasure1->GetSample(), cMeasure1->GetLine())) {
1372 dRadius = cam->LocalRadius().meters();
1373 dLat1 = cam->UniversalLatitude();
1374 dLon1 = cam->UniversalLongitude();
1380 for (
int k = (i + 1); k < iNumPoints; k++) {
1382 int iNumMeasures2 = cPoint2->GetNumMeasures();
1384 bool bImageFound2 =
false;
1386 for (
int j = 0; j < iNumMeasures2; j++) {
1389 bImageFound2 =
true;
1393 if (!bImageFound2 ||
1394 (cMeasure2->GetSample() == 0 && cMeasure2->GetLine() == 0))
1397 if (sUnits ==
"pixels") {
1398 double dDeltaSamp = cMeasure1->GetSample() - cMeasure2->GetSample();
1399 double dDeltaLine = cMeasure1->GetLine() - cMeasure2->GetLine();
1401 dDist = sqrt((dDeltaSamp * dDeltaSamp) + (dDeltaLine * dDeltaLine));
1406 double dLat2 = 0, dLon2 = 0;
1407 if (cam->SetImage(cMeasure2->GetSample(), cMeasure2->GetLine())) {
1408 dLat2 = cam->UniversalLatitude();
1409 dLon2 = cam->UniversalLongitude();
1426 if (!dDist || dDist >= dDistance) {
1430 bMatchDistance =
true;
1431 sPointIndex1.push_back(i);
1432 sPointIndex2.push_back(k);
1433 dPointDistance.push_back(dDist);
1441 if (!bMatchDistance) {
1445 else if (pbLastFilter) {
1448 << iPointsTotal <<
", " << iPointsIgnored <<
", " << iPointsLocked <<
", "
1449 << iPointsFixed <<
", " << iPointsConstrained <<
", " << iPointsFree <<
", "
1450 << imgStats[ imgConvexHullRatio] <<
", ";
1451 for (
int j = 0; j < (int)sPointIndex1.size(); j++) {
1452 QString sPointIDDist =
toString(dPointDistance[j]);
1453 sPointIDDist +=
"#";
1454 sPointIDDist += (*mCNet)[sPointIndex1[j]]->GetId();
1455 sPointIDDist +=
"#";
1456 sPointIDDist += (*mCNet)[sPointIndex2[j]]->GetId();
1458 mOstm << sPointIDDist <<
",";