From 88ddeddca6a2d12cd39a12b663a1c02a9fa1d67f Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 3 Jun 2020 18:46:25 +0200 Subject: [PATCH] Add support for two Stimplan file formats (#6015) #5990 XML import : Support two Stimplan file formats --- .../Application/RiaApplication.cpp | 21 +- .../Application/RiaPreferences.cpp | 11 + ApplicationCode/Application/RiaPreferences.h | 2 + .../FileInterface/RifStimPlanXmlReader.cpp | 153 ++++-- .../RigStimPlanFractureDefinition.cpp | 36 +- .../RigStimPlanFractureDefinition.h | 16 +- .../UnitTests/CMakeLists_files.cmake | 1 + .../UnitTests/RifStimPlanXmlReader-Test.cpp | 83 +++ .../RifStimPlanXmlReader/contour_Metric.xml | 489 ++++++++++++++++++ .../RifStimPlanXmlReader/small_fracture.xml | 24 + 10 files changed, 783 insertions(+), 53 deletions(-) create mode 100644 ApplicationCode/UnitTests/RifStimPlanXmlReader-Test.cpp create mode 100644 ApplicationCode/UnitTests/TestData/RifStimPlanXmlReader/contour_Metric.xml create mode 100644 ApplicationCode/UnitTests/TestData/RifStimPlanXmlReader/small_fracture.xml diff --git a/ApplicationCode/Application/RiaApplication.cpp b/ApplicationCode/Application/RiaApplication.cpp index fa97709283..d2d87f4849 100644 --- a/ApplicationCode/Application/RiaApplication.cpp +++ b/ApplicationCode/Application/RiaApplication.cpp @@ -334,7 +334,7 @@ bool RiaApplication::openFile( const QString& fileName ) } else if ( int( fileType ) & int( RiaDefines::ImportFileType::ANY_ECLIPSE_FILE ) ) { - loadingSucceded = RicImportGeneralDataFeature::openEclipseFilesFromFileNames( QStringList{ fileName }, true ); + loadingSucceded = RicImportGeneralDataFeature::openEclipseFilesFromFileNames( QStringList{fileName}, true ); lastUsedDialogTag = RiaDefines::defaultDirectoryLabel( fileType ); } @@ -1373,9 +1373,14 @@ int RiaApplication::launchUnitTests() // // Use the gtest filter to execute a subset of tests - //::testing::GTEST_FLAG( filter ) = "*RifCaseRealizationParametersReaderTest*"; - // - // + QString filterText = RiaPreferences::current()->gtestFilter(); + if ( !filterText.isEmpty() ) + { + ::testing::GTEST_FLAG( filter ) = filterText.toLatin1(); + + // Example on filter syntax + //::testing::GTEST_FLAG( filter ) = "*RifCaseRealizationParametersReaderTest*"; + } // Use this macro in main() to run all tests. It returns 0 if all // tests are successful, or 1 otherwise. @@ -1825,8 +1830,10 @@ bool RiaApplication::generateCode( const QString& fileName, QString* errMsg ) out << "+++ \n"; out << "# Introduction\n\n"; - out << "As the Python interface is growing release by release, we are investigating how to automate " - "the building of reference documentation. This document is not complete, but will improve as " + out << "As the Python interface is growing release by release, we are investigating how to " + "automate " + "the building of reference documentation. This document is not complete, but will improve " + "as " "the automation " "moves forward.\n"; @@ -1838,7 +1845,7 @@ bool RiaApplication::generateCode( const QString& fileName, QString* errMsg ) std::vector> commandObjects; - QStringList excludedClassNames{ "TestCommand1", "TC2" }; // See RifCommandCore-Text.cpp + QStringList excludedClassNames{"TestCommand1", "TC2"}; // See RifCommandCore-Text.cpp auto allObjects = caf::PdmMarkdownBuilder::createAllObjects( caf::PdmDefaultObjectFactory::instance() ); for ( auto classObject : allObjects ) diff --git a/ApplicationCode/Application/RiaPreferences.cpp b/ApplicationCode/Application/RiaPreferences.cpp index 561a8f0abd..a78c0717c8 100644 --- a/ApplicationCode/Application/RiaPreferences.cpp +++ b/ApplicationCode/Application/RiaPreferences.cpp @@ -369,6 +369,8 @@ RiaPreferences::RiaPreferences( void ) CAF_PDM_InitField( &m_openExportedPdfInViewer, "openExportedPdfInViewer", false, "Open Exported PDF in Viewer", "", "", "" ); m_openExportedPdfInViewer.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); + + CAF_PDM_InitField( &m_gtestFilter, "gtestFilter", QString(), "Unit Test Filter (gtest)", "", "", "" ); } //-------------------------------------------------------------------------------------------------- @@ -566,6 +568,7 @@ void RiaPreferences::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& group->add( &m_showHud ); } + uiOrdering.add( &m_gtestFilter ); uiOrdering.add( &m_showProgressBar ); uiOrdering.add( &m_showProjectChangedDialog ); uiOrdering.add( &m_showTestToolbar ); @@ -833,6 +836,14 @@ bool RiaPreferences::show3dInformation() const return RiaApplication::enableDevelopmentFeatures() && m_showHud(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaPreferences::gtestFilter() const +{ + return m_gtestFilter(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Application/RiaPreferences.h b/ApplicationCode/Application/RiaPreferences.h index 58cb09db56..8f86942315 100644 --- a/ApplicationCode/Application/RiaPreferences.h +++ b/ApplicationCode/Application/RiaPreferences.h @@ -91,6 +91,7 @@ public: QString holoLensExportFolder() const; bool useShaders() const; bool show3dInformation() const; + QString gtestFilter() const; const QString& dateFormat() const; const QString& timeFormat() const; @@ -199,6 +200,7 @@ private: caf::PdmField m_showSummaryTimeAsLongString; caf::PdmField m_useMultipleThreadsWhenLoadingSummaryData; caf::PdmField m_showProgressBar; + caf::PdmField m_gtestFilter; caf::PdmField m_pageSize; caf::PdmField m_pageOrientation; diff --git a/ApplicationCode/FileInterface/RifStimPlanXmlReader.cpp b/ApplicationCode/FileInterface/RifStimPlanXmlReader.cpp index 9e0e72b1c5..9ef44fa6a2 100644 --- a/ApplicationCode/FileInterface/RifStimPlanXmlReader.cpp +++ b/ApplicationCode/FileInterface/RifStimPlanXmlReader.cpp @@ -104,13 +104,18 @@ cvf::ref QString unit; RiaLogging::info( QString( "Properties available in file:" ) ); - while ( !xmlStream2.atEnd() ) + int propertiesElementCount = 0; + while ( !xmlStream2.atEnd() && propertiesElementCount < 2 ) { xmlStream2.readNext(); if ( xmlStream2.isStartElement() ) { - if ( xmlStream2.name() == "property" ) + if ( xmlStream2.name() == "properties" ) + { + propertiesElementCount++; + } + else if ( xmlStream2.name() == "property" ) { unit = getAttributeValueString( xmlStream2, "uom" ); parameter = getAttributeValueString( xmlStream2, "name" ); @@ -183,8 +188,15 @@ void RifStimPlanXmlReader::readStimplanGridAndTimesteps( QXmlStreamReader& xmlStream.readNext(); + double tvdToTopPerf = HUGE_VAL; + double tvdToBotPerf = HUGE_VAL; + double mdToTopPerf = HUGE_VAL; + double mdToBotPerf = HUGE_VAL; + + int gridSectionCount = 0; + // First, read time steps and grid to establish data structures for putting data into later. - while ( !xmlStream.atEnd() ) + while ( !xmlStream.atEnd() && gridSectionCount < 2 ) { xmlStream.readNext(); @@ -194,38 +206,65 @@ void RifStimPlanXmlReader::readStimplanGridAndTimesteps( QXmlStreamReader& if ( xmlStream.name() == "grid" ) { - gridunit = getAttributeValueString( xmlStream, "uom" ); - - if ( gridunit == "m" ) - stimPlanFileData->m_unitSet = RiaEclipseUnitTools::UnitSystem::UNITS_METRIC; - else if ( gridunit == "ft" ) - stimPlanFileData->m_unitSet = RiaEclipseUnitTools::UnitSystem::UNITS_FIELD; - else - stimPlanFileData->m_unitSet = RiaEclipseUnitTools::UnitSystem::UNITS_UNKNOWN; - - if ( destinationUnit == RiaEclipseUnitTools::UnitSystem::UNITS_UNKNOWN ) + // Support for one grid per file + if ( gridSectionCount < 1 ) { - // Use file unit set if requested unit is unknown - destinationUnit = stimPlanFileData->m_unitSet; + gridunit = getAttributeValueString( xmlStream, "uom" ); + + if ( gridunit == "m" ) + stimPlanFileData->m_unitSet = RiaEclipseUnitTools::UnitSystem::UNITS_METRIC; + else if ( gridunit == "ft" ) + stimPlanFileData->m_unitSet = RiaEclipseUnitTools::UnitSystem::UNITS_FIELD; + else + stimPlanFileData->m_unitSet = RiaEclipseUnitTools::UnitSystem::UNITS_UNKNOWN; + + if ( destinationUnit == RiaEclipseUnitTools::UnitSystem::UNITS_UNKNOWN ) + { + // Use file unit set if requested unit is unknown + destinationUnit = stimPlanFileData->m_unitSet; + } + + double tvdToTopPerfFt = getAttributeValueDouble( xmlStream, "TVDToTopPerfFt" ); + double tvdToBotPerfFt = getAttributeValueDouble( xmlStream, "TVDToBottomPerfFt" ); + + tvdToTopPerf = + RifStimPlanXmlReader::valueInRequiredUnitSystem( RiaEclipseUnitTools::UnitSystem::UNITS_FIELD, + destinationUnit, + tvdToTopPerfFt ); + tvdToBotPerf = + RifStimPlanXmlReader::valueInRequiredUnitSystem( RiaEclipseUnitTools::UnitSystem::UNITS_FIELD, + destinationUnit, + tvdToBotPerfFt ); } - double tvdToTopPerfFt = getAttributeValueDouble( xmlStream, "TVDToTopPerfFt" ); - double tvdToBotPerfFt = getAttributeValueDouble( xmlStream, "TVDToBottomPerfFt" ); - - double tvdToTopPerfRequestedUnit = - RifStimPlanXmlReader::valueInRequiredUnitSystem( RiaEclipseUnitTools::UnitSystem::UNITS_FIELD, - destinationUnit, - tvdToTopPerfFt ); - double tvdToBotPerfRequestedUnit = - RifStimPlanXmlReader::valueInRequiredUnitSystem( RiaEclipseUnitTools::UnitSystem::UNITS_FIELD, - destinationUnit, - tvdToBotPerfFt ); - - stimPlanFileData->setTvdToTopPerf( tvdToTopPerfRequestedUnit ); - stimPlanFileData->setTvdToBottomPerf( tvdToBotPerfRequestedUnit ); + gridSectionCount++; } - - if ( xmlStream.name() == "xs" ) + else if ( xmlStream.name() == "perf" ) + { + QString perfUnit = getAttributeValueString( xmlStream, "uom" ); + QString fracName = getAttributeValueString( xmlStream, "frac" ); + } + else if ( xmlStream.name() == "topTVD" ) + { + auto valText = xmlStream.readElementText(); + tvdToTopPerf = valText.toDouble(); + } + else if ( xmlStream.name() == "bottomTVD" ) + { + auto valText = xmlStream.readElementText(); + tvdToBotPerf = valText.toDouble(); + } + else if ( xmlStream.name() == "topMD" ) + { + auto valText = xmlStream.readElementText(); + mdToTopPerf = valText.toDouble(); + } + else if ( xmlStream.name() == "bottomMD" ) + { + auto valText = xmlStream.readElementText(); + mdToBotPerf = valText.toDouble(); + } + else if ( xmlStream.name() == "xs" ) { std::vector gridValuesXs; { @@ -243,7 +282,6 @@ void RifStimPlanXmlReader::readStimplanGridAndTimesteps( QXmlStreamReader& stimPlanFileData->generateXsFromFileXs( mirrorMode == MIRROR_AUTO ? !hasNegativeValues( gridValuesXs ) : (bool)mirrorMode ); } - else if ( xmlStream.name() == "ys" ) { std::vector gridValuesYs; @@ -273,6 +311,26 @@ void RifStimPlanXmlReader::readStimplanGridAndTimesteps( QXmlStreamReader& } } + if ( tvdToTopPerf != HUGE_VAL ) + { + stimPlanFileData->setTvdToTopPerf( tvdToTopPerf ); + } + + if ( tvdToBotPerf != HUGE_VAL ) + { + stimPlanFileData->setTvdToBottomPerf( tvdToBotPerf ); + } + + if ( mdToTopPerf != HUGE_VAL ) + { + stimPlanFileData->setMdToTopPerf( mdToTopPerf ); + } + + if ( mdToBotPerf != HUGE_VAL ) + { + stimPlanFileData->setMdToBottomPerf( mdToBotPerf ); + } + if ( startNegValuesYs > 0 ) { RiaLogging::error( QString( "Negative depth values detected in XML file" ) ); @@ -297,19 +355,30 @@ std::vector> RifStimPlanXmlReader::getAllDepthDataAtTimeStep xmlStream.readNext(); // read end depth token xmlStream.readNext(); // read cdata section with values + + QString depthDataStr; if ( xmlStream.isCDATA() ) { - QString depthDataStr = xmlStream.text().toString(); - QStringList splitted = depthDataStr.split( ' ' ); - for ( int i = 0; i < splitted.size(); i++ ) + depthDataStr = xmlStream.text().toString(); + } + else + { + QString gridValuesString = xmlStream.readElementText().replace( '\n', ' ' ); + gridValuesString = gridValuesString.replace( '[', ' ' ).replace( ']', ' ' ); + + depthDataStr = gridValuesString; + } + + QStringList splitted = depthDataStr.split( ' ' ); + for ( int i = 0; i < splitted.size(); i++ ) + { + QString value = splitted[i]; + if ( value != "" ) { - QString value = splitted[i]; - if ( value != "" ) - { - propertyValuesAtDepth.push_back( value.toDouble() ); - } + propertyValuesAtDepth.push_back( value.toDouble() ); } } + propertyValuesAtTimestep.push_back( propertyValuesAtDepth ); } } @@ -378,7 +447,9 @@ void RifStimPlanXmlReader::getGriddingValues( QXmlStreamReader& xmlStream, size_t& startNegValues ) { QString gridValuesString = xmlStream.readElementText().replace( '\n', ' ' ); - for ( QString value : gridValuesString.split( ' ' ) ) + gridValuesString = gridValuesString.replace( '[', ' ' ).replace( ']', ' ' ); + + for ( QString value : gridValuesString.split( ' ', QString::SkipEmptyParts ) ) { if ( value.size() > 0 ) { diff --git a/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp b/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp index 62cd74a7d9..e781844b07 100644 --- a/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp +++ b/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp @@ -46,9 +46,11 @@ const double RigStimPlanFractureDefinition::THRESHOLD_VALUE = 1e-5; //-------------------------------------------------------------------------------------------------- RigStimPlanFractureDefinition::RigStimPlanFractureDefinition() : m_unitSet( RiaEclipseUnitTools::UnitSystem::UNITS_UNKNOWN ) + , m_xMirrorMode( false ) , m_topPerfTvd( HUGE_VAL ) , m_bottomPerfTvd( HUGE_VAL ) - , m_xMirrorMode( false ) + , m_topPerfMd( HUGE_VAL ) + , m_bottomPerfMd( HUGE_VAL ) { } @@ -171,6 +173,38 @@ void RigStimPlanFractureDefinition::setTvdToBottomPerf( double bottomPerfTvd ) m_bottomPerfTvd = bottomPerfTvd; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigStimPlanFractureDefinition::topPerfMd() const +{ + return m_topPerfMd; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigStimPlanFractureDefinition::bottomPerfMd() const +{ + return m_bottomPerfMd; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigStimPlanFractureDefinition::setMdToTopPerf( double topPerfMd ) +{ + m_topPerfMd = topPerfMd; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigStimPlanFractureDefinition::setMdToBottomPerf( double bottomPerfMd ) +{ + m_bottomPerfMd = bottomPerfMd; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.h b/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.h index 2e76ce31f5..84da7f1f74 100644 --- a/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.h +++ b/ApplicationCode/ReservoirDataModel/RigStimPlanFractureDefinition.h @@ -64,10 +64,16 @@ public: size_t yCount() const; double minDepth() const; double maxDepth() const; - double topPerfTvd() const; - double bottomPerfTvd() const; - void setTvdToTopPerf( double topPerfTvd ); - void setTvdToBottomPerf( double bottomPerfTvd ); + + double topPerfTvd() const; + double bottomPerfTvd() const; + void setTvdToTopPerf( double topPerfTvd ); + void setTvdToBottomPerf( double bottomPerfTvd ); + + double topPerfMd() const; + double bottomPerfMd() const; + void setMdToTopPerf( double topPerfMd ); + void setMdToBottomPerf( double bottomPerfMd ); cvf::ref createFractureGrid( const QString& resultName, int activeTimeStepIndex, @@ -131,4 +137,6 @@ private: double m_topPerfTvd; double m_bottomPerfTvd; + double m_topPerfMd; + double m_bottomPerfMd; }; diff --git a/ApplicationCode/UnitTests/CMakeLists_files.cmake b/ApplicationCode/UnitTests/CMakeLists_files.cmake index a602fdbfd7..2aa216db69 100644 --- a/ApplicationCode/UnitTests/CMakeLists_files.cmake +++ b/ApplicationCode/UnitTests/CMakeLists_files.cmake @@ -69,6 +69,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RifSurfaceReader-Test.cpp ${CMAKE_CURRENT_LIST_DIR}/RifColorLegendData-Test.cpp ${CMAKE_CURRENT_LIST_DIR}/RifRoffReader-Test.cpp ${CMAKE_CURRENT_LIST_DIR}/RifFaciesPropertiesReader-Test.cpp +${CMAKE_CURRENT_LIST_DIR}/RifStimPlanXmlReader-Test.cpp ) if (RESINSIGHT_ENABLE_GRPC) diff --git a/ApplicationCode/UnitTests/RifStimPlanXmlReader-Test.cpp b/ApplicationCode/UnitTests/RifStimPlanXmlReader-Test.cpp new file mode 100644 index 0000000000..accb6ec056 --- /dev/null +++ b/ApplicationCode/UnitTests/RifStimPlanXmlReader-Test.cpp @@ -0,0 +1,83 @@ +#include "gtest/gtest.h" + +#include "RiaTestDataDirectory.h" + +#include "RifStimPlanXmlReader.h" +#include "RigStimPlanFractureDefinition.h" + +static const QString CASE_REAL_TEST_DATA_DIRECTORY = QString( "%1/RifStimPlanXmlReader/" ).arg( TEST_DATA_DIR ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifStimPlanXmlReaderTest, LoadFile ) +{ + QString fileName = CASE_REAL_TEST_DATA_DIRECTORY + "small_fracture.xml"; + + double conductivityScaleFactor = 1.0; + double halfLengthScaleFactor = 1.0; + double heightScaleFactor = 1.0; + double wellPathDepthAtFracture = 100.0; + RiaEclipseUnitTools::UnitSystem unit = RiaEclipseUnitTools::UnitSystem::UNITS_METRIC; + QString errorMessage; + RifStimPlanXmlReader::MirrorMode mode = RifStimPlanXmlReader::MIRROR_AUTO; + + cvf::ref fractureData; + + fractureData = RifStimPlanXmlReader::readStimPlanXMLFile( fileName, + conductivityScaleFactor, + halfLengthScaleFactor, + heightScaleFactor, + -wellPathDepthAtFracture, + mode, + unit, + &errorMessage ); + + EXPECT_TRUE( errorMessage.isEmpty() ); + EXPECT_TRUE( fractureData.notNull() ); + + size_t xSamplesIncludingMirrorValues = 7; + EXPECT_EQ( xSamplesIncludingMirrorValues, fractureData->xCount() ); + EXPECT_EQ( size_t( 5 ), fractureData->yCount() ); + EXPECT_EQ( size_t( 1 ), fractureData->timeSteps().size() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifStimPlanXmlReaderTest, LoadFileNewFormat ) +{ + QString fileName = CASE_REAL_TEST_DATA_DIRECTORY + "contour_Metric.xml"; + + double conductivityScaleFactor = 1.0; + double halfLengthScaleFactor = 1.0; + double heightScaleFactor = 1.0; + double wellPathDepthAtFracture = 100.0; + RiaEclipseUnitTools::UnitSystem unit = RiaEclipseUnitTools::UnitSystem::UNITS_METRIC; + QString errorMessage; + RifStimPlanXmlReader::MirrorMode mode = RifStimPlanXmlReader::MIRROR_AUTO; + + cvf::ref fractureData; + + fractureData = RifStimPlanXmlReader::readStimPlanXMLFile( fileName, + conductivityScaleFactor, + halfLengthScaleFactor, + heightScaleFactor, + -wellPathDepthAtFracture, + mode, + unit, + &errorMessage ); + + EXPECT_TRUE( errorMessage.isEmpty() ); + EXPECT_TRUE( fractureData.notNull() ); + + size_t xSamplesIncludingMirrorValues = 49; + EXPECT_EQ( xSamplesIncludingMirrorValues, fractureData->xCount() ); + EXPECT_EQ( size_t( 23 ), fractureData->yCount() ); + EXPECT_EQ( size_t( 1 ), fractureData->timeSteps().size() ); + + EXPECT_DOUBLE_EQ( 2773.680, fractureData->topPerfTvd() ); + EXPECT_DOUBLE_EQ( 2773.680, fractureData->bottomPerfTvd() ); + EXPECT_DOUBLE_EQ( 2804.160, fractureData->topPerfMd() ); + EXPECT_DOUBLE_EQ( 2804.770, fractureData->bottomPerfMd() ); +} diff --git a/ApplicationCode/UnitTests/TestData/RifStimPlanXmlReader/contour_Metric.xml b/ApplicationCode/UnitTests/TestData/RifStimPlanXmlReader/contour_Metric.xml new file mode 100644 index 0000000000..9ea8d4d888 --- /dev/null +++ b/ApplicationCode/UnitTests/TestData/RifStimPlanXmlReader/contour_Metric.xml @@ -0,0 +1,489 @@ + + + + [0.000 9.144 18.288 27.432 36.576 45.720 54.864 64.008 73.152 82.296 91.440 100.584 109.728 118.872 128.016 137.160 146.304 155.448 164.592 173.736 182.880 192.024 201.168 210.312 219.456 ] + [2858.516 2849.880 2841.244 2832.608 2823.972 2820.665 2817.358 2808.321 2799.283 2794.284 2789.286 2781.188 2773.091 2764.993 2760.345 2755.697 2751.277 2746.858 2738.323 2729.789 2721.254 2712.720 2704.186 ] + + + 2773.680 + 2773.680 + 2804.160 + 2804.770 + + + + + + + + + + + + + + [0.000 9.144 18.288 27.432 36.576 45.720 54.864 64.008 73.152 82.296 91.440 100.584 109.728 118.872 128.016 137.160 146.304 155.448 164.592 173.736 182.880 192.024 201.168 210.312 219.456 ] + [2858.516 2849.880 2841.244 2832.608 2823.972 2820.665 2817.358 2808.321 2799.283 2794.284 2789.286 2781.188 2773.091 2764.993 2760.345 2755.697 2751.277 2746.858 2738.323 2729.789 2721.254 2712.720 2704.186 ] + + + 2773.680 + 2773.680 + 2819.400 + 2820.010 + + + + + + + + + + + + + + [0.000 9.144 18.288 27.432 36.576 45.720 54.864 64.008 73.152 82.296 91.440 100.584 109.728 118.872 128.016 137.160 146.304 155.448 164.592 173.736 182.880 192.024 201.168 210.312 219.456 ] + [2858.516 2849.880 2841.244 2832.608 2823.972 2820.665 2817.358 2808.321 2799.283 2794.284 2789.286 2781.188 2773.091 2764.993 2760.345 2755.697 2751.277 2746.858 2738.323 2729.789 2721.254 2712.720 2704.186 ] + + + 2773.680 + 2773.680 + 2834.640 + 2835.250 + + + + + + + + + + + + + diff --git a/ApplicationCode/UnitTests/TestData/RifStimPlanXmlReader/small_fracture.xml b/ApplicationCode/UnitTests/TestData/RifStimPlanXmlReader/small_fracture.xml new file mode 100644 index 0000000000..7f0de1b158 --- /dev/null +++ b/ApplicationCode/UnitTests/TestData/RifStimPlanXmlReader/small_fracture.xml @@ -0,0 +1,24 @@ + + + + + + + + + + +