ADN Club > AutoCAD .NET API

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

(1/2) > >>

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

Александр Ривилис:
Саму полилинию открывать ForWrite. Ну и Commit транзакции. А еще лучше попробуй эмуляцию транзакции или ObjectId.Open/Close

avc:

--- Цитата: Александр Ривилис от 17-01-2025, 15:48:50 ---Саму полилинию открывать ForWrite. Ну и Commit транзакции.
--- Конец цитаты ---
Это первым делом пробовал. Что-то еще Автокад вызывает, когда завершает команду.

alz:
Попробовать реген через ком? Что-то типа такого.


--- Код - C# [Выбрать] ---using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.Interop;using Autodesk.AutoCAD.Interop.Common; namespace MiniProgram.Program{     public static class SupportClass    {         public static void Regen()        {            Document doc = Application.DocumentManager.MdiActiveDocument;            if (doc == null) return;            (doc.GetAcadDocument() as AcadDocument).Regen(AcRegenType.acAllViewports);        }    }}

Привалов Дмитрий:

--- Цитата: avc от 17-01-2025, 15:06:42 ---Может кто знает как полилинию привести в соответствие с обновленными вертексами?
--- Конец цитаты ---

Попробуй метод 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);

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии