Loading autocnet/control/tests/test_control.py +9 −1 Original line number Diff line number Diff line import os import sys from time import gmtime, strftime import unittest sys.path.insert(0, os.path.abspath('..')) Loading @@ -17,3 +18,10 @@ class TestC(unittest.TestCase): def test_n_measures(self): self.assertEqual(self.C.m, 500) def test_modified_date(self): self.assertEqual(self.C.modifieddate, 'Not modified') def test_creation_date(self): self.assertEqual(self.C.creationdate, strftime("%Y-%m-%d %H:%M:%S", gmtime())) No newline at end of file autocnet/fileio/ControlNetFileV0002.py 0 → 100644 +100 −0 Original line number Diff line number Diff line from protobuf3.fields import MessageField, EnumField, StringField, BoolField, Int32Field, DoubleField from enum import Enum from protobuf3.message import Message class ControlNetFileHeaderV0002(Message): pass class ControlPointFileEntryV0002(Message): class PointType(Enum): Free = 2 Constrained = 3 Fixed = 4 obsolete_Tie = 0 obsolete_Ground = 1 class AprioriSource(Enum): NA = 0 User = 1 AverageOfMeasures = 2 Reference = 3 Ellipsoid = 4 DEM = 5 Basemap = 6 BundleSolution = 7 class PointLogData(Message): pass class Measure(Message): class MeasureType(Enum): Candidate = 0 Manual = 1 RegisteredPixel = 2 RegisteredSubPixel = 3 class MeasureLogData(Message): pass ControlNetFileHeaderV0002.add_field('networkId', StringField(field_number=1, required=True)) ControlNetFileHeaderV0002.add_field('targetName', StringField(field_number=2, required=True)) ControlNetFileHeaderV0002.add_field('created', StringField(field_number=3, optional=True)) ControlNetFileHeaderV0002.add_field('lastModified', StringField(field_number=4, optional=True)) ControlNetFileHeaderV0002.add_field('description', StringField(field_number=5, optional=True)) ControlNetFileHeaderV0002.add_field('userName', StringField(field_number=6, optional=True)) ControlNetFileHeaderV0002.add_field('pointMessageSizes', Int32Field(field_number=7, repeated=True)) ControlPointFileEntryV0002.PointLogData.add_field('doubleDataType', Int32Field(field_number=1, optional=True)) ControlPointFileEntryV0002.PointLogData.add_field('doubleDataValue', DoubleField(field_number=2, optional=True)) ControlPointFileEntryV0002.PointLogData.add_field('boolDataType', Int32Field(field_number=3, optional=True)) ControlPointFileEntryV0002.PointLogData.add_field('boolDataValue', BoolField(field_number=4, optional=True)) ControlPointFileEntryV0002.Measure.MeasureLogData.add_field('doubleDataType', Int32Field(field_number=1, optional=True)) ControlPointFileEntryV0002.Measure.MeasureLogData.add_field('doubleDataValue', DoubleField(field_number=2, optional=True)) ControlPointFileEntryV0002.Measure.MeasureLogData.add_field('boolDataType', Int32Field(field_number=3, optional=True)) ControlPointFileEntryV0002.Measure.MeasureLogData.add_field('boolDataValue', BoolField(field_number=4, optional=True)) ControlPointFileEntryV0002.Measure.add_field('serialnumber', StringField(field_number=1, required=True)) ControlPointFileEntryV0002.Measure.add_field('type', EnumField(field_number=2, required=True, enum_cls=ControlPointFileEntryV0002.Measure.MeasureType)) ControlPointFileEntryV0002.Measure.add_field('sample', DoubleField(field_number=3, optional=True)) ControlPointFileEntryV0002.Measure.add_field('line', DoubleField(field_number=4, optional=True)) ControlPointFileEntryV0002.Measure.add_field('sampleResidual', DoubleField(field_number=5, optional=True)) ControlPointFileEntryV0002.Measure.add_field('lineResidual', DoubleField(field_number=6, optional=True)) ControlPointFileEntryV0002.Measure.add_field('choosername', StringField(field_number=7, optional=True)) ControlPointFileEntryV0002.Measure.add_field('datetime', StringField(field_number=8, optional=True)) ControlPointFileEntryV0002.Measure.add_field('editLock', BoolField(field_number=9, optional=True)) ControlPointFileEntryV0002.Measure.add_field('ignore', BoolField(field_number=10, optional=True)) ControlPointFileEntryV0002.Measure.add_field('jigsawRejected', BoolField(field_number=11, optional=True)) ControlPointFileEntryV0002.Measure.add_field('diameter', DoubleField(field_number=12, optional=True)) ControlPointFileEntryV0002.Measure.add_field('apriorisample', DoubleField(field_number=13, optional=True)) ControlPointFileEntryV0002.Measure.add_field('aprioriline', DoubleField(field_number=14, optional=True)) ControlPointFileEntryV0002.Measure.add_field('samplesigma', DoubleField(field_number=15, optional=True)) ControlPointFileEntryV0002.Measure.add_field('linesigma', DoubleField(field_number=16, optional=True)) ControlPointFileEntryV0002.Measure.add_field('log', MessageField(field_number=17, repeated=True, message_cls=ControlPointFileEntryV0002.Measure.MeasureLogData)) ControlPointFileEntryV0002.add_field('id', StringField(field_number=1, required=True)) ControlPointFileEntryV0002.add_field('type', EnumField(field_number=2, required=True, enum_cls=ControlPointFileEntryV0002.PointType)) ControlPointFileEntryV0002.add_field('chooserName', StringField(field_number=3, optional=True)) ControlPointFileEntryV0002.add_field('datetime', StringField(field_number=4, optional=True)) ControlPointFileEntryV0002.add_field('editLock', BoolField(field_number=5, optional=True)) ControlPointFileEntryV0002.add_field('ignore', BoolField(field_number=6, optional=True)) ControlPointFileEntryV0002.add_field('jigsawRejected', BoolField(field_number=7, optional=True)) ControlPointFileEntryV0002.add_field('referenceIndex', Int32Field(field_number=8, optional=True)) ControlPointFileEntryV0002.add_field('aprioriSurfPointSource', EnumField(field_number=9, optional=True, enum_cls=ControlPointFileEntryV0002.AprioriSource)) ControlPointFileEntryV0002.add_field('aprioriSurfPointSourceFile', StringField(field_number=10, optional=True)) ControlPointFileEntryV0002.add_field('aprioriRadiusSource', EnumField(field_number=11, optional=True, enum_cls=ControlPointFileEntryV0002.AprioriSource)) ControlPointFileEntryV0002.add_field('aprioriRadiusSourceFile', StringField(field_number=12, optional=True)) ControlPointFileEntryV0002.add_field('latitudeConstrained', BoolField(field_number=13, optional=True)) ControlPointFileEntryV0002.add_field('longitudeConstrained', BoolField(field_number=14, optional=True)) ControlPointFileEntryV0002.add_field('radiusConstrained', BoolField(field_number=15, optional=True)) ControlPointFileEntryV0002.add_field('aprioriX', DoubleField(field_number=16, optional=True)) ControlPointFileEntryV0002.add_field('aprioriY', DoubleField(field_number=17, optional=True)) ControlPointFileEntryV0002.add_field('aprioriZ', DoubleField(field_number=18, optional=True)) ControlPointFileEntryV0002.add_field('aprioriCovar', DoubleField(field_number=19, repeated=True)) ControlPointFileEntryV0002.add_field('adjustedX', DoubleField(field_number=20, optional=True)) ControlPointFileEntryV0002.add_field('adjustedY', DoubleField(field_number=21, optional=True)) ControlPointFileEntryV0002.add_field('adjustedZ', DoubleField(field_number=22, optional=True)) ControlPointFileEntryV0002.add_field('adjustedCovar', DoubleField(field_number=23, repeated=True)) ControlPointFileEntryV0002.add_field('log', MessageField(field_number=24, repeated=True, message_cls=ControlPointFileEntryV0002.PointLogData)) ControlPointFileEntryV0002.add_field('measures', MessageField(field_number=25, repeated=True, message_cls=ControlPointFileEntryV0002.Measure)) autocnet/fileio/io_controlnetwork.py +53 −7 Original line number Diff line number Diff line import sys import pvl import numpy as np from autocnet.fileio import ControlNetFileV0002 as cnf #TODO: Protobuf3 should be a conditional import, if availble use it, otherwise bail VERSION = 2 HEADERSTARTBYTE = 65536 Loading @@ -6,8 +13,8 @@ DEFAULTUSERNAME = 'AutoControlNetGeneration' def to_isis(path, C, mode='w', version=VERSION, headerstartbyte=HEADERSTARTBYTE, networkId=None, targetname=None, description=None, username=DEFAULTUSERNAME): networkid='None', targetname='None', description='', username=DEFAULTUSERNAME): """ Parameters ---------- Loading Loading @@ -51,8 +58,15 @@ def to_isis(path, C, mode='w', version=VERSION, if isinstance(path, str): with IsisStore(path, mode) as store: header = store.create_header(C, version, headerstartbyte, networkId, targetname, description, username) buffer_header, buffer_header_size = store.create_buffer_header(C, version, headerstartbyte, networkid, targetname, description, username) store.write(buffer_header,HEADERSTARTBYTE) header = store.create_pvl_header(C, version, headerstartbyte, networkid, targetname, description, username, buffer_header_size) store.write(header) class IsisStore(object): Loading Loading @@ -85,9 +99,41 @@ class IsisStore(object): self._handle.seek(offset) self._handle.write(data) def create_header(self, cnet, version, headerstartbyte, def create_buffer_header(self, cnet, version, headerstartbyte, networkid, targetname, description, username): """ Create the Google Protocol Buffer header using the protobuf spec. Parameters ---------- cnet : object A control network object Returns ------- message : str The serialized message to write """ raw_header_message = cnf.ControlNetFileHeaderV0002() #raw_header_message.created = cnet.creationdate #raw_header_message.description = description #raw_header_message.lastModified = cnet.modifieddate raw_header_message.networkId = networkid raw_header_message.targetName = targetname #raw_header_message.userName = username #raw_header_message.pointMessageSizes header_message = raw_header_message.encode_to_bytes() header_message_size = sys.getsizeof(header_message) return header_message, header_message_size def create_pvl_header(self, cnet, version, headerstartbyte, networkid, targetname, description, username, buffer_header_size): """ Create the PVL header object Parameters ---------- Loading @@ -101,8 +147,8 @@ class IsisStore(object): encoder = pvl.encoder.IsisCubeLabelEncoder headerbytes = 1 pointsstartbyte = 1 headerbytes = buffer_header_size pointsstartbyte = HEADERSTARTBYTE + buffer_header_size pointsbytes = 1 header = pvl.PVLModule([ Loading autocnet/fileio/tests/test_io_controlnetwork.py +12 −1 Original line number Diff line number Diff line Loading @@ -7,6 +7,8 @@ sys.path.insert(0, os.path.abspath('..')) import pvl from .. import io_controlnetwork from .. import ControlNetFileV0002 as cnf from autocnet.utils.utils import find_in_dict from autocnet.control.control import C Loading @@ -23,7 +25,16 @@ class TestWriteIsisControlNetwork(unittest.TestCase): cnet.modifieddate = 'None' io_controlnetwork.to_isis('test.net', cnet, mode='wb') def test_writepvl_header(self): def test_create_buffer_header(self): header_message_size = 45 with open('test.net', 'rb') as f: f.seek(io_controlnetwork.HEADERSTARTBYTE) raw_header_message = f.read(header_message_size) header_protocol = cnf.ControlNetFileHeaderV0002() self.assertEqual('', header_protocol.networkId) self.assertEqual('', header_protocol.targetName) def test_create_pvl_header(self): pvl_header = pvl.load('test.net') npoints = find_in_dict(pvl_header, 'NumberOfPoints') self.assertEqual(75, npoints) Loading requirements.txt +2 −1 Original line number Diff line number Diff line Loading @@ -2,3 +2,4 @@ numpy>=1.10.0 scipy gdal>=2.0 pvl>=0.2.0 protobuf3 No newline at end of file Loading
autocnet/control/tests/test_control.py +9 −1 Original line number Diff line number Diff line import os import sys from time import gmtime, strftime import unittest sys.path.insert(0, os.path.abspath('..')) Loading @@ -17,3 +18,10 @@ class TestC(unittest.TestCase): def test_n_measures(self): self.assertEqual(self.C.m, 500) def test_modified_date(self): self.assertEqual(self.C.modifieddate, 'Not modified') def test_creation_date(self): self.assertEqual(self.C.creationdate, strftime("%Y-%m-%d %H:%M:%S", gmtime())) No newline at end of file
autocnet/fileio/ControlNetFileV0002.py 0 → 100644 +100 −0 Original line number Diff line number Diff line from protobuf3.fields import MessageField, EnumField, StringField, BoolField, Int32Field, DoubleField from enum import Enum from protobuf3.message import Message class ControlNetFileHeaderV0002(Message): pass class ControlPointFileEntryV0002(Message): class PointType(Enum): Free = 2 Constrained = 3 Fixed = 4 obsolete_Tie = 0 obsolete_Ground = 1 class AprioriSource(Enum): NA = 0 User = 1 AverageOfMeasures = 2 Reference = 3 Ellipsoid = 4 DEM = 5 Basemap = 6 BundleSolution = 7 class PointLogData(Message): pass class Measure(Message): class MeasureType(Enum): Candidate = 0 Manual = 1 RegisteredPixel = 2 RegisteredSubPixel = 3 class MeasureLogData(Message): pass ControlNetFileHeaderV0002.add_field('networkId', StringField(field_number=1, required=True)) ControlNetFileHeaderV0002.add_field('targetName', StringField(field_number=2, required=True)) ControlNetFileHeaderV0002.add_field('created', StringField(field_number=3, optional=True)) ControlNetFileHeaderV0002.add_field('lastModified', StringField(field_number=4, optional=True)) ControlNetFileHeaderV0002.add_field('description', StringField(field_number=5, optional=True)) ControlNetFileHeaderV0002.add_field('userName', StringField(field_number=6, optional=True)) ControlNetFileHeaderV0002.add_field('pointMessageSizes', Int32Field(field_number=7, repeated=True)) ControlPointFileEntryV0002.PointLogData.add_field('doubleDataType', Int32Field(field_number=1, optional=True)) ControlPointFileEntryV0002.PointLogData.add_field('doubleDataValue', DoubleField(field_number=2, optional=True)) ControlPointFileEntryV0002.PointLogData.add_field('boolDataType', Int32Field(field_number=3, optional=True)) ControlPointFileEntryV0002.PointLogData.add_field('boolDataValue', BoolField(field_number=4, optional=True)) ControlPointFileEntryV0002.Measure.MeasureLogData.add_field('doubleDataType', Int32Field(field_number=1, optional=True)) ControlPointFileEntryV0002.Measure.MeasureLogData.add_field('doubleDataValue', DoubleField(field_number=2, optional=True)) ControlPointFileEntryV0002.Measure.MeasureLogData.add_field('boolDataType', Int32Field(field_number=3, optional=True)) ControlPointFileEntryV0002.Measure.MeasureLogData.add_field('boolDataValue', BoolField(field_number=4, optional=True)) ControlPointFileEntryV0002.Measure.add_field('serialnumber', StringField(field_number=1, required=True)) ControlPointFileEntryV0002.Measure.add_field('type', EnumField(field_number=2, required=True, enum_cls=ControlPointFileEntryV0002.Measure.MeasureType)) ControlPointFileEntryV0002.Measure.add_field('sample', DoubleField(field_number=3, optional=True)) ControlPointFileEntryV0002.Measure.add_field('line', DoubleField(field_number=4, optional=True)) ControlPointFileEntryV0002.Measure.add_field('sampleResidual', DoubleField(field_number=5, optional=True)) ControlPointFileEntryV0002.Measure.add_field('lineResidual', DoubleField(field_number=6, optional=True)) ControlPointFileEntryV0002.Measure.add_field('choosername', StringField(field_number=7, optional=True)) ControlPointFileEntryV0002.Measure.add_field('datetime', StringField(field_number=8, optional=True)) ControlPointFileEntryV0002.Measure.add_field('editLock', BoolField(field_number=9, optional=True)) ControlPointFileEntryV0002.Measure.add_field('ignore', BoolField(field_number=10, optional=True)) ControlPointFileEntryV0002.Measure.add_field('jigsawRejected', BoolField(field_number=11, optional=True)) ControlPointFileEntryV0002.Measure.add_field('diameter', DoubleField(field_number=12, optional=True)) ControlPointFileEntryV0002.Measure.add_field('apriorisample', DoubleField(field_number=13, optional=True)) ControlPointFileEntryV0002.Measure.add_field('aprioriline', DoubleField(field_number=14, optional=True)) ControlPointFileEntryV0002.Measure.add_field('samplesigma', DoubleField(field_number=15, optional=True)) ControlPointFileEntryV0002.Measure.add_field('linesigma', DoubleField(field_number=16, optional=True)) ControlPointFileEntryV0002.Measure.add_field('log', MessageField(field_number=17, repeated=True, message_cls=ControlPointFileEntryV0002.Measure.MeasureLogData)) ControlPointFileEntryV0002.add_field('id', StringField(field_number=1, required=True)) ControlPointFileEntryV0002.add_field('type', EnumField(field_number=2, required=True, enum_cls=ControlPointFileEntryV0002.PointType)) ControlPointFileEntryV0002.add_field('chooserName', StringField(field_number=3, optional=True)) ControlPointFileEntryV0002.add_field('datetime', StringField(field_number=4, optional=True)) ControlPointFileEntryV0002.add_field('editLock', BoolField(field_number=5, optional=True)) ControlPointFileEntryV0002.add_field('ignore', BoolField(field_number=6, optional=True)) ControlPointFileEntryV0002.add_field('jigsawRejected', BoolField(field_number=7, optional=True)) ControlPointFileEntryV0002.add_field('referenceIndex', Int32Field(field_number=8, optional=True)) ControlPointFileEntryV0002.add_field('aprioriSurfPointSource', EnumField(field_number=9, optional=True, enum_cls=ControlPointFileEntryV0002.AprioriSource)) ControlPointFileEntryV0002.add_field('aprioriSurfPointSourceFile', StringField(field_number=10, optional=True)) ControlPointFileEntryV0002.add_field('aprioriRadiusSource', EnumField(field_number=11, optional=True, enum_cls=ControlPointFileEntryV0002.AprioriSource)) ControlPointFileEntryV0002.add_field('aprioriRadiusSourceFile', StringField(field_number=12, optional=True)) ControlPointFileEntryV0002.add_field('latitudeConstrained', BoolField(field_number=13, optional=True)) ControlPointFileEntryV0002.add_field('longitudeConstrained', BoolField(field_number=14, optional=True)) ControlPointFileEntryV0002.add_field('radiusConstrained', BoolField(field_number=15, optional=True)) ControlPointFileEntryV0002.add_field('aprioriX', DoubleField(field_number=16, optional=True)) ControlPointFileEntryV0002.add_field('aprioriY', DoubleField(field_number=17, optional=True)) ControlPointFileEntryV0002.add_field('aprioriZ', DoubleField(field_number=18, optional=True)) ControlPointFileEntryV0002.add_field('aprioriCovar', DoubleField(field_number=19, repeated=True)) ControlPointFileEntryV0002.add_field('adjustedX', DoubleField(field_number=20, optional=True)) ControlPointFileEntryV0002.add_field('adjustedY', DoubleField(field_number=21, optional=True)) ControlPointFileEntryV0002.add_field('adjustedZ', DoubleField(field_number=22, optional=True)) ControlPointFileEntryV0002.add_field('adjustedCovar', DoubleField(field_number=23, repeated=True)) ControlPointFileEntryV0002.add_field('log', MessageField(field_number=24, repeated=True, message_cls=ControlPointFileEntryV0002.PointLogData)) ControlPointFileEntryV0002.add_field('measures', MessageField(field_number=25, repeated=True, message_cls=ControlPointFileEntryV0002.Measure))
autocnet/fileio/io_controlnetwork.py +53 −7 Original line number Diff line number Diff line import sys import pvl import numpy as np from autocnet.fileio import ControlNetFileV0002 as cnf #TODO: Protobuf3 should be a conditional import, if availble use it, otherwise bail VERSION = 2 HEADERSTARTBYTE = 65536 Loading @@ -6,8 +13,8 @@ DEFAULTUSERNAME = 'AutoControlNetGeneration' def to_isis(path, C, mode='w', version=VERSION, headerstartbyte=HEADERSTARTBYTE, networkId=None, targetname=None, description=None, username=DEFAULTUSERNAME): networkid='None', targetname='None', description='', username=DEFAULTUSERNAME): """ Parameters ---------- Loading Loading @@ -51,8 +58,15 @@ def to_isis(path, C, mode='w', version=VERSION, if isinstance(path, str): with IsisStore(path, mode) as store: header = store.create_header(C, version, headerstartbyte, networkId, targetname, description, username) buffer_header, buffer_header_size = store.create_buffer_header(C, version, headerstartbyte, networkid, targetname, description, username) store.write(buffer_header,HEADERSTARTBYTE) header = store.create_pvl_header(C, version, headerstartbyte, networkid, targetname, description, username, buffer_header_size) store.write(header) class IsisStore(object): Loading Loading @@ -85,9 +99,41 @@ class IsisStore(object): self._handle.seek(offset) self._handle.write(data) def create_header(self, cnet, version, headerstartbyte, def create_buffer_header(self, cnet, version, headerstartbyte, networkid, targetname, description, username): """ Create the Google Protocol Buffer header using the protobuf spec. Parameters ---------- cnet : object A control network object Returns ------- message : str The serialized message to write """ raw_header_message = cnf.ControlNetFileHeaderV0002() #raw_header_message.created = cnet.creationdate #raw_header_message.description = description #raw_header_message.lastModified = cnet.modifieddate raw_header_message.networkId = networkid raw_header_message.targetName = targetname #raw_header_message.userName = username #raw_header_message.pointMessageSizes header_message = raw_header_message.encode_to_bytes() header_message_size = sys.getsizeof(header_message) return header_message, header_message_size def create_pvl_header(self, cnet, version, headerstartbyte, networkid, targetname, description, username, buffer_header_size): """ Create the PVL header object Parameters ---------- Loading @@ -101,8 +147,8 @@ class IsisStore(object): encoder = pvl.encoder.IsisCubeLabelEncoder headerbytes = 1 pointsstartbyte = 1 headerbytes = buffer_header_size pointsstartbyte = HEADERSTARTBYTE + buffer_header_size pointsbytes = 1 header = pvl.PVLModule([ Loading
autocnet/fileio/tests/test_io_controlnetwork.py +12 −1 Original line number Diff line number Diff line Loading @@ -7,6 +7,8 @@ sys.path.insert(0, os.path.abspath('..')) import pvl from .. import io_controlnetwork from .. import ControlNetFileV0002 as cnf from autocnet.utils.utils import find_in_dict from autocnet.control.control import C Loading @@ -23,7 +25,16 @@ class TestWriteIsisControlNetwork(unittest.TestCase): cnet.modifieddate = 'None' io_controlnetwork.to_isis('test.net', cnet, mode='wb') def test_writepvl_header(self): def test_create_buffer_header(self): header_message_size = 45 with open('test.net', 'rb') as f: f.seek(io_controlnetwork.HEADERSTARTBYTE) raw_header_message = f.read(header_message_size) header_protocol = cnf.ControlNetFileHeaderV0002() self.assertEqual('', header_protocol.networkId) self.assertEqual('', header_protocol.targetName) def test_create_pvl_header(self): pvl_header = pvl.load('test.net') npoints = find_in_dict(pvl_header, 'NumberOfPoints') self.assertEqual(75, npoints) Loading
requirements.txt +2 −1 Original line number Diff line number Diff line Loading @@ -2,3 +2,4 @@ numpy>=1.10.0 scipy gdal>=2.0 pvl>=0.2.0 protobuf3 No newline at end of file