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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Отслеживание объектов появившихся после pasteclip

Отслеживание объектов появившихся после pasteclip

Ответ
Поиск в этой теме
Непрочитано 10.07.2008, 17:28 #1
Отслеживание объектов появившихся после pasteclip
Sleekka
 
-
 
Москва
Регистрация: 24.07.2005
Сообщений: 1,335

Уважаемые гуру. Подскажите пожалуйста куда копать в таком вопросе. Задача. Пользователь делает copyclip и pasteclip. Нужно получить список vla-указателей на вставленные объекты ну или ename-ов неважно.
Просмотров: 4585
 
Непрочитано 10.07.2008, 17:47
#2
VVA

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


Можно так
Код:
[Выделить все]
;;;* Mark data base to allow KB:catch.
;;;* http://www.theswamp.org/index.php?topic=15863.0
(defun mip:mark ( )
 (if (setq *mip:mark (entlast)) nil
    (progn (entmake '((0 . "point") (10 0.0 0.0 0.0)))
       (setq *mip:mark (entlast))(entdel *mip:mark)))(princ))
;;;* returns selection set of entities since last mip:mark.
(defun mip:get-last-ss (/ ss tmp val)
(setq val (getvar "cmdecho"))(setvar "cmdecho" 0)
(if *mip:mark (progn (setq ss (ssadd))
 (while (setq *mip:mark (entnext *mip:mark))(ssadd *mip:mark ss))
 (command "._select" ss "")(setq tmp ss ss nil));_progn
 (alert "*mip:mark not set. \n run (mip:mark) before mip:get-last-ss."));_if
 (setvar "cmdecho" val) tmp)
Использование
Код:
[Выделить все]
(defun C:TEST ()
  (mip:mark)
  (setvar "cmdecho" 0)
  (princ "\nВыберите объекты для копирования")
  (command "_.copyclip")
  (while (> (getvar "Cmdactive") 0)(command pause))
  (princ "\nА теперь вставляйте")
  (command "_.pasteclip")
  (while (> (getvar "Cmdactive") 0)(command pause))
  (SSSETFIRST nil (setq ss (mip:get-last-ss)))
  (princ)
  )
Преобразовать набор _dwgru-conv-pickset-to-list
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 11.07.2008, 17:31
#3
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Спасибо. Буду пробовать.
Sleekka вне форума  
 
Автор темы   Непрочитано 24.07.2008, 13:46
#4
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


У меня вопрос созрел. Кто-нибудь знает почему вот так не работает:
Код:
[Выделить все]
;Ниже переопределяем команду pasteclip
(vl-cmdf "_.undefine" "pasteclip")
(defun C:pasteclip (/)
(mip:mark)
  (vlax-invoke-method (vla-get-activedocument (vlax-get-acad-object)) 'sendcommand "_.pasteclip ")
  ;(command "_.pasteclip")
  (while (> (getvar "cmdactive") 0)(vl-cmdf pause))
  (SSSETFIRST nil (setq ss (mip:get-last-ss)))
  (princ)
  )

  ;;;* Mark data base to allow KB:catch.
;;;* http://www.theswamp.org/index.php?topic=15863.0
(defun mip:mark ( )
 (if (setq *mip:mark (entlast)) nil
    (progn (entmake '((0 . "point") (10 0.0 0.0 0.0)))
       (setq *mip:mark (entlast))(entdel *mip:mark)))(princ))
;;;* returns selection set of entities since last mip:mark.
(defun mip:get-last-ss (/ ss tmp val)
(setq val (getvar "cmdecho"))(setvar "cmdecho" 0)
(if *mip:mark (progn (setq ss (ssadd))
 (while (setq *mip:mark (entnext *mip:mark))(ssadd *mip:mark ss))
 (command "._select" ss "")(setq tmp ss ss nil));_progn
 (alert "*mip:mark not set. \n run (mip:mark) before mip:get-last-ss."));_if
 (setvar "cmdecho" val) tmp)
А вот так работает:
Код:
[Выделить все]
;Ниже переопределяем команду pasteclip
(vl-cmdf "_.undefine" "pasteclip")
(defun C:pasteclip (/)
(mip:mark)
  ;(vlax-invoke-method (vla-get-activedocument (vlax-get-acad-object)) 'sendcommand "_.pasteclip ")
  (command "_.pasteclip")
  (while (> (getvar "cmdactive") 0)(vl-cmdf pause))
  (SSSETFIRST nil (setq ss (mip:get-last-ss)))
  (princ)
  )

  ;;;* Mark data base to allow KB:catch.
;;;* http://www.theswamp.org/index.php?topic=15863.0
(defun mip:mark ( )
 (if (setq *mip:mark (entlast)) nil
    (progn (entmake '((0 . "point") (10 0.0 0.0 0.0)))
       (setq *mip:mark (entlast))(entdel *mip:mark)))(princ))
;;;* returns selection set of entities since last mip:mark.
(defun mip:get-last-ss (/ ss tmp val)
(setq val (getvar "cmdecho"))(setvar "cmdecho" 0)
(if *mip:mark (progn (setq ss (ssadd))
 (while (setq *mip:mark (entnext *mip:mark))(ssadd *mip:mark ss))
 (command "._select" ss "")(setq tmp ss ss nil));_progn
 (alert "*mip:mark not set. \n run (mip:mark) before mip:get-last-ss."));_if
 (setvar "cmdecho" val) tmp)
Sleekka вне форума  
 
Непрочитано 24.07.2008, 14:17
#5
VVA

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


Может коряво, но так работает
Код:
[Выделить все]
;Ниже переопределяем команду pasteclip
(command "_.undefine" "pasteclip")
(defun C:pasteclip (/)
(mip:mark)
  (vla-sendcommand (vla-get-activedocument (vlax-get-acad-object))
    "(progn (command \"_.pasteclip\")(while (> (getvar \"cmdactive\") 0)(command pause))(SSSETFIRST nil (setq ss (mip:get-last-ss))))\n")
  ;(command "_.pasteclip")
  ;(while (> (getvar "CMDACTIVE") 0)(command pause))
  ;(SSSETFIRST nil (setq ss (mip:get-last-ss)))
  (princ)
  )
;;;Для локализованных версий
(defun C:ВСТБУФЕР ()(C:pasteclip))
Недостающие ф-ции выше
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 24.07.2008, 14:33
#6
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Т.е. вы хотите сказать, что сделав sendcommand я навсега передаю управление в командную строку и то что дальше написано в лиспе не имеет действия? или какое-то другое логическое объяснение?
Мне конечно не принципиально через command или через sendcommand, просто некоторые команды которые работают только через диалог корректно удалось переопределить только через sendcommand.
Код:
[Выделить все]
(defun C:ВСТБУФЕР ()(C:pasteclip))
- интересное примечание,
спасибо, стоит подумать как же все-таки универсалку сделать при такой постановке вопроса.
Sleekka вне форума  
 
Непрочитано 24.07.2008, 14:49
#7
VVA

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


Sleekka, А как тебе этот вариантик?
Код:
[Выделить все]
(vl-load-com)
(defun CommandPASTECLIPEndedSub (evtCall lstCallback / )
 (if (= (car lstCallback) "PASTECLIP")
   (progn
     (and *mip:mark
	  (setq ss nil ss (ssadd))
	  (while (setq *mip:mark (entnext *mip:mark))(ssadd *mip:mark ss))
	  )
     ;;;Должен по идее отработать SSSETFIRST, но почему-то у меня это происходит через раз
     
          ;(SSSETFIRST ss ss)
      ;;;А вот такой прием через Ж... срабатывает
     (vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) "_.PSELECT\n!ss\n\n")
     )
 )
)

(defun CommandPASTECLIPWillStartSub (evtCall lstCallBack)
 (if (= (car lstCALLBACK) "PASTECLIP")(setq *mip:mark (entlast)))
)
(vlr-remove-all :VLR-Command-Reactor)
(setq dwgruCommandPASTECLIPWillStart (vlr-editor-reactor nil '((:vlr-commandwillstart . CommandPASTECLIPWillStartSub)))
      dwgruCommandPASTECLIPEnded     (vlr-editor-reactor nil '((:vlr-commandended     . CommandPASTECLIPEndedSub)))
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 24.07.2008, 16:56
#8
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Спасибо.
Хороший вариантик, но реакторы. Undefine проще и недежней имхо.
кстати я насколько понимаю, то с локализованными версиями та же проблема что и с undefine.
Sleekka вне форума  
 
Непрочитано 25.07.2008, 08:22
#9
Кулик Алексей aka kpblc
Moderator

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


VVA, а как это ты собираешься добиваться корректной работы в командных реакторах, используя там SendCommand? Теоретически такое вообще недопустимо
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.07.2008, 10:26
#10
VVA

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


Кулик Алексей aka kpblc,
Теоретически SSSETFIRST должно выделять. У меня и выделяет. Просто в некоторый момент ручек нет, но когда вызовешь например _move предварительный выбор съедается правильно. Такое ощущение, что глючит экранное отображение ручек (Autocad 2006 Rus Sp1).
Цитата:
Теоретически такое вообще недопустимо
Теоретически майский жук летать не может. Да и я же там написал через какую часть тела сделан этот прием. Однако работает.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 25.07.2008, 11:11
#11
Кулик Алексей aka kpblc
Moderator

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


Реактор один раз на AA2008Eng+SP1 свалился в бесконечный цикл (возможно, глюк) и выбил в Fatal Error.
Лично у меня почему-то есть мнение, что это выделение, скорее всего, понадобится для последующей программной обработки. Или нет?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.07.2008, 11:48
#12
VVA

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


Цитата:
понадобится для последующей программной обработки. Или нет?
Это надо спрашивать у Sleekka,
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 15.09.2008, 17:58
#13
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Приведенный выше код не правильно отрабатывает, если последний примитив рисунка = блок с атрибутами.
Код:
[Выделить все]
;;;* Mark data base to allow KB:catch.
;;;* http://www.theswamp.org/index.php?topic=15863.0
(defun mip:mark ( )
 (progn (entmake '((0 . "point") (10 0.0 0.0 0.0)))
       (setq *mip:mark (entlast))(entdel *mip:mark))
  (princ))
;;;* returns selection set of entities since last mip:mark.
(defun mip:get-last-ss (/ ss tmp val)
(setq val (getvar "cmdecho"))(setvar "cmdecho" 0)
(if *mip:mark (progn (setq ss (ssadd))
 (while (setq *mip:mark (entnext *mip:mark))(ssadd *mip:mark ss))
 (command "._select" ss "")(setq tmp ss ss nil));_progn
 (alert "*mip:mark not set. \n run (mip:mark) before mip:get-last-ss."));_if
 (setvar "cmdecho" val) tmp)

Последний раз редактировалось Sleekka, 16.09.2008 в 11:07. Причина: Исправил ошибку со скобками, вроде - усё.
Sleekka вне форума  
 
Непрочитано 15.09.2008, 22:16
#14
Кулик Алексей aka kpblc
Moderator

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


Sleekka, ты в своем варианте капитально прошибся со скобками
И, кстати, ты так и не сказал, а чего в результате-то надо?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.09.2008, 11:05
#15
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
Sleekka, ты в своем варианте капитально прошибся со скобками
Сорри, поправил, просто я пишу на соседнем компе который неподключен ни к каким сетям, а форум проигрывает vlide редактору - двойной клик у скобок не работает
Цитата:
И, кстати, ты так и не сказал, а чего в результате-то надо?
А я и не понял толком чего вы спрашиваете, если можно еще раз конкретно вопрос? Тему изначально создавал когда писал программку по отслеживанию объектов которые пользователи копируют из своих старых рыб, после того как их вставили автогад разносит обеъкты по стилям и слоям (программная поддержка СТП). Впринципе я получил что хотел, единственное после того как заметил нежелательный результат если последний объект блок с атрибутами (насколько я понял entlast - возвращает ename самого входения а после него идут еще атрибуты, и первоначальный код скидывает enamы для дальнейшей обработки как вновь появившиеся объекты, а мне например нужен explode и когда туда я подставляю ename атрибута, то взрываются вновь появившиеся объекты и старый блок, вобщем суть в том что создавать точку нужно всегда - так надежнее).
Sleekka вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Отслеживание объектов появившихся после pasteclip

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FILTER / фильтр BM60 Справочник команд 0 08.07.2008 15:35
После выбора объектов в панеле \"Свойства\" написа Леха Кучерявый AutoCAD 8 29.03.2007 13:29