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

Вернуться   Форум 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.
Просмотров: 2054936
 
Старый 25.02.2015, 19:17
#2461
RNB

Проектирование мостов
 
Регистрация: 29.01.2014
Новосибирск
Сообщений: 431


Товарисчи, подскажите решение в лиспе.
http://forum.dwg.ru/showpost.php?p=1...&postcount=733
Интересует циклическое повторение ввода данных вручную, до нажатия пользователем Enter или Esc
RNB вне форума  
 
Старый 25.02.2015, 20:38
#2462
Кулик Алексей aka kpblc
Moderator

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


RNB, тебя научить надо? Тогда добро пожаловать (в качестве начального варианта): http://autolisp.ru/2009/09/13/error-catch/ + http://autolisp.ru/2012/03/16/user-request/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 26.02.2015, 08:34
#2463
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Алексей, еще вопрос про DXF 100: есть ли где то инфа про то, где и сколько таких групп надо?
Например, тут их по две:
Код:
[Выделить все]
(cons 0 "LWPOLYLINE") 
(cons 100 "AcDbEntity") 
(cons 100 "AcDbPolyline")

(cons 0 "DIMSTYLE")
(cons 100 "AcDbSymbolTableRecord")
(cons 100 "AcDbDimStyleTableRecord")
А тут уже четыре:
Код:
[Выделить все]
    (cons 0 "DIMENSION") ;*
    (cons 100 "AcDbEntity") ;*
    (cons 100 "AcDbDimension") ;*
    (cons 10 pv)   
    (cons 70 32) ;*
    (cons 51 adim)
    (cons 3 "2-100")
    (cons 100 "AcDbAlignedDimension") ;*
    (cons 13 pn)
    (cons 14 pk)
    (cons 50 adim)
    (cons 100 "AcDbRotatedDimension") ;*
для меня пока самый надежный источник был (entget (car (entsel))) и смотреть что там есть да сравнивать.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Старый 26.02.2015, 09:29
#2464
Кулик Алексей aka kpblc
Moderator

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


Vladimir_Sergeevich, скажу честно: я почти всегда создаю через ActiveX - это нередко удобнее (особенно при работе внутри описания блоков или в неактивном документе).
Правда, это не касается размерного стиля - если его создавать или модифицировать лиспом, то кроме как entmake / entmod, ничего не срабатывает (я на autolisp.ru на эту тему как-то высказывался).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 26.02.2015, 09:58
#2465
trushev


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


Огромное спасибо за ответы!
И еще вопрос по коду 62

(cons 62 (atoi (getvar "cecolor"))) - неудачное решение, getvar может вернуть строку "BYLAYER" или "BYBLOCK". Кроме того, кажется где-то в 2002-2005 версии, встречал возврат не целым числом, а словом с именем цвета. Первое, что приходит в голову - cond с нудным перечислением случаев. Где посмотреть варианты решения?
trushev вне форума  
 
Старый 26.02.2015, 10:04
#2466
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
если его создавать или модифицировать лиспом, то кроме как entmake / entmod, ничего не срабатывает
вот я с размерами тоже долго бодался. Хоть ActiveX и удобней в использовании, а тут пришлось через DXF...
Самое интересное, что для групп 50 и 51 в ActiveX свойства есть только для одного (по крайней мере для 50 я в справке не откопал) и даже если поменять 51, картинка не менялась, хотя значение, вроде как, запоминалось.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Старый 26.02.2015, 10:12
1 | #2467
Кулик Алексей aka kpblc
Moderator

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


trushev, насколько я помню, если не указывать 62 группу, то примитив создается с текущим цветом (cecolor).
Vladimir_Sergeevich, вариантов на самом деле несколько:
1. Менять свойство Normal для vla-представления примитива. Возможно, потом понадобится выполнить vla-update для примитива
2. Для замены DXF-групп я уже давно использую код http://autolisp.ru/wp-content/upload...-autoregen.lsp + http://autolisp.ru/2013/11/19/partia...-ent-to-ename/ Как правило, хватает.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 27.02.2015, 07:58
#2468
RNB

Проектирование мостов
 
