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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1965708
 
Непрочитано 30.03.2011, 15:15
#1381
Лиспер


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


(if (wcmatch a "[0-9]*")
(setq a (atof a))
)
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 30.03.2011, 15:41
#1382
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Почитайте тему
{Конкурс} Lisp. Пребразование в число при возможности
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 30.03.2011, 16:22
#1383
baaba

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


Лиспер, Тарарыков, спасибо!! Оба варианта нравятся!
Написал небольшой лисп для изменения dxf кода группы примитивов, может кому пригодится, выкладываю:
Код:
[Выделить все]
 (defun chdxf (en co vo)
	(entmod (subst (cons co vo) (assoc co en) en))
)
(defun mch (nlst n co vo)
	(if (<= 0 n)
		(progn
			(chdxf (entget (ssname nlst n)) co vo)
			(mch nlst (1- n) co vo)
		)
		(princ)
	)
)
(defun c:chdxf (/ co vo nlst)
	(setq
		co (atoi (getstring "\nEnter DXF code to change:"))
		vo  (getstring T "\nEnter new value to change:")
		nlst (ssget)
	)
	(if (wcmatch vo "[0-9]*") (setq vo (atof vo)))
	(mch nlst (1- (sslength nlst)) co vo)
)
baaba вне форума  
 
Непрочитано 30.03.2011, 16:33
#1384
Лиспер


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


