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

Вернуться   Форум 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.
Просмотров: 2049717
 
Непрочитано 20.03.2009, 11:00
#661
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Ещё вопрос от чайника. Почему не работает (command "_VLIDE") ?
Цитата:
Команда: (command "_VLIDE")
_VLIDE Неизвестная команда "VLIDE". Для вызова справки нажмите F1.

Команда: nil
Makswell вне форума  
 
Непрочитано 20.03.2009, 13:04
#662
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Makswell, Через command вызываются стандартные команды, остальные как функции с префиксом C:
Пример:
(C:VLIDE)
(C:КАЛЬК)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 20.03.2009, 13:15
#663
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Ага. Понятно. Спасибо за ответ.
Makswell вне форума  
 
Непрочитано 23.03.2009, 15:00
#664
acyxou


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


Ребят, срочно надо, а времени изучать нет... подскажите, пожалуйста, как в лиспе извлечь выражение только если несколько условий выполняются. С помощью какой функции?
Мне, например, нужно подгрузить пользовательское меню только в том случае, если оно не подгружено (not (menugroup "Bla-bla")) и если cui-файл с заданным именем находится в путях поиска support files (findfile "Bla-bla.cui").

И еще попутный вопрос: сделал redefine сомманды _qsave так, чтоб сначала выполнялся сброс масштабов (-scalelistedit), а затем уже .qsave. Так вот, се работает прекрасно если чертеж не новый. Т.е. если создать новый чертеж и воспользоваться этой коммандой чтоб впервые его сохранить и присвоить ему имя, то чертеж не сохраняется, точнее переменная Filedia слетает в ноль и просит вручную прописать путь и имя файла. Что с этим делать, никто не знает?
__________________
Users are not stupid, they are busy.

Последний раз редактировалось acyxou, 23.03.2009 в 16:40.
acyxou вне форума  
 
Непрочитано 23.03.2009, 15:11
#665
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Цитата:
Сообщение от acyxou Посмотреть сообщение
Ребят, срочно надо, а времени изучать нет... подскажите, пожалуйста, как в лиспе извлечь выражение только если несколько условий выполняются. С помощью какой функции?
Мне, например, нужно подгрузить пользовательское меню только в том случае, если оно не подгружено (not (menugroup "Bla-bla")) и если cui-файл с заданным именем находится в путях поиска support files (findfile "Bla-bla.cui").
Код:
[Выделить все]
(and (not (menugroup "Bla-bla")) (findfile "Bla-bla.cui"))
Makswell вне форума  
 
Непрочитано 23.03.2009, 15:35
#666
acyxou


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


Makswell спасибо! Работает!!! А то я уже и while и cond и if перепробовал в разных связках... хотя понимал, что нужно and юзать, но в каком ключе не догадывался... Спасибо еще раз!
__________________
Users are not stupid, they are busy.
acyxou вне форума  
 
Автор темы   Непрочитано 13.04.2009, 00:09
#667
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


Наконец то на работе смягчился “каторжный режим” и есть чуток времени чтоб продолжить изучение лиспа. Продолжаю писать код для создания ведомости расхода стали при применении SPEC5D от VVA. Застрял на элементарном с первого взгляда вопросе.
Имею лист такого рода.
Код:
[Выделить все]
(((Арматура АII (ГОСТ 5781-82 (Арматура d= 3 1.1) (Арматура d= 4 1.98))) 
(Арматура АI (ГОСТ 5781-82 (Арматура d= 3 1.1) (Арматура d= 4 1.98)))) 
((Арматура АIII (ГОСТ 5781-82 (Арматура d= 5 3.08)))))
Элементов в каждых из красных скобок может быть сколько угодно, да и красных скобок тоже.
Требуется убрать красные скобки, чтобы лист стал таким
Код:
[Выделить все]
((Арматура АII (ГОСТ 5781-82 (Арматура d= 3 1.1) (Арматура d= 4 1.98))) 
(Арматура АI (ГОСТ 5781-82 (Арматура d= 3 1.1) (Арматура d= 4 1.98))) 
(Арматура АIII (ГОСТ 5781-82 (Арматура d= 5 3.08))))
Подскажите пожалуйста как.
Ясно что нужно оперировать mapcar, но я не знаю как вернуть содержимое листа без скобок. То есть не знаю как имея это
Код:
[Выделить все]
((Арматура АII (ГОСТ 5781-82 (Арматура d= 3 1.1) (Арматура d= 4 1.98))) 
(Арматура АI (ГОСТ 5781-82 (Арматура d= 3 1.1) (Арматура d= 4 1.98)))) 
Вернуть в функции это
Код:
[Выделить все]
(Арматура АII (ГОСТ 5781-82 (Арматура d= 3 1.1) (Арматура d= 4 1.98))) 
(Арматура АI (ГОСТ 5781-82 (Арматура d= 3 1.1) (Арматура d= 4 1.98)))
Заранее спасибо.
__________________
Блог

