Удаление нулевых размеров

Автор Тема: Удаление нулевых размеров  (Прочитано 2333 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн enotАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 485
  • Карма: 2
Как удалить нулевые размеры из размерной цепочки? 



Отмечено как Решение enot 05-02-2021, 16:40:39

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1084
  • Карма: 319
  • Skype: alexandr.ignatovich.itc
Re: Удаление нулевых размеров
« Ответ #1 : 03-02-2021, 14:12:59 »
Самый лучший вариант - не создавать :-) Следующий вариант - пересоздать без нулевых сегментов. Последний вариант (самый неудачный) задать у DimensionSegment-а свойство ValueOverride = " "

Оффлайн enotАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 485
  • Карма: 2
Re: Удаление нулевых размеров
« Ответ #2 : 03-02-2021, 14:15:41 »
 - а как то можно заранее проверить какие referens - ы сдвоены и дают нулевой размер , один из них исключить ?

- "пересоздать без нулевых сегментов" - как сделать проверку на нулевые сегменты , и получить их reference

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1084
  • Карма: 319
  • Skype: alexandr.ignatovich.itc
Re: Удаление нулевых размеров
« Ответ #3 : 03-02-2021, 14:19:58 »
Можно, но сложно. Смотри по свойству ElementReferenceType на что она ссылается, дальше в зависимости от типа получаешь или элемент целиком (например, Grid) или поверхность элемента, на который ссылается Reference или линию, или ребро...

Оффлайн enotАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 485
  • Карма: 2
Re: Удаление нулевых размеров
« Ответ #4 : 03-02-2021, 16:17:15 »
К вопросу о определении сдвоенных Reference - как проверить что два вектора лежат на одной линии (коллениарность определили), или вектор пересекает точку?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1084
  • Карма: 319
  • Skype: alexandr.ignatovich.itc
Re: Удаление нулевых размеров
« Ответ #5 : 03-02-2021, 16:26:52 »
За такой вопрос хочу побить учебником геометрии за 6 класс  ;D

Видимо, ты имел ввиду "как определить, что два отрезка лежат на одной прямой?" Что при условии того, что ты определил коллинеарность отрезков превращается в вопрос "Принадлежит ли любая точка отрезка A прямой B". Тут уже всё просто, обсуждалось 100500 раз, в т.ч. на этом форуме

Оффлайн enotАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 485
  • Карма: 2
Re: Удаление нулевых размеров
« Ответ #6 : 03-02-2021, 16:42:11 »
Коллениарность XYZ vector1 и XYZ vector2 определена, теперь требуется определить лежат ли они на одной оси

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 12963
  • Карма: 1666
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удаление нулевых размеров
« Ответ #7 : 03-02-2021, 16:43:37 »
enot,
Для векторов нет понятия "лежат на одной оси". Это для отрезков есть понятие принадлежат ли они одной линии или нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн enotАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 485
  • Карма: 2
Re: Удаление нулевых размеров
« Ответ #8 : 03-02-2021, 16:46:53 »
Вектора, параллельные одной прямой или лежащие на одной прямой называют коллинеарными векторами - вот мне нужно определить что именно лежащие на одной прямой


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 12963
  • Карма: 1666
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удаление нулевых размеров
« Ответ #9 : 03-02-2021, 16:52:15 »
Вектора, параллельные одной прямой или лежащие на одной прямой называют коллинеарными векторами
Видимо мы учили разную геометрию в школе. Еще раз. Не путай отрезок прямой и вектор.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн enotАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 485
  • Карма: 2
Re: Удаление нулевых размеров
« Ответ #10 : 05-02-2021, 16:03:29 »
Последний вариант (самый неудачный) задать у DimensionSegment-а свойство ValueOverride = " "
Почему ValueOverride  изменяет не все значения в Dimension?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1084
  • Карма: 319
  • Skype: alexandr.ignatovich.itc
Re: Удаление нулевых размеров
« Ответ #11 : 05-02-2021, 16:18:54 »
Не знаю, не встречал

Оффлайн enotАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 485
  • Карма: 2
Re: Удаление нулевых размеров
« Ответ #12 : 05-02-2021, 16:34:34 »
Все , понял, в размере идет округление до целых чисел, небольшое значение округляется до 0,0

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1596
  • Карма: 350
  • Отец modplus.org
    • ModPlus
