Сообщество программистов Autodesk в СНГ

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: d_Spam_b от 27-01-2020, 14:08:21

Название: Ошибка при вызове (vla-put-canonicalmedianame)
Отправлено: d_Spam_b от 27-01-2020, 14:08:21
Доброго времени! заранее прошу прощения за то, что вклинился в тему, но со схожей проблемой новую создавать нет смысла.
в задаче поменять настройки параметров листов, и по описанному коду по сути и теории все понятно. решая данную задачу, столкнулся с тем,
что  метод (vla-put-canonicalmedianame layout "ISO_full_bleed_A1_(594.00_x_841.00_MM)") выдает ошибку Automation. данная проблема как я понял тут тоже поднималась Mr. Artman, и Алексей Кулик, на нее отвечал. но к сожалению даже при использовании канонического имени из списка, остается та же проблема.
излазил много русско-  и англоязычных ресурсов, много всякого предлагают, (в  том числе и Ваши комментарии встречал): заменить пробелы подчеркиванием, проверить раскладку и прочее,
 связанное с неправильным заданием ИМЕНИ формата. однако выбирая даже самые простые варианты , вроде A4 - А в  данном случае пробовали
на рус. и на англ. раскладке. все ту же ошибку выдает. все остальные методы срабатывают.
в русскоязычном пространстве не вижу больше вариантов куда и к кому обратиться, так как на этом форуме самая большая концентрация "знакомых имен",
пользуясь советами которых, пишу лиспы как могу . так как прямого ответа на поставленный вопрос не нашел решил обратиться за мнение общественности..
имя формата "ISO_full_bleed_A1_(594.00_x_841.00_MM)" взято из Вашего примера и не несет смысловой нагрузки. Пытаюсь поменять на
"A3_NXP_Альбомная", но повторюсь, что даже на самых простых именах типа A3 никак не получается сменить формат лиспом.
непосредственно моя задача еще проще звучит: имея в  чертеже N исходных листов, каждому задать DWG To PDF.pc3 и один заранее заданный формат.
проблема возникает даже при самом простом варианте , когда имеем текущий лист, и пытаемся на нем сменить формат и принтер. Принтер меняет, на формате - ошибка..
в DWG To PDF.pc3 данные форматы прописаны.

код:

Код - Auto/Visual Lisp [Выбрать]
  1. (defun C:TEST()
  2.  
  3.   (vl-load-com)
  4.    
  5.   (setq ActiveDoc (vla-get-activedocument (vlax-get-acad-object)))
  6.   (setq layout (vla-get-activelayout ActiveDoc))
  7.   (vla-refreshplotdeviceinfo layout)
  8.   (vla-put-configname layout "DWG To PDF.pc3")
  9.   (vla-put-canonicalmedianame layout "A3_NXP_Альбомная") ;; Ошибка Automation
  10.   ;; при использовании канонического имени из списка та же ошибка.
  11.   ;; в идеале надо все же подставить свой формат
  12. )
Название: Re: Ошибка при вызове (vla-put-canonicalmedianame)
Отправлено: Александр Ривилис от 27-01-2020, 14:13:45
d_Spam_b,
Приветствую на форуме!
Какая версия AutoCAD и установлены ли все обновления?
P.S.: Как следует форматировать код у нас на форуме написано у меня в подписи. Прошу соблюдать это правило!
Название: Re: Ошибка при вызове (vla-put-canonicalmedianame)
Отправлено: Александр Ривилис от 27-01-2020, 14:41:17
Попробуй этот код:
Код - Auto/Visual Lisp [Выбрать]
  1. ;;;
  2. ;;;  Проверяем установку CanonicalMediaName
  3. ;;;
  4. (defun C:Test_CanonicalMediaName ( / acadObj doc Layout x)
  5.     (vl-load-com)
  6.     (setq acadObj (vlax-get-acad-object))
  7.     (setq doc (vla-get-ActiveDocument acadObj))
  8.  
  9.     (setq Layout (vla-get-Layout (vla-get-ModelSpace doc)))
  10.        
  11.     (vla-put-configname layout "DWG To PDF.pc3")
  12.    
  13.     (vla-RefreshPlotDeviceInfo Layout)
  14.    
  15.     (setq mediaNames (vlax-variant-value (vla-GetCanonicalMediaNames Layout)))
  16.  
  17.     (setq x 0) ;; Поочередно устанавливаем CanonicalMediaName
  18.     (while (>= (vlax-safearray-get-u-bound mediaNames 1) x)
  19.         (print (vlax-safearray-get-element mediaNames x))
  20.         (vla-put-CanonicalMediaName Layout (vlax-safearray-get-element mediaNames x))
  21.         (setq x (1+ x))
  22.     )
  23.    
  24. )

