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

Автор Тема: Асоциативные размеры и мультивыноски  (Прочитано 12975 раз)

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

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

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Нужно программно отвязать мультивыноски и размеры от объектов, но куда смотреть никак не пойму
направьте меня в нужное русло  товарищи

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Что подразумевается под "отвязать мультивыноску от объекта"? Размер не привязан к объекту, если он (размер) не ассоциативен.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Думаю что с помощью AutoCAD .NET API это почти всё, что можно сделать:
Код - C# [Выбрать]
  1. using System;
  2. using AcRx = Autodesk.AutoCAD.Runtime;
  3. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  4. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  5. using AcGe = Autodesk.AutoCAD.Geometry;
  6. using AcEd = Autodesk.AutoCAD.EditorInput;
  7. [assembly: AcRx.CommandClass(typeof(Rivilis.RemoveAssoc))]
  8. namespace Rivilis
  9. {
  10.   public class RemoveAssoc
  11.   {
  12.     [AcRx.CommandMethod("RemAssoc", AcRx.CommandFlags.Modal | AcRx.CommandFlags.UsePickSet)]
  13.     public void RemAssoc()
  14.     {
  15.       AcAp.Document curDoc = AcAp.Application.DocumentManager.MdiActiveDocument;
  16.       AcEd.Editor ed = curDoc.Editor;
  17.       //////////////////////////////////////////////////////////////////////////
  18.       // Запрашиваем у пользователя выбор примитивов. Но не размеры и мультивыноски,
  19.       // а примитивы, с которыми эти размеры ассоциированы.
  20.       // При этом размеры мы пропускаем.
  21.       //////////////////////////////////////////////////////////////////////////
  22.       AcEd.PromptSelectionResult result = ed.GetSelection();
  23.       if (result.Status == AcEd.PromptStatus.OK) {
  24.         AcDb.ObjectId[] ids = result.Value.GetObjectIds();
  25.         using (AcDb.Transaction tr = curDoc.TransactionManager.StartTransaction()) {
  26.           foreach (AcDb.ObjectId id in ids) {
  27.             try {
  28.               AcDb.DBObject obj = tr.GetObject(id, AcDb.OpenMode.ForWrite);
  29.               // Пропускаем размеры и мультивыноски
  30.               if (obj != null && (obj as AcDb.Dimension) == null ) {
  31.                 // Получаем все постоянные реакторы
  32.                 AcDb.ObjectIdCollection idsReact = obj.GetPersistentReactorIds();
  33.                 foreach (AcDb.ObjectId idReact in idsReact) {
  34.                   AcDb.DBObject objReact = tr.GetObject(idReact, AcDb.OpenMode.ForWrite);
  35.                   if (objReact != null) {
  36.                     // Если это DimAssoc - удаляем его
  37.                     // Тем самым мы разрываем связь размера и этого примитива
  38.                     if (objReact.GetRXClass().Name == "AcDbDimAssoc") {
  39.                       objReact.Erase();
  40.                     }
  41.                   }
  42.                 }
  43.               }
  44.             } catch { }
  45.           }
  46.           tr.Commit();
  47.         }
  48.       }
  49.     }
  50.   }
  51. }

