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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1552491
 
Непрочитано 20.07.2008, 21:17
#2
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,778
<phrase 1=


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
............
  ) ;_ end of defun
Нехилый для разбора код. Я лично не понимаю в нём половину...
Вообще-то с точки зрения портного самая лучшая фигура - это половая щетка. Именно на ней он может показать всё своё искусство.
>Red Nova
Все простые примеры ты уже прошел?
Из того же Хювенена, книги "САПР на базе..." и всё понимаешь?
М.б. у автора этого текста (почерк в принципе заметен ) найдётся время на комментарии.
IMHO
Но тут не комментарии нужны, это просто стиль программирования.
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...

Последний раз редактировалось Alan, 20.07.2008 в 21:30.
Alan вне форума  
 
Автор темы   Непрочитано 20.07.2008, 21:39
#3
Red Nova

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


Alan,
Цитата:
Из того же Хювенена, книги "САПР на базе..." и всё понимаешь?
Да в том то и дело, что ничего не понимаю.
Прочитал пока 1/3 книги, но и элементарного кода написать не смогу.
Цитата:
Нехилый для разбора код. Я лично не понимаю в нём половину...
Извиняюсь, я выбирал по размеру файла.
Тогда давай так. Если есть время и желание поучить, то выложи пожалуйста простой лисп на твой взгляд, но так, чтобы в нем был выбор объекта (объектов), и работа со свойствами.
И напиши к нему пошаговое пояснение (рассчитанное на полного чайника).
__________________
Блог
Red Nova вне форума  
 
Непрочитано 20.07.2008, 21:52
#4
vic153

проектировщик газопроводов
 
Регистрация: 04.08.2005
Петербург
Сообщений: 295


Может быть, попробовать другой учебник. Мне, например, понравился вот этот http://www.williamspublishing.com/Bo...59-0931-7.html
Несмотря на то, что там много ошибок в листингах. Но первые шаги очень даже помогает сделать.
vic153 вне форума  
 
Непрочитано 20.07.2008, 21:53
#5
Кулик Алексей aka kpblc
Moderator

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


