Skip to content
7 changes: 7 additions & 0 deletions ISOv4Plugin/ExtensionMethods/ExtensionMethods.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,13 @@ public static bool ReverseEquals(this string s1, string s2)
return true;
}

/// <summary>
/// Matches NumericRepresentation by code, accounting for null representation code
/// </summary>
public static bool ContainsCode(this ApplicationDataModel.Representations.Representation representation, string code)
{
return representation?.Code != null && representation.Code.Contains(code);
}

/// <summary>
/// Looks up unit, converts and loads representation
Expand Down
11 changes: 8 additions & 3 deletions ISOv4Plugin/Mappers/PartfieldMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,11 +90,16 @@ public ISOPartfield ExportField(Field adaptField)

//Boundary
PolygonMapper polygonMapper = new PolygonMapper(TaskDataMapper);
FieldBoundary boundary = DataModel.Catalog.FieldBoundaries.SingleOrDefault(b => b.FieldId == adaptField.Id.ReferenceId);

var boundaries = DataModel.Catalog.FieldBoundaries.Where(b => b.FieldId == adaptField.Id.ReferenceId).ToList();
var boundary = boundaries.FirstOrDefault(b=> b.Id.ReferenceId == adaptField.ActiveBoundaryId) ?? boundaries.FirstOrDefault();
if (boundary != null)
{
IEnumerable<ISOPolygon> isoPolygons = polygonMapper.ExportMultipolygon(boundary.SpatialData, ISOEnumerations.ISOPolygonType.PartfieldBoundary);
isoField.Polygons.AddRange(isoPolygons);
if (boundary.SpatialData != null)
{
IEnumerable<ISOPolygon> isoPolygons = polygonMapper.ExportMultipolygon(boundary.SpatialData, ISOEnumerations.ISOPolygonType.PartfieldBoundary);
isoField.Polygons.AddRange(isoPolygons);
}
}