Последний раз редактировалось Red Nova, 13.04.2009 в 00:16.
Red Nova вне форума  
 
Непрочитано 13.04.2009, 08:29
#668
Кулик Алексей aka kpblc
Moderator

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


Это так?
Код:
[Выделить все]
(apply 'append
       '(
         (
          ("Арматура АII" ("ГОСТ 5781-82" ("Арматура d=" 3 1.1) ("Арматура d=" 4 1.98)))
          ("Арматура АI" ("ГОСТ 5781-82" ("Арматура d=" 3 1.1) ("Арматура d=" 4 1.98)))
          )
         (
          ("Арматура АIII" ("ГОСТ 5781-82" ("Арматура d=" 5 3.08)))
          )
         )
       ) ;_ end of apply
Ты бы хоть выделял строки в кавычки, что ли
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.04.2009, 14:03
#669
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
Имею лист такого рода.
Да и пиши либо список либо list а то мой мозг чуть не с фаталил...
Sleekka вне форума  
 
Автор темы   Непрочитано 14.04.2009, 00:12
#670
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


Кулик Алексей aka kpblc, Спасибо, именно то.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 25.04.2009, 19:28
#671
Eximius

аспирант
 
Регистрация: 17.12.2008
Волгоградская область
Сообщений: 49
Отправить сообщение для Eximius с помощью Skype™


Подскажите где взять информацию по тегам (как это правильно называется не знаю может и не теги) у примитива mtext.
Пример: создаю mtext не пргограмно с текстом ω в степени 3, далее (entget (entlast)) и вот что мне возвращается
Код:
[Выделить все]
(.......................
(1 . "\\A1;{\\H0.875x;ω\\H0.7x;\\S3^;}") ....................)
Символ можно заменить в visual lisp на его код вот так \U+03C9.
\\H0.7x;\\S - это как я понял тег для индексов, дробей и прочего, создаваемого кнопкой stack.
Где взять полный список вот таких тегов (или не тегов)?

Последний раз редактировалось Eximius, 25.04.2009 в 19:48.
Eximius вне форума  
 
Непрочитано 25.04.2009, 23:12
#672
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


http://forum.dwg.ru/showthread.php?t=12717
http://docs.autodesk.com/ACD/2010/EN...mber=d0e123454
В справке раньше (по моему в 2004) была прямо таблица. В 2008 быстро не нашел
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 26.04.2009, 00:45
#673
Eximius

аспирант
 
Регистрация: 17.12.2008
Волгоградская область
Сообщений: 49
Отправить сообщение для Eximius с помощью Skype™


Благодарю, VVA.
А возможно ли создать индекс у индекса или индекс у числа, стоящего в числителе или знаменателе такой дроби \S../..; ?
Eximius вне форума  
 
Непрочитано 27.04.2009, 11:01
#674
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Подскажите пожалуйста, как программно команде Offset показать, что новый контур нужно выполнить внутри фигуры?

(command _offset "10" object <здесь требуется указать направление вставки> "_e")
alex8888 вне форума  
 
Непрочитано 27.04.2009, 11:21
#675
ShaggyDoc

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


