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

Вернуться   Форум 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.
Просмотров: 2049172
 
Непрочитано 25.02.2010, 13:24
#761
ShaggyDoc

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


Цитата:
Мне не нужно скруглять все углы, а только выборочные. Поэтому мне необходимо указать какие стороны надо выбрать. Как это сделать? Я выбрал точки посередине сторон и передаю их в функцию в качестве указания объектов.
Мало ли кому что не нужно. Команда FILLET скругляет все углы полилинии - так уж устроен Автокад. Если надо скруглять разные углы - не надо пользоваться полилинией. Тогда и работа команды будет совсем иная.
ShaggyDoc вне форума  
 
Непрочитано 25.02.2010, 13:34
#762
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Хм, вот ведь странность - fillet ведет себя по разному, если вручную выполнять и через vl-cmdf. После указания радиуса, команда прекращается.
Поэтому, думается мне, надо либо два раза запускать vl-cmdf
(vl-cmdf "_.fillet" "_r" f_r)
(vl-cmdf "_.fillet" f_1 f_2)
Либо для задания радиуса менять системную переменную filletrad.
Цитата:
Команда FILLET скругляет все углы полилинии - так уж устроен Автокад.
Не знаю, как с "POLILINE", но если применять fillet к "LWPOLYLINE", то можно по одному углу скруглять... При этом в команду передаются точки вблизи тех участков, между которыми делаем скругление:
Код:
[Выделить все]
(vl-cmdf "_.fillet" (cadr (entsel "\nFirst line:")) (cadr (entsel "\nSecond line:")))

Последний раз редактировалось Do$, 25.02.2010 в 13:42.
Do$ вне форума  
 
Непрочитано 25.02.2010, 14:44
#763
alex8888

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


Добавил строку :
(setvar "filletrad" f_r),

и изменил:
(vl-cmdf "_.fillet" f_1 f_2)

Все работает. Спасибо.

Теперь вопрос как получить скругление 2х соседних углов , если радиус скругления равен половине длины общей стороны? Первый угол скругляется правильно, второй уже нет. Если нужно закруглить только противоположные углы, то все проходит нормально.
alex8888 вне форума  
 
Непрочитано 25.02.2010, 15:19
#764
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от alex8888 Посмотреть сообщение
как получить скругление 2х соседних углов , если радиус скругления равен половине длины общей стороны?
Нарисовать дугу вручную.
Do$ вне форума  
 
Непрочитано 25.02.2010, 16:06
#765
alex8888

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


Цитата:
Нарисовать дугу вручную.
Конечно, можно, но потом нужно будет преобразовывать контур в полилинию, что то же добавит геморроя.
Так я за один проход убиваю всех зайцев - тут тебе и контур какой надо, и ничего объединять не нужно, в смысле отрезки-дуги и тп.


Решил задачу проще - взял точки не посередине скругляемой стороны, а ближе к углу - все работает как надо. Только точек добавилось
:
f_9 (polar f_1 0 (* 0.25 f_l)) ;9+10 - rechts unten
f_10 (polar f_2 (* pi -0.5) (* 0.25 f_h))
f_11 (polar f_2 (* pi 0.5) (* 0.25 f_h)) ;11+12 - rechts oben
f_12 (polar f_3 0 (* 0.25 f_l))
f_13 (polar f_3 pi (* 0.25 f_l)) ;13+14 - links oben
f_14 (polar f_4 (* pi 0.5) (* 0.25 f_h))
f_15 (polar f_4 (* pi -0.5) (* 0.25 f_h)) ;15+16 - links unten
f_16 (polar f_1 pi (* 0.25 f_l))

(vl-cmdf "_fillet" f_9 f_10) ;rechts unten Ecke

(vl-cmdf "_fillet" f_11 f_12) ;rechts oben Ecke

(vl-cmdf "_fillet" f_13 f_14) ;links oben Ecke

(vl-cmdf "_fillet" f_15 f_16) ;links unten Ecke

Последний раз редактировалось alex8888, 25.02.2010 в 16:35. Причина: дополнение
alex8888 вне форума  
 
Автор темы   Непрочитано 25.02.2010, 21:53
#766
Red Nova

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


VVA
Спасибо за код, пока правда так и не проверил, все занят покупкой новой машини . Ах как приятно перестать ощущать себя пешиходом
__________________
Блог
Red Nova вне форума  
 
Непрочитано 26.02.2010, 08:33
#767
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