//Guidance
Expand Down
32 changes: 16 additions & 16 deletions ISOv4Plugin/Mappers/TimeLogMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ internal TimeLogMapper(TaskDataMapper taskDataMapper) : base(taskDataMapper, "TL
{
}

private static readonly DateTime _firstDayOf1980 = new DateTime(1980, 1, 1, 0, 0, 0, DateTimeKind.Local);

#region Export
private Dictionary<int, int> _dataLogValueOrdersByWorkingDataID;
public IEnumerable<ISOTimeLog> ExportTimeLogs(IEnumerable<OperationData> operationDatas, string dataPath)
Expand Down Expand Up @@ -150,7 +152,6 @@ private class BinaryWriter
{ // ATTENTION: CoordinateMultiplier and ZMultiplier also exist in Import\SpatialRecordMapper.cs!
private const double CoordinateMultiplier = 0.0000001;
private const double ZMultiplier = 0.001; // In ISO the PositionUp value is specified in mm.
private readonly DateTime _januaryFirst1980 = new DateTime(1980, 1, 1);

private readonly IEnumeratedValueMapper _enumeratedValueMapper;
private readonly INumericValueMapper _numericValueMapper;
Expand Down Expand Up @@ -193,7 +194,7 @@ private void WriteSpatialRecord(SpatialRecord spatialRecord, List<WorkingData> m
var millisecondsSinceMidnight = (UInt32)new TimeSpan(0, spatialRecord.Timestamp.Hour, spatialRecord.Timestamp.Minute, spatialRecord.Timestamp.Second, spatialRecord.Timestamp.Millisecond).TotalMilliseconds;
memoryStream.Write(BitConverter.GetBytes(millisecondsSinceMidnight), 0, 4);

var daysSinceJanOne1980 = (UInt16)(spatialRecord.Timestamp - (_januaryFirst1980)).TotalDays;
var daysSinceJanOne1980 = (UInt16)(spatialRecord.Timestamp - _firstDayOf1980).TotalDays;
memoryStream.Write(BitConverter.GetBytes(daysSinceJanOne1980), 0, 2);

//Position
Expand Down Expand Up @@ -409,8 +410,7 @@ protected IEnumerable<OperationData> ImportTimeLog(ISOTask loggedTask, ISOTimeLo
operationData.GetDeviceElementUses = x => operationData.DeviceElementUses.Where(s => s.Depth == x).ToList();
operationData.PrescriptionId = prescriptionID;
operationData.OperationType = GetOperationTypeFromProductCategory(productIDs) ??
GetOperationTypeFromWorkingDatas(workingDatas) ??
GetOperationTypeFromLoggingDevices(time);
OverrideOperationTypeFromWorkingDatas(GetOperationTypeFromLoggingDevices(time), workingDatas);
operationData.ProductIds = productIDs;
if (!useDeferredExecution)
{
Expand All @@ -428,22 +428,25 @@ protected IEnumerable<OperationData> ImportTimeLog(ISOTask loggedTask, ISOTimeLo
return null;
}

private OperationTypeEnum? GetOperationTypeFromWorkingDatas(List<WorkingData> workingDatas)
private OperationTypeEnum OverrideOperationTypeFromWorkingDatas(OperationTypeEnum deviceOperationType, List<WorkingData> workingDatas)
{
//Harvest/ForageHarvest omitted intentionally to be determined from machine type vs. working data
if (workingDatas.Any(w => w.Representation.Code.Contains("Seed")))
if (workingDatas.Any(w => w.Representation.ContainsCode("Seed")))
{
return OperationTypeEnum.SowingAndPlanting;
}
else if (workingDatas.Any(w => w.Representation.Code.Contains("Tillage")))
else if (workingDatas.Any(w => w.Representation.ContainsCode("Tillage")))
{
return OperationTypeEnum.Tillage;
}
if (workingDatas.Any(w => w.Representation.Code.Contains("AppRate")))
if (workingDatas.Any(w => w.Representation.ContainsCode("AppRate")))
{
return OperationTypeEnum.Unknown; //We can't differentiate CropProtection from Fertilizing, but prefer unkonwn to letting implement type set to SowingAndPlanting
if (deviceOperationType != OperationTypeEnum.Fertilizing && deviceOperationType != OperationTypeEnum.CropProtection)
{
return OperationTypeEnum.Unknown; //We can't differentiate CropProtection from Fertilizing, but prefer unknown to letting implement type set to SowingAndPlanting
}
}
return null;
return deviceOperationType;
}

private List<List<string>> SplitElementsByProductProperties(Dictionary<string, List<ISOProductAllocation>> productAllocations, HashSet<string> loggedDeviceElementIds, ISODevice dvc)
Expand Down Expand Up @@ -682,9 +685,6 @@ private void AddProductAllocationsForDeviceElement(Dictionary<string, Dictionary

switch (productCategories.FirstOrDefault())
{
case CategoryEnum.Variety:
return OperationTypeEnum.SowingAndPlanting;

case CategoryEnum.Fertilizer:
case CategoryEnum.NitrogenStabilizer:
case CategoryEnum.Manure:
Expand Down Expand Up @@ -722,7 +722,9 @@ private OperationTypeEnum GetOperationTypeFromLoggingDevices(ISOTime time)
}
}

DeviceOperationType deviceType = representedTypes.FirstOrDefault(t => t.ClientNAMEMachineType >= 2 && t.ClientNAMEMachineType <= 11);
DeviceOperationType deviceType = representedTypes.FirstOrDefault(t => t.ClientNAMEMachineType >= 2 && t.ClientNAMEMachineType <= 11 &&
t.OperationType != OperationTypeEnum.Unknown);

if (deviceType != null)
{
//2-11 represent known types of operations
Expand Down Expand Up @@ -752,8 +754,6 @@ internal static Dictionary<byte, int> ReadImplementGeometryValues(IEnumerable<by

protected class BinaryReader
{
private static readonly DateTime _firstDayOf1980 = new DateTime(1980, 01, 01);

public static Dictionary<byte, int> ReadImplementGeometryValues(string filePath, ISOTime templateTime, IEnumerable<byte> desiredDLVIndices, int version, IList<IError> errors)
{
Dictionary<byte, int> output = new Dictionary<byte, int>();
Expand Down
Loading