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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Непрочитано 20.07.2008, 20:12
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,974

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1567922
 
Непрочитано 28.09.2010, 07:18
#1041
ShaggyDoc

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


Цитата:
ShaggyDoc, прошу поправить меня, если я ошибаюсь
Алексей, ну ты слишком умный. С тобой неинтересно Ты по битам начал раскладывать.... Как настоящий программист. А обычному инженеру таких деталей можно и не знать, но понимать "физический" смысл подобных функций.

Вот про "понты". Есть формула площади прямоугольника A*B. Допустим, A и B равны 2. Зная, что 2*2=4 и 2+2=4 некоторые могут сделать вывод, что в формулу можно поставить сложение. Для частного случая результат будет правильный, но методически - неверно.

Что делает logior если объяснять "по-крестьянски"?
Эта функция формирует из переданных целых чисел (назовем их битами) некое число (флаг), анализируя которое можно узнать, какие биты в него входят. Биты должны быть из ряда 0 1 2 4 8 16 ....

Пример
Код:
[Выделить все]
(setq человек? 1
      мужик? 2
      умный? 4
      богатый? 8
)      

(setq некто_1 (logior человек? мужик? умный? богатый?)) ;; > 15
(setq некто_2 (logior человек? мужик?  богатый?))  ;; > 11
(setq некто_3 (logior умный?))  ;; > 4
(setq некто_4 (logior человек? умный?))  ;; > 5
Мы занесли характеристики каких-то "биообъектов". Теперь мы можем узнать их характеристики хоть списком, хоть по отдельности. Для удобства нарисуем пару высокоуровневых функций для работы с "битовой арифметикой"

Код:
[Выделить все]
(defun ru-match-is-bit-in-flag (bit flag)
  ;; проверяет, есть ли bit в числе flag
    (= (logand bit flag) flag)
)

(defun ru-match-bit-list (int_number / i result)
    ;; возвращает список битовых значений целого числа  
    (setq i 1)
    (while (>= int_number i)
	(if (= i (logand i int_number))
	    (setq result (cons i result))
	) ;_ end of if
	(setq i (lsh i 1))
    ) ;_ end of while
    result
) ;_ end of defun
Применим их (сначала получая список, а потом проверяя отдельные значения):
Код:
[Выделить все]
(setq bit_list_1 (ru-match-bit-list некто_1)) ;; (8 4 2 1)
(setq bit_list_2 (ru-match-bit-list некто_2)) ;; (8 2 1)  
(setq bit_list_3 (ru-match-bit-list некто_3)) ;; (4)
(setq bit_list_4 (ru-match-bit-list некто_4)) ;;  (4 1)

(ru-match-is-bit-in-flag мужик? некто_1) ;; >t
(ru-match-is-bit-in-flag умный? некто_1) ;; >t
(ru-match-is-bit-in-flag умный? некто_2) ;; nil
(ru-match-is-bit-in-flag мужик? некто_4) ;; nil
(ru-match-is-bit-in-flag умный? некто_4) ;; T
(ru-match-is-bit-in-flag богатый? некто_4) ;; nil
Написав еще штук 5 подобных функций, мы спрячем все необходимые действия (добавление, изменение битов и т.п.) за понятными названиями и можем применять их многократно. Забыв про "страшные" logior, logand, lzh.
ShaggyDoc вне форума  
 
Непрочитано 28.09.2010, 08:53
#1042
Do$

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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Есть формула площади прямоугольника A*B. Допустим, A и B равны 2. Зная, что 2*2=4 и 2+2=4 некоторые могут сделать вывод, что в формулу можно поставить сложение. Для частного случая результат будет правильный, но методически - неверно.
Это ответ на мой "понт"? Чтож, заслужил - не надо было так грубо выражаться
Но я останусь при своем мнении - тип данных для массива варианта задается как сумма битового флага массива и битового флага типа элемента массива, каждый из них по отдельности не может включать другой бит (по определению). Поэтому, я считаю, что применение logior именно в этом случае не оправдано.
Do$ вне форума  
 
Непрочитано 28.09.2010, 09:04
#1043
Кулик Алексей aka kpblc
Moderator

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


Offtop: ShaggyDoc, ну надо же было закошмарить ситуацию, чтобы получить внятные и ясные объяснения
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.09.2010, 09:27
#1044
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 421


