Тема: ObjectARX. Отслеживание и рисование

Первый вариант функции позволяющей заменить (grread) для динамического отслеживания и отрисовки с сохранением возможности использования привязок, фильтров координат, всевозможных меню, прозрачных команд и т.д.
Возможности функции видны из тестового примера. Очень надеюсь, что я его прокомментировал в достаточной степени. Работа функции проверялась по AutoCAD 2006, но теоретически работает во всей линейке AutoCAD 2004...2006

;;--------------------------------------------------------------------
;;      Тестовая программа для проверки работы функции DynDraw
;;--------------------------------------------------------------------
(defun C:dyn_test ( / p_prev p_base p min_step
                      ang dist p1 p2 p3 _bm _ce
                  )
  ;; Задаем минимальный шаг (расстояние между точками,
  ;; при превышении которого будут выполняться перерисовка
  (setq min_step 1e-6)
  ;; Если arx-файл еще не загружен - загрузим его
  ;; Очевидно, что он должен находится в путях доступа
  ;; AutoCAD в текущем профиле
  (if (null dyndraw) (progn
    (arxload "dyndraw.arx")
  )) ;_endof if progn
  ;; Подавляем BLIPMODE - чтобы polar не тормозил
  (setq _bm (getvar "blipmode") _ce (getvar "cmdecho"))
  (setvar "blipmode" 0) (setvar "cmdecho" 0)
  ;; Регистрируем функцию для вызова из ObjectARX
  ;; Это обязательная процедура!!!
  (vl-acad-defun 'dyn_call_back)
  (while
    (and dyndraw
         (setq p (getpoint "\nУкажите базовую точку (ENTER - завершение): ")))
    (setq p_base p p_prev p)
    (setq p
      (dyndraw
         ;; Имя callback - функции
         "dyn_call_back"
         ;;------------------------------------------------------------
         ;; Строка подсказка, как для функций (getxxxx)
         ;;------------------------------------------------------------
         "\nУкажите точку [Базовая точка]: "
         ;;------------------------------------------------------------
         ;; Строка ключевых слов, как для (initget) - может быть nil
         ;; Возможно использвание глобальных ключевых слов
         ;;------------------------------------------------------------
         "Б B _ B B" ;; Такой вид записи используется чтоб дать
                     ;; возможность вводить глобальные ключевые
                     ;; слова без подчеркивания
         ;;------------------------------------------------------------
         ;; Управление вводом - возможна сумма следующих чисел или nil
         ;;------------------------------------------------------------
         ;; GovernedByOrthoMode              1
         ;; NullResponseAccepted             2
         ;; DontEchoCancelForCtrlC           4
         ;; DontUpdateLastPoint              8
         ;; NoDwgLimitsChecking             16
         ;; NoZeroResponseAccepted          32
         ;; NoNegativeResponseAccepted      64
         ;; Accept3dCoordinates            128
         ;; AcceptMouseUpAsPoint           256
         ;; AnyBlankTerminatesInput        512
         ;; InitialBlankTerminatesInput   1024
         ;; AcceptOtherInputString        2048
         ;;------------------------------------------------------------
         (+ 2 128) ;; Разрешим пустой ввод и 3D-точки
         ;;------------------------------------------------------------
         ;; Управление видом курсора - возможно одно из следующих
         ;; чисел или nil
         ;;------------------------------------------------------------
         ;; NoSpecialCursor      -1      No special cursor specified
         ;; Crosshair             0      Full screen cross hair
         ;; RectCursor            1      Rectangular cursor
         ;; RubberBand            2      Rubber band line
         ;; NotRotated            3      (AutoCAD internal use only)
         ;; TargetBox             4      Target Box type
         ;; RotatedCrosshair      5      (AutoCAD internal use only)
         ;; CrossHairNoRotate     6      Crosshairs forced non-rotated
         ;; Invisible             7      Invisible cursor
         ;; EntitySelect          8      Entity selection target cursor
         ;; Parallelogram         9      Parallelogram cursor
         ;; EntitySelectNoPersp  10      Pickbox, suppressed in persp
         ;; PkfirstOrGrips       11      Auto-select cursor
         2 ;;  Резиновая линия
         ;;------------------------------------------------------------
         ;; Базовая точка (в UCS) - если параметр не задан берется
         ;; текущее положение курсора
         ;;------------------------------------------------------------
         p
      )
    )
    (redraw)
    (if p (progn
      ;; Настало время добавить полученный квадрат в чертеж!
      (setq ang   (angle p_base p)
            dist  (* (distance p_base p) (sqrt 2))
            p1    (polar p (+ ang (* pi 0.75)) dist)
            p2    (polar p1 (+ ang (* pi 1.25)) dist)
            p3    (polar p2 (+ ang (* pi 1.75)) dist)
      )
      (command "_.undo" "_begin")
      (command "_.pline" "_none" p "_none" p1  "_none" p2  "_none" p3 "_c")
      (command "_.undo" "_end")
    )) ;_endof if progn
  ) ;_endof while
  (setvar "blipmode" _bm) (setvar "cmdecho" _ce)
  (princ)
) ;_endof defun
;;--------------------------------------------------------------------
;;               Пример callback-функции
;; 1. Функция вызывается с одним параметром, который может быть или
;;    точкой в UCS или ключевым словом.
;; 2. Возврат nil в вызывающей ее функции воспринимается, как признак
;;    завершения работы и вызвающая функция тоже вернет nil
;; 3. Возврат в вызывающую функцию точки, которая отлична от
;;    переданной воспринимается, как изменение базовой точки.
;;
;; Исходная версия данного теста помещена [b]AY[/b]:
;; http://www.autocad.ru/cgi-bin/f1/board.cgi?t=20011NW20050825095145
;;--------------------------------------------------------------------
(defun dyn_call_back (p / p1 p2 p3)
 (cond
  ((= (type p) 'STR) ;; Выбрано ключевое слово
    (redraw) ;; Чистим мусор на экране
    (if (= p "B") (progn ;; Запрос базовой точки
      (if (setq p (getpoint p_base "\nУкажите новую базовую точку: "))
        (setq p_base p)
      )
    )) ;_endof if progn
  )
  ((= (type p) 'LIST) ;; Отслеживание по точке
    (if (null p_base) (setq p_base p p_prev p))
    (if (and p_prev (> (distance p_prev p) min_step)) (progn
      (setq p_prev p)
      (setq input p
            ang   (angle p_base input)
            dist  (* (distance p_base input) (sqrt 2))
            p1    (polar input (+ ang (* pi 0.75)) dist)
            p2    (polar p1 (+ ang (* pi 1.25)) dist)
            p3    (polar p2 (+ ang (* pi 1.75)) dist)
       )
       (redraw) ;; Чистим мусор на экране
       (grdraw input p1 -1)
       (grdraw p1 p2 -1)
       (grdraw p2 p3 -1)
       (grdraw p3 input -1)
    ))
    p
  )
 ) ;_endof cond
) ;_endof defun

ARX-файл, необходимый для работы этой программы можно взять здесь: http://www.maestrogroup.com.ua/support/dyndraw.zip
Обновления будут выкладываться там же.
Пожелания и конструктивная критика приветствуются. smile

Re: ObjectARX. Отслеживание и рисование

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

(defun C:dyn_test-1 (/ p_prev p_base p min_step ang dist p1 p2 p3 _bm
                     _ce  draw-ent)
    ;; Задаем минимальный шаг (расстояние между точками,
    ;; при превышении которого будут выполняться перерисовка
    (setq min_step 1e-6)
    (if (null dyndraw)
        (progn
            (arxload "dyndraw.arx")
        )
    ) ;_endof if progn
    ;; Подавляем BLIPMODE - чтобы polar не тормозил
    (setq _bm (getvar "blipmode")
          _ce (getvar "cmdecho")
    )
    (setvar "blipmode" 0)
    (setvar "cmdecho" 0)
    ;; Регистрируем функцию для вызова из ObjectARX
    (vl-acad-defun 'dyn_call_back-1)
;;создание примитива
    (entmake
        (list '(0 . "text")
              (cons 1 "00000") ;текст
              (cons 40 10) ;высота шрифта
              (cons 10 '(0 0 0))
        ) ;конец list
    )
    (setq draw-ent  (vlax-ename->vla-object (entlast))) ;(entlast)) ;
    (if dyndraw
        (progn
            (setq p
                     (dyndraw
                         "dyn_call_back-1"
                         "\nУкажите точку : "
                         nil
                         (+ 2 128)
                         -1
                         nil
                     )
            )
            (redraw)
            (if p
                (progn
                    (vla-put-insertionpoint draw-ent (vlax-3d-point p))
                    (vla-put-TextString
                        draw-ent
                        (strcat "X=" (rtos (car p)) "  Y=" (rtos (cadr p)))
                    )
;;;                    (vla-move draw-ent
;;;                              (vlax-3d-point '(0 0 0))
;;;                              (vlax-3d-point '(0 0 0))
;;;                    )
                )
            ) ;_endof if progn
        )
    )
    (setvar "blipmode" _bm)
    (setvar "cmdecho" _ce)
    (princ)
)
(defun dyn_call_back-1 (p / )
    (if (not p_prev)
 ;;;       (progn
            (setq p_prev p)
 ;;;        (vla-put-insertionpoint draw-ent (vlax-3d-point p))
 ;;;       )
    )
    (if (and (LISTp p) (> (distance p_prev p) min_step))
        (progn
 ;(redraw)
            (vla-put-insertionpoint draw-ent (vlax-3d-point p))
;;;            (vla-move draw-ent
;;;                      (vlax-3d-point p_prev)
;;;                      (vlax-3d-point p)
;;;            )
            (vla-put-TextString
                draw-ent
                (strcat "X=" (rtos (car p)) "  Y=" (rtos (cadr p)))
            )
            (vla-update draw-ent)
            (setq p_prev p)
        )
    )
    t
)

Re: ObjectARX. Отслеживание и рисование

> Александр Ривилис
Попробовал ваш тест. Очень похоже на отрисовку многоугольника с числом сторон, равным 4, и точно так же в режиме ОРТО рисуется равносторонний ромб. Ожидал я, что отрисованный на экране квадрат будет перемещаться вслед за курсором, но рисуется только в новой точке все тот же квадрат (ромб), как будто это зацикленная команда "_Poligon" ("_Мн-угол") без запросов о числе сторон и об окружностях. Видимо, "DINDRAW"  - это утилита, а не готовая программа для пользователя, IMHO, и сам пользователь должен применить ее сообразно своим целям, если он, конечно, владеет AutoLisp. Вот пример AY наглядно показывает динамическое отслеживание координат точек на экране, но замечается эффект неполного отражения координат при остановке курсора (только часть координаты X). В режиме с включенными привязками координаты то отображаются при остановке курсора, то не отображаются. Это я все описал только как констатацию факта. Надо вникать, как использовать, вообще очень интересно.

Re: ObjectARX. Отслеживание и рисование

Неправильно обозначил функцию, хотел "DYNDRAW".

Re: ObjectARX. Отслеживание и рисование

> AY
Начались проблемы. sad В данном случае проблема в том, что AutoCAD достаточно медленно отображает текст, а потом зачем-то закрывает его. Ничего умнее, чем выполнять постоянное обновление текста в такой ситуации я пока не придумал. Появляется довольно неприятное перемигивание текста. sad Увы.

(defun C:dyn_test-1 (/ p_prev p_base p min_step ang dist p1 p2 p3 _bm
                       _ce  draw-ent en e)
    ;; Задаем минимальный шаг (расстояние между точками,
    ;; при превышении которого будут выполняться перерисовка
    (setq min_step 1e-6)
    (if (null dyndraw)
        (progn
            (arxload "dyndraw.arx")
        )
    ) ;_endof if progn
    ;; Подавляем BLIPMODE - чтобы polar не тормозил
    (setq _bm (getvar "blipmode")
          _ce (getvar "cmdecho")
    )
    (setvar "blipmode" 0)
    (setvar "cmdecho" 0)
    ;; Регистрируем функцию для вызова из ObjectARX
    (vl-acad-defun 'dyn_call_back-1)
    ;;создание примитива
    (entmake
        (list '(0 . "text")
              (cons 1 "00000") ;текст
              (cons 40 10.0) ;высота шрифта
              (cons 10 '(0.0 0.0 0.0))
              (cons 11 '(0.0 0.0 0.0))
        ) ;конец list
    )
    (setq draw-ent (vlax-ename->vla-object (setq en (entlast))))
    (if dyndraw
        (progn
            (setq p
                     (dyndraw
                         "dyn_call_back-1"
                         "\nУкажите точку : "
                         nil
                         (+ 2 128)
                         5
                         nil
                     )
            )
            (redraw)
            (entupd en)
            (if p
                (progn
                    (setq p (trans p 1 0))
                    (vla-put-insertionpoint draw-ent (vlax-3d-point p))
                    (vla-put-TextString
                        draw-ent
                        (strcat "X=" (rtos (car p)) "  Y=" (rtos (cadr p)))
                    )
                )
            ) ;_endof if progn
        )
    )
    (setvar "blipmode" _bm)
    (setvar "cmdecho" _ce)
    (princ)
)
(defun dyn_call_back-1 (p / p1)
    (if (and p (not p_prev))
        (progn
            (setq p_prev (trans p 1 0))
            (vla-put-insertionpoint draw-ent (vlax-3d-point p_prev))
            (vla-put-TextString
               draw-ent
               (strcat "X=" (rtos (car p_prev)) "  Y=" (rtos (cadr p_prev)))
            )
        )
    )
    (if (and (listp p) (>= (distance p_prev (setq p1 (trans p 1 0))) min_step))
      (progn
          (vla-put-insertionpoint draw-ent (vlax-3d-point p1))
          (vla-put-TextString
             draw-ent
             (strcat "X=" (rtos (car p1)) "  Y=" (rtos (cadr p1)))
          )
          (setq p_prev p1)
          (vla-update draw-ent)
          (redraw)
      )
    )
    (vla-update draw-ent)
    (redraw)
    t
)

Re: ObjectARX. Отслеживание и рисование

> Владимир Громов
Это действительно лишь тестовая программа (я имею в виду c:dyn_test), дающая представление о том, как можно использовать функцию (dyndraw ...). Не больше и не меньше... Может быть ее не следовало помещать в раздел "Готовые программы", но тогда куда? Ее назначение - облегчить жизнь lisp-программистам, но написана на ObjectARX. Так что куда бы я ее не поместил, она бы была не к месту...

Re: ObjectARX. Отслеживание и рисование

> Александр Ривилис
Без "c:dyn_test" нельзя было бы понять работу "dyndraw". Очень хорошо, что тест находится здесь, всегда можно посмотреть оригинал. Сам я уже начал модернизировать свою программу вставки проемов в перегородку и начал с отрисовки прямоугольника с динамическим отслеживанием точки вставки.

Re: ObjectARX. Отслеживание и рисование

> Александр Ривилис
Попробовал последний вариант и должен сказать проблема осталась. Постоянная перерисовка происходит только изредка, а в остальном картина таже.
Интерестно почему подобное происходит при включенной привязке?
И куда скрывается текст? В начале тестирования, пока я не добавил модификацию текста после выхода из dyndraw, заметил такую особенность если в момент остановки курсора текст не виден (а с привязкой это, как правило, происходит постоянно), то после штатного выхода по нажатию левой кнопки текст на экране не появляется. Если чертеж регенерировать, то текст появляется, но его нельзя интерактивно выбрать! И только после вылеления всех примитивов соответствующей опцией некоторой команды примитив оживает и начинает выделяться.Это я к тому, что может эти симптомы наведут вас на мысль.
Кстати, нельзя сказать, что исчезновение случается только с текстом. Пробовал модифицировать линию - эффект такой же.

Re: ObjectARX. Отслеживание и рисование

> AY
Я тоже наткнулся на ситуацию с невозможностью выбрать текст. Даже регенерация не помогала. Сначала грешил на vla-функции, но дело оказалось не в этом.
Кажется (трижды постучал по дереву), понял в чем проблема - она очень глубоко зарыта. Выкачайте, пожалуйста, обновленную версию dyndraw.arx (на старом месте) и попробуйте с этой lisp-программой:

(defun C:dyn_test-1 (/ p_prev p_base p min_step ang dist p1 p2 p3 _bm
                       _ce  draw-ent en e)
    ;; Задаем минимальный шаг (расстояние между точками,
    ;; при превышении которого будут выполняться перерисовка
    (setq min_step 1e-6)
    (if (null dyndraw)
        (progn
            (arxload "dyndraw.arx")
        )
    ) ;_endof if progn
    ;; Подавляем BLIPMODE - чтобы polar не тормозил
    (setq _bm (getvar "blipmode")
          _ce (getvar "cmdecho")
    )
    (setvar "blipmode" 0)
    (setvar "cmdecho" 0)
    ;; Регистрируем функцию для вызова из ObjectARX
    (vl-acad-defun 'dyn_call_back-1)
    ;;создание примитива
    (entmake
        (list '(0 . "text")
              (cons 1 "00000") ;текст
              (cons 40 10.0) ;высота шрифта
              (cons 10 '(0.0 0.0 0.0))
              (cons 11 '(0.0 0.0 0.0))
        ) ;конец list
    )
    (setq draw-ent (vlax-ename->vla-object (setq en (entlast))))
    (if dyndraw
        (progn
            (setq p
                     (dyndraw
                         "dyn_call_back-1"
                         "\nУкажите точку : "
                         nil
                         (+ 2 128)
                         -1
                         nil
                     )
            )
            (redraw)
            (entupd en)
            (if p
                (progn
                    (setq p (trans p 1 0))
                    (vla-put-insertionpoint draw-ent (vlax-3d-point p))
                    (vla-put-TextString
                        draw-ent
                        (strcat "X=" (rtos (car p)) "  Y=" (rtos (cadr p)))
                    )
                )
            ) ;_endof if progn
        )
    )
    (setvar "blipmode" _bm)
    (setvar "cmdecho" _ce)
    (princ)
)
(defun dyn_call_back-1 (p / p1)
    (if (and p (not p_prev))
        (progn
            (setq p_prev (trans p 1 0))
            (vla-put-insertionpoint draw-ent (vlax-3d-point p_prev))
            (vla-put-TextString
               draw-ent
               (strcat "X=" (rtos (car p_prev)) "  Y=" (rtos (cadr p_prev)))
            )
        )
    )
    (if (and (listp p) (>= (distance p_prev (setq p1 (trans p 1 0))) min_step))
      (progn
          (vla-put-insertionpoint draw-ent (vlax-3d-point p1))
          (vla-put-TextString
             draw-ent
             (strcat "X=" (rtos (car p1)) "  Y=" (rtos (cadr p1)))
          )
          (setq p_prev p1)
      )
    )
    (vla-update draw-ent)
    t
)

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

Re: ObjectARX. Отслеживание и рисование

> Владимир Громов
smile Рад, что моей функции сразу нашлось применение. Только пока не торопитесь. Очень вероятно, что мне придется несколько модифицировать параметры ее вызова, параметры передаваемые в callback-функцию и значения, которые callback-функция будет возвращать. Планируется возможность в callback-функции полностью менять все параметры, которые передаются в (dyndraw), в том числе и имя callback-функции. Более подробно это все я опишу в dyndraw.lsp

Re: ObjectARX. Отслеживание и рисование

> Александр Ривилис
Работает. Идет постоянная перерисовка т.е. перемигивание, как вы и говорили ранее. Процессор грузится по-полной но "тормозов" не заметно.

Re: ObjectARX. Отслеживание и рисование

> AY
Странно, у перемигивает, только если курсор двигается. Если курсор стоит на месте, то и текст стоит, как вкопанный. Это возможно связано с "железом" и версиями AutoCAD... Но главное, как я понял текст у Вас виден нормально и постоянно?

Re: ObjectARX. Отслеживание и рисование

Сейчас закоментировал (redraw) в вызываемой функции И  НИКАГОГО МЕРЦАНИЯ!!!
текст виден целиком и полностью.
Только на курсоре после выхода квадратик не восстанавливается (это я про стандартный курсор).

Re: ObjectARX. Отслеживание и рисование

И процессор при неподвижном курсоре перестал грузиться!

Re: ObjectARX. Отслеживание и рисование

> AY

> AY
Так я же просил с моим последним примером проверить! У меня (redraw) не было! Только (vla-Update)! smile
Ну будем считать, что с этим разобрались...

Re: ObjectARX. Отслеживание и рисование

> Александр Ривилис
Ну бывает, попутался. smile
Вы еще обещали разъяснить, что это было (для любознательных). И вообще, по схеме работы функции, не сочтите за труд, "настучите" пару-тройку фраз.

Re: ObjectARX. Отслеживание и рисование

> AY
С курсорчиком пока разбираться не стал - просто добавил в конец основной функции строку

(command "_.REDRAW")

И курсорчик стал возвращаться в свое исходное состояние.

> AY
Объяснить достаточно сложно. Смысл в том, что класс AcEdJig предназначен  совсем не для таких штучек, а для создания примитивов и задания им начальных свойств. Я же его прицепил совсем к другому... В результате пришлось создать класс-заглушку и впихнуть вызов лисповской calback-функции в метод worldDraw() для класса-заглушки. Тогда все стало на свои места. smile
А по схеме работы функции я сейчас настучу. Правда в пару-тройку фраз уместиться не получится.

Re: ObjectARX. Отслеживание и рисование

;;--------------------------------------------------------------------
;;                           (DynDraw)
;;--------------------------------------------------------------------
;;
;; Вызов функции:
;;  (dyndraw
;;    <call_back>      - имя callback-функции (STR)
;;    <input_prompt>   - строка подсказки (STR)
;;    <keyword_list>   - строка ключевых слов (STR)
;;    <input_flag>     - флаг параметров ввода (INT)
;;    <cursor_type>    - вид курсора (INT)
;;    <base_point>     - базовая точка или nil
;;  )
;;
;; Параметры и возможные их значения:
;;
;;  1) <call_back>
;;     Строка имени callback-функции. Функция должна быть зарегистрирована
;;     при помощи вызова: (vl-acad-defun '<call_back>)
;;
;;     Функция принимает один параметр. В зависимости от <input_flag>
;;     он может быть:
;;     1) (list X Y Z) - точка,      если задан флаг acqurePoint
;;     2) REAL         - расстояние, если задан флаг acqureDist
;;     3) REAL         - угол,       если задан флаг acqureAngle
;;     4) STR          - ключевое слово   - если строка ключевых слов не пустая или
;;                       введенная строка - если задан флаг AcceptOtherInputString
;;
;;     Функция должна возвратить одно из следующих значений:
;;     1) nil          - завершить работу функции;
;;     2) (list X Y X) - точка - изменить текущую точку;
;;     3) (list ...)   - список аналогичный списку параметров
;;                       функции (dyndraw) для замены всех
;;                       параметров;
;;     4) T            - для продолжения работы без изменения
;;                       параметров;
;;  2) <input_prompt>
;;     Обычная строка подсказки, как для всех функций (getXXXX)
;;
;;  3) <keyword_list>
;;     Строка ключевых слов, как для функции (initget)
;;
;;  4) <input_flag>
;;     Флаг ввода - должен быть суммой одного или
;;     нескольких из следующих значений:
;;
;;     GovernedByOrthoMode             1
;;     NullResponseAccepted            2
;;     DontEchoCancelForCtrlC          4
;;     DontUpdateLastPoint             8
;;     NoDwgLimitsChecking            16
;;     NoZeroResponseAccepted         32
;;     NoNegativeResponseAccepted     64
;;     Accept3dCoordinates           128
;;     AcceptMouseUpAsPoint          256
;;     AnyBlankTerminatesInput       512
;;     InitialBlankTerminatesInput  1024
;;     AcceptOtherInputString       2048
;;
;;     и только одного из следующих значений:
;;
;;     acqurePoint        0  -  в вызывающую функцию (и в callback)
;;                              возвращается point - выбранная точка
;;     acqureDist      8192  -  в вызывающую функцию (и в callback)
;;                              возвращается REAL - расстояние
;;     acqureAngle    16384  -  в вызывающую функцию (и в callback)
;;                              возвращается REAL - угол (в радианах)
;;
;;  5) <cursor_type>
;;     Вид курсора (целое число) - одно из следующих значений:
;;     NoSpecialCursor      -1      No special cursor specified
;;     Crosshair             0      Full screen cross hair
;;     RectCursor            1      Rectangular cursor
;;     RubberBand            2      Rubber band line
;;     NotRotated            3      (AutoCAD internal use only)
;;     TargetBox             4      Target Box type
;;     RotatedCrosshair      5      (AutoCAD internal use only)
;;     CrossHairNoRotate     6      Crosshairs forced non-rotated
;;     Invisible             7      Invisible cursor
;;     EntitySelect          8      Entity selection target cursor
;;     Parallelogram         9      Parallelogram cursor
;;     EntitySelectNoPersp  10      Pickbox, suppressed in persp
;;     PkfirstOrGrips       11      Auto-select cursor
;;
;;  6) <base_point>
;;     Базовая точка или nil - если берется текущее положение курсора.
;;
;; Функция может вернуть одно из следующих значений:
;;     1) (list X Y Z) - точка,      если задан флаг acqurePoint
;;     2) REAL         - расстояние, если задан флаг acqureDist
;;     3) REAL         - угол,       если задан флаг acqureAngle
;;     4) nil          - при аварийном звершении
;;
;;
;;
;; Особенности использования:
;; 1) callback-функция не должна использовать интерактивный ввод во
;;    всех случаях, кроме случая получения в качестве параметра
;;    ключевого слова.
;; 2) Если применятся динамическое отслеживание примитивов,
;;    содержащих в чертеже, то в callback-функции эти примитивы
;;    обязательно должны обновляться с использованием или (entupd),
;;    или (vla-Update)
;;--------------------------------------------------------------------

