Тема: Как получить построчный лог окна команд?

Требуется получать со стороны удаленных пользователей инфу о возникающих ошибках, для отладки. Так как сами они не всегда внятно могут объяснить, что после чего делали, а главное, что автокад им отвечал, эту информацию надо получать программно из окна истории команд. Это удалось сделать путем перебора окон:

CWnd *wTextCmdLine = acedGetAcadDockCmdLine();
CString s1;
acutPrintf("FirstString\n");
acutPrintf("SecondString\n");
if (wTextCmdLine)
  {            
  CWnd *wCmd = wTextCmdLine->GetWindow(GW_CHILD);
  do
    {
    wCmd->GetWindowText(s1);
    if (-1!=s1.Find("FirstString"))
      break;
    }
  while (wCmd = wCmd->GetNextWindow());
  AfxMessageBox(s1);
  }

Проблема осталась в том, что в полученной строке эти строки отображаются без разделителей, "FirstStringSecondString", как будто бы "\n"  в acutPrintf() не передавали. И в отладчике студии все команды тоже в одну строку видны, без разделителей.
С другой стороны, если нажать F2, то лог команд отображается построчно в новом окне, т.е. где-то он хранится в нормальном виде.
Как бы его в этом построчном виде получить?
Попытка привести к CEdit* не удалась.
После цикла пишем:

CEdit *pEdit = (CEdit *) CWnd::FromHandle(wCmd->m_hWnd);
int lineCount = pEdit->GetLineCount();

И получаем, что lineCount равен нулю.
Уважаемые знатоки, надеюсь на вашу помощь, и что миссия выполнима :).
Автокад 2000, студия 2003.

Re: Как получить построчный лог окна команд?

> Wing
А почему просто не влючить стандартный AutoCAD'овский log:
1) переменная LOGFILEMODE в 1 для включения и 0 для выключения.
2) Переменная LOGFILENAME - имя файла лога.
3) Переменная LOGFILEPATH - имя каталога в который пишется log-файл
?

Re: Как получить построчный лог окна команд?

А почему просто не влючить стандартный AutoCAD'овский log?

В принципе вариант подойдет, если потом этот файл будет открываться на чтение для архивирования при открытом автокаде. Единственное, что у меня не получается задать переменную LOGFILENAME, или же она игнорируется (справка говорит, что она сохраняется на каждый чертеж своя), и в результате у меня целая куча лог-файлов образуется, хоть и в нужном каталоге, с непонятными названиями типа "Drawing_1_XXXX.log", где XXXX - произвольное число.

resbuf rb;
rb.rbnext = NULL;
rb.restype = RTSTR;
rbvis.resval.rstring = "acadCmdLog.txt";
acedSetVar("LOGFILENAME", &rb);

Что здесь неправильно?

Re: Как получить построчный лог окна команд?

> Wing
Неправильно то, что эта переменная read-only, т.е. имя ты ей поменять не можешь, но если ты отключишь (временно) ведение журнала, то сможешь этот файл прочитать/переименовать/удалить.

Re: Как получить построчный лог окна команд?

Хорошо, я не могу поменять имя этой перемнной. Допустим, я переименую файл и включу лог. Потом он будет вестись под тем же именем? А если автокад просто свалится, то файл с этим именем будет там лежать, засоряя место. И кроме того, получается, при заверешении работы надо его удалять. Код по сути лишний.
Вариант. Есть ощущение, что эти "Drawing_1_XXXX" - имя чего-то (рисунка или чего-то в рисунке) по умолчанию. Может быть, можно в какой-то момент создания этого имени как-то его поменять, чтобы не только имя файла лога было правильным, но и не создавалось ненужных файлов в каталоге?
В принципе вместо работы с перемнными я в программе установки в реестре в HKCU\...\<<Unnamed Profile>>\General записал LogFileOpen=1 и ACADLOGFILE=СвойПуть\СвоеИмяФайла, но вот имя файла почему-то игнорируется. Может есть где-то ключ, чтобы не игнорировалось? Самый подходящий вариант был бы.
Или все-таки из окна построчно лог получать, тоже хорошее решение.
Спасибо.

Re: Как получить построчный лог окна команд?

> Wing
1) Какие именно цифири там используются - не исследовал, да и не в этом суть. Представь себе, что у тебя открыты два dwg-файла в одном AutoCAD. Имя log-файла не может быть одним и тем-же (!!!).
2) Что касается log-файлов, которые останутся при вылете AutoCAD - ну поставь свой реактор на завершение AutoCAD - думаю, что в нем можно будет этот файл удалить (не пробовал).
3) Из окна построчно ты можешь получить что-либо только если субклассируешь это окно и добавишь к к нему свою функцию обработки сообщений. В противном случае ты просто пропустишь сообщения AutoCAD в это окно. Кроме того еще интересный вопрос как ты будешь разделять сообщения в зависимости от того с каким из одновременно загруженных dwg-файлов пользователь работает.

Re: Как получить построчный лог окна команд?

