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

Вернуться   Форум 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.
Просмотров: 1971794
 
Непрочитано 31.07.2008, 11:22
#261
ShaggyDoc

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


Цитата:
Пока я справлял день рождения вы ушли вперед. Будем догонять
Так не пойдет. Забудь про ДР пока. Хотя, при желании и приложении собственных усилий можно и за месяц во всем разобраться.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 31.07.2008, 11:24
#262
Red Nova

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


VVA
Цитата:
ты ДВАЖДЫ нарушил п.2 правил В локализованной версии работать не будет.
С "red" я думал что так и надо. Не знал что и на цвета распространяется. А вот с "ltype" проглядел.
Цитата:
Тип линии слою мы не задаем
Это kpblc добавил к заданию.
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 31.07.2008, 11:28
#263
Red Nova

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


ShaggyDoc,
К примеру с bool мне точно самому не разобраться.
__________________
Блог

Последний раз редактировалось Red Nova, 31.07.2008 в 11:36.
Red Nova вне форума  
 
Автор темы   Непрочитано 31.07.2008, 11:36
#264
Red Nova

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


VVA,
Вот вариант с ssadd
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base R rotated_object selection1 oldOSM OldLAY)

 (defun *error*(msg) 
 (princ msg) ; Отменено пользователем
 (if oldOSM (setvar "OSMODE" oldOSM)) 
 ) 

 (setq OldLAY (getvar "clayer"))

 (setq oldOSM (getvar "osmode"))

 (setvar "osmode" 0)

 (initget 7)
 (setq dimensionX (getreal "Введите ширину колонны: "))
 (initget 7)
 (setq dimensionY (getreal "Введите толщину колонны: "))
 (setq base 
    (cond
         ((getpoint "\Введите точку вставки колонны <0,0,0> :"))
         (t '(0. 0. 0.)))
     ) 
 (setq pt1
     ( list ( - ( car base ) ( / dimensionX  2.0 ) )
            ( - (cadr base ) ( / dimensionY  2.0 ) )
     )
 )
 (setq pt2
     ( list ( - ( car base ) ( / dimensionX  2.0 ) )
            ( + (cadr base ) ( / dimensionY  2.0 ) )
     )
 )
 (setq pt3
     ( list ( + ( car base ) ( / dimensionX  2.0 ) )
            ( + (cadr base ) ( / dimensionY  2.0 ) )
     )
 )
 (setq pt4
     ( list ( + ( car base ) ( / dimensionX  2.0 ) )
            ( - (cadr base ) ( / dimensionY  2.0 ) )
     )
 )

 (Setq  R  ( / dimensionX  2.0 ))

 (setq selection1 (ssadd)) 

 (command "_-layer" "_make" "Колонны" "_color" "_red" "" "")

 (command "_pline" pt1 pt2 pt3 pt4 "_c")

 (Setq rotated_object (entlast))

 (ssadd (entlast) selection1)

 (command "_circle" base R)

 (ssadd (entlast) selection1)

 (command "_chprop" selection1 "" "_color" "blue" "")

 (command "_rotate" rotated_object "" base pause)

 (setvar "clayer" OldLAY)

 (setvar "osmode" oldOSM)
)
Догнал таки
__________________
Блог
Red Nova вне форума  
 
Непрочитано 31.07.2008, 12:17
#265
VVA

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


Цитата:
Сообщение от andery Посмотреть сообщение
Почему? Если у нас уже существовал слой "колонна" с другим типом линии, а нам надо тип линии "continuous", то если не задавать тип линии - тип будет такой как был у существовавшего слоя колонна.
В принците это зависит от ТЗ.
Цитата:
Можна усложнять дальше...
Будем разбираться с блоками.
Задание:
1.Колонну (круг исключаем) создадим ввиде блока и вставлять будем блоком.
2.Блок Колонна будет размером 1x1, при вставке длину и ширину будем задавать ввиде масштабных коэффициентов по X и Y.
3. Все элементы блока создаются цветом, типом, весом линии "ПОБЛОКУ" на слое "0"
4. Сам блок вставляется на слой "Колонна"
Алгоритм
1. Проверить существование блока "Колонна"
(функия tblsearch таблица "BLOCK", Перечень всех таблиц см. tblnext)
2. Если блока нет, то отрисовать блок в точке 0,0 с учетом п.2 и п.3 и создать определение блока (команда _-BLOCK
3. Запросить длину и ширину колонны
4. Создать слой "Колонна"
5. Вставить блок Колонна с маштабами X=Длина Y=Ширина. Запросить точку и угол поворота у пользователя. (Команда _-INSERT)
Обращаю внимание: Точку вставки запрашиваем не getpoint, а командой _insert. При этом блок с указанными размерами должен "висеть" на курсоре и ждать своей дальнейшей участи.
6. Восстановить все по как было
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 31.07.2008 в 16:43.
VVA вне форума  
 
Автор темы   Непрочитано 31.07.2008, 12:47
#266
Red Nova

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


VVA,
Я правильно понял, это уже DXF Reference?
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 31.07.2008, 14:03
#267
Red Nova

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


Пока понял только что можно искать так
Код:
[Выделить все]
 (tblsearch "block" "Колонна")
Вернет либо nil либо что-то запутанное.
Как на if повесить возвращенный nil не знаю.
И что вернет если не nil.
Из хелпа
Цитата:
Например:
(tblsearch "style" "standard") устанавливает стиль текста

может вернуть:
((0 . "STYLE") тип символа
(2 . "STANDARD") имя символа
(70 . 0) флажки
(40 . 0.000000) фиксирование высоты
(41 . 1.000000) фактор ширины
(50 . 0.000000) угол
(71 . 0) генерирование флажков
(3 . "txt") самый первый font file
(4 . "") большой font file
)

Порядок вводов восстановлен из TBLNEXT без воздействия функции TBLSEARCH.
Что значет тут высказывание "может вернуть"? От чего зависит это "Может"? Что если мне нужно только одна строка из выше приведенных, или вовсе если нужно только два варианта T и nil.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 31.07.2008, 14:15
#268
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Я правильно понял, это уже DXF Reference?
Полагаю, что пока задача оперирования DXF не ставилась - по крайней мере, описанное задание вполне решается в рамках командного стиля.

Цитата:
Сообщение от Red Nova Посмотреть сообщение
Пока понял только что можно искать так
Код:
[Выделить все]
 (tblsearch "block" "Колонна")
Вернет либо nil либо что-то запутанное.
Как на if повесить возвращенный nil не знаю.
И что вернет если не nil.
Собственно тебе и надо выяснить nil вернётся или нет. В АвтоЛИСПе if любое не nil значение трактует, как тру, т.е.:
Код:
[Выделить все]
(if (tblsearch "block" "Колонна")
  (действие1)
  (действие2)
)
выполнит (действие1) при наличии блока "Колонна" и (действие2) в его отсутствие.

Если tblsearch возвращает не nil, то как раз это и есть DXF описание искомого объекта. Правда описание неполное и пригодное не для всего, но в данном случае это не существенно.
Alaspher вне форума  
 
Автор темы   Непрочитано 31.07.2008, 14:45
#269
Red Nova

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


Alaspher, Спасибо.

Застрял на задании типа линии по блоку. В диалоге -layer не принимает ввод byblock.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 31.07.2008, 14:52
#270
Кулик Алексей aka kpblc
Moderator

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


Создать слой с типом линии "ByBlock" или "ByLayer" можно (чисто программно), но устойчивость AutoCAD'a в таком случае оставляет желать лучшего
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.07.2008, 14:55
#271
Red Nova

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


Как же быть тогда с заданием от VVA?
Цитата:
Все элементы блока создаются цветом, типом, весом линии "ПОБЛОКУ" на "0"
__________________
Блог
Red Nova вне форума  
 
Непрочитано 31.07.2008, 15:00
#272
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Придётся воспользоваться командой "_chprop" или _-linetype (если для типа линий) алгоритм, при использовании этих команд, будет разный, но результат может быть одинаковым.
Alaspher вне форума  
 
Автор темы   Непрочитано 31.07.2008, 15:30
#273
Red Nova

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


Ну тогда так. (может и не совсем в том порядке, что просил VVA, но работает)
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base oldOSM OldLAY)

 (defun *error*(msg) 
 (princ msg) ; Отменено пользователем
 (if oldOSM (setvar "OSMODE" oldOSM)) 
 ) 

 (setq OldLAY (getvar "clayer"))

 (setq oldOSM (getvar "osmode"))

 (setvar "osmode" 0)

 (initget 7)
 (setq dimensionX (getreal "Введите ширину колонны: "))
 (initget 7)
 (setq dimensionY (getreal "Введите толщину колонны: "))
 (setq base 
    (cond
         ((getpoint "\Введите точку вставки колонны <0,0,0> :"))
         (t '(0. 0. 0.)))
     ) 

 (if (tblsearch "block" "Колонна")
 
   ((command "_-insert" "Колонна" base dimensionX dimensionY pause))

   ( (command "_-layer" "_set" "0" "")
     (command "_rectang" "-0.5,-0.5" "0.5,0.5")
     (command "_chprop" "_last" "" "_color" "_byblock" "_ltype" "_byblock" "_lweight" "_byblock" "")
     (command "_-block" "Колонна" "0,0" "_last" "")
     (command "_-insert" "Колонна" base dimensionX dimensionY pause)
   )
 )

 (setvar "clayer" OldLAY)

 (setvar "osmode" oldOSM)
)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 31.07.2008, 15:44
#274
Кулик Алексей aka kpblc
Moderator

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


А еще лучше воспользоваться системными переменными clayer, celtype, cecolor...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.07.2008, 15:47
#275
Red Nova

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


Кулик Алексей aka kpblc,
А как тогда быть с lweight?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 31.07.2008, 15:54
#276
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Есть ошибки в коде
Цитата:
Сообщение от Red Nova Посмотреть сообщение
Код:
[Выделить все]
 (if (tblsearch "block" "Колонна")
 
   ((command "_-insert" "Колонна" base dimensionX dimensionY pause))
 
   (progn (command "_-layer" "_set" "0" "")
     (command "_rectang" "-0.5,-0.5" "0.5,0.5")
     (command "_chprop" "_last" "" "_color" "_byblock" "_ltype" "_byblock" "_lweight" "_byblock" "")
     (command "_-block" "Колонна" "0,0" "_last" "")
     (command "_-insert" "Колонна" base dimensionX dimensionY pause)
   )
 )
Красные скобки лишние, зелёная функция пропущена.
Alaspher вне форума  
 
Автор темы   Непрочитано 31.07.2008, 16:09
#277
Red Nova

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


Alaspher,
Цитата:
((command "_-insert" "Колонна" base dimensionX dimensionY pause))
Тут и я сомневался, но работает и так.
Цитата:
(progn (command "_-layer" "_set" "0" "")
(command "_rectang" "-0.5,-0.5" "0.5,0.5")
(command "_chprop" "_last" "" "_color" "_byblock" "_ltype" "_byblock" "_lweight" "_byblock" "")
(command "_-block" "Колонна" "0,0" "_last" "")
(command "_-insert" "Колонна" base dimensionX dimensionY pause)
)
А тут я не знаю что сказать. вроде по логике ты прав. Но ведь и без progn работает.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 31.07.2008, 16:32
#278
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Ну вообще - не должно работать так как было. Проверил - у меня не работает.
Alaspher вне форума  
 
Непрочитано 31.07.2008, 16:55
#279
VVA

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
VVA,
Я правильно понял, это уже DXF Reference?
Нет. В DXF ме не лезем. Все это можно сделать командами.
Цитата:
Застрял на задании типа линии по блоку. В диалоге -layer не принимает ввод byblock
Нигде не говорилось,что нужно задавать слою тип byblock. Но никто не запрещает сделать его (цвет, тип линии) текущим до отрисовки полилинии или изменить через _change или _chprop после.
Цитата:
А как тогда быть с lweight?
А посмотреть не CE*?
Цитата:
Команда: _setvar
Имя переменной или [?]: ?
Список переменных для вывода <*>: CE*

CECOLOR "ПОСЛОЮ"
CELTSCALE 1.0000
CELTYPE "ПОСЛОЮ"
CELWEIGHT -1
CENTERMT 0
Цитата:
А тут я не знаю что сказать. вроде по логике ты прав. Но ведь и без progn работает.
Не работает.
Код:
[Выделить все]
(if ПРОВЕРКА
(ПРОВЕРКА=ИСТИНА)
(ПРОВЕРКА=ЛОЖЬ)
)
Так вот (ПРОВЕРКА=ИСТИНА) и (ПРОВЕРКА=ЛОЖЬ) это ОДНО действие. И назначение оператора PROGN как раз для того, чтобы куча твоих commnad трактовались как ОДНО действие и попадали соответственно в ветку ИСТИНА или ЛОЖЬ
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 31.07.2008, 16:59
#280
VVA

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


Red Nova, Твоя команда нарушает п.5 задания. Я даже специяльно обратил на это внимание.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум 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