Редактирование атрибутов в реакторе (ACAD 2009, ALISP)
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Редактирование атрибутов в реакторе (ACAD 2009, ALISP)

Редактирование атрибутов в реакторе (ACAD 2009, ALISP)

Ответ
Поиск в этой теме
Непрочитано 09.12.2010, 11:03 #1
Редактирование атрибутов в реакторе (ACAD 2009, ALISP)
EfremenkoDO
 
Санкт-Петербург
Регистрация: 24.12.2009
Сообщений: 59

Пытаюсь отредактировать таким образом. Вне реактора работает нормально. При бработке в реакторе не добавляются координаты точки в командную строку.
Код:
[Выделить все]
...
(progn
       (setq argpoint (car argpoint))
       (setq
	 cmd (strcat "_.eattedit" " "
		     (rtos (nth 0 argpoint) 2)
		     ","
		     (rtos (nth 1 argpoint) 2)
		     ","
		     (rtos (nth 2 argpoint) 2)
	     )
       )
     )
...
(vla-sendcommand
    (vla-get-activedocument (vlax-get-acad-object))
    (strcat (vl-string-trim " " cmd) " ")
  )
Пытаюсь сделать аналог стандартного редактирования, чтоб при двойном щелчке по атрибуту, появлялось окно с подсвеченным атрибутом получившим событие
Просмотров: 2346
 
Непрочитано 09.12.2010, 11:17
#2
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


В командных реакторах крайне нежелательно использовать командные же методы. Особенно учитывая, что атрибут можно отредактировать и без этого.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 09.12.2010, 11:21
#3
EfremenkoDO


 
Регистрация: 24.12.2009
Санкт-Петербург
Сообщений: 59
<phrase 1=


Реактор стоит на двойной клик, в связи с этим отключен DBLCLKEDIT. По этому приходится именно так редактировать. Впринципе работает, вот только не выделяется в появляющемся окне тот атрибут по которому я щелкал
EfremenkoDO вне форума  
 
Непрочитано 09.12.2010, 12:29
#4
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Лиспер Посмотреть сообщение
В командных реакторах крайне нежелательно использовать командные же методы.
+мульйон. И вообще во всех реакторах.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 09.12.2010, 12:33
#5
EfremenkoDO


 
Регистрация: 24.12.2009
Санкт-Петербург
Сообщений: 59
<phrase 1=


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
+мульйон. И вообще во всех реакторах.
тогда какой другой способ? как обработать команды _bedit и eattedit
EfremenkoDO вне форума  
 
Непрочитано 09.12.2010, 12:54
#6
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Получить указатель на обрабатываемый атрибут и (например) задать ему свойство TextString
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 09.12.2010, 13:17
#7
EfremenkoDO


 
Регистрация: 24.12.2009
Санкт-Петербург
Сообщений: 59
<phrase 1=


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Получить указатель на обрабатываемый атрибут и (например) задать ему свойство TextString
как получить указатель на атрибут по точке?

PS TextString заранее не известен. Есть возможность создавать формулы у атрибутов. Так что работа с TextString не прокатит
EfremenkoDO вне форума  
 
Непрочитано 09.12.2010, 13:41
#8
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


"Формулы у атрибутов" - это поля, что ли?
Получение vla-указателя на атрибут по указателю на блок и тэгу атрибута:
Код:
[Выделить все]
(vl-load-com)

