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

29/05/2013

Перехват вывода в текстовый экран и командную строку AutoCAD

Вопрос:

Как получить текстовый вывод команд, таких как СПИСОК (_LIST), а также скрыть вывод некоторых команд в командную строку?

Ответ:

Вы можете временно подменить объект HostApplicationServices своим собственным. Важнейшей функцией обратного вызова является consoleMessage(), которую вы можете переопределить по собственному усмотрению – или интерпретировать или игнорировать вызовы, сделанные при помощи acutPrintf() для отображения в командную строку или текстовый экран. Есть и другие функции обратного вызова, которые обязательно должны быть переопределены и перенаправлены на вызов оригинального объекта HostApplicationServices.

Очень важно понимать, что этот механизм следует использовать как можно более короткое время. AutoCAD предполагает, что используется стандартный объект HostApplicationServices – он может попытаться привести указатель к непубличному унаследованному классу. Так что необходимо заменять объект на как можно меньшее время.

Этот подход также не был всесторонне проверен для всех команд, поэтому эти инструменты следует использовать с осторожностью и будут нуждаться в более полном тестировании с командами, которые не проверялись с этим примером. Смотрите в конце статьи прилагаемый пример. Ключевым моментом является то, чтобы создать класс, производный от AcDbHostApplicationServices и переопределить некоторые необходимые методы. Ниже приводится некоторый код реализации класса, извлеченный из прилагаемого проекта.

Код - C++: [Выделить]
  1. class MyHostAppServices : public AcDbHostApplicationServices
  2. {
  3. public:
  4.      MyHostAppServices();
  5.      virtual ~MyHostAppServices();
  6.  
  7.      virtual Acad::ErrorStatus findFile(
  8.                      ACHAR * pcFullPathOut,
  9.         int   nBufferLength,
  10.         const ACHAR * pcFilename,
  11.         AcDbDatabase * pDb = NULL, // Когда происходит поиск
  12.                                    // связанный с db
  13.         AcDbHostApplicationServices::FindFileHint hint = kDefault);
  14.  
  15.     virtual AcadInternalServices* acadInternalServices();
  16.     virtual const ProdIdCode prodcode();
  17.  
  18.      virtual void displayChar(ACHAR c) const;
  19.     virtual void displayString(const ACHAR* string, int count) const;
  20.  
  21.      CString getOutput() const;
  22.  
  23. private:
  24.      AcDbHostApplicationServices *m_pOldHostServices;
  25.            
  26. };
  27.  
  28. CString m_szOutput;
  29.  
  30. MyHostAppServices::MyHostAppServices()
  31. {
  32.      m_pOldHostServices = acdbHostApplicationServices();
  33.      m_szOutput = "";
  34.  
  35.      Acad::ErrorStatus es = acdbSetHostApplicationServices( this );
  36.  
  37.     setWorkingGlobals( m_pOldHostServices->workingGlobals() );
  38.     setWorkingDatabase( m_pOldHostServices->workingDatabase() );
  39. }
  40.  
  41. MyHostAppServices::~MyHostAppServices()
  42. {
  43.      acdbSetHostApplicationServices( m_pOldHostServices );
  44.  
  45.     setWorkingGlobals( m_pOldHostServices->workingGlobals() );
  46.     setWorkingDatabase( m_pOldHostServices->workingDatabase() );
  47. }
  48.  
  49. Acad::ErrorStatus
  50. MyHostAppServices::findFile(
  51.                  ACHAR* pcFullPathOut,
  52.              int   nBufferLength,
  53.              const ACHAR* pcFilename,
  54.              AcDbDatabase * pDb,
  55.              AcDbHostApplicationServices::FindFileHint hint)
  56. {
  57.      return m_pOldHostServices->findFile(
  58.            pcFullPathOut,
  59.            nBufferLength,
  60.            pcFilename,
  61.            pDb,
  62.            hint );
  63. }
  64.  
  65. AcadInternalServices*
  66. MyHostAppServices::acadInternalServices()
  67. {
  68.     return m_pOldHostServices->acadInternalServices();
  69. }
  70.  
  71. const ProdIdCode
  72. MyHostAppServices::prodcode()
  73. {
  74.     return m_pOldHostServices->prodcode();
  75. }
  76.  
  77. void
  78. MyHostAppServices::displayChar( ACHAR c ) const
  79. {
  80.      if(c == 0) return; // Обработка поведения в AutoCAD 2004.
  81.  
  82.      CString tmp;
  83.      tmp.Format(L"%c", c );
  84.      // Нам придётся проигнорировать описание const этого метода,
  85.      // требующееся в его заголовке
  86.      m_szOutput += tmp;
  87. }
  88.  
  89. void
  90. MyHostAppServices::displayString( const ACHAR *string, int count ) const
  91. {
  92.      CString tmp( string );
  93.      // Нам придётся проигнорировать описание const этого метода,
  94.      // требующееся в его заголовке
  95.      m_szOutput += tmp.Left( count );
  96. }
  97.  
  98. CString MyHostAppServices::getOutput() const
  99. {
  100.      return m_szOutput;
  101. }


Полный пример кода: TrapOutput 2013.zip

Источник: http://adndevblog.typepad.com/autocad/2012/09/trapping-the-output-from-the-autocad-text-screen-command-prompt.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=60.0

Опубликовано 29.05.2013
Отредактировано 06.06.2013 в 13:25:04