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

Вернуться   Форум 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.
Просмотров: 1972505
 
Непрочитано 15.02.2023, 12:14
#4361
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Shox Посмотреть сообщение
(command "_.shell" "python convert.py")
Попробуй заменить command на command-s или vl-cmdf
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.02.2023, 12:30
#4362
Shox


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


Цитата:
Сообщение от koMon Посмотреть сообщение
(vl-directory-files "c:\\folder")
Лисп будет работать с файлами из разных директорий, предусмотреть абсолютный путь невозможно.
Помогла бы функция для определения директории в который сохранен чертеж, но я такую не нашел.

----- добавлено через ~13 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Попробуй заменить command на command-s или vl-cmdf
Все 3 варианта рабочие (command, command-s, vl-cmdf), но только если чертеж был запущен в нужной директории, а вот если он первый раз сохранен, то рабочая папка не определяется.
Shox вне форума  
 
Непрочитано 15.02.2023, 13:02
#4363
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Shox Посмотреть сообщение
Помогла бы функция для определения директории в который сохранен чертеж, но я такую не нашел.
(getvar "dwgprefix")
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.02.2023, 15:44
#4364
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 108


Как указать команде "_.offset" чтобы она сделала подобие замкнутого контура во внутрь (т.е. без указания это мышкой) ?
т.е. если pnt - это точка ВНУТРИ замкнутого контура, то offset это выполняет:

(command "_.offset" 10 (car (entsel)) "_NONE" pnt "")

Осталось понять каким образом найти координаты точки, которая находится внутри любого замкнутого контура....

upd: задача решена с помощью готового лиспа

Код:
[Выделить все]
 
;|
OffsetInOrOut.lsp [command names:  OffIn & OffOut]
To Offset selected objects all by same User-specified distance, all either Inward
  or Outward, regardless of drawn direction.
OffIn = Offset Inward; OffOut = Offset Outward.
Works on Arcs/Circles/Ellipses/planar Splines/LW or "heavy" 2D Polylines.
  [cannot Offset 3D Polylines or non-planar Splines].  Polylines/Splines/
  Ellipses can be open/partial or closed/full.
Offsets in direction that results in entity of [in OffIn] smaller or [in OffOut]
  larger area than original.
In OffIn, detects objects too small to be Offset Inward by specified distance,
  and reports how many there were.
Can have unintended result with Polyline/Spline if self-intersecting or of other
  shape that results in more than one new entity when Offset.
Works in any UCS.
Remembers User's distance independent of regular Offset's, and offers as
  default on subsequent use; on first use, offers regular Offset's if not Through.
