DWG превью

Автор Тема: DWG превью  (Прочитано 20547 раз)

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

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: DWG превью
« Ответ #15 : 04-07-2015, 20:39:28 »
Из под .Net, начиная с 2014 автокада, можно взять картинку неплохого качества (190*120px) непосредственно из блока при помощи CMLContentSearchPreviews.GetBlockTRThumbnail(block:BlockTableRecord) который приводиться к BitmapSource - я этот вариант и использую (для других версий в моем случае достаточно "облегченной" версии - которая только отображает сохраненное в SQL БД изображение полученное данным способом - кстати само описание блока находится там-же). Возможно под ARX данный функционал был пораньше. Данная картинка, в отличии от "низкокачественной" есть во всех блоках, независимо от "прогонки" _BlockIcon.

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: DWG превью
« Ответ #16 : 06-07-2015, 10:27:14 »
увы, официально, под с++ ничего такого нет. в блоге Kean Walmsley вот тут http://through-the-interface.typepad.com/through_the_interface/2013/11/generating-larger-preview-images-for-all-blocks-in-an-autocad-drawing-using-net.html он говорит, что данный функционал был добавлен начиная с 2013 автокада, и есть в acmgd.dll недокументированная функция getBlockTableRecordThumbnail(). Просмотрел эту dll депенденсиволкером для 2014 акада и ничего не нашел ))). Остальные dll-ки просматривать лень, т.к. во-первых, функция недокументированная, а значит, чего-то могут и поменять или в шапке или во внутренностях в любой момент под любой автокад, или вообще отказаться от нее; во-вторых, работает начиная с 2013 автокада (а это как раз то, чего я хочу избежать - разный код под разные автокады).

PS: против разного кода я потому, что если забыл вставить #elif, оно все-равно скомпиллируется и будет работать, только результата не будет ))). значит всё нужно проверять уже непосредственно в самом автокаде досконально. было б 3-4 команды, я б с удовольствием проверил. но т.к. их на сегодня больше 200 (где-то раза в два больше ))) ), то тестирование происходит в основном поверхностно (частично из-за лени, частично из-за загруженности) - запустил, нажал пару кнопок, что-то произошло, значит работатет, переходим к следующей команде. а вот когда пошло в массы и выяснилось, что что-то не работает, то отгребают все ))) и программисты и тестировщики ))).

Оффлайн ItJustMe

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Re: DWG превью
« Ответ #17 : 07-07-2015, 14:03:43 »
насколько часто картинки надо обновлять?
если это нечто вроде внешней библотеки и перегенерировать надо нечасто, то
как вариант создать внешнюю картинку - использовать plot - PublishToWebPNG или PublishToWebJPG.


Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: DWG превью
« Ответ #18 : 07-07-2015, 15:29:22 »
Цитировать
насколько часто картинки надо обновлять?
пользователь выбирает через окошко любой файл. в комбобоксик записываются имена всех блоков, какие есть в файле, генерируется превьюшка для первого выбранного блока. ну и дальше как переклацнул пользователь что-то в комбобоксе, так и увидел рядышком картинку. и так до тех пор, пока не найдет нужный блок (очень часто имена блоков не отображают сути, так что клацать иногда приходится долго ))) ). вот собственно тут и идет постоянная генерация новой картинки, соответствующей требуемому блоку (и всё время появляется-исчезает новый чертеж с выбранным блоком на весь экран. а иногда даже сообщение о том, что НЕ ХОЧУ ОТКРЫВАТЬ В РЕДАКТОРЕ БЛОКОВ закрывать нужно руками, если блок динамический ))) ).
потом нажимает OK. блок добавляется в мой собственный dwg, чтоб потом из него вставлять в чертеж по мере надобности уже другой командой, картинка этого блока ложится в папку, рядышком с dwg. дальше уже используется картинка из папки.

Оффлайн ItJustMe

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Re: DWG превью
« Ответ #19 : 07-07-2015, 16:40:50 »
Оно, наверное, и без plot/publish долго происходит.
Значит, plot/publish не сильно заметно всё это затормозит.
Впрочем, есть и недостатки - кода достаточно много надо для этого.