(defun _dwgru-block-attr-by-tag
       (block-ref att-tag / _lsp-conv-vla-to-list)

  (defun _lsp-conv-vla-to-list (value / res)
    (cond
      ((listp value)
       (mapcar '_lsp-conv-vla-to-list value)
      )
      ((= (type value) 'variant)
       (_lsp-conv-vla-to-list (vlax-variant-value value))
      )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (_lsp-conv-vla-to-list (vlax-safearray->list value))
       ) ;_ end of if
      )
      ((= (type value) 'ename)
       (_lsp-conv-vla-to-list (vlax-ename->vla-object value))
      )
      ((and (= (type value) 'vla-object)
            (vlax-property-available-p value 'count)
       ) ;_ end of and
       (vlax-for sub value
         (setq res (cons sub res))
       ) ;_ end of vlax-for
      )
      (t value)
    ) ;_ end of cond
  ) ;_ end of defun

  (if (and (setq att-tag   (strcase att-tag)
                 block-ref (cond
                             ((= (type block-ref) 'ename)
                              (vlax-ename->vla-object block-ref)
                             )
                             ((= (type block-ref) 'vla-object) block-ref)
                           ) ;_ end of cond
           ) ;_ end of setq
           (wcmatch (vla-get-objectname block-ref) "*BlockRef*")
      ) ;_ end of and
    (car
      (vl-remove-if-not
        (function
          (lambda (x)
            (wcmatch (strcase (vla-get-tagstring x)) att-tag)
          ) ;_ end of lambda
        ) ;_ end of function
        (append
          (_lsp-conv-vla-to-list (vla-getattributes block-ref))
          (_lsp-conv-vla-to-list
            (vla-getconstantattributes block-ref)
          ) ;_ end of _lsp-conv-vla-to-list
        ) ;_ end of append
      ) ;_ end of vl-remove-if-not
    ) ;_ end of car
  ) ;_ end of if
) ;_ end of defun
__________________
(/= RegDate StartReadDate)

Последний раз редактировалось Лиспер, 09.12.2010 в 13:49. Причина: Нашел ошибку в коде
Лиспер вне форума  
 
Автор темы   Непрочитано 09.12.2010, 13:57
#9
EfremenkoDO


 
Регистрация: 24.12.2009
Санкт-Петербург
Сообщений: 59
<phrase 1=


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Получение vla-указателя на атрибут по указателю на блок и тэгу атрибута:
Это все понятно. Я спрашивал не совсем то изначально. При двойном щелчке по атрибуту должно появится окно с редактором команды "_.eattedit" и для редактирования должен быть предложен тот атрибут по которому щелкали.

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

И к стати, по точке атрибут так можно определить
Код:
[Выделить все]
(Setq att	(vlax-ename->vla-object
		  (car (nentselp (trans point 0 1)))
		)
)
EfremenkoDO вне форума  
 
Непрочитано 09.12.2010, 14:01
#10
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Offtop: Если хочется головняка - здрасьте, вот и он. Реакцию на двойной клик мышой вообще-то переопределять замучаешься, особенно учитывая поведение вертикалок и вмешательство в это дело CUI. Охота использовать окно? Вперед, рисовать собственное
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 09.12.2010, 14:04
#11
EfremenkoDO


 
Регистрация: 24.12.2009
Санкт-Петербург
Сообщений: 59
<phrase 1=


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Offtop: Реакцию на двойной клик мышой вообще-то переопределять замучаешься, особенно учитывая поведение вертикалок и вмешательство в это дело CUI. Охота использовать окно? Вперед, рисовать собственное
Offtop: Вот и переопределяю от случая к случаю дополняю. Окна у меня все появляются, так что рисовать не стоит.
EfremenkoDO вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Редактирование атрибутов в реакторе (ACAD 2009, ALISP)



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
редактирование ячейки таблицы (ACAD 2009, ALISP) EfremenkoDO LISP 3 02.12.2010 12:10
редактирование MLeader (ACAD 2009, ALISP) EfremenkoDO LISP 2 22.10.2010 13:54
как из процедуры реактора вызвать необходимый диалог? (ACAD 2009, ALISP) EfremenkoDO LISP 4 12.10.2010 11:52
Информация по идентификационным кодам программ в сетевых лицензиях Autodesk KSI AutoCAD 1 14.09.2009 15:59
Проблема вставки диаграмм в ACAD 2009 из Excel 2007 ST2 AutoCAD 1 26.05.2009 01:30