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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1551661
 
Непрочитано 29.01.2019, 13:41
#3721
nik120927


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


День добрый
как можно автоматический менять свойства точек цивела COGO а именно видимость метки
необходимо закрыть видимость
nik120927 вне форума  
 
Непрочитано 29.01.2019, 13:58
#3722
Кулик Алексей aka kpblc
Moderator

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


Дампить объект, смотреть его свойства и методы - и работать с ними.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.02.2019, 20:09
#3723
40in


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


Есть полилиния. Через getpoint ввожу 2 точки и через inters получаю точку пересечения с полилинией. В мировой системе координат все работает замечательно, но если я поменяю систему координат на пользовательскую то точки пересечения нет. Прога не работает.
Даже не представляю в каком направлении копать. Подскажите...
40in вне форума  
 
Непрочитано 15.02.2019, 00:22
1 | #3724
Сергей812


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


Цитата:
Сообщение от 40in Посмотреть сообщение
Даже не представляю в каком направлении копать. Подскажите...
копать в сторону хэлпа:
Цитата:
Return Values: A 3D point, expressed in terms of the current UCS.
пока работали в МСК, то ПСК (она же UCS) совпадала с МСК. Далее читайте про преобразования координат.
Сергей812 вне форума  
 
Непрочитано 04.03.2019, 23:22
#3725
gnuvse


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


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

Я хочу написать игру - тетрис, но я понимаю, что в лоб я ее не напишу, потому что многого не знаю.

Первым делом хочу научиться двигать какой-то объект стрелками, пожалуйста, подскажите в какую сторону мне копать, что прочитать.


Спасибо за ваши ответы и время.
gnuvse вне форума  
 
Непрочитано 05.03.2019, 00:39
#3726
Сергей812


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


Цитата:
Сообщение от gnuvse Посмотреть сообщение
Я хочу написать игру - тетрис
Именно на лиспе в акаде?)
grread - считывание клавиш управления "на ходу в цикле" в цикле.

А рабочее поле - вспомните китайские электронные игрушки-96 игр в одной: рабочее поле состоит из квадратиков - 20 шт в высоту и 10шт в ширину. Соответственно, делаете из тех же блоков такое поле (не забыв цвет блоков выставить - по блоку). И далее перекрашиваете блоки под цвет фона, если надо скрыть. И под рабочий цвет - чтобы показать. Самый трудоемкий - это вопрос алгоритма: пересчет матрицы 20х10 в такт движениям деталек, их смещениям и повороту. И временную задержку еще откуда взять в цикле - в лиспе ее вроде нет в явном виде.
Сергей812 вне форума  
 
Непрочитано 05.03.2019, 03:23
#3727
Massaraksh

Delphi, Assembler, PHP, VB, Lisp с 01.02.2019
 
Регистрация: 10.02.2019
Воронеж
Сообщений: 30


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А рабочее поле - вспомните китайские электронные игрушки-96 игр в одной: рабочее поле состоит из квадратиков - 20 шт в высоту и 10шт в ширину. Соответственно, делаете из тех же блоков такое поле (не забыв цвет блоков выставить - по блоку). И далее перекрашиваете блоки под цвет фона, если надо скрыть. И под рабочий цвет - чтобы показать.
Можно и по-другому: перемещать падающие блоки на 1 пиксель вниз с задержкой, скажем, 50 мс, тогда получится "плавный" тетрис.
А вообще, сначала ТС должен сам себе ответить на вопрос: "а как это вообще сделать?", не привязываясь к конкретному языку и системе.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
И временную задержку еще откуда взять в цикле - в лиспе ее вроде нет в явном виде.
Есть системная переменная "Millisecs"

----- добавлено через ~3 ч. -----
Хотя, не знаю, а вообще можно ли обновлять экран во время работы скрипта? У меня не получилось.
Massaraksh вне форума  
 
Непрочитано 05.03.2019, 08:02
#3728
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Massaraksh Посмотреть сообщение
можно ли обновлять экран во время работы скрипта?
redraw или vla-regen - по вкусу.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.03.2019, 08:30
#3729
gnuvse


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


Цитата:
Сообщение от Massaraksh Посмотреть сообщение
Можно и по-другому: перемещать падающие блоки на 1 пиксель вниз с задержкой, скажем, 50 мс, тогда получится "плавный" тетрис.
А вообще, сначала ТС должен сам себе ответить на вопрос: "а как это вообще сделать?", не привязываясь к конкретному языку и системе.

Есть системная переменная "Millisecs"

