public Line(DataRecordRow row) : this() { ID = LoadAttributeID( row.Fields, DirectoryDataType.LINE ); PolygonIDLeft = LoadAttributeID( row.Fields, DirectoryDataType.PIDL ); PolygonIDRight = LoadAttributeID( row.Fields, DirectoryDataType.PIDR ); StartNodeID = LoadAttributeID( row.Fields, DirectoryDataType.SNID ); EndNodeID = LoadAttributeID( row.Fields, DirectoryDataType.ENID ); AttributeIDs = new List<KeyValuePair<string, int>>(); var attr = row.Fields.Where( field => field.FieldDefinition.Directory.Tag == DirectoryDataType.ATID ); if( attr.Any() ) { for( int i = 0; i < attr.Count(); i += 2 ) AttributeIDs.Add( new KeyValuePair<string,int>(attr.ElementAt( i ).AsString, attr.ElementAt( i + 1 ).AsInt) ); } var firstX = row.Fields.First( field => field.FieldDefinition.Name == "X" ); var startIndex = row.Fields.IndexOf( firstX ); for( int i = startIndex; i < row.Fields.Count; i += 2 ) { var point = new PointD { X = row.Fields[ i ].AsInt / 100.0, Y = row.Fields[ i + 1 ].AsInt / 100.0 }; Points.Add( point ); } DataRow = row; }
public CatalogDirectoryEntry( DataRecordRow row ) { FileName = row.Fields.ElementAt( 4 ).AsString; Contents = row.Fields.ElementAt( 3 ).AsString; Type = row.Fields.ElementAt( 2 ).AsString; }
private DataRecordRow LoadRow( List<KeyValuePair<DDRDirectoryEntry, byte[]>> rowData ) { DataRecordRow row = new DataRecordRow(); row.ID = int.Parse( new string( rowData[ 0 ].Value.AsCharArray() ) ); row.Fields = new List<DataRecordField>(); for( int dataIndex = 1; dataIndex < rowData.Count; dataIndex++ ) { var fieldDescDir = DescriptiveRecord.Directories.OfType<DDRDirectoryEntry>().FirstOrDefault( entry => entry.Fields.First() == rowData[ dataIndex ].Key.Tag.GetDescription() ); if( fieldDescDir == null ) throw new InvalidDataException( String.Format( "Could not find directory for data block {0}", rowData[ dataIndex ].Key.Tag ) ); if( fieldDescDir.SubFields[ 0 ].Length.HasValue ) { int currentIndex = 0; for( int fieldIndex = 0; fieldIndex < fieldDescDir.SubFields.Count; fieldIndex++ ) { byte[] field = new byte[fieldDescDir.SubFields[fieldIndex].Length.Value]; Array.Copy( rowData[ dataIndex ].Value, currentIndex, field, 0, field.Length ); row.Fields.Add( new DataRecordField( fieldDescDir.SubFields[ fieldIndex ], field ) ); currentIndex += fieldDescDir.SubFields[ fieldIndex ].Length.Value; } } else { var fields = rowData[ dataIndex ].Value.SplitOnSeparator( INT_FieldSeparator ); if( fields.Count != fieldDescDir.SubFields.Count ) throw new InvalidDataException( "The number of fields does not match expected" ); for( int fieldIndex = 0; fieldIndex < fields.Count; fieldIndex++ ) { row.Fields.Add( new DataRecordField( fieldDescDir.SubFields[ fieldIndex ], fields[ fieldIndex ] ) ); } } } return row; }