Kent Cooper, 1 August 2018
|;
(defun OIO ; = Offset object(s) Inward or Outward [called by OffIn & OffOut]
  (subpr / *error* doc ss nogo n ent obj oarea)
  (defun *error* (errmsg)
    (if (not (wcmatch errmsg "Function cancelled,quit / exit abort,console break"))
      (princ (strcat "\nError: " errmsg))
    ); if
    (vla-endundomark doc)
    (princ)
  ); defun - *error*
  (vla-startundomark (setq doc (vla-get-activedocument (vlax-get-acad-object))))
  (initget (if (and (not *OIOdist) (= (getvar 'offsetdist) -1.0)) 7 6))
    ; no Enter if no prior value and regular Offset is Through; no zero; no negative
  (setq *OIOdist ; global, to offer as default on subsequent use
    (cond
      ( (getdist ; User input
          (strcat
            "\nDistance to Offset " subpr "ward"
            (cond
              (*OIOdist (strcat " <" (rtos *OIOdist) ">")); prior OIO value
              ((/= (getvar 'offsetdist) -1.0) (strcat " <" (rtos (getvar 'offsetdist)) ">"))
                ; regular Offset's distance if not Through
              (""); no default if neither above condition
            ); cond
            ": "
          ); strcat
        ); getdist
      ); User-input condition
      (*OIOdist); User Enter with prior OIO value
      ((/= (getvar 'offsetdist) -1.0) (getvar 'offsetdist))
        ; User Enter with no OIO value but regular Offset not Through
    ); cond
    nogo 0
  ); setq
  (prompt (strcat "\nTo Offset object(s) " subpr "ward by same distance,"))
  (if (setq ss (ssget ":L" '((0 . "*POLYLINE,ARC,CIRCLE,ELLIPSE,SPLINE")))); level1
    (progn ; then
      (setq nogo 0)
      (repeat (setq n (sslength ss)); level1 then
        (if ; level2
          (and
            (not
              (member
                '(100 . "AcDb3dPolyline"); can't Offset 3DPolyline
                (entget (setq ent (ssname ss (setq n (1- n)))))
              ); member
            ); not
            (vlax-curve-isPlanar ent); nor non-planar [Spline only]
          ); and
          (progn ; level2 then -- proceed
            (setq
              obj (vlax-ename->vla-object ent)
              oarea (vla-get-Area obj)
            ); setq
            (if ; level3
              (not ; Offset succeeded [returns T if so, because:]
                (vl-catch-all-error-p ; returns T for error if inward but too small
                  (vl-catch-all-apply 'vla-offset (list obj *OIOdist))
                ); -error-p
              ); not
              (if ; level4 is level3 then -- check comparative areas:
                ((if (= subpr "In") > <) (vla-get-Area (vlax-ename->vla-object (entlast))) oarea)
                (progn ; level4 then -- went wrong way
                  (entdel (entlast))
                  (if ; level5 -- go the other way [if possible]
                    (vl-catch-all-error-p ; returns T for error if inward but too small
                      (vl-catch-all-apply 'vla-offset (list obj (- *OIOdist)))
                    ); -error-p
                    (setq nogo (1+ nogo)); then -- add to count of too-small [no else]
                  ); if level5
                ); progn
              ); if level4 [went wrong way -- no else; do nothing if it went right way]
              (if (= subpr "Out") (vla-offset obj (- *OIOdist)) (setq nogo (1+ nogo)))
                ; level3 else -- too small for inward; go other way only if OffOut
                ; if OffIn, add to count of too-small
            ); if level3 [Offset succeeded]
          ); progn [then]
        ); if level2 [valid object -- no else; can't Offset otherwise]
      ); repeat
      (if (> nogo 0)
        (prompt (strcat "\n" (itoa nogo) " objects too small to be Offset Inward.")); then
      ); if
    ); progn -- then
  ); if level1 [unlocked object(s) selected]
  (vla-endundomark doc)
  (princ)
); defun -- C:OIO

(defun C:OffIn (/ *error*)
  (OIO "In")
); defun -- C:OffIn

(defun C:OffOut (/ *error*)
  (OIO "Out")
); defun -- C:OffIn

(vl-load-com)
(prompt "\nType OffIn to Offset object(s) Inward, OffOut to Offset object(s) Outward.")

Последний раз редактировалось Sege, 22.02.2023 в 16:25.
Sege вне форума  
 
Непрочитано 25.02.2023, 13:49
#4365
nikkomp


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


Здраствуйте, раньше в акаде 2008 и 2014 у меня работало вот это

Код:
[Выделить все]
(defun C:l ()
  (while (VL-CMDF "_xline" pause pause ""))
  (princ)
)
Перешел на 2018 не могу выйти из бесконечного цикла клавишой ESC как раньше, приходиться выгружать автокад через диспетчер задач виндовс.
nikkomp вне форума  
 
Непрочитано 25.02.2023, 14:46
#4366
Кулик Алексей aka kpblc
Moderator

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


vl-cmdf в последних версиях всегда возвращает t, независимо ни от чего. Так что теперь придется делать нечто типа
Код:
[Выделить все]
 (defun c:qw (/ elast)
  (setq elast (entlast))
  (vl-cmdf "_.xline" pause pause "")
  (while (/= (entlast) elast)
    (setq elast (entlast))
    (vl-cmdf "_.xline" pause pause "")
  ) ;_ end of while
) ;_ end of defun
Код не проверял и не тестировал.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.02.2023, 17:11
#4367
nikkomp


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Код не проверял и не тестировал.
Не то же самое,выйти можно через enter, но любое действие возвращает к этой команде, а можно сделать что то подобное через команду _multiple?
nikkomp вне форума  
 
Непрочитано 22.03.2023, 09:06
#4368
posetitel


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


Цитата:
Сообщение от koMon Посмотреть сообщение
ну можно и без костылей. проверки на правильность имени слоя нет.
Код:
[Выделить все]
 (defun c:pline_cb_layer ()
	(command "._pasteclip" '(1e10 1e10))
	(setq layer_mtext (entlast))
	(if (= "AcDbMText" (vla-get-objectname (vlax-ename->vla-object (setq layer_mtext (entlast)))))
			(progn
				(vl-catch-all-apply 'vla-add (list (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) 
												   (setq layer_name (vla-get-textstring (vlax-ename->vla-object layer_mtext)))
											 )
				)
				(setvar 'clayer layer_name)
				(vla-erase (vlax-ename->vla-object layer_mtext))
				(command "_.pline" pause)
			)
			(progn
				(vla-erase (vlax-ename->vla-object layer_mtext))
				(alert "В буфере обмена не текст!")
			)
	)
)
Скажите, почему если в этом лиспе команду заменить на кириллицу, то лисп перестает работать?
Т.е. "pline_cb_layer" заменить например на "слойкаб" лисп не запускается, пишет неизвестная команда
posetitel вне форума  
 
Непрочитано 22.03.2023, 09:09
#4369
Кулик Алексей aka kpblc
Moderator

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


Свой вариант кода покажи. И "C:" должна остаться на английском, если что.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.03.2023, 09:33
#4370
posetitel


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


Код:
[Выделить все]
(defun c:вап ()
	(command "._pasteclip" '(1e10 1e10))
	(setq layer_mtext (entlast))
	(if (= "AcDbMText" (vla-get-objectname (vlax-ename->vla-object (setq layer_mtext (entlast)))))
			(progn
				(vl-catch-all-apply 'vla-add (list (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) 
												   (setq layer_name (vla-get-textstring (vlax-ename->vla-object layer_mtext)))
											 )
				)
				(setvar 'clayer layer_name)
				(vla-erase (vlax-ename->vla-object layer_mtext))
				(command "_.pline" pause)
			)
			(progn
				(vla-erase (vlax-ename->vla-object layer_mtext))
				(alert "В буфере обмена не текст!")
			)
	)
)
Прилагаю.
С английская, я вообще заменил только команду на кириллицу "вап"
posetitel вне форума  
 
Непрочитано 22.03.2023, 09:57
1 | #4371
Кулик Алексей aka kpblc
Moderator

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


Я проверил - все срабатывает нормально. Может, кодировка lsp-файла не ANSI?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.03.2023, 10:04
#4372
posetitel


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я проверил - все срабатывает нормально. Может, кодировка lsp-файла не ANSI?
Offtop: Хм...
Создал файл txt, в нем по умолчанию кодировка ANSI, скопировал прям из своего сообщения код, сохранил, расширение поменял на lsp, подгрузил в автокад и все равно не работает.

Покрутил-повертел кодировку, реально в ней видимо была проблема. Спасибо.

Последний раз редактировалось posetitel, 22.03.2023 в 10:12.
posetitel вне форума  
 
Непрочитано 22.03.2023, 10:12
1 | #4373
Кулик Алексей aka kpblc
Moderator

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


Короче, файл приложи
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.03.2023, 09:28
#4374
Kavalergrad


 
Регистрация: 21.11.2014
Москва
Сообщений: 60


Пожалуйста, проконсультируйте меня. Встретил следущее выражениеdefun asd (lays_1 lays_2 att k / ).
Я так понимаю, что это определение функции asd. defun - это оператор определения функции, а asd - сама функция,
lays_1 lays_2 att k - это переменные. А вот для чего в конце стоит косая черта, что она означает, для чего служит и когда применяется?
И почему именно в конце поставлена? Или это ошибка и косая черта должна стоять в начале, перед переменными?
Kavalergrad вне форума  
 
Непрочитано 24.03.2023, 09:33
#4375
Кулик Алексей aka kpblc
Moderator

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


После обычно указываются имена локальных функций и переменных
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.03.2023, 09:14
#4376
Jek30


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


Вопрос про наборы в лиспе:
Есть строчка в одном лиспе: (setq s11 (ssname s1 i))
Я так пологаю что она отвечает за извлечение примитивов из набора s1 по порядковому номеру.
А как сделать так чтобы эти примитивы извлекались из набора не по порядковому номеру их создания, а в порядке расположения их в координатном пространстве. (то есть например по столбцам, сначала по оси "Y" по убыванию, далее если имеются еще столбцы с этими примитивами, то извлечение передвигается по оси "Х" по возрастанию и примитивы опять извлекаются по оси "Y" по убыванию и так далее, пока примитивы из набора не закончатся).
Подскажите пожалуйста, как это осуществить?
Jek30 вне форума  
 
Непрочитано 30.03.2023, 09:31
1 | #4377
Кулик Алексей aka kpblc
Moderator

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


Так а какая разниц? Сначала получи, потом сортируй как тебе надо.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.03.2023, 09:41
#4378
Jek30


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сначала получи, потом сортируй как тебе надо.
Ну хорошо. Но вопрос остался прежним. И как отсортировать в порядке расположения их в координатном пространстве?
Jek30 вне форума  
 
Непрочитано 12.05.2023, 09:42
#4379
posetitel


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


Цитата:
Сообщение от koMon Посмотреть сообщение
ну можно и без костылей. проверки на правильность имени слоя нет.
Код:
[Выделить все]
 (defun c:pline_cb_layer ()
	(command "._pasteclip" '(1e10 1e10))
	(setq layer_mtext (entlast))
	(if (= "AcDbMText" (vla-get-objectname (vlax-ename->vla-object (setq layer_mtext (entlast)))))
			(progn
				(vl-catch-all-apply 'vla-add (list (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) 
												   (setq layer_name (vla-get-textstring (vlax-ename->vla-object layer_mtext)))
											 )
				)
				(setvar 'clayer layer_name)
				(vla-erase (vlax-ename->vla-object layer_mtext))
				(command "_.pline" pause)
			)
			(progn
				(vla-erase (vlax-ename->vla-object layer_mtext))
				(alert "В буфере обмена не текст!")
			)
	)
)
Уважаемый, koMon, могли бы немного дополнить лисп, чтобы предварительно нужно было выбрать ячейку в таблице чертежа, текст из этой ячейки помещался в буфер и уже потом создавался слой с именем из буфера и вводилась команда для начертания полилинии.
Ну либо минуя промежуточный этап - буфер обмена: ввод команды лиспа, запрос от лиспа на выбор ячейки таблицы, далее создание слоя с именем соответствующем тексту из этой ячейки и команда черчения полилинии в созданном слое.
posetitel вне форума  
 
Непрочитано 12.05.2023, 10:19
#4380
Кулик Алексей aka kpblc
Moderator

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


posetitel, тут как бы обучение, а не просьбы модифицировать коды.
__________________
Моя библиотека 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