alex8888, не ищете вы легких путей...
В вашем случае надо отрисовывать полилинией прямоугольник со скругленными углами: простой арифметикой можно определить точки и создать полилинию функцией entmake или entmakex.
Do$ вне форума  
 
Непрочитано 26.02.2010, 09:15
#768
alex8888

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


Do$,
а нельзя наводку, как именно через enmake-entmakex и чем же легче? Посмотрел описание - немного вспотел Не понимаю (пока ).

Поначалу я делал так: рассчитывал каждую точку, потом по ним рисовал замкнутую полилинию. Но была трудность, что как то коряво рисовались дуги после прямых линий (конструкция типа (vl-cmdf "_pline" p1 "_l" p2 "_a" "_center" p3 p4 "_l" p5 ..... "_close"). Так вот некоторые дуги почему то рисовались развернутыми в обратную сторону (не наружу, а внутрь)). Поэтому я и решил посмотреть на _fillet. Может есть более простое решение?
alex8888 вне форума  
 
Непрочитано 26.02.2010, 09:39
#769
ShaggyDoc

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


Цитата:
Может есть более простое решение?
Простое решение - рисовать полилинию с дуговыми сегментами в правильном порядке обхода вершин. Чтобы не выгибалось, куда не надо.

Для этого достаточно просто вручную промоделировать ситуацию - рисовать последовательно со всеми опциями, вводя их в командной строке. Точки можно указывать примерно - сразу будет видно, куда выгибается дуга.

Командный метод - самое простое решение. Сначала надо им научиться делать, пройти через детские ошибки №1 и №2. Можно и через entmake, и через ActiveX, но там уж вовсе больше изучать надо.
ShaggyDoc вне форума  
 
Непрочитано 26.02.2010, 09:52
#770
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Ну как-то так:
Код:
[Выделить все]
(defun make-filled-rectangle  (rec_length rec_hight rec_radius base_pt)
         ;|
Функция рисования прямоугольника со скругленными углами "облегченной" полилинией (LWPOLYLINE).
Аргументы:
 rec_length - Длина прямоугольника
 rec_hight - Высота прямоугольника
 radius - Радиус скругления углов
 base_pt - Центр прямоугольника, координаты в виде списка (Х У)
Примечание: Построение происходит в мировой системе координат, поэтому базовую точку
следует задавать также в МСК.
Возвращаемое значение:
 ename созданной "облегченной" полилинии или nil при неудаче.
Пример вызова:
  (make-filled-rectangle 200 300 20 ((lambda (lst) (list (car lst) (cadr lst)))
  (trans (getpoint "\nSelect base point:") 1 0)))
  |;
  (entmakex
    (append
      (quote ((0 . "LWPOLYLINE")
        (100 . "AcDbEntity")
;;;      (67 . 0)
;;;      (410 . "Model")
;;;      (8 . "0")
        (100 . "AcDbPolyline")
        (90 . 8)
        (70 . 1)
        (43 . 0.0)
        (38 . 0.0)
        (39 . 0.0)))
      (list
 (cons 10 (mapcar (function +) (list (/ rec_length 2) (- rec_radius (/ rec_hight 2))) base_pt)) ;_ 1pt
 (cons 40 0.0)
 (cons 41 0.0)
 (cons 42 0.0)
 (cons 10 (mapcar (function +) (list (/ rec_length 2) (- (/ rec_hight 2) rec_radius)) base_pt)) ;_ 2pt
 (cons 40 0.0)
 (cons 41 0.0)
 (cons 42 0.414214)
 (cons 10 (mapcar (function +) (list (- (/ rec_length 2) rec_radius) (/ rec_hight 2)) base_pt)) ;_ 3pt
 (cons 40 0.0)
 (cons 41 0.0)
 (cons 42 0.0)
 (cons 10 (mapcar (function +) (list (- rec_radius (/ rec_length 2)) (/ rec_hight 2)) base_pt)) ;_ 4pt
 (cons 40 0.0)
 (cons 41 0.0)
 (cons 42 0.414214)
 (cons 10 (mapcar (function +) (list (- (/ rec_length 2)) (- (/ rec_hight 2) rec_radius)) base_pt)) ;_ 5pt
 (cons 40 0.0)
 (cons 41 0.0)
 (cons 42 0.0)
 (cons 10 (mapcar (function +) (list (- (/ rec_length 2)) (- rec_radius (/ rec_hight 2))) base_pt)) ;_ 6pt
 (cons 40 0.0)
 (cons 41 0.0)
 (cons 42 0.414214)
 (cons 10 (mapcar (function +) (list (- rec_radius (/ rec_length 2)) (- (/ rec_hight 2))) base_pt)) ;_ 7pt
 (cons 40 0.0)
 (cons 41 0.0)
 (cons 42 0.0)
 (cons 10 (mapcar (function +) (list (- (/ rec_length 2) rec_radius) (- (/ rec_hight 2))) base_pt)) ;_ 8pt
 (cons 40 0.0)
 (cons 41 0.0)
 (cons 42 0.414214)
 (list 210 0.0 0.0 1.0)))))

