-PUBLISH через acedCommandC или acedCommandS в 2015

Автор Тема: -PUBLISH через acedCommandC или acedCommandS в 2015  (Прочитано 19868 раз)

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

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

  • ADN Club
  • ***
  • Сообщений: 156
  • Карма: 8
  • Skype: begiz_i
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #15 : 18-07-2014, 14:05:45 »
Спасибо,
попробую как работает пока ADN не ответчает.
Тут момент такой еще получается, ОК будет назат, но название и место сохранения фаила будут не ясны.
Попробую с Hook'ом поработать, может окно ввода названия вытащу.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #16 : 21-07-2014, 15:19:42 »
Получил от ADN DevHelp подтверждение о баге при запуске -PUBLISH при помощи acedCommandS. Передано разработчикам для исправления.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 156
  • Карма: 8
  • Skype: begiz_i
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #17 : 21-07-2014, 15:24:07 »
О грусть и печаль!!
А они случаем не предложили альтернативного метода, дабы не колдовать с Hook'ми и всплывающими окнами?
Чтобы это можно было сделать без вмешательства узера?
Через тот же PlotAPI, но полностю автоматизировать?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #18 : 21-07-2014, 15:37:03 »
А они случаем не предложили альтернативного метода, дабы не колдовать с Hook'ми и всплывающими окнами?
Чтобы это можно было сделать без вмешательства узера?
Я попросил их указать workaround для этого случая. Ну и как отдельный запрос висит возможность для acplPublishExecute указать имя выходного файла. Но на этот запрос пока реакции нет. Будем ждать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #19 : 22-07-2014, 01:38:40 »
Обратил внимание на интересную закономерность. При первом запуске в сеансе работы AutoCAD при выполнении функции acplPublishExecute имя dwf-файла соотвествует значению имени файла (без имени каталога) DWF из секции Target dsd-файла. При этом каталог не всегда соотвествует тому, на который ссылается DWF. Скорее он соотвествует каталогу, в котором находится dsd-файл. При последующих вызовах полный путь к dwf-фалу в точности соотвествует тому, который указан в DWF. Похоже на небольшой, но неприятный баг.
Если необходимо изменить путь к записываемому dwf-файлу, то удобно пользоваться функцией WritePrivateProfileString:
Код - C++ [Выбрать]
  1. WritePrivateProfileString(_T("Target"), _T("DWF"), pathDWF, pathDSD);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 156
  • Карма: 8
  • Skype: begiz_i
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #20 : 22-07-2014, 07:59:54 »
Нашел вот такую запись по поводу функции acplPublishExecute.

http://forums.autodesk.com/t5/ObjectARX/AcPublish-arx-needs-to-be-loaded-before-acplPublishExecute/td-p/3641762

Попробую, отпишусь что получилось.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #21 : 22-07-2014, 08:54:57 »
Хм. А ведь похоже это именно тот случай. Теперь правильный путь у меня берется с первого раза. Если нужен код - выложу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 156
  • Карма: 8
  • Skype: begiz_i
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #22 : 22-07-2014, 11:14:13 »
Спасибо. Разобрался, всё как бы работает.
На данный момент оставляю так, но буду ждать ответа от ADN.
Я только "ЗА" избавится от всех acedCommand которые у меня используются, но Hook это временное решение.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #23 : 22-07-2014, 11:33:33 »
но Hook это временное решение
Ну вообще-то он не нужен. Достаточно изменить в dsd-файле:
Код - INI [Выбрать]
  1. PromptForDwfName=TRUE
на
Код - INI [Выбрать]
  1. PromptForDwfName=FALSE
И что интересно, если AcPublish.arx не загружен предварительно, то эта установка не работает и нужен хук, а если загружен, то не нужен. Вот так то.  :) Уточню что я проверял только в AutoCAD 2015.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 156
  • Карма: 8
  • Skype: begiz_i
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #24 : 22-07-2014, 11:45:39 »
Даже еще лучше,
можно использовать :
Код - C++ [Выбрать]
  1.     AcPlDSDData dsdDataObj;                        
  2.     dsdDataObj.readDSD(dsd); // Читаем dsd-файл
  3.     dsdDataObj.setPromptForDwfName(FALSE);
  4.  

Подтверждаю всё работает, спасибо! :)
« Последнее редактирование: 22-07-2014, 11:50:27 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #25 : 22-07-2014, 11:50:13 »
А путь к dwf-файлу можно указать так:
Код - C++ [Выбрать]
  1. dsdDataObj.setDestinationName(pathDWF);