Если интересно, окно "НЕ ХОЧУ ОТКРЫВАТЬ В РЕДАКТОРЕ БЛОКОВ" можно
попробовать закрывать автоматически.
Я, правда, именно с этим окном не сталкивался, но некоторые другие окна закрываю.
Перехватываю сообщения windows для окна adsw_acadMainWnd().

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DWG превью
« Ответ #20 : 07-07-2015, 23:53:50 »
Перехватываю сообщения windows для окна adsw_acadMainWnd()
Лучше закрывать такие окна через Winhook. Где-то на форуме я приводил пример, но найти его со смарта не просто.
Значит, plot/publish не сильно заметно всё это затормозит.
Вместо plot/publish лучше использовать EXPORT через COM в wmf-формат. ИМХО.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: DWG превью
« Ответ #21 : 09-07-2015, 14:39:04 »
Цитировать
Лучше закрывать такие окна через Winhook. Где-то на форуме я приводил пример, но найти его со смарта не просто.
кстати, а почему бы и нет ))). пасибки за идею и код :):):). теперь, хоть мультики по экрану и бегают, но нажимать ничего не нужно :), если блок динамический
кстати, код пришлось чуток модифицировать, т.к. Ваш упорно отказывался компилиться со статиковыми переменными. ну и от себя добавил еще, какую именно кнопку нужно жмакнуть
и так: CCloseMsgWindowHook.h
Код - C++ [Выбрать]
  1. #pragma once
  2.  
  3. static HHOOK hMsgBoxHook;
  4. static int hMsgBoxBtnPress;
  5.  
  6. class CloseMsgWindowHook
  7. {
  8. public:
  9.         CloseMsgWindowHook(int btnType = IDOK)
  10.         {
  11.                 hMsgBoxBtnPress = btnType;
  12.                 hMsgBoxHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)&CloseMsgWindowHook::CBTProcess,_hdllInstance,0);
  13.         }
  14.  
  15.         ~CloseMsgWindowHook()
  16.         {
  17.                 UnhookWindowsHookEx(hMsgBoxHook); hMsgBoxHook = NULL;
  18.         }
  19.  
  20. private:
  21.         static LRESULT CALLBACK CBTProcess(int nCode, WPARAM wParam, LPARAM lParam)
  22.         {
  23.                 HWND hwnd, hwndButton;
  24.                 if (nCode == HCBT_ACTIVATE)
  25.                 {
  26.                         hwnd = (HWND)wParam; hwndButton = GetDlgItem(hwnd, hMsgBoxBtnPress);
  27.                         if (hwndButton)
  28.                                 SendMessage(hwndButton,BM_CLICK,0,0);
  29.                 }
  30.                 return CallNextHookEx(hMsgBoxHook, nCode, wParam, lParam);
  31.         }
  32. };
  33.  

ну и как пользоваться, мало ли, вдруг кому пригодится:
Код - C++ [Выбрать]
  1. #include "CCloseMsgWindowHook.h"
  2.  
  3. //......
  4. CloseMsgWindowHook hook(IDNO); // сразу передаем, какую кнопку нажимать

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DWG превью
« Ответ #22 : 09-07-2015, 14:47:58 »
если блок динамический
кстати, код пришлось чуток модифицировать, т.к. Ваш упорно отказывался компилиться со статиковыми переменными.
Николай. Ты в своём репертуаре. Причем тут динамический блок к статическим переменным? Моя интуиция не позволила понять глубину твоей мысли.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: DWG превью
« Ответ #23 : 09-07-2015, 14:57:52 »
Цитировать
Причем тут динамический блок
нажимать ничего не нужно :), если блок динамический. без хука, если открывался чертеж с динамическим блоком внутри, выпадал messagebox. ну и нужно было нажать кнопку. хук это делает автоматом, и messagebox-a вообще не видно
Цитировать
к статическим переменным
код пришлось чуток модифицировать, т.к. Ваш упорно отказывался компилиться со статиковыми переменными

:) а если так?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DWG превью
« Ответ #24 : 09-07-2015, 17:02:37 »
Теперь уже понятнее. Код я писал очень давно, так что возможно изменился синтаксис языка. Мой код был рабочий.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение