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

Вернуться   Форум 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.
Просмотров: 2049455
 
Старый 21.06.2024, 19:28 ГИС координаты
#4621
1958


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


Кто знает, в какой системной переменной хранится описание "ГИС координат" ?
Миниатюры
Нажмите на изображение для увеличения
Название: Буфер обмена01.jpg
Просмотров: 19
Размер:	39.8 Кб
ID:	263511  
1958 вне форума  
 
Старый 21.06.2024, 19:36
#4622
Кулик Алексей aka kpblc
Moderator

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


Это что-то из Civil, скорее всего. И вряд ли на это есть системная переменная.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 22.06.2024, 04:44
#4623
1958


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Это что-то из Civil
Да, это задано в Civil. Но в голом автокаде тоже отображается. Так что где-то это прописано. Где?
1958 вне форума  
 
Старый 22.06.2024, 07:53
#4624
1958


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


Команда: (getvar "CGEOCS")
"UTM84-42N"
Только чтение, а жаль.
Можно поиграться.
https://help.autodesk.com/view/ACD/2...6-DA4670D0F3FD

Последний раз редактировалось 1958, 22.06.2024 в 08:07.
1958 вне форума  
 
Старый 22.06.2024, 08:05
#4625
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от 1958 Посмотреть сообщение
Но в голом автокаде тоже отображается.
В чистом ACAD - нет, насколько я знаю. Ты сначала в ACAD выстави demandload в 2, перегрузи - и смотри, отобразится или нет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 22.06.2024, 09:34
#4626
1958


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
в ACAD выстави demandload в 2, перегрузи - и смотри, отобразится или нет.
Отображается.
1958 вне форума  
 
Старый 22.06.2024, 11:40
#4627
Кулик Алексей aka kpblc
Moderator

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


А, сорян. С этой ботвой толком не сталкивался
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 05.07.2024, 10:27
#4628
Ingpro


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


Код изменяет регистр всех!!! Текстов на чертеже (без выбора) на верхний.
Как правильно добавить выбор текстов (по одному и рамкой), и чтобы объекты (не тексты), попавшие в рамку выбора игнорировались
Я пытаюсь:
Код:
[Выделить все]
 (setq (ssget (quote ((0 . "TEXT")))) "")
выбор работает, но регистр не изменяется...
Код:
[Выделить все]
 (defun c:ch-cs ( / OLDLIST ALLENTS NXT ELIST OLDSLOPE SLOPE NEWTEXT N)
(SETVAR "CMDECHO" 0)

(defun *Error* (msg)
  (if (/= msg "Function cancelled")
    (princ (strcat "\nError: " msg))
  )
(terpri)
                         
  (setq *error* olderr)        
  (princ)
)

(if cont (exit))
(setq oldlist (list (CONS 0 "TEXT")))
(setq allents (ssget "_X"  oldlist))
(setq n 0)
(setq nxt (ssname allents n))
(while nxt
(Setq elist (entget nxt))
(setq oldslope (assoc 1 elist))
(setq slope (cdr oldslope))
          
          (setq newtext (cons 1 (strcase slope)))
          (setq elist (subst newtext oldslope elist)) 
          (entmod elist)
(setq n (+ 1 n))
(setq nxt (ssname allents n))
);endwhile
(princ)
);end
(princ)
Ingpro вне форума  
 
Старый 05.07.2024, 10:54
#4629
Кулик Алексей aka kpblc
Moderator

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


Не страшно глобально обработчик ошибок переопределять? И системную переменную обратно не возвращать?

