The MrSID Decode SDK includes code samples that demonstrate the use of the SDK's different interfaces.
The following C++ (.cpp) files are located in your examples/src directory.
UserTutorial.cpp |
Opening MG4 files Using the PointIterator to access the point cloud Using PointSource::read() to access a fixed number of points |
DumpMG4Info.cpp |
Accessing the point cloud properties Displaying metadata |
DecodeMG4ToTXT.cpp |
Using a PointWriter class |
IterateOverPoints.cpp |
Using a PointIterator Accessing channel values from a PointData object |
support.cpp |
Using the FileIO class |
UserTest.cpp | Enables you to add your own test code to explore the SDK |
Below, we walk through the UserTutorial.cpp example.
The following code opens an MG4 file:
FileIO *file = FileIO::create(); file->init("data/Tetons_200k.sid", "r"); MG4PointReader *pointSource = MG4PointReader::create(); pointSource->init(file); file->release();
Now that the file is initialized, you can access the properties of the point cloud using the following code:
PointSource::count_type numPoints = pointSource->getNumPoints(); size_t numChannels = pointSource->getNumChannels(); const PointInfo &pointInfo = pointSource->getPointInfo(); printf("Number of points: %lld\n", numPoints); printf("Number of channels: %lu\n", numChannels); for(size_t i = 0; i < numChannels; i += 1) printf("Channel %lu: %s\n", i, pointInfo.getChannel(i).getName());
You can use either of the following two methods to access the point cloud. In the first, we use the PointIterator mechanism.
PointData buffer; // create buffers for all the channels 1000 samples long buffer.init(pointInfo, 1000); // create an iterator of the whole point cloud with all the channels PointIterator *iter = pointSource->createIterator(pointSource->getBounds(), 1.0, pointInfo, NULL); size_t count; // walk the iterator while((count = iter->getNextPoints(buffer)) != 0) { // do some thing with this chunk of the point cloud. } iter->release();
The second method extracts a fixed number of points (10,000 in this case):
PointData buffer; { // only decode X, Y, Z PointInfo pointInfo; pointInfo.init(3); pointInfo.getChannel(0).init(*pointSource->getChannel(CHANNEL_NAME_X)); pointInfo.getChannel(1).init(*pointSource->getChannel(CHANNEL_NAME_Y)); pointInfo.getChannel(2).init(*pointSource->getChannel(CHANNEL_NAME_Z)); buffer.init(pointInfo, 10000); } pointSource->read(Bounds::Huge(), buffer, NULL); // do some thing with the points
Now we'll do a little housecleaning. When you're done with your point source, you should release it:
pointSource->release(); pointSource = NULL;