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;