entupd забыл - это раз; вместо (atoi (getstring <...>)) можно использовать (getint) - это два; на форуме были функции по изменению DXF-кодов - это три
В частности: а что будет, если я захочу поменять, например, 100 группу? Или -1? Или 5? Или 330? А что будет, если для примитива с цветом "ПоСлою" (группа 62) я захочу поменять цвет на 1?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 30.03.2011, 16:51
#1385
baaba

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
entupd забыл - это раз; вместо (atoi (getstring <...>)) можно использовать (getint) - это два; на форуме были функции по изменению DXF-кодов - это три
В частности: а что будет, если я захочу поменять, например, 100 группу? Или -1? Или 5? Или 330? А что будет, если для примитива с цветом "ПоСлою" (группа 62) я захочу поменять цвет на 1?
Я так и не понял зачем нужен entupd? За getint спасибо! Что за функции то? Где про код 62 писали? У меня естественно не получается -(
Плииз, ссылку на тред!! И можно-ли по-быстрому прикрутить меню на DSL?

Последний раз редактировалось baaba, 30.03.2011 в 17:01.
baaba вне форума  
 
Непрочитано 30.03.2011, 19:06
#1386
gomer

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


Цитата:
Сообщение от baaba Посмотреть сообщение
Написал небольшой лисп для изменения dxf кода группы примитивов,
А окно свойств у вас всегда скрыто?
gomer вне форума  
 
Непрочитано 30.03.2011, 19:55
#1387
Fynjy87


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


Здравствуйте!

Столкнулся с такой ситуацией. Мне нужно обрезать линии, выходящие за прямоугольную область (высотой H и длиной L). Если делаю это через лисп
Код:
[Выделить все]
 (setq x 1
      y H
      x1 0
      y1 (+ 1 H)
      x2 (+ 1 L)
      y2 (+ 1  H)
      x3 (+ 1 L)
      y3 0 )
(command "_trim"
	 (list x y)
	 ""
	 "Л"
	 (list x1 y1)
	 (list x2 y2)
	 (list x3 y3)
	 ""
	 "")
То при включенной объектной привязке точки линии выделения объектов приснапыватся к границам области, и команда выполняется с ошибкой.
Когда вводишь те же самые команды по очереди просто в командной строке, точки ввода остаются на своих местах. Почему такой косяк, и как от него избавиться?

Или как отключить в лиспе привязку так, чтобы не сбрасывались пользовательские режимы привязки?
Fynjy87 вне форума  
 
Непрочитано 30.03.2011, 20:20
1 | #1388
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от Fynjy87 Посмотреть сообщение
Или как отключить в лиспе привязку так, чтобы не сбрасывались пользовательские режимы привязки?
Код:
[Выделить все]
 
(setq old_value (getvar 'osmode)) ; запомнил текущий режим привязки
(setvar 'osmode 0) ; отключил привязки
... ; здесь Твой код
(setvar 'osmode old_value) ; восстановил привязки
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 31.03.2011, 06:40
#1389
lastloch


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


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
А Вы пробовали выключить и снова включить
Метод хорош, но пользователь, иногда, не дождавшись окончания исполнения кода, нажимает ESC и привязки остаются отключенными....
lastloch вне форума  
 
Непрочитано 31.03.2011, 08:17
#1390
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от lastloch Посмотреть сообщение
иногда, не дождавшись окончания исполнения кода, нажимает ESC
Вполне нормальная реакция для пользователя автокада - завершать команды нажатием Enter или Esc. Вот если б по Alt+F4 - это уже ненормально
Поэтому, нужно и такие ситуации обработать. Если интересно как - поиск по форуму по словам "отлов ошибок".
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 31.03.2011, 08:26 отключение привязок
#1391
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от lastloch Посмотреть сообщение
Метод хорош, но пользователь, иногда, не дождавшись окончания исполнения кода, нажимает ESC и привязки остаются отключенными....
Не буду давать 58 перессылающихся друг на друга ссылок, попробую чуть-чуть подытожить:
  1. Не использовать командные методы:
    1. на самом деле entmake или enmakex не такие уж и страшные, надо только немного разобраться с DXF форматом, благо на всё это есть справка.

    2. Или с помощью ActivX методы Add..., там вообще всё просто, как слышится так и пишется, но справки как таковой по ActiveX в Visual Lisp нет, но зато есть по VBA и есть статья Четыре правила для работы с ActiveX в Visual Lisp в которой доходчиво объясняется как пользоваться справкой по VBA при работе с ActiveX

  2. Использовать Command, луче уж тогда vl-cmdf
    1. Самый простой и в принципе надёжный, ставить "_none" перед вводом координат
      Код:
      [Выделить все]
      (Vl-Cmdf "_trim"  "_none" (list x y) "" "Л" "_none" (list x1 y1) "_none" (list x2 y2) "_none" (list x3 y3) "" "")
    2. Чтобы много и каждый раз не писать "_none", можно отключать через системную переменную osmode, но возникает проблема с восстановлением привязок, если пользователь посреди программы нажмёт Esc. Тут уже надо бороться с Esc:
      1. Переопределение функции *error*, тогда по нажатию Esc, наша программа оборвётся там где её прервали, но у нас останется возможность, восстановить всё как было.

      2. Помещать все опасные моменты кода в функцию vl-catch-all-apply, при нажатии Esc ход выполнения программы не прервётся, и например, после анализа сбоя, можно продолжить работу программы дальше.
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 31.03.2011, 08:30
#1392
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


lastloch, хотя Do$, уже ответил я все-таки добавлю.
Во-первых, Вы процетировали не моё сообщение, а мою подпись, поэтому Ваше сообщение выглядит не много неоднозначно.
Во-вторых, вопрос Fynjy87, не касался обработчика ошибок и отлова нажатия Esc. А для этого есть функции vl-catch-all-error-p и vl-catch-all-apply, с помощью которых все это обрабатывается и все пользовательские настроки (в том числе и режим привязок) восстанавливается после завершения работы программы!

P.S. Пока писал сообщение Disney уже все для всех разжевал
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 31.03.2011, 08:51
#1393
Лиспер


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


http://autolisp.ru/2009/09/22/programming-style/
http://autolisp.ru/2009/09/13/error-catch/
http://autolisp.ru/2009/09/20/howto_undo/
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 31.03.2011, 19:29
#1394
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Добавлю еще к постам #1391-#1393
Все это уже обсуждалось почти в самом начале темы и касалось использования command
1. Правило
2. Osmode
3. *Error*
4. Помимо сброса OSMODE в 0, привязку можно отключать (аналог F3)
disable_osmode
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 31.03.2011, 21:06
#1395
Fynjy87


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


Спасибо всем за ответы!

Очень много полезной и интересной информации. Потихоньку все читаю. Особенно то, что на русском (с английским проблемы).

Цитата:
Сообщение от VVA Посмотреть сообщение
4. Помимо сброса OSMODE в 0, привязку можно отключать (аналог F3)
disable_osmode
Вот, это идеальный вариант для меня на данный момент по соотношению простота/качество.

Цитата:
Сообщение от Disney Посмотреть сообщение
на самом деле entmake или enmakex не такие уж и страшные, надо только немного разобраться с DXF форматом, благо на всё это есть справка.
Согласен, что они нестрашные, и использую их для создания объектов. Но разве можно с их помощью осуществить подрезку?
Fynjy87 вне форума  
 
Непрочитано 01.04.2011, 08:22
#1396
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Подрезку можно осуществить с помощью функций модификаций объектов, например entmod.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 11.04.2011, 17:12
#1397
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


День добрый!

Решил не создавать новую тему. а спросить тут.

Вопрос о различии между взрывом блока с маскировкой внутри при помощи _burst в Express и (vla-explode ent).
А различие во в чем:

если взорвать при помощи (vla-explode ent), то маска может закрыть видимую часть блока после взрыва. Команда _burst взрыввает все корректно - маска находится там, где была поставлена при определении (создании) блока.

Пока лишь один вариант напрашивается - ставить маску после разбиения блока "под" остальными объекты блока при помощи _draworder.
Frigate вне форума  
 
Непрочитано 11.04.2011, 18:00
#1398
Кулик Алексей aka kpblc
Moderator

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


Это дело определяется порядком создания примитивов. ИМХО желательно поменять именно его, не прибегая к _.draworder.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.04.2011, 18:04
#1399
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Спасибо , Алексей!

А я то был уверен, что создал примитивы в блоке в правильном порядке )))
Срочно нужно переделать, пока этот неправильный блок не расплодился )))
Frigate вне форума  
 
Непрочитано 13.04.2011, 10:15
#1400
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Прошу помочь разобраться.

Как сделать в моем выражении, чтобы вместо строковых значений переменных, в них были бы вещественные? Что нужно вместо setq y?

Код:
[Выделить все]
(setq a "355,6" b "320.4" c "10,8" d "22.14")
(foreach x (list a b c d) (setq y (distof (vl-string-subst "." "," x) 2)))
или как то приблизительно так
Код:
[Выделить все]
(foreach x (setq y (list a b c d)) (apply 'append y (distof (vl-string-subst "." "," x) 2)))
Пока не докумекаю как это сделать правильно

По одному переводить проблемы нет, но хотелось бы все скопом
alex8888 вне форума  
Ответ
Вернуться   Форум 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