Тема: 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
Обновления будут выкладываться там же.
Пожелания и конструктивная критика приветствуются.