00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _SO_VR_SEGY_FILE_READER_
00024 #define _SO_VR_SEGY_FILE_READER_
00025
00026 #include <LDM/readers/SoVolumeReader.h>
00027 #include <VolumeViz/readers/SoVRSegyReader.h>
00028 #include <Inventor/STL/vector>
00029 #include <VolumeViz/nodes/SoVolumeData.h>
00030
00031 #ifdef _WIN32
00032 #pragma warning( push )
00033 #pragma warning(disable:4251)
00034 #endif
00035
00120 class SoVRSegyFileReader : public SoVolumeReader
00121 {
00122 SO_FIELDCONTAINER_HEADER(SoVRSegyFileReader);
00123
00124 public:
00128 SoVRSegyFileReader();
00129
00136 virtual ReadError getDataChar( SbBox3f &size, SoDataSet::DataType &type, SbVec3i32 &dim );
00137
00144 virtual void getSubSlice( const SbBox2i32& subSlice, int sliceNumber, void * data );
00145
00151 virtual SbBool setDirectCoordSysAutoDetection(SbBool autoValue);
00152
00160 static void setVolumeSizeVoxels(SbBool flag);
00161
00165 virtual ReaderType getReaderType ()
00166 {return SEGY;};
00167
00168
00171
00172
00173
00178 virtual int setFilename( const SbString& filename );
00179
00181 enum SegyScanningResp {
00182 SCAN_CONTINUE,
00183 SCAN_ABORT
00184 };
00185
00189 typedef SegyScanningResp SoSegyScanningCB( void *data, float percent, SoVRSegyFileReader *reader );
00190
00199 void setScanningProgressCallback( SoSegyScanningCB *func, void *data );
00200
00203
00204
00205
00210 virtual void setSegyTextHeaderAscii( bool ascii );
00211
00215 virtual SbString getSegyTextHeader();
00216
00219
00220
00221
00223 enum SegyByteOrder {
00225 SEGY_LITTLE_ENDIAN,
00227 SEGY_BIG_ENDIAN
00228 };
00237 virtual void setSegyByteOrder( SegyByteOrder byteOrder );
00241 virtual SegyByteOrder getSegyByteOrder();
00242
00256 virtual SbBool setSegyFileHeader( const SoVRSegyFileHeader &fileHeader );
00257
00269 virtual SbBool getSegyFileHeader( SoVRSegyFileHeader& fileHeader, bool readFile = false );
00270
00273
00274
00275
00280 virtual void setSegyTraceHeaderBytePosition( const SoVRSegyTraceHeaderBytePosition &traceHeaderBytePosition );
00284 virtual SoVRSegyTraceHeaderBytePosition getSegyTraceHeaderBytePosition();
00285
00292 virtual int getNumTraces();
00293
00302 virtual SbBool getSegyTraceHeader( int traceNumber, SoVRSegyTraceIdHeader& traceHeader );
00303
00307
00308
00309
00312
00313
00314
00320 virtual SbBool isSegyRegular();
00321
00328 virtual void setCrosslineRange( int from, int to, int step );
00335 virtual void setInlineRange( int from, int to, int step );
00342 virtual void setZRange( int from, int to, int step );
00349 virtual void getCrosslineRange( int &from, int &to, int &step );
00358 virtual void getInlineRange( int &from, int &to, int &step );
00365 virtual void getZRange( int &from, int &to, int &step );
00366
00369
00370
00371
00379 virtual SbBool getP1P2P3Coordinates( SbVec2d &P1, SbVec2d &P2, SbVec2d &P3, SbVec2d &P4 );
00380
00391 virtual SbBool setDirectCoorSys( SbBool directCoord );
00392
00394 enum SegyAxisOrder {
00396 XYZ_AS_SAMPLE_INLINE_CROSSLINE,
00398 XYZ_AS_INLINE_CROSSLINE_SAMPLE
00399 };
00400
00415 virtual void setSegyAxisOrder( SegyAxisOrder axisOrder );
00416
00421 virtual SegyAxisOrder getSegyAxisOrder();
00422
00425
00426
00427
00445 virtual int getSegyTraceData( int traceNumber, void* &traceData, int start = 0, int size = -1 );
00446
00447
00448
00449
00450 bool getTraceCoord(const int i, const int j, SbVec2d & P );
00451
00454
00455
00456
00463 virtual SbBool setOutputDataType( SbBool doChange, SoDataSet::DataType type );
00464
00473 virtual SbBool setInputDataRange( SbBool doChange, double min, double max );
00474
00475
00476
00479
00480 private:
00481
00482
00483
00484
00485 static void ibm2ieee( int numValues, void* ibm2ieeeBuffer );
00486
00487 private:
00488
00489 SoSegyScanningCB *m_scanningCBfunc;
00490 void *m_scanningCBdata;
00491
00492
00493 bool m_textHeaderAscii;
00494
00495
00496 SegyByteOrder m_byteOrder;
00497 bool m_byteOrderSet;
00498 bool m_swapBytes;
00499 bool m_swapBytesData;
00500 SoVRSegyFileHeader m_binHeader;
00501 bool m_binHeaderSet;
00502
00503
00504 SoVRSegyTraceHeaderBytePosition m_trHdrBytePos;
00505 bool m_trHdrBytePosSet;
00506
00507
00508 bool m_crosslineRangeSet;
00509 int m_crosslineFrom, m_crosslineTo, m_crosslineStep;
00510 bool m_inlineRangeSet;
00511 int m_inlineFrom, m_inlineTo, m_inlineStep;
00512 bool m_zRangeSet;
00513 int m_zFrom, m_zTo, m_zStep;
00514
00515
00516 SegyAxisOrder m_axisOrder;
00517
00518
00519 bool m_changeFormat;
00520 SoDataSet::DataType m_typeOut;
00521 bool m_dataRangeSet;
00522 double m_dataRangeMin, m_dataRangeMax;
00523
00524
00525 SoVolumeReader::ReadError getDataChar1();
00526 bool m_dataChar1;
00527 SoVRSegyFileHeader m_wkHeader;
00528 int m_headerSize;
00529 int m_format;
00530 SbString m_typeStr;
00531 SoDataSet::DataType m_type;
00532 int m_bytesPerVoxel;
00533 bool m_constantTraceLength;
00534 unsigned int m_numSamplesPerTrace;
00535 unsigned int m_numTracesPerLine;
00536 unsigned int m_numLines;
00537 int64_t m_numTraces;
00538
00539
00540 SoVolumeReader::ReadError getDataChar2(int t = -1);
00541 bool m_dataChar2;
00542 std::vector<int64_t> m_traceOffset;
00543 std::vector<int> m_traceLength;
00544
00545
00546 SbVec3i32 m_dim;
00547
00548
00549 SoVolumeReader::ReadError getDataChar3();
00550 bool m_dataChar3;
00551 bool m_regularTraceNum;
00552
00553
00554
00555 std::vector<int> m_lineTraceStart;
00556 std::vector<int> m_lineTraceMin;
00557 std::vector<int> m_lineTraceMax;
00558
00559 private:
00560 using SoVolumeReader::getDataChar;
00561 using SoVolumeReader::getSubSlice;
00562
00563
00564
00565 SbBool m_floatIsIEEE;
00566 static bool m_isVolumeSizeVoxels ;
00567
00568 int getTraceNum( const int, const int );
00569 void resetObject();
00570 bool searchForPoint( const int which, int & i, int & j, SbVec2d & P );
00571 void extrapolatePoint( SbVec2d & P0, int & i0, int & j0,
00572 const SbVec2d & Px, int ix, int jx,
00573 const SbVec2d & Py, int iy, int jy,
00574 int newi0, int newj0 );
00575 float evaluateValuesValidity( const int num_values, const float *values );
00576 float evaluateValuesCorrelation( const int trace, const int format1, const bool swap1, const int format2, const bool swap2 );
00577
00578 };
00579
00580 #ifdef _WIN32
00581 #pragma warning( pop )
00582 #endif
00583
00584 #endif // _SO_VR_SEGY_FILE_READER_
00585
00586
00587