Не срабатывает SendCommand

Автор Тема: Не срабатывает SendCommand  (Прочитано 18616 раз)

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

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Не срабатывает SendCommand
« : 28-07-2014, 14:46:44 »
Здравствуйте!
Формирую команду на экспорт в ПДФ. Если ставлю "\n" в конце команды (стрелкой показано) - команда выполняется, но выдаётся предупреждение в трее(правда если по нему щёлкнуть - пишет что ошибок нет), и файл не формируется. Если \n не ставить, а в командной строке самому нажать Enter - всё работает без предупреждений и файл формируется. Подскажите в чём дело, вторую неделю мучаюсь( Заранее спасибо.
Код - C++ [Выбрать]
  1.           /*Теперь будем сохранять в PDF а потом в JPEG(сразу в JPEG сохраняет очень плохо)*/
  2.           pApp->Documents->Open(_bstr_t(lpszFileName));
  3.  
  4.           pApp->ActiveDocument->SendCommand(_bstr_t("PROXYNOTICE 0\n")); // call the command
  5.  
  6.           pApp->ActiveDocument->SendCommand(_bstr_t("FILEDIA 0\n"));
  7.  
  8.           pApp->ActiveDocument->SendCommand(_bstr_t("BACKGROUNDPLOT 0\n"));
  9.  
  10.  
  11.           wchar_t acad_command[MAX_PATH];
  12.           wcscpy(acad_command , _T("-ЭКСПОРТ pdf Тек Нет "));
  13.  
  14.           wcsncat(acad_command , lpszFileName , wcslen(lpszFileName) - 3);
  15.  
  16.           wcscat(acad_command ,_T("pdf"));
  17.           wcscat(acad_command ,_T("\n"));  //<--------------------------------------------------------
  18.  
  19.           pApp->ActiveDocument->SendCommand(_bstr_t(acad_command));
  20.          // pApp->ActiveDocument->SendCommand("\x10\x13");
  21.  
  22.          pApp->ActiveDocument->Close();
  23.  
   
« Последнее редактирование: 29-07-2014, 19:27:51 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не срабатывает SendCommand
« Ответ #1 : 29-07-2014, 19:37:51 »
1) Какое предупреждение? Нужен скрин чтобы понять о чем идет речь.
2) Попробуй заменить "\n" на " " (пробел)
3) Команды и опции используй английские с подчеркиванием
4) Имя файла должно быть в двойных кавычках и замени "\\" на "/"
5) Меняй системные переменные не при помощи pApp->ActiveDocument->SendCommand, а при помощи pApp->ActiveDocument->SetVariable
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Не срабатывает SendCommand
« Ответ #2 : 29-07-2014, 23:43:23 »
Это когда я не добавляю в конце \n, устанавливаю курсор в командную строку и нажимаю Enter, при этом выходные файлы формируются.


А в этом случае добавляю \n, команда проходит автоматически, но появляется это предупреждение и результирующего файла нет.


Причем в "подробностях о публикации/печати" во втором случае никаких данных нет.

Переменные выставляются, проверял, имя файла тоже верно задано, т.к. в первом случае всё срабатывает, а имя там тоже самое.

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Не срабатывает SendCommand
« Ответ #3 : 30-07-2014, 11:49:36 »
Вот нашёл нечто подобное на VBA
    DOC.SetVariable "FILEDIA", 0
    DOC.SetVariable "BACKGROUNDPLOT", 0

    DOC.SendCommand "-PUBLISH" & vbCr & dsd_dwf
    SendKeys "{ENTER}", True
   
    DOC.SendCommand "-PUBLISH" & vbCr & dsd_pdf
    SendKeys "{ENTER}", True
Я так понимаю мне нужно сделать:  SendKeys "{ENTER}", True

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не срабатывает SendCommand
« Ответ #4 : 30-07-2014, 21:00:24 »
Я так понимаю мне нужно сделать:
Код: [Выделить]

SendKeys "{ENTER}", True
Попробуй. Во всяком случае это будет полная эмуляция того, что ты делаешь вручную.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Не срабатывает SendCommand
« Ответ #5 : 31-07-2014, 09:28:47 »
Да, помогло. В итоге заработал этот код:
Код - C++ [Выбрать]
  1.           pApp->ActiveDocument->SendCommand(_bstr_t(acad_command));
  2.           keybd_event(VK_RETURN ,0x9C, 0, 0);