Последний раз редактировалось Do$, 26.02.2010 в 10:37.
Do$ вне форума  
 
Непрочитано 26.02.2010, 11:14
#771
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от alex8888 Посмотреть сообщение
Do$,
а нельзя наводку, как именно через enmake-entmakex и чем же легче? Посмотрел описание - немного вспотел Не понимаю (пока ).

Поначалу я делал так: рассчитывал каждую точку, потом по ним рисовал замкнутую полилинию. Но была трудность, что как то коряво рисовались дуги после прямых линий (конструкция типа (vl-cmdf "_pline" p1 "_l" p2 "_a" "_center" p3 p4 "_l" p5 ..... "_close"). Так вот некоторые дуги почему то рисовались развернутыми в обратную сторону (не наружу, а внутрь)). Поэтому я и решил посмотреть на _fillet. Может есть более простое решение?
Что то я не понял, зачем нужна программа, если есть встроенная функция рисования прямоугольников со скругленными углами?
Вот копия из ком строки:
Код:
[Выделить все]
Command: rec RECTANG
Current rectangle modes:  Fillet=50.0000
Specify first corner point or [Chamfer/Elevation/Fillet/Thickness/Width]: f
Specify fillet radius for rectangles <50.0000>: 10
Specify first corner point or [Chamfer/Elevation/Fillet/Thickness/Width]:
Specify other corner point or [Area/Dimensions/Rotation]:
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 26.02.2010, 11:18
#772
alex8888

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


ShaggyDoc
Цитата:
Простое решение - рисовать полилинию с дуговыми сегментами в правильном порядке обхода вершин. Чтобы не выгибалось, куда не надо.
1.Это как в правильном? Обход правый нижний угол-правый верхний-левый верхний-левый нижний будет являться правильным?
2.При проходе вручную функции _pline тем же порядком, что и в программе, контур получается правильным, а из программы нет. Почему? Из-за скорости проведения линии вручную?

Цитата:
пройти через детские ошибки №1 и №2
это какие? №1-Не лезь куда не просят, потому как все равно дурак и №2-см №1
Про привязки уже уяснил, хотя не попадал в такие ситуации, где они бы помешали.

Еще открытым для меня остается вопрос, как подгрузить вспомогательную пользовательскую функцию из другой пользовательской, типа ru-трам-пам-пам из _ru-тра-ля-ля? Когда вписываю несколько функций в один Lisp, то команда из функции работает, равно как и если была прописана вспомогательная функция в автозагрузке через appload. Но все функции без надобности грузить в каждый чертеж? Или прописывать абсолютные пути в основной лисп?

Do$,
1. По твоему коду получается проще? И что мне теперь для каждого из 16 вариантов делать свою полилинию через entmakex? В чем выигрыш?
2. Зачем делать преобразования систем координат? Я только, как понимаю, всегда в МСК работаю.

Елпанов Евгений
Цитата:
Что то я не понял, зачем нужна программа, если есть встроенная функция рисования прямоугольников со скругленными углами?
1. Она лепит только со всеми скругленными углами.
2. Использование вертикальных решений мне еще в начале программирской деятельности рекомендовали не использовать.
3. Данная прога только прелюдия для более масштабного проекта, так сказать учусь, пробую, экспериментирую.

Последний раз редактировалось alex8888, 26.02.2010 в 13:40. Причина: добавление комментария
alex8888 вне форума  
 