----- добавлено через ~3 ч. -----
Хотя, не знаю, а вообще можно ли обновлять экран во время работы скрипта? У меня не получилось.

Я попробую на бумажке прикинуть, как бы я это сделал.
Но наверняка на бумажке будет проще чем в коде.


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Именно на лиспе в акаде?)
grread - считывание клавиш управления "на ходу в цикле" в цикле.

А рабочее поле - вспомните китайские электронные игрушки-96 игр в одной: рабочее поле состоит из квадратиков - 20 шт в высоту и 10шт в ширину. Соответственно, делаете из тех же блоков такое поле (не забыв цвет блоков выставить - по блоку). И далее перекрашиваете блоки под цвет фона, если надо скрыть. И под рабочий цвет - чтобы показать. Самый трудоемкий - это вопрос алгоритма: пересчет матрицы 20х10 в такт движениям деталек, их смещениям и повороту. И временную задержку еще откуда взять в цикле - в лиспе ее вроде нет в явном виде.

Спасибо за наводку.
gnuvse вне форума  
 
Непрочитано 05.03.2019, 16:00
#3730
Massaraksh

Delphi, Assembler, PHP, VB, Lisp с 01.02.2019
 
Регистрация: 10.02.2019
Воронеж
Сообщений: 30


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
redraw или vla-regen - по вкусу.
В цикле не работает.
Например:
Код:
[Выделить все]
 (defun C:Tetris ( / )
 (vl-load-com)
 (setq Application (vlax-get-acad-object)
  ActiveDocument (vla-get-ActiveDocument Application)
  ModelSpace (vla-get-ModelSpace ActiveDocument))

  (entmakex '(  (0 . "LWPOLYLINE") (100 . "AcDbEntity") (8 . "0") (100 . "AcDbPolyline") (370 . 0) (90 . 2) (70 . 0) (43 . 10.0000000) (10 100.0000000 100.0000000 0.0) (10 100.0000000 110.0000000 0.0) ))
  (graphscr)
  (setq w 10.0)
  (setq ent (entlast))  
  (vla-ZoomAll Application)
  (setq aaa (getvar "millisecs"))
  (setq bbb (+ aaa 50))      
  (repeat 2000000
  (if (> (getvar "millisecs") bbb)
        (progn
	(setq w (+ w 0.1))
        (setq aaa (getvar "millisecs"))
        (setq bbb (+ aaa 50))
	(setq sss (cons 43 (float w)))
	(entmod (subst sss (assoc 43 (entget ent)) (entget ent)))
	(graphscr)
;	(command "_redraw")
	(vla-regen ActiveDocument 1)
	)  
  )
  
  )
  )
Massaraksh вне форума  
 
Непрочитано 05.03.2019, 16:35
| 1 #3731
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (defun c:tetris (/)
  (vl-load-com)
  (setq application    (vlax-get-acad-object)
        activedocument (vla-get-activedocument application)
        modelspace     (vla-get-modelspace activedocument)
        ) ;_ end of setq
  (entmakex '((0 . "LWPOLYLINE")
              (100 . "AcDbEntity")
              (8 . "0")
              (100 . "AcDbPolyline")
              (370 . 0)
              (90 . 2)
              (70 . 0)
              (43 . 10.)
              (10 100. 100. 0.0)
              (10 100. 110. 0.0)
              )
            ) ;_ end of entmakex
  (graphscr)
  (setq w 10.0)
  (setq ent (entlast))
  (vla-zoomall application)
  (setq aaa (getvar "millisecs"))
  (setq bbb (+ aaa 50))
  (repeat 2000000
    (if (> (getvar "millisecs") bbb)
      (progn (setq w (+ w 0.1))
             (setq aaa (getvar "millisecs"))
             (setq bbb (+ aaa 50))
             (setq sss (cons 43 (float w)))
             (entmod (subst sss (assoc 43 (entget ent)) (entget ent)))
             (graphscr)
             (entupd ent) ; вариант 1
             (redraw) ; вариант 2
             (vla-regen activedocument acactiveviewport) ; вариант 3
             ) ;_ end of progn
      ) ;_ end of if
    ) ;_ end of repeat
  ) ;_ end of defun
Без проверок.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.03.2019, 16:53
#3732
Massaraksh

Delphi, Assembler, PHP, VB, Lisp с 01.02.2019
 
Регистрация: 10.02.2019
Воронеж
Сообщений: 30