Что интересно, я проверял и dsdDataObj.setPromptForDwfName(FALSE); и dsdDataObj.setDestinationName(pathDWF); при не загруженном AcPublish.arx и они не работали.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 156
  • Карма: 8
  • Skype: begiz_i
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #26 : 22-07-2014, 11:57:02 »
Так может можно вообше без DSD обойтись?
Т.Е. как то указать что нужен MultiSheet DWF и чтобы весь чертеж в DWF ушел или перечислить листы которые нужны?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #27 : 22-07-2014, 12:02:10 »
Кстати, только что пришел ответ от ADN DevHelp по поводу использования acplPublishExecute. И в первой же строке кода они загружают AcPublish.arx
Так что совместными усилиями этот вопрос мы решили.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #28 : 22-07-2014, 12:08:03 »
Так может можно вообше без DSD обойтись?
Т.Е. как то указать что нужен MultiSheet DWF и чтобы весь чертеж в DWF ушел или перечислить листы которые нужны?
В принципе это возможно, т.е. ты можешь на лету сформировать AcPlDSDData. На C# есть пример для этого и думаю что перевести его на чистый ObjectARX не должно составить большого труда:
http://adndevblog.typepad.com/autocad/2012/05/how-to-use-autodeskautocadpublishingpublisherpublishexecute.html
P.S.: Хочу уточнить, что Autodesk.AutoCAD.Publishing.Publisher.PublishExecute в AutoCAD .NET API соответствует acplPublishExecute в ObjectARX.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 156
  • Карма: 8
  • Skype: begiz_i
Re: -PUBLISH через acedCommandC или acedCommandS в 2015
« Ответ #29 : 22-07-2014, 13:09:19 »
В указаном примере процедура схожая с той что у меня, только DSD заполняется не на прямую а через DsdData.
Так как вообсе от DSD отказатся не получиается, измемений не вносил.
Предоставляю код, надеюсь будет кому то полезен :)

Код - C++ [Выбрать]
  1.         CString full_file_path_name =  curDoc()->database()->fileName();
  2.        
  3.         CString dsd = full_file_path_name;
  4.         dsd.Replace(_T("dwg"),_T("dsd"));
  5.  
  6.         WORD wBOM = 0xFEFF;
  7.         DWORD NumberOfBytesWritten;
  8.  
  9.         HANDLE hFile = ::CreateFile(dsd, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); //for UTF16 little endian
  10.        ::WriteFile(hFile, &wBOM, sizeof(WORD), &NumberOfBytesWritten, NULL);
  11.        ::CloseHandle(hFile);
  12.  
  13.         AcDbObjectId objDictId = acdbHostApplicationServices()->workingDatabase()->layoutDictionaryId();
  14.         AcDbDictionary *pDict;
  15.         acdbOpenObject(pDict, objDictId, AcDb::kForRead);
  16.         AcDbDictionaryIterator *pI = pDict->newIterator();
  17.         pDict->close();
  18.  
  19.         while(!pI->done())
  20.         {
  21.                 WritePrivateProfileString(_T("DWF6Sheet:")+file_name+_T("-")+pI->name(),_T("DWG"),full_file_path_name,dsd);
  22.                 WritePrivateProfileString(_T("DWF6Sheet:")+file_name+_T("-")+pI->name(),_T("Layout"),pI->name(),dsd);
  23.                 pI->next();
  24.         }
  25.         delete pI;
  26.                
  27.         full_file_path_name.Replace(_T("dsd"),_T("dwf"));
  28.         WritePrivateProfileString(_T("Target"),_T("type"),_T("1"),dsd);
  29.         WritePrivateProfileString(_T("Target"),_T("DWF"),full_file_path_name,dsd);
  30.         WritePrivateProfileString(_T("Target"),_T("OUT"),full_file_path_name.Mid(0,ph.ReverseFind(_T('\\'))),dsd);
  31.  
  32.         struct resbuf vl_new;
  33.         vl_new.restype = RTSHORT;
  34.         int chk = 0;
  35.         vl_new.resval.rint = 0;
  36.         chk = acedSetVar(_T("backgroundplot"),&vl_new);
  37.         AcPlDSDData dsdDataObj;                        
  38.         dsdDataObj.readDSD(dsd);
  39.         dsdDataObj.setPromptForDwfName(FALSE);
  40.         DeleteFile(dsdDataObj.destinationName());
  41.        AcPlPlotConfig* pConfig = NULL;        
  42.        bool bShowPlotProgress = true;
  43.  
  44.        acedArxLoad(_T("AcPublish.arx")); //У меня вынесен в On_kInitAppMsg
  45.        acplPublishExecute( dsdDataObj, pConfig, bShowPlotProgress );
  46.  
  47.  
« Последнее редактирование: 22-07-2014, 13:11:22 от Александр Ривилис »