----- добавлено через ~2 мин. -----
Как вариант, без проверок:
Код:
[Выделить все]
 (defun c:ch-cs (/ OLDLIST ALLENTS NXT ELIST OLDSLOPE SLOPE NEWTEXT N *error*) 
  (SETVAR "CMDECHO" 0)

  (defun *Error* (msg) 
    (if (/= msg "Function cancelled") 
      (princ (strcat "\nError: " msg))
    )
    (terpri)

    (setq *error* olderr)
    (princ)
  )

  (setq allents (ssget "_:L" '((0 . "TEXT")))
        n       0
        nxt     (ssname allents n)
  )
  (while nxt 
    (Setq elist (entget nxt))
    (setq oldslope (assoc 1 elist))
    (setq slope (cdr oldslope))

    (setq newtext (cons 1 (strcase slope)))
    (setq elist (subst newtext oldslope elist))
    (entmod elist)
    (setq n (+ 1 n))
    (setq nxt (ssname allents n))
  )
  (princ)
)
(princ)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 05.07.2024, 11:13
#4630
skkkk


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Не страшно глобально обработчик ошибок переопределять?
А чем это чревато?
skkkk вне форума  
 
Старый 05.07.2024, 11:23
#4631
Кулик Алексей aka kpblc
Moderator

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


Ну хотя бы тем, что в штатном обработчике ошибок может быть ооочень много всего намешано (особенно это касалось вертикалок).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 05.07.2024, 11:25
#4632
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Не страшно глобально обработчик ошибок переопределять? И системную переменную обратно не возвращать?
Спасибо, Алексей. Так выбирает и изменяет регистр.
А если снести обработчик ошибок и добавить (SETVAR "CMDECHO" 1)?
Код:
[Выделить все]
  (defun c:ch-cs (/ OLDLIST ALLENTS NXT ELIST OLDSLOPE SLOPE NEWTEXT N) 
  (SETVAR "CMDECHO" 0)

   (setq allents (ssget "_:L" '((0 . "TEXT")))
        n       0
        nxt     (ssname allents n)
  )
  (while nxt 
    (Setq elist (entget nxt))
    (setq oldslope (assoc 1 elist))
    (setq slope (cdr oldslope))

    (setq newtext (cons 1 (strcase slope)))
    (setq elist (subst newtext oldslope elist))
    (entmod elist)
    (setq n (+ 1 n))
    (setq nxt (ssname allents n))
  )
  (princ)
(SETVAR "CMDECHO" 1)
)
(princ)

Последний раз редактировалось Ingpro, 05.07.2024 в 11:30.
Ingpro вне форума  
 
Старый 05.07.2024, 11:28
1 | 1 #4633
Кулик Алексей aka kpblc
Moderator

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


А что ты будешь делать, если человек специально ставил cmdecho у себя в 0? Ну вот нравится ему такое, а ты тут со своим кодом - и выставляешь в 1. Хотя об этом тебя никто не просил.
Вывод: считывать значение системной переменной, устанавливать свое, и по окончании восстанавливать. В том числе и в случае ошибки.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 05.07.2024, 12:13
#4634
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А что ты будешь делать, если человек специально ставил cmdecho у себя в 0? Ну вот нравится ему такое, а ты тут со своим кодом - и выставляешь в
Тогда так?:
Код:
[Выделить все]
 ; изменяет регистр выбранных! Текстов на чертеже на верхний
(defun c:Txt-case-choice (/ OLDLIST ALLENTS NXT ELIST OLDSLOPE SLOPE NEWTEXT N *error*) 
 (setq oldCMDECHO (getvar 'CMDECHO))
(setvar 'CMDECHO 0)

  (defun *Error* (msg) 
    (if (/= msg "Function cancelled") 
      (princ (strcat "\nError: " msg))
    )
    (terpri)

    (setq *error* olderr)
    (princ)
  )

  (setq allents (ssget "_:L" '((0 . "TEXT")))
        n       0
        nxt     (ssname allents n)
  )
  (while nxt 
    (Setq elist (entget nxt))
    (setq oldslope (assoc 1 elist))
    (setq slope (cdr oldslope))

    (setq newtext (cons 1 (strcase slope)))
    (setq elist (subst newtext oldslope elist))
    (entmod elist)
    (setq n (+ 1 n))
    (setq nxt (ssname allents n))
  )
  (princ)
(setvar "CMDECHO" oldCMDECHO)
)
(princ)

Последний раз редактировалось Ingpro, 05.07.2024 в 14:10.
Ingpro вне форума  
 
Старый 05.07.2024, 12:18
#4635
skkkk


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
Тогда так?:
А *error* куда пропала? В нём нужно прописать возврат переменной в случае выхода, к примеру, по Escape. Просто Алексей имел в виду, что её нужно объявить локальной, то есть прописать в первой строчке кода после слэша. Она будет тогда действовать только внутри функции команды c:ch-cs2, а не глобально.
skkkk вне форума  
 
Старый 05.07.2024, 12:23
#4636
Ingpro


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
А *error* куда пропала? В нём нужно прописать возврат переменной в случае выхода, к примеру, по Escape. Просто Алексей имел в виду, что её нужно объявить локальной, то есть прописать в первой строчке кода после слэша. Она будет тогда действовать только внутри функции команды c:ch-cs2, а не глобально.
А как это конкретно в коде прописать?
Код:
[Выделить все]
   (defun *Error* (msg)
  (if (/= msg "Function cancelled")
  (princ (strcat "\nError: " msg))
  )
  (terpri)
  (setq *error* olderr)
  (princ)
  )
Т. е. достаточно добавить *error*, и больше ничего не менять в коде?
Код:
[Выделить все]
 (defun c:ch-cs (/ OLDLIST ALLENTS NXT ELIST OLDSLOPE SLOPE NEWTEXT N *error*)

Последний раз редактировалось Ingpro, 05.07.2024 в 13:42.
Ingpro вне форума  
 
Старый 05.07.2024, 14:04
#4637
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


А вот, кстати, интересный вопрос... А есть ли где-нибудь достоверное
описание того, что делает "штатная" *error*, кроме того, что
выводит на экран сообщение об ошибке ?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Старый 05.07.2024, 14:08
#4638
Кулик Алексей aka kpblc
Moderator

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


Понятно, мой вариант кода никто не смотрел...
Опять же, пара вариантов как бы я их писал. Один через ename, второй через ActiveX. Без проверок
Код:
[Выделить все]
 (vl-load-com)
(defun c:ch-cs1 (/ adoc selset) 
  (if 
    (= 
      (type 
        (setq selset (vl-catch-all-apply 
                       (function 
                         (lambda () 
                           (ssget "_:L" '((0 . "TEXT")))
                         )
                       )
                     )
        )
      )
      'pickset
    )
    (progn 
      (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
      (foreach elist 
        (mapcar (function entget) 
                ((lambda (/ tab item) 
                   (repeat 
                     (setq tab  nil
                           item (sslength selset)
                     )
                     (setq tab (cons (ssname selset (setq item (1- item))) tab))
                   )
                 ) 
                )
        )
        (entmod 
          (subst 
            (cons 1 (strcase (cdr (assoc 1 elist))))
            (assoc 1 elist)
            elist
          )
        )
      )
      (vla-endundomark adoc)
    )
  )
  (princ)
)

(defun c:ch-cs2 (/ adoc selset) 
  (if 
    (= 
      (type 
        (setq selset (vl-catch-all-apply 
                       (function 
                         (lambda () 
                           (ssget "_:L" '((0 . "TEXT")))
                         )
                       )
                     )
        )
      )
      'pickset
    )
    (progn 
      (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
      (foreach ent 
        (mapcar (function vlax-ename->vla-object) 
                ((lambda (/ tab item) 
                   (repeat 
                     (setq tab  nil
                           item (sslength selset)
                     )
                     (setq tab (cons (ssname selset (setq item (1- item))) tab))
                   )
                 ) 
                )
        )
        (vla-put-textstring ent (strcase (vla-get-textstring ent)))
      )
      (vla-endundomark adoc)
    )
  )
  (princ)
)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 05.07.2024, 14:22
#4639
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Опять же, пара вариантов как бы я их писал. Один через ename, второй через ActiveX. Без проверок
Оба работают!
Ingpro вне форума  
 
Старый 05.07.2024, 14:28
#4640
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
А вот, кстати, интересный вопрос... А есть ли где-нибудь достоверное
описание того, что делает "штатная" *error*, кроме того, что
выводит на экран сообщение об ошибке ?
Насколько я знаю, нет. Но после игрищ с этим зверем в вертикалках типа АА я зарекся вообще в его сторону смотреть. Уже проще через vl-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