Впрочем можно запустить команду _DIMDISASSOCIATE, но тогда зачем вообще программировать, да еще и на .NET...
« Последнее редактирование: 13-01-2014, 21:50:17 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А так наверное будет правильно. Ассоциация убивается только у выбранных размеров и мультивыносок:
Код - C# [Выбрать]
  1. using System;
  2. using AcRx = Autodesk.AutoCAD.Runtime;
  3. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  4. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  5. using AcGe = Autodesk.AutoCAD.Geometry;
  6. using AcEd = Autodesk.AutoCAD.EditorInput;
  7. [assembly: AcRx.CommandClass(typeof(Rivilis.RemoveAssoc))]
  8. namespace Rivilis
  9. {
  10.   public class RemoveAssoc
  11.   {
  12.     [AcRx.CommandMethod("RemAssoc", AcRx.CommandFlags.Modal | AcRx.CommandFlags.UsePickSet)]
  13.     public void RemAssoc()
  14.     {
  15.       AcAp.Document curDoc = AcAp.Application.DocumentManager.MdiActiveDocument;
  16.       AcEd.Editor ed = curDoc.Editor;
  17.       //////////////////////////////////////////////////////////////////////////
  18.       // Запрашиваем пользователя выбрать размеры и мультивыноски.
  19.       //////////////////////////////////////////////////////////////////////////
  20.       AcEd.SelectionFilter flt = new AcEd.SelectionFilter(
  21.         new AcDb.TypedValue[] { new AcDb.TypedValue(0, "DIMENSION,MULTILEADER") }
  22.       );
  23.       AcEd.PromptSelectionResult result = ed.GetSelection(flt);
  24.  
  25.       if (result.Status == AcEd.PromptStatus.OK) {
  26.         AcDb.ObjectId[] ids = result.Value.GetObjectIds();
  27.         using (AcDb.Transaction tr = curDoc.TransactionManager.StartTransaction()) {
  28.           foreach (AcDb.ObjectId id in ids) {
  29.             try {
  30.               AcDb.DBObject obj = tr.GetObject(id, AcDb.OpenMode.ForRead);
  31.               if (obj != null) {
  32.                 // Получаем Extension Dictionary
  33.                 AcDb.ObjectId idExt = obj.ExtensionDictionary;
  34.                 try {
  35.                   AcDb.DBDictionary dict = tr.GetObject(idExt, AcDb.OpenMode.ForRead) as AcDb.DBDictionary;
  36.                   if (dict != null) {
  37.                     AcDb.ObjectId idDimAssoc = dict.GetAt("ACAD_DIMASSOC");
  38.                     if (!idDimAssoc.IsNull) {
  39.                       AcDb.DBObject dimAssoc = tr.GetObject(idDimAssoc, AcDb.OpenMode.ForWrite);
  40.                       // Если это DimAssoc - удаляем его
  41.                       // Тем самым мы разрываем связь размера и примитива
  42.                       if (dimAssoc.GetRXClass().Name == "AcDbDimAssoc") {
  43.                         dimAssoc.Erase();
  44.                       }
  45.                     }
  46.                   }
  47.                 }
  48.                 catch { };
  49.               }
  50.             } catch { }
  51.           }
  52.           tr.Commit();
  53.         }
  54.       }
  55.     }
  56.   }
  57. }
  58.  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 36
  • Карма: 1
А так наверное будет правильно. Ассоциация убивается только у выбранных размеров и мультивыносок:
Код - C# [Выбрать]
  1. .....
  2.  
Александр премного благодарен!
пораб уже на форум кнопку спасибо прикрутить !

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
А так наверное будет правильно. Ассоциация убивается только у выбранных размеров и мультивыносок:
...
А обратная задача? Неассоциативные сделать ассоциативными. :)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Команда _DIMREASSOCIATE. Средствами AutoCAD .NET API пожалуй это сделать невозможно, так как нет обертки для класса AcDbDimAssoc, который как раз и позволяет сделать ассоциацию размера.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Средствами AutoCAD .NET API пожалуй это сделать невозможно
Очень жаль.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно конечно попытаться через P/Invoke, но это будет очень сложно и трудоемко, отдельные функции для x86, отдельные для x64...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Прошло почти 8 лет, ничего не поменялось? Поиск по API 2022 ни к чему не привел, но может я не внимательный, потому и уточняю.


И на всякий случай закину старые ссылки по теме:
https://adndevblog.typepad.com/autocad/2015/03/creating-associative-dimension-in-paperspace-associated-to-a-modelspace-entity.html
https://adndevblog.typepad.com/autocad/2015/02/making-a-custom-entity-associative-dimension-enabled.html

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Прошло почти 8 лет, ничего не поменялось? Поиск по API 2022 ни к чему не привел, но может я не внимательный, потому и уточняю.
Нет. Эти возможности остались только в ObjectARX.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение