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

Вернуться   Форум 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.
Просмотров: 2048613
 
Непрочитано 23.11.2010, 23:44
#1221
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Li6-D Посмотреть сообщение
вот еще вариант:
В принципе тоже, что и мое, но меня вот посетила мысль, что mapcar более удобна для длинных списков и простых функций, foreach более удобна для "коротких" списков и "глубоких" функций...
gomer вне форума  
 
Непрочитано 23.11.2010, 23:53
#1222
puma


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


Не подскажете, каким самым простым способом через lisp можно изменить масштаб динамического блока относительно базовой точки, не трогая (так чтобы не менялись) определенные динамические характеристики? заранее спасибо

Последний раз редактировалось puma, 23.11.2010 в 23:58.
puma вне форума  
 
Непрочитано 24.11.2010, 00:35
#1223
Кулик Алексей aka kpblc
Moderator

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


Michael!, я ж алгоритм показал. ShaggyDoc предоставил пример функции по созданию полилинии.
Все просто: формируется список координат, а потом уже строится новый объект.
Цитата:
Сообщение от Michael! Посмотреть сообщение
Или ручками все передвигать как раньше и незаморачиваться с программой.
Или изменить мой вариант кода, заменив запрос step на вычисляемое выражение.
Цитата:
Сообщение от gomer Посмотреть сообщение
но меня вот посетила мысль, что mapcar более удобна для длинных списков и простых функций, foreach более удобна для "коротких" списков и "глубоких" функций...
ИМХО неверно. mapcar возвращает список, foreach - nil. Разница однако.

Цитата:
Сообщение от puma Посмотреть сообщение
изменить масштаб динамического блока относительно базовой точки, не трогая (так чтобы не менялись) определенные динамические характеристики
Если через ActiveX, то vla-put-scale. А "определенные динамические характеристики" - это какие?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.11.2010, 01:45
#1224
puma


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


например, есть динамический блок разреза, после увеличения он сбивается, что не очень хорошо, чтобы вернуть все назад надо полярному параметру вернуть все обратно. Единственное, что приходит в голову - чтение сначала необходимых значений и после увеличения - снова их установить, просто может есть более простой путь? про vla-put-scale - спасибо, никак не могу в activeX влезть, слишком много там всяких команд
puma вне форума  
 
Непрочитано 25.11.2010, 14:12
#1225
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,536
<phrase 1= Отправить сообщение для wetr с помощью Skype™


Цитата:
Сообщение от puma Посмотреть сообщение
например, есть динамический блок разреза, после увеличения он сбивается
актуальная проблема
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Непрочитано 25.11.2010, 16:01
#1226
Лиспер


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


Лично мне лениво пытаться создать блок, его масштабировать, чего-то там еще делать. Может, puma, будет проще приложить 2 файла - один "что получается", второй - "что должно получиться"?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 25.11.2010, 18:53
#1227
puma


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


мой косяк, что сразу не выложил.
Вложения
Тип файла: dwg
DWG 2007
arh.dwg (114.3 Кб, 3532 просмотров)
puma вне форума  
 
Непрочитано 26.11.2010, 01:14
1 | #1228
Лиспер


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


По идее должно было сработать, но не срабатывает до конца: атрибуты "пляшут".
Код:
[Выделить все]
(vl-load-com)