Прошу прощения, но про побитовое ИЛИ я то как раз понимаю, Не стоит считать инженеров "недопрограммистами".

Мой вопрос был в другом - почему надо именно так складывать значения констант типов, если в самой справке, к примеру, при присвоении VARIANT безопасного массива из doubles, это вообще пропускается?
Если пропустить, то, в случае преобразования списка точек в координаты для полилинии, все работает безукоризненно. Тогда, как я понимаю, логическое ИЛИ может применяться в других ситуациях при работе с константами Автокада.

Подумал, посчитал... В общем, соглашаюсь с гуру

Вот почему: скажем, нам нужен массив из длинных целых чисел. У Array константа 9, у Long Integer - 3. Если просто суммируем - получим 12. А вот если побитово сложим, то

1001
OR
0011

1011

получим 11 :-)

Для моего случая, когда нужен массив из Doubles

Если складываем: 9+5=14

А побитово

1001
OR
0101

1101 , т.е. 9 OR 5 = 13

Теперь уже и сам убедился.

Копаем дальше.

Если общий флаг типа данных - 1101, то это может быть и 9+5 и 9+4, т.е. либо Double, либо Single... А что и з этого следует? В таком массиве точность станет какой? Как АвтоКАД определит тогда тип данных? Может он все-таки здесь работает не по-битово, а с целыми числами, как с константами? Или, скажем, берет тип данных массив и тип данных его членов (Doubles)?

В общем, вопросов появляется больше, чем ответов.




МОжет потому и нет в справке при создании Variant составного типа массива и Doubles? ;-)

И когда я сам пропускаю этот (logior ...) и этот (+...) в своей функции, то все замечательно считается.

Последний раз редактировалось Frigate, 28.09.2010 в 10:39.
Frigate вне форума  
 
Непрочитано 28.09.2010, 10:20
#1045
Do$

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


Цитата:
Сообщение от Frigate Посмотреть сообщение
В общем, не ясно, в какой ситуации (на примере АвтоКАДа!!!) побитовое ИЛИ отличается от сложения?
Есть, к примеру, такая системная переменная - osmode. В ней суммой битов устанавливаются опции привязки (подробнее - в справке). Допустим, текущее значение osmode=9071. Предположим, понадобилось, чтобы была обязательно включена привязка "перпендикуляр" (бит 128) и "середина" (бит 4), при этом не затрагивая остальные привязки.
Нужно определить, содержит ли 9071 значения 128 и 4, и если нет - добавить. Именно это и можно сделать с помощью logior:
Код:
[Выделить все]
(setvar "osmode" (logior (+ 4 128) (getvar "osmode")))
Результат: 9199.
9199-9071=128. То есть, бит 4 присутствовал изначально, а бит 128 добавился.
Здесь сложением logior заменять нельзя.

Последний раз редактировалось Do$, 28.09.2010 в 10:46.
Do$ вне форума  
 
Непрочитано 28.09.2010, 11:15
#1046
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 421


Do$

благодарю, про привязки понял.

Посмотри пожалуйста, на мое дополнение к пред. моему сообщению (точнее, я полностью почти изменил сообщение). Там я вопрос задал, и уже не первый раз, про справку автокада. Там не используются в примере общие коды (сумма или logior). И без них кстати полилиния замечательно так создается.

А по поводу привязок все хотел спросить - нужно ли их отключать перед тем, как программно строить полилинию? Если да, то почему? Точнее, какая именно ситуация может вызвать неправильную прорисовку полилинии? Ведь она задается массивом координат. Как же тогда привязки могут на нее повлиять?
Frigate вне форума  
 
Непрочитано 28.09.2010, 11:31
#1047
Кулик Алексей aka kpblc
Moderator

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


vlax-make-variant создает тип variant, насколько я понимаю. На основе стандартных типов данных (vbInteger, vbDouble, vbString и т.д.). Не, можно, конечно, из variant сделать еще один variant и так до бесконечности (у попа была собака) - но смысл?
Для преобразования списка координат вида '((0. 0.) (10. 0.) (20. 10.)) в значение, понимаемое vla-addlightweightpolyline, делаем следующее:
Код:
[Выделить все]
(vl-load-com)