Регистрация: 29.01.2014
Новосибирск
Сообщений: 431


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
RNB, тебя научить надо? Тогда добро пожаловать (в качестве начального варианта): http://autolisp.ru/2009/09/13/error-catch/ + http://autolisp.ru/2012/03/16/user-request/
Вот что сваял в итоге. Подразумевается, что слой #Вспомогательная у меня есть. Есть какие-то замечания?
Код:
[Выделить все]
 (defun c:xline2 ()
  (command "_clayer" "#Вспомогательная" "_xline")
  (while (> (getvar "CMDACTIVE") 0)
    (if	(= (type
	     (vl-catch-all-apply
	       (function
		 (lambda ()
		   (command pause)
		 ) ;_ end of lambda
	       ) ;_ end of function
	     ) ;_ end of vl-catch-all-apply
	   ) ;_ end of type
	   'list
	) ;_ end of =
      (princ)
      (princ)
    ) ;_ end of if
  ) ;_ end of command
  (command "_layerp")
  (princ)
) ;_ end of defun
И вопросы: что в данном коде даёт (function (lambda ())) ?

Последний раз редактировалось RNB, 27.02.2015 в 08:10.
RNB вне форума  
 
Старый 27.02.2015, 09:31
#2469
Кулик Алексей aka kpblc
Moderator

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