Непрочитано 26.02.2010, 12:55
1 | #773
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от alex8888 Посмотреть сообщение
1. По твоему коду получается проще?
Для меня проще, ибо командные методы - тот еще головнячок. В одной версии команда может иметь одни опции, в другой - другие и пр. неприятности. Entmakex же будет работать одинаково и стабильно и в 2000, и в 2010 AutoCAD'е.
Цитата:
Сообщение от alex8888 Посмотреть сообщение
И что мне теперь для каждого из 16 вариантов делать свою полилинию через entmakex?
16 вариантов? То есть у каждого угла может быть или не быть скругление? Можно добавить в функцию обработку этих вариантов. Или сделать функцию - аналог fillet со входными параметрами: ename прямоугольника и координата вершины, в которой нужно сделать скругление...
Делай как хочешь, просто мое мнение - от vl-cmdf и command в программе желательно избавляться.
Цитата:
Сообщение от alex8888 Посмотреть сообщение
Зачем делать преобразования систем координат? Я только, как понимаю, всегда в МСК работаю.
Если делаешь программу только для себя - то сойдет, а если планируется потом раздавать коллегам, то вполне может оказаться, что они не все работают в МСК. При использовании командных методов, об этом не надо задумываться - все всегда рисуется в текущей СК, а при использовании entmake о СК приходится всегда помнить и, при необходимости, производить преобразования.
Do$ вне форума  
 
Непрочитано 26.02.2010, 15:15
#774
ShaggyDoc

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


Цитата:
Сообщение от alex8888 Посмотреть сообщение
ShaggyDoc

1.Это как в правильном? Обход правый нижний угол-правый верхний-левый верхний-левый нижний будет являться правильным?
2.При проходе вручную функции _pline тем же порядком, что и в программе, контур получается правильным, а из программы нет. Почему?
Наверное потому, что команда запрашивает одни точки, а программно ты выдаешь другие. Для предотвращения "выворотки" дуги надо тщательно продумывать.

Цитата:
Сообщение от alex8888 Посмотреть сообщение
это какие? №1-Не лезь куда не просят, потому как все равно дурак и №2-см №1
Про привязки уже уяснил, хотя не попадал в такие ситуации, где они бы помешали.
Вот это и есть ошибка - думаешь, что раз не попадал, то и не попадешь. А попадешь обязательно.

Ещё одну указал Do$ - никогда нельзя забывать про системы координат. Помнить, что get-функции возвращают точки в ПСК, command работает в ПСК, а данные примитивов будут в МСК.

Цитата:
Сообщение от alex8888 Посмотреть сообщение
Еще открытым для меня остается вопрос, как подгрузить вспомогательную пользовательскую функцию из другой пользовательской, типа ru-трам-пам-пам из _ru-тра-ля-ля? Когда вписываю несколько функций в один Lisp, то команда из функции работает, равно как и если была прописана вспомогательная функция в автозагрузке через appload. Но все функции без надобности грузить в каждый чертеж?
Должна быть постоянно загружаемая библиотека (сборник) функций, доступных во всех "конечных" программах. К необходимости такой библиотеки придешь сам, когда в двадцатый раз будешь описывать одно и то же, причем каждый раз с новыми ошибками. А про "без надобности" не надо переживать. Вот сотни функций Автокада многим "без надобности", но их не вырезают.

Цитата:
Сообщение от alex8888 Посмотреть сообщение
Или прописывать абсолютные пути в основной лисп?
Самый худший путь. Любая программа должна вычислять, где она сама живет и где находятся требуемые файлы.

Цитата:
И что мне теперь для каждого из 16 вариантов делать свою полилинию через entmakex? В чем выигрыш?
Надо делать одну библиотечную функцию с таким набором аргументов, который позволит нарисовать сколько угодно вариантов.
ShaggyDoc вне форума  
 
Непрочитано 26.02.2010, 23:13
#775
alex8888

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


ShaggyDoc
ну подскажи ты дураку, ну как мне сделать
Цитата:
постоянно загружаемую библиотеку (сборник) функций, доступных во всех "конечных" программах
Я уже давно пришел к этому, но не получается сделать по уму. Из всего, что смог:
1. В пути к файлам настроек Када прописал директорию с моими Лиспами.
2. При вводе команды Appload прописал там где нарисован портфель, все Лиспы, которые нужно загружать каждый раз. Там набрался список из пары десятков уже.
Книгу "САПР на базе Автокада" "пролистал" (штудирую по мере сил и возможностей), жаль представленные примеры без переработки проверить не могу - нерешенная проблема с отображением русского языка в каде. Да и профиль у меня машиностроительный, что несколько отличается от представленного в книге для строителей.

Насчет
Цитата:
Вот это и есть ошибка - думаешь, что раз не попадал, то и не попадешь. А попадешь обязательно.
уже застраховался, в некоторых случаях аж дважды Но советами не пренебрегаю, спасибо.

