Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Николай Горлов от 12-02-2015, 12:20:12

Название: внутри редактора блоков?
Отправлено: Николай Горлов от 12-02-2015, 12:20:12
Добрый день, когда-то интересовал вопрос, как узнать из arx команды, открыт ли в данный момент редактор блоков или мы просто находимся в пространстве модели/листа (тогда отделался легким испугом без выяснений того, где мы находимся). Про модель/лист понятно, и вопросов никаких не вызывает. А что насчет именно окошка редактирования внутренностей блока? В какую сторону копать. Про флаг ACRX_CMD_NOBEDIT знаю. Интересует именно программно выяснить, где мы находимся, т.к. чуйка у меня :), нужно будет писать команду именно работающую в модели и в окне редактора блоков, и следовательно, начать нужно с выяснения, где именно мы находимся.
Название: Re: внутри редактора блоков?
Отправлено: Александр Ривилис от 12-02-2015, 13:28:54
Думаю что это то, что ты ищешь:
Системная переменная BLOCKEDITOR (http://exchange.autodesk.com/autocadlt/rus/online-help/ACDLT/2012/RUS/pages/WS1a9193826455f5ffa23ce210c4a30acaf-50f0.htm)
Ну и еще на всякий случай:
Системная переменная REFEDITNAME (http://exchange.autodesk.com/autocadlt/rus/online-help/ACDLT/2012/RUS/pages/WS1a9193826455f5ffa23ce210c4a30acaf-4ebc.htm)
Название: Re: внутри редактора блоков?
Отправлено: Николай Горлов от 16-02-2015, 11:55:34
спс. BLOCKEDITOR - то что нужно.
Название: Re: внутри редактора блоков?
Отправлено: Александр Ривилис от 25-06-2015, 20:43:53
Второй вариант для выяснения находимся ли мы в редакторе блоков и если мы в редакторе блоков, то узнаём имя блока. Код работает начиная с 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. }
Название: Re: внутри редактора блоков?
Отправлено: Леонид Семенов от 16-11-2016, 13:02:49
Второй вариант для выяснения находимся ли мы в редакторе блоков и если мы в редакторе блоков, то узнаём имя блока. Код работает начиная с 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. }


А можно этот код на C# реализовать?
Название: Re: внутри редактора блоков?
Отправлено: Александр Ривилис от 16-11-2016, 13:08:31
Да. И это было уже сделано: http://adn-cis.org/forum/index.php?topic=2619.0
Название: Re: внутри редактора блоков?
Отправлено: Леонид Семенов от 16-11-2016, 13:12:08
Спасибо