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

Вернуться   Форум 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.
Просмотров: 2053367
 
Непрочитано 18.02.2015, 10:46
#2441
Кулик Алексей aka kpblc
Moderator

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


В данном случае - скорее всего, ничего. Будет создан отрезок на слое "СлойОтрезка" (если слой не существует на момент вызова кода, слой будет создан с настройками по умолчанию). Для других примитивов (в частности, LWPOLYLINE) порядок следования кодов может оказаться критичным.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.02.2015, 10:54
#2442
trushev


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Для других примитивов (в частности, LWPOLYLINE) порядок следования кодов может оказаться критичным.
А насколько это критично для базы данных?
trushev вне форума  
 
Непрочитано 18.02.2015, 11:01
1 | #2443
Кулик Алексей aka kpblc
Moderator

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


При работе в лиспе - вообще не критично, я думаю. Примитив (если его возможно создать) моментально создается в БД чертежа. Если допустима операция по модификации - то и изменения вносятся.
P.S. Есть разница между установкой свойств через entmod и через ActiveX, но в данный момент они некритичны, мне так каэцца ))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.02.2015, 11:09
#2444
trushev


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
через ActiveX
Ну это мне уже не по зубам. Еще раз спасибо за ответы.
trushev вне форума  
 
Непрочитано 18.02.2015, 11:16
#2445
Кулик Алексей aka kpblc
Moderator

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


О, пока сообразил и не забыл: ты отдаешь себе отчет, что примитив отрезка у тебя будет создан только в текущем документе и только в текущем пространстве? То есть если ты находишься в модели, то он будет создан в модели. если активно пространство листа - то в листе. А если ты оказываешься в режиме редактирования блока - то только внутри описания блока? При этом результат может оказаться немного неожиданным, если ты вдруг вошел в контекстное редактирование блока.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.02.2015, 11:25
#2446
trushev


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


Спасибо. Я не ставлю перед собой непосильных для меня задач задач, работаю в модели.
trushev вне форума  
 
Непрочитано 18.02.2015, 11:31
1 | #2447
Кулик Алексей aka kpblc
Moderator

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


Просто в режим контекстного редактирования блока можно войти и "почти случайно" ))) Постарайся учесть такое развитие ситуации.
Учитывая, что ты работаешь только в пространстве модели, не забывай про принудительное указание групп 67 и 410.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.02.2015, 12:01
#2448
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
В прошлом веке познакомился с lisp'ом в объеме книги Ю. А. Кречко В. В. Полищук "Автокад 13: новые возможности" Москва "Диалог-МИФИ" 1996. В книге четко прописано ограничение: "... хотим добавить новый примитив, то должны использовать команды отрисовки или редактирования Автокада. Это ограничение связано с желанием защитить ГБД от неграмотного программиста: ...".
Это очень древняя книжка. Тогда только подступались к программированию в Автокаде. Еще даже не было уверенности, будут ли entmake поддерживаться, будут ли такими DXF-коды. Их вообще приходилось "разведывательными" методами добывать.

Но с тех пор очень многое изменилось.
ShaggyDoc вне форума  
 
Непрочитано 18.02.2015, 14:12
#2449
mkung


 
Регистрация: 05.09.2007
RUSSIA
Сообщений: 166


Подскажите, как из программы открыть текстовое окно Автокада?
Можно ли "заказать" его высоту (количество строк)?
mkung вне форума  
 
Непрочитано 18.02.2015, 14:46
1 | #2450
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от mkung Посмотреть сообщение
как из программы открыть текстовое окно Автокада?
Код:
Цитата:
Сообщение от mkung Посмотреть сообщение
Можно ли "заказать" его высоту (количество строк)?
По-моему, нет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.02.2015, 16:25 entmake, entmakex
#2451
trushev


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


Редактирование через базу данных выполняется в следующей последовательности:

(setq nm (car (entsel)) ;Извлечение имени примитива (или иным способом)
sp (entget nm) ;Список из базы данных
sa (assoc dxf_код sp) ;Извлечение интересующего члена списка (Код параметр)
sn (cons dxf_код ...) ;Формирование нового члена (Код Измененный_параметр)
sp (subst sn sa sp) ;Замена старого члена на новый
)
(entmod sp) ;Обновление базы данных

При использовании entmake(x) по логике следует тоже применить entmod. Просмотрев примеры я не обнаружил в них обновления базы данных. Правильно ли я понимаю, что функции entmake, entmakex выполняют действия функции entmod.
trushev вне форума  
 
