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

Вернуться   Форум 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.
Просмотров: 1971745
 
Непрочитано 16.02.2018, 14:22
#3461
VVA

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


Цитата:
Сообщение от Doctor_Che Посмотреть сообщение
Точно. У меня не каждый тип блока в своём слое, а каждый раздел. Но это как раз подошло.
Сделал фильтрацию (sget '((cons 0 "INSERT")(cons 8 "ЭО*,ЭМ*"))) - скорость выросла до реактивной.
Offtop: Даешь 1-ю космическую скорость
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.02.2018, 11:29
#3462
Browning Zed


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


Пытаюсь создать функцию цикла. Цикл должен запускать entsel, условие выхода из цикла - выбор таблицы. Написал следующую конструкцию:
Код:
[Выделить все]
   (while (not
	(setq tab1 (entsel "\nВыберите таблицу: "
	(ssget "X" '((0 . "ACAD_TABLE")))))
  ))
Но, разумеется, подобный код функции при запуске выдает ошибку (слишком много аргументов). Как поступить в данном случае?
Browning Zed вне форума  
 
Непрочитано 24.02.2018, 11:56
#3463
Кулик Алексей aka kpblc
Moderator

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


Со скобками запутался. Да и логика какая-то странная...
А если вообще ничего не выбрать? А если человеку надо "вотпрямщас" прекратить выполнение кода?
А так - на выбор:
Код:
[Выделить все]
 (defun t1 (/ ent)
  (while (and (not
                (vl-catch-all-error-p
                  (setq ent (vl-catch-all-apply
                              (function (lambda () (car (entsel "\nВыберите что-нибудь, кроме таблицы <Отмена> : "))))
                              ) ;_ end of vl-catch-all-apply
                        ) ;_ end of setq
                  ) ;_ end of vl-catch-all-error-p
                ) ;_ end of not
              ent
              (/= (cdr (assoc 0 (entget ent))) "ACAD_TABLE")
              ) ;_ end of and
    (alert (strcat "Выбран примитив \"" (cdr (assoc 0 (entget ent))) "\""))
    ) ;_ end of while
  ) ;_ end of defun

(defun t2 (/ ent)
  (while (setq ent (ssget "_+.:S:E" '((-4 . "<NOT") (0 . "ACAD_TABLE") (-4 . "NOT>"))))
    (setq ent (ssname ent 0))
    (alert (strcat "Выбран примитив \"" (cdr (assoc 0 (entget ent))) "\""))
    ) ;_ end of while
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.02.2018, 13:18
#3464
Browning Zed


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


Цитата:
логика какая-то странная...
Это логика чайника в лиспе.
Цитата:
А если вообще ничего не выбрать? А если человеку надо "вотпрямщас" прекратить выполнение кода?
Если ничего не выбрать - вновь запрашивается выбор, до тех пор, пока не будет выбрана таблица. Обрыв команды по клавише Esc.
Попытался вшить предложенную функцию в код, но не сработало. Может подскажешь куда копать? Суть такова:
1. нужно выбрать таблицу (строку в таблице), и, если выбор сделан =>
2. нужно выбрать мвыноску, и, если выбор сделан =>
3. в таблицу вставляется строка с текстом выноски и ее координатами
4. циклический возврат к пункту 1

На данный момент в пункте 1 и 2 выбираются любые объекты, а нужно, чтобы в п. 1 можно было выбрать только таблицу, а в п. 2 - только мвыноску.

Код:
[Выделить все]
 (defun C:ins-row-in-tabl (/ n table_obj max-num-row n-max temp-n D NUM NUM_ROW POINT_LIST T1 VINOSKA VLA_VINOSKA pik-point temp-list)
  (vla-StartUndoMark active_document)
  (while T
  (progn
  (while (not
	(setq temp-list (entsel "\nВыберите таблицу: "))))
  (while (not
	(setq vinoska(car (entsel "\nВыберите выноску: ")))))
  (setq table_obj (car temp-list))
  (setq pik-point (cadr temp-list))
  (if table_obj
    (progn
      (if (= (cdr (assoc 0 (entget table_obj)))"ACAD_TABLE")
	(if vinoska
	  (if (= (cdr (assoc 0 (entget vinoska)))"MULTILEADER")
	    (progn
	      (setq table_obj (vlax-ename->vla-object table_obj))
	      (setq max-num-row (vla-get-rows table_obj))
	      (setq n-max (atoi (vla-GetText table_obj (1- max-num-row) 0)))
	      (if (= :vlax-true(vla-HitTest table_obj (vlax-3d-point (trans pik-point 1 0)) (vlax-3d-point (trans (getvar "VIEWDIR") 1 0)) 'row 'col))
		(if (< row 2)(setq n 1)(setq n (1- row)))
		(progn
		  (initget 1)(setq n (getint (strcat "\nВ какую строку вставлять?(max="(itoa n-max)"): ")))
		  ))
	      (if (or (< (1+ n) max-num-row) (= (1+ n) max-num-row))
		(progn
		  (setq vla_vinoska(vlax-ename->vla-object vinoska))
		  (setq point_list (vlax-safearray->list(vlax-variant-value(vla-GetLeaderLineVertices vla_vinoska 0))))
		  (setq t1 (list (car point_list) (cadr point_list)))
		  (if (eq (vla-get-ContentBlockName vla_vinoska) "")
		    (setq d (vla-get-TextString vla_vinoska))
		    (setq d (strcat"т."(cadr(extract_302 (entget vinoska))))))
		  (vla-InsertRows table_obj (1+ n) 8 1)
		  (setq max-num-row (vla-get-rows table_obj))
		  (vla-SetText table_obj (1+ n) 0 (if (= n 1)"=1"(strcat "=A"(rtos (1+ n) 2 0)"+1")))
		  (vla-SetText table_obj (+ n 2) 0 (strcat "=A"(rtos (+ n 2) 2 0)"+1"))
		  (vla-SetCellAlignment table_obj (1+ n) 0 acMiddleCenter)
		  (vla-SetText table_obj (1+ n) 1 d)
		  (vla-SetCellAlignment table_obj (1+ n) 1 acMiddleLeft)
		  (vla-SetText table_obj (1+ n) 2 (rtos (nth 1 t1) 2 2))
		  (vla-SetCellAlignment table_obj (1+ n) 2 acMiddleCenter)
		  (vla-SetCellTextHeight table_obj (1+ n) 2 2.8)
		  (vla-SetText table_obj (1+ n) 3 (rtos (nth 0 t1) 2 2))
		  (vla-SetCellAlignment table_obj (1+ n) 3 acMiddleCenter)
		  (vla-SetCellTextHeight table_obj (1+ n) 3 2.8)
		  )
		(princ "\nОшибка! Недопустимый ввод!")
		)
	      )
	    (alert "Ошибка! Необходимо выбрать выноску.")
	    )
	  )
	(alert (strcat " Ошибка! Необходимо выбрать таблицу."))
	)
      )
    )
	));!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  (vla-EndUndoMark active_document)
  (princ)
  )
Browning Zed вне форума  
 
Непрочитано 24.02.2018, 13:38
#3465
Кулик Алексей aka kpblc
Moderator

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


Я бы делал ставку на фильтры selset - быстро, просто, предсказуемо
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.02.2018, 14:22
#3466
Browning Zed


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


OK. Вот пример из автодесковской справки About Selection Set Filter Lists:
Код:
[Выделить все]
 (ssget "X" (list (cons 0 "ACAD_TABLE")))
Но непонятно как этот фильтр правильно внедрить в код, чтобы он отработал.
Browning Zed вне форума  
 
Непрочитано 24.02.2018, 17:38
#3467
Кулик Алексей aka kpblc
Moderator

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


Я ж в t2 показал варианты выбора. В чем трудность?
И настоятельно все же рекомендую разобраться со скобками: код вообще непонятно как должен работать.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.02.2018, 17:52
#3468
Сергей812


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


Цитата:
Сообщение от Browning Zed Посмотреть сообщение
(ssget "X" (list (cons 0 "ACAD_TABLE")))
просто получите все таблицы в чертеже) а вот если напишете как
Код:
[Выделить все]
 (ssget (list(cons 0 "ACAD_TABLE")))
то он просто не даст включить в набор не таблицу.
Сергей812 вне форума  
 
Непрочитано 24.02.2018, 18:10
#3469
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Browning Zed Посмотреть сообщение
OK. Вот пример из автодесковской справки About Selection Set Filter Lists:
Код:
[Выделить все]
 (ssget "X" (list (cons 0 "ACAD_TABLE")))
Не обратил сразу внимания. Код не сработает в локализованной версии AutoCAD.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.02.2018, 18:14
#3470
Сергей812


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Код не сработает в локализованной версии AutoCAD.
а код и так лишен смысла - с алгоритмом:
Цитата:
Сообщение от Browning Zed Посмотреть сообщение
1. нужно выбрать таблицу (строку в таблице), и, если выбор сделан =>
2. нужно выбрать мвыноску, и, если выбор сделан =>
3. в таблицу вставляется строка с текстом выноски и ее координатами
4. циклический возврат к пункту 1
никак не пересекается. Не говоря уже о том, что постоянно прыгать от выноски в чертеже к таблице (таблицам) и обратно - мягко говоря, самый неудачный вариант в плане реализации, имхо.
Сергей812 вне форума  
 
Непрочитано 24.02.2018, 21:14
#3471
Browning Zed


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


На счет качества кода не скажу - код не мой. Я лишь пытаюсь допилить его под себя.
Цитата:
постоянно прыгать от выноски в чертеже к таблице (таблицам) и обратно
А вот в этом и фишка. Дело в том, что новая строка вставляется не вниз таблицы, а выше строки которую ты выбрал. При этом, в левой колонке идет нумерация строк, которая автоматически пересчитывается при вставке новой строки. Т.е., если нужно добавить новую строку между строками имеющими номера пунктов 1 и 2 - кликаем на вторую строку, она перемещается вниз, автоматом становится номером 3, а на ее место встает новая строка. В общем, так надо.

Кулик Алексей aka kpblc,
Цитата:
Я ж в t2 показал варианты выбора. В чем трудность?
Функция t2 работает следующим образом:
1. если выбран объект кроме таблицы (либо ничего не выбрано) - функция возвращает nil.
2. если выбрана таблица - цикл выбора продолжается.
Но это не то, что мне нужно. Попробую пояснить на примере.
В выражении:
Код:
[Выделить все]
 (setq X (entsel "\nВыберите таблицу: "))
переменной X в случае выбора любого объекта будет присваиваться его имя, в противном случае возвращается nil.
А нужно, чтобы переменной X была возможность присвоить только имя таблицы, в противном случае цикл выбора продолжается.

Последний раз редактировалось Browning Zed, 25.02.2018 в 15:01.
Browning Zed вне форума  
 
Непрочитано 25.02.2018, 17:53
#3472
VVA

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


Цитата:
Сообщение от Browning Zed Посмотреть сообщение
А нужно, чтобы переменной X была возможность присвоить только имя таблицы, в противном случае цикл выбора продолжается.
Код:
[Выделить все]
(setq X (mip-ssentget-by-type "Выбери таблицу" '("ACAD_TABLE") 0))
Недостающие функции здесь
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 25.02.2018, 19:27
#3473
Browning Zed


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


Спасибо, VVA. То, что нужно! Но есть один косяк. Эта функция работает, только, если в процессе выполнения кода нужно выбрать один тип объекта. В моем случае - сначала необходимо выбрать таблицу, а затем мультивыноску. Т.е., если в коде будут два выражения, типа:
Код:
[Выделить все]
 (setq X (mip-ssentget-by-type "Выбери таблицу" '("ACAD_TABLE") 0))
Код:
[Выделить все]
 (setq Y (mip-ssentget-by-type "Выбери выноску" '("MULTILEADER") 0))
на втором выражении функция выдаст ошибку (в моем случае, ошибка: неверный тип аргумента: 2D/3D-точка: nil).
Это можно как-то поправить?
Browning Zed вне форума  
 
Непрочитано 25.02.2018, 19:49
#3474
Кулик Алексей aka kpblc
Moderator

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


При выборе мультивыноски надо "кликать" не на аннотации, а на самой выноске. Кстати, выноски могут быть и стандартные.
И ты уверен, что именно функция mip-ssentget-by-type срабатывает неправильно?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.02.2018, 20:05
#3475
Browning Zed


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


Кулик Алексей aka kpblc,
Неважно куда кликать, на текст или линию выноски - функция прерывается с ошибкой.
Цитата:
И ты уверен, что именно функция mip-ssentget-by-type срабатывает неправильно?
Скорее всего, дело в ней. Потому как, если функцию прописать для одного типа объекта (только для таблицы, или только для выноски), она отрабатывает корректно. Но, если, функция задействуется для обоих типов - возникает ошибка.
Browning Zed вне форума  
 
Непрочитано 25.02.2018, 20:11
#3476
Кулик Алексей aka kpblc
Moderator

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


Ок, замени вызов на обычный ssget: (ssget '((0 . "ACAD_TABLE"))) и (ssget '((0 . "MULTILEADER"))) и посмотри, что будет в результате. Мне кажется, что проблема совершенно в другом месте.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.02.2018, 20:32
#3477
Сергей812


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


Цитата:
Сообщение от Browning Zed Посмотреть сообщение
Скорее всего, дело в ней. Потому как, если функцию прописать для одного типа объекта (только для таблицы, или только для выноски), она отрабатывает корректно. Но, если, функция задействуется для обоих типов - возникает ошибка.
используйте трассировку - редактор лиспа акадовский это позволяет. Чем гадать...
Сергей812 вне форума  
 
Непрочитано 25.02.2018, 21:49
#3478
VVA

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


Цитата:
Сообщение от Browning Zed Посмотреть сообщение
В моем случае - сначала необходимо выбрать таблицу, а затем мультивыноску.
Цитата:
Сообщение от Browning Zed Посмотреть сообщение
на втором выражении функция выдаст ошибку (в моем случае, ошибка: неверный тип аргумента: 2D/3D-точка: nil)
Не подтверждаю. Функции безразлично, какой тип примитива ты запрашиваешь.
Поэтому
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
используйте трассировку - редактор лиспа акадовский это позволяет
В редакторе лиспа в меню "Отладка" поставь чек-бокс на "Прервать на ошибке".
Запусти лисп.
После ошибки вернить в редактор и выбери "Отладка"->"Причина последнего останова" (Ctrl+F9) Перейдешт на строчку, в которой возникла ошибка
Клик правой кнопкой на переменной -> "Изучить"
Смотри что в ней содержится
Миниатюры
Нажмите на изображение для увеличения
Название: ssget.png
Просмотров: 25
Размер:	10.7 Кб
ID:	199546  Нажмите на изображение для увеличения
Название: vlisp.png
Просмотров: 30
Размер:	68.9 Кб
ID:	199547  
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 25.02.2018 в 21:56.
VVA вне форума  
 
Автор темы   Непрочитано 27.02.2018, 06:13
#3479
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,980
Отправить сообщение для Red Nova с помощью Skype™


Доброго. Нубовопрос.
После того как отработала переопределенная функция (*error* nil), разве не должен происходить выход из вычислений? Я наивно пологал что вызов error остановит вычисления на моменте где собственно и вызвать error . Но у меня в данном примере после (+ 1 1) отрабатывает error а после этого отрабатывает и (+ 2 2). Все так и должно быть?
Если все так и должно быть, то как грамотно обеспечить выход при error?

Код:
[Выделить все]
 (defun c:test ( / )
  (defun *error* ( msg )
    (princ  "\nError: Function cancelled")
    (princ)
    )

  (+ 1 1)
  (*error* nil)
  (+ 2 2)
  )
__________________
Блог
Red Nova вне форума  
 
Непрочитано 27.02.2018, 07:59
#3480
Кулик Алексей aka kpblc
Moderator

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


http://autolisp.ru/2009/09/13/error-catch/ ?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум 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