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

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

Просмотров: 2238
 
Непрочитано 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,297
Отправить сообщение для 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,297
Отправить сообщение для 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,297
Отправить сообщение для 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,297
Отправить сообщение для 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,297
Отправить сообщение для 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=== вне форума  
 
Непрочитано 25.10.2024, 14:47
#21
doctorraz

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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Вывод: пока НК не получит "волшебного пенделя", правду он не скажет.
но нана умеет SetClosestMediaName
поэтому нет проблем подсунуть в плотсетинг размер печатаемой области , единицы чертежа и нана сам подберет нужный формат
но это на .NET, не уверен, что на лиспе так получится
для автокад можно даже не пытаться, там на месте этого класса стоит заглушка (давно)))
------------
PS для чего узнавать какой принтер и бумага назначены? если чертеж пришел с другой машины или из другой программы, то эта информация не имеет никакого смысла. можно еще и эксепшен словить
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 25.10.2024, 14:52
#22
name02


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


Может попробовать сделать:
(vla-refreshplotdeviceinfo *layout*)

Все-таки принтеры в системе вещь малоизменяемая, поэтому я для своей программы (для Автокада) реализовал следующий алгоритм:

1. По размеру блока (с учетом масштаба конечно) определяется формат бумаги под него
2. В файле настроек печати указан формат, принтер и название бумаги для печати, цветовой профиль и т.п.

У себя я это обозвал "профиль печати":
Нажмите на изображение для увеличения
Название: окно1.png
Просмотров: 7
Размер:	52.2 Кб
ID:	265261

Соответственно можно настроить и переключаться на нужный профиль печати в зависимости от задачи и ситуации
name02 вне форума  
 
Непрочитано 25.10.2024, 15:07
#23
===AAA===


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


Цитата:
для чего узнавать какой принтер и бумага назначены?
Тут дело такое. У нас есть отдел централизованной печати
и - главное - архивного хранения файлов.

Поэтому к передаваемым файлам предъявляются некие
требования.

Соответственно, автоматизировав процесс подготовки файлов,
можно сэкономить кучу времени и нервов. Но сразу назначать
параметры будет некорректно - нужно сперва посмотреть, а что
же назначил пользователь. Проанализировать. И если там всё
более или менее адекватно, то не умничать и ничего не менять.
Или почти ничего.

А если поменял - то аккуратно вывести это в Протокол, чтобы
пользователь знал, "что было и что стало".

----- добавлено через ~29 мин. -----
Цитата:
Может попробовать сделать:
(vla-refreshplotdeviceinfo *layout*)
Не, не помогает.

Но выход есть - в виде формальной

(command "_plot" ... "_y" "_n")

т.е. "печать без печати - и в никуда".

Может быть, и другой "волшебный пендель" поискать можно...
Я пока на этом остановился.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 25.10.2024, 18:40
#24
doctorraz

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


Дык может проще будет ..
Все проектанты выводят в пдф, а отдел печати уже дальше думает в бумагу это. Или как
Из пдф по принтерам разным раскидать бестселлер РеверсPDF, просто пушка, жаль что продажи прекращены, но при желании можно изыскать возможность.
Так то чтобы обученные люди печатали чужие dwg, должна быть очень жесткая стандартизация.. Ну и автодеск давно подшивки придумала, но всегда есть шанс, что у печатника принтер называется чуть иначе чем у проектанта и карета превратится в тыкву... Поэтому и востребованы Реверс, PlotSPDS, когда можно распечатать любой чертеж со своими настройками ничего не настраивая))
__________________
Мастерская СПДС

Последний раз редактировалось doctorraz, 25.10.2024 в 20:47.
doctorraz вне форума  
 
Автор темы   Непрочитано 28.10.2024, 08:50
#25
name02


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


Цитата:
Сообщение от doctorraz Посмотреть сообщение
Дык может проще будет ..
Видимо перед отделом печати стоит еще задача указывать на ошибки при формировании документации.

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

Может попробовать взять информацию об имени принтера, имени бумаги и ее размере из словаря листа (layouta)? Вот такой пример для Автокада. Но может нанокад в своих словарях хранит данные по печати?

Код:
[Выделить все]
 (defun c:test (/ psn )
  (setq
    psn	(member	'(100 . "AcDbPlotSettings")
		(dictsearch
		  (cdr (assoc -1 (dictsearch (namedobjdict) "ACAD_LAYOUT")))
		  (getvar "ctab")
		)
	)
  )

  (princ (strcat "Plotter name: " (cdr (assoc 2 psn))))
  (princ (strcat "\nPaper size: " (cdr (assoc 4 psn))))

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

DXF-коды настроек печати (197 pdf-страница) https://autolisp.ru/wp-content/uploa...om=100,150,150
name02 вне форума  
 
Непрочитано 29.10.2024, 07:24
#26
baksconstructor


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Но может нанокад в своих словарях хранит данные по печати?
Может быть попробовать Реверс ? Там можно сохранять и список файлов и уникальные настройки.
baksconstructor вне форума  
Ответ
Вернуться   Форум 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