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

Вернуться   Форум 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.
Просмотров: 2049592
 
Старый 22.09.2011, 10:55
#1621
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


TararykovDG, спасибо. Работает. НО, это я знаю что после изменения нужно будет дать данную команду. А если этого не будет знать тот что загрузит данный код?
Ubivec81 вне форума  
 
Старый 22.09.2011, 11:14
#1622
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Ему надо будет об этом сказать.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Старый 22.09.2011, 17:39
#1623
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Ubivec81, наверное забыл про command.
Код:
[Выделить все]
 (command "_regen")
А с vla-Regen еще не сталкивался.
Код:
[Выделить все]
 (vla-Regen
  (vla-get-activedocument
    (vlax-get-acad-object)
    )
  0
  )

Последний раз редактировалось Oliver_88, 22.09.2011 в 17:39. Причина: опечатка
Oliver_88 вне форума  
 
Старый 22.09.2011, 21:42
#1624
Кулик Алексей aka kpblc
Moderator

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


vla-regen получает 2 аргумента: указатель на обрабатываемый документ и "чего обновлять": acAllViewports | acactiveviewport и чего-то там еще. Короче, в справке надо посмотреть...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 23.09.2011, 07:55
#1625
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


Я наверное не правильно вопрос сформулировал. Пользователь померил площади, создалась таблица и эти площади все попали в нее. Далее вычисляются объемы в зависимости от расстояний. Так вот пользователь может и БУДЕТ изменять эти расстояния но уже после того как код будет выполнен. А эти объемы формируют вторую таблицу. Вот и получается при изменении расстояний в первой таблице значения объемов меняются, а во второй меняются только после регенерации. Но чует мое слабое сердце что вариант только ручками заставить его это делать.
Ubivec81 вне форума  
 
Старый 23.09.2011, 08:14
#1626
TararykovDG

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


Цитата:
Сообщение от Ubivec81 Посмотреть сообщение
Но чует мое слабое сердце что вариант только ручками заставить его это делать.
Моё скромное мнение, что лучше именно так и делать, хотя есть варианты обновления полей (а в данном случае к этому всё и сводиться) с помощью реакторов. Здесь это обсуждалось Как автоматически обновлять поля блока
Ubivec81 в Твое случае можно сделать так
Код:
[Выделить все]
 
; Функция действия
(defun commandEnded(reac data / ) ; конец какой-то комады ACad
  (if (= (car data) "TABLEDIT") ; если это была команда редактирования таблицы
    ; посылаем в ком. строку AutoCAD'а команду обновления полей
    ; "_.updatefield _all  " - здесь обязательно должно быть так "_.updatefield<пробел>_all<пробел><пробел>"
    (vla-SendCommand (vla-get-activedocument (vlax-get-acad-object)) "_.updatefield _all  ")
    )
)


