Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) - Страница 118
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Непрочитано 20.07.2008, 20:12 1 |
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,990

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vl-catch-all-apply '(lambda () (vla-put-explodable blk_def :vlax-true)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
_____________________________________________________________________________________________________________

Прошло много лет и топик теперь представляет из себя площадку для обучения азов программирования для многих начинающих.
Так что начинающие лиспогрызы приветствуются .
__________________
Блог

Последний раз редактировалось Red Nova, 12.07.2017 в 05:43.
Просмотров: 2048797
 
Непрочитано 18.11.2014, 14:14
#2341
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 664
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Здравствуйте!
Есть такая конструкция:
Код:
[Выделить все]
 (defun c:ut ()
  (command "_.ucs" "_n" "_ob")
)
Это нужно что бы поворачивать вид по объекту, постоянно пользуюсь.
Но есть одно неудобство - чертёж каждый раз масштабируется (аналогично _zoom extend). В старых версиях Автокада этого масштабирования кажется не было и было намного удобнее.
Проблема упоминается здесь:
http://forum.dwg.ru/showthread.php?t=36250
http://forums.autodesk.com/t5/pointi...i/td-p/4399367

Я пробовал сообразить что то такое
Код:
[Выделить все]
 (defun c:ut ()
	(command "_.ucs" "_n" "_ob" )
	(command "")
	(command "zoom" "p")
)
Но, к сожалению, должным образом не работает. Кажется я смутно понимаю как обращаться с command

Или вообще стоит избавится от command и написать как то по-другому, но мне важнее результат и что бы это было на автолиспе.

PS если удастся сделать то сразу надо наверное будет добавить подобную конструкцию:
Код:
[Выделить все]
 (if (= 1 (getvar "ucsfollow")) (command "zoom" "p"))
Обход масштабирования при ucsfollow = 0.
baaba вне форума  
 
Непрочитано 18.11.2014, 14:53
#2342
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от Frigate Посмотреть сообщение
Если последним объектом в чертеже является блок с атрибутами, к примеру, "AN_1", и его запоминаем по ENTLAST, добавляем новые объекты в чертеж, а потом "вдруг" обнаруживаем появление дополнительных объектов - атрибутов последнего блока ("AN_1"). Как с этим бороться?
Я не очень понял, что надо и с чем бороться. Если именно запомнить этот блок в переменной:
Код:
[Выделить все]
(setq block (entlast))
- то не должно иметь значения, есть ли в нем атрибуты или нет, - переменная block будет указывает на этот блок: в пределах функции, если она объявлена в локальных, или в пределах сеанса, если переменная глобальная. Или я не так понял...

Цитата:
Сообщение от baaba Посмотреть сообщение
Но есть одно неудобство - чертёж каждый раз масштабируется (аналогично _zoom extend)
У меня не зумируется. Автокад 2011х64 RUS SP2. Так что проверить не могу. Но есть подозрение, что не хватает подчеркиваний перед именами команд и их опций. Может, так сработает:
Код:
[Выделить все]
(command "_.ucs" "_n" "_ob" pause "_.zoom" "_p")

Последний раз редактировалось skkkk, 18.11.2014 в 15:03.
skkkk вне форума  
 
Непрочитано 18.11.2014, 15:09
#2343
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


ucsfollow, кажется, надо поменять. Могу ошибаться
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.11.2014, 15:45
#2344
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 664
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
ucsfollow, кажется, надо поменять. Могу ошибаться
Да, в моём понимании это должно помочь. Но пока всё равно не выходит. Вот как сейчас всё выглядит:
Код:
[Выделить все]
 (defun c:ut ()
	(setvar "ucsfollow" 0)
	(command "_.ucs" "_n" "_ob" )
	(command "")
	(setvar "ucsfollow" 1)
)
Вот что получается в комстроке (_CMDECHO 1):
Код:
[Выделить все]
Command: ut _.ucs
Current ucs name:  *NO NAME*
Specify origin of UCS or [Face/NAmed/OBject/Previous/View/World/X/Y/Z/ZAxis] 
<World>: _n
Specify origin of new UCS or [ZAxis/3point/OBject/Face/View/X/Y/Z] <0,0,0>: _ob
Select object to align UCS:
Command: 1
baaba вне форума  
 