(defun c:scale-dyn-blocks (/ conv-vla-to-list doc selset scale pt lst)

  (defun conv-vla-to-list (value / res)
    (cond
      ((listp value)
       (mapcar 'conv-vla-to-list value)
       )
      ((= (type value) 'variant)
       (conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (conv-vla-to-list (vlax-safearray->list value))
         ) ;_ end of if
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun


  (vla-startundomark
    (setq doc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if
    (and
      (= (type (setq selset (vl-catch-all-apply
                              (function
                                (lambda ()
                                  (ssget "_:L" '((0 . "INSERT")))
                                  ) ;_ end of lambda
                                ) ;_ end of function
                              ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'pickset
         ) ;_ end of =
      (= (type (setq pt
                      (vl-catch-all-apply
                        (function
                          (lambda () (getpoint "\nБазовая точка <Отмена> : "))
                          ) ;_ end of function
                        ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'list
         ) ;_ end of =
      (= (type
           (setq
             scale (vl-catch-all-apply
                     (function
                       (lambda () (getdist pt "\nМасштаб <Отмена> : "))
                       ) ;_ end of function
                     ) ;_ end of vl-catch-all-apply
             ) ;_ end of setq
           ) ;_ end of type
         'real
         ) ;_ end of =
      ) ;_ end of and
     (progn
       (foreach ent
                (mapcar
                  (function vlax-ename->vla-object)
                  ((lambda (/ tab item)
                     (repeat (setq tab  nil
                                   item (sslength selset)
                                   ) ;_ end setq
                       (setq
                         tab (cons (ssname selset (setq item (1- item)))
                                   tab
                                   ) ;_ end of cons
                         ) ;_ end of setq
                       ) ;_ end of repeat
                     ) ;_ end of lambda
                   )
                  ) ;_ end of mapcar
         (setq
           lst (mapcar
                 (function
                   (lambda (x)
                     (cons (vla-get-propertyname x) (vla-get-value x))
                     ) ;_ end of LAMBDA
                   ) ;_ end of function
                 (conv-vla-to-list
                   (vla-getdynamicblockproperties ent)
                   ) ;_ end of conv-vla-to-list
                 ) ;_ end of mapcar
           ) ;_ end of setq
         (vla-scaleentity ent (vlax-3d-point pt) scale)
         (foreach prop (conv-vla-to-list
                         (vla-getdynamicblockproperties ent)
                         ) ;_ end of conv-vla-to-list
           (vl-catch-all-apply
             (function
               (lambda ()
                 (vla-put-value
                   prop
                   (cdr (assoc (vla-get-propertyname prop) lst))
                   ) ;_ end of vla-put-value
                 ) ;_ end of lambda
               ) ;_ end of function
             ) ;_ end of vl-catch-all-apply
           ) ;_ end of foreach
         ) ;_ end of foreach
       ) ;_ end of progn
     ) ;_ end of if
  (vla-endundomark doc)
  (princ)
  ) ;_ end of defun
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 26.11.2010, 19:10
#1229
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Подскажите, пожалуйста - может у кого была похожая проблема:

в блоке есть атрибут. После вставки программно меняю этому атрибуту выравнивание с "По ширине" на "по центру", и степень растяжения соответственно тоже меняю. И дома и на работе стоит русифицированный АКАД 2009. Если такой модифицированный блок копирую, то при вставке у аргумента выравнивание восстанавливается ("по ширине"), т.е. текст и местоположение атриблута сползают. В АКАДе дома такого не происходит. В чем может быть причина?
Frigate вне форума  
 
Непрочитано 26.11.2010, 19:23
#1230
Кулик Алексей aka kpblc
Moderator

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


Во-первых, меня пугает слово "русифицированный". Во-вторых, читалось ли http://autolisp.ru/2010/04/06/text-and-attrib-entities/ ? В-третьих, как выполняется копирование?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.11.2010, 10:01
#1231
superkot007


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


Нужна помощь...
Есть чертеж, в котором куча блоков. Блоки выполнены в "неправильных" слоях (при вставке такого блока он не будет изменяться, даже если вставлен в другой слой с другим цветом). Это очень затрудняет проверку чертежа на регламентируемые слои... А если чертежей не один и не два, то вообще труба...

Так вот, как перевести выбранные на чертеже блоки в слой "0" со всеми настройками "по слою"???
superkot007 вне форума  
 
Непрочитано 27.11.2010, 10:47
#1232
Кулик Алексей aka kpblc
Moderator

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


http://forum.dwg.ru/showthread.php?t=21492
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.11.2010, 11:37
#1233
superkot007


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Почти то, что нужно... А можно попросить "подправить" код, чтобы был выбор корректируемых блоков (лучше всего - мышкой)? Просто не все блоки в чертеже требуют такого радикального подхода...

Еще просьба... Есть lisp для вставки блоков
Код:
[Выделить все]
(defun block-insert (/ p p1 p4 p5 x1 x2 x3 y3 y4)
  ;ВСТАВКА БЛОКА ДЛИНОЙ 5мм
  (setq p2 (getpoint "\n \n \nВведите центр блока:"))
  (setq p1 (osnap p2 "_nea"))  
  (initget 1 "1 2")
  (setq w (getkword "\n \n \nНаправление отрезка 1 <ГОРИЗ>, 2 <ВЕРТ>:"))
  (if (= w "2")
   (progn
      (setq y3 (- (cadr p1) 2.5))
      (setq p4 (list (car p1) y3))
      (setq y4 (+ (cadr p1) 2.5))
      (setq p5 (list (car p1) y4))
      (command "_break" p4 p5)
      (command "_insert" b p1 "" "" "90")))
  (if (= w "1")
   (progn
      (setq x2 (+ (car p1) 2.5))
      (setq p4 (list x2 (cadr p1)))
      (setq x3 (- (car p1) 2.5))
      (setq p5 (list x3 (cadr p1)))
      (command "_break" p4 p5)
      (command "_insert" b p1 "" "" "")))
)
Как сделать его "проще" по алгоритму:
1. Выбор примитива (так понимаю - функция entsel?)
2. Если примитив является отрезком - точка выбора становится точкой вставки блока (по привязке). Если нет - сообщение о неправильном выборе
3. Если отрезок горизонтальный (координаты Y одинаковые) - вставка без поворота, если вертикальный (координаты X одинаковые) - поворот на 90 градусов.

Последний раз редактировалось superkot007, 27.11.2010 в 11:52.
superkot007 вне форума  
 
Непрочитано 28.11.2010, 11:41
#1234
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(vl-load-com)

(defun insert-block-by-point (block-name / adoc ent pt)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (if (and (tblobjname "block" block-name)
           (= (type (setq ent (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (entsel "\nУкажите отрезок <Отмена> : ")
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'list
              ) ;_ end of =
           (setq pt (vlax-curve-getclosestpointto (vlax-ename->vla-object (car ent)) (cadr ent)))
           (= (cdr (assoc 0 (entget (setq ent (car ent))))) "LINE")
           ) ;_ end of and
    (vla-insertblock (vla-objectidtoobject adoc (vla-get-ownerid (vlax-ename->vla-object ent)))
                     (vlax-3d-point pt)
                     block-name
                     1
                     1
                     1
                     (cond
                       ((equal (cadr (assoc 10 (entget ent)))
                               (cadr (assoc 11 (entget ent)))
                               1e-6
                               ) ;_ end of equal
                        (/ pi 2.)
                        )
                       ((equal (caddr (assoc 10 (entget ent)))
                               (caddr (assoc 11 (entget ent)))
                               1e-6
                               ) ;_ end of equal
                        0.
                        )
                       (t (angle (cdr (assoc 10 (entget ent))) (cdr (assoc 11 (entget ent)))))
                       ) ;_ end of cond
                     ) ;_ end of vla-InsertBlock
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.11.2010, 20:07
#1235
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Кулик Алексей aka kpblc,

1. просто русский Автокад 2009.
2. да, Алексей, это я читал. Именно вычислением я и менял координты точки вставки.
3. КОпирование при помощи обычных Ctrl+C Ctrl+V. На домашнем компе при копировании блоков с измененным выравниванием атрибута все копируется как надо. Т.е. вырвнивание копированной вставки блока не становится изначальным для блока (по ширине). На рабочем компе выравнивание меняется на "по ширине". Но если копировать при помощи команды "кп", то все копируется нормально, без изменений.
Завтра еще раз поэкспериментирую на своем рабочем омпе и на других компах.
Frigate вне форума  
 
Непрочитано 28.11.2010, 20:23
#1236
Кулик Алексей aka kpblc
Moderator

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


Offtop: Frigate, ну ты хоть указывай примерную область поиска вопроса
Update на 2009 установлен? Если да, то на оба компа или как?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.11.2010, 19:30
#1237
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Кулик Алексей aka kpblc,

кажется нет особого глюка. Такой глюк проявился только в одном файле, в других не проявляется - никаким путем не смог этого добиться в других файлах. Завтра скину сам файл, может ты, Алексей, и сможешь выяснить, что там не так.
Frigate вне форума  
 
Непрочитано 29.11.2010, 21:19
#1238
Кулик Алексей aka kpblc
Moderator

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


В таком случае я начинаю подозревать, что либо в блоке есть атрибуты с одинаковыми тэгами, либо определения блоков разнятся. Либо автоматом после вставки выполняется команда _.attsync (или ее аналог)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.11.2010, 21:30
#1239
superkot007


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


Большая просьба - подправить lisp из архива:
- вместо слайдов - файлы dwg
- вставить в чертеж выбираемый элемент...

Да, и что-то я не понял, как его вообще запустить в AutoCAD...
Вложения
Тип файла: rar Book05.rar (183.5 Кб, 78 просмотров)
superkot007 вне форума  
 
Непрочитано 29.11.2010, 21:32
#1240
Кулик Алексей aka kpblc
Moderator

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


А чем не устраивает DesignCenter / _.insert / _.xref ?
__________________
Моя библиотека 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