TryMapToNumericRange
(
ListObject table,
String sourceColumnName,
String destinationColumnName,
Boolean useSourceNumber1,
Boolean useSourceNumber2,
Double sourceNumber1,
Double sourceNumber2,
Double destinationNumber1,
Double destinationNumber2,
Boolean ignoreOutliers,
Boolean useLogs,
out Double sourceCalculationNumber1,
out Double sourceCalculationNumber2,
out Int32 decimalPlaces
)
{
Debug.Assert(table != null);
Debug.Assert( !String.IsNullOrEmpty(sourceColumnName) );
Debug.Assert( !String.IsNullOrEmpty(destinationColumnName) );
Debug.Assert(!useLogs || !useSourceNumber1 || sourceNumber1 > 0);
Debug.Assert(!useLogs || !useSourceNumber2 || sourceNumber2 > 0);
sourceCalculationNumber1 = sourceCalculationNumber2 = Double.MinValue;
decimalPlaces = Int32.MinValue;
Range oVisibleSourceRange, oVisibleDestinationRange;
if ( !TryGetVisibleSourceAndDestination(table, sourceColumnName,
destinationColumnName, out oVisibleSourceRange,
out oVisibleDestinationRange) )
{
return (false);
}
// Get the source calculation range, which is the range of source
// numbers used in calculating the mapping of source numbers to
// destination numbers.
if ( !TryGetSourceCalculationRange(oVisibleSourceRange,
useSourceNumber1, useSourceNumber2, sourceNumber1, sourceNumber2,
ignoreOutliers, useLogs, out sourceCalculationNumber1,
out sourceCalculationNumber2) )
{
return (false);
}
// Convert to log if necessary.
Double dSourceCalculationNumberWithLog1 =
GetLogIfRequested(sourceCalculationNumber1, useLogs);
Double dSourceCalculationNumberWithLog2 =
GetLogIfRequested(sourceCalculationNumber2, useLogs);
// Loop through the areas.
Int32 iAreas = oVisibleSourceRange.Areas.Count;
Debug.Assert(iAreas == oVisibleDestinationRange.Areas.Count);
for (Int32 iArea = 1; iArea <= iAreas; iArea++)
{
Range oSourceArea = oVisibleSourceRange.Areas[iArea];
Range oDestinationArea = oVisibleDestinationRange.Areas[iArea];
Debug.Assert(oSourceArea.Rows.Count ==
oDestinationArea.Rows.Count);
Object [,] aoSourceAreaValues =
ExcelUtil.GetRangeValues(oSourceArea);
Object [,] aoDestinationAreaValues =
ExcelUtil.GetRangeValues(oDestinationArea);
Int32 iRows = oSourceArea.Rows.Count;
for (Int32 iRow = 1; iRow <= iRows; iRow++)
{
// If the source cell doesn't contain a number, skip it.
Double dSourceNumber;
if ( !TryGetNumber( aoSourceAreaValues[iRow, 1], useLogs,
out dSourceNumber) )
{
continue;
}
// Map the source number to a destination number.
Double dSourceNumberWithLog =
GetLogIfRequested(dSourceNumber, useLogs);
Double dDestinationNumber = MapSourceNumberToDestinationNumber(
dSourceNumberWithLog, dSourceCalculationNumberWithLog1,
dSourceCalculationNumberWithLog2, destinationNumber1,
destinationNumber2, useLogs);
aoDestinationAreaValues[iRow, 1] = dDestinationNumber;
}
oDestinationArea.set_Value(Missing.Value, aoDestinationAreaValues);
}
decimalPlaces = GetDecimalPlaces(table, sourceColumnName);
return (true);
}