Цитата:
Сообщение от alex8888 Посмотреть сообщение
Подскажите пожалуйста, как программно команде Offset показать, что новый контур нужно выполнить внутри фигуры?

(command _offset "10" object <здесь требуется указать направление вставки> "_e")
Выражаться надо терминами, а то "объект", "контур", "фигура" не способствуют пониманию.

Примерно так - для примитива:
Код:
[Выделить все]
(vl-cmdf
         "_.OFFSET"
         dist ;;Расстояние - число
         (list примитив точка_на примитиве_в_ПСК)
         точка_в_направлении_смещения ;; высчитать предварительно
         ""
)
Или вот так - объектным методом
Код:
[Выделить все]
(defun ru-obj-ent-offset (some dist)
 ;|
Аргументы:
some - примитив или объект
dist - величина смещения, при смещении отрицательном - влево, при положительном - вправо от направления линии

Возвращает Variant (array of objects) - созданных новых объектов.
|;
  (ru-error-catch
    (function
      (lambda ()
        (cond
          ((= 'vla-object (type some))
           (vla-offset some dist)
          )
          ((= 'ename (type some))
           (vla-offset (vlax-ename->vla-object some) dist)
          )
        ) ;_ end of cond
      ) ;_ end of lambda
    ) ;_ end of function
    (function (lambda (msg)
                (princ (strcat "\nRU-OBJ-ENT-OFFSET: " msg))
                nil
              ) ;_ end of lambda
    ) ;_ end of function
  ) ;_ end of ru-error-catch
)
ShaggyDoc вне форума  
 
Непрочитано 27.04.2009, 13:04
#676
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


ShaggyDoc, большое спасибо за помощь. Тогда у меня вопрос конкретно по моему лиспу

Имеею: (фунцкцию error пока не задействовал)

(defun clate (/ *error* oldosm oldlay pl_1 pl_2)
;******* funktion error
(defun *error*(msg)
(princ msg) ;text bei error
(if oldosm (setvar "OSMODE" oldosm)) ;if oldosm - zadano -> oldosm=oldosm
(if oldalay (setvar "CLAYER" oldlay));if layer gewechselt -> zurück
); end of *error*
;***************

(initget 7)
(setq pl_L (getreal "\nLänge: ")) ;get Länge (длина рамки)
(initget 7)
(setq pl_B (getreal "\nBreite: ")) ;get Breite (ширина рамки)

(setq pl_1 (getpoint "\nInput Start Point: ")) (начальная точка)

(setq pl_2 (list (+ (car pl_1) pl_L)(+ (cadr pl_1) pl_B))) ;upper right point (верхний правый угол)
(setq pl_o (list (+ (car pl_1) 10.0)(+ (cadr pl_1) 10.0))) ;lower left point für offset (точка для оффсета)

(setq pl_rahmen (ssadd)) ; задание пустого набора

(command "_.rectangle" pl_1 pl_2 "") ; вырисовка прямоугольной рамки
(ssadd (entlast) pl_rahmen) ; добавление рамки в набор
(command "_.chprop" "_last" "" "_layer" "SF-RAHMEN" "_c" "_bylayer" "") ; смена цвета и уровня
(command "_.offset" "-t" pl_rahmen pl_o "_e") ; а вот здесь засада - никак не дойду как , надо просто отрисовать прямоугольник (пока) внутри моего уже нарисованного

(princ)


);end defun

пробовал также так:
(command "_offset" "10" pl_rahmen "1" ""), но как указать направление?

С уважением, Александр
alex8888 вне форума  
 
Непрочитано 27.04.2009, 14:59
#677
ShaggyDoc

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


alex8888, ну зачем так-то, "молекулы на атомы" разлагать, а потом снова их синтезировать:
(setq pl_2 (list (+ (car pl_1) pl_L)(+ (cadr pl_1) pl_B)))

Используй функцию polar, и все проблемы пропадут, например
Код:
[Выделить все]
(setq pl_2 (polar pl_1 0 pl_L))
Не рисуй прямоугольники командой RECTANGLE - она не для программистов. Всё равно создается полилиния, вот и используй PLINE - точки можно какие угодно задавать. Точки высчитаешь функцией polar. Ей же высчитаешь любую точку, в том числе внутри контура. И внимательно читай тему - про отключение объектных привязок.
ShaggyDoc вне форума  
 
Непрочитано 27.04.2009, 15:08
#678
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


alex8888,
1. Не обрабатываешь привязку (грабли №1)
2. В команде _rectangle лишняя ""
3. Нет необходимости создавать набор
4. Команде OFFSET нужно передавать список такой же, какой возвращает (entsel), т.е. (имя_примитива точка_выбора)
5. Середина диагонали прямоугольника всегда лежит внутри этого прямоугольника
Код:
[Выделить все]
(command "_.rectangle"
 "_non"        ;;; см. №1
pl_1 
"_non"          ;;; см. №1
 pl_2
                  ;;; см. №2
) ; вырисовка прямоугольной рамки
(command "_.chprop" "_last" "" "_layer" "SF-RAHMEN" "_c" "_bylayer" "") ; смена цвета и уровня
(command "_.offset" 10
	 (list (entlast) pl_1)  ;;; см. №4
	 "_non"                   ;;; см. №1
	 (polar pl_1              ;;; см. №5
		(angle pl_1  pl_2)
		(* 0.5 (distance pl_1 pl_2)))
	 ""
	 )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 27.04.2009, 15:14
#679
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


ShaggyDoc,

я пытался использовать _.pline, но без polar (что то его не совсем понял), бывает путаюсь в углах. И вот там нужно сперва каждую точку высчитать, а _rectangle только двумя, вот бес и попутал ее взять.
А чем плоха команда _rectangle для программистов? И можно ли использовать команды из механикла (типа AMRECT.... тыры-пыры)?
2. Отключение объектных привязок - сохранение-сбрасывание в 0 и восстановление "osmode" достаточно? Или еще какая переменная важна?

Участок кода отрисовки, так?

(setq pl_1 (getpoint "\nInput Start Point: "))

(setq pl_2 (polar pl_1 0 pl_L))
(setq pl_3 (polar pl_2 (/ pi 2) pl_B))
(setq pl_4 (polar pl_3 pi pl_L))

(command "_.pline" pl_1 pl_2 pl_3 pl_4 "_c" "")


VVA,
спасибо.
Именно про синтаксис offset я и пытался выяснить. Тяжело изучать Lisp работая в немецкой версии Autocad Mechanical (2009-2010), книжки на русском, помощь по лиспу на английском, команды все тоже надо с немецкого переводить. В справке ничего нет, там только типа выбрать мышкой и ткнуть туда то. Все опции приходится искать методом тыка.

Что касается отступа для offset, то я его попытался прописать так:

(setq pl_o (polar pl_1 (/ pi 4) (* 10 (sqrt 2.0))))
(vl-cmdf "_.offset" 10 pl_rahmen pl_o "")

Как ни странно, сработало. Может з переляху?

Последний раз редактировалось alex8888, 27.04.2009 в 16:22. Причина: дополнение
alex8888 вне форума  
 
Непрочитано 27.04.2009, 19:44
#680
ShaggyDoc

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


alex8888, polar одна из самых необходимых функций. Синтаксис простой:
(polar известная_точка угол_в_радианах расстояние)
Возвращает точку, расположенную на расстояние от известная_точка по направлению угол_в_радианах.

RECTANG - это команда-обертка (так же как и POLYGON, DONUT). Она создает полилинию, причем опции этой команды уже менялись неоднократно. Используя RECTANG можешь рисовать только прямоугольник, и только в ПСК. Это частные случаи. А может быть и "кривоугольник" и различные контуры. И под разными углами поворота. Учиться надо сразу правильно.

Даже для прямоугольника координаты всех точек через polar высчитать проще, чем одной противоположной точки добавлением ординат.
ShaggyDoc вне форума  
Ответ
Вернуться   Форум 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