Тема: Можно ли вывести в центре перекрестья значек и текст?
Можно ли вывести в центре перекрестья какой-либо значек и текст, аналогичный значку выводящемуся при использовани привязки? И если можно, то как определить вид и цвет значка итекста?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → LISP → Можно ли вывести в центре перекрестья значек и текст?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Можно ли вывести в центре перекрестья какой-либо значек и текст, аналогичный значку выводящемуся при использовани привязки? И если можно, то как определить вид и цвет значка итекста?
Где же Вы, монстры VLISPa?
Ответьте пожалуйста.
Все монстры VLISPa осмысливают Вашу задачу! (Я не монстр, я только учусь.)
Вы хотите на перекрестие бантик повесить?
В Лиспе такого нет в чистом виде. Попробуй сочинить что нибудь на основе grread и grdraw. Только оно глючнО получится скорей всего.
> VK
а каким образом это можно реализовать?
может посоветуешь где посмтреть?
> Alan
да :) можно и бантик, и чтобы цвета любого, и чтобы текст любой рядышком.
Про grread и grdraw - посмотреть в хелпе.
Как сделать...
grread отслеживаешь перемещение мыша, потом регенеришь экран и grdraw-ом рисуешь бантик хоть на курсоре, хоть рядом. Все это дело в цикле замутить. Координаты еще пересчитывать придется... Замучисся...
С текстом скорей всего вряд ли получится так просто. Создавать для него (практически, экранного шрифта) свои последовательности grdraw - это еще более неблагодарное занятие. Как раз для мазохистов. Можно попробовать как то вытащить из векторного шрифта shx.
А если по хорошему делать - то скорей всего надо WinAPI копать, оформлять это дело в ARX и уже к нему обращаться из Лиспа. Как это сделать не скажу, потому как с ARX дел не имел. Можно попробовать из VBA вызывать функции WinAPI.
> 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)
> Maxim T
Ну букву Хе рисовать не сложно... А текст... как?
Ух!!! :)
скоко понаписали!!!
сейчас проверять буду
> VK
Увы, текст тоже - только программно.
Вопрос к автору: "На фига всё это?"
Можно наверное в принципе написать ТЕКСТ (например моего вопроса), а затем таскать его (MOVE) в включённым DRAGMODE. Но, "На фига....?" Скажи sf!
> Alan
В таком варианте текст будет масштабироваться вместе с зуммированием чертежа. А нужно чтобы величина была постоянной.
...просто знаю задачу SF...
:)
В который раз приходится догадываться, что хочет автор темы!
Пожалуй, все получается со вставкой блока...
внутри программы отрисовывается окружность с текстом и из них создается блок, далее в ожидании указания точки на курсоре весит блок, который динамически маштабируется в зависимости от зума...
программа возвращает 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 точку указанную на экране...
> Alan
свой курсор он хочет... программно управляемый... (имхо)
:)))
> VK
Это в виде огнедышащего дракончика?
Это в виде огнедышащего дракончика?
Какая разница! Заготовил блоков и меняй сколько хочешь...
> Maxim T
> Евгений
Спасибо за Ваши ответы, это практически то, что мне нужно.
В который раз приходится догадываться, что хочет автор темы!
Приношу свои извинения за недостаточно ясную для Вас постановку вопроса.
> sf
В самом первом постинге вы написали:
И если можно, то как определить вид и цвет значка итекста?
Так вот, ЦВЕТ будет всегда чёрным (или белым, если у вас чёрный экран, или зелёным, если экран - красный:)). Это оттого, что в функции (grdraw) номер "чернил", равный -1, обеспечивает XOR-рисование, а XOR - это, очевидно, единственно правильный вариант. Хотите - рисуйте в цвете (другими "чернилами"), но тогда "старые" линии удаляться не будут, засоряя экран. ObjectARX тоже не поможет. Там есть функции acedGrDraw и acedGrRead, так вот они абсолютно идентичны лисповским функциям, и по возможностям, и по значениям параметров.
> Maxim T
grread и grdraw, а также их аналоги acedGrDraw и acedGrRead - это отстойные функции времен R10DOS. В ObjectARX они вообще оставлены для совместимости. Сейчас есть классы AcEdJig
и AcEdInputPointMonitor которые решают любые проблемы с динамическим отображением.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → LISP → Можно ли вывести в центре перекрестья значек и текст?
Форум работает на PunBB, при поддержке Informer Technologies, Inc