ADN Club > AutoCAD .NET API

Асоциативные размеры и мультивыноски

(1/3) > >>

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# [Выбрать] ---..... 
--- Конец цитаты ---
Александр премного благодарен!
пораб уже на форум кнопку спасибо прикрутить !

Навигация

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

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

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