[Liblas-commits] r1113 - in trunk: include/liblas python/liblas
python/tests src
liblas-commits at liblas.org
liblas-commits at liblas.org
Thu Mar 19 00:20:51 EDT 2009
Author: hobu
Date: Thu Mar 19 00:20:50 2009
New Revision: 1113
URL: http://liblas.org/changeset/1113
Log:
stop tracking open readers/writers in order to allow multiple readers to operate on a file #111
Modified:
trunk/include/liblas/lasheader.hpp
trunk/python/liblas/file.py
trunk/python/tests/File.txt
trunk/src/las_c_api.cpp
trunk/src/lasheader.cpp
Modified: trunk/include/liblas/lasheader.hpp
==============================================================================
--- trunk/include/liblas/lasheader.hpp (original)
+++ trunk/include/liblas/lasheader.hpp Thu Mar 19 00:20:50 2009
@@ -385,7 +385,6 @@
PointOffsets m_offsets;
PointExtents m_extents;
std::vector<LASVLR> m_vlrs;
- std::string m_proj4;
LASSRS m_srs;
};
Modified: trunk/python/liblas/file.py
==============================================================================
--- trunk/python/liblas/file.py (original)
+++ trunk/python/liblas/file.py Thu Mar 19 00:20:50 2009
@@ -47,7 +47,8 @@
import os
import types
-files = []
+files = {'append':[], 'write':[],'read':[]}
+import sys
class File(object):
def __init__(self, filename, header=None, mode='r'):
@@ -56,10 +57,18 @@
self.handle = None
self._mode = mode
+ # print self.filename
+ # print sys.stderr.write('%s %s %s'%(files, self.filename, mode))
+ # sys.stderr.flush()
#check in the registry if we already have the file open
- for f in files:
- if f == self.filename:
- raise core.LASException("File %s is already open. Close the file or delete the reference to it", filename)
+ if mode=='r':
+ for f in files['write'] + files['append']:
+ if f == self.filename:
+ raise core.LASException("File %s is already open for write. Close the file or delete the reference to it" % filename)
+ else:
+ for f in files['read']:
+ if f == self.filename:
+ raise core.LASException("File %s is already open for read. Close the file or delete the reference to it" % filename)
self.open()
def open(self):
@@ -67,13 +76,13 @@
self.handle = core.las.LASReader_Create(self.filename)
self.mode = 0
self._header = lasheader.Header(handle = core.las.LASReader_GetHeader(self.handle))
- files.append(self.filename)
+ files['read'].append(self.filename)
if self._mode == 'w' and '+' not in self._mode:
if not self._header:
self._header = lasheader.Header(handle = core.las.LASHeader_Create())
self.handle = core.las.LASWriter_Create(self.filename, self._header.handle, 1)
self.mode = 1
- files.append(self.filename)
+ files['write'].append(self.filename)
if '+' in self._mode and 'r' not in self._mode:
if not self._header:
reader = core.las.LASReader_Create(self.filename)
@@ -81,7 +90,7 @@
core.las.LASReader_Destroy(reader)
self.handle = core.las.LASWriter_Create(self.filename, self._header.handle, 2)
self.mode = 2
- files.append(self.filename)
+ files['append'].append(self.filename)
def __del__(self):
if not self.handle or not core: return
self.close()
@@ -89,9 +98,14 @@
def close(self):
if self.mode == 0 :
core.las.LASReader_Destroy(self.handle)
+ files['read'].remove(self.filename)
else:
+ try:
+ files['append'].remove(self.filename)
+ except:
+ files['write'].remove(self.filename)
core.las.LASWriter_Destroy(self.handle)
- files.remove(self.filename)
+
self._header = None
self.handle = None
Modified: trunk/python/tests/File.txt
==============================================================================
--- trunk/python/tests/File.txt (original)
+++ trunk/python/tests/File.txt Thu Mar 19 00:20:50 2009
@@ -16,6 +16,13 @@
>>> p.x, p.y, p.z
(630320.95999999996, 4834500.0, 55.009999999999998)
+ >>> f2 = file.File('../test/data/TO_core_last_clip.las')
+ >>> p2 = f2.read(6)
+ >>> p.x, p.y, p.z
+ (630320.95999999996, 4834500.0, 55.009999999999998)
+ >>> f2.close()
+ >>> del f2
+
>>> points = []
>>> for i in f:
... points.append(i)
@@ -74,7 +81,7 @@
>>> pts = file.File('junk.las')
Traceback (most recent call last):
...
- LASException: ('File %s is already open. Close the file or delete the reference to it', 'junk.las')
+ LASException: File junk.las is already open for write. Close the file or delete the reference to it
>>> f.close()
>>> f.header
Modified: trunk/src/las_c_api.cpp
==============================================================================
--- trunk/src/las_c_api.cpp (original)
+++ trunk/src/las_c_api.cpp Thu Mar 19 00:20:50 2009
@@ -95,11 +95,6 @@
} LASErrorEnum;
-
-typedef std::map<std::string, LASFile> StrLASFileMap;
-typedef std::map<std::string, LASFile>::const_iterator StrLASFileMapIt;
-
-static StrLASFileMap files;
static std::stack<LASError > errors;
#ifdef _MSC_VER
@@ -186,30 +181,24 @@
VALIDATE_POINTER1(filename, "LASReader_Create", NULL);
try {
- StrLASFileMap::const_iterator p;
-
- p = files.find(filename);
+ std::ios::openmode const mode = std::ios::in | std::ios::binary;
+ std::istream* istrm;
+ if (strncasecmp(filename,"STDIN",5) == 0)
+ {
+ istrm = &std::cin;
+ }
+ else
+ {
+ istrm = new std::ifstream(filename, mode);
+ }
- if (p==files.end()) {
-
- /* FIXME : not freed by LASReader_Destroy */
- LASFile lasfile(filename);
- files[filename] = lasfile;
-
- LASReader* reader = NULL;
- try {
- reader = &(lasfile.GetReader());
- }
- catch (...) {
- files.erase(filename);
- throw std::runtime_error("LASReader_Create rethrowing");
- }
-
- return (LASReaderH) reader;
-
+ if (!istrm->good())
+ {
+ delete istrm;
+ throw std::runtime_error("Reading stream was not able to be created");
}
- LASError_PushError(LE_Failure, "not able to create map entry", "LASReader_Create");
- return NULL;
+ return (LASReaderH) new LASReader(*istrm);
+
} catch (std::exception const& e)
{
@@ -224,49 +213,24 @@
{
VALIDATE_POINTER0(hReader, "LASReader_Destroy");
- StrLASFileMap::iterator p;
- LASReader* reader = (LASReader*)hReader;
-
- for (p=files.begin(); p!=files.end(); ++p) {
- LASFile f = p->second;
-
-
- try {
-
- LASReader& freader = f.GetReader();
-
- try {
- std::ifstream& a = static_cast<std::ifstream&>(freader.GetStream());
- std::ifstream& r = static_cast<std::ifstream&>(reader->GetStream());
- if (&a == &r) {
- files.erase(p);
- hReader = NULL;
- return;
- }
-
-
- } catch (std::bad_cast const& /* e */)
- {
- std::istream& a = static_cast<std::istream&>(freader.GetStream());
- std::istream& r = reader->GetStream();
- if (&a == &r) {
- files.erase(p);
- hReader = NULL;
- return;
- }
-
- } catch (std::exception const& e)
- {
- hReader=NULL;
- LASError_PushError(LE_Failure, e.what(), "LASReader_Destroy");
- return;
- }
-
- } catch (std::runtime_error const& /* e */)
+ try {
+ LASReader* reader = (LASReader*)hReader;
+ std::istream* istrm = &(reader->GetStream());
+
+ delete reader;
+ hReader = NULL;
+
+ if (static_cast<std::ifstream&>(*istrm))
+ static_cast<std::ifstream&>(*istrm).close();
+ delete istrm;
+ istrm = NULL;
+
+ } catch (std::runtime_error const& e/* e */)
{
- continue;
+ LASError_PushError(LE_Failure, e.what(), "LASReader_Destroy");
+ return;
}
- }
+
hReader = NULL;
}
@@ -1206,36 +1170,45 @@
VALIDATE_POINTER1(hHeader, "LASWriter_Create", NULL);
if (filename == NULL) {
- LASError_PushError(LE_Failure, "Inputted filename was null", "LASWriter_Create");
+ LASError_PushError(LE_Failure, "Input filename was null", "LASWriter_Create");
return NULL;
}
try {
-
- StrLASFileMap::const_iterator p;
-
- p = files.find(filename);
- LASHeader* header = ((LASHeader*) hHeader);
+ std::ios::openmode m;
+ if ( (mode > 2) || (mode < 1)) {
+ throw std::runtime_error("File mode must be eWrite or eAppend");
+ }
- if (p==files.end()) {
+ std::ostream* ostrm;
- LASFile lasfile;
-
- lasfile = LASFile(filename, *header, (liblas::LASFile::Mode)mode);
- LASWriter* writer = NULL;
- try {
- writer = &(lasfile.GetWriter());
- }
- catch (...) {
- throw std::runtime_error("LASWriter_Create rethrowing");
- }
-
- files[filename] = lasfile;
+ // append mode
+ if (mode == 2) {
+ m = std::ios::out | std::ios::in | std::ios::binary | std::ios::ate;
+ }
+ // write mode
+ else {
+ m = std::ios::out | std::ios::binary | std::ios::ate;
+ }
+
+ if (strncasecmp(filename,"STOUT",5) == 0)
+ {
+ ostrm = &std::cout;
+ }
+ else
+ {
+ ostrm = new std::ofstream(filename, m);
+ }
- return (LASWriterH) writer;
+
+ if (!ostrm->good())
+ {
+ delete ostrm;
+ throw std::runtime_error("Writing stream was not able to be created");
}
- LASError_PushError(LE_Failure, "not able to create map entry", "LASWriter_Create");
- return NULL;
+ LASHeader* header = ((LASHeader*) hHeader);
+ LASWriter* writer = new LASWriter(*ostrm, *header);
+ return (LASWriterH) writer;
} catch (std::exception const& e)
{
@@ -1287,53 +1260,29 @@
{
VALIDATE_POINTER0(hWriter, "LASWriter_Destroy");
- StrLASFileMap::iterator p;
-
- LASWriter* writer = (LASWriter*)hWriter;
-
- for (p=files.begin(); p!=files.end(); ++p) {
-
- LASFile f = p->second;
-
- try {
-
- LASWriter& fwriter = f.GetWriter();
-
- try {
- std::ofstream& a = static_cast<std::ofstream&>(fwriter.GetStream());
- std::ofstream& r = static_cast<std::ofstream&>(writer->GetStream());
- if (&a == &r) {
- files.erase(p);
- hWriter = NULL;
- return;
- }
-
- } catch (std::bad_cast const& /* e */)
- {
- std::ostream& a = static_cast<std::ostream&>(fwriter.GetStream());
- std::ostream& r = writer->GetStream();
- if (&a == &r) {
- files.erase(p);
- hWriter = NULL;
- return;
- }
-
- } catch (std::exception const& e)
- {
- hWriter=NULL;
- LASError_PushError(LE_Failure, e.what(), "LASWriter_Destroy");
- return ;
- }
+
+
+
+
- } catch (std::runtime_error const& /* e */)
+ try {
+ LASWriter* writer = (LASWriter*)hWriter;
+ std::ostream* ostrm = &(writer->GetStream());
+
+ delete writer;
+ hWriter = NULL;
+
+ if (static_cast<std::ofstream&>(*ostrm))
+ static_cast<std::ofstream&>(*ostrm).close();
+ delete ostrm;
+ ostrm = NULL;
+
+ } catch (std::runtime_error const& e/* e */)
{
- continue;
+ LASError_PushError(LE_Failure, e.what(), "LASWriter_Destroy");
+ return;
}
-
- }
-
- hWriter=NULL;
}
LAS_DLL LASErrorEnum LASWriter_SetSRS(LASWriterH hWriter, const LASSRSH hSRS) {
Modified: trunk/src/lasheader.cpp
==============================================================================
--- trunk/src/lasheader.cpp (original)
+++ trunk/src/lasheader.cpp Thu Mar 19 00:20:50 2009
@@ -98,7 +98,6 @@
m_scales(other.m_scales),
m_offsets(other.m_offsets),
m_extents(other.m_extents),
- m_proj4(other.m_proj4),
m_srs(other.m_srs)
{
void* p = 0;
@@ -155,7 +154,6 @@
m_scales = rhs.m_scales;
m_offsets = rhs.m_offsets;
m_extents = rhs.m_extents;
- m_proj4 = rhs.m_proj4;
m_srs = rhs.m_srs;
}
return *this;
@@ -188,7 +186,6 @@
if (m_scales != other.m_scales) return false;
if (m_offsets != other.m_offsets) return false;
if (m_extents != other.m_extents) return false;
- if (m_proj4 != other.m_proj4) return false;
return true;
}
More information about the Liblas-commits
mailing list