Понадобилось тут внезапно решить схожую задачу (до этого обходился проверками перед созданием размеров, т.е. нулевых размеров не было на момент создания). Александр, за идею спасибо, однако, реализация немного подкачала.
Во-первых, тут баг. Возьми Dimension с 2 сегментами (3 референса), первый нулевой, твой код вернёт ReferenceArray с одним Reference-ом (последним).
Дальше, мне подумалось, что "0" в сегменте размерной цепочки определяется не столько значением segment.Value, сколько настройками unit-ов проекта, возможно переопределенными в типоразмере DimensionType.
Ну и, наконец, исправление Reference-а осей можно сделать проще, не залезая в его геометрию.
Как-то примерно так:
/// <summary>
/// Удаление нулей из размерной цепочки. В случае, если нулей не найдено, возвращает False. Иначе - True и
/// массив <see cref="Reference"/> для пересоздания размерной цепочки без нулей
/// </summary>
/// <param name="dimension">Проверяемая размерная цепочка</param>
/// <param name="referencesArray">Массив <see cref="Reference"/> для пересоздания размерной цепочки</param>
/// <returns>True - размерная цепочка имела нули и требуется пересоздать её. Иначе false</returns>
public static bool TryRemoveZeroes(Dimension dimension, out ReferenceArray referencesArray)
{
referencesArray = new ReferenceArray();
if (dimension.Segments.IsEmpty)
return false;
var dimensionZeroString = GetDimensionZeroString(dimension);
for (var i = 0; i < dimension.NumberOfSegments; ++i)
{
var segment = dimension.Segments.get_Item(i);
if (segment.ValueString != dimensionZeroString)
{
if (referencesArray.IsEmpty)
referencesArray.Append(FixGridReference(document, dimension.References.get_Item(i)));
referencesArray.Append(FixGridReference(document, dimension.References.get_Item(i + 1)));
}
}
return referencesArray.Size < dimension.References.Size;
}
private static Reference FixGridReference(Document document, Reference reference)
{
var grid = document.GetElement(reference) as Grid;
return grid == null ? reference : new Reference(grid);
}
private static string GetDimensionZeroString(Dimension dimension)
{
var formatOptions = dimension.DimensionType.GetUnitsFormatOptions();
var formatValueOptions = new FormatValueOptions();
formatValueOptions.SetFormatOptions(formatOptions);
return UnitFormatUtils.Format(dimension.Document.GetUnits(), UnitType.UT_Length, 0, false, false, formatValueOptions);
}