Получение имени блока редактируемого в данный момент пользователем

Автор Тема: Получение имени блока редактируемого в данный момент пользователем  (Прочитано 4770 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Вопрос к А.Ривилису: Александр нашел вашу небольшую переписку с Virupaksha Aithal(по русски не осмелился написать)
Удалось как нибудь решить данную задачу ?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я дополнительно задал вопрос в ADN DevHelp. После их исследования и переписки с командой инженеров выяснилось, что нет API, которое бы позволяло узнать имя блока внутри команды _BEDIT. Если используется _REFEDIT, то есть системная переменная _REFEDITNAME.
ADN DevHelp подало пожелание о дополнительном API в следующих версиях. Но без бизнес-кейса это пожелание может так и остаться нереализованным. Как минимум нужно уточнить количество пользователей, которых затрагивает эта проблема и возможность/невозможность обойти эту проблему другим способом.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Обнаружил недокументированную функцию, экспортируемую из acad.exe (начиная с AutoCAD 2013 из accore.dll):
Код - C++ [Выбрать]
  1. class AcString __cdecl acedGetBlockEditBlockName(void);
В ObjectARX ею можно воспользоваться для получения имени редактируемого блока в редакторе блоков. Теоретически можно вызвать и из .NET через P/Invoke, но будет проблема с преобразованием неуправляемого AcString в string.
« Последнее редактирование: 25-06-2015, 20:05:31 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Оказывается эти недокументированные функции есть начиная с AutoCAD 2009.

Код - C++ [Выбрать]
  1. //--------------------------------------------------------------
  2. //  Эти функции экспортируются из acad.exe (или accore.dll
  3. //  начиная с AutoCAD 2013) и требуют соотвественно для линковки
  4. //  acad.lib (или accore.lib для версий начиная с 2013)
  5. //--------------------------------------------------------------
  6. class AcString __cdecl acedGetBlockEditBlockName(void);
  7. bool __cdecl acedIsDocumentInBlockEditor(class AcApDocument *);
  8.  
  9. static void TestBEdit () {
  10.   if (acedIsDocumentInBlockEditor(curDoc()))
  11.   {
  12.     acutPrintf(_T("\nМы в редакторе блока %s"),
  13.         acedGetBlockEditBlockName().constPtr());
  14.   } else {
  15.     acutPrintf(_T("\nМы в не в редакторе блоков"));
  16.   }
  17. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 26-06-2015, 13:15:39

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще немного покопался в мозгах в файле acmgd.dll и обнаружил, что от меня "скрыли" решение. Вот как эта задача решается при помощи AutoCAD .NET API начиная с версии 2010 (с 2009 как оказалось):
Код - C# [Выбрать]
  1. using System;
  2. using System.Reflection;
  3. using System.Runtime.InteropServices;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.Geometry;
  8. using Autodesk.AutoCAD.EditorInput;
  9. using Autodesk.AutoCAD.Internal;
  10.  
  11. [assembly: CommandClass(typeof(Rivilis.BEdit))]
  12.  
  13. namespace Rivilis
  14. {
  15.   public class BEdit
  16.   {
  17.     [CommandMethod("TestBEDIT")]
  18.     public void TestBEdit()
  19.     {
  20.       Document doc = Application.DocumentManager.MdiActiveDocument;
  21.       Editor ed;
  22.       if (doc != null)
  23.       {
  24.         ed = doc.Editor;
  25.         if (AcAeUtilities.IsInBlockEditor())
  26.         {
  27.           ed.WriteMessage("\nМы в редакторе блока \"{0}\"", AcAeUtilities.GetBlockName());
  28.         }
  29.         else
  30.         {
  31.           ed.WriteMessage("\nМы НЕ в редакторе блока");
  32.         }
  33.       }
  34.     }
  35.   }
  36. }

Придётся "разобраться" с ADN DevHelp почему они не предложили этот вариант, если ему уже больше пяти лет.
« Последнее редактирование: 26-06-2015, 13:16:02 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
почему они не предложили этот вариант, если ему уже больше пяти лет.
К сожалению, это далеко не единичный случай и как-то уж очень слабо верится, что ситуация может измениться. Да, собственно, чего далеко-то ходить: тынц. Вот и вам, в данном случае, ответили точно так же - обозначив свой вариант  аля "я уверен", вместо того, чтобы на самом деле попытаться разобраться. Так что удивляться не приходится - это просто отношение к работе такое.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В данном случае я не совсем правильно задал им вопрос, проведя параллель с системной переменной REFEDITNAME для команды _REFEDIT. Впрочем я просил дать решение на любом API.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Андрей Бушман проверил, что этот код работает и в AutoCAD 2009 если подключить acmgdinternal.dll из каталога с acad.exe (в составе ObjectARX SDK этого файла нет).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение