Перехват вывода в текстовый экран и командную строку AutoCAD
Вопрос:
Как получить текстовый вывод команд, таких как СПИСОК (_LIST), а также скрыть вывод некоторых команд в командную строку?
Ответ:
Вы можете временно подменить объект HostApplicationServices своим собственным. Важнейшей функцией обратного вызова является consoleMessage(), которую вы можете переопределить по собственному усмотрению – или интерпретировать или игнорировать вызовы, сделанные при помощи acutPrintf() для отображения в командную строку или текстовый экран. Есть и другие функции обратного вызова, которые обязательно должны быть переопределены и перенаправлены на вызов оригинального объекта HostApplicationServices.
Очень важно понимать, что этот механизм следует использовать как можно более короткое время. AutoCAD предполагает, что используется стандартный объект HostApplicationServices – он может попытаться привести указатель к непубличному унаследованному классу. Так что необходимо заменять объект на как можно меньшее время.
Этот подход также не был всесторонне проверен для всех команд, поэтому эти инструменты следует использовать с осторожностью и будут нуждаться в более полном тестировании с командами, которые не проверялись с этим примером. Смотрите в конце статьи прилагаемый пример. Ключевым моментом является то, чтобы создать класс, производный от AcDbHostApplicationServices и переопределить некоторые необходимые методы. Ниже приводится некоторый код реализации класса, извлеченный из прилагаемого проекта.
- class MyHostAppServices : public AcDbHostApplicationServices
- {
- public:
- MyHostAppServices();
- virtual ~MyHostAppServices();
- virtual Acad::ErrorStatus findFile(
- ACHAR * pcFullPathOut,
- int nBufferLength,
- const ACHAR * pcFilename,
- AcDbDatabase * pDb = NULL, // Когда происходит поиск
- // связанный с db
- AcDbHostApplicationServices::FindFileHint hint = kDefault);
- virtual AcadInternalServices* acadInternalServices();
- virtual const ProdIdCode prodcode();
- virtual void displayChar(ACHAR c) const;
- virtual void displayString(const ACHAR* string, int count) const;
- CString getOutput() const;
- private:
- AcDbHostApplicationServices *m_pOldHostServices;
- };
- CString m_szOutput;
- MyHostAppServices::MyHostAppServices()
- {
- m_pOldHostServices = acdbHostApplicationServices();
- m_szOutput = "";
- Acad::ErrorStatus es = acdbSetHostApplicationServices( this );
- setWorkingGlobals( m_pOldHostServices->workingGlobals() );
- setWorkingDatabase( m_pOldHostServices->workingDatabase() );
- }
- MyHostAppServices::~MyHostAppServices()
- {
- acdbSetHostApplicationServices( m_pOldHostServices );
- setWorkingGlobals( m_pOldHostServices->workingGlobals() );
- setWorkingDatabase( m_pOldHostServices->workingDatabase() );
- }
- Acad::ErrorStatus
- MyHostAppServices::findFile(
- ACHAR* pcFullPathOut,
- int nBufferLength,
- const ACHAR* pcFilename,
- AcDbDatabase * pDb,
- AcDbHostApplicationServices::FindFileHint hint)
- {
- return m_pOldHostServices->findFile(
- pcFullPathOut,
- nBufferLength,
- pcFilename,
- pDb,
- hint );
- }
- AcadInternalServices*
- MyHostAppServices::acadInternalServices()
- {
- return m_pOldHostServices->acadInternalServices();
- }
- const ProdIdCode
- MyHostAppServices::prodcode()
- {
- return m_pOldHostServices->prodcode();
- }
- void
- MyHostAppServices::displayChar( ACHAR c ) const
- {
- if(c == 0) return; // Обработка поведения в AutoCAD 2004.
- CString tmp;
- tmp.Format(L"%c", c );
- // Нам придётся проигнорировать описание const этого метода,
- // требующееся в его заголовке
- m_szOutput += tmp;
- }
- void
- MyHostAppServices::displayString( const ACHAR *string, int count ) const
- {
- CString tmp( string );
- // Нам придётся проигнорировать описание const этого метода,
- // требующееся в его заголовке
- m_szOutput += tmp.Left( count );
- }
- CString MyHostAppServices::getOutput() const
- {
- return m_szOutput;
- }
Полный пример кода: TrapOutput 2013.zip
Обсуждение: http://adn-cis.org/forum/index.php?topic=60.0
Отредактировано 06.06.2013 в 13:25:04