vl-catch-all-apply (если обратиться к справке) применяет функцию к списку аргументов:
(vl-catch-all-apply 'function list)
Т.е. (vl-catch-all-apply (function (lambda() .... ) - просто другая форма записи (ИМХО - отлаживать такой код проще).
Цитата:
Сообщение от RNB Посмотреть сообщение
Есть какие-то замечания?
Я не знаю, что хочется получить. Но как вариант:
Код:
[Выделить все]
 (defun c:xl2 (/ pt1 pt2 ang)
  (while (and (= (type
                   (setq pt1 (vl-catch-all-apply (function (lambda () (getpoint "\nПервая точка прямой <Отмена> : ")))))
                   ) ;_ end of type
                 'list
                 ) ;_ end of =
              (= (type
                   (setq pt2 (vl-catch-all-apply (function (lambda () (getpoint pt1 "\nВторая точка прямой <Отмена> : ")))))
                   ) ;_ end of type
                 'list
                 ) ;_ end of =
              ) ;_ end of and
    (setq ang (angle pt1 pt2))
    (entmakex (list '(0 . "XLINE")
                    '(100 . "AcDbEntity")
                    '(100 . "AcDbXline")
                    '(8 . "#Вспомогательная")
                    (cons 10 pt1)
                    (cons 11 (list (cos ang) (sin ang)))
                    ) ;_ end of list
              ) ;_ end of entmakex
    ) ;_ end of while
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 27.02.2015, 10:42
#2470
RNB

Проектирование мостов
 
Регистрация: 29.01.2014
Новосибирск
Сообщений: 431


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я не знаю, что хочется получить
Хотелось получить команду, работающую как дефолтная, но в нужном слое. С возвратом первоначального слоя в конце.
В посте #2464 немного другой принцип.
RNB вне форума  
 
Старый 27.02.2015, 12:23
#2471
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 166


Как проверить в LISP - загружен ли файл ARX, LSP, FAS? Определена ли команда AutoCAD, заданная в файле ARX, LSP, FAS?
Заранее благодарен.
mkung вне форума  
 
Старый 27.02.2015, 12:30
#2472
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от mkung Посмотреть сообщение
загружен ли файл ARX
(arx) - и сверяй результаты
Цитата:
Сообщение от mkung Посмотреть сообщение
загружен ли файл LSP, FAS
Средствами lisp - никак. Когда-то Александр Ривилис писал arx-приложение, показывающее загрузку lsp.
Цитата:
Сообщение от mkung Посмотреть сообщение
Определена ли команда AutoCAD, заданная в файле ARX, LSP, FAS?
(atoma-family 1) - может быть, оно сработает как надо
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 27.02.2015, 12:53
#2473
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 166


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение

(atoma-family 1) - может быть, оно сработает как надо
; ошибка: no function definition: ATOMA-FAMILY

Понял... atoms-family

Вроде и работает, но

(if (member "C:TEXTFIT" (atoms-family 1)) (princ "YES!!!") (princ "NO!!!")) - пишет "YES!!!"

(if (member "C:TXT2MTXT" (atoms-family 1)) (princ "YES!!!") (princ "NO!!!")) - пишет "NO!!!!" хотя функция определена (EXPRESSTOOLS)

Последний раз редактировалось mkung, 27.02.2015 в 13:45.
mkung вне форума  
 
Старый 28.02.2015, 07:36
#2474
RNB

Проектирование мостов
 
Регистрация: 29.01.2014
Новосибирск
Сообщений: 431


Почему во время выполнения кода
Код:
[Выделить все]
 (command "_mleader" pause pause pause)
во время третьей паузы текст вводится в командную строку, а не "по месту", как это происходит при использовании команды "с кнопки"?
RNB вне форума  
 
Старый 28.02.2015, 13:20
#2475
Кулик Алексей aka kpblc
Moderator

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


Советую почитать http://autolisp.ru/2015/01/21/mleader_create_order/ - при создании мультивыноски командными методами можно наступить на очень обидные грабли.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 28.02.2015, 14:18
#2476
RNB

Проектирование мостов
 
Регистрация: 29.01.2014
Новосибирск
Сообщений: 431


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Советую почитать http://autolisp.ru/2015/01/21/mleader_create_order/ - при создании мультивыноски командными методами можно наступить на очень обидные грабли.
Это я уже читал. Значение в реестре нужное... Да и точки стрелки и полки ставятся нормально, а вот когда дело доходит до текста, то его ввод перекидывается в командную строку, где пробел или энтер делют ретурн
RNB вне форума  
 
Старый 03.03.2015, 13:53
#2477
RNB

Проектирование мостов
 
Регистрация: 29.01.2014
Новосибирск
Сообщений: 431


2 вопроса.
1.
Код:
[Выделить все]
 (defun c:test1 ()
  (command "_-layer"   "_make"	   "-main2"		   "_ltype"
	   "Continuous"		   ""	       "_color"	   "5"
	   ""	       "_lweight"  "0.35"      ""	   ""
	  )
    (setvar "clayer" "0")
  (command "_LAYMRG" "_name" "#main" "" "_Name" "-main2" "_Yes")
  (setvar "clayer" "0")
  (princ "APPLY!")
  (princ)
)
Почему объекты со слоя #main после объединения остаются вообще без слоя, вместо того, чтобы переместиться на слой -main2? При этом объекты находящиеся в блоках ведут себя правильно.
2. Подскажите как программно выделить все объекты на одном слое. Ну или как заморозить все слои кроме текущего.

----- добавлено через ~9 мин. -----
UPD
На вопрос 1 ответ нашел. Проблема в решетке в названии слоя.
RNB вне форума  
 
Старый 04.03.2015, 01:46
#2478
skkkk


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


Цитата:
Сообщение от RNB Посмотреть сообщение
программно выделить все объекты на одном слое
Выделить все объекты слоя указанного объекта:
1. Во всех пространствах:
Код:
[Выделить все]
(sssetfirst nil (ssget "_X" (list (assoc 8 (entget (car (entsel)))))))
2. В текущем пространстве:
Код:
[Выделить все]
(sssetfirst nil (ssget "_X" (list (assoc 8 (entget (car (entsel)))) (cons 410 (getvar "CTAB")))))
Выделить все объекты в текущем пространстве на слое по его имени (вместо "Имя слоя" вписать нужное имя):
Код:
[Выделить все]
(sssetfirst nil (ssget "_X" (list (cons 8 "Имя слоя") (cons 410 (getvar "CTAB")))))
Цитата:
Сообщение от RNB Посмотреть сообщение
как заморозить все слои кроме текущего
Как-то так:
Код:
[Выделить все]
 (defun C:LAYSFREESE ( / layer-list Table)
(vl-load-com)
	(defun Table (s / d r)
		(while (setq d (tblnext s (null d)))
			(setq r (append r (list (cdr (assoc 2 d)))))
		)
	)
	(setq layer-list (table "LAYER")
		  layer-list (vl-remove (getvar "CLAYER") layer-list)
	)
	(mapcar 
		'(lambda (x)
			(vla-put-Freeze 
				(vla-Item 
					(vla-get-Layers 
						(vla-get-ActiveDocument (vlax-get-acad-object))
					)
					x
				)
				1
			)
		 )
		 layer-list
	)
	(princ)
)
Функция Table найдена когда-то тут на форуме, опубликовал, если не ошибаюсь, Олег (jr.).

Последний раз редактировалось skkkk, 04.03.2015 в 02:17. Причина: (vl-load-com)
skkkk вне форума  
 
Старый 04.03.2015, 06:14
#2479
RNB

Проектирование мостов
 
Регистрация: 29.01.2014
Новосибирск
Сообщений: 431


Цитата:
Сообщение от skkkk Посмотреть сообщение
Выделить ...
Спасибо! Буду сидеть разбираться
RNB вне форума  
 
Старый 04.03.2015, 07:16
#2480
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


это ж надо было столько нагородить...

Код:
[Выделить все]
 (defun C:LAYSFREESE ( )
  ( (lambda (x)
     (setvar 'cmdecho 0)
     (command "_.-layer" "_f" "*" "")
     (setvar 'cmdecho x)
    )
    (getvar 'cmdecho)
  )
  (princ)
)
gomer вне форума  
Ответ
Вернуться   Форум 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