Я не силен в объяснениях...
Код:
[Выделить все]
(defun ; Функция определения пользовательской функции (команды)
c:make-blocks-explodeable ; Полное имя пользовательской команды. Наличие c: впереди
  ; дает возможность вызывать с ком.строки как make-blocks-explodeable
( ; Входящие параметры. Их нет
/ ; Разделитель параметров и локальных переменных. После этого символа идут объявления
  ; локальных переменных
 adoc ; Имена локальных переменных
 )
  (vl-load-com) ; Загрузка ActiveX-расширения.
  (vla-startundomark ; Объявление начальной метки для "_.undo"
    (setq ; Назначить
	adoc  ; переменной adoc
	(vla-get-activedocument ; указатель на текущий документ
    	(vlax-get-acad-object) ; текущей сессии AutoCAD
		))
    ) ;_ end of vla-startundomark
  (vlax-for ; Пройти по всей коллекции
    blk_def ; Перечислитель элементов коллекции
	(vla-get-blocks  ; Коллекция блоков
	  adoc ; текущего документа
	  )
	  ;|
	  В данный момент blk_def - указатель на описание очередного блока текущего файла.
	  |;
    (if ; Если
	(and ; И
	(equal ; полностью равно
	  (vla-get-isxref blk_def) ; Перечислитель - внешняя ссылка
	  :vlax-false ; Ложь, т.е. блок не внешняя ссылка
	  )
             (equal (vla-get-islayout blk_def) :vlax-false) ; то же, но пространство листа/модели
			  ; то есть Layout
             ) ;_ end of and
      (vl-catch-all-apply ; Не вызывая ошибки
	  '(lambda () 
	  (vla-put-explodable blk_def :vlax-true) ; Назначить свойство Explodeable (Разбиваемый)
	   ; описанию блока в True (Истина).
	  ))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc) ; Конечная метка для "_.undo"
  (princ) ; Обеспечивает "тихий" выход.
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.07.2008, 21:57
#6
Кулик Алексей aka kpblc
Moderator

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


Red Nova, #3: лично я начинал с командных методов. Потом - ent*- и vl*-операции. Сейчас смотрю по ситуации. Иногда ent* выгоднее (entmake, entmakex, entmod, entupd), иногда - activex.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 20.07.2008, 22:19
#7
Red Nova

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


vic153,
Она платная, а я в другой стране жтиву. Может есть в общем доступе где?

Кулик Алексей aka kpblc,
Спасибо, попытаюсь из этого слепить что-то свое.
Цитата:
лично я начинал с командных методов.
Стыдно признаться, но я не понимаю что это означает.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 20.07.2008, 22:20
#8
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


to Red Nova
Не забрасывай Хювенена. Отличная книга, очень подробно излагает основы Лиспа, а без них в программировании на этом языке никуда. Процентов 80 кода можно использовать и в AutoLisp.
Donhuan вне форума  
 
Автор темы   Непрочитано 20.07.2008, 22:24
#9
Red Nova

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


Donhuan,
Я просто так ничего не понимаю, там ведь нет примеров для самого автокада. Думаю что мне нужны уроки на самом автокаде.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 20.07.2008, 22:32
#10
Кулик Алексей aka kpblc
Moderator

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


Командные методы: это когда рисование (да и не только оно) выполняется через (command <...>) - то есть прямая передача команд в ком.строку.
Настоятельно рекомендую В.Свет "AutoCAD - язык макрокоманд и создание кнопок" и С.А.Зуев, Н.Н.Полещук (при участии П.В.Лоскутова) "САПР на базе AutoCAD - как это делается). Последнюю книжку надо читать вместе с любым руководством по адаптации AutoCAD'a (например, того же Н.Н.Полещука)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.07.2008, 22:37
#11
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,778
<phrase 1=


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Donhuan,
Я просто так ничего не понимаю, там ведь нет примеров для самого автокада. Думаю что мне нужны уроки на самом автокаде.
Ты посмотри также для начала тему [FONT=Trebuchet MS]Необходимый минимум знаний[/FONT]

В которой любезный kpblc много чего написал для начала работы с ЛИСП
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 21.07.2008, 14:20
#12
Red Nova

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


Кулик Алексей aka kpblc,
Цитата:
Настоятельно рекомендую В.Свет "AutoCAD - язык макрокоманд и создание кнопок"
Скачал. Ты меня поправь если я ошибаюсь, но на сколько я понял там не про лисп.
Цитата:
Н.Н.Полещук (при участии П.В.Лоскутова) "САПР на базе AutoCAD - как это делается).
А на эту книгу поиском ссылки не нашел.
Alan,
Цитата:
Ты посмотри также для начала тему Необходимый минимум знаний
Это все я уже знаю, там написано как можно использовать уже готовые коды, а про написание новых - ничего нет.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 21.07.2008, 14:22
#13
Кулик Алексей aka kpblc
Moderator

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


Да, в книге В.Света "не совсем" про Lisp. Но снять панику перед программированием поможет.
"САПР на базе AutoCAD" на ozon'e
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 21.07.2008 в 15:54.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.07.2008, 14:40
#14
Red Nova

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


Цитата:
Но снять панику перед программированием поможет.
валерьянка тоже в этих целях хорошо идет
Цитата:
"САПР на базе AutoCAD" на ozon'e
Честное слово денег не пожалел бы, но я в стране другой живу, и купить и переправить ее не легко. Может есть ссылка для свободного скачивания?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 21.07.2008, 15:09
#15
GlebbI4

проектирование, обследование
 
Регистрация: 22.10.2006
Днепропетровск
Сообщений: 115
<phrase 1=


"САПР на базе Autocad" с инета вытягивал (только ж там не Полещук-Лоскутов, а ShaddyDoc в соавторстве с Полещуком).
Если вдруг не найдешь - пиши в ЛС сброшу
__________________
Мосты важнее, чем дома, они более святы, чем церкви, ибо сильнее объединяют.. ..они возводятся именно в тех местах, где сходится множество человеческих потребностей, они долговечнее других строений и никогда не служат какой-то скрытой или злой цели..

Последний раз редактировалось GlebbI4, 21.07.2008 в 15:11. Причина: уточнение авторов
GlebbI4 вне форума  
 
Непрочитано 21.07.2008, 15:12
#16
Кулик Алексей aka kpblc
Moderator

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


Общая справка: http://www.ozon.ru/context/help/#1687140
http://www.ozon.ru/context/detail/id/1687460/ - о почтовой доставке.
http://www.ozon.ru/context/detail/id/1540982/ - о курьерской доставке.
Способы оплаты: http://www.ozon.ru/context/detail/id/200890/
Честно скажу, цена на озоне не самая низкая, но как-то попривык я к нему...

GlebbI4, ShaggyDoc и Сергей Александрович Зуев - один и тот же человек. И обрати внимание - я ж написал
Цитата:
С.А.Зуев, Н.Н.Полещук (при участии П.В.Лоскутова)
P.S. Честно говоря, предпочитаю подобные вещи иметь "в твердой" копии.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.07.2008, 15:19
#17
GlebbI4

проектирование, обследование
 
Регистрация: 22.10.2006
Днепропетровск
Сообщений: 115
<phrase 1=


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
GlebbI4, ShaggyDoc и Сергей Александрович Зуев - один и тот же человек. И обрати внимание - я ж написал .
знаю конечно же. Ориентировался на пост
Цитата:
Н.Н.Полещук (при участии П.В.Лоскутова) "САПР на базе AutoCAD - как это делается).
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
P.S. Честно говоря, предпочитаю подобные вещи иметь "в твердой" копии.
аналогично, издания нового нету, а так бы прикупил в твердом переплете.
__________________
Мосты важнее, чем дома, они более святы, чем церкви, ибо сильнее объединяют.. ..они возводятся именно в тех местах, где сходится множество человеческих потребностей, они долговечнее других строений и никогда не служат какой-то скрытой или злой цели..
GlebbI4 вне форума  
 
Непрочитано 21.07.2008, 15:25
#18
Кулик Алексей aka kpblc
Moderator

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


Судя по ссылке на книгу, она у них (на озоне то бишь) есть...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.07.2008, 15:47
#19
Red Nova

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


Кулик Алексей aka kpblc, Спасибо за ссылку.
GlebbI4, Пишу в личку.
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 21.07.2008, 16:08
#20
Red Nova

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


Кулик Алексей aka kpblc,
А может на реальном примере поучишь?
Вот к примеру задумка лиспа с выносками спдс.
Для начало нужно выделить все выноски. Если следовать аналогии с твоим лиспом, то предполагаю что выноски можно выделить так.
(Только не смейся)
Цитата:
(defun c:trans-note (/ adoc)
(vl-load-com)
(vla-startundomark
(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
) ;_ end of vla-startundomark
(vlax-for spds_def (vla-get-spdsNotePositions adoc)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 21.07.2008, 16:26
#21
Кулик Алексей aka kpblc
Moderator

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


Так не покатит (на форуме уже пробовали, простых путей там нет). Получение через ActiveX будет иметь смысл только при работе с файлом, содержащим внешние ссылки (из которых тоже надо будет получать выноски).
Код:
[Выделить все]
(defun c:get-notes-activex (/ adoc lst)
;; Через ActiveX
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-StartUndoMark
  (vlax-for ent (vla-get-modelspace adoc)
    (if (= (vla-get-objectname ent) "mcsDbObjectNotePosition")
      (setq lst (cons ent lst))
      ) ;_ end of if
    ) ;_ end of vlax-for
  ;; Теперь делай со списком чего хотишь
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun

(defun c:get-notes-ent (/ adoc lst _dwgru-conv-pickset-to-list)
;; Через ent*

  (defun _dwgru-conv-pickset-to-list (value / tab item)
    (repeat (setq tab  nil
                  item (sslength value)
                  ) ;_ end setq
      (setq tab (cons (ssname value (setq item (1- item))) tab))
      ) ;_ end repeat
    ) ;_ end defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-StartUndoMark
  (setq lst (vl-remove-if-not
              '(lambda (x) (= (cdr (assoc 0 (entget x))) "spdsNotePosition"))
              (_dwgru-conv-pickset-to-list (ssget "_X"))
              ) ;_ end of vl-remove-if-not
        ) ;_ end of setq
  ;; Теперь делай со списком чего хотишь
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.07.2008, 17:42
#22
Red Nova

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


Нам Xref не надо, так что через ent*.
Но давай не торопиться.
Попытаюсь переварить.
Цитата:
(defun _dwgru-conv-pickset-to-list (value / tab item)
Тут понятно, dwgru-conv-pickset-to-list - команда вызова (в скобках)
value - Входящие параметры
tab item - локальные переменные

Потом что-то не понятное...

Потом опять что-то понял
Цитата:
(vl-load-com)
(vla-startundomark
(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(vl-load-com)-Загружаем Active-X
(vla-startundomark - Начальная метка для Undo
(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
- Назначить переменной adoc чего-то там

Ну и дальше много разных непонятных букв

Можно разжувать?
__________________
Блог

Последний раз редактировалось Red Nova, 22.07.2008 в 10:45.
Red Nova вне форума  
 
Непрочитано 21.07.2008, 23:08
#23
Кулик Алексей aka kpblc
Moderator

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


_dwgru-conv-pickset-to-list - функция, преобразовывающая набор примитивов в список, который уже можно обрабатывать через foreach или mapcar. Там все достаточно просто: определяется длина набора (n), и это количество раз повторяется: добавить в список n-ный элемент набора; n уменьшить на 1.
Строки
Код:
[Выделить все]
(setq lst (vl-remove-if-not
              '(lambda (x) (= (cdr (assoc 0 (entget x))) "spdsNotePosition"))
              (_dwgru-conv-pickset-to-list (ssget "_X"))
              ) ;_ end of vl-remove-if-not
        )
можно перевести так:
переменной lst присвоить список, полученный из набора. Предварительно из списка исключить все элементы, у которых тип (хранится в DXF-коде 0) не равен "spdsNotePosition".
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.07.2008, 10:42
#24
Red Nova

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


А можно медленнее?
Я пытался написать свои предположения, но наверное не стоит, там все равно больше вопросов чем понятного.
Когда будет свободное время напиши пожалуйста пояснение как в посте #5.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 11:51
1 | #25
VVA

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


Red Nova, Не с того конца подходишь. Для тебя пока vl-* и vla-* функции табу. Задание попроще:
1. Название команды - Колонна
2. Запрашивается у пользователя длина A и ширина B
3. Запрашивается точка вставки Pt
4. Точка вставки Pt считается центром прямоугольника AxB
Пиши команду, рисующую колонну. Как минимум на одни грабли наступишь.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.07.2008, 12:08
#26
Alaspher


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


VVA прав на 100% - нельзя начинать учиться игре в шахматы по партиям профессионалов (а приведённый Алексеем код - как раз этого уровня). Начинать надо с простейших примеров для начинающих, тем более, что почти все приёмы в них можно отработать не хуже, чем в самых замысловатых экзерсисах, но гораздо нагляднее. Предложенное задание с "колонной" - само то. Причём писать надо так, чтобы потом программу легко было дополнить например запросом и обработкой угла поворота "колонны". Для этого надо чётко разделять блок ввода с контролем корректности ввода, блок вычислений и блок рисования. Все блоки можно (и нужно) оформить в отдельные функции. Причём каждый блок может так же быть разделён на ещё более простые отдельные функции... Кажущаяся простота задачи обманчива. Разница между кодом уровня "лишь бы как-то..." и "качественный рабочий" велика чрезвычайно.
Alaspher вне форума  
 
Непрочитано 22.07.2008, 12:20
#27
VVA

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


Про поворот колонны как раз было у меня в планах дальше
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.07.2008, 12:24
#28
Alaspher


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


Сорри, что спалил!
Alaspher вне форума  
 
Автор темы   Непрочитано 22.07.2008, 12:42
#29
Red Nova

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


VVA,

Знаешь ведь, что по любому не сумею.
Ну хоть предположу, что на счет запроса ширины надо начать так, а что дальше, это пока для меня не реально.
Код:
[Выделить все]
(defun C:Колонна (/ newstring)
  (setq newstring (getstring T "Введите ширину колонны <Выход>: "))
И то признаюсь, что скопировал с существующего лиспа
Похоже я пока еще ниже уровнем чем даже ты предположил.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 12:51
#30
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Red Nova, я такой же "позорник" который до сих пор лиспом не владеет
Мне вот тоже не помешало бы научиться...но то времени нет то желание пропадает то опять появляется...
Книги у меня есть и не одна а толку мало...

Может нам профессионалы тут будут давать практические задания, а мы попробуем учитьсяна них. Просто по голой книге учиться тяжело... А вот с "репетиторами"... Что скажите?
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 22.07.2008, 12:53
#31
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Например давайте попробуем написать программу складывающие 2 числа хранящиеся в однострочном тексте а результат поместить в 3й текст.
Какие функции необходимо использовать для такой программы?
ЗЫ. программу нужно не оптимизированную, а максимально простую для понимания. без vl- vla- vlr и пр.
ЗЗЫ. Также мне кажется не нужно писать нам готовую программу а потом ее разбирать. Нужно только показать куда копать и чем, естественно помагая в ошибках.
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Автор темы   Непрочитано 22.07.2008, 12:59
#32
Red Nova

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


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

Давай пока разберем пример от VVA (#25), потом приступим к твоему.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 13:03
#33
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Red Nova, была тут похожая тема но там уже не совсем чайника учили. И вообще было кучу тем типа с чего начать и помогите и ляляля
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 22.07.2008, 13:08
#34
VVA

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


Начало правильное.
Ширина колонны - число (будем считать всегда целое). Поэтому надо запросить не строку (getstring), а число. Найди нужное из ряда get* функций.
Давай переменным будем давать осознанные имена. Newstring как-то не вяжится с шириной и числом вообще
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.07.2008, 13:38
#35
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


подскажите мне по задаче из 31го поста.
Необходимые мне функции:
+ складывать чтобы
atof - для преобразования строки в вещественное число
numberp - для проверки. число выбрано или чтото другое
ssget - для того чтобы получить список.
Что еще забыл? и вообще правильно ли выбрал?
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Автор темы   Непрочитано 22.07.2008, 14:12
#36
Red Nova

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


VVA,
Цитата:
Найди нужное из ряда get* функций.
А где взять перечень этих функций?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 14:15
#37
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Red Nova, Купи книгу Полещука AutoLISP и Visual LISP в среде AutoCAD.
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 22.07.2008, 14:19
#38
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Цитата:
Сообщение от VVA Посмотреть сообщение
Начало правильное.
Ширина колонны - число (будем считать всегда целое). Поэтому надо запросить не строку (getstring), а число. Найди нужное из ряда get* функций.
Давай переменным будем давать осознанные имена. Newstring как-то не вяжится с шириной и числом вообще
VVA, наверно это getint?или getreal...
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 22.07.2008, 14:31
#39
Кулик Алексей aka kpblc
Moderator

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


А также getsrting, getpoint
В дополнение к #33: http://dwg.ru/f/showthread.php?t=5650 и http://dwg.ru/f/showthread.php?t=5887
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.07.2008, 14:31
#40
Post

конструктор
 
Регистрация: 29.07.2005
Ростов-на-Дону
Сообщений: 1,080
<phrase 1=


В dnl есть книга Финкельштейн "Autocad библия пользователя", так на диске к этой книге есть дополнительные главы про лисп как раз с такого типа примерами как колонна. Я по ней смог что-то для кружочков с цифрами буквами написать (маркеры осей) и еще такого типа. Дальше, к сожалению, не продвинулся. Там доступно и на примерах объясняют основы... Если в dnl нет диска к книге напишите - я выложу.
__________________
С уважением!!!
Post вне форума  
 
Непрочитано 22.07.2008, 14:34
#41
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Влезу, пожалуй, немного в обучение.
По задаче из #31.
1. Как будут выбираться тексты: по одному или оптом? Для этого можно использовать разные функции: ssget, entget.
2. Это уже как более опытные порекомендуют, но начинать следовало бы с функций, оперирующих dxf-кодами объектов (примитивов), пока не лезть во всякие vla- .
3. Попробуйте пока сделать программу без проверок на ошибки, используйте тестовый файл с точно известными и правильными объектами. Потом переходите на работу с другими файлами - по мере наступания на грабли будете узнавать как эти грабли отсекать.

Итак получается: ssget, ssname, entget, assoc, atof, +, rtos, cons, subst, entmod ( или entmake). Кажется даже в порядке следования не ошибся. setq добавлять по вкусу.

Насчет numberp: посмотрите внимательнее на работу функции atof.
Олег К. вне форума  
 
Непрочитано 22.07.2008, 14:37
#42
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Shoorup Посмотреть сообщение
Например давайте попробуем написать программу складывающие 2 числа хранящиеся в однострочном тексте а результат поместить в 3й текст.
Какие функции необходимо использовать для такой программы?
ЗЫ. программу нужно не оптимизированную, а максимально простую для понимания. без vl- vla- vlr и пр.
ЗЗЫ. Также мне кажется не нужно писать нам готовую программу а потом ее разбирать. Нужно только показать куда копать и чем, естественно помагая в ошибках.
Из вредности:
Код:
[Выделить все]
(defun c:summtext (/ ent1 ent2 res)
  (if (and (setq ent1 (car (entsel "\nУкажи первый однострочник : ")))
           (setq ent2 (car (entsel "\nУкажи второй однострочник : ")))
           ) ;_ end of and
    (progn
      (setq res (+ (atof (cdr (assoc 1 (entget ent1))))
                   (atof (cdr (assoc 1 (entget ent2))))
                   ) ;_ end of +
            ) ;_ end of setq
      (princ (rtos res 2 4))
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
И вариант немного посложнее для понимания
Код:
[Выделить все]
(defun c:summtext2 (/ ent1 ent2)
  (princ
    (if
      (and (setq ent1 (car (entsel "\nУкажи первый однострочник : ")))
           (setq ent2 (car (entsel "\nУкажи второй однострочник : ")))
           ) ;_ end of and
       (strcat
         "\nSumm = "
         (rtos (apply
                 '+
                 (mapcar '(lambda (x) (atof (cdr (assoc 1 (entget x)))))
                         (list ent1 ent2)
                         ) ;_ end of mapcar
                 ) ;_ end of apply
               2
               4
               ) ;_ end of rtos
         ) ;_ end of strcat
       (strcat "\nNothing")
       ) ;_ end of if
    ) ;_ end of princ
  (princ)
  ) ;_ end of defun
P.S. Код без проверок и отлова ошибок.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.07.2008, 14:43
1 | #43
ShaggyDoc

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


Дохлый номер - пытаться научиться на форуме, да еще в одной ветке. Научиться-то на форуме можно, но путем самостоятельного изучения литературы, справки и анализа публикуемых на форуме программ. Только хороших (например, от VVA). К тому же набегут другие со своими задачками. Кому сумму сделать, а кому и профиль одной кнопкой построить. Кто выяснять "кто здесь главный" и т.п. Будет "пожар в публичном доме во время наводнения".

Азбуку "побуквенно" разъяснять некому и некогда. Надо учиться работать. Поместил LISP в редактор VLIDE, выделил имя функции, нажал Ctrl-F1 и видишь справку по этой функции. Смотри, изучай аргументы, результаты, и как это использовано в разбираемой программе.

Очень хорошее учебное пособие поставляется прямо с AutoCAD - в папке Tutorial\Visual LISP. Семь уроков - от самого простого до самого сложного. И всё разжевано в справке - раздел AutoLISP Tutorial. Эта справка есть и в русском варианте, kpblc её выкладывал где-то здесь.

И делать свою программу, поначалу не разбрасываясь на другие.

Колонна - очень хороший пример. Для развития.

Сначала просто спросить размеры, направление и нарисовать прямоугольник. Потом догадаться, что размеры не обязательно каждый раз вводить, а можно по умолчанию предлагать. Потом выбор из типовых сочетаний. Потом не просто прямоугольник, а с решеткой, из уголков, из двутавров. Потом в 3D. И так до упора. А по ходу совершенствования этой программы можно научиться делать и сотни других.

Разбить на логические блоки - начало, ввод, контроль данных, черчение, завершение.

Не умеешь делать "хитрые" функции и не можешь пока понять, как они работают? Не страшно. Научись просто использовать готовые, например из библиотеки DwgRuLispLib

И всё получится!
ShaggyDoc вне форума  
 
Непрочитано 22.07.2008, 14:46
#44
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Кулик Алексей aka kpblc, спасибо но хотелось эту програмулю самому написать - уж больно простая... Лучше напиши мне прогу по теме с коэффициентом сжатия
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Автор темы   Непрочитано 22.07.2008, 14:50
#45
Red Nova

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


Люди добрые, подскажите где взять перечень функций лисп, весь Хювенен прошелся (Т1) там только Get, никаких подвариантов.
(Но только так чтобы было в свободном скачивании.)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 14:52
#46
Кулик Алексей aka kpblc
Moderator

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


Red Nova, vlide -> F1. Там все (ну или почти все )
Shoorup, веришь - элементарно некогда Догадываюсь, что там надо многострочники переформатировать (снимать \W), но мозги сейчас другим забиты
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.07.2008, 14:59
#47
Red Nova

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


ShaggyDoc,

Цитата:
Очень хорошее учебное пособие поставляется прямо с AutoCAD - в папке Tutorial\Visual LISP. Семь уроков - от самого простого до самого сложного. И всё разжевано в справке - раздел AutoLISP Tutorial. Эта справка есть и в русском варианте, kpblc её выкладывал где-то здесь.
У меня таких папок нет (AutoCAD2008, 2009), дал поиск, файлы тоже не нашел.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 15:00
#48
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


ну хоть подскажи может я сам смогу ее сделать... не думаю что она ну очень сложная.
Например мне нужно при выборе текста однострочного получить ее коэффициент сжатия. Как это сделать?
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Автор темы   Непрочитано 22.07.2008, 15:00
#49
Red Nova

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


А что такое Vlide?
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 22.07.2008, 15:14
#50
Red Nova

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


ShaggyDoc,
Нашел. Это теперь тут
AutoCAD 2009\Help
файлы acad_alg.chm, acad_alr.chm, acad_alt.chm
Почитаю
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 15:16
#51
VVA

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


http://lisp.narod.ru/l1.html
http://aco.ifmo.ru/~nadinet/html/alisp.phtml в частности
http://aco.ifmo.ru/~nadinet/html/lectures/lect_lsp.html и
Глава4
http://www.ssga.ru/metodich/autocad/contents.html - ГЛАВА 12
FAQ по LISP писалось для версий Автокада 12-13, но на 95% справедливо и по сей день
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.07.2008, 15:17
#52
Alaspher


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


Цитата:
Сообщение от Shoorup Посмотреть сообщение
при выборе текста однострочного получить ее коэффициент сжатия. Как это сделать?
DXF группа 41
(cdr (assoc 41 (entget <имя примитива>)))

Цитата:
Сообщение от Red Nova Посмотреть сообщение
А что такое Vlide?
Если в комстроке набрать vlide, то откроется встроенный в Автокад редактор, в котором и надо работать с исходиками АвтоЛИСП.
Alaspher вне форума  
 
Непрочитано 22.07.2008, 15:18
#53
Кулик Алексей aka kpblc
Moderator

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


Это не форум, это филиал чата местного значения
Цитата:
Сообщение от Red Nova Посмотреть сообщение
ShaggyDoc,
У меня таких папок нет (AutoCAD2008, 2009), дал поиск, файлы тоже не нашел.
Код:
[Выделить все]
c:\Program Files\AutoCAD 2008\Tutorial\VisualLISP\
Цитата:
Сообщение от Shoorup Посмотреть сообщение
ну хоть подскажи может я сам смогу ее сделать... не думаю что она ну очень сложная.
Например мне нужно при выборе текста однострочного получить ее коэффициент сжатия. Как это сделать?
См.DXF Reference, объект TEXT: 41-я группа. Также в DwgRuLispLib - Модификация ename-представлений примитивов У тебя проблема будет не в модификации примитива, а в вычислении. Там не отрезки, а полилинии. Дополнительная аналитика.
Цитата:
Сообщение от Red Nova Посмотреть сообщение
А что такое Vlide?
Visual Lisp Integrated Developmet Environment (вроде так расшифровывается): интегрированная среда разработки Visual Lisp. Также команда в AutoCAD.
---
Мать моя... Сколько написали, пока я о телефону общался...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.07.2008, 15:24
#54
VVA

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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
"пожар в публичном доме во время наводнения".
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.07.2008, 15:33
#55
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


короче мне такое не осилить... может ктонить сможет мне всетаки помочь с прогой с коэффициентом - я ее сам буду год писать
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Автор темы   Непрочитано 22.07.2008, 15:57
#56
Red Nova

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


VVA, Продолжим пример с колонной. Я нашел в хелпе весь список функций. От туда
Цитата:
Getreal - Pauses for user input of a real number, and returns that real number
Так что она нам и нужна.

Итак.
Код:
[Выделить все]
 (defun C:Колонна (/ columnwidth)
  (setq columnwidth (getreal T "Введите ширину колонны <Выход>: "))
А дальше опять торможу.
К стати, а зачем после getreal ставить “T”?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 16:11
#57
Alaspher


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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
К стати, а зачем после getreal ставить “T”?
Не надо при вызове getreal ставить T - работать не будет, это для getstring, чтоб пробелы можно было разрешить или запретить. Для задания размеров колонны в мм (которые не должны быть дробными) можно использовать и другую функцию. Дальше надо запросить следующие значения, которые идут по логике программы.
Alaspher вне форума  
 
Непрочитано 22.07.2008, 16:13
#58
Кулик Алексей aka kpblc
Moderator

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


А еще лучше, наверное - в данном конкретном случае - сразу запрашивать прямоугольник )
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.07.2008, 16:17
#59
Red Nova

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


Далее надо задать вторую переменную, полагаю что так.
Код:
[Выделить все]
(defun C:Колонна (/ width thickness)
  (setq width (getreal "Введите ширину колонны <Выход>: "))
  (setq thickness (getreal "Введите толщину колонны <Выход>: "))
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 16:24
#60
Кулик Алексей aka kpblc
Moderator

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


А если захочется вводить не с клавиатуры, а с экрана?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.07.2008, 16:40
#61
Red Nova

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


Кулик Алексей aka kpblc, Ну ты хотя бы намеки давай какого типа функцию искать. Это же для меня планета Марс.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 16:47
#62
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


А почему у меня не получается такой код?
Код:
[Выделить все]
(cdr (assoc 41(entget (entsel))))
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 22.07.2008, 16:52
#63
Кулик Алексей aka kpblc
Moderator

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


Red Nova, см. (getcorner)
Shoorup, еще раз внимательно посмотри, что возвращает (entsel).
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.07.2008, 16:52
#64
VVA

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


Red Nova,
Хорошо. Пока будем считать, что пользователь вводит нужные нам данные с клавиатуры.
В ответ на запрос
(setq width (getreal "Введите ширину колонны <Выход>: "))
пользователь может ввести:
1. Пустой ввод (клавиша Enter)
2. 0
3. Положительное число
4. Отрицательное число
Мы должны запретить вводить ему п. №№ 1;2;4. Т.е. только полижительные числа.
Подсказка: см. ф-цию initget
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.07.2008, 17:06
#65
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Кулик Алексей aka kpblc, entsel выдает имя выбранного объекта и координаты точки которые я указал на этом объекте. Получается мне мешают эти координаты?
т.е мне нужно сделать так
Код:
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 22.07.2008, 17:10
#66
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Получилось!!!
надо так:
Код:
[Выделить все]
(cdr (assoc 41(entget(car(entsel)))))
Теперь хочется внести изменения в однострочный текст в точечную пару. Как?
__________________
Поезд который устал от ржавого здравомыслия рельсов...

Последний раз редактировалось Shoorup, 22.07.2008 в 17:16.
Shoorup вне форума  
 
Автор темы   Непрочитано 22.07.2008, 17:16
#67
Red Nova

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


VVA, Из справки

Цитата:
initget
Establishes keywords for use by the next user-input function call
bits
A bit-coded integer that allows or disallows certain types of user input. The bits can be added together in any combination to form a value between 0 and 255. If no bits argument is supplied, zero (no conditions) is assumed. The bit values are as follows:
1 (bit 0) Prevents the user from responding to the request by entering only ENTER.
2 (bit 1) Prevents the user from responding to the request by entering zero.
4 (bit 2) Prevents the user from responding to the request by entering a negative value.
8 (bit 3) Allows the user to enter a point outside the current drawing limits. This condition applies to the next user-input function even if the AutoCAD system variable LIMCHECK is currently set.
Следовательно нам нужно значение 1+2+4=7
То есть где-то мы должны написать
Код:
Но где не пойму.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 17:43
#68
VVA

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


Red Nova, #67
1. Initget действует на 1 запрос get* (getint, getreal и т.п. в helpe есть табличка)
2. Вытекает из п.1 перед каждым getreal.
Запусти эти 2 строчки в VLIDE на выполнение и попробуй ввести что-нибудь недопустимое (кроме ESC)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 22.07.2008, 17:55
#69
Red Nova

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


VVA,
Тогда наверное лисп должен выглядеть так
Код:
[Выделить все]
(defun C:Колонна (/ width thickness)
  (setq width ((initget 7) (getreal "Введите ширину колонны <Выход>: ")))
  (setq thickness ((initget 7) (getreal "Введите толщину колонны <Выход>: ")))
Подозреваю что в вопросе скобок я могу ошибиться.

Цитата:
Запусти эти 2 строчки в VLIDE на выполнение и попробуй ввести что-нибудь недопустимое (кроме ESC)
Вот что получилось, наверное это хороший знак
Цитата:
Введите ширину колонны <Выход>: -100

Value must be positive and nonzero.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 17:58
#70
VVA

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


Так
Код:
[Выделить все]
(defun C:Колонна (/ width thickness)
  (initget 7)
  (setq width (getreal "Введите ширину колонны <Выход>: "))
  (initget 7)
  (setq thickness (getreal "Введите толщину колонны <Выход>: "))
  ;... Здесь будет продолжение
  )
Теперь у тебя есть команда Колонна, которая запрашивает размеры.
Дальше нужно запросить точку отрисовки и отрисовать колонну
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.07.2008, 18:04
1 | #71
ShaggyDoc

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


Молодец, Red Nova. Вопросы всё более разумные.

Совет: Сделай VLIDE своим постоянным инструментом. Может быть даже кнопочкой.

Создай в редакторе пустой файл и вставляй в него фрагменты кода. Сохрани файл в папочку, созданную в "подходящем месте" под именем, например, "эксперименты.lsp". В дальнейшем все свои Лиспы сохраняй во всякие подпапки этой папки.

Выделенные фрагменты кода из "экспериментов" отправляй на выполнение в AutoCAD кнопочкой "загрузить выделенный фрагмент". В окно "Консоль" будут возвращаться результаты. Их можно выделить и скопировать в окно программы и спрятать за комментариями. Чтоб наглядно видеть результат.

Для начала можно и код более наглядно писать. Например, вводить переменные:

Так пишет профи:

Код:
[Выделить все]
 
(cdr (assoc 41(entget(car(entsel)))))
А можно:

Код:
[Выделить все]
 
(if (setq результат_выбора (entsel "Выбери примитив:"))
(progn
(setq имя_примитива (car результат_выбора))
(print имя_примитива)
(setq данные_примитива (entget имя_примитива))
(print данные_примитива)
;;; И так далее
)
)
Потом, когда появится внутреннее понимание, такой код нужно оптимизировать - убрать все лишнее.

Успехов!
ShaggyDoc вне форума  
 
Непрочитано 22.07.2008, 18:08
#72
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
...Так пишет профи:

Код:
[Выделить все]
 
(cdr (assoc 41(entget(car(entsel)))))
Да ну брось ты я еще только начинаю
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Автор темы   Непрочитано 22.07.2008, 19:38
#73
Red Nova

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


VVA,
Думаю как-то так
Код:
[Выделить все]
(defun C:Колонна (/ width thickness base)
  (initget 7)
  (setq width (getreal "Введите ширину колонны <Выход>: "))
  (initget 7)
  (setq thickness (getreal "Введите толщину колонны <Выход>: "))
(setq base (getpoint "Введите точку вставки колонны <Выход>: ")) 
  ;продолжение
)
Далее надо начать строить полилинию вокруг этой точки, пока этого я не могу, пороюсь в лиспах...

ShaggyDoc,
Постараюсь работать с VLIDE, хотя пока совсем не понял что там к чему.
Цитата:
Так пишет профи:


Код:

(cdr (assoc 41(entget(car(entsel)))))
А можно:


Код:

(if (setq результат_выбора (entsel "Выбери примитив:"))
(progn
(setq имя_примитива (car результат_выбора))
(print имя_примитива)
(setq данные_примитива (entget имя_примитива))
(print данные_примитива)
;;; И так далее
)
)
Потом, когда появится внутреннее понимание, такой код нужно оптимизировать - убрать все лишнее.
Пока не понимаю не того не другого (правда хелп не смотрел). Но надеюсь это вопрос времени.
__________________
Блог

Последний раз редактировалось Red Nova, 22.07.2008 в 20:26.
Red Nova вне форума  
 
Непрочитано 22.07.2008, 20:44
#74
ShaggyDoc

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


А вообще-то надо начинать не с кодирования, а с постановки задачи. То есть с составления "плана". Его можно сразу писать в иде комментариев, а потом постепенно реализовывать. Грамотная постановка - половина дела.

Например, для колонны сразу надо решать:

1. Одна ли это колонна, или целый ряд (одна как частный случай)? Как потом одну размножать, если ряд под каким-то углом?

2. Что это за точка вставки по отношению к самой колонне? Центр? Но центр не всегда известен, может быть и колонна с нулевой привязкой к оси. Тогда центр придется как-то еще вычислять.

3. Что это за "ширина" и "толщина"? У колонны есть два размера, но их надо как-то правильно назвать. Например "размер вдоль ряда", "размер поперек ряда".

и т.д.

Пиши сначала постановку, пусть примитивно. Например:
Код:
[Выделить все]
 
 
;; 1. Запрос продольного размера с возможностью выхода
;; 2. Если размер введен, запрос второго размера без возможности прерывания, иначе выход из программы.
;; 3. В цикле, до пустого ввода, запрос точки центра колонны
 
;; если точка указана, переход к 4, иначе выход из программы.
 
;; 4. Запрос направления ряда в виде запроса точки с привязкой от заданной центральной точки
 
;; 5. рисование одной колонны
И т.д. В том числе с возможностью задать количество колонн и пролет.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 22.07.2008, 21:01
#75
Red Nova

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


ShaggyDoc,
Ну этому тоже надо еще поучиться.
Получается три из пяти пунктов уже реализованы.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 22.07.2008, 21:11
#76
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Пока не понимаю не того не другого (правда хелп не смотрел). Но надеюсь это вопрос времени.
Цитата:
(cdr (assoc 41(entget(car(entsel)))))
Да тут особо понимать то нечего... готовый код гораздо проще разобрать что и зачем нежели самому написать... во всяком случае мне...
Ну попробую обьяснить что называется "от чайника чайнику"
1. Нужна книга Полещука которая упоминалась выше. Там по каждой функции мало того что можно почитать но и увидеть вполне толковый пример.
2. Лично я разбираю с внутренних функций, т.е. то что будет выполняться первым.
А первым будет выполняться (entsel). Как я писал выше этим мы получим уникальное имя и координаты туда где ткнули при выборе текста.
Для профилактики вводи в комстроке по функционально и смотри что возвращает функция.
(entget(car(entsel)))
тут entget выведет нам все "свойства" выбранного объекта, но в качестве аргумента ему нужно имя выбранного объекта. А так как у нас (entsel) дает по мимо имени еще и координаты (которые мешают - слишком много аргументов)то их можно "отсечь" вот так: (car(entsel)) - тоже попробуй ввести с carи без и посмотри что возвращается.
assoc 41эта функция вытянет нам необходимое свойство в виде точечной пары - в данном случае коэффициент сжатия.
(assoc 41(entget(car(entsel)))) - вводишь это и тебе вернется (41 . 0.8) например - это точечная пара, про точечные пары читай Полещука там все очень понятно.
Ну а так как нам нужно лишь получить коэфициент сжатия то нужно "отсечь" то что впереди. Делаем это с помощью cdr в итоге получим 0.8
Вот и всё! проще некуда Но лично я "досямкал" только с подачи Алексея так что по сути я разобрался только в том что мне написали
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 22.07.2008, 21:43
#77
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Из вредности:
Код:
[Выделить все]
(defun c:summtext (/ ent1 ent2 res)
  (if (and (setq ent1 (car (entsel "\nУкажи первый однострочник : ")))
           (setq ent2 (car (entsel "\nУкажи второй однострочник : ")))
           ) ;_ end of and
    (progn
      (setq res (+ (atof (cdr (assoc 1 (entget ent1))))
                   (atof (cdr (assoc 1 (entget ent2))))
                   ) ;_ end of +
            ) ;_ end of setq
      (princ (rtos res 2 4))
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
Алексей, все понятно кроме одной строчки: (princ (rtos res 2 4))
Поясни пожалуйста чайнику
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 22.07.2008, 22:28
#78
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


rtos - конвертирует число в строку
res - число
2 - режим ("десятичный")
4 - точность (число знаков после запятой)
Donhuan вне форума  
 
Непрочитано 22.07.2008, 22:45
#79
Кулик Алексей aka kpblc
Moderator

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


В дополнение к #74: раскрою "секрет", как я пишу свои лиспы. Сначала defun и придуманное имя функции. Потом в комментарии прописываю, что функция делает, какие параметры принимает, что возвращает. А там уже и код можно делать. В любой момент возвращаюсь в начало файла и смотрю - а то ли я делаю?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.07.2008, 23:07
#80
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Кулик Алексей aka kpblc, ShaggyDoc, VVA, а пользуетесь ли вы блок схемами при написании программ на лиспе?
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 22.07.2008, 23:34
#81
Кулик Алексей aka kpblc
Moderator

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


Я - не пользуюсь.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.07.2008, 06:18
#82
ShaggyDoc

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


Зачем блок-схемы? Это для первоклассников - чтоб на доске рисовать. Места много, толку мало. И не все выразишь. Алексей правильно делает - заготовка пустой функции, план в комментариях, потом реализация.

Цитата:
Получается три из пяти пунктов уже реализованы.
Ничего не реализовано. Читать надо внимательно. На первом этапе важен контроль ввода, обработка ситуаций нажатия ESC, пустого ввода. Да еще и надо предотвращение ошибок делать. Это можно оставить на усовершенствование, но забывать нельзя.
ShaggyDoc вне форума  
 
Непрочитано 23.07.2008, 08:18
#83
Кулик Алексей aka kpblc
Moderator

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


Позволю себе высказаться о последовательности разработки "сложения значений из 2 или более однострочных текстов или атрибутов":
1. Разработать или спереть функцию отлова ошибок (_ru-error-catch, _dwgru-error-catch)
2. Разработать или спереть функцию безошибочного указания примитива, возможно, с контролем возвращаемого типа. Сделать универсальной (т.е. дать возможность использовать и nentsel, при необходимости).
3. Решить раз и навсегда - функция будет обрабатывать 2 примитива? Или их надо указывать набором? В зависимости от этого будет немного меняться решение.
4. После п.3 написать часть получения текстовой строки (однострочного текста / атрибута) и перевода его в числовое значение. Ну и сложить. Сделать результат вычисления возвращаемым значением.
5. Написать общую функцию, которая загрузит все служебные функции и покажет результат.
5.1. Если результат надо выводить в однострочный текст, то потребуется функция создания однострочного текста. Подробности - самостоятельно (слишком много нюансов).
5.2. Если результат выводить в ком.строку или в alert - то все просто, но и это надо учитывать
---
6. Решить вопрос с предоставлением функции сторонним пользователям. Да и про себя, любимого, тоже забывать не след Возможно, разработать меню.
===
"Зачем так сложно!?" Затем, что функция безошибочного указания примитива, скорее всего, понадобится еще не одну сотню раз. И функция отлова ошибок.
Короче, "САПР на базе" в руки и вперед
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.07.2008, 09:35
#84
Red Nova

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


ShaggyDoc,
Цитата:
Ничего не реализовано. Читать надо внимательно. На первом этапе важен контроль ввода, обработка ситуаций нажатия ESC, пустого ввода. Да еще и надо предотвращение ошибок делать. Это можно оставить на усовершенствование, но забывать нельзя.
Ну дай сперва хотя бы что-то самое простое разработать, а это все пока для меня слишком.
Пока мне хотелось бы понять как задачку от VVA дописать в самом простом виде. Полистал я хелп и лиспики разные тоже, но пока не понял какие функции надо использовать, чтобы построить полилинию по координатам относительно центра вставки.
Shoorup,
Цитата:
Да тут особо понимать то нечего... готовый код гораздо проще разобрать что и зачем нежели самому написать... во всяком случае мне...
Ну попробую объяснить что называется "от чайника чайнику"
Спасибо, я имел ввиду что не все эти функции пока знаю.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 23.07.2008, 09:46
#85
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


>> Red Nova
Постройка полилинии по координатам:
- команда _.PLINE ;
- функция entmake ;
- vla-функции.
Выбирай.
Олег К. вне форума  
 
Непрочитано 23.07.2008, 09:48
#86
Кулик Алексей aka kpblc
Moderator

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


Red Nova, а ты как собираешься эту полилинию строить? Командой? entmake? vla?
Сильно подозреваю, что командой Поэтому - сначала получаешь центр, потом вычисление точек, потом не забыть osmode, команда _.pline, передать параметры, вернуть обратно osmode. Простейшая функция готова.
Переменные перевести в локальные обязательно! Потом можешь посмотреть на *error* и почти универсальный обработчик ошибок.
---
Не, это точно чат!
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.07.2008, 09:51
#87
Red Nova

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


Олег К.,
Мне VVA пока запретил vla-функции .
Про команду _.PLINE не очень понял, разве в программу аутолисп можно вписать обычную команду?
Остается функция entmake. Почитаю про нее.
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 23.07.2008, 09:56
#88
Red Nova

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


Кулик Алексей aka kpblc,
Цитата:
Red Nova, а ты как собираешься эту полилинию строить? Командой? entmake? vla?
Сильно подозреваю, что командой Поэтому - сначала получаешь центр, потом вычисление точек, потом не забыть osmode, команда _.pline, передать параметры, вернуть обратно osmode. Простейшая функция готова.
Переменные перевести в локальные обязательно! Потом можешь посмотреть на *error* и почти универсальный обработчик ошибок.
Напиши пожалуйста список функций, которые надо для этого применять, чтобы знать где копать.
__________________
Блог

Последний раз редактировалось Red Nova, 23.07.2008 в 10:08.
Red Nova вне форума  
 
Непрочитано 23.07.2008, 10:22
#89
Кулик Алексей aka kpblc
Moderator

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


getpoint, getdist (для указания ширины и высоты), getvar, setvar, command
Для вычисления точек пока используй напрямую setq и результат подставляй в command.
Как вариант, без учета поворота:
Код:
[Выделить все]
(defun red:command (/               center          osmode
                    width           height          low_left_point
                    low_right_point up_right_point  up_left_point
                    )
  (if (and (setq center (getpoint "\nЦентр колонны "))
           (setq width (getdist "\nШирина сечения колонны "))
           (setq height (getdist "\nВысота сечения колонны "))
           ) ;_ end of and
    (progn
      (setq osmode          (getvar "osmode")
            low_left_point  (list (- (car center) (* width 0.5))
                                  (- (cadr center) (* height 0.5))
                                  ) ;_ end of list
            low_right_point (list (+ (car low_left_point) width)
                                  (cadr low_left_point)
                                  ) ;_ end of list
            up_right_point  (list (car low_right_point)
                                  (+ (cadr low_right_point) height)
                                  ) ;_ end of list
            up_left_point   (list (- (car up_right_point) width)
                                  (cadr up_right_point)
                                  ) ;_ end of list
            ) ;_ end of setq
      (setvar "osmode" 0)
      (command "_.pline"          low_left_point     low_right_point
               up_right_point     up_left_point      "_c"
               ) ;_ end of command
      (setvar "osmode" osmode)
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.07.2008, 10:27
#90
Red Nova

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


Кулик Алексей aka kpblc, Если честно, ты мне обломал урок, Не буду смотреть пока твой код, я ведь хочу сам. Притворюсь, что ты ничего не выкладывал.

Цитата:
getpoint, getdist (для указания ширины и высоты), getvar, setvar, command
А вот это посмотрю.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 23.07.2008, 10:39
#91
Кулик Алексей aka kpblc
Moderator

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


Код сделал прежде всего для анализа
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.07.2008, 11:10
1 | #92
VVA

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


Red Nova, Продолжим. Сейчас мы имеем такой код
Код:
[Выделить все]
(defun C:Колонна (/ width thickness base)
  (initget 7)
  (setq width (getreal "Введите ширину колонны <Выход>: "))
  (initget 7)
  (setq thickness (getreal "Введите толщину колонны <Выход>: "))
(setq base (getpoint "Введите точку вставки колонны <Выход>: ")) 
  ;продолжение
)
и
1. Мы не знаем vla-* функций (не можем обработать ESC)
2. Мы даже пока не знаем, что такое dxf коды (А ведь не знаем, правда?) Поэтому до того как
Цитата:
Остается функция entmake. Почитаю про нее.
нужно разобраться что такое dxf коды.
Остается пока
Цитата:
Про команду _.PLINE не очень понял, разве в программу аутолисп можно вписать обычную команду?
Можно! И именно так пока будем строить колонну.
Пару критических замечаний по существующему коду:
1. Мы ф-цией (initget 7) запрещаем пустой ввод. Поэтому здесь
"Введите ширину колонны <Выход>: " - <выход> не уместен.
А вот в getpointe мы пустой ввод не запрещаем, запрещать не будем, а выход заменим на 0,0.
Т.е. задача такая:
В случае нажатия ENTER на запрос getpoint присвоить переменной base точку с координатами 0,0
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 31.07.2008 в 10:41.
VVA вне форума  
 
Непрочитано 23.07.2008, 11:27
#93
ShaggyDoc

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


Анализ показал, что колонна всегда будет смотреть в одну сторону.


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

Попробуйте-ка что-нибудь нарисовать на другом языке высокого уровня, и даже на LISP, но вне Автокада.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 23.07.2008, 12:58
#94
Red Nova

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


VVA,
Ты хороший педагог.
Цитата:
. Мы даже пока не знаем, что такое dxf коды (А ведь не знаем, правда?)
Само собой не знаем.

Цитата:
Т.е. задача такая:
В случае нажатия ENTER на запрос getpoint присвоить переменной base точку с координатами 0,0
В программе построения графиков от по внешнему файлу Кулик Алексей aka kpblc, нашел функцию cond
Из справки

Цитата:
Cond
As shown, cond can be used as a case type function. It is common to use T as the last (default) test expression. Here's another simple example. Given a user response string in the variable s, this function tests the response and returns 1 if it is Y or y, 0 if it is N or n; otherwise nil.
(cond
((= s "Y") 1)
((= s "y") 1)
((= s "N") 0)
((= s "n") 0)
(t nil)
)
Думаю это означает, что Cond нам и нужен.
Думаю надо так
Код:
[Выделить все]
(cond
(getpoint "\Введите точку вставки колонны <0,0,0> :")
(t '(0. 0. 0.)))
То есть, учитывая еще твои замечания, а так же рекомендации от ShaggyDoc, лисп будет такой.

Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base)
(initget 7)
(setq dimensionX (getreal "Введите ширину колонны: "))
(initget 7)
(setq dimensionY (getreal "Введите толщину колонны: "))
(setq base 
            (cond
(getpoint "\Введите точку вставки колонны <0,0,0> :")
(t '(0. 0. 0.)))
) 
  ;продолжение
)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 23.07.2008, 13:30
#95
Alaspher


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


если использовать cond, то надо немного подкорректировать:

Код:
[Выделить все]
(setq base 
            (cond
((getpoint "\Введите точку вставки колонны <0,0,0> :"))
(t '(0. 0. 0.)))
)
Alaspher вне форума  
 
Автор темы   Непрочитано 23.07.2008, 13:36
#96
Red Nova

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


А в чем смысл сдвоенной скобки?
И зачем тут
Цитата:
(0. 0. 0.)
после последнего нуля ставят точку?
__________________
Блог

Последний раз редактировалось Red Nova, 23.07.2008 в 14:38.
Red Nova вне форума  
 
Непрочитано 23.07.2008, 14:04
#97
Alaspher


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


Функция cond обрабатывает аргументы, как списки. Если список, возвращает nil, переходит к следующему спску, если возвращено не nil, то полученное значение возвращается без обработки следующий списков. Список обрабатывается следующим образом - вычисляется первый элемент списка, если он не nil, то вычисляются все последующие элементы списка, последний вычисленный элемент возвращается. В случае:
Код:
[Выделить все]
(getpoint "\Введите точку вставки колонны <0,0,0> :")
первый элемент getpoint - он невычисляем и будет ошибка, в случае:
Код:
[Выделить все]
((getpoint "\Введите точку вставки колонны <0,0,0> :"))
первый элемент: (getpoint "\Введите точку вставки колонны <0,0,0> :") - его результат и будет возвращён (поскольку других нет).
Alaspher вне форума  
 
Непрочитано 23.07.2008, 14:05
#98
ShaggyDoc

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


Все-таки советую больше внимания уделить продумыванию алгоритма. Например, само рисование колонны. Вроде бы прямоугольник. Но из чего? Можно из отрезков, а можно полилинией. Можно и залитый, а можно и прозрачный. У колонны могут еще и свои "осики" быть. Двухветвевой она может быть или сплошной.

Приведу пример, как колонны в ruCAD рисуются в 2D. Сначала выбор из иллюстрированного меню (прилагаю скриншот). Там сразу выбирается типоразмер и вид колонны. Не обязательно самому именно такое меню делать, можно и просто в AutoCAD-овское встроить.

А вот протокол работы после выбора типа:

AutoCAD спрашивает:

Пролет=6000, Количество=1. Точка начала ряда [Пролет/Количество]<Выход>:К

То есть можем нарисовать и одну, и целый ряд с заданным пролетом. Можем сразу указать точку, а можем выбрать опции Пролет или Количество или просто нажать Enter и закончить работу.

Допустим, ввели опцию К (можно из автоматически сформированного контекстного меню, можно с клавиатуры).

Тогда спросит:
Количество [Указать]<1>:5

После ввода количества возобновляется допрос:

Пролет=6000, Количество=5. Точка начала ряда [Пролет/Количество]<Выход>:

Укажем точку. Тогда вопрос:

Направление ряда:

Здесь надо указать точку. После того рисуется целый ряд колонн (см. рис), и снова вопросы:

Пролет=6000, Количество=5. Точка начала ряда [Пролет/Количество]<Выход>:

То есть можно и еще несколько рядов указать. Или сделать пустой ввод и закончить программу.

Вот это как бы постановка задачи - что надо получить и как должно работать. Разумеется, могут быть и другие варианты.

А вот и программирование:

Всего одна строчка, вписываемая в меню.

Код:
[Выделить все]
 
(ru-draw-column "common\\ru-lib-column" "ru_column_2" 500 1000))
Всё делает одна функция, которой передаются аргументы, в частности размеры колонны.

Такой вызов легко модернизирует любая "тетка". Меняй 500 и 1000 на другие значения и будешь иметь кучу "команд".

Если же надо сплошную колонну 600х600, вызов немного другой:

Код:
[Выделить все]
 
(ru-draw-column "common\\ru-lib-column" "ru_column_1" 600 600))
И здесь возможны множество вариантов. Вся хитрость только в знании аргументов функции. И, разумеется, в обеспечении загрузки какой-то библиотеки, где эта функция определена. Но и для программирования мы также должны позаботиться о загрузке "кое-чего" стандартного. Например, (vl-load-com) сделать.

И вообще это совсем не обязательно для колонн, а для чего угодно подходит, где надо любое изображение с заданными габаритными размерами нарисовать сколько-то раз с заданным шагом. Картошку, например, рассадить.

Само же кодирование дело более техническое. Конечно, там нужны и знания и мастерство, но это всё-таки труд для "Microservs". Хорошую постановку задачи потом легче и реализовать в коде.

Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 23.07.2008, 14:19
#99
Red Nova

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


ShaggyDoc,
Цитата:
Все-таки советую больше внимания уделить продумыванию алгоритма
Ты прав конечно же, VVA как раз по ходу дела и постановку задачи раскрывает, а-то я сразу не понял бы что к чему. Поэтапно понятнее.
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 23.07.2008, 18:03
#100
Red Nova

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


VVA
Почитал немного про command
Из хелпа
Цитата:
The following example sets two variables pt1 and pt2 equal to two point values 1,1 and 1,5. It then uses the command function to issue the LINE command in the Command Reference and pass the two point values.
Command: (setq pt1 '(1 1) pt2 '(1 5))
(1 5)
Command: (command "line" pt1 pt2 "")
line From point:
To point:
To point:
Command: nil
Но прежде чем строить полилинию надо определить точки. Для этого надо ввести переменные pt1 pt2 pt3 pt4. Затем дать им значения, которые в математическом виде выглядят так:
Х pt1 =Х base – (dimensionX/2)
Y pt1 =Y base – (dimensionY/2)
И так далее для всех точек.
Теперь попробую это представить как лисп выражение
Код:
[Выделить все]
( setq pt1
            ( list ( 
                     ( - ( car base ) ( : dimensionX  2 ) )
                     ( - (cadr base ) ( : dimensionY  2 ) )
                   )
            )
 )
Ну и по тому же принципу для остальных точек.
Затем
Код:
[Выделить все]
 (command "pline" pt1 pt2 pt3 pt4)
Я прав?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 23.07.2008, 18:07
#101
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


знак деления только другой
и скобка одна лишняя после list
Олег К. вне форума  
 
Непрочитано 23.07.2008, 19:01
#102
VVA

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


Ты с cond разобрался? Еще можно было использовать оператор if
По поводу точек. В общем все правильно, за исключением ошибок, на которые указал Олег К.,
Мой вопрос красным
Код:
[Выделить все]
  ( setq pt1
            ( list ( ;<= Что ты имел ввиду ставя эту скобку
                     ( - ( car base ) (/ dimensionX  2 ) )
                     ( - (cadr base ) (/ dimensionY  2 ) )
                   ) ;<= Что ты имел ввиду ставя эту скобку
            )
 )
*** Вдогонку
Здесь нужно учитывать особенности лисп при приведении типов
Выполни у себя в редакторе и сделай выводы
Код:
[Выделить все]
(/ 1 2)
(/ 1 2.0)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 24.07.2008, 10:09
1 | #103
Red Nova

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


VVA,
Про вопрос красным.
Я ошибочно полагал, что содержимое List должно находится в скобках.
Цитата:
Выполни у себя в редакторе и сделай выводы
Код:
(/ 1 2)
(/ 1 2.0)
Пока не понял. В редакторе на первое ответ 0, на второе 0,5. Почему так происходит не понимаю. Может все цифры надо записывать с десятичными? Но в таком случае почему 1 не записывается как 1,0
__________________
Блог
Red Nova вне форума  
 
Непрочитано 24.07.2008, 10:33
#104
VVA

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


Здесь я дал задание. Оно относится и к тебе. Внимательно почитай про функции.
"Красный" вопрос пока остается. Почитай (с разбором каждой главы в vlide) и попробуй еще раз ответить.
По поводу (/ 1 2) и (/ 1 2.0) - здесь вопрос приведения типов.
1. Если ЦЕЛОЕ делится (умножается) на ЦЕЛОЕ, то получается ЦЕЛОЕ (целое от 0.5 - 0)
2. Если ЦЕЛОЕ делится (умножается) на ВЕЩЕСТВЕННОЕ, то получается ВЕЩЕСТВЕННОЕ (это то, которое real)
Это я к тому, что в этом месте
Код:
[Выделить все]
(/ dimensionX  2 )
программист (то есть ты) должен быть абсолютно уверен, что dimensionX всегда должно быть вещественным (real). В данном случае так и есть. См.
Код:
[Выделить все]
(setq dimensionX (getreal "Введите ширину колонны: "))
Но если ты не уверен, то можно явно привести к типу REAL
Код:
[Выделить все]
(/ dimensionX  2.0 )
(* dimensionX  0.5 )
(/ dimensionX  2 1.0 )
Те же куриные продукты, только сбоку.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.07.2008, 11:06
#105
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


С делением и я разобрался а с этими чертовыми списками чтото туплю...
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 24.07.2008, 11:24
#106
ShaggyDoc

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


И вообще для колонн размер надо задавать сразу REAL. Мало ли что чаще всего они выражаются в целом количестве миллиметров. А если понадобится работать в единицах "метры"? Если на плане сетей надо будет колонну поставить? Да и вводить данные удобнее - можно getdist использовать.
ShaggyDoc вне форума  
 
Непрочитано 24.07.2008, 14:24
#107
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


>> Shoorup
Выполни в редакторе вот такие выражения:
(list ((* 5 2) (/ 8 4)))
(list (* 5 2) (/ 8 4))
(list '(* 5 2) '(/ 8 4))
и посмотри чем отличаются результаты.
При вычислениях лучше перебдеть (ведь пока нет отлова ошибок?) и делать явно задаваемые числа вещественными.
Не помню, говорили ли здесь, в vlisp'e есть хорошие возможности проверки кода на ошибки. Самые простые на панельке "Tools" (в стандартном виде - третья слева во второй строке). На код из #100 точно бы 2 раза ругнулся.
Олег К. вне форума  
 
Непрочитано 24.07.2008, 14:53
#108
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Добрый день, полезная тема, тоже как раз начал изучать лисп.
Прделагаю начать с самого простого а потом усложнять.
А то для начинающих сложно освоить все сразу.
Давайте вернемся к простой задаче
Цитата:
Сообщение от VVA Посмотреть сообщение
Red Nova, Не с того конца подходишь. Для тебя пока vl-* и vla-* функции табу. Задание попроще:
1. Название команды - Колонна
2. Запрашивается у пользователя длина A и ширина B
3. Запрашивается точка вставки Pt
4. Точка вставки Pt считается центром прямоугольника AxB
Пиши команду, рисующую колонну. Как минимум на одни грабли наступишь.
Вот мое решение:
Код:
[Выделить все]
(defun c:колонна (/ a b p x1 y1 x2 y2)

	(setq a (getreal"\nВведите ширину колонны:"))
	(setq b (getreal"\nВведите высоту колонны:"))
	(setq p (getpoint"\nУкажите центр колоны:"))
	(setq x1 (- (car p) (/ a 2))) 
	(setq y1 (- (car (cdr p)) (/ b 2)))
	(setq x2 (+ (car p) (/ a 2)))
	(setq y2 (+ (car (cdr p)) (/ b 2)))
	(command "._pline"
		(list x1 y1)
		(list x1 y2)
		(list x2 y2)
		(list X2 y1)
		"_close"
	)
)
Понимаю что можна было - бы обойтись без переменных х1,х2,у1,у2 - но для начала можна и использовать.
Теперь можна усложнять.
Постепенно.
andery вне форума  
 
Непрочитано 24.07.2008, 15:20
#109
VVA

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


Нужно подождать пока Red Nova и Co подтянуться. А тебе пока нужно
1. На запрос ширины и длинны запретить пустой ввод,ввод отрицательных чисел и 0
2. На запрос точки на ввод по умолчанию принять координату 0,0,0.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.07.2008, 16:27
#110
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Цитата:
Сообщение от VVA Посмотреть сообщение
Нужно подождать пока Red Nova и Co подтянуться. А тебе пока нужно
1. На запрос ширины и длинны запретить пустой ввод,ввод отрицательных чисел и 0
2. На запрос точки на ввод по умолчанию принять координату 0,0,0.
Может криво, но вроде работает
+заментил getreal на getdist, чтоб ширину и высоту можна было на экране указать, нормально будет?
Код:
[Выделить все]
(defun c:колонна (/ a b x1 y1 x2 y2)
	(initget (+ 1 2 4))
	(setq a (getdist"\nВведите ширину колонны:"))
	(initget (+ 1 2 4))
	(setq b (getdist"\nВведите высоту колонны:"))
	(setq p (getpoint "\nУкажите центр колоны:<по умолчанию (0,0)>"))
	(if (= p nil) (setq p (quote (0 0 0)))
	)
	(setq x1 (- (car p) (/ a 2))) 
	(setq y1 (- (car (cdr p)) (/ b 2)))
	(setq x2 (+ (car p) (/ a 2)))
	(setq y2 (+ (car (cdr p)) (/ b 2)))
	(command "._pline"
		(list x1 y1)
		(list x1 y2)
		(list x2 y2)
		(list X2 y1)
		"_close"
	)
)
andery вне форума  
 
Непрочитано 24.07.2008, 16:55
#111
VVA

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


andery, Нормально.
Для проверки на пусто (nil) есть функция null
т.е.
(if (= p nil) ... можно еще записать как (if (null p) ...
Ну и еще наиболее частые связки car и cdr уже есть ввиде отдельных функций
(car (cdr p)) = (cadr p)
Читать нужно с конца: к списку p применить cdr потом car
(cADDARr p ) = (cAr (cDr (cDr (cAr p))))
Код:
[Выделить все]
(caddar '((1 2 3)(4 5 6))) ;_Вернет 3
А так весьма неплохо.
Теперь давай запросим угол поворота и повернем колонну относительно точки P на этот угол.
PS P не объявлена в локальных переменных
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.07.2008, 17:01
#112
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Выполняется указание точек в чертеже. Наверное, в функции initget стоит использовать и bit 8.

VVA, вопрос.
Если использовать (if (null (setq p (getpoint "\nУкажите центр колоны:<по умолчанию (0,0)>"))) (setq p '(0 0 0)))
всегда ли в условии при пустом вводе будет nil? Что-то сомнения иногда бывают.

Последний раз редактировалось Олег К., 24.07.2008 в 17:11.
Олег К. вне форума  
 
Автор темы   Непрочитано 24.07.2008, 17:10
#113
Red Nova

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


VVA И так на данный момент код у меня такой
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base)
(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 ) )
     )
)
(command "pline" pt1 pt2 pt3 pt4)
  ;продолжение
)
Можешь давать очередное задание но колонне. Хювенена буду изучать по ходу дела. А-то остальным долго ждать.
Про вопрос красным я понял. Про реальные и вещественные вроде тоже.

P.S. А учеников у тебя все больше.

------------------------
Опоздал, уже дал задание про поворот.
Про P не понял.
Цитата:
PS P не объявлена в локальных переменных
Это значит ввести переменную P или не вводить ее?
__________________
Блог

Последний раз редактировалось Red Nova, 24.07.2008 в 17:57.
Red Nova вне форума  
 
Автор темы   Непрочитано 24.07.2008, 17:40
#114
Red Nova

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


Ну повернуть можно командой rotate, а как выбрать то что мы будем крутить не знаю. Поищу в книгах.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 24.07.2008, 17:42
#115
VVA

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


Олег К., Не вижу причин чтобы не работала. Хотя я предпочитаю такие конструкции (для меня нагляднее)
Код:
[Выделить все]
(or
  (setq p (getpoint "\nУкажите центр колоны:<по умолчанию (0,0)>"))
  (setq p '(0 0 0))
  )
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 17.12.2016 в 19:52.
VVA вне форума  
 
Непрочитано 24.07.2008, 17:50
#116
VVA

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


Red Nova, У тебя код не рабочий. Читай замечания Олег К. #101,
Локальные переменные описываются после слэша при определении функции. Выделил корасным
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base)
Время их жизни ограничено временем жизни (исполнения) функции. Если переменная используется в коде, но не объявлена как локальная - то она становится глобальной, время ее жизни - пока открыт документ в Автокаде
Кстати проверить значение переменной можно, набрав в командной строке Автокада ! (восклицательный знак) и имя. Если загрузить команду Колонна, то
Цитата:
Команда: !c:колонна
#<USUBR @120c2294 C:КОЛОННА>
Демонстрация локальной и глобальной переменной
В команде TEST2 переменная rez не объявлена локальной
Код:
[Выделить все]
(defun C:TEST1 ( / A B rez )
  (initget 7)
  (setq a (getreal "\nПервое число A: "))
  (initget 7)
  (setq b (getreal "\nВторое число B: "))
  (setq rez (+ A B))
  (princ "\nСумма A + B = ")(princ rez)
  (princ)
  )

(defun C:TEST2 ( / A B)
  (initget 7)
  (setq a (getreal "\nПервое число A: "))
  (initget 7)
  (setq b (getreal "\nВторое число B: "))
  (setq rez (+ A B))
  (princ "\nСумма A + B = ")(princ rez)
  (princ)
  )
1. Загружаем команды
2. Выполняем TEST1
3. Набираем в командной строке !rez
4. Выполняем TEST2
5. Набираем в командной строке !rez
6. Смотрим на разницу и делаем выводы
Цитата:
Команда: test1
Первое число A: 1
Второе число B: 3
Сумма A + B = 4.0
Команда:
Команда: !rez
nil

Команда: test2
Первое число A: 1
Второе число B: 3
Сумма A + B = 4.0
Команда:
Команда: !rez
4.0
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.07.2008, 17:52
#117
VVA

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


Цитата:
как выбрать то что мы будем крутить не знаю
А как бы ты выбрал последний отрисованный элемент в команде _Rotate при условии, что нельзя пользоваться мышкой?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 24.07.2008, 17:55
#118
Red Nova

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


Цитата:
Red Nova, У тебя код не рабочий. Читай замечания Олег К. #101,
Ой тьфю, забыл совсем. Исправил.
Цитата:
А как бы ты выбрал последний отрисованный элемент в команде _Rotate при условии, что нельзя пользоваться мышкой?
набрал бы P в ком строке. Так пойдет?
----------------------
Пробую в автокаде, рисую что-то, потом команда rotate, затем ввожу p, результата нет.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 24.07.2008, 18:01
#119
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Да я тож застрял на Ротате.
Мне не понятен синтаксис вызова команды
Например
(command "_rotate _L
или
(command "_rotate "_L"
где об этом почитать можна
прочитал что _L последний нарисованный обьект....
Подскажите в каом русле двигаться....
andery вне форума  
 
Непрочитано 24.07.2008, 18:04
#120
VVA

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


Мы ее (колонны) только что отрисовали и ни одна команда редактирования с ней не работала. Предыдущего (текущего, последнего) набора нет. Так что P (Previous), он же текущий-предыдущий-последний не пойдет. Штудируйте командную строку.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.07.2008, 18:07
#121
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


(command "_rotate" "_L") работает и выделяет
andery вне форума  
 
Непрочитано 24.07.2008, 18:11
#122
VVA

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


ПРАВИЛО
  1. В функциях command использовать АНГЛИЙСКИЕ команды с ПОДЧЕРКИВАНИЕМ Пример: (command "_PLINE" ...)
  2. Для ссылок на ОПЦИИ команд использовать АНГЛИЙСКИЕ с ПОДЧЕРКИВАНИЕМ Пример: (command "_-LAYER" "_Make" ...)
  3. Подробнее читаем тут вначале
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 31.07.2008 в 10:53. Причина: Список
VVA вне форума  
 
Непрочитано 24.07.2008, 18:18
#123
VVA

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


andery,
При передаче параметров ф-ции command нужно соблюдать последовательность запросов вызванной команды, причем
  1. Оции задаются как строки (в кавычках "") с учетом #122
  2. Если нужно нажать клавишу ENTER, то пишем пустые кавычки ""
  3. если нужно подождать действия пользователя, то пишем pause
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 25.07.2008 в 10:50. Причина: Список
VVA вне форума  
 
Непрочитано 24.07.2008, 18:20
#124
VVA

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


Цитата:
Сообщение от andery Посмотреть сообщение
(command "_rotate" "_L") работает и выделяет
Ручками что ты дальше делаешь? Нажимаешь или ENTER или ПКМ. Так и скажи об этом command'у чтобы он нажал тоже
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.07.2008, 18:22
#125
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


>> VVA. Offtop: Может заодно про точку и дефис в командах объяснить. Или потом дать задание колонну заштриховать?
Олег К. вне форума  
 
Непрочитано 24.07.2008, 18:30
#126
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Запутался в этой конструкции
(command "_rotate" "_L" "" "(car p),(cadr p)")
)
как ни пробывал никак не получается
andery вне форума  
 
Непрочитано 24.07.2008, 18:49
#127
VVA

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


andery,
1. getpoint у тебя что запрашивает? - ТОЧКУ
2. В какую переменную ты ее запоминаешь? - в P
Если у тебя в переменной P находится ТОЧКА и _rotate запрашивает "Базовая ТОЧКУ" какого ляда вы занимаетесь мазохизмом?
Код:
[Выделить все]
(command "_rotate" "_L" "" p)
ТОЧКА в Автокаде это список в общем случае их 3-x (для 2d можно из 2-x) чисел, где 1-e трактуется как X, 2-e как Y и 3-e как Z
(setq p (list 1 2 3)) - точка с X=1 Y=2 Z=3
(setq p '(5 3 0)) - точка с координатами X=5 Y=3 Z=0

(command "_Rotate" "_L" "" '(2 3)) - начнет поворачивать последний отрисованный объект относительно точки X=2 Y=3
ТО же самое
(setq p (list 2 3))
(command "_Rotate" "_L" "" p)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.07.2008, 18:51
#128
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Offtop: удалил, больше мешать не буду.
Олег К. вне форума  
 
Непрочитано 24.07.2008, 19:32
#129
VVA

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


Ты совсем не мешаешь. Не могу же я один всех учить. Тем более скоро возьму оставшуюся часть отпуска
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.07.2008, 19:35
#130
Post

конструктор
 
Регистрация: 29.07.2005
Ростов-на-Дону
Сообщений: 1,080
<phrase 1=


Red Nova
Вот те примеры и текст, что обещал
__________________
С уважением!!!

Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08.
Post вне форума  
 
Непрочитано 24.07.2008, 19:36
#131
Post

конструктор
 
Регистрация: 29.07.2005
Ростов-на-Дону
Сообщений: 1,080
<phrase 1=


Вторая часть
__________________
С уважением!!!

Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08.
Post вне форума  
 
Непрочитано 24.07.2008, 19:37
#132
Post

конструктор
 
Регистрация: 29.07.2005
Ростов-на-Дону
Сообщений: 1,080
<phrase 1=


И последняя, саму книгу можно взять в DOWNLOAD
__________________
С уважением!!!

Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08.
Post вне форума  
 
Непрочитано 24.07.2008, 20:11
#133
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Cпасибо, получилось, в результате код получился такой:

Код:
[Выделить все]
(defun c:колонна (/ a b x1 y1 x2 y2)
	(initget (+ 1 2 4))
	(setq a (getdist"\nВведите ширину колонны:"))
	(initget (+ 1 2 4))
	(setq b (getdist"\nВведите высоту колонны:"))
	(setq p (getpoint "\nУкажите центр колоны:<по умолчанию (0,0)>"))
	(if (null p) (setq p (quote (0 0 0)))
	)
	(setq x1 (- (car p) (/ a 2))) 
	(setq y1 (- (car (cdr p)) (/ b 2)))
	(setq x2 (+ (car p) (/ a 2)))
	(setq y2 (+ (car (cdr p)) (/ b 2)))
	(command "._pline"
		(list x1 y1)
		(list x1 y2)
		(list x2 y2)
		(list X2 y1)
		"_close"
	(command "_rotate" "_L" "" p pause)
	)
)
andery вне форума  
 
Непрочитано 24.07.2008, 22:28
#134
VVA

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


andery, Молодца. Quote и ' равнозначны (а набирать быстрее)
(setq p (quote (0 0 0)) = (setq p '(0 0 0))
Усложним задачу.
1. Рисуем колонну
2. В центре колонны рисеум круг радиусом=ширине колонны
3. Поворачиваем колонну

PS По прежнему переменная P у тебя глобальная
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 25.07.2008, 09:58
#135
Red Nova

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


VVA, Извиняюсь за отсутствие, дома телефон зарубили, а инет на нем.
Наверстываем упущенное.
Итак командой _L можно выбрать только что созданный объект (к стати а что означает L?)
Попытаюсь без подглядывания.
Пока не учитывая #134

Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base)
(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 ) )
     )
)
(command "_pline" pt1 pt2 pt3 pt4 "_c")
(command "_rotate" "_L" "" base)
  
;продолжение
)
Post, Спасибо, пока еще не успел посмотреть, но уже скачал.
__________________
Блог

Последний раз редактировалось Red Nova, 25.07.2008 в 10:08.
Red Nova вне форума  
 
Автор темы   Непрочитано 25.07.2008, 10:14
#136
Red Nova

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


VVA,
Цитата:
1. Рисуем колонну
2. В центре колонны рисеум круг радиусом=ширине колонны
3. Поворачиваем колонну
В такой последовательности не смогу. Пока могу выбрать только объект созданный последним. В такой последовательности это не колонна а круг.
Но могу так. (сперва добавив локальную переменную R)
Код:
[Выделить все]
(Setq  R  ( / dimensionX  2.0 ))
(command "_circle" R)
(command "_pline" pt1 pt2 pt3 pt4 "_c")
(command "_rotate" "_L" "" base)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 25.07.2008, 10:15
#137
VVA

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


Red Nova,
Цитата:
(к стати а что означает L?
Цитата:
Command: _move
Select objects: I_don't_know_as

*Invalid selection*
Expects a point or
Window/Last/Crossing/BOX/ALL/Fence/WPolygon/CPolygon/Group/Add/Remove/Multiple/P
revious/Undo/AUto/SIngle
С учетом п.2 #122 получаем _L
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 25.07.2008, 10:17
#138
VVA

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


Цитата:
В такой последовательности не смогу. Пока могу выбрать только объект созданный последним. В такой последовательности это не колонна а круг.
Я специально так и задал. Наша задача научится другим способом запоминать необходимые для дальнейшего использования примитивы и ссылаться на них в command.
Подсказка: entlast
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 25.07.2008, 10:42
#139
Red Nova

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


Почитал хелп, не скажу что понял, но вроде как можно присвоить переменной обозначение только что введенного объекта.
Может так? (предварительно объявив локальную переменную object)
Код:
[Выделить все]
(Setq  R  ( / dimensionX  2.0 ))
(command "_pline" pt1 pt2 pt3 pt4 "_c")
(Setq object (entlast))
(command "_circle" R)
(command "_rotate" object "" base)
P.S. А есть перечень команд аутолисп с пояснением на русском. Я хоть с инглишем в ладах, но все же хелп лучше иметь не русском.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 25.07.2008, 10:52
#140
VVA

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


Цитата:
Может так?
А проверить?
У тебя rotate не завершена. Нужно ввести или угол или подождать действия пользователя п.3 #123
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 25.07.2008, 10:54
#141
Кулик Алексей aka kpblc
Moderator

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


Н.Н.Полещук - любая книга по AutoLISP и VisualLISP.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.07.2008, 11:07
#142
Red Nova

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


VVA
Проверку не прошел. Загрузил такой лисп
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base R object)
(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 ))
(command "_pline" pt1 pt2 pt3 pt4 "_c")
(Setq object (entlast))
(command "_circle" R)
(command "_rotate" object "" base pause)
;продолжение
)
Результат
Цитата:
Command: КОЛОННА
Введите ширину колонны: 200
Введите толщину колонны: 200
; error: bad argument type: consp "Введите точку вставки колонны <0,0,0> :"

Command:
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 25.07.2008, 11:10
#143
Red Nova

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


Кулик Алексей aka kpblc,
Ты про
Цитата:
САПР на базе AutoCAD - как это делается
?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 25.07.2008, 11:17
#144
Кулик Алексей aka kpblc
Moderator

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


Нет, я про Visual LISP и секреты адаптации AutoCAD и AutoLISP и Visual LISP в среде AutoCAD (+ CD-ROM)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.07.2008, 11:23
#145
VVA

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
P.S. А есть перечень команд аутолисп с пояснением на русском. Я хоть с инглишем в ладах, но все же хелп лучше иметь не русском.
А #51 я для кого выкладывал?
2-я ссылка сверху. Скачать все. Оттуда можно попасть сюда:
entlast в главе 5
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 25.07.2008, 11:33
#146
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


>> Red Nova
А скобки кто проверять будет? У тебя же в COND два условия используются, так почему второе в скобках, а первое без?
Код:
[Выделить все]
(setq base 
    (cond
         ((getpoint "\Введите точку вставки колонны <0,0,0> :"))
         (t '(0. 0. 0.))
    )
)
И сразу учись правильно расставлять скобки: если "(" и соответствующая ей ")" расположены на разных строках, то должны быть строго друг под другом - самому же потом легче разбираться будет.

>> VVA
Все ждал когда ученики сообразят с выделением колонны, наверное уже можно отвечать?
Пока нашел только три способа: командой создать именованный набор, использовать ssget с несколькими фильтрами, запомнить имя функцией entlast.
Entlast'ом проще и надежнее, но с ssget'ом тоже интересно повозиться.
Получилось такое: (ssget "W" (list (- x1 1) (- y1 1)) (list (+ x3 1) (+ y3 1)) '((0 . "lwpolyline")))
но это только для данного случая и предварительно отключив привязки.

PS: самому иногда интересно решить поставленные задачи, можно узнать что-нибудь новое.

Последний раз редактировалось Олег К., 25.07.2008 в 12:01.
Олег К. вне форума  
 
Автор темы   Непрочитано 25.07.2008, 11:33
#147
Red Nova

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


VVA,
Проглядел.
От туда
Цитата:
5. 3. 2.(entlast)

Эта функция возвращает имя последнего неудаленного главного примитива в базе данных. Эта функция часто применяется , чтобы дать имя новому примитиву, который только что был прибавлен через функцию COMMAND. Примитив не нужно выводить на экран, и также не нужно выбирать уровень.
Но я все равно не понемаю что я делаю не так.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 25.07.2008, 11:42
#148
VVA

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


Цитата:
Проверку не прошел. Загрузил такой лисп
На лиспе из #142 будем учиться искать ошибки.
Делаем следующее
  1. Набираем в командной строке VLIDE. (Открывается Visual LISP редактор)
  2. File->New File (открывается новый файл). В него копируем код из #142
  3. Если он сохранен как lsp файл, то File->Open
  4. Меню Debug (Отладка)->Stop once (Останов) Должна остаться птичка
  5. Дальше Tools (Сервис) -> Load text in editor (Загрузить текст в редактор) (или Ctrl+Alt+E)
  6. Возвращаемся в Автокад. Набираем в командной строке Колонна
  7. После этого автоматом вернемся в Visual LISP редактор. Текст будет подсвечен синим.
  8. После этого открываем окно контрольных значений (там можно смотреть состояние переменных) Меню View (Вид)->Watch window (Окно контрольных значений) или Ctrl+Shift+W. Должно открыться окно Watch с значением *LAST-VALUE* В нем будут отражаться последние вычисленные значения
  9. Меню Debug (Отладка)->Step into (Шаг с заходом) или F8
  10. Пошагово выполняя код ищем ошибку и исправляем ее.
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 26.07.2008 в 22:17.
VVA вне форума  
 
Непрочитано 25.07.2008, 11:47
#149
VVA

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


Red Nova, Там же открываешь Главу 4 и смотришь как правильно писать cond
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 25.07.2008, 13:48
#150
ShaggyDoc

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


В процесс обучения не вмешиваюсь, но
Цитата:
Пока нашел только три способа: командой создать именованный набор, использовать ssget с несколькими фильтрами, запомнить имя функцией entlast.
Entlast'ом проще и надежнее, но с ssget'ом тоже интересно повозиться.
Получилось такое: (ssget "W" (list (- x1 1) (- y1 1)) (list (+ x3 1) (+ y3 1)) '((0 . "lwpolyline")))
но это только для данного случая и предварительно отключив привязки.
Когда все рисование нескольких примитивов выполняется твоей программой, то самое надежное - до рисования создать пустой набор, а потом, при каждом добавлении примитива, добавлять в него последний через (entlast).

При неконтролируемом рисовании можно до него запомнить последний примитив в переменной через (entlast) а потом использовать функцию наподобие

Код:
[Выделить все]
 
(defun ru-ss-select-after-ent (ent_name / selection)
  (setq selection (ssadd))
  (while (and ent_name (setq ent_name (entnext ent_name)))
    (ssadd ent_name selection)
  ) ;_ end of while
  (if (zerop (sslength selection))
    nil
    selection
  ) 
)
Например где-то в программе:

Код:
[Выделить все]
 
(setq ent (entlast))
;;;Что-то долго рисуем
(setq ss (ru-ss-select-after-ent ent))
;;; теперь что-то делаем с этим набором
Использование выбора рамкой ненадежно. Тут глюк в том, что все, входящее в рамку, должно быть видимым. Да и отсеивать всякую нечисть надо. Там ведь может и всяких левых lwpolyline полно оказаться.
ShaggyDoc вне форума  
 
Непрочитано 25.07.2008, 15:28
#151
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


ShaggyDoc, не скромничайте, Ваши замечания всегда полезны начинающим (и не только).
Кажется, я малость ошибся, в первом случае имелись в виду группы (command "group"), постоянно путаю их с наборами (ssget). Нечто вот такое:
Код:
[Выделить все]
Command: l LINE Specify first point:
Specify next point or [Undo]:
Specify next point or [Undo]:
Command: -group
Enter a group option [?/Order/Add/Remove/Explode/REName/Selectable/Create] <Create>: c
Enter a group name or [?]: 12
Enter a group description:
Select objects: (entlast)
<Entity name: 7ef6c6e0>
1 found
Select objects:
Command:
А Вы заодно показали четвертый способ, хотя они в общем-то похожи.
Про выбор рамкой я не зря сказал "только для данного случая", когда на чертеже только квадрат полилинией и круг. Сам всегда долго думаю как составить фильтр, чтобы отсеять все ненужное.
Олег К. вне форума  
 
Автор темы   Непрочитано 25.07.2008, 16:25
#152
Red Nova

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


Олег К.,
Внес твою поправку. Ты и раньше говорил, а я забыл...
VVA,
По поводу отслеживания ошибок, спасибо за пояснения. Принцип ясен. Но понять почему радиус не принимается равным переменной R это не помогло. Я исправил cond, но как уже сказал с радиусом неполадка. А квадрат рисуется нормально.
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base R object)
(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 ))
(command "_pline" pt1 pt2 pt3 pt4 "_c")
(Setq object (entlast))
(command "_circle" base "" R "")
(command "_rotate" object "" base pause)
;продолжение
)
P.S. А с entlast я правлиьно делаю?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 25.07.2008, 16:40
#153
Кулик Алексей aka kpblc
Moderator

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


А osmode кто отслеживать будет?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.07.2008, 16:55
#154
Red Nova

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


Кулик Алексей aka kpblc,
Цитата:
А osmode кто отслеживать будет?
Ну пока наверное тебя попрошу за мена отслеживать А вот как объяснишь как это делать, то уже я буду.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 25.07.2008, 16:59
#155
Кулик Алексей aka kpblc
Moderator

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


http://www.caduser.ru/cgi-bin/f1/board.cgi?t=43426Wu
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.07.2008, 17:00
#156
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Red Nova, это из командной строки:
Код:
[Выделить все]
Command: ci CIRCLE
Specify center point for circle or [3P/2P/Ttr (tan tan radius)]: 0,0,0
Specify radius of circle or [Diameter] <96.20>: 20
Command:
а теперь смотрим, что у тебя в программе написано и думаем (или хотя бы сравниваем)
Олег К. вне форума  
 
Автор темы   Непрочитано 25.07.2008, 17:24
#157
Red Nova

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


Кулик Алексей aka kpblc,
Может там и описывается нужная операция, но слова osmode там нету, я пока в ауте. Что вообще означает отследить osmode?
Олег К., Неа, не понимаю.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 25.07.2008, 18:15
#158
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Ну ладно, тогда по буквам:
(command "_circle" base "" R "")
1. сначала говорим какую команду используем ["_circle"], это равнозначно Command: ci CIRCLE
2. далее нужно указать точку центра или выбрать опцию [base] = Specify center point for circle or [3P/2P/Ttr (tan tan radius)]: 0,0,0
3. потом следует ввести радиус [Specify radius of circle or [Diameter] <96.20>: 20], а у нас в программе зачем-то пустой ввод [""]
4-5. все, запросы команды закончились, а мы задаем еще R и "".
Энтер или пробел нужно нажимать только если вводишь данные с клавиатуры. При программном вводе подтверждение ввода совсем не нужно.

В рабочем варианте: (command "_circle" base R).
Еще есть такая функция vl-cmdf, почитай о ней, посмотри чем отличается от command.
Олег К. вне форума  
 
Непрочитано 25.07.2008, 20:36
#159
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 9,828


По-моему, при такой интенсивности обучения у RED Nova не остается времени на домашнюю аналитическую работу. Он бы и сам допер до некоторых вещей, что было-бы более ценно. Предложение такое: класс по программированию работает, например, по пятницам. Или дважды в неделю. И все-учителя и ученики - ждали бы с нетерпением
Vova вне форума  
 
Непрочитано 26.07.2008, 19:48
#160
Кулик Алексей aka kpblc
Moderator

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


Red Nova, а я зря дал ссылку в #155, что ли? Пост Alan'a прочти.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.07.2008, 08:21
#161
Red Nova

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


Олег К.,
Теперь понял. А я все пытался enter всунуть.
Наконец заработало.
Код:
[Выделить все]
 (defun C:Колонна (/ dimensionX dimensionY base R object)
(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 ))
(command "_pline" pt1 pt2 pt3 pt4 "_c")
(Setq object (entlast))
(command "_circle" base R)
(command "_rotate" object "" base pause)
;продолжение
)
Цитата:
Еще есть такая функция vl-cmdf,
Я пока функций начинающихся на vl боюсь.

Vova,
Цитата:
Он бы и сам допер до некоторых вещей, что было-бы более ценно.
Сильно льстишь. Не допер бы.

Кулик Алексей aka kpblc,
Вот сообщение от Alan
Цитата:
(defun с:cсс (/ tl)
;;; запомнили
;;; и так для всех изменяемых
(setq tl (getvar "CELTYPE"))
;;; Назначили тип
(setvar "CELTYPE" "bylayer")
;;; делаем что-то............

(vl-cmdf "_pline")
;;; делаем что-то............

;;; вернули
(setvar "CELTYPE" tl)
) ;_ конец defun
В чем связь между Osmode и Celtype?
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 27.07.2008, 08:25
#162
Red Nova

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


Пора усложнить лисп. Научится вводить размеры колонны с экрана, Запоминать значение введенное последним. Дайте список функций, которые нужно для этого изучить. Постараюсь сам навоять.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 27.07.2008, 09:49
#163
Кулик Алексей aka kpblc
Moderator

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


> #161 : лично я стараюсь не давать русских наименований ни переменным, ни функциям. Возможно, это тянется еще с VB3.0 и его ограничений.
Вся разница между (command) и (vl-cmdf) в том, что (command) всегда возвращает nil (независимо ни от чего), а vl-cmdf при успешном (или корректном) завершении команды вернет T. Это утверждение гарантированно работает только для полного AutoCAD, для LT и IntelliCAD'a это уже не факт.
Цитата:
Вот сообщение от Alan
Цитата:
(defun с:cсс (/ tl)
;;; запомнили
;;; и так для всех изменяемых
(setq tl (getvar "CELTYPE"))
;;; Назначили тип
(setvar "CELTYPE" "bylayer")
;;; делаем что-то............

(vl-cmdf "_pline")
;;; делаем что-то............

;;; вернули
(setvar "CELTYPE" tl)
) ;_ конец defun
В чем связь между Osmode и Celtype?
А в том, что и osmode, и celtype есть системные переменные. Посмотри еще раз на код Alan'a, там же все написано:
Код:
[Выделить все]
(defun с:cсс (/ tl)
;;; запомнили
;;; и так для всех изменяемых
(setq tl (getvar "CELTYPE"))
;;; Назначили <...>
(setvar <...>)
;;; делаем что-то............
;;; вернули
(setvar <...>)
) ;_ конец defun
То есть - сначала запоминаешь старое значение системной переменной, потом его устанавливаешь, после этого работаешь как хочется. В последнюю очередь - восстановить старые значения. Попробуй абстрагироваться от конкретного кода, ищи в нем логику и обобщай ее. Без этого научиться, по-моему, невозможно.
> #162 : Я б на твоем месте сначала с *error* разобрался. А экранный ввод уже потом. Хотя как знаешь. Для ввода с экрана см. getdist и (или) getcorner. Для всего остального функции lisp'a уже не требуются.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.07.2008, 14:32
#164
Red Nova

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


А что на счет error? Что означает "Разобраться с ним", в каких целях это вообще делать?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 27.07.2008, 15:25
#165
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,778
<phrase 1=


Цитата:
Сообщение от Red Nova Посмотреть сообщение
А что на счет error? Что означает "Разобраться с ним", в каких целях это вообще делать?
Для простоты объяснения...
Лучше всего посмотреть уже упоминавшуюся книгу "САПР на базе..." стр.286
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Непрочитано 27.07.2008, 16:30
#166
Кулик Алексей aka kpblc
Moderator

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


В дополнение: http://www.arcada.com.ua/forum/viewtopic.php?t=445
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.07.2008, 22:47
#167
VVA

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


Ну что ж. Начнем наступать на ГРАБЛИ №1 (OSMODE)
  1. За основу берем лисп #161.
  2. Скачиваем файл Грабли N1.dwg
  3. Загружаем команду Колонна из #161
  4. Устанавливаем переменную OSMODE = 33 (равносильно включенной привязке "Конточка" и "Пересечение"
    Устанавливаем переменную OSNAPCOORD = 0
  5. Ширина и высота колонны = 400
  6. Точка вставки колонны - точка пересечения красных отрехков
  7. Выполняем команду, смотрим результат, делаем выводы.
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08.
VVA вне форума  
 
Автор темы   Непрочитано 28.07.2008, 09:33
#168
Red Nova

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


VVA,
Подозреваю, что ты имел в виду необходимость отключить привязки на момент действия лиспа, так как при запросе угла поворота они могут помешать.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 28.07.2008, 10:19
#169
VVA

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
VVA,
Подозреваю, что ты имел в виду необходимость отключить привязки на момент действия лиспа, так как при запросе угла поворота они могут помешать.
Ну положим мешать они начинают значительно раньше: как только какой-либо команде Автокада начинаешь передавать точки. В твоем случае здесь
Код:
[Выделить все]
(command "_pline" pt1 pt2 pt3 pt4 "_c")
То, что может получиться ты должен был видеть на примере.
Отсюда еще пару мельких наводящих заданий:
  1. Узнать в какой системной переменной хранятся привязки
  2. Описать эту переменную в Справочнике команд
  3. Как можно влиять на включение / отключение привязки при отрисовке, например, отрезков если нельзя:
  • нажимать мышкой на кнопку "Привязка" ("OSNAP")
  • нажимать на F3
  • набирать Ctrl+F
  • во время указания точки держать нажатым комбинацию Shift+D
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 28.07.2008, 11:11
#170
Red Nova

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


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

Код:
(command "_pline" pt1 pt2 pt3 pt4 "_c")

То, что может получиться ты должен был видеть на примере.
А у меня казусов не было. Все прошло довольно гладко.

Цитата:
Узнать в какой системной переменной хранятся привязки
Ну это легко - OSMODE

Цитата:
Описать эту переменную в Справочнике команд
Это тоже можно.
http://dwg.ru/f/showthread.php?p=271243
__________________
Блог
Red Nova вне форума  
 
Непрочитано 28.07.2008, 12:22
#171
VVA

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


Red Nova, Ты хочешь сказать, что из поста #167 открыв файл "Грабли N1", установив OSMODE=33, задав ширину и высоту колонны = 400 и точку вставки- пересение красных отрезков получил колонну прямоугольную ?
Еще остался вопрос N3 из #169
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 28.07.2008, 12:53
#172
Red Nova

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


Цитата:
Ты хочешь сказать, что из поста #167 открыв файл "Грабли N1", установив OSMODE=33, задав ширину и высоту колонны = 400 и точку вставки- пересение красных отрезков получил колонну прямоугольную ?
Смотри файл.
Цитата:
Еще остался вопрос N3 из #169
Запомнить Osmode, обнулить, потом вернуть.
__________________
Блог

Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08.
Red Nova вне форума  
 
Непрочитано 28.07.2008, 13:26
#173
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Я так подозреваю должена быть в коде такая конструкция:

Код:
[Выделить все]
(setq old_osmode (getvar "osmode"))
(setvar "osmode" 33)
; программа
(setvar "osmode" old_osmode)
А как указать точку вставки - пока без понятия....
andery вне форума  
 
Автор темы   Непрочитано 28.07.2008, 13:31
#174
Red Nova

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


andery,
Скорее всего "osmode" 0
Код:
[Выделить все]
(setq old_osmode (getvar "osmode"))
(setvar "osmode" 0)
; программа
(setvar "osmode" old_osmode)
Цитата:
А как указать точку вставки - пока без понятия....
Посмотри справку про getpoint
__________________
Блог
Red Nova вне форума  
 
Непрочитано 28.07.2008, 13:49
#175
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Цитата:
Точка вставки колонны - точка пересечения красных отрехков
Вот как эту точку указать?
andery вне форума  
 
Непрочитано 28.07.2008, 15:07
#176
VVA

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


Red Nova,
Цитата:
А у меня казусов не было. Все прошло довольно гладко.
Отредактировал условия в #167. Попробуй снова
andery,
Это все надо делать руками. См. #167. Это просто пимер того, что может произойти, если не обрабатывать OSMODE
Red Nova,
Цитата:
Запомнить Osmode, обнулить, потом вернуть.
Хочу увидеть это лиспом, а не словами
И это один вариант.
Я хочу услышать ответ как без ЛИСПА, F3 и проч. при черчении отменить
действие установленных объектных привязок. (Подсказка: временная объектная привязка или SHIFT + Правая кнопка мыши)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 28.07.2008 в 15:18.
VVA вне форума  
 
Непрочитано 28.07.2008, 15:10
#177
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Может профи подскажут в каком направлении надо искать на чертеже пересечение всех красных линий, или я неправильно понял задачу?
andery вне форума  
 
Непрочитано 28.07.2008, 15:18
#178
VVA

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


andery, Ты не правильно понял задачу. Это не задача вовсе, а попытка показать пример, что может быть, если не обрабатывать OSMODE
Отредактировал условия в #167. Это все нужно просто выполнить на своем компьютере и посмотреть на результат.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 28.07.2008, 15:42
#179
Red Nova

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


VVA,
Цитата:
Отредактировал условия в #167. Попробуй снова
Теперь понятно.

Цитата:
Я хочу услышать ответ как без ЛИСПА, F3 и проч. при черчении отменить
действие установленных объектных привязок
SHIFT + Правая кнопка мыши, а дальше none
__________________
Блог
Red Nova вне форума  
 
Непрочитано 28.07.2008, 15:51
#180
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Выполнил #167
Получилось вот что:
Код такой:
Код:
[Выделить все]
(defun c:колонна (/)
  	(setq old_osmode (getvar "osmode"))
	(setvar "osmode" 33)
  	(setq old_osnapcoord (getvar "osnapcoord"))
  	(setvar "osnapcoord" 0)
	;(initget (+ 1 2 4))
	(setq a 400) ;(getdist"\nВведите ширину колонны:"))
	;(initget (+ 1 2 4))
	(setq b 400) ;(getdist"\nВведите высоту колонны:"))
	(setq p (getpoint "\nУкажите центр колоны:<по умолчанию (0,0)>"))
	;(if (null p) (setq p (quote (0 0 0)))
	;)
	(setq x1 (- (car p) (/ a 2))) 
	(setq y1 (- (car (cdr p)) (/ b 2)))
	(setq x2 (+ (car p) (/ a 2)))
	(setq y2 (+ (car (cdr p)) (/ b 2)))

  	(command "._pline"
		(list x1 y1)
		(list x1 y2)
		(list x2 y2)
		(list X2 y1)
		"_close"
	)
  
  	;(Setq object (entlast))
  	(command "_circle" p (/ a 2))
	;(command "_rotate" object "" p pause) 	)

  	(setvar "osmode" old_osmode)
	(setvar "osnapcoord" old_osnapcoord)
  )

Последний раз редактировалось Кулик Алексей aka kpblc, 14.08.2008 в 16:08.
andery вне форума  
 
Непрочитано 28.07.2008, 16:47
#181
VVA

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


andery, Да, это правильный результат. Вот эти грабли мы и будеи преодолевать. (Только пересохрани в формате 2004 Автокада, а то не все смогут открыть)
Цитата:
SHIFT + Правая кнопка мыши, а дальше none
Правильно, только по нашим условиям "_non", так как сам писал здесь
Цитата:
0 NONe
А я постом ниже жирным выделил необходимое.
Т.е. получается, что в ответ на запрос командой точки (будь то _line, _circle или _pline) можно вводить выделенные жирным опции, как то _endp, _non и т.д.
Раз мы можем вводить это руками, значит мы можем это передать и в command. Т.е. вырисовывается 2 способа борьбы с "OSMODE"
1. Сохранить в переменную, обнулить (или отключить), а потом восстановить
2. Перед вводом каждой точки в command временно отключать привязку с помощью опции "_non"
Хочу увидеть оба варианта в лиспе
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 28.07.2008 в 17:22.
VVA вне форума  
 
Автор темы   Непрочитано 28.07.2008, 17:06
#182
Red Nova

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


VVA,
Первый вариант ты уже видел
Код:
[Выделить все]
(setq old_osmode (getvar "osmode"))
(setvar "osmode" 0)
; программа
(setvar "osmode" old_osmode)
И второй вариант.
Код:
[Выделить все]
(command "_pline" "_non" pt1 pt2 pt3 pt4 "_c")
(Setq object (entlast))
(command "_circle" "_non" base "_non" R)
(command "_rotate" "_non" object "" "_non" base "_non" pause)
Думаю второй вариант менее проблематичный (не связываемся с функцией error)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 28.07.2008, 17:07
#183
Кулик Алексей aka kpblc
Moderator

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


И не совсем верный второй вариант. Надо:
Код:
[Выделить все]
(command "_pline" "_non" pt1 "_non" pt2 "_non" pt3 "_non" pt4  "_c")
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.07.2008, 17:12
#184
Red Nova

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


Кулик Алексей aka kpblc,
__________________
Блог
Red Nova вне форума  
 
Непрочитано 28.07.2008, 17:16
#185
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Цитата:
(command "_circle" "_non" base "_non" R)
Зачем перед R ставить _non ?
Это ведь не точка....
andery вне форума  
 
Непрочитано 28.07.2008, 17:19
#186
VVA

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


Red Nova, Алексей уже подсказал. Я нужное слово выделил в #181 поярче.
Давай остановимся на 1-м варианте. Покажи код целиком, чтобы идти дальше.

*** Добавлено
andery, В принципе не обязательно, если в переменной R - число. Но в Автокаде радиус можно "показать" 2-мя точками. Просто нужно отдавать себе отчет, что у тебя в переменной R.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 28.07.2008, 17:23
#187
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


У меня такое получилось с использованием 1-го варианта:
Код:
[Выделить все]
(defun c:колонна (/)
  	(setq old_osmode (getvar "osmode"))
	(setvar "osmode" 0)
  	(setq old_osnapcoord (getvar "osnapcoord"))
  	(setvar "osnapcoord" 0)
	(initget (+ 1 2 4))
	(setq a (getdist"\nВведите ширину колонны:"))
	(initget (+ 1 2 4))
	(setq b (getdist"\nВведите высоту колонны:"))
	(setq p (getpoint "\nУкажите центр колоны:<по умолчанию (0,0)>"))
	(if (null p) (setq p '(0 0 0))
	)
	(setq x1 (- (car p) (/ a 2))) 
	(setq y1 (- (car (cdr p)) (/ b 2)))
	(setq x2 (+ (car p) (/ a 2)))
	(setq y2 (+ (car (cdr p)) (/ b 2)))

  	(command "._pline"
		(list x1 y1)
		(list x1 y2)
		(list x2 y2)
		(list X2 y1)
		"_close"
	)
  
  	(Setq object (entlast))
  	(command "_circle" p (/ a 2))
	(command "_rotate" object "" p pause) 	)

  	(setvar "osmode" old_osmode)
	(setvar "osnapcoord" old_osnapcoord)
  )
andery вне форума  
 
Автор темы   Непрочитано 28.07.2008, 17:26
#188
Red Nova

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


VVA, Учитывая отслежку Osmode
Код:
[Выделить все]
 (defun C:Колонна (/ dimensionX dimensionY base R object old_osmode )
(setq old_osmode (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 ))
(command "_pline" pt1 pt2 pt3 pt4 "_c")
(Setq object (entlast))
(command "_circle" base R)
(command "_rotate" object "" base pause)
(setvar "osmode" old_osmode)
)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 28.07.2008, 17:31
#189
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Кстати при таком варианте, при прерывании команды "колонна" эскейпом
osmode=0, ИМХО как-то неправильно...
andery вне форума  
 
Автор темы   Непрочитано 28.07.2008, 17:44
#190
Red Nova

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


andery,
Подозреваю что далее у нас урок обработки ошибок методом переопределения функции error
__________________
Блог

Последний раз редактировалось Red Nova, 28.07.2008 в 22:35.
Red Nova вне форума  
 
Непрочитано 28.07.2008, 20:39
#191
Кулик Алексей aka kpblc
Moderator

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


Ссылка на пример переопределенного обработчика уже была
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.07.2008, 00:04
#192
VVA

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
andery,
Подозреваю что далее у нас урок обработки ошибок методом переопределения функции error
Ну положим не error, а *error*. А так в общем правильно. Если мы будем использовать 1-й вариант (сохранение OSMODE в переменной и восстановление), то мы не застрахованы, что при повороте колонны пользователь нажмет ESC и програма прекратит свою работу. Но OSMODE мы вначале установили равным 0, а назад не восстановили, так как програма прекратила работу. Пользователь недоволен и высказывает СПРАВЕДЛИВО нам свое фи.
Цитата:
Кстати при таком варианте, при прерывании команды "колонна" эскейпом
osmode=0, ИМХО как-то неправильно...
В Автолиспе существует специально объявленная функция *error*, которой передается один аргумент- сообщение об ошибке.
Есть 2 варианта:
1-й как показал Алексей здесь можно ГЛОБАЛЬНО переназначить обработчик ошибок:
создать свою функцию с 1-м аргументом (см. (defun kpblc-error (message) ... по ссылке
присвоить стандартному обработчику указатель на свой обработчик ошибок. Пример ф-ции приведу здесь
;|
Код:
[Выделить все]
============================================================================= 
*    Переназначение обработки ошибок. 
*    Переназначен или нет обработчик проверяется по значению 
* переменной *kpblc-error* 
=============================================================================|; 
(defun kpblc-error-init () 
  (if (not *kpblc-error*) 
    (setq *kpblc-error* *error* ;;;_Сохраняем в ГЛОБАЛЬНОЙ переменной *kpblc-error* указатель на *error*
     *error* kpblc-error  ;;; Присваиваем переменной *error* указатель на нашу ф-цию kpblc-error
     ) ;_ end of setq 
    (setq *error*     *kpblc-error* 
     *kpblc-error* nil 
     ) ;_ end of setq 
    ) ;_if 
  (princ) 
  ) ;_defun
2-й тоже описан несколькими постами ниже (см пост от Ср 21 Июн , 2006 10:50)
Суть его в том, что мы не сохраняем и восстанавливаем глобально ф-цию
*error*, а объявляем ее ЛОКАЛЬНОЙ переменной и в теле самой ф-ции объявляем ф-цию *error*. Т.е конструкция принимает вид
Код:
[Выделить все]
(defun c:myfunc_witherror( / *error* oldOSM base) 
(defun *error*(msg) 
;; Определяем действия, которые надо выполнить 
;; в случае ошибки выполнения основного кода 
) 
;; Чего-то там делаем в c:myfunc_witherror
) ;_ end of defun
Т.е. получается, что время жизни ф-ции *error* - пока существует ф-ция c:myfunc_witherror.
Здесь есть еще один нюанс: Всем КРАСНЫМ ф-циям, объявленным внутри СИНИХ функций доступны ЛОКАЛЬНЫЕ переменные СИНИХ функций как ГЛОБАЛЬНЫЕ. Я могу спокойно проверять значение переменной, объявленной как локальная в ф-ции верхнего уровня (СИНЕЙ)
Код:
[Выделить все]
(defun c:myfunc_witherror( / *error* oldOSM base) 
(defun *error*(msg) 
(princ msg) ;_ печатаем сообщение
(if oldOSM (setvar "OSMODE" oldOSM)) ;_Если oldOSM задано, то присваиваем переменной OLDOSM значение oldOSM
) 
;; Чего-то там делаем в c:myfunc_witherror
) ;_ end of defun
В случае ошибки в ф-ции c:myfunc_witherror (как то нажатие ESC пользователем) управление передастся ф-ции *error* и мы восстановим переменную OSMODE в сохраненное ранее значение в переменной oldOSM
Ну вот попытался в картинках объяснить как это работает. Хотелось бы увидеть команду КОЛОННА с *error* по 2-му варианту
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 29.07.2008 в 00:14.
VVA вне форума  
 
Непрочитано 29.07.2008, 00:42
#193
Кулик Алексей aka kpblc
Moderator

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


Следующим шагом рекомендовал бы заняться метками отмены
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.07.2008, 09:52
#194
Red Nova

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


Понять бы еще что значит (msg)
Код:
[Выделить все]
(defun C:Колонна (/ dimensionX dimensionY base R object oldOSM)
 (defun *error*(msg) 
 (princ msg) ; Отменено пользователем
 (if oldOSM (setvar "OSMODE" oldOSM)) 
 ) 
 (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 ))
 (command "_pline" pt1 pt2 pt3 pt4 "_c")
 (Setq object (entlast))
 (command "_circle" base R)
 (command "_rotate" object "" base pause)
 (setvar "osmode" oldOSM)
)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 29.07.2008, 10:11
#195
Кулик Алексей aka kpblc
Moderator

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


поставь точку останова и выполняй пошагово
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.07.2008, 10:28
#196
VVA

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


Цитата:
Понять бы еще что значит (msg)
msg - это тоже переменная, только она расположена перед слэшем, значит это АГРУМЕНТ функции. Почитай Команда или функция?, defun, и 1.4 Соглашения по обозначениям
Мы добились главного. Если пользователь прервет ф-цию, то восстановятся объектные привязки до вызова команды Колонна.
Для иллюстрации примера делаем следующее:
  1. В командной строке набираем OSMODE и задаем значение 33 (Конточка+ Пересечение)
  2. Грузим лисп из #188 и в момент запроса угла поворота нажимаем ESC.
  3. Проверяем значение OSMODE
И так
  1. В командной строке набираем OSMODE и задаем значение 33 (Конточка+ Пересечение)
  2. Грузим лисп из #194 и в момент запроса угла поворота нажимаем ESC.
  3. Проверяем значение OSMODE
У меня еще задание. Все знают, что привязку (OSMODE) можно ОТКЛЮЧАТЬ, т.е. сохраняется перечень установленных режимов, а потом ВКЛЮЧАТЬ.
Задание для самостоятельной работы: Написать функции
disable_osmode - Функция отключения режима(ов) объектной привязки
enable_osmode - Функция включения режима(ов) объектной привязки
В справке про OSMODE об этом написано.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.07.2008, 10:54
#197
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


У меня такие вопросы по поводу Граблей№1,
1.Зачем делать osnapcoord=0 ? Ведь "наступаем" на грабли тока при этом значении.
2.Не лучше ли делать osnapcoord=1 (1 - Ввод с клавиатуры пере регулирует установки объектной привязки., ведь при этом у нас никогда "не убежит" точка, т.к. мы ее вводим "вручную")? А потом возращать прошлое значение.
3. Если делаем колонну, зачем osmode делать 0 ?
А если пользователь при вставке колонны хочет пользоваться привязками?
andery вне форума  
 
Непрочитано 29.07.2008, 11:00
#198
Кулик Алексей aka kpblc
Moderator

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


"А если пользователь хочет пользоваться привязками" - то надо либо отключать их только на момент рисования, либо вообще использовать некомандные методы.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.07.2008, 11:14
#199
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Переформулирую вопрос:
В нашей функции "колонна" ,если мы выставляем osnapcoord=1, в каком случае мы наступим на грабли? (в каком случае точка может "убежать")
andery вне форума  
 
Непрочитано 29.07.2008, 11:29
#200
VVA

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


1,2. Это дело вкуса. Можно делать и так. Это просто пример. Можно вообще использовать некомандные методы и забыть про привязку. Плюс еще OSNAPCOORD появилась в 13-й версии Автокада, а я эти проблемы решал в 10-й версии. Привычка.
3. А никто не застявляет обнулять OSMODE сразу как запомнили значение. Можно обнулить перед вызовом _PLINE. Это так Red Nova захотел, а пользователь andery указал ему на этот СУЩЕСТВЕННЫЙ недостаток. Неудобно пользоваться командой Колонна, так как невозможно привязаться к существующему пересечению осей. Ну и наконец привязку можно ОТКЛЮЧАТЬ
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.07.2008, 11:33
#201
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Цитата:
disable_osmode - Функция отключения режима(ов) объектной привязки
enable_osmode - Функция включения режима(ов) объектной привязки
Код:
[Выделить все]
(defun disable_osmode ()
(setvar "osmode" (+ (getvar "osmode") 16384))
)
(defun enable_osmode ()
(setvar "osmode" (- (getvar "osmode") 16384))
)
Проверил с командной строки - прошло.
andery вне форума  
 
Непрочитано 29.07.2008, 11:35
#202
Alaspher


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


Цитата:
Сообщение от andery Посмотреть сообщение
Переформулирую вопрос:
В нашей функции "колонна" ,если мы выставляем osnapcoord=1, в каком случае мы наступим на грабли? (в каком случае точка может "убежать")
Скорее всего, ни в каком (не проверял), но... есть ещё момент - при написании любых программ, одним из важнейших правил является минимизация вемешательства в среду исполнения, т.е. по окончании работы нашей программы, то место, где она работала (в случае АвтоЛИСПов, это Автокад) должно функционировать ровно так же, как и до запуска. В принципе, манипуляция с переменными osmode и osnapcoord вполне сопоставима - в любом случае менять их надо только на момент программного рисования и сразу по его окончании восстанавливать в первоначальное состояние, но опять же есть нюанс - традиционно для таких манипуляций используется именно osmode, в том числе потому, что управлять привязками умеет любой пользователь, а вот о osnapcoord и её действии большинство пользователей даже и не подозревает. Соответственно, если чтото пойдёт наперекосяк, а рано или поздно таки случится чтото такое, от чего не спасут самые изощрённые меры предосторожности, то пользователю гораздо проще восстановить привязки, чем управление приоритетом ввода.
Alaspher вне форума  
 
Непрочитано 29.07.2008, 11:48
#203
Alaspher


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


Цитата:
Сообщение от andery Посмотреть сообщение
Проверил с командной строки - прошло.
А если привязка уже отключена/включена юзером?
Alaspher вне форума  
 
Непрочитано 29.07.2008, 11:57
#204
ShaggyDoc

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


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

А до некомандных методов обучение еще дойдет. Там и с *error* решать иначе нужно.
ShaggyDoc вне форума  
 
Непрочитано 29.07.2008, 12:03
#205
VVA

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


andery, #201 Незачтено. Причина: читай #203
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 29.07.2008, 12:10
#206
Red Nova

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


VVA,
Цитата:
У меня еще задание. Все знают, что привязку (OSMODE) можно ОТКЛЮЧАТЬ, т.е. сохраняется перечень установленных режимов, а потом ВКЛЮЧАТЬ.
Задание для самостоятельной работы: Написать функции
disable_osmode - Функция отключения режима(ов) объектной привязки
enable_osmode - Функция включения режима(ов) объектной привязки
Это можно
Код:
[Выделить все]
(defun C:disable_osmode (/ oldOSM)
 (setq oldOSM (getvar "osmode"))
 (setvar "osmode" (+ oldOSM 16384))
)
Код:
[Выделить все]
(defun C: enable_osmode (/ oldOSM)
 (setq oldOSM (getvar "osmode"))
 (setvar "osmode" (- oldOSM 16384))
)
Было бы интересно совместить эти две функции. Алгоритм я представляю, но руки пока кривые.
Нужно функцией IF создать две ветки программы. Проверяется значение osmode, если оно меньше 16384, то выполняется первая функция, иначе вторая. Но вот как проверить это условие?

Цитата:
msg - это тоже переменная, только она расположена перед слэшем, значит это АГРУМЕНТ функции. Почитай Команда или функция?, defun, и 1.4 Соглашения по обозначениям
А вот этого понять не могу, хотя ссылки смотрел. Вижу, что msg позволяет вывести сообщение на экран, но что такое аргумент, и чем он отличен от функции не понимаю.

andery,
Главный смысл научится это все делать, лично мне тоже здесь не нужно возится с Osmode, но знать надо. Кто знает какая переменная в будущем может помешать.
__________________
Блог

Последний раз редактировалось Red Nova, 29.07.2008 в 12:30.
Red Nova вне форума  
 
Непрочитано 29.07.2008, 12:24
#207
VVA

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


Red Nova, #206 Незачет
1. Я просил фукции, а не команды
2. Уж если и команда, то enable_osmode определена неправильно.
3.
Цитата:
Проверяется значение osmode, если оно меньше 16384, то выполняется первая функция, иначе вторая
Нет. В самой ф-ции проверяется значение OSMODE и если оно устраивает, то выполняются ее действия или не выполняются.
Цитата:
msg - это тоже переменная, только она расположена перед слэшем, значит это АГРУМЕНТ функции
А вот этого понять не могу, хотя ссылки смотрел
В метро есть турникет, чтобы через него пройти нужно бросить жетон.
Так вот жетон - это АРГУМЕНТ функции ТУРНИКЕТ. Т.е. АРГУМЕНТ - ОБЯЗАТЕЛЬНО ПЕРЕДАВАЕМЫЙ ПАРАМЕТР функции.
(турникет жетон) - вошли в метро
(турникет) - ошибка, мало передано параметров
(турникет жетон сумка) -ошибка, много передано параметров. Нужен только жетон
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.07.2008, 12:26
#208
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Red Nova,
У Вас при вызове этих функций привязка включиться и выключится внутри функции а результат фунции будет такойже как и до ее вызова.
И действительно надо проверить на включение привязку.
andery вне форума  
 
Автор темы   Непрочитано 29.07.2008, 12:34
#209
Red Nova

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


VVA,
Цитата:
Уж если и команда, то enable_osmode определена неправильно.
Поправил кое что
Цитата:
Я просил функции, а не команды
А разве мы до сих пор писали функции? Вроде как только команды писали. А функции писать я не умею. (Или умею?)
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 29.07.2008, 12:35
#210
Red Nova

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


andery,
Цитата:
результат фунции будет такойже как и до ее вызова.
Как раз заметил.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 29.07.2008, 12:40
#211
VVA

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


Цитата:
А разве мы до сих пор писали функции? Вроде как только команды писали. А функции писать я не умею. (Или умею?)
Я в #196 просил тебя почитать Команда или фукция?. Прочти и ответь на свой вопрос сам.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.07.2008, 13:25
#212
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


Щас напишем..........
andery вне форума  
 
Непрочитано 29.07.2008, 13:30
#213
VVA

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


andery, Это условие (= (getvar "osmode") (- (getvar "osmode") 16384)) ВСЕГДА будет ложь (nil). Поэтому рисать if не имеет смысла.
Этот вариант будет всегда делать то же, что и твой
Код:
[Выделить все]
(defun c:disable_osmode ()
"Привязка уже выключена"
)
PS
1. Если хочешь напечатать в командную строчку - используй ф-цию princ
2. Господа, я просил ФУНКЦИЮ, а не КОМАНДУ
PPS
Напишите мне словами алгоритм работы функции disable_osmode.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.07.2008, 14:02
#214
andery


 
Регистрация: 27.12.2007
Сообщений: 132
<phrase 1=


VVA,
Так я сразу удалил
Вот окончательный вариант:
Код:
[Выделить все]
(defun c:disable_osmode ()
(if (<= (- (getvar "osmode") 1684) 0)
  (setvar "osmode" (+ (getvar "osmode") 16384))
  "Привязка уже выключена"
)
)
  
(defun c:enable_osmode ()
(if (> (- (getvar "osmode") 1684) 0)
  (setvar "osmode" (- (getvar "osmode") 16384))
  "Привязка уже включена"
)
)