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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Реакция программы на появление объекта определенного типа

Реакция программы на появление объекта определенного типа

Ответ
Поиск в этой теме
Непрочитано 28.07.2004, 11:51 #1
Реакция программы на появление объекта определенного типа
Torino
 
Штаб
Регистрация: 21.08.2003
Сообщений: 943

Идея такая: предположим

я начертил в чертеже заливку.
Это каким-то образом отслеживается и запускается лисп, в котором последний созданный объект (в данном случае штриховка) премещается на слой "HATCH"
Потом управление передается обратно командной строке.
То же самое с текстом: на слой "TEXT"
И размерами: на слой "DIM"

Может быть реакторами?

В идеале, если нажатие ПРОБЕЛа (ENTER или правый щелчок мыши), вызывало бы команду, которая запускалась ДО запуска "перехватчика". И UNDO отменяла тоже эту команду.
Но это в идеале и думаю трудно осуществимо.
Просмотров: 7375
 
Непрочитано 28.07.2004, 12:21
#2
Grinzaid

Архитектор
 
Регистрация: 14.10.2003
Израиль
Сообщений: 365
<phrase 1=


Может проще с помощью окна Properties обозначить группу существующих объектов и распределить их по слоям. Ведь не всегда текст находится на слое "текст". А если надо размер поместить не на "DIM", а на "Dim-50", что тогда? Выходит, что надо задавать эти имена, а это уже более громоздко.
__________________
С уважением,
Влад Гринзайд.
Grinzaid вне форума  
 
Непрочитано 28.07.2004, 12:25
#3
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Скорее всего - использовать реактор типа :VLR-AcDb -Reactor (реактор на изменение базы рисунка).
Событие :vlr-objectAppended (добавление объекта к Базе Данных AutoCAD).
А в функции отклика анализировать его тип и перекидывать на соответствующий слой.

Я так [sm2001] думаю... (с) "Мимино".
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 28.07.2004, 12:33
#4
Lenich

Опер дир
 
Регистрация: 28.04.2004
Москва
Сообщений: 291


Я думаю, можно тупо добавить к команде Hatch (прямо в кнопке) смену текущего слоя на тот который нужно и не парится.

Правда так слету соединить две команды в одной кнопке оказалось не так-то просто.
Lenich вне форума  
 
Непрочитано 28.07.2004, 12:41
#5
Garbag


 
Регистрация: 21.06.2004
Тула
Сообщений: 164


Решал эту проблему тем, что писал макосы к кнопкам (ну не программер я на ЛИСПЕ писать) - суть сводилась к тому, что при проставлении размера - текущим устанавливался размерный слой - при написании текста - текстовый - при простановке выносок - слой под выноски ну и т.д. - иногда подглючивает (перекрестье как бы западает) но работает нормально и меня устраивает - (хотя делал не под себя)
Мне лично удобнее потом переводить все необходимые примитивы по слоям с помощью Быстрого выбора

Но идея у Вас глобальная - если решите - поделитесь потом
Garbag вне форума  
 
Автор темы   Непрочитано 28.07.2004, 12:44
#6
Torino


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


>>Grinzaid
Согласен, но эта программа намечалась, как первый вариант другой, более сложной (с установками и др.)

>>Kos
Спасибо!

>>Lenich
Хорошая идея!
Две команды можно объединить в простом лиспе.
А чтобы работало все это не только с кнопки, то можно переопределить команды HATCH, TEXT и т.д.

Но моя цель - это программирование. Посему вопрос:

>>All
Нет ли у кого-нибудь примеров использования реакторов с коментариями на русском?
Torino вне форума  
 
Непрочитано 28.07.2004, 12:59
#7
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


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

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

Отслеживать с помощью :VLR-AcDb -Reactor конечно хорошо, но для подобной проги главное это широкие возможности по настройке и конечно поддержка различных профилей. Ну скажем рисую я окружность. В какой слой она должна попасть :?: Проблемм для обсуждения тут много.

Проще (или не проще?) создавать стандартные кнопки. Ну скаже "жмямкнул" кнопку "осевая линия" и загрузился нужный тип линии а текущим стал слой "Осевые линии", ну и конечно началась отрисовка линии.
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 28.07.2004, 13:13
#8
Torino


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


