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

Вернуться   Форум 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.
Просмотров: 1972345
 
Непрочитано 30.11.2014, 21:06
#2361
Кулик Алексей aka kpblc
Moderator

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


Насколько я помню, ключ "_А" давал автоматическую фильтрацию по текущему пространству...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.11.2014, 21:25
#2362
Сергей812


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


к сожалению-не похоже... но в любом случае, минимум два варианта решения данной задачи есть - твой с удалением лишнего из набора и мой с перебором в цикле.. и можно двигаться дальше)
Сергей812 вне форума  
 
Непрочитано 01.12.2014, 01:43
#2363
Дима_

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
если переменная для хранения набора локальная - то при выходе из функции ей автоматически будет присвоено значение nil
При очередном вызове сборщика мусора (прямом или автоматическим).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 01.12.2014, 08:01
#2364
VVA

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Разобрался вроде - оказалось, ssget "_X" работает не с активной вкладкой, а со всем чертежом. И возвращает набор из всех блоков основной надписи во всех листах. Соответственно, всегда получал координаты только первого блока вне зависимости от активной вкладки. Как вариант - можно было делать проверку не только на имя блока, но и выдергивать из 410 группы название листа и сравнивать с ( getvar "CTAB").
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Если надо обрабатывать только текущее пространство, попробуй ключ _A для ssget.
Ничего не мешает указать текущее пространство в фильтре выбора ssget. Или я чего-то не понял?
Код:
[Выделить все]
(setq ssblk (ssget "_X" (list(cons 0 "INSERT")(cons 410 (getvar "CTAB")))))
и все в текущем пространстве
Код:
[Выделить все]
(setq currlay (ssget "_X" (list(cons 410 (getvar "CTAB")))))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 01.12.2014, 10:04
#2365
Кулик Алексей aka kpblc
Moderator

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


VVA, кажется, в каких-то версиях AutoCAD ключ "_А" обрабатывал именно текущее пространство. Похоже, я ошибался
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.12.2014, 10:44
#2366
Сергей812


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Ничего не мешает указать текущее пространство в фильтре выбора ssget. Или я чего-то не понял?
Код:
[Выделить все]
(setq ssblk (ssget "_X" (list(cons 0 "INSERT")(cons 410 (getvar "CTAB")))))
и все в текущем пространстве
У меня была подобная мысль. Сварганил лиспик для проверки вида:
Код:
[Выделить все]
(defun c:TestSSGet3 ( / lSetBlk1 lSetBlk2)
  (setq lSetBlk1 (ssget "_X" (list (cons 0 "INSERT") (cons 410 (getvar "CTab")))))
  (setq lSetBlk2 (ssget "_X" (list(cons 0 "INSERT"))))
  (princ (strcat "\nWith DFX 410 = " (itoa (sslength lSetBlk1)) "  Without DFX 410" (itoa (sslength lSetBlk2)) ))
  (princ)
)
работает вроде)
Сергей812 вне форума  
 
Непрочитано 06.12.2014, 15:47
#2367
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


Здравствуйте!
Как же тяжело и долго даётся мне visual lisp, с autolisp было немного попонятней.
Будьте добры подскажите, как сделать предпоследнее выражение, оно пропущено в коде
Заранее спасибо,
Код:
[Выделить все]
 (vl-load-com)

(vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
) ;_ end of vla-StartUndoMark

