выбор сегмента полилиниии

Автор Тема: выбор сегмента полилиниии  (Прочитано 19117 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #60 : 16-10-2018, 21:07:16 »
это принципиально или просто для наглядности?
Для наглядности.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: выбор сегмента полилиниии
« Ответ #61 : 16-10-2018, 21:12:57 »
Тогда какую роль играет это направление? Какая разница между этими методами

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: выбор сегмента полилиниии
« Ответ #62 : 16-10-2018, 21:16:02 »
И по поводу upgradeopen. Зачем он тут вообще если в любом случае нужно будет взять на запись?
И вечное противостояние open и транзакции..

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #63 : 16-10-2018, 21:18:40 »
И по поводу upgradeipen. Зачем он тут вообще если в любом случае нужно будет взять на запись?
В данном случае это неважно. Но я в большинстве случаев предпочитаю открывать на запись на минимально короткое время.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: выбор сегмента полилиниии
« Ответ #64 : 16-10-2018, 21:20:50 »
Понял.
Спсибо большое.
Вы снова спасли ситуацию)

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #65 : 16-10-2018, 21:21:04 »
Тогда какую роль играет это направление? Какая разница между этими методами
Пришлось использовать метод, который не учитывает направление. Но боюсь, что возможны варианты, когда это не будет работать, т.е. будет выбираться не тот сегмент полилинии, т.к. в качестве ближайшей точки будет выбрана не та, которая нам нужна.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #66 : 16-10-2018, 21:46:23 »
Ну вот ты и нарвался на баг в AutoCAD .NET API, с чем тебя и поздравляю. Нужно будет отправить в ADN DevHelp.
Похоже в этот раз я не прав и это не баг. Баг в другом - в вычислении направления взгляда.
Протестируй этот код:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using App = Autodesk.AutoCAD.ApplicationServices.Application;
  8.  
  9. #pragma warning disable 0618
  10.  
  11. // This line is not mandatory, but improves loading performances
  12. [assembly: CommandClass(typeof(ChangeSegmentWidth.MyCommands))]
  13.  
  14. namespace ChangeSegmentWidth
  15. {
  16.  
  17.   public class MyCommands
  18.   {
  19.     static double def = 0.0;
  20.     [CommandMethod("ChgWidth")]
  21.     public void Width()
  22.     {
  23.       Document doc = App.DocumentManager.MdiActiveDocument;
  24.       Database db = doc.Database;
  25.       Editor ed = doc.Editor;
  26.  
  27.       PromptEntityOptions peo = new PromptEntityOptions("\nВыберите сегменты полилинии");
  28.       peo.SetRejectMessage("\nЭто не полилиния!");
  29.       peo.AddAllowedClass(typeof(Polyline), true);
  30.  
  31.       PromptDoubleOptions pdo = new PromptDoubleOptions("\nШирина сегмента полилинии");
  32.       pdo.DefaultValue = def;
  33.       PromptDoubleResult res = ed.GetDouble(pdo);
  34.  
  35.       double width = res.Value;
  36.       def = res.Value;
  37.  
  38.       while (true)
  39.       {
  40.         PromptEntityResult sel = ed.GetEntity(peo);
  41.         if (sel.Status == PromptStatus.OK)
  42.         {
  43.           using (Polyline pl = sel.ObjectId.Open(OpenMode.ForWrite) as Polyline)
  44.           {
  45.             Matrix3d u2w = ed.CurrentUserCoordinateSystem;
  46.             Vector3d viewDir = ed.GetCurrentView().ViewDirection;
  47.             Point3d pW = pl.GetClosestPointTo(sel.PickedPoint.TransformBy(u2w), viewDir, false);
  48.  
  49.             int n = (int)(pl.GetParameterAtPoint(pW) + 1e-10);
  50.  
  51.             if (pl.GetStartWidthAt(n) > 1e-10)
  52.             {
  53.               pl.SetStartWidthAt(n, 0.0); pl.SetEndWidthAt(n, 0.0);
  54.             }
  55.             else
  56.             {
  57.               pl.SetStartWidthAt(n, width); pl.SetEndWidthAt(n, width);
  58.             }
  59.           }
  60.         }
  61.         else break;
  62.       }
  63.     }
  64.   }
  65. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: выбор сегмента полилиниии
« Ответ #67 : 16-10-2018, 22:01:19 »
О ДА! этот вариант отрабатывает во всех вариантах
вот эта строчка не очень понятна. вы не доверяете точности метода?
int n = (int)(pl.GetParameterAtPoint(pW) + 1e-10);

и эту строчку
if (pl.GetStartWidthAt(n) > 1e-10)
написал вот так
Код - C# [Выбрать]
  1. if (Math.Abs(pl.GetStartWidthAt(n) - width) > 1e-5)
так если ширина уже какая то установлена то он ее не обнуляет а меняет на актуальную.

еще раз спасибо!

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #68 : 16-10-2018, 22:05:35 »
НЕАКТУАЛЕН! ПРОТЕСТИРУЮ ИСПРАВЛЮ
Ну да если в других плоскостях то тоже неправильно работает.
а предыдущий вроде бы лучше в пространстве работал. но зато в более простых плоских чертежах со смещенным началом координат шалит.
т.к. у меня обычно плоские и простые так что оставлю последний вариант.
Ничего не понял. Ты про какой вариант пишешь?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: выбор сегмента полилиниии
« Ответ #69 : 16-10-2018, 22:11:24 »
да я написал это сообщение а потом увидел ваш обновленный код и быстренько добавил примечание что комментарий неактуален. теперь изменил.
это сообщение можно удалить)

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #70 : 16-10-2018, 22:16:14 »
вот эта строчка не очень понятна. вы не доверяете точности метода?
Цитата: Александр Ривилис от 16-10-2018, 21:46:23

    int n = (int)(pl.GetParameterAtPoint(pW) + 1e-10);

При преобразовании плавающего к целому отбрасываются дробная часть. Поэтому (int)0.99999999999 будет равно 0, а не 1

написал вот так
Код - C# [Выбрать]

    if (Math.Abs(pl.GetStartWidthAt(n) - width) > 1e-5)

так если ширина уже какая то установлена то он ее не обнуляет а меняет на актуальную.
Согласен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: выбор сегмента полилиниии
« Ответ #71 : 16-10-2018, 22:21:02 »
При преобразовании плавающего к целому отбрасываются дробная часть. Поэтому (int)0.99999999999 будет равно 0, а не 1
это я знаю
но может мы на конец желаемого сегмента нажали.. и получилось 0.9999999999 а программа выберет следующий.. неприятно

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #72 : 16-10-2018, 22:23:51 »
При преобразовании плавающего к целому отбрасываются дробная часть. Поэтому (int)0.99999999999 будет равно 0, а не 1
это я знаю
но может мы на конец желаемого сегмента нажали.. и получилось 0.9999999999 а программа выберет следующий.. неприятно
1. С такой точностью ты не выберешь конец сегмента.
2. Даже если выберешь конечную точку, то тут спорный вопрос - какой сегмент нужно в этом случае выбирать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: выбор сегмента полилиниии
« Ответ #73 : 16-10-2018, 22:25:57 »
ну а как может получиться 0,99999999 при нажатии на начало второго сегмента тогда?
скорее будет 1,000000001?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: выбор сегмента полилиниии
« Ответ #74 : 16-10-2018, 22:28:32 »
ну а как может получиться 0,99999999 при нажатии на начало второго сегмента тогда?
скорее будет 1,000000001?
Да. А к чему этот вопрос? Это утверждение противоречит чему-то, что я писал?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение