Тема: Можно ли вывести в центре перекрестья значек и текст?

Можно ли вывести в центре перекрестья какой-либо значек и текст, аналогичный значку выводящемуся при использовани привязки? И если можно, то как определить вид и цвет значка итекста?

Re: Можно ли вывести в центре перекрестья значек и текст?

Где же Вы, монстры VLISPa?
Ответьте пожалуйста.

Re: Можно ли вывести в центре перекрестья значек и текст?

Все монстры VLISPa осмысливают Вашу задачу! (Я не монстр, я только учусь.)
Вы хотите на перекрестие бантик повесить?

Re: Можно ли вывести в центре перекрестья значек и текст?

В Лиспе такого нет в чистом виде. Попробуй сочинить что нибудь на основе grread и grdraw. Только оно глючнО получится скорей всего.

Re: Можно ли вывести в центре перекрестья значек и текст?

> VK
а каким образом это можно реализовать?
может посоветуешь где посмтреть?

Re: Можно ли вывести в центре перекрестья значек и текст?

> Alan
да :) можно и бантик, и чтобы цвета любого, и чтобы текст любой рядышком.

Re: Можно ли вывести в центре перекрестья значек и текст?

Про grread и grdraw - посмотреть в хелпе.
Как сделать...
grread отслеживаешь перемещение мыша, потом регенеришь экран и grdraw-ом рисуешь бантик хоть на курсоре, хоть рядом. Все это дело в цикле замутить. Координаты еще пересчитывать придется... Замучисся...
С текстом скорей всего вряд ли получится так просто. Создавать для него (практически, экранного шрифта) свои последовательности grdraw - это еще более неблагодарное занятие. Как раз для мазохистов. Можно попробовать как то вытащить из векторного шрифта shx.
А если по хорошему делать - то скорей всего надо WinAPI копать, оформлять это дело в ARX и уже к нему обращаться из Лиспа. Как это сделать не скажу, потому как с ARX дел не имел. Можно попробовать из VBA вызывать функции WinAPI.

Re: Можно ли вывести в центре перекрестья значек и текст?

> VK
Имхо, с помощью grdraw и grread всё решается, не надо API никакого.

> sf
Вот два примера на тему, первый - попроще, второй - поинтересней.
Для просмотра второго примера надо сделать размер экрана около 400х300 единиц, тогда станут видны засечки вдоль линии.

(defun c:rubber_line ( / pt1 pt_old inp)
  (setq pt1 (getpoint "\nfirst point: ")) ;-- получить начальную точку от пользователя
  (setq pt_old pt1)                       ;-- инициализировать "старую" точку
  (grdraw pt1 pt_old -1)     ;-- нарисовать старый отрезок первый раз
  (while
    (=
      (car (setq inp (grread t (+ 0 1 8)))) ;-- отслеживаем, игнорируем кнопку ESC
      5
    )
    (grdraw pt1 pt_old -1)     ;-- стереть старый отрезок!
    (grdraw pt1 (cadr inp) -1) ;-- нарисовать новый отрезок
    (setq pt_old (cadr inp))   ;-- обновить "старую" точку
  )
  (grdraw pt1 pt_old -1)     ;-- стереть старый отрезок последний раз
  (cadr inp)                 ;-- вернуть точку, в которой щёлкнул пользователь
)
(princ)

Пример поинтереснее:

(setq kr_size 10.0)                       ;-- размер крестика
(setq row '(20.0 60.0 130.0 240.0 360.0)) ;-- ряд длин для размещения засечек на линии
(defun krestik (pt ang / i) ;-- рисует крестик в заданной точке pt под углом ang
  (setq i 0)
  (repeat 4
    (grdraw pt (polar pt (+ ang (+ (/ pi 4.0) (* (/ pi 2.0) i))) (/ kr_size 2.0)) -1)
    (setq i (1+ i))
  )
)
(defun provoloka (pt1 pt2 / num ang) ;-- рисует линию и ряд крестиков-засечек вдоль неё
  (grdraw pt1 pt2 -1)            ;-- это линия...
  (foreach
    num
    row
    (progn
      (setq ang (angle pt1 pt2))
      (krestik
        (polar pt1 ang num)      ;-- ...это крестики
        ang
      )
    )
  )
)
(defun c:ruletka ( / pt1 pt_old inp pt_new)
  (setq pt1 (getpoint "\nfirst point: ")) ;-- получить начальную точку от пользователя
  (setq pt_old pt1)
  (provoloka pt1 pt_old)
  (while
    (=
      (car (setq inp (grread t (+ 0 1 8))))
      5
    )
    (setq pt_new (cadr inp))
    (provoloka pt1 pt_old)
    (provoloka pt1 pt_new)
    (setq pt_old pt_new)
  )
  (provoloka pt1 pt_old)
  (if
    (listp pt_new)
    pt_new
    (progn
      (alert "Надо было ввести точку щелчком левой кнопки мыши")
      nil
    )
  )
)
(princ)

Re: Можно ли вывести в центре перекрестья значек и текст?

> Maxim T
Ну букву Хе рисовать не сложно... А текст... как? wink

Re: Можно ли вывести в центре перекрестья значек и текст?

Ух!!! :)
скоко понаписали!!!
сейчас проверять буду

Re: Можно ли вывести в центре перекрестья значек и текст?

> VK
Увы, текст тоже - только программно.

Re: Можно ли вывести в центре перекрестья значек и текст?

Вопрос к автору: "На фига всё это?"
Можно наверное в принципе написать ТЕКСТ (например моего вопроса), а затем таскать его (MOVE) в включённым DRAGMODE. Но, "На фига....?" Скажи sf!

Re: Можно ли вывести в центре перекрестья значек и текст?

> Alan
В таком варианте текст будет масштабироваться вместе с зуммированием чертежа. А нужно чтобы величина была постоянной.
...просто знаю задачу SF...
:)

Re: Можно ли вывести в центре перекрестья значек и текст?

В который раз приходится догадываться, что хочет автор темы!

Re: Можно ли вывести в центре перекрестья значек и текст?

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

 (defun cursor-modif (/ ADD_LST ADOC BARR BLK BLKS DOC GR MDSP OBJ OBJ-C OBJ-T)
(vl-load-com)
  (setq    adoc    (vlax-get-acad-object)
    doc    (vla-get-activedocument adoc)
    mdsp    (vla-get-modelspace doc)
    obj-c    (vla-addCircle mdsp (vlax-3d-point (list 0. 0. 0.)) 5.)
    obj-t    (vla-AddText mdsp "Ваш текст" (vlax-3d-point 0. 0. 0.) 8.)
    add_lst    (list obj-c obj-t)
    barr    (vlax-make-variant
          (vlax-safearray-fill (vlax-make-safearray
                     '9
                     (cons 0 (1- (length add_lst)))
                       ) ;_  конец функции vlax-make-safearray
                       add_lst
          ) ;_  конец функции vlax-safearray-fill
        ) ;_  конец функции vlax-make-variant
    blks    (vla-get-blocks doc)
  ) ;_  конец функции setq
  (vla-add blks (vlax-3d-point (list 0. 0. 0.)) "cursor-1")
  (setq blk (vla-item blks "cursor-1"))
  (vla-copyobjects doc barr blk)
  (vla-delete obj-c)
  (vlax-release-object obj-c)
  (vla-delete obj-t)
  (vlax-release-object obj-t)
  (setq    obj (vla-insertblock mdsp
                 (vlax-3d-point 0. 0. 0.)
                 "cursor-1"
                 1.
                 1.
                 1.
                 0.
        ) ;_  конец функции vla-insertblock
  ) ;_  конец функции setq
  (while (and (setq gr (grread 5)) (= (car gr) 5))
    (vla-put-InsertionPoint obj (vlax-3d-point (cadr gr)))
    (vla-put-XScaleFactor obj (/ (getvar "VIEWSIZE") 500.))
    (vla-put-YScaleFactor obj (/ (getvar "VIEWSIZE") 500.))
  ) ;_ end of while
  (vla-delete obj)
  (vlax-release-object obj)
  (vla-PurgeAll doc)
  (cadr gr)
)
; вызывать: (cursor-modif)
; возвращает 3d точку указанную на экране... 

Re: Можно ли вывести в центре перекрестья значек и текст?

> Alan
свой курсор он хочет...  программно управляемый... (имхо)
:)))

Re: Можно ли вывести в центре перекрестья значек и текст?

> VK
Это в виде огнедышащего дракончика?

Re: Можно ли вывести в центре перекрестья значек и текст?

Alan пишет:

Это в виде огнедышащего дракончика?

Какая разница! Заготовил блоков и меняй сколько хочешь...

Re: Можно ли вывести в центре перекрестья значек и текст?

> Maxim T

> Евгений
Спасибо за Ваши ответы, это практически то, что мне нужно.

Alan пишет:

В который раз приходится догадываться, что хочет автор темы!

Приношу свои извинения за недостаточно ясную для Вас постановку вопроса.

Re: Можно ли вывести в центре перекрестья значек и текст?

> sf
В самом первом постинге вы написали:

И если можно, то как определить вид и цвет значка итекста?

Так вот, ЦВЕТ будет всегда чёрным (или белым, если у вас чёрный экран, или зелёным, если экран - красный:)). Это оттого, что в функции (grdraw) номер "чернил", равный -1, обеспечивает XOR-рисование, а XOR - это, очевидно, единственно правильный вариант. Хотите - рисуйте в цвете (другими "чернилами"), но тогда "старые" линии удаляться не будут, засоряя экран. ObjectARX тоже не поможет. Там есть функции acedGrDraw и acedGrRead, так вот они абсолютно идентичны лисповским функциям, и по возможностям, и по значениям параметров.

Re: Можно ли вывести в центре перекрестья значек и текст?

> Maxim T
grread и grdraw, а также их аналоги acedGrDraw и acedGrRead - это отстойные функции времен R10DOS. В ObjectARX они вообще оставлены для совместимости. Сейчас есть классы AcEdJig
и AcEdInputPointMonitor которые решают любые проблемы с динамическим отображением.