ADN Club > AutoCAD .NET API
Асоциативные размеры и мультивыноски
xSAKABSx:
Нужно программно отвязать мультивыноски и размеры от объектов, но куда смотреть никак не пойму
направьте меня в нужное русло товарищи
Андрей Бушман:
Что подразумевается под "отвязать мультивыноску от объекта"? Размер не привязан к объекту, если он (размер) не ассоциативен.
Александр Ривилис:
Думаю что с помощью AutoCAD .NET API это почти всё, что можно сделать:
--- Код - C# [Выбрать] ---using System;using AcRx = Autodesk.AutoCAD.Runtime;using AcAp = Autodesk.AutoCAD.ApplicationServices;using AcDb = Autodesk.AutoCAD.DatabaseServices;using AcGe = Autodesk.AutoCAD.Geometry;using AcEd = Autodesk.AutoCAD.EditorInput;[assembly: AcRx.CommandClass(typeof(Rivilis.RemoveAssoc))]namespace Rivilis{ public class RemoveAssoc { [AcRx.CommandMethod("RemAssoc", AcRx.CommandFlags.Modal | AcRx.CommandFlags.UsePickSet)] public void RemAssoc() { AcAp.Document curDoc = AcAp.Application.DocumentManager.MdiActiveDocument; AcEd.Editor ed = curDoc.Editor; ////////////////////////////////////////////////////////////////////////// // Запрашиваем у пользователя выбор примитивов. Но не размеры и мультивыноски, // а примитивы, с которыми эти размеры ассоциированы. // При этом размеры мы пропускаем. ////////////////////////////////////////////////////////////////////////// AcEd.PromptSelectionResult result = ed.GetSelection(); if (result.Status == AcEd.PromptStatus.OK) { AcDb.ObjectId[] ids = result.Value.GetObjectIds(); using (AcDb.Transaction tr = curDoc.TransactionManager.StartTransaction()) { foreach (AcDb.ObjectId id in ids) { try { AcDb.DBObject obj = tr.GetObject(id, AcDb.OpenMode.ForWrite); // Пропускаем размеры и мультивыноски if (obj != null && (obj as AcDb.Dimension) == null ) { // Получаем все постоянные реакторы AcDb.ObjectIdCollection idsReact = obj.GetPersistentReactorIds(); foreach (AcDb.ObjectId idReact in idsReact) { AcDb.DBObject objReact = tr.GetObject(idReact, AcDb.OpenMode.ForWrite); if (objReact != null) { // Если это DimAssoc - удаляем его // Тем самым мы разрываем связь размера и этого примитива if (objReact.GetRXClass().Name == "AcDbDimAssoc") { objReact.Erase(); } } } } } catch { } } tr.Commit(); } } } }}
Впрочем можно запустить команду _DIMDISASSOCIATE, но тогда зачем вообще программировать, да еще и на .NET...
Александр Ривилис:
А так наверное будет правильно. Ассоциация убивается только у выбранных размеров и мультивыносок:
--- Код - C# [Выбрать] ---using System;using AcRx = Autodesk.AutoCAD.Runtime;using AcAp = Autodesk.AutoCAD.ApplicationServices;using AcDb = Autodesk.AutoCAD.DatabaseServices;using AcGe = Autodesk.AutoCAD.Geometry;using AcEd = Autodesk.AutoCAD.EditorInput;[assembly: AcRx.CommandClass(typeof(Rivilis.RemoveAssoc))]namespace Rivilis{ public class RemoveAssoc { [AcRx.CommandMethod("RemAssoc", AcRx.CommandFlags.Modal | AcRx.CommandFlags.UsePickSet)] public void RemAssoc() { AcAp.Document curDoc = AcAp.Application.DocumentManager.MdiActiveDocument; AcEd.Editor ed = curDoc.Editor; ////////////////////////////////////////////////////////////////////////// // Запрашиваем пользователя выбрать размеры и мультивыноски. ////////////////////////////////////////////////////////////////////////// AcEd.SelectionFilter flt = new AcEd.SelectionFilter( new AcDb.TypedValue[] { new AcDb.TypedValue(0, "DIMENSION,MULTILEADER") } ); AcEd.PromptSelectionResult result = ed.GetSelection(flt); if (result.Status == AcEd.PromptStatus.OK) { AcDb.ObjectId[] ids = result.Value.GetObjectIds(); using (AcDb.Transaction tr = curDoc.TransactionManager.StartTransaction()) { foreach (AcDb.ObjectId id in ids) { try { AcDb.DBObject obj = tr.GetObject(id, AcDb.OpenMode.ForRead); if (obj != null) { // Получаем Extension Dictionary AcDb.ObjectId idExt = obj.ExtensionDictionary; try { AcDb.DBDictionary dict = tr.GetObject(idExt, AcDb.OpenMode.ForRead) as AcDb.DBDictionary; if (dict != null) { AcDb.ObjectId idDimAssoc = dict.GetAt("ACAD_DIMASSOC"); if (!idDimAssoc.IsNull) { AcDb.DBObject dimAssoc = tr.GetObject(idDimAssoc, AcDb.OpenMode.ForWrite); // Если это DimAssoc - удаляем его // Тем самым мы разрываем связь размера и примитива if (dimAssoc.GetRXClass().Name == "AcDbDimAssoc") { dimAssoc.Erase(); } } } } catch { }; } } catch { } } tr.Commit(); } } } }}
xSAKABSx:
--- Цитата: Александр Ривилис от 14-01-2014, 10:10:08 ---А так наверное будет правильно. Ассоциация убивается только у выбранных размеров и мультивыносок:
--- Код - C# [Выбрать] ---.....
--- Конец цитаты ---
Александр премного благодарен!
пораб уже на форум кнопку спасибо прикрутить !
Навигация
Перейти к полной версии