Непрочитано 20.11.2014, 02:25
#2345
Curiosity

Конструктор
 
Регистрация: 10.03.2014
Якутск
Сообщений: 18


Здравствуйте!
Недавно нашел здесь на форуме lisp VVA по сортировке текстовых примитивов

Код:
[Выделить все]
(defun f_sel_txt_x (sset dxf / )
	(if (not (equal sset nil))
		(mapcar 
			(function 
				(lambda (x)
					(cdr (assoc dxf (entget x)))
				) ;_ end of lambda
			) ;_ end of function
			(vl-sort
				(vl-remove-if
					(function listp)
					(mapcar (function cadr)
						(ssnamex sset)
					) ;_ end of mapcar
				) ;_ end of vl-remove-if
				'(lambda (a b)
					(or
						(< (cadr (assoc '11 (entget a)))
							(cadr (assoc '11 (entget b)))
						) ;_ on X
						(and  ;_ On Y if eq X
							(equal 
								(cadr (assoc '11 (entget a)))
								(cadr (assoc '11 (entget b)))
								0.1
							) ;_ end of equal
							(> (caddr (assoc '11 (entget a)))
								(caddr (assoc '11 (entget b)))
							) ;_ end of <
						) ;_ end of and
					) ;_ end of or
				) ;_ end of lambda
			) ;_ end of vl-sort
		) ;_ end of mapcar
	) ;_ end of if
) ;_ end of defun


И написал lisp который делает набор по списку координат


Код:
[Выделить все]
(defun f_multi_set (lst / ss ss1 ss2 )
	(setq i 0)
	(repeat (f_round (/ (float (length lst)) 2.0) 1)
		(setq ss1 (ssget "_W" (car (nth i lst)) (cadr (nth i lst))))
		(if 
			(equal (nth (1+ i) lst) nil)
			(setq ss2 (ssadd))
			(setq ss2 (ssget "_W" (car (nth (1+ i) lst)) (cadr (nth (1+ i) lst))))
		)
		(if (equal ss nil)
			(setq ss (ssadd))
		)
		(setq i (+ i 2))
		(vl-cmdf "_select" ss ss1 ss2 "")
		(setq ss (ssget "_p"))	
	)
)
(defun f_round (val prec / )
	(* 
		(fix 
			(+ 
				(/ val (float prec))
				0.5
			)
		)
	 prec
	)
)


Так вот когда пытаюсь отсортировать текстовые примитивы выбранные f_multi_set, функция f_sel_txt_x сортирует их неправильно.
(f_sel_txt_x (f_multi_set (список точек)) -1)
Подскажите пожалуйста что не так?
Curiosity вне форума  
 
Непрочитано 20.11.2014, 18:58
#2346
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 664
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Цитата:
Сообщение от skkkk Посмотреть сообщение
У меня не зумируется. Автокад 2011х64 RUS SP2. Так что проверить не могу. Но есть подозрение, что не хватает подчеркиваний перед именами команд и их опций. Может, так сработает:
Код:
[Выделить все]
(command "_.ucs" "_n" "_ob" pause "_.zoom" "_p")
Только что проверил на Автокад 2012. Зуммируется. Наверное я не очень внятно объяснил в чём моя проблема.
Вот это видео правда сделано на 2010 Автокаде, но 2012 ведёт себя так же:
http://tinyurl.com/m5enjsb

При выполнении _.plan _c , т. е. план в текущей системе координат, чертёж зуммируется полностью. При этом в чертежах, особенно генпланы, бывают отдельные примитивы случайно или по необходимости отнесённые далеко от основного чертежа. Тогда затем приходится долго зуммировать до нужного фрагмента. Если это делать часто - неочень удобно.
"_.zoom" "_p" - выручает. Но при этом сбивается поворот относительно системы координат, а это аннулирует все удобства UCSFOLLOW = 1. Это как раньше были кульманы у которых вращался угольник. Мне нужно что бы при этом вращалась и моя голова.
Это обеспечивается установкой UCSFOLLOW = 1. То есть у меня например ось под углом 60 градусов. Я выбираю ПСК по объекту: ucs > new > object. При этом происходит смена ПСК и сразу же и поворот вида ортогонально новой ПСК, что иногда очень нужно. Но при этом же происходит и масштабирование, что не удобно и чего в старых версиях кажется не было. Если UCSFOLLOW = 0 то такой проблемы нет, но и "голова не вращается".

Хотел написать скрипт. Но основная проблема в том что (command "_.zoom" "_p") сбивает поворот вида.
baaba вне форума  
 
Непрочитано 21.11.2014, 14:00
#2347
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от baaba Посмотреть сообщение
Вот это видео правда сделано на 2010 Автокаде, но 2012 ведёт себя так же
Это точно 2010? Судя по видео, там есть автозавершение функций в комстроке, а оно появилось, вроде в 2012-м, по крайней мере у меня в 2011-м этого нет. Вряд ли в 2010-м было... Или я не знаю, как его включить?
Заявляю со всей ответственностью: в 2011-м по факту выполнения _USC _OBJ масштабирования не происходит. Сказать что-то больше я просто не могу, т.к. не имею под рукой Автокада 2012
skkkk вне форума  
 
Непрочитано 21.11.2014, 16:34
#2348
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 664
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Цитата:
Сообщение от skkkk Посмотреть сообщение
Это точно 2010?
Да, точно он, 2010. Автокомплит в нём есть, чему я несказанно рад. Странно что в Автодеск его не додумались его включить раньше. Этой вещью давно пользуется всё прогрессивное человечество -) В любом случае спасибо за наблюдение. Будет под рукой 2011 - проверю.
baaba вне форума  
 
Непрочитано 21.11.2014, 16:37
#2349
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от baaba Посмотреть сообщение
2010. Автокомплит в нём есть
А почему у меня в 2011-м нет? Как его включить?
skkkk вне форума  
 
Непрочитано 21.11.2014, 18:49
#2350
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 664
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Цитата:
Сообщение от skkkk Посмотреть сообщение
А почему у меня в 2011-м нет? Как его включить?
Я его ни как не включал. Пользуюсь клавишей TAB и у меня работает. Вспомнил: у нас стоял 2011. На нём это то же работало, клавишей TAB.
Но у меня не выводится список комманд. Я просто перебираю табом, но меня это категорически устраивает (я и так примерно помню нужные комманды, работаю уже давно без меню).
baaba вне форума  
 
Непрочитано 28.11.2014, 15:44
#2351
Сергей812


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


Добрый день. Предистория: есть файл шаблона autocad с настроенными листами с форматами. На каждом листе есть блок основной надписи с именем "Основная_надпись_ЕСКД", расположенный на слое "Формат_ЕСКД". Требуется: вставить сверху (можно было в атрибутах - но это переделывать много сотен файлов) в определенное место на блоке текст вида "Авторский лист ХХХ".

Загвоздка: в зависимости от формата координаты местоположения блока основной надписи, естественно, разные. Написал следующий код:
Код:
[Выделить все]
 (defun c:TestSSGet ( / lSetBlk n b1 lP lPx lPy)
	(setq lSetBlk nil)
  	(setq lSetBlk (ssget "_X" (list '(0 . "INSERT") '(8 . "Формат_ЕСКД") )))
	(setq n (sslength lSetBlk))
		(while (> n 0)
			(setq b1 (ssname lSetBlk(- n 1)))
			(if (= (vla-get-effectivename (vlax-ename->vla-object b1)) "Основная_надпись_ЕСКД" )
				(progn
					(setq lP (cdr(assoc 10 (entget b1))))
					(setq lPx (car lP))
			  		(setq lPy (car (cdr lP)))
				  	(princ (strcat "\nX=" ( rtos lPx) "  Y=" ( rtos lPy) "\n"))
					(setq n -9)
			  	)
			)
	    (setq n (- n 1)) 
	)

)
Но все время получаю одни и те же координаты вне зависимости от размера листа. Причем на пустом листе ( без настроенного формата и отсутствующего блока основной надписи) выдает те же координаты. Куда нужно "копать": неправильный код, неправильная DXF группа, некорректная работа с наборами или что то еще?

p.s. ( vl-load-com ) вызывается ранее, поэтому нет в функции.
Сергей812 вне форума  
 
Непрочитано 28.11.2014, 16:11
#2352
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


(setq n -9) - это к чему?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.11.2014, 16:23
#2353
Сергей812


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(setq n -9) - это к чему?
Просто выход из цикла - как нашли блок основной надписи и "сдернули" координаты с него, дальше перебирать набор смысла нет. Далее простейший код вида:
Код:
[Выделить все]
 	(if (= n -10)
	    (progn
	  	(setq lSOsMode (getvar "OSMODE"))
	      	(setvar "OSMODE" 0)
		(entmake (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(67 . 1) '(8 . "Формат_ЕСКД") '(100 . "AcDbMText")
			(cons 10 (list (- lPx 22.5) (+ lPy 47.8) 0.0)) '(40 . 2.0) '(71 . 1) '(72 . 5)
			(cons 1 (strcat "Авторский лист " (itoa lNum))) '(7 . "штамп") '(210 0.0 0.0 1.0) '(11 1.0 0.0 0.0)
			'(50 . 0.0) '(73 . 1) '(44 . 1.0))		   
		)
	      	(setvar "OSMODE" lSOsMode)
	    )
	) 
Сергей812 вне форума  
 
Непрочитано 28.11.2014, 17:03
#2354
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Файлик приложи. Навскидку я не понимаю, почему не работает.
P.S. osmode в принципе можно не снимать. А при entmake не помешает учитывать пространство (лист/модель), в котором объект надо создавать.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.11.2014, 19:16
#2355
Сергей812


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


Сам тестовый чертеж и lsp

Последний раз редактировалось Сергей812, 13.03.2025 в 14:33.
Сергей812 вне форума  
 
Непрочитано 28.11.2014, 20:50
1 | #2356
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Два варианта кода. Первый пишет на всех листах один и тот же текст, второй - автоматически счетчик добавляет.
(defun c:Вставить_номер_авторского_листа (/ lincnamefile lnum lfile lsetblk n b1 lp lpx lpy lsosmode)

(vl-load-com)
(setq
lincnamefile (strcat (vl-filename-directory (vla-get-fullname (vla-get-activedocument (vlax-get-acad-object))))
"\\"
"Increment.txt"
) ;_ end of strcat
) ;_ end of setq
(if (= (findfile lincnamefile) nil)
(progn
(setq lnum 1
lfile (open lincnamefile "W")
) ;_ end of setq
(write-line (itoa lnum) lfile)
(close lfile)
) ;_ end of progn
(progn
(setq lfile (open lincnamefile "R")
lnum (+ (atoi (read-line lfile)) 1)
) ;_ end of setq
(close lfile)
(setq lfile (open lincnamefile "W"))
(write-line (itoa lnum) lfile)
(close lfile)
) ;_ end of progn
) ;_ end of if
(if (setq lsetblk (ssget "_X" (list '(0 . "INSERT") '(8 . "Формат_ЕСКД"))))
(foreach ent
(vl-remove-if-not
(function
(lambda (x)
(= (strcase
(vlax-get-property (vlax-ename->vla-object x)
(if (vlax-property-available-p (vlax-ename->vla-object x) 'effectivename)
"effectivename"
"name"
) ;_ end of if
) ;_ end of vlax-get-property
) ;_ end of strcase
"ОСНОВНАЯ_НАДПИСЬ_ЕСКД"
) ;_ end of =
) ;_ end of lambda
) ;_ end of function
((lambda (/ item tab)
(repeat (setq tab nil
item (sslength lsetblk)
) ;_ end setq
(setq tab (cons (ssname lsetblk (setq item (1- item))) tab))
) ;_ end of repeat
) ;_ end of lambda
)
) ;_ end of vl-remove-if-not
(setq lp (cdr (assoc 10 (entget ent))))
(princ (strcat "\nx="
(rtos (car lp) 2 14)
"; y="
(rtos (cadr lp))
"; space="
) ;_ end of strcat
) ;_ end of princ
(if (not (entmakex (append (list '(0 . "MTEXT")
'(100 . "AcDbEntity")
'(100 . "AcDbMText")
) ;_ end of list
(mapcar
(function
(lambda (x)
(assoc x (entget ent))
) ;_ end of lambda
) ;_ end of function
'(67 8 410)
) ;_ end of mapcar
(list (cons 10 (list (- (car lp) 22.5) (+ (cadr lp) 47.8)))
'(40 . 2.)
'(71 . 1)
'(72 . 5)
(cons 1 (strcat "Авторский лист " (itoa lnum)))
'(41 . 185.)
'(7 . "штамп")
'(11 1.0 0.0 0.0)
'(50 . 0.0)
'(73 . 1)
'(44 . 1.)
'(210 0. 0. 1.)
) ;_ end of list
) ;_ end of append
) ;_ end of entmakex
) ;_ end of not
(princ (strcat "\nCan't write " (itoa lnum) " value"))
) ;_ end of if
) ;_ end of foreach
) ;_ end of if
) ;_ end of defun

(defun c:testssget (/ lsetblk n b1 lp lpx lpy)
(vl-load-com)
(setq lsetblk nil)
(setq lsetblk (ssget "_X" (list '(0 . "INSERT") '(8 . "Формат_ЕСКД"))))
(setq n (sslength lsetblk))
(while (> n 0)
(setq b1 (ssname lsetblk (- n 1)))
(if (= (vla-get-effectivename (vlax-ename->vla-object b1)) "Основная_надпись_ЕСКД")
(progn
(setq lp (cdr (assoc 10 (entget b1))))
(setq lpx (car lp))
(setq lpy (car (cdr lp)))
(princ (strcat "\nX=" (rtos lpx) " Y=" (rtos lpy) "\n"))
(setq n -9)
) ;_ end of progn
) ;_ end of if
(setq n (- n 1))
) ;_ end of while
) ;_ end of defun

Код:
[Выделить все]
 (defun c:Вставить_номер_авторского_листа (/ lincnamefile lnum lfile lsetblk n b1 lp lpx lpy lsosmode)

  (vl-load-com)
  (setq
    lincnamefile (strcat (vl-filename-directory (vla-get-fullname (vla-get-activedocument (vlax-get-acad-object))))
                         "\\"
                         "Increment.txt"
                         ) ;_ end of strcat
    ) ;_ end of setq
  (if (= (findfile lincnamefile) nil)
    (progn
      (setq lnum  1
            lfile (open lincnamefile "W")
            ) ;_ end of setq
      (write-line (itoa lnum) lfile)
      (close lfile)
      ) ;_ end of progn
    (progn
      (setq lfile (open lincnamefile "R")
            lnum  (+ (atoi (read-line lfile)) 1)
            ) ;_ end of setq
      (close lfile)
      (setq lfile (open lincnamefile "W"))
      (write-line (itoa lnum) lfile)
      (close lfile)
      ) ;_ end of progn
    ) ;_ end of if
  (if (setq lsetblk (ssget "_X" (list '(0 . "INSERT") '(8 . "Формат_ЕСКД"))))
    (progn
      (foreach ent
               (vl-remove-if-not
                 (function
                   (lambda (x)
                     (= (strcase
                          (vlax-get-property (vlax-ename->vla-object x)
                                             (if (vlax-property-available-p (vlax-ename->vla-object x) 'effectivename)
                                               "effectivename"
                                               "name"
                                               ) ;_ end of if
                                             ) ;_ end of vlax-get-property
                          ) ;_ end of strcase
                        "ОСНОВНАЯ_НАДПИСЬ_ЕСКД"
                        ) ;_ end of =
                     ) ;_ end of lambda
                   ) ;_ end of function
                 ((lambda (/ item tab)
                    (repeat (setq tab  nil
                                  item (sslength lsetblk)
                                  ) ;_ end setq
                      (setq tab (cons (ssname lsetblk (setq item (1- item))) tab))
                      ) ;_ end of repeat
                    ) ;_ end of lambda
                  )
                 ) ;_ end of vl-remove-if-not
        (setq lp   (cdr (assoc 10 (entget ent)))
              lnum (1+ lnum)
              ) ;_ end of setq
        (princ (strcat "\nx="
                       (rtos (car lp) 2 14)
                       "; y="
                       (rtos (cadr lp))
                       "; space="
                       ) ;_ end of strcat
               ) ;_ end of princ
        (if (not (entmakex (append (list '(0 . "MTEXT")
                                         '(100 . "AcDbEntity")
                                         '(100 . "AcDbMText")
                                         ) ;_ end of list
                                   (mapcar
                                     (function
                                       (lambda (x)
                                         (assoc x (entget ent))
                                         ) ;_ end of lambda
                                       ) ;_ end of function
                                     '(67 8 410)
                                     ) ;_ end of mapcar
                                   (list (cons 10 (list (- (car lp) 22.5) (+ (cadr lp) 47.8)))
                                         '(40 . 2.)
                                         '(71 . 1)
                                         '(72 . 5)
                                         (cons 1 (strcat "Авторский лист " (itoa lnum)))
                                         '(41 . 185.)
                                         '(7 . "штамп")
                                         '(11 1.0 0.0 0.0)
                                         '(50 . 0.0)
                                         '(73 . 1)
                                         '(44 . 1.)
                                         '(210 0. 0. 1.)
                                         ) ;_ end of list
                                   ) ;_ end of append
                           ) ;_ end of entmakex
                 ) ;_ end of not
          (princ (strcat "\nCan't write " (itoa lnum) " value"))
          ) ;_ end of if
        ) ;_ end of foreach
      (setq lfile (open lincnamefile "W"))
      (write-line (itoa lnum) lfile)
      (close lfile)
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun

(defun c:testssget (/ lsetblk n b1 lp lpx lpy)
  (vl-load-com)
  (setq lsetblk nil)
  (setq lsetblk (ssget "_X" (list '(0 . "INSERT") '(8 . "Формат_ЕСКД"))))
  (setq n (sslength lsetblk))
  (while (> n 0)
    (setq b1 (ssname lsetblk (- n 1)))
    (if (= (vla-get-effectivename (vlax-ename->vla-object b1)) "Основная_надпись_ЕСКД")
      (progn
        (setq lp (cdr (assoc 10 (entget b1))))
        (setq lpx (car lp))
        (setq lpy (car (cdr lp)))
        (princ (strcat "\nX=" (rtos lpx) "  Y=" (rtos lpy) "\n"))
        (setq n -9)
        ) ;_ end of progn
      ) ;_ end of if
    (setq n (- n 1))
    ) ;_ end of while
  ) ;_ end of defun

Я не добавлял метки начала/конца отмены, это уж сам
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.11.2014, 21:19
#2357
Сергей812


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


Кулик Алексей aka kpblc, спасибо, буду разбираться. Второй вариант. Так как смысл этой программки - в одной папке лежит куча файлов *.dwg, объединенных через подшивку. И когда приходит информация со стройки о очередном изменений - делается копия проекта и выпускаются новые авторские листы, каждый из которых должен иметь свой уникальный номер в пределах проекта. И таких папок еще по корпусам немало. И народ просто путается в запарке, в какой папке какой следующий номер можно взять.
И поскольку каждый вызов команды - это один лист, то метки отмены не вижу смысла ставить - ведь текстовой файл не "откатиться" сам назад. А вот что лисп не проверяет и не удаляет эту надпись на листе, если существует-это мой косяк)
Сергей812 вне форума  
 
Непрочитано 30.11.2014, 20:10
#2358
Сергей812


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


Разобрался вроде - оказалось, ssget "_X" работает не с активной вкладкой, а со всем чертежом. И возвращает набор из всех блоков основной надписи во всех листах. Соответственно, всегда получал координаты только первого блока вне зависимости от активной вкладки. Как вариант - можно было делать проверку не только на имя блока, но и выдергивать из 410 группы название листа и сравнивать с ( getvar "CTAB").

Появился один вопрос: если переменная для хранения набора локальная - то при выходе из функции ей автоматически будет присвоено значение nil? Чтобы закрыть открытый набор...
Сергей812 вне форума  
 
Непрочитано 30.11.2014, 20:14
#2359
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
но и выдергивать из 410 группы название листа и сравнивать с ( getvar "CTAB")
Если надо обрабатывать только текущее пространство, попробуй ключ _A для ssget. Да и справку почитать не помешает
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
если переменная для хранения набора локальная - то при выходе из функции ей автоматически будет присвоено значение nil
Да.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.11.2014, 20:39
#2360
Сергей812


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


Ключ "_A" не дал эффекта выбора текущего пространства.. справку читаю - там вообще убрали этот ключ. В книге "AutoLisp и VisualLisp в среде AutoCAD" разница между ключами описывается как: "_A" эквилентно "_X" с пустым фильтром.
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46