(https://live.staticflickr.com/65535/49448845763_09d267e9b8_o.png)

Похоже, что проблема в порядке строк:
Код - Auto/Visual Lisp [Выбрать]
  1.   (vla-refreshplotdeviceinfo layout)
  2.   (vla-put-configname layout "DWG To PDF.pc3")
Сначала нужно
Код - Auto/Visual Lisp [Выбрать]
  1. (vla-put-configname layout "DWG To PDF.pc3")
а затем
Код - Auto/Visual Lisp [Выбрать]
  1. (vla-refreshplotdeviceinfo layout)
Название: Re: Ошибка при вызове (vla-put-canonicalmedianame)
Отправлено: d_Spam_b от 27-01-2020, 14:58:57
спасибо за дружелюбное, а главное оперативное приветствие. решился таки, так сказать, "вступить в контакт с цивилизацией".
по привычке все кусочки ваших кодов во всех просторах интернета собирал и разбирал самостоятельно
насколько это было возможно. куда не зайди, чего не коснись - ОТВЕТЫ на вопросы это, в основном,
 Алексей Кулик, Александр Ривилис, VVA (если не ошибаюсь),  Mac LEE , заветные книги Полищука и справка по автокаду.
это не исчерпывающий список , конечно, за что прошу прощения у остальных.. но ВАМ ВСЕМ - мое почтение и благодарность!!

по делу - ACAD 16, со всеми обновлениями, которые известны нашим системщиками. они стараются следят за этим.

если пробежать по текущему листу этим способом ->

Код - Auto/Visual Lisp [Выбрать]
  1. (setq layout (vla-item (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (getvar "ctab")))
  2. (setq config_names (vlax-safearray->list (vlax-variant-value (vla-getcanonicalmedianames layout))))

то получим длинный список со стандартными именами форматов в виде привычного имени и нестандартными, записанными в виде:

UserDefinedMetric (420.00 x 297.00мм)

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

пока печатал ответ, несколько раз прогнал, пока без сбоев.
обязательно применять в конце (vla-regen ActiveDoc acallviewports) для того , чтобы регенерировалось все , что наприменяли в коде..

в итоге заработала вот такая конструкция

Код - Auto/Visual Lisp [Выбрать]
  1. (defun C:TEST()
  2.  
  3.   (vl-load-com)
  4.    
  5.   (setq ActiveDoc (vla-get-activedocument (vlax-get-acad-object)))
  6.  
  7.   (setq layout (vla-get-activelayout ActiveDoc))
  8.   (vla-refreshplotdeviceinfo layout)
  9.   (vla-put-configname layout "DWG To PDF.pc3")  
  10.   (vla-put-canonicalmedianame layout "UserDefinedMetric (420.00 x 297.00ММ)");"A3_NXP")
  11.   (vla-regen ActiveDoc acallviewports)
  12.   (princ)
  13. )

данная конструкция обязательно обрастет чем-то большим. :)

СПАСИБО ВСЕМ!
Название: Re: Ошибка при вызове (vla-put-canonicalmedianame)
Отправлено: Александр Ривилис от 27-01-2020, 15:04:55
d_Spam_b,
Еще раз. Сначала (vla-put-configname layout "DWG To PDF.pc3")  , а затем (vla-refreshplotdeviceinfo layout)
У тебя заработало, потому что уже в этом листе было установлено "DWG To PDF.pc3".
Название: Re: Ошибка при вызове (vla-put-canonicalmedianame)
Отправлено: d_Spam_b от 27-01-2020, 15:34:29
Принял. Спасибо!.
Не там первый ответ опубликовал, поэтому не видел Вашего.