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

Вернуться   Форум 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.
Просмотров: 1965904
 
Непрочитано 19.09.2010, 16:18
#1001
Дима_

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


block - это описание блока (то что ты открываешь в редакторе блоков), а insert это вставка описания
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 20.09.2010, 08:48
#1002
Do$

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


Цитата:
Сообщение от Frigate Посмотреть сообщение
А что же тогда значат DXF коды самого объекта “BLOCK”
Я об объекте "BLOCK" впервые слышу.
Цитата:
Сообщение от Frigate Посмотреть сообщение
Причем там есть интересный такой код, под кодом 3 - тоже "Block name", как и код 2. Что это?
Код:
[Выделить все]
((-1 . <Entity name: 7eea9098>) (0 . "INSERT") (330 
. <Entity name: 7ee4acf8>) (5 . "46883") (100 . "AcDbEntity") (67 . 0) (410 . 
"Model") (8 . "НОВЫЕ") (100 . "AcDbBlockReference") (2 . "зигзаг") (10 -19468.9 
-34548.6 0.0) (41 . 0.5) (42 . 0.5) (43 . 0.75) (50 . 3.14159) (70 . 0) (71 . 
0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Типичный entget-список для вхождения блока - нет тут 3-й группы.
Цитата:
Сообщение от Frigate Посмотреть сообщение
Я пока переменную, которой присвоет набор, приравниваю сначала к "0", а затем к nil (сразу nil не присваивается).
Такого быть не должно!
Do$ вне форума  
 
Непрочитано 20.09.2010, 09:15
#1003
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
Типичный entget-список для вхождения блока - нет тут 3-й группы.
У Insert нету, а вот у block есть, только зачем два "Block name"
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 20.09.2010, 09:57
#1004
Do$

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


Я почему-то думал, что в таблице блоков описания тоже как INSERT хранятся - забыл уже, давно не трогал
Do$ вне форума  
 
Непрочитано 20.09.2010, 16:54
#1005
alex8888

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


Помогите, пожалуйста разобраться со свойством Alignment для объекта текст. Как мне получить, точнее задать дополнительную точку для выравнивания текста, а то как и положено, текст ускакивает в точку 0,0

Текст добавляю методом Vla-AddText, хотелось бы, что бы он попадал в заданную точку именно своим центром (аттрибут 4 - acAlignmentMiddle), а не левым нижним углом.
alex8888 вне форума  
 
Непрочитано 20.09.2010, 17:52
#1006
ShaggyDoc

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


Цитата:
Сообщение от alex8888 Посмотреть сообщение
Помогите, пожалуйста разобраться со свойством Alignment для объекта текст. Как мне получить, точнее задать дополнительную точку для выравнивания текста, а то как и положено, текст ускакивает в точку 0,0

Текст добавляю методом Vla-AddText, хотелось бы, что бы он попадал в заданную точку именно своим центром (аттрибут 4 - acAlignmentMiddle), а не левым нижним углом.
Смотри как сделано в функции. Текст сначала добавляется, а потом у него устанавливаются требуемые свойства. Это обычный прием при работе с объектами:

Код:
[Выделить все]
(defun ru-text-add (txt pnt height rotation justification / obj)
;;;
  ;|
ВНИМАНИЕ! для выравнивания A или F передается не точка текста, а список из двух точек!!

 0 acAlignmentLeft 
 1 acAlignmentCenter 
 2 acAlignmentRight 
 3 acAlignmentAligned 
 4 acAlignmentMiddle 
 5 acAlignmentFit 
 6 acAlignmentTopLeft 
 7 acAlignmentTopCenter 
 8 acAlignmentTopRight 
 9 acAlignmentMiddleLeft 
10 acAlignmentMiddleCenter 
11 acAlignmentMiddleRight 
12 acAlignmentBottomLeft 
13 acAlignmentBottomCenter 
14 acAlignmentBottomRight
|;
  (if (null justification)
    (setq justification acalignmentleft)
  ) ;_ end of if
  (ru-error-catch
    (function
      (lambda ()
        (setq
          obj
           (vla-addtext
             (ru-obj-active-space)
             txt
             (if
               (or (= justification acalignmentaligned)
                   (= justification acalignmentfit)
               ) ;_ end of or
                (vlax-3d-point (car pnt))
                (vlax-3d-point pnt)
             ) ;_ end of if
             height
           ) ;_ end of vla-AddText
        ) ;_ end of setq
        (ru-lw-set-for-obj obj (ru-lw-calc-for-text height))
        (cond
          ((= justification acalignmentleft)
           (vla-put-rotation obj rotation)
          )
          ((or (= justification acalignmentaligned)
               (= justification acalignmentfit)
           ) ;_ end of or
           (vla-put-alignment obj justification)
           (vla-put-textalignmentpoint
             obj
             (vlax-3d-point (cadr pnt))
           ) ;_ end of vla-put-textalignmentpoint
          )
          (t
           (vla-put-alignment obj justification)
           (vla-put-textalignmentpoint obj (vlax-3d-point pnt))
           (vla-put-rotation obj rotation)
          )
        ) ;_ end of cond
        (vla-update obj)
        obj
      ) ;_ end of lambda
    ) ;_ end of cond
    (function (lambda (x) (princ (strcat "\nОШИБКА RU-TEXT-ADD: " x)) nil))
  ) ;_ end of ru-error-catch
) ;_ end of defun
ShaggyDoc вне форума  
 
Непрочитано 20.09.2010, 18:39
#1007
alex8888

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


ShaggyDoc, я вроде бы так и делал, только упрощенно

Все, понял, надо ввести точку вот таким макаром:
(vla-put-alignment insert_text acAlignmentMiddle)
(vla-put-textalignmentpoint insert_text insert_point)

Спасибо!

Последний раз редактировалось alex8888, 21.09.2010 в 10:42.
alex8888 вне форума  
 
Непрочитано 22.09.2010, 11:09
#1008
alex8888

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


ShaggyDoc, объясни, пожалуйста, как работает твоя конструкция:
Код:
[Выделить все]
(if (null justification)
    (setq justification acalignmentleft)
  ) ;_ end of if
Если опускаю аргумент justification при задании функции - пишет ошибка-мало параметров. Я как понимаю это необязательный параметр и если он не задан, то принимается значение по умолчанию.
Пробовал поэкспериментировать таким образом и со своей программой, результат тот же - мало параметров. Есть возможность как то обойти такую неприятность?
alex8888 вне форума  
 
Непрочитано 22.09.2010, 11:27
#1009
ShaggyDoc

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


Цитата:
Сообщение от alex8888 Посмотреть сообщение
ShaggyDoc, объясни, пожалуйста, как работает твоя конструкция:
Код:
[Выделить все]
(if (null justification)
    (setq justification acalignmentleft)
  ) ;_ end of if
Если опускаю аргумент justification при задании функции - пишет ошибка-мало параметров. Я как понимаю это необязательный параметр и если он не задан, то принимается значение по умолчанию.
Пробовал поэкспериментировать таким образом и со своей программой, результат тот же - мало параметров. Есть возможность как то обойти такую неприятность?
Количество аргументов в LISP-функциях должно быть именно таким, как указано в объявлениях функции!

Когда требуется заведомо переменное количество каких-то аргументв, их можно передать списком. Список будет одним аргументом для функции, его надо анализировать внутри.

В разбираемой функции вместо аргумента justification можно передать NIL в качестве аргумента, тогда внутри функции аргументу будет присвоено значение по умолчанию acalignmentleft. Но опускать аргумент нельзя.
ShaggyDoc вне форума  
 
Непрочитано 22.09.2010, 11:40
#1010
alex8888

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


Ага, теперь понял

Ну вот, опять
Код:
[Выделить все]
_$ (setq a "120")
"120"
_$ (type a)
STR
_$ (if (= (type a) STR)(setq b (atof a)))
nil
_$ b
nil
_$
Кто может подсказать, что не нравится функции IF?

Последний раз редактировалось alex8888, 22.09.2010 в 13:20.
alex8888 вне форума  
 
Непрочитано 22.09.2010, 15:07
#1011
ShaggyDoc

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


Цитата:
Кто может подсказать, что не нравится функции IF?
То, что ты неправильно написал Сравниваешь "зеленое с квадратным". Догадайся сам, лучше запомнится. Выполни (type a) и (type STR) и увидишь разницу. Или (print STR), т.е. посмотри, что с чем сравниваешь.

Ну, ладно, надо писать (= (type a) 'STR)
ShaggyDoc вне форума  
 
Непрочитано 22.09.2010, 15:27
#1012
alex8888

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


ShaggyDoc,
ну вот голову сломал, а теперь дошло, ведь получается, я как бы переменную STR задаю, а не тип. Вот ведь идиот
Спасибо за помощь, сам бы еще вечность думал бы.
alex8888 вне форума  
 
Непрочитано 23.09.2010, 08:24
#1013
Frigate

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


ПОдскажите, пожалуйста, в таком вопросе:

поняв, что EffectiveName менять нельзя, поменял для всех блоков Name (в том числе и для блоков с "*Ux").
То есть теперь в программах можно обращаться к Name, я верно понимаю?
Проверил еще раз - все блоки отлично переименовываются.

Нет ли здесь каких подводных камней?

Последний раз редактировалось Frigate, 23.09.2010 в 08:50.
Frigate вне форума  
 
Непрочитано 24.09.2010, 11:25
#1014
alex8888

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


ShaggyDoc, не будешь против, если я твои функции буду у себя в программах использовать?

Если нет, то можешь посмотреть у меня в коде, правильность использования "ru-error-catch", да и вообще сам код? Это моя "почти" первая попытка в ООП.

Код:
[Выделить все]
;|****************************************************************************
*                                                                            *
*            Модуль вставки текста                                           *
*                                                                            *
*   Пример вызова:                                                           *
*         (at_text (list ptm "сам текст" "schrift" 30 nil 4))                *
*                 где ptm - точка вставки текста, обязательный параметр      *
*                     "сам текст" - текст сообщения, обязательный параметр   *
*                     "schrift" - слой для текста,  nil = "schrift"          *
*                     30 - высота текста, nil = 30                           *
*                     nil  - угол поворота текста в градусах, nil = 0        *
*                     4  - выравнивание, nil = acAlignmentMiddle             *
*                                                                            *
*      Составлен 20.07.2010  Автор:        alex8888                          *
*      Изменения    20.09.2010-23.09.2010                                    *
*                                                                            *
******************************************************************************|;

(defun at_text (text_list	/		insert_point
		insert_text	text_layer	text_hoehe
		text_winkel	text_alignment	text_obj
	       )

;-------------------- Загрузка расширений -----------------------------------

  (vl-load-com)
  (begin_activex)
  (at_create_layer)
  
;-------------------- Разбор входящего списка -------------------------------
  
  (setq	insert_point   (nth 0 text_list)
	insert_text    (nth 1 text_list)
	text_layer     (nth 2 text_list)
	text_hoehe     (nth 3 text_list)
	text_winkel    (nth 4 text_list)
	text_alignment (nth 5 text_list)
  )					;setq

;--------- Анализ входящих и получение значений по умолчанию ----------------

  (if (= insert_point nil)
    (progn
      (alert "\nERROR: Nicht angegeben Punkt ")
      (exit)
    )					;progn
  )					;if

  (if (= insert_text nil)
    (progn
      (alert "\nERROR: Keine Text gefunden ")
      (exit)
    )					;progn
  )					;if

(if (or (= text_layer nil)
    	(null (tblsearch "layer" text_layer))
     );or
    	(setq text_layer "schrift")
);if

  (if (= text_hoehe nil)
    (setq text_hoehe 30)
  )
  (if (= text_winkel nil)
    (setq text_winkel 0)
  )
  (if (= text_alignment nil)
    (setq text_alignment 4)
  )
  
  (if (= (type text_winkel) 'STR)
    (setq text_winkel (atof text_winkel))
  )					;if
  (if (= (type text_hoehe) 'STR)
    (setq text_hoehe (atof text_hoehe))
  )					;if
  (if (= (type insert_point) 'LIST)
    (setq insert_point (vlax-3d-point insert_point))
  )					;if

;-------------------- Тело функции ---------------------------------------
  
  (ru-error-catch
    (function
      (lambda ()
	(setq text_winkel (degrees_to_radians text_winkel)
	      text_obj	  (vla-addtext
			    model_space
			    insert_text
			    insert_point
			    text_hoehe
			  );vla-addtext
	);setq
	(vla-put-alignment text_obj text_alignment) ;см. Выравнивание
	(vla-put-textalignmentpoint text_obj insert_point)
	(vla-put-layer text_obj text_layer)
	(vla-put-color text_obj 256)
	(vla-put-Rotation text_obj text_winkel)
	(vla-update text_obj)
      )	;lambda
    );function
    (function
      (lambda (x)
	(princ (strcat "\nFunktion at_text ERROR: " x))
	nil
      );lambda
    );function
  );ru-error-catch

  (princ)
);defun

;----------------------- Памятка ---------------------------------------

;Выравнивание:
; 0 acAlignmentLeft 
; 1 acAlignmentCenter 
; 2 acAlignmentRight 
; 3 acAlignmentAligned 
; 4 acAlignmentMiddle 
; 5 acAlignmentFit 
; 6 acAlignmentTopLeft 
; 7 acAlignmentTopCenter 
; 8 acAlignmentTopRight 
; 9 acAlignmentMiddleLeft 
; 10 acAlignmentMiddleCenter 
; 11 acAlignmentMiddleRight 
; 12 acAlignmentBottomLeft 
; 13 acAlignmentBottomCenter 
; 14 acAlignmentBottomRight
alex8888 вне форума  
 
Непрочитано 24.09.2010, 11:48
#1015
Frigate

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


Цитата:
Сообщение от alex8888 Посмотреть сообщение
ПОдскажите, пожалуйста, в таком вопросе:

поняв, что EffectiveName менять нельзя, поменял для всех блоков Name (в том числе и для блоков с "*Ux").
То есть теперь в программах можно обращаться к Name, я верно понимаю?
Проверил еще раз - все блоки отлично переименовываются.

Нет ли здесь каких подводных камней?
и еще 3 вопроса появилось у меня :-) (аппетит приходит во время еды)

1. vla-explode взрывает выбранный блок, но странно как-то – выбранный блок остается, но поверх него мы получаем взорванный блок??? Это так и должно быть???

2. На этом форуме (или схожих) видел чертеж, где были очень интересные блоки. При попытке открыть их редактором пишет :

«Блок содержит объекты-заместители. Не может быть открыт редактором.». Что это за блок такой? Как создать такой блок?

3. Словари в чертежах. Можете дать ссылку на описание, что это такое? Как они хранятся в чертеже? Насколько это надежный источник для хранения пользовательских данных?
Frigate вне форума  
 
Непрочитано 25.09.2010, 07:51
#1016
Кулик Алексей aka kpblc
Moderator

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


1. Да, так и должно быть. ОБъект блока надо удалять программно.
2. Наверняка прокси-объекты и отсутствует соответствующий ObjectEnabler
3. Достаточно надежный. Без определенной квалификации добраться до них невозможно (хотя зачастую вопрос "как снести" решается на ура)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.09.2010, 18:14
#1017
VVA

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


Цитата:
Сообщение от Frigate Посмотреть сообщение
3. Словари в чертежах. Можете дать ссылку на описание, что это такое? Как они хранятся в чертеже?
Спроси у гугла про vlax-ldada-*
Некоторые примеры есть здесь с поста #27
Еще подборка (требуется регистрация)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 26.09.2010 в 13:38.
VVA вне форума  
 
Непрочитано 25.09.2010, 18:51
#1018
ShaggyDoc

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


Цитата:
ShaggyDoc, не будешь против, если я твои функции буду у себя в программах использовать?
Если я их публикую, значит не против "по умолчанию".

В дополнение к #1016.

Надежность хранения данных в словарях такая же, как и всего остального.

А вот надежность создания, изменения, удаления данных из словарей зависти от используемых функций. Штатных недостаточно, необходим примерно десяток дополнительных - чтобы было удобно работать.

Как именно словари хранятся - фирменный секрет. Впрочем, как и всё остальное в DWG. Формат официально закрыт, все сведения получаются "разведывательными" методами. Конечного программиста не должно волновать, "как они хранятся". Важно другое - "как с ними работать".
ShaggyDoc вне форума  
 
Непрочитано 25.09.2010, 19:52
#1019
Frigate

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


Благодарю за ответы.

До пратики со словарями я еще не дошел, но уже много инфы отсортировал, в том числе и разных программ от местных гуру :-)

Сегодня разюирался с тем, как наиболее безболезненно вешать код программ на кнопки. В итоге, методом проб и ошибок, понял кое-что. Прошу подтвердить или опровергнуть мои выводы.

Итак, понял, что для сохранности код от "очумелых ручек" на данном этапе внедрения своих программок в наш отдел, буду пользоваться vlx скомпилированным файлом всех вункций и программ. ПРоверил на 2-х программах. После первого вызова файла, все функции сразу становятся доступными. Теперь понимаю, как можно организовать общую библиотеку, о чем, кстати, в форуме читал дебатов немало.

НАсколько верные выводы?
Frigate вне форума  
 
Непрочитано 25.09.2010, 22:07
#1020
gomer

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


Цитата:
Сообщение от Frigate Посмотреть сообщение
на данном этапе внедрения своих программок в наш отдел, буду пользоваться vlx скомпилированным файлом всех вункций и программ
Не спешите компилировать ради собственно компиляции или чтоб собрать все в кучу... наверняка вас попросят что-нибудь подредактировать... с другой стороны... для любопытных... если что-то перестало работать... переустановка лисп-библиотек плевое дело...
gomer вне форума  
Ответ
Вернуться   Форум 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