Спасибо за помощь)
« Последнее редактирование: 31-07-2014, 19:09:31 от Александр Ривилис »

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Не срабатывает SendCommand
« Ответ #6 : 01-08-2014, 00:24:42 »
К сожалению радость была преждевременна. Срабатывает только если фокус перед вызовом keybd_event установить в окне автокада (сделать его активным). Вопрос актуален(((

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не срабатывает SendCommand
« Ответ #7 : 01-08-2014, 00:40:45 »
Срабатывает только если фокус перед вызовом keybd_event установить в окне автокада (сделать его активным)
И в чем проблема? Я вообще не понял задачу. Это вообще ObjectARX приложение или внешний exe-файл, который через ActiveX/COM управляет AutoCAD?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не срабатывает SendCommand
« Ответ #8 : 01-08-2014, 00:57:02 »
Код - C++ [Выбрать]
  1. ::SetFocus(adsw_acadMainWnd());
или
Код - C++ [Выбрать]
  1. ::SetFocus(adsw_acadDocWnd());
Это если ObjectARX приложение.
« Последнее редактирование: 01-08-2014, 01:12:07 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Не срабатывает SendCommand
« Ответ #9 : 01-08-2014, 08:19:57 »
Это внешнее приложение, запускающее автокад с arx-модулем, формирующим чертежи, которые должны быть сохранены в JPEG (предварительно в PDF, т.к. экспорт в JPEG напрямую из автокада даёт очень плохую картинку). Внешнее потому что запуск происходит по Web.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не срабатывает SendCommand
« Ответ #10 : 01-08-2014, 19:07:33 »
Т.е. код, который ты показал - это часть arx-модуля? Если да, то зачем SendCommand, если можно спокойно использовать acedCommand/acedCommandS/acedCommandC, или даже вообще acplPublishExecute, как показано здесь: http://adn-cis.org/forum/index.php?topic=859.msg3633#msg3633
Кстати, предложенный мной метод с ::SetFocus помог?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Не срабатывает SendCommand
« Ответ #11 : 07-08-2014, 15:36:50 »
Нет. Тот код который я показывал выше - EXE-файл который управляет автокадом (а сам EXE вызывается Web-сервером). Сейчас добавил в arx-модуле команду с кодом
Код - C++ [Выбрать]
  1. void ToTop()
  2. {
  3.         ::SetFocus(adsw_acadMainWnd());
  4. }
и вызываю её в этом EXE перед экспортом
Код - C++ [Выбрать]
  1.           pApp->ActiveDocument->SendCommand(_bstr_t("ToTop \n"));
  2.           WAIT_ACAD;
  3.  
  4.           wchar_t acad_command[MAX_PATH];
  5.           wcscpy(acad_command , _T("-ЭКСПОРТ pdf Тек Нет "));
  6.  
  7.           wcsncat(acad_command , lpszFileName , wcslen(lpszFileName) - 3);
  8.           wcscat(acad_command ,_T("pdf "));
  9.  
  10.           pApp->ActiveDocument->SendCommand(_bstr_t(acad_command));
  11.           keybd_event(VK_RETURN ,0x9C, 0, 0);
Всё работает, но когда открыт рабочий стол учётной записи под которой запускается автокад, пока наверно будет так работать.
« Последнее редактирование: 24-08-2014, 01:55:47 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не срабатывает SendCommand
« Ответ #12 : 24-08-2014, 02:00:34 »
Только сегодня обратил внимание, что Вы ответили. Видимо не пришло оповещение.
Вообще-то всё можно сделать на порядок проще. Через SendCommand вы запускаете ToTop. Так всуньте в ToTop запуск -EXPORT, только не через SendCommand, а через acedCommand. И вообще всё логику работы засуньте в arx-файл.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Не срабатывает SendCommand
« Ответ #13 : 24-08-2014, 22:58:34 »
Попробовал в ToTop вставить
acedCommand(RTSTR , _T("-ЭКСПОРТ") , RTSTR , _T("pdf") ,RTSTR ,  _T("Тек") ,RTSTR ,  _T("Нет") , RTSTR , _T("C:\\Obrab\\temp.pdf"), 0);Через раз автокад падает с ошибкой. Точнее будет: иногда срабатывает.
Пробовал так же:
acDocManager->sendStringToExecute(acDocManager->curDocument(), _T("-ЭКСПОРТ pdf Тек Нет C:\\Obrab\\temp.pdf\n"))- эффект тот же.
« Последнее редактирование: 24-08-2014, 23:29:46 от Дмитрий »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не срабатывает SendCommand
« Ответ #14 : 25-08-2014, 01:12:21 »
Мягко говоря странно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение