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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как визуализировать создаваемый объект?

Как визуализировать создаваемый объект?

Ответ
Поиск в этой теме
Непрочитано 28.02.2007, 17:37 #1
Как визуализировать создаваемый объект?
Glorius
 
инженер-конструктор
 
Беларусь
Регистрация: 20.12.2006
Сообщений: 498

Такой вопрос.
Как можно визуализировать создаваемы объект?
Допустим создаю выноску. Задал текст выноски, указал первую точку. Как сделать так чтобы выноска с указанным текстом отображалась на экране при перемещении в момент выбора второй точки? Или же например в результате работы некоторой программы был создан некоторый объект, как сделать чтобы он отображался на экране при выборе точки вставки этого объекта?
Попутный вопрос, как определить длину текста в линейных размерностях при создании выноски? для определения необходимой длины полки под выносной надписью.
Спасибо.
__________________
Инженер-конструктор.
Просмотров: 9952
 
Непрочитано 28.02.2007, 19:00 Re: Как визуализировать создаваемый объект?
#2
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,830
<phrase 1=


Цитата:
Сообщение от Glorius
Такой вопрос.
Как можно визуализировать создаваемы объект?
Допустим создаю выноску. Задал текст выноски, указал первую точку. Как сделать так чтобы выноска с указанным текстом отображалась на экране при перемещении в момент выбора второй точки? Или же например в результате работы некоторой программы был создан некоторый объект, как сделать чтобы он отображался на экране при выборе точки вставки этого объекта?
Попутный вопрос, как определить длину текста в линейных размерностях при создании выноски? для определения необходимой длины полки под выносной надписью.
Спасибо.
Задал текст??? до момента указания точки вставки текста??? это как???
А насчет отображения объекта созданного сторонней программой, то это как позволяет программа, у меня например отображает.
А насчет определить длину текста, то насколько я знаю при построении выноски КАД сам рисует полку под текстом, али не рисует в зависимости от настроек выноски.
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 28.02.2007, 19:05
#3
Zouss


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


два варианта как всегда
1. функции семейства gr... (grclear, grdrav, grread, grtext, grvecs) вам помогут. Но в тексте программы вам понадобятся две очень похожие функции - одна отрисовывает объект во время динамического ввода, вторая собственно создает этот объект в чертеже
здесь есть пример реализации http://dwg.ru/forum/viewtopic.php?t=...er=asc&start=0 наверное еще где-то найдете
2. сделать наоборот - сначала нарисовать объект а потом натравить на него команду move например
Zouss вне форума  
 
Непрочитано 01.03.2007, 08:16
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,856


Лучше не _.move, а _.change ИМХО - там можно за компанию еще и угол поворота установить
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.03.2007, 11:00
#5
Glorius

инженер-конструктор
 
Регистрация: 20.12.2006
Беларусь
Сообщений: 498


Цитата:
Сообщение от Zouss
2. сделать наоборот - сначала нарисовать объект а потом натравить на него команду move например
так ведь тогда будет виден исходный объект, а этого не хотелось бы
__________________
Инженер-конструктор.
Glorius вне форума  
 
Непрочитано 01.03.2007, 11:12
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,856


При _change 100% виден
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.03.2007, 14:02
#7
Zouss


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


Цитата:
Сообщение от Glorius
Или же например в результате работы некоторой программы был создан некоторый объект, как сделать чтобы он отображался на экране при выборе точки вставки этого объекта?
и
Цитата:
Сообщение от Glorius
так ведь тогда будет виден исходный объект, а этого не хотелось бы
меня улыбнуло.
кидайте текст программы вместе доведем ее до ума или хотя бы попытаемся
Zouss вне форума  
 
Автор темы   Непрочитано 01.03.2007, 14:57
#8
Glorius

инженер-конструктор
 
Регистрация: 20.12.2006
Беларусь
Сообщений: 498


Вообще говоря хочу сделать программу рисования выноски (для конкретики).

(defun c:my ()
(setq text1 (getstring "\nУкажите текст над полкой: "))
(setq text2 (getstring "\nУкажите текст под полкой: "))
(command "_insert" "my_block" pause "" "" "" text2 text1)
)

"my_block" - это блок с атрибутами (верхний и нижний текст).
Задача: после активации команды "my" - вводим текст над полкой, текст под полкой, указываем точку выноски, далее хотелось бы чтобы рисовался прототип полки с надписями и "висел" на курсоре, ожидая когда пользователь укажет место размещения выноски, при этом хотелось бы чтобы от первой указанной точки до полки шла резиновая линия, меняющаяся в зависимости от текущего положения курсора. Попутная проблема - определение длины наибольшего текста в линейных размерностях для отображения полки соответствующей длины.
__________________
Инженер-конструктор.
Glorius вне форума  
 
Непрочитано 01.03.2007, 15:07
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,856


C наскоку если: использовать в цикле (grread) с проверкой на указание точки. Совместно с (grvecs) и, возможно, (gertext).
С (grtext) не работал, так что там я мимо кассы
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.03.2007, 15:20
#10
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от Glorius
Вообще говоря хочу сделать программу рисования выноски (для конкретики).

(defun c:my ()
(setq text1 (getstring "\nУкажите текст над полкой: "))
(setq text2 (getstring "\nУкажите текст под полкой: "))
(command "_insert" "my_block" pause "" "" "" text2 text1)
)

"my_block" - это блок с атрибутами (верхний и нижний текст).
Задача: после активации команды "my" - вводим текст над полкой, текст под полкой, указываем точку выноски, далее хотелось бы чтобы рисовался прототип полки с надписями и "висел" на курсоре, ожидая когда пользователь укажет место размещения выноски, при этом хотелось бы чтобы от первой указанной точки до полки шла резиновая линия, меняющаяся в зависимости от текущего положения курсора. Попутная проблема - определение длины наибольшего текста в линейных размерностях для отображения полки соответствующей длины.
Думаешь такой хитрый, что никто до этого не додумался? Кулик Алексей aka kpblc уже несколько вариантов делал выноски с двойным текстом. Также все расписано в книге "САПР на базе AutoCAD...."

В твоей идее есть порочный момент - использовать блок для двойной надписи. На нем и сломаешься. Как сделать, чтобы блок визуально висел на курсоре расписано в упомянутой книге - это не так просто, с учетом множества глюков разных версий Автокада.

Лучше делать просто - тексты и отрезки. Но и тут немало нюансов - определение ориентации текстов в зависимости от конечной точки выноски, длины текстов. Надо учесть еще и возможность работы не в МСК, в том числе и в 3D.

Программа должна не просто быть написана, но еще и работать, и работать надежно.

Вот функция из ruCAD, которая и делает двойные выноски. Для демонстрации алгоритма.

Код:
[Выделить все]
(defun ru-draw-leader-and-two-string (txt1     txt2   start_pnt  /
                                      align    end_pnt  len_txt txt_h
                                        result   
                                             y
                                     )

;;; выноска с двойным текстом
;;; (ru-draw-leader-and-two-string  "Текст1" "Текст2" nil) 
;;; (ru-draw-leader-and-two-string  "Текст1" "Текст2" (list 0.0 0.0))
  (setq y 0.6
        txt_h (* (ru-normal-text-height) 0.8))
  (if (not start_pnt)
    (setq start_pnt (ru-get-point-or-exit "Начало выноски" nil))
  )
  (if start_pnt
     (progn
       (setq end_pnt  (ru-get-point-reguired "Конец выноски" start_pnt)
             align   (ru-text-end-leader-align (angle start_pnt end_pnt))
             len_txt (ru-string-length txt1 txt_h)
       ) ;_ end of setq
       (ru-line-add-multi
         (list  start_pnt 
                end_pnt 
               (if (zerop align)
                 (polar end_pnt 0 len_txt)
                 (polar end_pnt (ru-geom-go-back 0) len_txt)
               ) ;_ end of if
         ) ;_ end of list
         nil
         0
         nil
       ) ;_ end of ru-line-add-multi
       (ru-text-add
         txt1
         (polar end_pnt
                (ru-geom-go-left 0)
                (* y txt_h)
         ) ;_ end of polar
      txt_h
         0
         align
       ) ;_ end of ru-text-draw
       (ru-text-add
         txt2
         (polar end_pnt
                (ru-geom-go-right 0)
                (+ (* y txt_h)
                   txt_h
                ) ;_ end of +
         ) ;_ end of polar
         txt_h
         0
         align
       ) ;_ end of ru-text-draw
     (setq result t)
     ) ;_ end of progn
  ) ;_ end of if
  result
) ;_ end of defun
Это один из вариантов. Используются библиотечные функции ru-xxx

Вот один из "секретов" правильного поределения длины текста

Код:
[Выделить все]
(defun ru-string-length (s txt_height / lsttxt)
;;; длина строки s в единицах рисунка
  (if (and s (/= s ""))
    (progn
      (setq lsttxt
             (textbox
               (list (cons 1 s) (cons 40 txt_height) (cons 50 0))
             ) ;_ end of textbox
      ) ;_ end of setq
      (- (caadr lsttxt) (caar lsttxt))
    ) ;_ end of progn
    0.0
  ) ;_ end of if
) ;_ end of defun
Другие см. в книге
ShaggyDoc вне форума  
 
Непрочитано 13.03.2007, 19:55
#11
Zouss


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


Респекты: VVA, kpblc, Лентяй спасибо за советы по поводу entmake/entmode
Эпиграф: каждый LISP-любитель должен за свою жизнь состряпать прогу для построения выносок
Собственно прежде всего преследовалась цель изготовить обыкновенную с точки зрения acada выноску, но с двухэтажным текстом... ну и пример "визуализации" по принципу сначала изготавливаем объект, потом натравливаем на него команду MOVE
Эпилограф: комментарии приветствуются
[ATTACH]1173857386.zip[/ATTACH]
Zouss вне форума  
 
Непрочитано 14.03.2007, 08:51
#12
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,856


Ну ты сам напросился
1. Не учитываются варианты локализованных версий.
2. В функции
Код:
[Выделить все]
(defun getusrtext (/ z)
  (cons (getstring "\nУкажите текст над полкой: ")
        (getstring "\nУкажите текст под полкой: ")
        ) ;_ end of cons
  ) ;_ end of defun
лично мне никто и ничто не помешает в ответ на первый запрос жамкнуть правую кнопку мыши, а на второй - esc. Или наоборот. Кстати, что там делает локальная переменная z?
То же самое относится к
Код:
[Выделить все]
(defun getusrpt (/ z)
  (getpoint "Точка начала выноски: ")
  ) ;_ end of defun
3. При указании второй точки левее первой результат неверен. Также результат неправилен при указании второй точки ниже первой. (и это я говорю только про мировую систему координат).
---
Тестил на ADT 2006 Rus + SP1.
---
Ну это уже так, побрюзжать немного
- Когда я вижу слово "Укажите", меня тянет именно "Указать" на примитив. Замени на "Введите".
- То, что текст создается сначала в точке начала выноски, может ввергнуть пользователей в панику (акад сломался!)
- Я б нарисовал какой-никакой а диалог для более "нормального" вида. Эта задача из разряда тех, в которых красота вида важнее чего бы то ни было.
Вот так вот... Надеюсь, охоту не отбил дальше программировать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.03.2007, 10:25
#13
Zouss


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


1. не вопрос... хотя очень хочется расставить метки отката без вызова функции command
2. по правой кнопке в данном варианте будут пустые строки только и всего, по esc программа завершится как и любая другая команда только и всего. getusrtext , getusrpt оформить можно как угодно, вплоть до повтора последних введенных значений... косметика в общем позже будет
3. странно вчера работало : ))) сейчас попробовал в функции crle строчку (cons 73 0) заменить на (cons 73 1) вроде оно. кстати в предыдущем посте файлик я переаттачил

на брюзжание такой ответ:
вообще сакральный смысл именно этой реализации заключен всего в двух строчках кода - все остальное обряды и пассы руками
Zouss вне форума  
 
Непрочитано 14.03.2007, 10:42
#14
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,856


Вот только не надо, не надо! Попробуй выполнить (setq tmp (getusrtext)) и в ответ на первый запрос сделай правый пинок, а на второй - Esc. И погляди, чему у тебя будет равен tmp. А еще лучше - сразу после этого сделай попытку сформировать строку многострочника. Веселье практически гарантирую!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.03.2007, 11:02
#15
Zouss


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


так прежде чем я уже - у меня по esc ПРОГРАММА прерывается/завершается, по правой кнопке бъет пустые строки, но в два этажа, так что я не догоняю чего тут криминального
Zouss вне форума  
 
Непрочитано 14.03.2007, 12:08
#16
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,856


Упс, сорри. Как-то привык, что у меня каждая функция возвращает ожидаемое значение. Извини еще раз.
Идея с использованием дробей понравилась, спасибо Хотя я пока пробую сделать по-другому
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.04.2007, 13:55
#17
Zouss


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


типа новый релиз:
добавлена визуализация с помощью (grdraw, ввод текстовых строк пока на прежнем примитивном уровне. кому интересно погоняйте пжалста на предмет насекомых
[ATTACH]1175680330.zip[/ATTACH]
кстати у проги есть некоторый принципиальный недостаток - так как выноска получается обыкновенная, то и редактировать ее можно через mtexteditor, но этот самый едитор после unstack/stack высоту символов делает 0,7 от установленной высоты текста
Zouss вне форума  
 
Непрочитано 05.04.2007, 08:38
#18
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,856


Цитата:
кстати у проги есть некоторый принципиальный недостаток - так как выноска получается обыкновенная, то и редактировать ее можно через mtexteditor, но этот самый едитор после unstack/stack высоту символов делает 0,7 от установленной высоты текста
мораль - прописывай либо командные (имхо более качественно получится), либо объектные (но там проблемы будут с изменением объектов) реакторы на команду редактирования многострочника.
P.S. Интересно, а что будет, если будет использоваться внешний редактор?
P.P.S. У меня из-за подобных выносок голова болит уже месяца два, не меньше - слишком многое надо учитывать по ходу дела.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.04.2007, 10:38
#19
Zouss


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


с внешним редактором как раз проблем поменьше будет - можно заделать свой staker или просто вбить
"\\A0\\SТекстНадПолкой/ТекстПодПолкой;" правда сам пока не пробовал
реактор прописывать не хоцца, потому как есть подозрение, что можно обойтись без них
как понравилась визуализация?
Zouss вне форума  
 
Непрочитано 05.04.2007, 10:56
#20
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,856


еще не успел посмотреть.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как визуализировать создаваемый объект?

Размещение рекламы