(defun test (/ coords len)
  (setq coords '((0. 0.) (10. 0.) (20. 10.)) ;1
        len    (length (apply (function append) coords)) ;2
        ) ;_ end of setq                                 ;3
  (vla-addlightweightpolyline
    (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
    (vlax-make-variant
      (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble (cons 0 (1- len)))
                           (apply (function append) coords)
                           ) ;_ end of vlax-safearray-fill
      ) ;_ end of vlax-make-variant
    ) ;_ end of vla-addlightweightpolyline
  ) ;_ end of defun
Разбираем последовательно строки, и разбираем по-лисповски
  1. Первые три строки не буду разбирать - они и так очевидны.
  2. Сначала через vlax-make-safearray создаем массив, задавая его нижнюю и верхнюю границы. Во избежание разных некрасивостей нижнюю границу назначаем в полном соответствии с VBA-подходом, равной 0, а верхнюю - на единицу меньше, чем длина списка.
  3. После этого, используя vlax-safearray-fill, заполняем массив
  4. И преобразовываем его в variant (vlax-make-variant)
  5. Подставляем в vla-addlightweightpolyline и наслаждаемся результатом
---
Пока по рабочим делам бегал, много воды утекло... Может, уже и не надо никому
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.09.2010, 11:38
#1048
Елпанов Евгений

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


Цитата:
Сообщение от Frigate Посмотреть сообщение
А по поводу привязок все хотел спросить - нужно ли их отключать перед тем, как программно строить полилинию? Если да, то почему? Точнее, какая именно ситуация может вызвать неправильную прорисовку полилинии? Ведь она задается массивом координат. Как же тогда привязки могут на нее повлиять?
при полностью программном создании полилинии - не нужно отключать привязки. Например:
Код:
[Выделить все]
(entmakex '((0 . "LWPOLYLINE")
            (100 . "AcDbEntity")
            (100 . "AcDbPolyline")
            (90 . 4)
            (70 . 0)
            (10 0. 0.)
            (10 10. 0.)
            (10 10. 10.)
            (10 0. 10.)
           )
)
(vla-AddLightWeightPolyline
 (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
 (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble '(0 . 7))
                                         '(0. 0. 10. 0. 10. 10. 0. 10.)
                    )
 )
)
При использовании командной строки, привязки отключать обязательно!
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 28.09.2010, 12:18
#1049
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 421


Елпанов Евгений,

кратко и емко

Кулик Алексей aka kpblc ,

Алексей,

код-то я как раз уже понимаю и написал его для своей программы. Вопрос в другом :-)
Наверное, я не точно все описал.

Впрочем ясно, что вообще можно не указывать сумму констант типов массив и Double при задании vlax-make-variant.

Вот, кстати, из справки цитата:

Цитата:
Determines the data type of a variant

(vlax-variant-type var)
Arguments

var
A variable whose value is a variant.

Return Values

If var contains a variant, one of the following integers is returned:

0 Uninitialized (vlax-vbEmpty)

1 Contains no valid data (vlax-vbNull)

2 Integer (vlax-vbInteger)

3 Long integer (vlax-vbLong)

4 Single-precision floating-point number (vlax-vbSingle)

5 Double-precision floating-point number (vlax-vbDouble)

8 String (vlax-vbString)

9 Object (vlax-vbObject)

11 Boolean (vlax-vbBoolean)

8192 + n Safearray (vlax-vbArray) of some data type. For example, an array of doubles (vlax-vbDouble) returns 8197 (8192 + 5).
Frigate вне форума  
 
Непрочитано 28.09.2010, 13:48
1 | #1050
ShaggyDoc

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


Цитата:
При использовании командной строки, привязки отключать обязательно!
Я бы сказал так - при использовании функций command и vl-cmdf. Потому что "использование командной строки" не очень с программированием вяжется. И восстанавливать всегда в прежнее состояние.

Заодно учитывать, что при использовании функций command и vl-cmdf координаты всегда должны быть в текущей ПСК.

При использовании entxxx и объектных методов - всегда в МСК.

Учитывать, что getpoint возвращает координаты в текущей ПСК.
ShaggyDoc вне форума  
 