; Создаем реактор
(setq Cmnd_Reac (vlr-command-reactor "Реактор команд: "
          (list '(:VLR-commandEnded . commandEnded))
          )
      )
P.S. Это лисп нужно добавить в автозагрузку.
__________________
cadtools

Последний раз редактировалось TararykovDG, 23.09.2011 в 08:43.
TararykovDG вне форума  
 
Старый 23.09.2011, 10:03
1 | #1627
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
; "_.updatefield _all* " - здесь обязательно должно быть так "_.updatefield<пробел>_all<пробел><пробел>"
Я заключительный Enter в Sendcommand делаю не пробелом, а "\n" (так же срабатывает). Зато в редакторе удобней, виден конец команды.
Код:
[Выделить все]
(vla-SendCommand (vla-get-activedocument (vlax-get-acad-object)) "_.updatefield _all \n")
Цитата:
Так вот пользователь может и БУДЕТ изменять эти расстояния но уже после того как код будет выполнен
Пользователя лучше всего все-же просветить насчет полей, и методов их обновления и системной переменной FIELDEVAL.
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 23.09.2011 в 10:11.
VVA вне форума  
 
Старый 23.09.2011, 13:40
#1628
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


TararykovDG, спасибо помог твой код. Правда я не особо понял как это работает, вернее не знаю как с data это получается.
Прошу помочь вот в чем.
В таблице несколько столбцов (на различных километрах в моей таблице) в которых нужно сложить определенные строки которые записать в отдельную строку. И так надо пройти по всем столбцам.
У меня получается вот такой цикл:
Код:
[Выделить все]
 (setq u 4)
  (repeat (- km 1)
	(vla-settext tabl  20 u (rtos(+(atof(vla-gettext tabl 9 u)) (atof(vla-gettext tabl 10 u))(atof(vla-gettext tabl 15 u))(atof(vla-gettext tabl 16 u))(atof(vla-gettext tabl 17 u)))2 2) )
    	(setq u (+ u 1))
  )
Считает это все правильно, вот только нужно поставить сюда формулы чтоб при изменении каких либо данных изменялась и эта величина. А вот так эти формулы записать я не пойму. Вернее не пойму как перебираться с A на B потом на C и т.д.
Ubivec81 вне форума  
 
Старый 23.09.2011, 13:58
#1629
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Ubivec81 Посмотреть сообщение
Вернее не пойму как перебираться с A на B потом на C и т.д.
vla-get-Rows
vla-get-columns
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Старый 23.09.2011, 14:11
#1630
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


Цитата:
Сообщение от VVA Посмотреть сообщение
vla-get-Rows
vla-get-columns
vla-get-Rows возвращает количество строк
vla-get-columns колличество столбцов
как эти функции использовать в формуле?
Формула то выглядит как =(А1+А3+А7+А10) а в следующей колонке =(В1+В3+В7+В10)
Как вставить числа и запустить это в цикле я понял а вот как БУКВУ в цикле менять?
Думал что есть функция которая возвращает положение ячейки типа (VLA-get.... 1 1) (положение ячейки строка 1 столбец 1 = А1) но ничего не нашел в хелпе! или плохо искал?

Последний раз редактировалось Ubivec81, 23.09.2011 в 15:43.
Ubivec81 вне форума  
 
Старый 24.09.2011, 21:22
#1631
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Ubivec81 Посмотреть сообщение
Как вставить числа и запустить это в цикле я понял а вот как БУКВУ в цикле менять?
На выбор
Код:
[Выделить все]
(defun Alpha2Number (Str$ / Num#)
;-------------------------------------------------------------------------------
; Alpha2Number - Converts Alpha string into Number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Str$ = String to convert
; Syntax example: (Alpha2Number "ABC") = 731
;-------------------------------------------------------------------------------
  (if (= 0 (setq Num# (strlen Str$)))
    0
    (+ (* (- (ascii (strcase (substr Str$ 1 1))) 64) (expt 26 (1- Num#)))
       (Alpha2Number (substr Str$ 2))
    );+
  );if
);defun Alpha2Number

(defun Number2Alpha (Num# / Val#)
;-------------------------------------------------------------------------------
; Number2Alpha - Converts Number into Alpha string
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Num# = Number to convert
; Syntax example: (Number2Alpha 731) = "ABC"
;-------------------------------------------------------------------------------
  (if (< Num# 27)
    (chr (+ 64 Num#))
    (if (= 0 (setq Val# (rem Num# 26)))
      (strcat (Number2Alpha (1- (/ Num# 26))) "Z")
      (strcat (Number2Alpha (/ Num# 26)) (chr (+ 64 Val#)))
    );if
  );if
);defun Number2Alpha

Код:
[Выделить все]
(defun ColLetter  (N			;Integer
		   /
		   Res			;resulting string
		   TMP			;work variable
		   )
;;---------------------------------------------------------------------
;; From the Wizards Utilities...
;;---------------------------------------------------------------------
;; ColLetter - Given a number, returns a string that is the Excel
;; method of numbering columns.
;; 1="A", 2="B", ... 26="Z", 27="AA", 28 = "AB" ...
;;
		   
  (setq Res "")
  (while (> N 0)
    (setq TMP (rem N 26)		;remainder of N divided by 26
	  TMP (if (zerop TMP)		;reset to "Z"
		(setq N	  (1- N)	;move under next order
		      TMP 26		;set to Z offset value
		      )
		TMP)			;use value as it is
	  Res (strcat			;Add character
		(chr (+ 64 TMP))	;Offset plus 64 ("A" = 65)
		Res)			;existing string
	  N   (/ N 26)			;shift down an order
	  )
    )
  Res
  )

Код:
[Выделить все]
;;;--- Function to convert an Excel column letter to a number
;;;    Not used in this program but didn't want to dismiss code
;;;
;;;--- Parameters:
;;;
;;;       a = alpha Column name  Ex. "A" or "AB"
;;;
;;;--- Returns:
;;;
;;;       Column number as integer
;;;
;;;
;;;--- Limitations
;;;
;;;      Works from "A" to "ZZ" or 702 columns

(defun C2N(a)
  (if(= 1 (strlen a))
    (setq column (- (ascii a) 64))
  )  
  (if(= (strlen a) 2)
    (progn
      (setq b(substr a 1 1))
      (setq c(substr a 2 1))
      (setq column(- (ascii c) 64))
      (setq column(+ column(* 26 (- (ascii b) 64))))
    )
  )  
  column
)  
;;;--- Function to convert a column number to an excel column letter
;;;
;;;--- Parameters:
;;;
;;;       a = Column number as integer
;;;
;;;--- Returns:
;;;
;;;       Column name as in Excel  Ex. "A" or "AB"
;;;
;;;
;;;--- Limitations
;;;
;;;      Works from 1 to 702

(defun N2C(a)
  (if(< a 27)
    (setq column (chr (+ a 64)))
    (setq column
      (strcat
        (if(= 91 (+ 64(fix(/ a 26.001))))
           "Z"
           (chr(+ 64(fix(/ a 26.001))))
        )  
        (if(= 64 (+ 64(- a(* 26(fix(/ a 26))))))
          "Z"
          (chr(+ 64(- a(* 26(fix(/ a 26))))))
        )
      )
    )
  )  
  column
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Старый 26.09.2011, 12:18
#1632
baaba

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


Беру широко известную программу на автолисп. Я вижу что после загрузки программы вспомогательные функции остаются в памяти:
Код:
[Выделить все]
Command: (load "quickdraw")
Type in command line:
QR - QUICKDRAW with restore setting
Q - only QUICKDRAW"\nQ - only QUICKDRAW"
Command: !qmake_cmd
#<SUBR @04f1ba50 QMAKE_CMD>
как бы это сделал я:
 
; файл программы:
(defun c:quickdraw ()
(load quickdraw_fun_lib.lsp)
(...)
)
(defun c:q ()
(load quickdraw_fun_lib.lsp)
(...)
)
; и так далее

quickdraw_fun_lib.lsp - содержит определения всех необходимых функций (qmake_cmd и т. д.).
В результате в памяти только функции c:quickdraw с:q, и т. д. Функций типа qmake_cmd, не нужных конечному пользователю, в памяти нет. Память используется экономно. Или я неправильно понимаю механизм расходования памяти? Может быть не париться: просто определить все функции а затем комманды, в одном текстовом файле. То есть и в том и в ином случае функции вроде qmake_cmd, назовём их функции ненужные пользователю, одинаково будут расходовать память. Просто в случае когда они вынесены в отдельный текстовый файл и загружаются внутри функций c:q c:quickdraw и т. д., ими не может воспользоваться конечный пользователь (но они ему в общем-то и не нужны), они скрыты от него.

То есть, видны или не видны функции (!имя_функции равно не nil значит функция видна пользователю), влияет ли это на расход памяти?

Последний раз редактировалось baaba, 26.09.2011 в 13:16.
baaba вне форума  
 
Старый 26.09.2011, 12:55
#1633
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


VVA, спасибо! почему то не вспомнились функции ascii и chr. Наверное потому что никогда до этого их не использовал.
Ubivec81 вне форума  
 
Старый 26.09.2011, 13:24
#1634
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от baaba Посмотреть сообщение
В результате в памяти только функции c:quickdraw с:q, и т. д.
Ошибаешься.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 26.09.2011, 14:46
#1635
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Дополню Алексея
Цитата:
В результате в памяти только функции c:quickdraw с:q, и т. д.
До первого вызова команды quickdraw.
Тогда уж лучше повесь на кнопку код
Код:
[Выделить все]
(if (null c:quickdraw)(load "quickdraw.lsp"));quickdraw;
Тогда если пользователь не пользуется, то код и не грузится
Цитата:
Сообщение от baaba Посмотреть сообщение
влияет ли это на расход памяти?
Не парься
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Старый 26.09.2011, 16:39
#1636
dirge


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


Ребята, всем привет! Не хватает хорошей функции SelSim, сам я работаю в 2009 64bit, под 64 бита её просто нету, а иногда очень хочется выделять подобные объекты по нужным состояниям. Уже вообщем-то привык и Quick Select, но SelSim'ом быстрее бывает. Есть ли близкая LISP альтернатива к SelSim?
dirge вне форума  
 
Старый 26.09.2011, 22:32
#1637
це ментовозик

Водопровод-канализация
 
Регистрация: 26.09.2011
Минск
Сообщений: 8


Добрый день! Подскажите, пожалуйста, каким образом отредактировать готовую команду акада... К примеру _mirror... чтобы не было последнего запроса (удалять ли исходные объекты), а чтобы они сразу удалялись...
Пытался писать что-то вроде:
(command _mirror pause pause pause pause "_y") ; здесь можно улыбнуться, но я только начинаю в этом всём разбираться...
...получилось, только выбрать можно всего один объект и не работает рамка выбора... если напряжно писать лисп, то может быть подскажете направление в котором работать?) пасип!
це ментовозик вне форума  
 
Старый 26.09.2011, 22:40
#1638
Кулик Алексей aka kpblc
Moderator

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


По-быстрому и не очень красиво:
Код:
[Выделить все]
 (vl-load-com)

(defun c:mirr (/ adoc selset pt1 pt2)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (if (and (= (type (setq selset (vl-catch-all-apply
                                   (function
                                     (lambda ()
                                       (ssget "_:L")
                                       ) ;_ end of lambda
                                     ) ;_ end of function
                                   ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'pickset
              ) ;_ end of =
           (= (type (setq pt1 (vl-catch-all-apply
                                (function (lambda () (getpoint "\nУкажите первую точку оси отражения <Отмена> : ")))
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'list
              ) ;_ end of =
           (= (type
                (setq pt2 (vl-catch-all-apply
                            (function (lambda () (getpoint pt1 "\nУкажите вторую точку оси отражения <Отмена> : ")))
                            ) ;_ end of vl-catch-all-apply
                      ) ;_ end of setq
                ) ;_ end of type
              'list
              ) ;_ end of =
           ) ;_ end of and
    (command "_.mirror" selset "" "_none" pt1 "_none" pt2 "_y")
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 26.09.2011, 23:23
#1639
це ментовозик

Водопровод-канализация
 
Регистрация: 26.09.2011
Минск
Сообщений: 8


оуууу... оочень оперативно! огромное спасибо! буду разбираться...
це ментовозик вне форума  
 
Старый 27.09.2011, 00:00
#1640
Кулик Алексей aka kpblc
Moderator

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


Если убрать все проверки на ошибки, то алгоритм очень прост: сначала запрашиваем у пользователя набор примитивов, игнорируя объекты на заблокированных слоях. Потом запрос первой и второй точек отражения. И команду на запуск: _.mirror, в качестве первого параметра подставляем полученный набор примитивов, заканчиваем выбор ENter'ом (пустая строка), подставляем первую точку с временным отключением привяззок и вторую точку - тоже не забыв про привязки.
__________________
Моя библиотека 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