>>Fantomas
До этого так и делал (и сейчас так делаю, пока), т.к. в 2005-м Акаде, даже не надо макрос писать.
Там есть Tool Pallette.
Не спорю стандартные примитивы обрабатывать таким простым алгоритмом не стоит (если линия, то полезай в слой ЛИНИЯ, если окружность, то полезай в слой ОКРУЖНОСТЬ и т.д.)
А вот текст, заливка и размеры в простых чертежах вполне можно кидать на один, соответствующий примитиву слой.

А вообще-то я хочу научиться работать с реакторами
Torino вне форума  
 
Непрочитано 28.07.2004, 13:39
#9
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Дополню свое сообщение:
того реактора, что я указал, маловато будет. Надо еще отслеживать событие завершения команды. Потому что, например, командой _LINE до ее завершения можно создать несколько отрезков.
Вполне возможно, что всплывут и другие нюансы при реализации...

ИМХО: реакторы пока не получили широкого распространения среди LISP-программистов потому, что нигде толком не описана последовательность событий. Как правило приходится тыкаться носом, а это отнимает время...
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 28.07.2004, 13:40
#10
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


> Torino

Я пока тот постинг писал, уже два других "прошли".

Вот примерчик того чего вы хотите. Загрузите и после отрисовки каждого примитива он будет сообщать о том что вы нарисовали. Соответственно реагирующая функция может анализировать свойства этого примитива и что либо делать. Однако нельзя использовать COMMAND.
Код:
[Выделить все]
(defun reactCreate ()
  (vl-load-com)
  (setq acdbReact(vlr-acdb-reactor nil
		   '((:vlr-objectAppended . infoFun))))
  ); end of reactCreate
(reactCreate)


(defun infoFun (reactor arg)
  (setq vlaObj
	 (vlax-ename->vla-object
	   (entlast))
	objName(vla-get-objectName vlaObj)
	); end setq
  (alert(strcat "Torino You Сreate " objName "!!!"))
	); end of infoFun
В данном примере все до придела упрощено. В реалии нужно проверять наличие в чертеже одноименных реакторов и вообще делать много всяких вещей. На русском в качестве справочника можно использовать Полещука. В качестве живых примеров, набирать на www.google.com соответствующих реакторов (в примерах недостатка не будет). И вот еще нашел вам урок по реакторам от Autodesk http://www.software.ufl.edu/autodesk...ut/vltut06.pdf . Конечно на английском.
{Smirnoff} вне форума  
 
Непрочитано 28.07.2004, 14:14
#11
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Цитата:
Сообщение от Fantomas
И вот еще нашел вам урок по реакторам от Autodesk http://www.software.ufl.edu/autodesk...ut/vltut06.pdf . Конечно на английском.
Это 6-я глава из бестселлера от Autodesk: садовая дорожка. У меня есть полностью для AutoCAD 2000 в pdf. Объем - всего 2.2 МБ. Конечно на русском.
Где взял - не помню.
Готов поделиться.
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 28.07.2004, 14:19
#12
Grinzaid

Архитектор
 
Регистрация: 14.10.2003
Израиль
Сообщений: 365
<phrase 1=


kos, вышли мне пожалуйста.
__________________
С уважением,
Влад Гринзайд.
Grinzaid вне форума  
 
Автор темы   Непрочитано 28.07.2004, 14:27
#13
Torino


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


>>Fantomas
Спасибо за пример!
Сижу разбираюсь.

>>Kos
И мне, пожалуйста
Torino вне форума  
 
Непрочитано 28.07.2004, 16:01
#14
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


>kos
Цитата:
того реактора, что я указал, маловато будет. Надо еще отслеживать событие завершения команды. Потому что, например, командой _LINE до ее завершения можно создать несколько отрезков.
Есть еще засада- объект прописывается в базу данных до
завершения команды(создания) и реактор начинает работать в тот же
момент. Т.е. изменить свойства примитива из реагирующей функции
на событие :vlr-objectappended невозможно.(объект еще не создан).
Эдуард вне форума  
 
Непрочитано 28.07.2004, 16:50
#15
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Цитата:
Сообщение от kos
Потому что, например, командой _LINE до ее завершения можно создать несколько отрезков.
Цитата:
Сообщение от Эдуард
Есть еще засада- объект прописывается в базу данных до завершения команды(создания) и реактор начинает работать в тот же момент.
Разве мы говорим не об одном и том же?...

Всем
Большой пардон, пошта работает с проблемами. Всем желающим, конечно вышлю, но не ругайте меня за то, что не моментально.
Терпение, господа, терпение...
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 28.07.2004, 16:53
#16
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Что-то вышло.Отдаю на обкатку и шлифовку
Код:
[Выделить все]
(defun typ-layer ()
  (vl-load-com)
  (if (not lay)
    (setq lay (vla-get-layers
		(vla-get-activedocument
		  (vlax-get-acad-object)
		)
	      )
    )
  )
  (if
    (not
      (tblsearch "Layer" "HATCH")
    )
     (vla-add lay "HATCH")
  )
  (if
    (not
      (tblsearch "Layer" "DIM")
    )
     (vla-add lay "DIM")
  )
  (if
    (not
      (tblsearch "Layer" "TEXT")
    )
     (vla-add lay "TEXT")
  )
  (if

    (not racdb)


     (setq racdb (vlr-acdb-reactor
		   nil
		   (list
		     '(:vlr-objectappended . dataobj)
		   )
		 )
     )
  )
  (if

    (not rcom)


     (setq rcom	(vlr-command-reactor
		  nil
		  (list
		    '(:vlr-commandended . ismlay)
		  )
		)
     )
  )
)
(defun dataobj (a b)
  (setq	vl-obj	 (vlax-ename->vla-object
		   (cadr b)
		 )
	name-obj (vla-get-objectname vl-obj)
  )

)

(defun ismlay (x y)
  (if
    (member (car y)
	    '("TEXT"	    "DTEXT"	  "MTEXT"	"HATCH"
	      "BHATCH"	    "DIMALIGNED"  "DIMLINEAR"	"DIMANGULAR"
	     )
    )
     (progn
       (cond

	 (
	  (equal name-obj "AcDbHatch")

	  (vla-put-Layer vl-obj "HATCH")
	 )

	 (
	  (or
	    (equal name-obj "AcDbText")
	    (equal name-obj "AcDbMText")
	  )

	  (vla-put-Layer vl-obj "TEXT")
	 )

	 (
	  (vl-string-search "Dimens" name-obj)

	  (vla-put-Layer vl-obj "DIM")
	 )
       )
     )
  )
  (princ)
)
Эдуард вне форума  
 
Непрочитано 28.07.2004, 17:17
#17
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Grinzaid, отправлено.
Torino, отправляется...

Админу: может выложить сей документ в download? Учитывая интерес публики и проблемы с почтой. Кстати, давайте проведем инвентаризацию: у кого что из документации имеется. И создадим autokad.ru - библиотеку.
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 28.07.2004, 17:28
#18
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


А вот и Torino отправлено...
Жду благодарностей [sm700]
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Автор темы   Непрочитано 28.07.2004, 18:05
#19
Torino


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


Эдуард! Она РАБОТАЕТ!
It's a miracle!

А ты не мог бы прокомментировать следующий код. Буду очень благодарен:
Код:
[Выделить все]
  (if 

    (not racdb) 


     (setq racdb (vlr-acdb-reactor 
         nil 
         (list 
           '(:vlr-objectappended . dataobj) 
         ) 
       ) 
     ) 
  ) 
  (if 

    (not rcom) 


     (setq rcom   (vlr-command-reactor 
        nil 
        (list 
          '(:vlr-commandended . ismlay) 
        ) 
      ) 
     ) 
  ) 
) 
(defun dataobj (a b) 
  (setq   vl-obj    (vlax-ename->vla-object 
         (cadr b) 
       ) 
   name-obj (vla-get-objectname vl-obj) 
  ) 

) 

(defun ismlay (x y) 
  (if 
    (member (car y) 
       '("TEXT"       "DTEXT"     "MTEXT"   "HATCH" 
         "BHATCH"       "DIMALIGNED"  "DIMLINEAR"   "DIMANGULAR" 
        ) 
    ) 
     (progn 
       (cond 

    ( 
     (equal name-obj "AcDbHatch") 

     (vla-put-Layer vl-obj "HATCH") 
    ) 

    ( 
     (or 
       (equal name-obj "AcDbText") 
       (equal name-obj "AcDbMText") 
     ) 

     (vla-put-Layer vl-obj "TEXT") 
    ) 

    ( 
     (vl-string-search "Dimens" name-obj) 

     (vla-put-Layer vl-obj "DIM") 
    ) 
       ) 
     ) 
  ) 
  (princ) 
)
>>kos
Пока тишина
Torino вне форума  
 
Непрочитано 29.07.2004, 09:17
#20
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Цитата:
Сообщение от Torino
>>kos
Пока тишина
Какая, к черту, тишина...
Mail delivery error, если, конечно, я иностранные буквы не попутал.
Пробую повторить...
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Реакция программы на появление объекта определенного типа

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

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