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

Вернуться   Форум 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.
Просмотров: 1971833
 
Непрочитано 20.05.2014, 17:10
1 | #2181
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от seregabs Посмотреть сообщение
Не разобрался как обратиться сразу к нужному свойству по имени, сделал перебором всех, сработало.
Никак - только можно перебирать не все, а до совпадения, либо до конца - хотя в данном случае можно не париться.
Цитата:
Сообщение от seregabs Посмотреть сообщение
Как бы это упростить?
Да по сути никак - только что лишние переменные создаете (вполне можно применять функции друг к другу) - вот копия с Вашего поста:
Код:
[Выделить все]
(vla-load-com)
(foreach Prop (vlax-Invoke (vlax-ename->vla-object (entlast)) 'GetDynamicBlockProperties)
  (if (= (vla-get-PropertyName Prop) "PosQuan")
    (vlax-put Prop 'Value "11 pos")))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 22.05.2014, 18:23
#2182
Wolkodaw


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


Пытаюсь освоить программирование, не могу понять как загружать в автокад диалоговые окна с расширением dcl, чтобы появилось окно. как загрузить? (файл примера скачал на сайте)
Wolkodaw вне форума  
 
Непрочитано 22.05.2014, 18:35
#2183
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


http://lee-mac.com/dialogposition.html
там и пример диалога, и его загрузки
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 23.05.2014, 20:06
#2184
crux

слаботочка
 
Регистрация: 30.09.2011
Сообщений: 1


Доброго времени суток. Подскажите, пожалуйста:
Есть шаблоны с таблицами, данные в таблицы загружаю через связь с данными из экселя.
В случае, когда текст в ячейке экселя длиннее ячейки када, ячейка меняет высоту, шаблон с настроенными листами плывет и приходится ручками все править, что не очень удобно.
Собственно вопрос: есть ли возможность с помощью лиспа определять ширину строки в таблице и переносить часть текста, не уместившуюся в заданную ширину, ячейкой ниже, возвращая ячейке исходную высоту? Соответственно смещая и весь ниже следующий текст.
В лиспе новичок, но если подскажите где копать, буду очень признателен.
crux вне форума  
 
Непрочитано 23.05.2014, 20:53
#2185
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от crux Посмотреть сообщение
В лиспе новичок, но если подскажите где копать, буду очень признателен
В объектной модели автокада - конкретно в классе AcadTable.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 06.06.2014, 11:48
#2186
WhiteShark


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


Не кидайте помидорами! Лучше подскажите почему не работает такой код
Код:
[Выделить все]
 (defun foo (f x)
  (f x))
(foo 'car '(1 2 3))
Почему error: bad function: CAR ?
WhiteShark вне форума  
 
Непрочитано 06.06.2014, 12:00
#2187
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (defun foo (f x)
 (apply f (list x))
 ) ;_ end of defun
(foo 'car '(1 2 3))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.06.2014, 12:10
#2188
WhiteShark


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


Алексей, спасибо, конечно! Но я пример с car привел просто так. То есть функция передаваемая в качестве параметра в foo должна быть любой и агрумент любой. Тут всё таки вопрос глубже. В теории видимо дело. Правильно ли я понимаю, что при связывании формальных параметров (f x) превращается в (car '(1 2 3))? Должно же быть так? Почему тогда car не находится системой и выдаётся ошибка error: bad function ?
WhiteShark вне форума  
 
Непрочитано 06.06.2014, 12:13
#2189
Кулик Алексей aka kpblc
Moderator

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


Потому что в твоем случае функцию надо применить (т.е. apply) к списку аргументов. Мне так каэцца
P.S. А в чем более общая задача-то состоит?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.06.2014, 12:35
#2190
WhiteShark


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


Общая задача состоит в том, чтобы работал функционал ) То есть функция (foo), одним из параметров которой является функция, передаваемая как параметр. К примеру (foo '+ '(1 2 3)) уже в твоем варианте работать не будет. Я хочу понять, почему правильная синтаксически с точки зрения языка конструкция выдаёт ошибку. Особенность ли это реализации именно AutoLISP'a. Вот тут http://homelisp.ru/help/classic_funct.html#FUNCTION приведен точно такой же пример и он почему то работает. Подозреваю, что _Дима знает ответ )
WhiteShark вне форума  
 
Непрочитано 06.06.2014, 12:48
#2191
Кулик Алексей aka kpblc
Moderator

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


См. в "Библиотеке" функцию dwgru-error-catch и примеры ее использования.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.06.2014, 23:45
#2192
gomer

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


Цитата:
Сообщение от WhiteShark Посмотреть сообщение
конечно!
По хорошему тут следовало бы разобраться что такое квота, функция и символ. Правильно не работает, потому что символ - не функция
Работает так
Код:
[Выделить все]
 (defun foo (f x)
  (f x)
)
(foo car '(1 2 3))
gomer вне форума  
 
Непрочитано 07.06.2014, 07:44
#2193
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от WhiteShark Посмотреть сообщение
Подозреваю, что _Дима знает ответ
Друзья я приболел - и не заглядывал в интернеты, gomer ответил все верно. Первопричина разночтений лежит глубже. Есть два принципиальных отличия в различных диалектах лиспа - это наличие или отсутствие (ну или отсутствия по умолчанию) т.н. замыканий - проще говоря какие значения имен будут использоваться во время выполнения функции - которые заданы на момент ее выполнения, либо которые заданы на момент определения функции (естественно только "внутренних" имен, а не аргументов). У каждого из них свои плюсы и минусы - я однозначный сторонник замыканий, (которые к моему сожалению не поддерживает автолисп), но это только мое мнение. Для того, чтоб частично устранить проблему отсутствия замыканий, там где без них "тяжко" используют "стандартный" прием - передают функцию как символ - которую принимающая функция выполнит посредством (apply ...), но если ей будет необходимо - она сможет ее "замкнуть" посредством парсинга и "подмены" имен на необходимые значения. Этот прием практически не используеться в автолиспе (по крайней мере в сегменте dwg.ru - я не встречал, ну я от безисходности пару раз делал - если не понимать для чего они (замыкания) нужны, то и алгоритм планируешь без них - парадокс Блаба - а испорченным различными знаниями головам - это информация мешает "творить нормально" - извращаются). Отсюда и разница в синтаксисе например CommonLisp и Scheme (mapcar 'fn lst) против (map fn lst).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 07.06.2014, 11:14
#2194
WhiteShark


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


Ну вот ) Мои подозрения в кастирорванности нашего любимого AutoLISPa оправдались (
Спасибо нашему больному Диме_ за ответ! (Чтоб мы все так даже в бреду владели! )
WhiteShark вне форума  
 
Непрочитано 23.06.2014, 19:03
#2195
Wolkodaw


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


Прошу подсказать опытных форумчан как с помощью active x можно изменять свойства динамических блоков (в частности нужно менять длину блока).
Wolkodaw вне форума  
 
Непрочитано 23.06.2014, 20:23
#2196
kakt00z

инженер-проектировщик КИПиА
 
Регистрация: 30.08.2008
Минск
Сообщений: 159


Код:
[Выделить все]
 (defun getbdyn (bl prop /)
  (car
    (vl-remove-if-not '(lambda (x) (= prop (vla-get-PropertyName x)))
      (vlax-safearray->list (vlax-variant-value(vla-GetDynamicBlockProperties bl)))
      )
    )
  );defun
(vla-put-value (getbdyn bl_name prop_name) prop_value)
kakt00z вне форума  
 
Непрочитано 23.06.2014, 20:29
#2197
Кулик Алексей aka kpblc
Moderator

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


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


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


Код:
[Выделить все]
 (vl-cmdf "_.PSPACE")
Подскажите, пожалуйста - как сделать то же самое через vla-put-... (для видового экрана)

Последний раз редактировалось mkung, 24.06.2014 в 12:20.
mkung вне форума  
 
Непрочитано 24.06.2014, 11:49
#2199
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Помогите дураку пожалуйста!
надо сжатие арибутов поменять у блоков. написал так:
Код:
[Выделить все]
 (setq BlkRef (vlax-ename->vla-object (car (entsel "Выбери блок:"))))
(foreach item (vlax-safearray->list  (vlax-variant-value (vla-GetAttributes BlkRef))) (vla-put-ScaleFactor item 0.75))
а этот шедевр меняет только во вхождении блока. Как то же самое сделать в описании блока?
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 24.06.2014, 12:29
#2200
Кулик Алексей aka kpblc
Moderator

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


mkung, а чем не нравится (setvar "ctab")?
Vladimir_Sergeevich, так ты сначала получи указатель на описание блока...
Код:
[Выделить все]
 (defun tt (/ blkref blkdef)
  (if (and (setq blkref (car (entsel "Выбери блок:")))
           (setq
             blkdef (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                              (if (vlax-property-available-p (setq blkref (vlax-ename->vla-object blkref)) 'effectivename)
                                (vla-get-effectivename blkref)
                                (vla-get-name blkref)
                                ) ;_ end of if
                              ) ;_ end of vla-item
             ) ;_ end of setq
           ) ;_ end of and
    (vlax-for ent blkdef
      (if (and (wcmatch (strcase (vla-get-objectname ent) "*ATTR*"))
               (vlax-property-available-p ent 'scalefactor)
               ) ;_ end of and
        (vla-put-scalefactor ent 0.75)
        ) ;_ end of if
      ) ;_ end of vlax-for
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека 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