Re: Удаление нулевых размеров
« Ответ #13 : 07-02-2021, 20:08:17 »
Код - C# [Выбрать]
  1.         /// <summary>
  2.         /// Удаление нулей из размерной цепочки. В случае, если нулей не найдено, возвращает False. Иначе - True и
  3.         /// массив <see cref="Reference"/> для пересоздания размерной цепочки без нулей
  4.         /// </summary>
  5.         /// <param name="dimension">Проверяемая размерная цепочка</param>
  6.         /// <param name="referenceArray">Массив <see cref="Reference"/> для пересоздания размерной цепочки</param>
  7.         /// <returns>True - размерная цепочка имела нули и требуется пересоздать её. Иначе false</returns>
  8.         public static bool TryRemoveZeroes(Dimension dimension, out ReferenceArray referenceArray)
  9.         {
  10.             referenceArray = new ReferenceArray();
  11.            
  12.             if (dimension.Segments.IsEmpty)
  13.                 return false;
  14.  
  15.             var doc = dimension.Document;
  16.  
  17.             var reCreate = false;
  18.             for (var i = 0; i < dimension.NumberOfSegments; i++)
  19.             {
  20.                 var segment = dimension.Segments.get_Item(i);
  21.                 var value = segment.Value;
  22.                 if (value.HasValue && Math.Abs(value.Value) < 0.0001)
  23.                 {
  24.                     reCreate = true;
  25.                 }
  26.                 else
  27.                 {
  28.                     if (i == 0)
  29.                         referenceArray.Append(dimension.References.get_Item(i).FixReference(doc));
  30.                     referenceArray.Append(dimension.References.get_Item(i + 1).FixReference(doc));
  31.                 }
  32.             }
  33.  
  34.             return reCreate;
  35.         }
  36.  
  37.         private static Reference FixReference(this Reference reference, Document doc)
  38.         {
  39.             if (reference.ElementReferenceType != ElementReferenceType.REFERENCE_TYPE_LINEAR &&
  40.                 doc.GetElement(reference.ElementId) is Grid grid)
  41.             {
  42.                 foreach (var geometryObject in grid.get_Geometry(new Options
  43.                 {
  44.                     ComputeReferences = true,
  45.                     IncludeNonVisibleObjects = true,
  46.                     View = doc.ActiveView
  47.                 }))
  48.                 {
  49.                     if (geometryObject is Line line && line.Reference != null)
  50.                     {
  51.                         return line.Reference;
  52.                     }
  53.                 }
  54.             }
  55.  
  56.             return reference;
  57.         }
  58.     }

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1084
  • Карма: 319
  • Skype: alexandr.ignatovich.itc
Re: Удаление нулевых размеров
« Ответ #14 : 12-02-2021, 11:38:12 »
Понадобилось тут внезапно решить схожую задачу (до этого обходился проверками перед созданием размеров, т.е. нулевых размеров не было на момент создания). Александр, за идею спасибо, однако, реализация немного подкачала.

Во-первых, тут баг. Возьми Dimension с 2 сегментами (3 референса), первый нулевой, твой код вернёт ReferenceArray с одним Reference-ом (последним).

Дальше, мне подумалось, что "0" в сегменте размерной цепочки определяется не столько значением segment.Value, сколько настройками unit-ов проекта, возможно переопределенными в типоразмере DimensionType.

Ну и, наконец, исправление Reference-а осей можно сделать проще, не залезая в его геометрию.

Как-то примерно так:
Код - C# [Выбрать]
  1. /// <summary>
  2. /// Удаление нулей из размерной цепочки. В случае, если нулей не найдено, возвращает False. Иначе - True и
  3. /// массив <see cref="Reference"/> для пересоздания размерной цепочки без нулей
  4. /// </summary>
  5. /// <param name="dimension">Проверяемая размерная цепочка</param>
  6. /// <param name="referencesArray">Массив <see cref="Reference"/> для пересоздания размерной цепочки</param>
  7. /// <returns>True - размерная цепочка имела нули и требуется пересоздать её. Иначе false</returns>
  8. public static bool TryRemoveZeroes(Dimension dimension, out ReferenceArray referencesArray)
  9. {
  10.         referencesArray = new ReferenceArray();
  11.        
  12.         if (dimension.Segments.IsEmpty)
  13.                 return false;
  14.  
  15.         var dimensionZeroString = GetDimensionZeroString(dimension);
  16.        
  17.         for (var i = 0; i < dimension.NumberOfSegments; ++i)
  18.         {
  19.                 var segment = dimension.Segments.get_Item(i);
  20.  
  21.                 if (segment.ValueString != dimensionZeroString)
  22.                 {
  23.                         if (referencesArray.IsEmpty)
  24.                                 referencesArray.Append(FixGridReference(document, dimension.References.get_Item(i)));
  25.  
  26.                         referencesArray.Append(FixGridReference(document, dimension.References.get_Item(i + 1)));
  27.                 }
  28.         }
  29.  
  30.         return referencesArray.Size < dimension.References.Size;
  31. }
  32.  
  33. private static Reference FixGridReference(Document document, Reference reference)
  34. {
  35.         var grid = document.GetElement(reference) as Grid;
  36.  
  37.         return grid == null ? reference : new Reference(grid);
  38. }
  39.  
  40. private static string GetDimensionZeroString(Dimension dimension)
  41. {
  42.         var formatOptions = dimension.DimensionType.GetUnitsFormatOptions();
  43.  
  44.         var formatValueOptions = new FormatValueOptions();
  45.  
  46.         formatValueOptions.SetFormatOptions(formatOptions);
  47.  
  48.         return UnitFormatUtils.Format(dimension.Document.GetUnits(), UnitType.UT_Length, 0, false, false, formatValueOptions);
  49. }