Да, так работает.
Код:
[Выделить все]
 (defun c:tetris (/)
	 (vl-load-com)
	 (setq application    (vlax-get-acad-object)
	       activedocument (vla-get-activedocument application)
	       modelspace     (vla-get-modelspace activedocument)
	       ) ;_ end of setq
	 (entmakex '((0 . "LWPOLYLINE")
	             (100 . "AcDbEntity")
	             (8 . "0")
	             (100 . "AcDbPolyline")
	             (370 . 0)
	             (90 . 2)
	             (70 . 0)
	             (43 . 10.)
	             (10 100. 100. 0.0)
	             (10 100. 110. 0.0)
	             )
	           ) ;_ end of entmakex
	 (graphscr)
	 (setq w 10.0)
	 (setq ent (entlast))
	 (vla-zoomall application)
	 (setq aaa (getvar "millisecs"))
	 (setq bbb (+ aaa 50))
	 (repeat 4000000
	   (if (> (getvar "millisecs") bbb)
	     (progn (setq w (+ w 0.1))
	            (setq aaa (getvar "millisecs"))
	            (setq bbb (+ aaa 50))
	            (setq sss (cons 43 (float w)))
	            (entmod (subst sss (assoc 43 (entget ent)) (entget ent)))
	            (graphscr)
	            (entupd ent) ;
	            (redraw) ;
;	            (vla-regen activedocument activeviewport) ;
	            ) ;_ end of progn
	     ) ;_ end of if
	   ) ;_ end of repeat
	 ) ;_ end of defun
Значит, ТС имеет все возможности добиться успеха.
Massaraksh вне форума  
 
Непрочитано 05.03.2019, 17:52
#3733
Сергей812


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


Offtop:
Цитата:
Сообщение от Massaraksh Посмотреть сообщение
А вообще, сначала ТС должен сам себе ответить на вопрос: "а как это вообще сделать?", не привязываясь к конкретному языку и системе.
как результат этого подхода - запихивать в акад коды лисп на выполнение вместо нормальной работы через COM-интерфейс?)


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
рабочее поле состоит из квадратиков - 20 шт в высоту и 10шт в ширину.
А вот логическую матрицу, в которой будет производиться анализ возможности сдвига элемента, совпадения всех элементов в ряде и т.п. лучше сделать с 3 лишними строками вверху. Эти строки не будут связаны с полем отображения - но в них будет сформировано логическое отображение очередного элемента перед началом его спуска вниз. Это для унификации кода движения элемента по вертикали.
Сергей812 вне форума  
 
Непрочитано 05.03.2019, 18:33
#3734
Massaraksh

Delphi, Assembler, PHP, VB, Lisp с 01.02.2019
 
Регистрация: 10.02.2019
Воронеж
Сообщений: 30


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
как результат этого подхода
Вообще-то, я озвучил обычный подход:
Сначала надо продумать алгоритм, и только потом заниматься его реализацией на конкретной платформе.
Massaraksh вне форума  
 
Непрочитано 05.03.2019, 18:49
#3735
Сергей812


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


Offtop:
Цитата:
Сообщение от Massaraksh Посмотреть сообщение
Сначала надо продумать алгоритм, и только потом заниматься его реализацией на конкретной платформе.
Платформа накладывает ограничения на реализуемость алгоритма как раз. Абстрактные алгоритмы на идеальной платформе интересны лишь теоретикам)
Сергей812 вне форума  
 
Непрочитано 15.03.2019, 23:23
#3736
vahes911


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


Комрады подскажите почему не работает конструкция:

Код:
[Выделить все]
 
(initget 3 ", .")
(setq razd (getkword "\nРазделитель [,/.]: "))
vahes911 вне форума  
 
Непрочитано 16.03.2019, 00:30
1 | #3737
Сергей812


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


Запятая не нравится getkword. Да и лучше так написать, имхо:
Код:
[Выделить все]
 
(initget 1 "Точка Запятая") 
(setq razd (getkword "\nРазделитель [Точка/Запятая]: "))
Вот реально охота разглядывать точку и запятую в комстроке/динвводе?)

p.s. 2-ой бит в initget нет смысла устанавливать, getkword его игнорирует.
Сергей812 вне форума  
 
Непрочитано 24.04.2019, 13:03
#3738
hroost

Проектирование
 
Регистрация: 01.09.2009
Сообщений: 16


Подскажите пожалуйста почему-то в последнее время программа перестала автоматически вставлять таблицу, приходится вставлять через Ctrl+V, кусок кода для вставки таблицы ниже:

