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

Вернуться   Форум 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.
Просмотров: 2054782
 
Старый 31.05.2023, 11:57
#4421
Кулик Алексей aka kpblc
Moderator

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


Кхм... В свойствах показывается далеко не один атрибут. Так что для начала надо понять, что значит "видимый".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 31.05.2023, 12:34
#4422
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,813


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(setq att (vl-remove-if (function (lambda(x) (equal (vla-get-invisible x) :vlax-true))) att_list)
Код:
[Выделить все]
 
(vla-get-tagstring (car (vl-remove-if '(lambda (attribute) (minusp (vlax-get attribute 'invisible))) (vlax-invoke (vlax-ename->vla-object (car (entsel "\nВыберите блок с атрибутами: "))) 'getattributes))))
__________________
K Lisp
koMon вне форума  
 
Старый 31.05.2023, 12:47
#4423
Sege


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


Цитата:
Сообщение от koMon Посмотреть сообщение
Код:
[Выделить все]
 
(vla-get-tagstring (car (vl-remove-if '(lambda (attribute) (minusp (vlax-get attribute 'invisible))) (vlax-invoke (vlax-ename->vla-object (car (entsel "\nВыберите блок с атрибутами: "))) 'getattributes))))
Получил (#<VLA-OBJECT IAcadAttributeReference 0000014b6c843c58>)
А как из этого получить имя атрибута?
UPD: получил, спасибо!
Sege вне форума  
 
Старый 16.06.2023, 16:33
#4424
Sege


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


Что-то под конец рабочей недели немного туплю.

Есть список типа
(("1" . "aa") ("2" . "bb") ("3" . "cc"))

Как его преобразовать в список ("1" "2" "3")?
Sege вне форума  
 
Старый 16.06.2023, 20:58
1 | #4425
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,108


Цитата:
Сообщение от Sege Посмотреть сообщение
Есть список типа
(("1" . "aa") ("2" . "bb") ("3" . "cc"))

Как его преобразовать в список ("1" "2" "3")?
Код:
[Выделить все]
 (mapcar car '(("1" . "aa") ("2" . "bb") ("3" . "cc")))
SetQ вне форума  
 
Старый 16.06.2023, 21:56
1 | #4426
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,813


__________________
K Lisp
koMon вне форума  
 
Старый 16.06.2023, 23:04
#4427
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,108


Цитата:
Сообщение от koMon Посмотреть сообщение
'car
Правда, нужен апостроф в автокаде, а в VeLisp и без апострофа работает.
SetQ вне форума  
 
Старый 30.06.2023, 10:21
#4428
Alex_mur


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


Подскажите пожалуйста, как можно объединить два списка в один

есть список1 ("номер 1" "номер 2" "номер 3")
есть список2 ("a" "b" "c")

Как объединить эти два списка в один в следующей формате (("номер 1" "a") ("номер 2" "b") ("номер 3" "c"))

Делаю так:
(mapcar 'cons список1 список2)
но на выходе получается
(("номер 1" . "a") ("номер 2". "b") ("номер 3" . "c"))

Последний раз редактировалось Alex_mur, 30.06.2023 в 11:06.
Alex_mur вне форума  
 
Старый 30.06.2023, 11:13
#4429
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (setq lst1 '("num1" "num2" "num3")
      lst2 '("a" "b" "c")
      lst3 '("d" "e")
      ) ;_ end of setq
(mapcar (function list) lst1 lst2) ; '(("num1" "a") ("num2" "b") ("num3" "c"))

(mapcar (function list) lst1 lst3) ; '(("num1" "d") ("num2" "e"))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 30.06.2023, 12:39
#4430
Alex_mur


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Код:
[Выделить все]
 (setq lst1 '("num1" "num2" "num3")
      lst2 '("a" "b" "c")
      lst3 '("d" "e")
      ) ;_ end of setq
(mapcar (function list) lst1 lst2) ; '(("num1" "a") ("num2" "b") ("num3" "c"))

(mapcar (function list) lst1 lst3) ; '(("num1" "d") ("num2" "e"))
Алексей, спасибо!
Alex_mur вне форума  
 
Старый 07.07.2023, 15:28
#4431
posetitel


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


Товарищи, извините за детский вопрос, но как мне запустить нижние два лиспа?
Хэлп по запуску лиспов читал, но он не помог, т.к. в первом лиспе нет "defun", а во втором лиспе непонятно, как вводить исходные данные.
первый лисп переименовывает слои, содержащие буквы ХХХ на буквы SSS
Код:
[Выделить все]
 (vl-load-com)
(vlax-for lay (vla-get-Layers(vla-get-activedocument (vlax-get-acad-object)))
  (setq layname (vla-get-name lay))
  (if (and (snvalid layname)
           (= (substr layname 1 3) "XXX")
           )
    (vla-put-name lay (setq layname (strcat "SSS" (substr layname 4))))
    )
  )

Второй лисп делает тоже самое, только какие буквы менять и на какие менять нужно вводить, а вот как вводить: через слеш, через пробел или иначе, непонятно
Код:
[Выделить все]
 (defun rename-layers (source       dest         /            adoc
                      *error*      name         err_lst
                      _dwgru-string-parser
                      )
  ;|
*    Переименование слоев активного документа
*    Параметры вызова:
    source    Начальное значение "подстроки". Регистр неважен
    dest    Новое значение "подстроки".
*    Не допускается использование символов маски (?, *, [] и т.п.). Корректность
* нового имени не проверяется впрямую.
|;
  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun
  (defun _dwgru-string-parser (string separator / i)
                              ;|
*    Функция разбора строки. Возвращает список либо точечную пару.
*    Параметры вызова:
*    string        разбираемая строка
*    separator    символ, используемый в качестве разделителя частей
*    Примеры вызова:
(_dwgru-string-parser "1;2;3;4;5;6" ";")    ;'(1 2 3 4 5 6)
*    За основу взяты уроки Евгения Елпанова по рекурсиям
|;
    (cond
      ((= string "") nil)
      ((setq i (vl-string-search (strcase separator) (strcase string)))
       (cons (substr string 1 i)
             (_dwgru-string-parser
               (substr string (+ (strlen separator) 1 i))
               separator
               ) ;_ end of _kpblc-string-parser
             ) ;_ end of cons
       )
      (t (list string))
      ) ;_ end of cond
    ) ;_ end of defun
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for item (vla-get-layers adoc)
    (if (wcmatch (strcase (setq name (vla-get-name item)))
                 (strcat "*" (strcase source) "*")
                 ) ;_ end of wcmatch
      (if
        (vl-catch-all-error-p
          (vl-catch-all-apply
            (function
              (lambda ()
                (vla-put-name
                  item
                  ((lambda (/ res lst count)
                     (setq res ""
                           count -1
                           ) ;_ end of setq
                     (repeat
                       (1- (length (setq lst (_dwgru-string-parser name source)))
                           ) ;_ end of 1-
                        (setq res
                               (strcat res (nth (setq count (1+ count)) lst) dest)
                              ) ;_ end of setq
                        ) ;_ end of repeat
                     (strcat res (last lst))
                     ) ;_ end of lambda
                   )
                  ) ;_ end of vla-put-name
                ) ;_ end of lambda
              ) ;_ end of function
            ) ;_ end of vl-catch-all-apply
          ) ;_ end of vl-catch-all-error-p
         (setq err_lst (cons name err_lst))
         ) ;_ end of if
      ) ;_ end of if
    ) ;_ end of vlax-for
  (if err_lst
    (princ (strcat "Для следующих слоев не удалось установить новые имена : "
                   (apply 'strcat (mapcar '(lambda (x) (strcat x "\n")) err_lst))
                   ) ;_ end of strcat
           ) ;_ end of princ
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
posetitel вне форума  
 
Старый 07.07.2023, 16:17
#4432
Сергей812


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


первый не лисп, а выдранный откуда то кусок кода на лиспе.
второй - функция с аргументами, поэтому запустить ее как команду в явном виде не получиться.
Сергей812 вне форума  
 
Старый 07.07.2023, 17:17
#4433
posetitel


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


Ок, с первым, видимо, не все просто.
Второй то можно же как-то запустить.
У меня на чертеже есть слой "1_слой", я хочу переименовать 1_слой на 2_слой
Я ввожу (rename-layers), в надежде на окно запроса аргумента, акад пишет "ошибка: слишком мало аргументов", пытаюсь ввести аргументы (rename-layers 1 2), пишет "неверный тип аргумента: stringp 1", пытаюсь переписать через скобки (rename-layers (1 2)), опять "ошибка: неверная функция: 1".
Как задать аргументы у этой функции?

Последний раз редактировалось posetitel, 07.07.2023 в 17:23.
posetitel вне форума  
 
Старый 07.07.2023, 17:33
1 | 1 #4434
Сергей812


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


подозреваю, что там хочет все-таки строки увидеть в аргументах (rename-layers "1" "2")
Сергей812 вне форума  
 
Старый 07.07.2023, 22:00
#4435
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,108


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
первый не лисп, а выдранный откуда то кусок кода на лиспе.
Его можно на палитру инструментов положить, где блоки-штриховки всякие, а можно и лиспы добавлять.
SetQ вне форума  
 
Старый 16.08.2023, 08:59
#4436
gumel


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


Вроде очень простая задача:
Нужно нарисовать полилинию из трех точек с последовательными привязками END, PER и опять END.

Макрос на кнопку сочинил такой: ^C^C_polyline;end;\per;\end;\;
Макрос работает, но надо сделать командой

Не могу придумать как сделать на лиспе тож самое.. (command "_polyline" "_end") - закрывает чертеж
gumel вне форума  
 
Старый 16.08.2023, 09:19
#4437
Кулик Алексей aka kpblc
Moderator

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


Попробуй
(vl-cmdf "_.polyline" "_end" pause "_per" pause "_end" pause "")
С какого перепугу у тебя чертеж закрывается - тайна лично для меня
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 16.08.2023, 09:47
#4438
gumel


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Попробуй
(vl-cmdf "_.polyline" "_end" pause "_per" pause "_end" pause "")
С какого перепугу у тебя чертеж закрывается - тайна лично для меня
Слушайте, я не знаю, может я что не так пишу..
Вот код полностью:

Код:
[Выделить все]
 
(princ "POLYLINE с объектной привязкой END-PER-END. Для запуска - EPE")

(defun C:EPE ()
  (vl-cmdf "_.polyline" "_end" pause "_per" pause "_end" pause "")
)
Закрывает текущий документ, спрашивая в командной строке, сохранить ли изменения?

....

Код не менял. Теперь вообще непонятно что происходит:
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок экрана 2023-08-16 140016.png
Просмотров: 159
Размер:	5.2 Кб
ID:	258138  

Последний раз редактировалось gumel, 16.08.2023 в 10:05.
gumel вне форума  
 
Старый 16.08.2023, 09:52
#4439
Кулик Алексей aka kpblc
Moderator

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


Да не должен чертеж-то закрываться, вот в чем прикол.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 16.08.2023, 10:13
#4440
Фёдор Сумкин`


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


А если _end заменить на _endpoint?
Фёдор Сумкин` вне форума  
Ответ
Вернуться   Форум 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