Re: ObjectARX. Отслеживание и рисование

Еще один способ для восстановления формы курсора - вставить код основной функции в группу Undo, т.е.:

...
(command "_.undo" "_begin")
;; Вызов (dyndraw)
...
(command "_.undo" "_end")
...

Re: ObjectARX. Отслеживание и рисование

> Александр
Ривилис
Хотелось бы попробовать Вашу функцию DYNDRAW.ARX в Автокаде 2002.
Не могли бы Вы выложить файл DYNDRAW.ARX для этой версии?

Re: ObjectARX. Отслеживание и рисование

> SSH
Я изначально создавал ее под AutoCAD 2004-2006. По Вашей просьбе я переделал ее под 2002, но отладкой не занимался - там возможны нюансы. Пробуйте:
http://www.maestrogroup.com.ua/support/dyndraw2002.zip

Re: ObjectARX. Отслеживание и рисование

> Александр Ривилис
Спасибо. Попробую и сообщу, что получится.

Re: ObjectARX. Отслеживание и рисование

Добавил версию под AutoCAD 2007, немного доработал и исправил обнаруженные Евгением Елпановым ошибки и неточности. Теперь в одном архиве версии под AutoCAD 2002, 2004-2006, 2007: http://www.maestrogroup.com.ua/support/dyndraw.zip

Re: ObjectARX. Отслеживание и рисование

Функция КЛАСС!
Огромное количество идей по применению, но с реализацией туго...
Не сочтите за труд, для просвящения не совсем сообразительных набросайте примерчик для многократного копирования набора без "резиновой" линии. Насколько я понял - с DynDraw это реально.
С уважением.

Re: ObjectARX. Отслеживание и рисование

> Kosarev
А зачем это нужно? Чем не подходит стандартная команда _COPY? Только из-за "резиновой" линии? Если набор большой (в нем достаточно много примитивов), то его обновление на экране будет занимать много времени и программа будет сильно тормозить. Кроме того без "резиновой" линии будет неудобно пользоваться привязками. Так что смсыла тратить время на создание такого примера не вижу.