Цитата:
Для предотвращения "выворотки" дуги надо тщательно продумывать
Продумываю. Поэтому склоняюсь к кардинальным мерам - если не получается после долгих мучений задуманное, то сношу все к чертям и придумываю новый путь. Жаль, приходиться работать подпольно - буржуи на это времени не спонсируют.

Цитата:
Или прописывать абсолютные пути в основной лисп?
Полностью согласен, потому как это самая большая из глупостей, которая может придти на ум (ну после начала программирования )

Цитата:
Надо делать одну библиотечную функцию с таким набором аргументов, который позволит нарисовать сколько угодно вариантов.
Именно это я и пытаюсь изобразить. Поначалу создавал конкретно этот Лисп для построения плат "ног" для емкостей, которые мы производим. Потом решил, что отверстия в пате можно комбинировать и располагать в разных часто встречающихся и повторяющихся положениях, потом дошел до того, что некоторые платы можно или нужно скруглять, наконец, что раз скругления делаются тоже по выбору - какие надо углы, то можно и таким же образом делать уши для подъема емкости краном. Сюда же входит целый набор всевозможных плат заземлителей, держателей и тп. Все они построены по единому принципу, но каждая деталь отбирает кучу времени. В 2010 (да и уже в 2009) Каде есть параметризация, но Лисп уже был написан, да и что то не лежит душа к параметризации конкретной задачи. Вот днища по Din 28011 или 28013 в параметризации прижились крепко, а Лисп создать корректно так и не смог - не хватило математики в аппроксимации.
alex8888 вне форума  
 
Непрочитано 26.02.2010, 23:46
#776
Кулик Алексей aka kpblc
Moderator

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