Непрочитано 28.09.2010, 22:16
#1051
Дима_

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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Эта функция формирует из переданных целых чисел (назовем их битами) некое число (флаг), анализируя которое можно узнать, какие биты в него входят.
Безусловно так, но хотелось-бы добавить, что такое применение оправдано, ну скажем в ассемблере (в общем оно там на каждом шагу), гораздо более интересные вещи при помощи логических операций делаются применительно к проверке условий (не спроста они созвучны с or и and) - при правильном подходе (да еще и с применением lsh) - количество проверок сокращается в разы, но это тема для отдельного большого обсуждения.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 28.09.2010, 23:56
#1052
gomer

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


Цитата:
сложением logior заменять нельзя.
Цитата:
Если складываем: 9+5=14

А побитово

1001
OR
0101

1101 , т.е. 9 OR 5 = 13
я вот так это понимаю...
Код:
[Выделить все]
;;; повторяющийся бит удаляется
(logior 9 5) = (+ (+ 1 8) (+ 1 4))
А чтоб жену выбрать и умную и красивую нужно logand использовать

Последний раз редактировалось gomer, 29.09.2010 в 00:15. Причина: может я не ту кнопку нажал?
gomer вне форума  
 
Непрочитано 29.09.2010, 00:02
#1053
Дима_

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


что-то с циатами - я такого не писал
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 29.09.2010, 00:18
#1054
gomer

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
что-то с циатами - я такого не писал
прошу прощения... не вы...
зы давно уже...
gomer вне форума  
 
Непрочитано 29.09.2010, 11:19
#1055
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 421


gomer,

да, я тоже пришел к такому выводу

Задам еще корифеям вопрос:

Если можно, посоветуйте, как сделать:

надо вставлятьТЕКСТ или МТЕКСТ в рамку размером 5 на 10 мм. Чтобы, если он не будет влезать в рамку, коэф-т сжатия текста уменьшился до нужных размеров. Как это реализовать? на лисп?

Последний раз редактировалось Frigate, 29.09.2010 в 12:36.
Frigate вне форума  
 
Непрочитано 29.09.2010, 13:01
#1056
VVA

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


1. проверяй габаритную рамку vla-GetBoundingBox и сравнивай со своей.
2. Для текста textbox
Хотя мтекст да еще с форматированием та еще штучка.
Почитай эти (особенно последнюю) темы
Как получить координаты рамки text?
Автоматический подбор высоты текста
Еще дельные ссылки:
http://forums.autodesk.com/t5/AutoCA...ps/m-p/2076942 (там выложен ShrinkwrapMText v2a.zip)
MText - Set Limits Box to minimum (смотреть коды T Willey и fx.lsp выложенный C Witt)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.09.2010, 13:16
#1057
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 421


VVA

наверное лучше это при помощи ТЕКСТа реализовать, да? К тому же у Express есть функция, которую можно "позаимствовать" (выравнивание текста по границам)


Спасибо за ссылки, Владимир
Frigate вне форума  
 
Непрочитано 29.09.2010, 13:56
#1058
ShaggyDoc

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


Цитата:
наверное лучше это при помощи ТЕКСТа реализовать, да?
Такие тексты с рамками постоянного размера лучше всего делать блоком из рамки и атрибута. Никаких вычислений - только вставка блока и установка значения атрибута. Выравнивание - в свойствах атрибута.
ShaggyDoc вне форума  
 
Непрочитано 29.09.2010, 21:46
#1059
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 421


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Такие тексты с рамками постоянного размера лучше всего делать блоком из рамки и атрибута. Никаких вычислений - только вставка блока и установка значения атрибута. Выравнивание - в свойствах атрибута.

большущее спасибо

Сильное упрощение процесса )))

Век живи, век учись...

Есть напр. номера кабелей С1-1-1, с1-1-2 и тп, а есть С1-49-12... То есть автоматически при выравнивании слишком пестро смотрятся вставки. Придумал, что можно контролировать количество символов в строке кабеля. И если, напр., в строке, определяющей номер кабеля, меньше 10 символов, то добавляем по одному символу "пробел" слева и справа. Естественно, что "пробелы будут добавляться лишь к временным переменным (одной переменной), для придания "ляповатого вида"

Код завтра напишу, пора и спать )))

Последний раз редактировалось Frigate, 29.09.2010 в 22:03.
Frigate вне форума  
 
Непрочитано 29.09.2010, 21:58
#1060
Кулик Алексей aka kpblc
Moderator

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


Надеюсь, не имелось в виду "сделать атрибут с выравниванием по ширине"?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 269 22.07.2019 17:19
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46