; запоминаем текущий слой
(setq altlayer (getvar "clayer"))
; создаем уникальный слой для помещения в него создаваемых примитивов
(entmake '((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "_LVR_") (70 . 0) (62 . 41) (6 . "Continuous")))
; делаем активным слой _LVR_
(vla-get-ActiveLayer actdoc)
(vla-put-ActiveLayer actdoc (vla-Item (vla-get-Layers actdoc) "_LVR_"))
; чертим отрезок
(setq obj (vla-get-ModelSpace actdoc))
(vla-AddLine obj (vlax-3D-point -0.5 0.0 0.0) (vlax-3D-point -1.0 0.0 0.0))
; делаем активным первый слой
(setvar "clayer" altlayer)
; создаем блок
(setq block (vla-Add (vla-get-Blocks actdoc) (vlax-3D-point 100.0 100.0 0.0) "_Nude"))
; помещаем все примитивы в слое _LVR_ в набор
(setq actsel (vla-get-ActiveSelectionSet actdoc) tmp nil)
(vla-Clear actsel) ; очистка набора
(vla-Select actsel acSelectionSetAll nil nil 
	(vlax-safearray-fill (vlax-make-safearray vlax-vbInteger '(0 . 1)) '(0 8))
	(vlax-safearray-fill (vlax-make-safearray vlax-vbVariant '(0 . 1)) '("Line" "_LVR_"))) ; добавление объектов в набор
; затем нужно всем отрезкам в наборе по очереди присвоить слой 0, как это сделать ? его знает
	
; помещаем все примитивы набора в блок
(setq temp (vla-CopyObjects actdoc (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbObject (cons 0 (1- (vla-get-Count actsel)))) (vlax-for x actsel (setq tmp (cons x tmp))))) block 'idpairs))

(vla-endundomark adoc)
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 06.12.2014, 16:07
#2368
Сергей812


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


ну насколько понимаю, надо типа

Код:
[Выделить все]
(vlax-for lItem actsel (vla-put-Layer lItem "0"))
Сергей812 вне форума  
 
Непрочитано 06.12.2014, 16:23
#2369
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


Сергей812, огромное спасибо
Вы сэкономили мне несколько часов поисков .
Вот изобретаю свой велосипед лиспик для программного создания блоков.
Понимаю что есть уже готовые лиспы, но разбираться в них не позволяет мой уровень знаний.
На основе него планирую создание полноценного блока.
Этот блок (так то он стандартный "_Dot", но хочу его создавать программно) в свою очередь будет учавствовать в программном создании стиля мультивыноски (код подсмотрел у А. Кулика).
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 06.12.2014, 16:33
#2370
Сергей812


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


А чего искать? Если надо перебрать все элементы в наборе - то нужен цикл, для activeX это обычно vlax-for. А работа с свойствами примитива - vla-put-%Имя свойства% (установка) или vla-get-%Имя свойства% (получение).

----- добавлено через ~16 мин. -----
И чего то меня терзают смутные сомнения - а нельзя ли добавлять сразу в набор при программном рисовании примитивов? Тогда не надо вспомогательного слоя создавать, делать потом выборку.. Сохранил текущий слой, переключился в нулевой...
Сергей812 вне форума  
 
Непрочитано 06.12.2014, 19:01
#2371
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


Сергей812, да можно и сразу добавлять, в обычном лиспе я бы так и сделал, но в методах ActiveX вообще не силен.
Полещука почитываю, но тяжко даётся.
Поэтому и хотя бы как-нибудь нужно было поместить в набор, благо в этом же учебнике примеры на глаза с vla-Select с выбором по слою попались.

Вот в учебнике есть это, но не расписано, что и для чего, какие массивы и по какому принципу создаются, инфа скудная увы,
(vla-Select actsel acSelectionSetAll nil nil
(vlax-safearray-fill (vlax-make-safearray vlax-vbInteger '(0 . 1)) '(0 8))
(vlax-safearray-fill (vlax-make-safearray vlax-vbVariant '(0 . 1)) '("Line" "_LVR_")))
Буду потихоньку разбираться, считаю все-таки у vlisp плюсов больше по сравнению с lisp.
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 08.12.2014, 12:32
#2372
Vladimir_Sergeevich

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


В продолжение темы о блоках. я делал _ArchTick через dxf.
Код:
[Выделить все]
 (if (not (tblobjname "block" "_ArchTick"))  ;создание блока стрелки если его нет в чертеже
(progn
;create block begin
(entmakex (list
	(cons 0 "BLOCK") 
	(cons 100 "AcDbEntity") 
	(cons 100 "AcDbBlockBegin") 
	(cons 2 "_ArchTick");name block
	(list 10 0.0 0.0 0.0);base coord 
	(cons 70 0)
	);end list
	);end entmake

	;create pline
	(entmakex (list
	(cons 0 "LWPOLYLINE") 
	(cons 100 "AcDbEntity") 
	(cons 100 "AcDbPolyline")
	(cons 6 "ByBlock");linetype
	(cons 8 "0");layer
	(cons 62 0)
	(cons 90 2)
	(cons 70 0) 
	(cons 43 0.15) 
	(list 10 -0.5 -0.5) 
	(cons 40 0.15) 
	(cons 41 0.15) 
	(cons 42 0.0)
	(cons 91 0) 
	(list 10 0.5 0.5) 
	(cons 40 0.15) 
	(cons 41 0.15) 
	(cons 42 0.0)
	(cons 91 0) 
	;(list 210 0.0 0.0 1.0)
	);end list
	);end entmake
	
	;endblk
	(entmakex (list
	(cons 0 "ENDBLK") 
	(cons 100 "AcDbEntity") 
	(cons 100 "AcDbBlockEnd")
	);end list
);end entmake
);end progn
);end if
Собственно создается описание блока, без предварительной отрисовки элементов.
А сейчас возник вопрос: насколько будет жизнеспособно создание полилинии методами activx (и, скажем, не только их), сохранив границы описания блока в dxf? или я уже слишком размечтался...
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 11.12.2014, 11:27
#2373
Curiosity

Конструктор
 
Регистрация: 10.03.2014
Якутск
Сообщений: 18


Здравствуйте!
Помогите разобраться с рекурсией
Помогите написать рекурсивную функцию для такого уравнения.
Миниатюры
Нажмите на изображение для увеличения
Название: Безимени-1.jpg
Просмотров: 41
Размер:	30.2 Кб
ID:	140424  
Curiosity вне форума  
 
Непрочитано 11.12.2014, 12:00
#2374
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


ну как сказано, так и написано
Код:
[Выделить все]
 
((eval (setq ksicir (function (lambda () (/ (+ N (* Rb A (/ (sin (* 2 pi ((eval ksicir)))) (* 2 pi)))) (+ (* Rb A) (* Rs Astot))))))))

Последний раз редактировалось ciril, 11.12.2014 в 12:21.
ciril вне форума  
 
Непрочитано 11.12.2014, 12:21
#2375
Curiosity

Конструктор
 
Регистрация: 10.03.2014
Якутск
Сообщений: 18


А как условие остановки написать? Я этого не могу понять
И какое значение при первом проходе вместо ksicir поставляется? И как осуществляется поиск решения?
Мне кажется нужно написать условие типа ksicir(i-1) не должно отличаться от ksicir(i) больше чем на 0.001
Curiosity вне форума  
 
Непрочитано 11.12.2014, 12:23
#2376
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


ну как бы да, нужно написать условия, что характерно, тебе их нужно написать так же, как написал само уравнение
и начальное значение бы пригодилось. как и значения констант.
ciril вне форума  
 
Непрочитано 11.12.2014, 15:44
#2377
Кулик Алексей aka kpblc
Moderator

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


Curiosity, почитай разбор рекурсии: http://elpanov.com/index.php?id=10
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.01.2015, 22:36
#2378
voron83

Геодезист
 
Регистрация: 09.02.2012
Сергиев Посад
Сообщений: 6


Здравствуйте люди добрые.
Вот и я пришел к мысли что нужно изучать лисп, т.к. пользуюсь автокадом давно вот и решил разобраться и начать писать программки для себя. Пока я лиспе полный "0"
Поставил перед собой задачу, наверное для ГУРУ это простая задача, написать лисп который вычитает,или складывает из одного числа, записанного как текст, другое число, также текст. Результат действия третье число. тоже текст.
Алгоритм действия пользователя:
1 Тыкаю мышкой на первое число
2 выбираю действие (+ или -)
3 Тыкаю мышкой на второе число
4 Тыкаю мышкой куда нужно поставить результат

Так вот первая проблема это как переменной задать выбранное число? Не допру какая функция отвечает за "тык мыши"?
voron83 вне форума  
 
Непрочитано 07.01.2015, 22:38
#2379
Кулик Алексей aka kpblc
Moderator

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


Тебе не "тык мышой" надо, а получение примитива. entsel в помощь.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.01.2015, 22:40
#2380
voron83

Геодезист
 
Регистрация: 09.02.2012
Сергиев Посад
Сообщений: 6


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Тебе не "тык мышой" надо, а получение примитива. entsel в помощь.
Буду изучать. Спасибо.
voron83 вне форума  
Ответ
Вернуться   Форум 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