Код:
[Выделить все]
 (vla-put-regeneratetablesuppressed vlaTab :vlax-true)
   (vla-put-Height vlaTab(* 1.75(/(length tLst)4)))
   (command "_scale" (entlast) "" '(0 0 0) 250)  ;;11/04/2019
   (princ "\n<<< Вставьте таблицу / >>> ")
   (command "_.copybase"(trans '(0 0 0)0 1)(entlast)"")
   (command "_.erase" (entlast)"")
   (command "_.pasteclip" pause)
   ;(command "_.-insert" pause)
   (setvar "DIMZIN" oZin)
   (setvar "OSMODE" oSnp)
   (setvar "CMDECHO" 1)
   (vla-EndUndoMark actDoc)
hroost вне форума  
 
Непрочитано 26.04.2019, 14:18
#3739
megabeton


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


Помогите разобраться с функцией trans

Хочу выделить объекты внутри контура полилинии.
Код ниже работает:
Код:
[Выделить все]
(defun C:вок ( / en pl n ss lst)
	(setq en (car (entsel "\nУкажите полилинию: ")))
	(if 
		(and 
			en 
			(wcmatch (cdr (assoc 0 (entget en))) "*POLYLINE")
		)
		(progn 
			(setq 
				pl	(vlax-ename->vla-object en) 
				n	0
			)
			(while 
				(<= n (vlax-curve-getEndParam pl))
				(setq
					lst (append lst (list (vlax-curve-getPointAtParam pl n)))
					n   (1+ n))
			)
			(lib:Zoom2Lst lst)
			(setq lst (mapcar '(lambda(x)(trans x 0 1)) lst))
			(if 
				(setq ss (ssget "_WP" lst))
				(SSSETFIRST ss ss)
			)
			(setq ss nil)
		)
	)
	(princ)
)

Пытаюсь докрутить код, чтобы выделить объекты внутри полилинии, которая принадлежит блоку
Код:
[Выделить все]
(defun C:вок3 ( / en pl n ss lst)
	(setq en (vlax-vla-object->ename (car (vl-remove-if-not (function (lambda (x) (= (vla-get-objectname x) "AcDbPolyline"))) ((lambda  (/ res) (vlax-for sub (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (vla-get-effectivename (vlax-ename->vla-object (car (entsel))))) (setq res (cons sub res))) (reverse res)))))))
	(if 
		(and 
			en 
			(wcmatch (cdr (assoc 0 (entget en))) "*POLYLINE")
		)
		(progn 
			(setq 
				pl	(vlax-ename->vla-object en) 
				n	0
			)
			(while 
				(<= n (vlax-curve-getEndParam pl))
				(setq
					lst (append lst (list (vlax-curve-getPointAtParam pl n)))
					n   (1+ n))
			)
			(setq lst (mapcar '(lambda(x)(trans x 0 1)) lst))
			(if 
				(setq ss (ssget "_WP" lst))
				(SSSETFIRST ss ss)
			)
			(setq ss nil)
		)
	)
	(princ)
)

но тут затык.
Имя полилинии из блока вытащил, координаты вершин полилинии получил, но при их преобразовании что то идет не так.
Код работает, объекты выделяет, но только вот область выделения объектов лежит далеко за пределами полилинии / блока

Когда полилинии сама по себе, то преобразование координат из мировой в текущую происходит корректно
Код:
[Выделить все]
(setq lst (mapcar '(lambda(x)(trans x 0 1)) lst))
А вот при полилинии принадлежащей блоку, координаты сбиваются.
Похоже, что берутся координаты границ блока ("местные" с нулем, совпадающим с базовой точкой блока) и далее код применяет "местные" координаты к текущим (или мировым). Выделение происходит около начала координат.
Я так понимаю необходимо совершить дополнительное преобразование координат блока в текущие координаты. Но как это сделать. Подскажите.

----- добавлено через ~16 мин. -----
Кажется понял, нужно к каждой "местной" координате полилинии прибавить координату базовой точки блока.
megabeton вне форума  
 
Непрочитано 14.06.2019, 09:05
#3740
T.Bagdat


 
Регистрация: 21.03.2013
Самара
Сообщений: 28


Подскажите, можно ли с помощью лиспа подсветить не всю полилинию, а отдельный сегмент, на манер стандартной команды Сопряжение?
Пробовал рисовать поверх сегмента отрезок, и подсвечивать его. Но когда линия не сплошная, а с условными обозначениями, и включена генерация типа линий, то выглядит очень коряво.
T.Bagdat вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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