Уважаемый Александр.
Дело в том, что в моем ARX'е всегда только один документ. Но даже если их было бы несколько, активен всегда один, так устроен MDI. И даже если документы будут что-то писать в лог одновременно, есть средства синхронизации потоков. 6 месяцев назад я писал поиск, к которому одновременно обращались несколько пользователей, и лог этой системы был один на всех пользователей, хотя поиск шел параллельно для всех запросивших данные, так что знаю точно. Самая быстрая идея реализации этого, известная мне - посылка сообщений в логирующий низкоприоритетный поток, который, когда процессор разгружается, соединяет сообщения и записывает их в файл. В случае падения приложения отображается сообщение с извинениями, и пока пользователь читает, текст в файл дописывается нормально. Идентифицировать каждого пользователя или каждый документ можно хоть в каждом лог-ссобщении. Поэтому, одновременно открытые два или более документов - совершенно не проблема.
Жаль, что через реестр решить не удалось.
А вот очень странно что исчезают разделители, ньюлайны. Да и реализовывать окно истории через CEdit-подобный класс, казалось, было бы проще, а там разделители должны сохраняться. При нажатии F2 они ведь отображаются в еще одном окне истории, а значит, где-то хранятся. Было бы здорово добраться до них.
А если же это невозможно, решение видится такое. Создать для логов автокада отдельную папку. При завершении приложения удалять свой лог-файл. При старте приложения проверяем имеющиеся лог-файлы. Если там есть файл, не относящийся к текущему запуску (опознаем с помощью LOGFILENAME), то он считается следом падения автокада, упаковывается в другую папку для анализа и удаляется из этой. После чего останется только свой файл.
И если произошла ошибка, то этот файл аналогично упаковывается для анализа.
С уважением,
Wing

Re: Как получить построчный лог окна команд?

> Wing
1) Как работает MDI мне можно не рассказывать. :) Тем не менее если пользователь сидит за PC и не установлен принудительно режим SDI, то открыто может быть больше одного чертежа и соответственно больше одного log-файла. AutoCAD не в состоянии использовать один log-файл для разных dwg-файлов. И это правильно. Иначе получится каша.
2) Твое решение (которое видится)вполне приемлимо.
3) AutoCAD работает с командным окном не стандартно. Кроме того в это окно попадает не вся информация, которая пишется в log-файл (например, обрезаются длинные строки) и это может быть для тебя существенно.

Re: Как получить построчный лог окна команд?

Спасибо!
ЗЫ. Как правильно программно задать SDI?  :)
Или это имеется в виду не средствами ACAD, а ручками?

Re: Как получить построчный лог окна команд?

> Wing
Вариантов на вскидку 3:
1) Установить при помощи acedSetVar() значекие SDI в 1.
2) Воспользоваться функцией acrxRegisterAppNotMDIAware()
3) Прописать соответствующее значение в реестре до запуска AutoCAD.
Но есть несколько НО!
a) Если уже открыто больше одного чертежа, то это сделать нельзя, т.е. AutoCAD не позволит установить переменную SDI в 0 и вызов acrxRegisterAppNotMDIAware() не позволит твоему приложению работать. b) SDI режим - это наследие прошлого и Autodesk давно обещает его убрать.
c) Заставлять пользователя работать в однодокументном режиме - это дурной тон. Только очень (!!!) веские причины могут оправдать это.

Re: Как получить построчный лог окна команд?

У нас приложение изначально SDI по сути. Это не конструирование, а топология, в пределах одной области. И чтобы отбразить все это, используются уровни отображения: на области видны районы, на районе нас.пункты, в нас.пункте дома, улицы и т.п. Трубы на всех уровнях. Для отображения другого уровня все объекты из чертежа удаляются и загружаются из базы SQL другие. Не предполагается, что пользователю зачем-то понадобится еще один документ.
А вот реализовывалось это без работы с SDI, с помощью своего меню и панели инструментов (где нет пунктов "новый", "открыть" и т.п.), с использованием acrxRegisterAppMDIAware, поэтому такой интерес к теоретической стороне вопроса.
Из предложенных я попробовал 2 варианта (не нашел, что в реестре отвечает за SDI), и получилось, что всего лишь становится серой кнопка закрытия документа. Рисунок можно MDI-сворачивать и MDI-ресайзить, а "настоящего" SDI (как в блокноте) не получается. Что ж, хоть так.
Спасибо, Александр, ваша поддержка рулит :).
С уважением,
Wing

Re: Как получить построчный лог окна команд?

Wing пишет:

не нашел, что в реестре отвечает за SDI

Для каждой версии AutoCAD и каждого профиля эта информация находится своей ветке реестра. Например, для AutoCAD 2006 English:

[HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R16.2\ACAD-4001:409\Profiles\<<имя профиля>>\Drawing Window]
"SDIMode"=dword:00000001

Но здесь пользователь имеет возможность ее изменить. А вот второй мой вариант делает невозможным переключится в режим MDI если приложение уже загружено.