Как обновить внутренние представления Polyline2d / 3d после удаления вертексов?

Автор Тема: Как обновить внутренние представления Polyline2d / 3d после удаления вертексов?  (Прочитано 1004 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
Редактирую полилинии Polyline2d и 3d. Добавляю вертексы, удаляю через vertex.Erase(). Все работает. НО. Если в той же команде дальше пытаться работать с полилинией, то оказывается, что сбоят почти все свойства и методы. Даже StartPoint может выдать ошибку, если удален первый вертекс. Очевидно, что полилиния не перечерчена где-то внутри своих скрытых данных. Стандартные методы обновления не работают (транзакциями хлопал, Regen, QueueForGraphicsFlush, RecordGraphicsModified и тому подобные методы вызывал). Может кто знает как полилинию привести в соответствие с обновленными вертексами?

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Саму полилинию открывать ForWrite. Ну и Commit транзакции. А еще лучше попробуй эмуляцию транзакции или ObjectId.Open/Close
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
Саму полилинию открывать ForWrite. Ну и Commit транзакции.
Это первым делом пробовал. Что-то еще Автокад вызывает, когда завершает команду.

Оффлайн alz

  • ADN OPEN
  • ***
  • Сообщений: 111
  • Карма: 14
Попробовать реген через ком? Что-то типа такого.

Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.Interop;
  3. using Autodesk.AutoCAD.Interop.Common;
  4.  
  5. namespace MiniProgram.Program
  6. {
  7.  
  8.     public static class SupportClass
  9.     {
  10.  
  11.         public static void Regen()
  12.         {
  13.             Document doc = Application.DocumentManager.MdiActiveDocument;
  14.             if (doc == null) return;
  15.             (doc.GetAcadDocument() as AcadDocument).Regen(AcRegenType.acAllViewports);
  16.         }
  17.     }
  18. }

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 119
Может кто знает как полилинию привести в соответствие с обновленными вертексами?

Попробуй метод Reset у Polyline.

У Polyline2d и Polyline3d возможно нельзя удалять все вершины, должно остаться минимум 2шт, иначе объект считается некорректным, если присутствует хотя-бы 2 вершины можно попробовать завершить транзакцию и обратиться к свойствам, хотя ты говоришь уже пробовал.
Возможно также нельзя удалять первую вершину, а необходимо ее заменять с помощью методов void InsertVertexAt(Vertex2d indexVertex, Vertex2d newVertex); или ObjectId InsertVertexAt(ObjectId vertexId, Vertex2d newVertex);

Как вариант, имея все вершины, их должно быть не менее 2х, удалить старую и создать по новой, один из конструкторов принимает Point3dCollection.
Polyline2d(Poly2dType type, Point3dCollection vertices, double elevation, bool closed, double startWidth, double endWidth, DoubleCollection bulges);
protected internal Polyline2d(IntPtr unmanagedObjPtr, bool autoDelete);

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 626
  • Карма: 161
    • ПГСу Бложик
А если так?
Код - C# [Выбрать]
  1. Autodesk.AutoCAD.Internal.Utils.RegenEntity(objId);

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

  • ADN Club
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
Спасибо всем, но я уже пошел в обход: вместо редактирования старой полилинии создаю полностью новую, а старую удаляю целиком. Так что код уже переделан и проверить не могу.
Но довольно часто бывает, что какие-то объекты упрямо не обновляются никакими Regen даже после завершения команды и метод Utils.RegenEntity возьму на заметку - возможно пригодится.

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 626
  • Карма: 161
    • ПГСу Бложик
Utils.RegenEntity я как то нашел на ГитХаб, вместе с комментом:
Цитировать
A little hack to help ensure the entity and grips are regenerated.
и нашел, когда искал аналог лисповского entupd