В функцию http://forum.dwg.ru/showthread.php?t=16561 подставить свои маски lsp-файлов и последовательно выполнить (load file) - один из вариантов. Несмотря на некоторые трудности в последних версиях AutoCAD (см., например, http://autolisp.ru/2009/12/09/load_complie_write/ и http://autolisp.ru/2009/12/09/load_complie_write/ ) - вполне реальный.
Если не испугает использование библиотечных функций, вот тебе вариант рисования полилинии (вроде работало ):
Код:
[Выделить все]
(defun _kpblc-ent-create-lwpline (lst point-list / res point_list)
                                 ;|
*    Функция добавления полилинии в указанное пространство.
*    Параметры вызова:
*	lst	- список точечных пар вида:
*		'(("where" . <Куда добавлять>)	; в какой блок / пространство
*				добавлять полилинию (vla-указатель). nil -> активное пространство
*		("closed" . t / nil)		; замкнутая полилиния. nil -> нет
*		("lineweight" . aclnwt025)		; вес полилинии. nil -> aclnwt000
*		("ltype" . "Continuous")	; тип линии. nil -> Continuous (только английский, нижний регистр)
*		("ltypefile" . "acadiso.lin")	; файл, из которого грузить тип линии (nil -> acadiso.lin)
*		("color" . 0)			; цвет. nil -> (getvar "cecolor")
*		("layer" . "test")		; слой. nil -> "0"
*		("width" . 0)			; изменение глобальной ширины
						; полилинии (группа 39). nil -> 0
*		(cons "normal" '(0. 0. 1.))	; система координат, в которой
			; создавать примитив. nil -> текущая
		(cons "round"(list (cons 0 -1)(cons 1 -2)))	; список участков полилинии
			; с устанавливаемой кривизной (тангенс четверти
			; центрального угла)
*		)
*	point-list	список точек (переводится в 2Д)
*    Возвращает vla-указатель на созданную полилинию либо nil в случае неудачи
*    Примеры вызова:
(_kpblc-ent-create-lwpline (list
	(cons "closed" t)
	(cons "round" '((0 . -1.) (2 . 0.5))))
	'((0. 0.)(10. 10.)(0. 20.)(-10. 10.)))
|;
  (_kpblc-error-catch
    (function
      (lambda ()
        (setq point-list (apply
                           (function append)
                           (mapcar (function (lambda (x) (list (car x) (cadr x))))
                                   point-list
                                   ) ;_ end of mapcar
                           ) ;_ end of apply
              res        (vla-addlightweightpolyline
                           (if (and (assoc "where" lst)
                                    (cdr (assoc "where" lst))
                                    ) ;_ end of and
                             (cdr (assoc "where" lst))
                             (_kpblc-get-active-space-obj)
                             ) ;_ end of if
                           (vlax-make-variant
                             (vlax-safearray-fill
                               (vlax-make-safearray
                                 vlax-vbdouble
                                 (cons 0 (1- (length point-list)))
                                 ) ;_ end of vlax-make-safearray
                               point-list
                               ) ;_ end of vlax-safearray-fill
                             ) ;_ end of vlax-make-variant
                           ) ;_ end of vla-addlightweightpolyline
              ) ;_ end of setq
        (if (cdr (assoc "round" lst))
          (foreach item (cdr (assoc "round" lst))
            (_kpblc-error-catch
              (function
                (lambda ()
                  (vla-setbulge res (car item) (cdr item))
                  ) ;_ end of lambda
                ) ;_ end of function
              '(lambda (x)
                 (princ (strcat "\nНевозможно задать кривизну "
                                (car item)
                                " участку полилинии"
                                ) ;_ end of strcat
                        ) ;_ end of princ
                 ) ;_ end of lambda
              ) ;_ end of _kpblc-error-catch
            ) ;_ end of foreach
          ) ;_ end of if
        (foreach item (list (list "closed" "closed" :vlax-false)
                            (list "lineweight" "lineweight" aclnwt000)
                            '("ltype" "linetype" "Continuous")
                            (list "color" "color" (getvar "cecolor"))
                            '("layer" "layer" "0")
                            '("width" "ConstantWidth" 0)
                            ) ;_ end of list
          (if (member (car item) lst)
            (setq lst (subst (cons (cadr item) (cdr (assoc (car item) lst))) (assoc (car item) lst) lst))
            (setq lst (append lst (list (cdr item))))
            ) ;_ end of if
          ) ;_ end of foreach
        (foreach item lst
          (vl-catch-all-apply
            (function
              (lambda ()
                (vlax-put-property res (car item) (cadr item))
                ) ;_ end of lambda
              ) ;_ end of function
            ) ;_ end of vl-catch-all-apply
          ) ;_ end of foreach
        ) ;_ end of lambda
      ) ;_ end of function
    (function
      (lambda (x)
        (_kpblc-error-print "_kpblc-ent-create-lwpline" x)
        (setq res nil)
        ) ;_ end of lambda
      ) ;_ end of function
    ) ;_ end of _kpblc-error-catch
  res
  ) ;_ end of defun
Анализируй Задачи, решаемые недостающими функциями, по идее и так понятны должны быть.
---
P.S. По голове прошу не бить - она и без того "чугуниевая"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.02.2010, 17:17
#777
alex8888

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


Кулик Алексей aka kpblc
спасибо, посмотрю на работе, а
ссылаются на одно и тоже место или есть там различия?

Что вкратце делает твоя функция рисования полилиний?
alex8888 вне форума  
 
Непрочитано 28.02.2010, 02:15
#778
Кулик Алексей aka kpblc
Moderator

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


Сорри, вторая ссылка : http://autolisp.ru/2009/12/25/loadcomplie_write_2/
Как "что делает"? Если есть все библиотечные функции, то рисует полилинию с указанными параметрами. А в данном случае выступает в качестве примера для анализа, не более.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.02.2010, 19:55
#779
alex8888

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


Кулик Алексей aka kpblc
Цитата:
Как "что делает"?...рисует полилинию с указанными параметрами
Вот и вопрос, какую и зачем? Пол-страницы текста и все намудрено и непонятно (для меня, чайника ).
Например у меня в программе просто рисуется прямоугольник и скругляются его углы, которые выбираются в диалоговом окне. Все остальное рисуется и проставляется автоматом. Это просто прога для конкретно моей задачи. И составлял я ее только для облегчения работы, ускорения, для устранения повторяющихся монотонных вычислений и действий. С удовольствием использую коды форумчан, если они мне подходят и если я в них разобрался. Потому как все равно подстраиваю их под себя, например, перевожу всю кириллицу или добавляю слои, уровни и тп.
alex8888 вне форума  
 
Непрочитано 28.02.2010, 23:56
#780
Кулик Алексей aka kpblc
Moderator

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


Кое-что о параметрах вызова, как я это понимаю: http://autolisp.ru/2009/10/21/lisp-overloading/
Цитата:
Сообщение от alex8888 Посмотреть сообщение
Вот и вопрос, какую и зачем?
Какую? Какую будет приказано. Зачем? Ну было же приказано
Цитата:
Сообщение от alex8888 Посмотреть сообщение
у меня в программе просто рисуется прямоугольник и скругляются его углы, которые выбираются в диалоговом окне
А я бы сначала сделал диалоговое окно, и потом по результатам выполнения рисовал полилинию.
__________________
Моя библиотека 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