Commit 036f0ed7 authored by Jay's avatar Jay Committed by jay
Browse files

Protocol buffer header being written to cnet output

parent b08af5cc
Loading
Loading
Loading
Loading
+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('..'))
@@ -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
+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))
+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
@@ -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
    ----------
@@ -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):
@@ -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
        ----------
@@ -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([
+12 −1
Original line number Diff line number Diff line
@@ -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

@@ -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)
+2 −1
Original line number Diff line number Diff line
@@ -2,3 +2,4 @@ numpy>=1.10.0
scipy
gdal>=2.0
pvl>=0.2.0
protobuf3
 No newline at end of file