ADN Club > AutoCAD .NET API
Как обновить внутренние представления Polyline2d / 3d после удаления вертексов?
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);
Навигация
Перейти к полной версии