Непрочитано 19.02.2015, 16:40
#2452
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от trushev Посмотреть сообщение
Редактирование через базу данных выполняется в следующей последовательности
Засем рухаисся насяльникама? Ты сам-то понял чего сказал?
Цитата:
Сообщение от trushev Посмотреть сообщение
При использовании entmake(x) по логике следует тоже применить entmod
По какой логике?
Цитата:
Сообщение от trushev Посмотреть сообщение
Правильно ли я понимаю, что функции entmake, entmakex выполняют действия функции entmod
Нет. Не путай создание и модификацию уже созданного.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.02.2015, 16:50
#2453
trushev


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


К концу дня голова совсем тупая. Утро вечера мудренее.
trushev вне форума  
 
Непрочитано 20.02.2015, 00:57
#2454
SetQ

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


Подскажите, какой путь решения на ваш взгляд лучше у такой задачи: есть mtext, в нём несколько строк, разделённых "\P", надо получить список строк, например "abc\Pdef\Pjhi" -> ("abc" def" "jhi"). Можно работать только с исходной строкой vl-string-search, можно преобразовать vl-string->list и дальше работать со списком кодов, или надо совсем не так?
SetQ вне форума  
 
Непрочитано 20.02.2015, 09:44
1 | #2455
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (defun _kpblc-conv-string-to-list (string separator / i)
                                  ;|
*    Функция разбора строки. Возвращает список либо точечную пару.
*    Параметры вызова:
*  string    разбираемая строка
*  separator  символ, используемый в качестве разделителя частей
*    Примеры вызова:
(_kpblc-conv-string-to-list "1;2;3;4;5;6" ";")  ;'(1 2 3 4 5 6)
(_kpblc-conv-string-to-list "1;2" ";")    ;'(1 2)
*    За основу взяты уроки Евгения Елпанова по рекурсиям
|;
  (cond
    ((= string "") nil)
    ((vl-string-search separator string)
     ((lambda (/ pos res)
        (while (setq pos (vl-string-search separator string))
          (setq res    (cons (substr string 1 pos) res)
                string (substr string (+ (strlen separator) 1 pos))
                ) ;_ end of setq
          ) ;_ end of while
        (reverse (cons string res))
        ) ;_ end of lambda
      )
     )
    ((wcmatch (strcase string) (strcat "*" (strcase separator) "*"))
     ((lambda (/ pos res _str prev)
        (setq pos  1
              prev 1
              _str (substr string pos)
              ) ;_ end of setq
        (while (<= pos (1+ (- (strlen string) (strlen separator))))
          (if ;; (wcmatch (strcase (substr string pos)) (strcase (strcat separator "*")))
              (wcmatch (strcase (substr string pos (strlen separator))) (strcase separator))
            (setq res    (cons (substr string 1 (1- pos)) res)
                  string (substr string (+ (strlen separator) pos))
                  pos    0
                  ) ;_ end of setq
            ) ;_ end of if
          (setq pos (1+ pos))
          ) ;_ end of while
        (if (< (strlen string) (strlen separator))
          (setq res (cons string res))
          ) ;_ end of if
        (if (or (not res) (= _str string))
          (setq res (list string))
          (reverse res)
          ) ;_ end of if
        ) ;_ end of lambda
      )
     )
    (t (list string))
    ) ;_ end of cond
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.02.2015, 10:19 На #2447
#2456
trushev


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


Разыскал бумажный вариант Полещук Н.Н. Visual LISP и секреты адаптации AutoCAD. - СП.: БХВ-Петербург. Разобрался.
PS Правильно, модификация

----- добавлено через ~8 мин. -----
Что может entmake сверх того что выполняет entmakex?
trushev вне форума  
 
Непрочитано 20.02.2015, 11:01
#2457
Wolkodaw


 
Регистрация: 21.04.2009
Тюмень
Сообщений: 97


Как заставить работать функцию в этом примере: (vl-remove-if '(= (+ 2 3)) (1 2 3 4 5)) ?
Wolkodaw вне форума  
 
Непрочитано 20.02.2015, 11:33
#2458
Кулик Алексей aka kpblc
Moderator

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


Wolkodaw, ты бы хоть примерно написал, чего хотишь получить...
Код:
[Выделить все]
 (vl-remove-if
  (function
    (lambda (x)
      (= x (+ 1 2))
      ) ;_ end of lambda
    ) ;_ end of function
  '(1 2 3 4 5)
  ) ;_ end of vl-remove-if
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.02.2015, 11:47
#2459
trushev


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


Выкладываю свой первый результат наставлений Учителя (посты 2434, 2436, 2438, 2440, 2442 и 2447). Алексей, если найдется время, взгляни, дай замечания и ответь на вопросы:
1. В каких случаях не допускается применение entmakex вместо entmake?
2. Ограничение на точечную пару с кодом -1 прописано в книге Н. Полещука. Распространяется ли это ораничение на точечные пары с кодами 330 и 5?
3. Не понимаю точечную пару с кодом 100. Когда следует ее включать с список?

Замена command на entmakex
Код:
[Выделить все]
(foreach k sph  ;список ((list x h y) ... (list x h y))
     ;  (command "_.text"
     ;           "_j" "_ml" (list (car k) (- (caddr k) (* 1.35 mb)))
     ;           (rtos (*  0.2 mb) 2 2) "90" (rtos (cadr k) 2 2)
     ;            ;
     ;            ;Отрисовка отрезка
     ;            ;
     ;           "_.line" (list (car k) (- (caddr k) (* 1.5 mb))) (list (car k) (- (caddr k) (* 2.0 mb))) ""
     ;  )
       (entmakex (list '(0 . "TEXT")                              ;тип примитива
                       '(100 . "AcDbEntity")                      ;
                       '(67 . 0)                                  ;тип пространства (0 - модель)
                       '(410 . "Model")                           ;имя вкладки
                       (cons 8 (getvar "clayer"))                 ;имя слоя
                       (cons 62 (atoi (getvar "cecolor")))        ;номер цвета
                       '(100 . "AcDbText")                        ;
                       (list 10 (car k) (- (caddr k) (* 1.35 mb)) 0.0);координаты точки вставки
                       (cons 40 (*  0.2 mb))                      ;высота текста
                       (cons 1 (rtos (cadr k) 2 2))               ;значение текста
                       '(50 . 1.5707963)                          ;угол поворота в радианах
                       '(41 . 1.0)                                ;степень сжатия
                       '(51 . 0.0)                                ;угол наклона
                       (cons 7 (getvar "textstyle"))              ;имя текстового стиля
                       '(71 . 0)                                  ;генерация
                       '(72 . 0)                                  ;горизонтальное выравнивание
                       (list 11 (car k) (- (caddr k) (* 1.35 mb)) 0.0);точка выравнивания текста
                       '(210 0.0 0.0 1.0)                         ;координаты направление выдавливания
                       '(100 . "AcDbText")                        ;
                       '(73 . 2)                                  ;вертикальное выравнивание
                 )
       )
                 ;
                 ;Отрисовка отрезка
                 ;
       (entmakex (list '(0 . "LINE")                        ;тип примитива
                       '(100 . "AcDbEntity")                ;
                       '(67 . 0)                            ;тип пространства (0 - модель)
                       '(410 . "Model")                     ;имя вкладки
                       (cons  8 (getvar "clayer"))          ;имя слоя
                       (cons 62 (atoi (getvar "cecolor")))  ;номер цвета
                       '(100 . "AcDbLine")                  ;
                       (list 10 (car k) (- (caddr k) (* 1.5 mb)) 0.0);координаты начальной точки
                       (list 11 (car k) (- (caddr k) (* 2.0 mb)) 0.0);координаты конечной точки
                       '(210 0.0 0.0 1.0)                   ;координаты направление выдавливания
                 )
       )
);foreach k sph
P.S. Фрагмент кода из http://forum.dwg.ru/showthread.php?t=119413
trushev вне форума  
 
Непрочитано 25.02.2015, 17:32
1 | #2460
Кулик Алексей aka kpblc
Moderator

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


Посмотри DXF Reference: в 5 группе хранится Handle объекта (задается самим AutoCAD). 330 - т.н. "мягкий" указатель на созданный объект (тоже от AutoCAD'a). -1 : тоже связано с указателями, насколько я помню (пишу с планшета). Так что задавать эти параметры бесполезно.
Группа 100 необходима при создании сложных примитивов типа полилиний - это точно. Касаемо текстов - кажется, для однострочных его можно пропустить, а для многострочных он обязателен.
И разница между entmake и entmakex только в возвращаемом значении в случае успеха: один возвращает список (аналог entget), второй - указатель на созданный примитив. А так больше вроде бы ничего у них и не различается.
__________________
Моя библиотека 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