NanoCAD - как задать область печати на LISP?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > NanoCAD - как задать область печати на LISP?

NanoCAD - как задать область печати на LISP?

Ответ
Поиск в этой теме
Непрочитано 02.10.2024, 13:39 #1
NanoCAD - как задать область печати на LISP?
name02
 
Регистрация: 10.01.2020
Сообщений: 415

Адаптирую лисп для автокада для автоматической печати в нанокаде. Споткнулся на этапе программного задания области печати.
Вот такой лисп test.lsp:
Код:
[Выделить все]
 (defun c:test (/ pt1 pt2 *layout* pointTemp1 pointTemp2)
  (setq pt1 (getpoint))
  (setq pt2 (getpoint))

  (setq *layout* (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object))))
	
  (setq pointTemp1 (vlax-make-safearray vlax-vbDouble '(0 . 1)))
  (vlax-safearray-put-element pointTemp1 0 (car pt1))
  (vlax-safearray-put-element pointTemp1 1 (cadr pt1))
    
  (setq pointTemp2 (vlax-make-safearray vlax-vbDouble '(0 . 1)))
  (vlax-safearray-put-element pointTemp2 0 (car pt2))
  (vlax-safearray-put-element pointTemp2 1 (cadr pt2))
    
  (vla-setwindowtoplot
			*layout*
 	   		pointTemp1
 	   		pointTemp2
   ) ;_ end of vla-setwindowtoplot
	
  (vla-put-PlotType *layout* acWindow)

)
Суть проблемы в следующем:
1 Задал область печати листа А4 через окно "Печать"
2 Запустил лисп. После отработки программы на дисплее область для печати (белый лист) перемещается куда надо, но если открыть окно печати, то область печати остается на ранее установленных координатах из шага 1 (красная пунктирная линия).
Нажмите на изображение для увеличения
Название: окно печати.png
Просмотров: 35
Размер:	58.4 Кб
ID:	264940

Вопрос: что делаю не так? Это недоработка лиспа под нанокад или есть какой-то другой способ задания области печати?

Просмотров: 2242
 
Непрочитано 02.10.2024, 15:04
#2
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Фиг знает... Я пока остановился на командном методе, т.е.:

(command "-plot" "_y" ... детальная настройка ... "_y" "_n")

иначе что-нибудь, да подглючивает :-(

Что пока не смог победить, так это программно "отцентровать" область
вывода (чтобы серединка пиктограммы со стрелочками на твоей картинке
стала голубой).

Просто опции "Центр" в команде Печати в NC23.1 нет (в NC24, говорят,
уже появилась).

Приходится высчитывать и задавать смещение. Зрительно "всё по центру",
но квадратик всё равно остаётся серым.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 02.10.2024, 15:29
1 | 1 #3
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,298
Отправить сообщение для doctorraz с помощью Skype™


На Хабре на тему печати есть хороший цикл статей.
Там для . NET, но пугаться не надо, печать и настройки реализованы через ActiveX, т.е. на Лиспе то же реально
Эти же статьи есть в справке нанокад SDK
Если вкратце, то область печати в нано может задаваться в двух местах апи, центрирование тоже.
Если задавать там и там, то для печати CustomPlotSetting имеет приоритет.
Печатать будет с его настройками
Т. Е. если хотим как в Автокад CustomPlotSetting надо очищать, clear
В CustomPlotSetting может быть задано НЕСКОЛЬКО областей печати
__________________
Мастерская СПДС

Последний раз редактировалось doctorraz, 03.10.2024 в 07:06.
doctorraz вне форума  
 
Непрочитано 04.10.2024, 13:22
#4
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Цитата:
Эти же статьи есть в справке нанокад SDK ...
... центрирование тоже.
А можно с этого места чуть подробнее?
Очень нужно задать центровку чертежа при печати.
Через LISP.

Что-то CUSTOMPLOTSETTINGS не получается.
Ни -GET-, ни тем более -PUT- ...

Какой там хоть синтаксис-то?

Или для центровки просто (vla-put-CenterPlot ...) достаточно будет?
__________________
Счастливо, Алексей!

Последний раз редактировалось ===AAA===, 04.10.2024 в 14:47.
===AAA=== вне форума  
 
Непрочитано 04.10.2024, 15:31
1 | #5
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,298
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Какой там хоть синтаксис-то?
в лисп не умею
адаптируй
https://habr.com/ru/companies/nanosoft/articles/579360/
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 05.10.2024, 15:55
1 | #6
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Для начала надо бы описание функций

(VLA-GET-CUSTOMPLOTSETTINGS) и
(VLA-PUT-CUSTOMPLOTSETTINGS) найти...

В доках SDK LISP nanoCAD 23.1 я только
упоминание о них обнаружил.

Если есть у кого - подкиньте, плиз.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 05.10.2024, 18:48
#7
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Для начала надо бы описание функций

(VLA-GET-CUSTOMPLOTSETTINGS) и
(VLA-PUT-CUSTOMPLOTSETTINGS) найти...

В доках SDK LISP nanoCAD 23.1 я только
упоминание о них обнаружил.
так может их еще не реализовали?
Сергей812 вне форума  
 
Непрочитано 05.10.2024, 20:25
#8
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,298
Отправить сообщение для doctorraz с помощью Skype™


Чет я думал что ActiveX через лисп тот жэж функционал, что и через vba.. заблуждался от неведения?
Ну и писать лисп с нуля для нано это надо быть Гуру лиспа, без отладчика ..
Имха vbs для этой задачи попроще, и отладчик есть.
Выгоды в производительности от лисп не будет.
Даже net не будет значительно быстрее именно на печати
__________________
Мастерская СПДС

Последний раз редактировалось doctorraz, 05.10.2024 в 20:31.
doctorraz вне форума  
 
Непрочитано 06.10.2024, 07:13
#9
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Цитата:
так может их еще не реализовали?
Ну, функции-то как таковые есть, по крайней мере при
их вызове НК не ругается на их отсутствие.

Но какой параметр вызова для той же
(VLA-GET-CUSTOMPLOTSETTINGS)
нужно подсовывать, чтобы она не возвращала ошибку -
пока не понятно...
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 06.10.2024, 07:16
#10
name02


 
Регистрация: 10.01.2020
Сообщений: 415


Я бы попробовал как с статье на хабре - activelayout
name02 вне форума  
 
Непрочитано 06.10.2024, 09:54
#11
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от doctorraz Посмотреть сообщение
Чет я думал что ActiveX через лисп тот жэж функционал, что и через vba.. заблуждался от неведения?
в акаде - да. Они вроде вообще одновременно в нем появились - vla* функции и VBA. А нано, насколько понимаю, использует стороннюю библиотеку ODA для работы с закрытым форматом *.dwg, а реализация интерпретатора лиспа у них своя - и что и как у них реализовано, насколько полно или где-то "заглушки" функций еще стоят...
Сергей812 вне форума  
 
Автор темы   Непрочитано 06.10.2024, 10:19
1 | #12
name02


 
Регистрация: 10.01.2020
Сообщений: 415


Ну что-же, благодаря doctorraz (спасибо за ссылку на пост на хабре) и ===AAA=== (спасибо за пост про VLA-SET_CUSTOM...) я поковырявшись и проанализровав решил-таки проблему с программной установкой областей печати в nanocad (заранее установить в настройках принтер и область печати рамкой) :
Код:
[Выделить все]
 (defun c:test( / ad al pl custom_pl pl_areas pl_a)
;;заглавными буквами написал нанокадовские методы для работы с областями печати

	(vl-load-com)

	;;активный документ
	(setq ad (vla-get-activedocument (vlax-get-acad-object) ))
  
	;;активный лист документа
	(setq al (vla-get-activelayout ad))

	;;свойства PLOT документа
	(setq pl (VLA-GET-PLOT ad))
  
	;;кастомные настройки печати листа 
	(setq custom_pl (VLA-GET-CUSTOMPLOTSETTINGS pl al))

	;;области печати кастомных настроек
	(setq pl_areas (VLA-GET-PLOTAREAS custom_pl))
	
	;;указываем точки новой области печати
	(setq pt1 (getpoint))
	(setq pt2 (getpoint))
	
	(setq pointTemp1 (vlax-make-safearray vlax-vbDouble '(0 . 1)))
	(vlax-safearray-put-element pointTemp1 0 (car pt1))
	(vlax-safearray-put-element pointTemp1 1 (cadr pt1))

	(setq pointTemp2 (vlax-make-safearray vlax-vbDouble '(0 . 1)))
	(vlax-safearray-put-element pointTemp2 0 (car pt2))
	(vlax-safearray-put-element pointTemp2 1 (cadr pt2))

	;;очищаем набор существующих областей печати
	(VLA-CLEAR pl_areas)
  
	;;добавляем область печати в набор 
	(setq pl_a (VLA-ADD pl_areas pointTemp1 pointTemp2))
	
	;;обновляем кастомные настройки печати
	(VLA-PUT-CUSTOMPLOTSETTINGS pl al custom_pl)
	
	(princ)
)

Последний раз редактировалось name02, 06.10.2024 в 10:38.
name02 вне форума  
 
Непрочитано 22.10.2024, 13:59
#13
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


А какой функцией можно получить текущий заданный размер
бумаги плоттера (который "A1" или какой-нибудь "ISO A4") ?

Типа:

(setq acdobj (vlax-get-acad-object))
(setq acddoc (vla-get-ActiveDocument acdobj))

(vla-get-Чего-Нибудь-Написать-Сюда (vla-get-ActiveLayout acddoc))
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 22.10.2024, 14:52
#14
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,298
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Типа:
__________________
Мастерская СПДС

Последний раз редактировалось doctorraz, 22.10.2024 в 15:41.
doctorraz вне форума  
 
Автор темы   Непрочитано 22.10.2024, 15:19
#15
name02


 
Регистрация: 10.01.2020
Сообщений: 415


Цитата:
Сообщение от doctorraz Посмотреть сообщение
Что-то непонятно куда ссылка ведет - куда смотреть?
name02 вне форума  
 
Непрочитано 22.10.2024, 15:44
#16
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,298
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от name02 Посмотреть сообщение
куда ссылка ведет
скопируй и вставь, чет по клику не туда(((
Код:
[Выделить все]
https://fordewind.org/wiki/doku.php?id=автомат_листы
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 22.10.2024, 17:15
#17
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


А можно вот с этого места подробнее?

Цитата:
'настройки печати
olayt.ConfigName = "PDFCreator" 'плоттер
dim Retval, r
Retval=ut.CreateSafeArrayFromVector(olayt.GetCanonicalMediaNames())
For Each r In Retval
if (olayt.GetLocaleMediaName(r) = PaperSize) Then
olayt.CanonicalMediaName = r 'выбираем формата листа
Exit For
End If
Next
Получить список канонических имён форматов бумаги я могу.
Задать "нужный мне формат" - тоже.

Задача - узнать, а что же там было назначено изначально?

Добавлено №1

Эта информация ведь в чертеже где-то хранится...
Может быть - вообще системная переменная какая-нибудь?

Добавлено №2

Если глянуть на DXF, то можно увидеть секцию примерно
такого вида:

Цитата:
100
AcDbPlotSettings
1

2
HP Designjet T1300 HPGL2
4
A2_L
Здесь "A2_L", видимо, выбранное для чертежа каноническое имя
формата бумаги.

Осталось только до него добраться.

Добавлено №3

Видимо, как-так...

(setq ad (vla-get-activedocument (vlax-get-acad-object) ))
(setq al (vla-get-activelayout ad))
(setq pl (VLA-GET-PLOT ad))
(setq custom_pl (VLA-GET-CUSTOMPLOTSETTINGS pl al))

Далее смотрим дамп

(vlax-dump-object custom_pl t)

и видим:

Цитата:
; Значения свойств:
; Alignment = 36
; ColorMode = -1
; FileFolder = ""
; FileMask = "<DN>"
; IfFileExist = 0
; InflateWidth = 0.0
; Multipage = 0
; PaperOutMargins = 0
; Params = #<VLA-OBJECT IParams 0000021DAE940090>
; PlotAreas (RO) = #<VLA-OBJECT InanoCADPlotAreas 0000021DAE93F558>
; PlotToFile = 0
; PrinterDPI = 300
; RunPDFApp = -1
; RunPDFAppEx = 1
; UseDWGPath = -1
; UsePrefinedNames = 0
; Нет методов
А вот куда дальше "копать" - пока не понятно...
__________________
Счастливо, Алексей!

Последний раз редактировалось ===AAA===, 23.10.2024 в 08:49. Причина: Добавлено
===AAA=== вне форума  
 
Автор темы   Непрочитано 23.10.2024, 09:33
1 | 1 #18
name02


 
Регистрация: 10.01.2020
Сообщений: 415


Ты не пробовал автокадовские команды использовать? Может они в нанокаде тоже помогут.
Код:
[Выделить все]
 (defun c:test (/ ad al active_mn_canon active_mn_local)

  (vl-load-com)

  ;;Активный документ
  (setq ad (vla-get-activedocument (vlax-get-acad-object)))

  ;;Активный лист
  (setq al (vla-get-activelayout ad))

  ;;CanonicalMediaName формата установленного в листе al
  (setq active_mn_canon (vla-Get-CanonicalMediaName al))

  ;;LocaleMediaName формата с CanonicalMediaName active_mn_canon установленного в листе al
  (setq active_mn_local (vla-GetLocaleMediaName al active_mn_canon))

  (print (list active_mn_canon active_mn_local))

  (princ)

  ) ;_ end defun
name02 вне форума  
 
Непрочитано 23.10.2024, 09:59
#19
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Да, идут. Ровно то, что нужно. Спасибо!
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 25.10.2024, 13:49
#20
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Что выяснилось.

1. Для одного и того же драйвера (скажем, того же самого HP Designjet T1300 HPGL2)
Автокад и наноКАД имеют разную наборку пользовательских имён бумаги.
Какие-то из них могут совпадать (допустим "А1"), а какие-то (допустим "А1 (альбомная)")
в наборке НК будут отсутствовать.
2. Если мы откроем в НК файл, работу с которым мы закончили в АК с назначением
формата листа на отсутствующий в НК "А1 (альбомная)", то при печати НК заменит его на
какой-то из своих форматов. Возможно - не самый оптимальный. Но что-то он туда
назначит.

Пока всё логично. Но!

3. Если мы откроем такой файл в НК и попытаемся программно узнать, а что же НК назначил
вместо отсутствующего у него "А1 (альбомная)", то в active_mn_local (см. пост #18 выше)
будет пустота, т.е. "". А всё потому, что в active_mn_canon будет какая-то "левизна".

4. Попробуем сейчас зайти в окно печати и "зрительно" увидеть, что НК всё-таки назначил
какой-нибудь "DIN Oversize L1" и снова повторить код из пост #18.
Всё замечательно, active_mn_local = "DIN Oversize L1"

Вывод: пока НК не получит "волшебного пенделя", правду он не скажет.

Имейте это в виду при адаптации своих программ для АС под НК.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > NanoCAD - как задать область печати на LISP?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Плагин создания кабельных линий и генерации КЖ раздела КИПиА. Протестировано на AutoCAD 2015...2022 и офис 2013...2019. NanoCAD 23 petro_f Готовые программы 244 26.09.2024 10:25
Как настроить область печати при публикации PDF из подшивки. XoRys AutoCAD 15 18.06.2015 08:31
Lisp простой нумератор для Nanocad gizmo_zx LISP 2 17.03.2015 11:50
"Съезжает" область печати в пространстве листа! Marv AutoCAD 1 08.12.2012 17:12
Можно ли нескольким листам задать стиль печати Maiia AutoCAD 1 19.10.2012 16:00