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

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

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

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

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

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,917
<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
С.-Петербург
Сообщений: 40,411


Лучше не _.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
С.-Петербург
Сообщений: 40,411


При _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
С.-Петербург
Сообщений: 40,411


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,372


Цитата:
Сообщение от 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
С.-Петербург
Сообщений: 40,411


Ну ты сам напросился
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
С.-Петербург
Сообщений: 40,411


Вот только не надо, не надо! Попробуй выполнить (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
С.-Петербург
Сообщений: 40,411


Упс, сорри. Как-то привык, что у меня каждая функция возвращает ожидаемое значение. Извини еще раз.
Идея с использованием дробей понравилась, спасибо Хотя я пока пробую сделать по-другому
__________________
Моя библиотека 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
С.-Петербург
Сообщений: 40,411


Цитата:
кстати у проги есть некоторый принципиальный недостаток - так как выноска получается обыкновенная, то и редактировать ее можно через 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
С.-Петербург
Сообщений: 40,411


еще не успел посмотреть.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.04.2007, 14:07
#21
Кулик Алексей aka kpblc
Moderator

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


Так, по поводу кода.
1. В обработчике ошибок используется (command). Это может породить приличное количество проблем (на autocad.ru как-то обсуждалось, результатов не помню - можно попробовать посмотреть поиском по "глюк в error" - вроде так).
2. Обработчик ошибок сделан глобальным. Не гуд в принципе.
3. Зачем выносить получение строк в отдельную функцию, я не очень понял.
4. Все равно, на запрос текста над (да и "под" тоже)полкой я нажал Esc и получил ошибку Ввести текст с пробелами невозможно.
5. На запросе точки нажал правую кнопку - ошибка.
6. Перемещение текста выноски либо полки при dimscale, dimldrblk, dimexe, dimgap, dimasz "не штатных значений" уводит полку черт-те куда. И длину этой полке тоже назначает бог знает какой. Вообще надо проверять для всех значений всех системных переменных dim*.
7. Не работает не в мировой системе координат. И не отслеживается вариант "немировой" системы координат.
И все это только ради удовольствия видеть прямоугольник вокруг текста...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.04.2007, 15:18
#22
Zouss


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


именно ради удовольствия... правда я не совсем безнадежен, иначе написал бы прям текст
получение строк, точек в отдельной функции мне удобнее редактировать так, к примеру на первое время добавлю (initget какой нибудь
за 6 и 7 спасибо - буду думать, кстати конкретно про DIMGAP вот здесь
Код:
[Выделить все]
		'(-3
		  ("ACAD"
		   (1000 . "DSTYLE")
		   (1002 . "{")
		   (1070 . 77) ;DIMTAD
		   (1070 . 0)
		   (1070 . 147) ;DIMGAP
		   (1070 . 0)
		   (1002 . "}")
		  )
		 )
я его принудительно зануляю и все равно глючит?
чем может испортить жизнь глобальный обработчик ошибок? я его воткнул только с целью чистки хвостов по Esc и ^C^C, а корректность ввода пользователем планирую контролировать как раз в вынесенных функциях
Zouss вне форума  
 
Непрочитано 05.04.2007, 15:44
#23
Кулик Алексей aka kpblc
Moderator

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


Насчет получения текстов и точек, да и вообще чего бы то ни было можно попробовать использовать
Код:
[Выделить все]
(defun _kpblc-get (func func-lst msg-lst init-lst / msg_str res)
                  ;|
*    Еще одна базовая функция ввода. Служит для замены getpoint, getint,
* getsring и прочих getxxx-функций. Для getpoint возвращает точку в WCS
*    Параметры вызова:
*	func		выполняемая функцияс апострофом
*	func-lst	список доп.параметров для функции:
		func = 'getpoint -> начальная точка
		func = 'getstring -> t
*	msg-lst		список для формирования сообщения
      '(("msg" . <Сообщение>)			; nil недопустим
	("def" . <ЗначениеПоУмолчанию>))	; nil -> "<Отмена>"
*	init-lst	список для (initget)
      '(("bit" . <ЗначенияБитов>)		; nil -> не использовать
	("string" . <СтрокаInitget>)		; Она же используется для (getkword)
	)		; nil -> Не использовать
*    Возвращает результат get-function, ключевое слово либо nil. Не позволяет
* выйти по Esc.
*    Примеры вызова:
(_kpblc-get
=============================================================================|;
  (_kpblc-error-catch
    (function
      (lambda ()
        (setq msg_str
               (strcat
                 "\n"
                 (vl-string-trim " \n" (cdr (assoc "msg" msg-lst)))
                 (if (cdr (assoc "string" init-lst))
                   (strcat
                     " ["
                     (_kpblc-string-replace (cdr (assoc "string" init-lst)) " " "/")
                     "] "
                     ) ;_ end of strcat
                   " "
                   ) ;_ end of if
                 (strcat
                   "<"
                   (cond ((cdr (assoc "def" msg-lst))
                          (vl-string-trim "<> " (cdr (assoc "def" msg-lst)))
                          )
                         (t "Отмена")
                         ) ;_ end of cond
                   "> : "
                   ) ;_ end of strcat
                 ) ;_ end of strcat
              ) ;_ end of setq
        (cond
          ((and (cdr (assoc "bit" init-lst)) (cdr (assoc "string" init-lst)))
           (initget (cdr (assoc "bit" init-lst))
                    (cdr (assoc "string" init-lst))
                    ) ;_ end of initget
           )
          ((cdr (assoc "bit" init-lst))
           (initget (cdr (assoc "bit" init-lst)))
           )
          ((cdr (assoc "string" init-lst))
           (initget (cdr (assoc "string" init-lst)))
           )
          ) ;_ end of cond
        (setq res
               (if func-lst
                 (eval (list func func-lst msg_str))
                 (eval (list func msg_str))
                 ) ;_ end of if
              ) ;_ end of setq
        (if (= func 'getpoint)
          (setq res (trans res 1 0))
          ) ;_ end of if
        ) ;_ end of lambda
      ) ;_ end of function
    nil
    ) ;_ end of _kpblc-error-catch
  res
  ) ;_ end of defun
Дополнительные фукции:
Код:
[Выделить все]
(defun _kpblc-error-catch (protected-function
			   on-error-function
			   /
			   catch_error_result
			   )
			  ;|
*** Функция взята из книжной версии ruCAD'a без каких бы то ни было переделок,
*** кроме переименования.
*    Оболочка отлова ошибок.
*    Параметры вызова:
*	protected-function	- "защищаемая" функция
*	on-error-function	- функция, выполняемая в случае ошибки
=============================================================================|;
  (setq catch_error_result (vl-catch-all-apply protected-function))
  (if (and (vl-catch-all-error-p catch_error_result)
	   on-error-function
	   ) ;_ end of and
    (apply on-error-function
	   (list (vl-catch-all-error-message catch_error_result))
	   ) ;_ end of apply
    catch_error_result
    ) ;_ end of if
  ) ;_ end of defun

(defun _kpblc-string-replace (string old_substr new_substr / pos)
                             ;|
*    Функция замены вхождений подстроки в исходную строку на новые. Тоже ruCAD'овское ;)
* Регистрозависимо
*    Параметры вызова:
*	string		исходная строка
*	ols_substr	старая подстрока
*	new_substr	новая подстрока
*    Примеры вызова:
(_kpblc-string-replace "Здесь были ВаВася и ВаВаВаня. Вася" "Ва" "Бу")
	; "Здесь были Буся и Буня. Буся"
=============================================================================|;
  (if (/= old_substr new_substr)
    (while (setq pos (vl-string-search old_substr string))
      (setq string
             (strcat
               (substr string 1 pos)
               new_substr
               (_kpblc-string-replace
                 (substr string (+ (strlen old_substr) pos 1))
                 old_substr
                 new_substr
                 ) ;_ end of _kpblc-string-replace
               ) ;_ end of strcat
            ) ;_ end of setq
      ) ;_ end of while
    ) ;_ end of if
  string
  ) ;_ end of defun
И в таком случае у тебя получится нечто наподобие (пишу только для WCS):
Код:
[Выделить все]
(defun c:lead3 (/ adoc *error* str_up str_low pt_start pt_end gr text_box)
  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if
    (and (setq
           str_up (_kpblc-get 'getstring 't '(("msg" . "Текст над полкой")) nil)
           ) ;_ end of setq
         (/= str_up "")
         (setq str_low (_kpblc-get
                         'getstring
                         't
                         '(("msg" . "Текст под полкой") ("def" . "Пусто"))
                         nil
                         ) ;_ end of _kpblc-get
               ) ;_ end of setq
         (/= str_low "")
         (setq pt_start (_kpblc-get
                          'getpoint
                          nil
                          '(("msg" . "Начальная точка выноски"))
                          nil
                          ) ;_ end of _kpblc-get
               ) ;_ end of setq
         ) ;_ end of and
     (progn
      ;; Тут дальнейшая обработка
      )
     ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
А насчет глобального обработчика... У пользователя (даже и невидимо для него) может быть этот обработчик переопределен со штатного на какой-то-там. Внеси *error* в локальные функции - это будет легче, чем потом объяснять, откуда что берется и куда все девается.
===
Добавлено: (себе под нос) надеюсь, я никого не напугал, а то в http://dwg.ru/forum/viewtopic.php?t=12463 меня шуганули
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.08.2015, 04:44
#24
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


________________________________________________________________________________________________________________
...8 лет спустя


В ходе обсуждения темы Поиск блоков пересекающих полилинию (автор - tujn08) был затронут вопрос о программной отрисовке мультивыноски, а также варианты интерактивной визуализации этого процесса против программной расстановки мультивыносок (что друг друга на мой взгляд взаимоисключает). Я полагаю, что этот, на мой взгляд, интересный разговор попадает аккурат в рамки данного топика, поэтому предлагаю продолжить его здесь.

Итак, zamtmn показал (только зачем-то на каком-то стороннем сайте прикрепил) видео, точнее "гифку" (увидим ли мы ее через месяц?)


в которой он при помощи своей программы весьма ловко и изящно расставил мультивыноски с нужным, заранее программно сформированным содержанием, вдоль полилинии и к блокам, почти пересекающим полилинию. По крайней мере, для меня это выглядело именно так, может, там отрезки и не блоки, но не суть.
Далее приведу выдержки ответов участников этого разговора.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
прикольно) Только лишняя операция - выравнивание выносок. В NetApi/Arx есть JIG классы - выноску можно сформировать и ставить на место визуально сразу. Не знаю, как в лиспе с этим дела обстоят.
Цитата:
Сообщение от tujn08 Посмотреть сообщение
Примерно так планирую, только выноски автоматически расставлять. Плюс еще схемы внешних проводок(расключение) и все остальное автоматически отрисовывать.
Цитата:
Сообщение от skkkk Посмотреть сообщение
Цитата:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
прикольно) Только лишняя операция - выравнивание выносок. В NetApi/Arx есть JIG классы - выноску можно сформировать и ставить на место визуально сразу. Не знаю, как в лиспе с этим дела обстоят.
Если я правильно понял о чем речь, то в лиспе я в свое время (лет 5 назад), начав программно создавать выноски, воевал с тем, чтобы созданная мультивыноска (строки и точка стрелки задавались программно) адекватно отображалась при запросе точки вставки полки. Визуализировалась, иначе говоря. При стандартном подходе он выдавал мне только резиновую нить, и я решил формировать блок, состоящий из текста в том же шрифте, чтобы видеть размеры самой выноски, и вставлял этот блок визуализируя его под курсором, резиновую нить при этом воспроизвести так и не удалось. Хотел даже как-нибудь программно "схватиться" за ручку только что отрисованной мультивыноски. Оно и понятно было сразу, что тут получится только через отрисовку временных примитивов (grvecs) по координатам из взорванных до линий текстов. На такое я не пошел, и оставил без резиновой нити. Привыкли, конечно, однако ее часто не хватает на загруженных чертежах. Это одна из немногих (кажется, трех) задач, которую не удалось решить на лиспе (без костылей и шаманских танцев, с ними думаю, можно) в моей хоть и не слишком долгой практике.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
ну по сути JIG класс - это временная графика + методы отслеживания действий пользователя, инкапсулированное в одном несложном классе - производном от общего класса JIG. Т.е. в саму БД чертежа объект из JIG заноситься один раз, после всех необходимых манипуляций с ним со стороны пользователя.
Цитата:
Цитата:
Сообщение от tujn08 Посмотреть сообщение
Примерно так планирую, только выноски автоматически расставлять. Плюс еще схемы внешних проводок(расключение) и все остальное автоматически отрисовывать.
Сколько ни пытался, не смог придумать алгоритм, по которому можно заставить машину автоматически расставлять выноски так, как мне надо. Предпочитаю полку ставить самостоятельно. Интересно было бы посмотреть на видео, как это будет...
Цитата:
Сообщение от tujn08 Посмотреть сообщение
Уточню, что выноска будет блок, а не типовая выноска как возможно Вы поняли.
Цитата:
Сообщение от skkkk Посмотреть сообщение
Думаю, это дела не меняет, - блок или мультилидер - как программно, без запросов точек у пользователя, поставить все выноски (допустим, штук 25) на чертеж? Они ведь должны находится по возможности на "самых пустых" местах чертежа, при этом, не пересекаясь друг с другом, не перекрывая друг друга и другие объекты, а если это невозможно, то перекрывать так, чтоб не нарушить читаемости чертежа. Выносок бывает очень много на чертеже, и я даже не решился начать продумывать алгоритм, который мало того, чтобы их наполнил, так еще и расставил. Вместо этого у нас идет автоматическая трассировка по оси трубопровода, стрелки выносок поочередно дают указания на характерные точки трассы, а пользователь вручную ставит на место выноски, иногда после этого еще слегка подправляя их положение вручную. При этом на насыщенных чертежах без определенных навыков будет очень нелегко. А если еще и программа их беспорядочно расставит.....вообще капец. Хотя в каждом деле своя специфика... если выноска будет всегда одного размера и стоять должна по определенным правилам, например, справа сверху от стрелки, то ничего сложного тут нет.
Цитата:
Сообщение от tujn08 Посмотреть сообщение
Примерно так и будет. Взять габарит чертежа (прямоугольник или квадрат) - расставлять выноски за пределами этого габарита на определенно отступе (вспомним конструкторские чертежи). Ширина выносок статичная, а высота динамическая (от количества маркировок). У меня есть список линий (причем координаты на линиях) между блоками/приборами/зданиями - на эти линии и расставлять выноски. Маркировка формируется из названия блока (у нас) или можно правила придумать

Наложение на чертеж уже избежали получается. Пересечение линий выносок и в какую сторону выноску выкинуть- проверка координат относительно центра габарита (с возможным учетом заполненности каждой из 4х сторон) и только.

Учитывая вышеизложенное мной (т.е. информация выноски будет на пустом месте стоять). Для себя я понимаю ("самых пустых") , Надо с учетом масштаба запрограммировать правило: между приборами выноска обязательна- она стоит по середине участка или со смещением если есть повороты трассы (в зависимости от длины участка их дублировать несколько раз). Сложность не в алгоритме, а в его программировании на мой взгляд.
Цитата:
Сообщение от zamtmn Посмотреть сообщение
ИМХО. Автоматическая расстановка выносок неоправдает себя. Правильно это можно сделать только на самых простых чертежах, если чертеж насыщеный - забудь про "автоматику", ручками и вперед, благо размещать выноски если их содержимое считаетсяф автоматом можно и в полуобморочном состоянии)) Ставку нужно делать на редактируемость выноски и на повторное использование уже расставленых выносок после редактирования чертежа. Т.е. программа должна позволять не только быстро изготовить новый чертежик, но и внести изменения в старый.
Цитата:
Сообщение от zamtmn Посмотреть сообщение
"Автоматическая" расстановка выносок - абсолютно не проблема - у меня не реализована за ненадобностью. после любой "автоматической" расстоновки всеравно потребуется ручное редактирование, т.к. выноска налезет на какиенибудь другие примитивы и потребуется вмешательство - красиво делать cpu научить трудно, с этим пока только голова справится.
...........
Научите как тут можно автоматом расставить выноски - буду рад

Цитата:
Сообщение от Дима_ Посмотреть сообщение
Цитата:
Сообщение от skkkk Посмотреть сообщение
Если я правильно понял о чем речь, то в лиспе я в свое время (лет 5 назад)...
Примерно в то-же время я делал подобное и на лиспе - больше, чтоб показать как, а вообще это конечно решается джигом. Кстати, при условии установленных Экспрессов, появляються и соотв. лисп. функции для "визуального" перемещения - по моему в той, же теме я об этом писал.
Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Как вариант готового jig'а, используемого в lisp: http://www.caduser.ru/forum/index.ph...171&MID=112412
Фууф, цитаты кончились, теперь продолжаем.

Дима_, я тогда видел Ваш код, но даже сейчас, на первой лямбде у меня глаза поменялись местами, а тогда я вообще на лямбды и грвексы смотреть боялся. Честно, сейчас уже нет сил смотреть в кишки, как это работает, как в частности grvecs'ом (и им ли???) Вы нарисовали ttf-шрифт? Я специально проверил: блок с таким текстом прекрасно "висит" на курсоре во всей красе. Хотел я сделать примерно так: Express'ом взрывать текст до линий, брать координаты их концов и "скармливать" их grvecs'у. При этом добавив обработку (что мне и казалось и кажется самым сложным), чтоб при пересечении изломом выноски определенной черты grvecs'овская выноска как бы "зеркалилась", но не текст, конечно. На тот момент мне нецелесообразно было это делать, во-первых, в виду малого опыта программирования, а во-вторых, постольку, поскольку я уже имел то, что блок с текстом, висящий на курсоре, мог дать представление о размере получающейся выноски, и можно подыскать ей уютное местечко на чертеже; в точке же, куда должна бы указывать эта выноска я программно рисовал временную красную жирную метку. Знаю, по-дилетантски, но удобней, чем все выноски копировать из других чертежей и править их вручную, посчитав линейкой пикетаж, согласитесь? Подумаешь, не хватает "резиновой нити". Хотя на очень загруженных чертежах ее часто действительно, не хватает, но даже и там, больше нужно видеть размер текстовой части, а также ее содержимое, чтобы оперативно до вставки отреагировать и если что не так, исправить параметр (например, диаметр трубы) и продолжить в штатном режиме простановку всех выносок трассы. Это реализовано у нас уже несколько лет, по возможности выложу видео этого процесса.
Функции acet-drug... или как они там, я тоже знаю давно. С тех пор. И даже пробовал сделать визуализацию выноски из них. Не понравилось, что объект который копируется или переносится, обязательно при этом "торчит" и на том месте, откуда ты его переносишь. Но хуже то, что заставить все это дело динамически зеркалиться на изломе мне не удалось. Пробовал также с их помощью написать свои функции переноса и копирования, более удобные, чтобы вставлять свое приглашение и по правой кнопке "подбирать" последний набор, но при тестировании обнаружилось, что при работе этих drug'ов не работает полярное отслеживание. Отказался.


Александр Ривилис, спасибо. Стыдно, но за десять лет я этой темы не видел. Хотя в свое время усиленно искал примеры использования grvecs. Интересно, смогу ли я сделать из нее мультивыноску? Может быть, попробую как-нибудь попробовать.
skkkk вне форума  
 
Непрочитано 07.08.2015, 16:49
#25
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от skkkk Посмотреть сообщение
Интересно, смогу ли я сделать из нее мультивыноску?
Думаю, что да. Более того никакой grvecs будет не нужен. Ты просто рисуешь выноску "на курсоре" и обновляешь её в зависимости от положения курсора. Ну а при помощи ключевых слов ты можешь переключаться между указанием вершины выноски или положением текста выноски.
Александр Ривилис вне форума  
 
Непрочитано 07.08.2015, 21:01
#26
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>По крайней мере, для меня это выглядело именно так, может, там отрезки и не блоки, но не суть.
Это блоки и полилинии, но не автокад. Выноска с гифки в автокаде будет набором линий и текстов, в программе - отдельный самомстоятельный примитив.
Картинка была не про проблему програмной расстановки мультивыносок, а про "кабельное хозяйство"))
zamtmn вне форума  
 
Непрочитано 07.08.2015, 21:21
#27
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Ты просто рисуешь выноску "на курсоре"
Offtop: Эх бы к суткам еще часиков десять прибавить...
Цитата:
Сообщение от zamtmn Посмотреть сообщение
Картинка была не про проблему програмной расстановки мультивыносок, а про "кабельное хозяйство"))
Это ясно. Однако она спровоцировала плавный переход из той темы в эту.
Offtop: Лично мне тот топик был вообще не близок, поскольку я далек от проектирования электрики, покуда не заговорили о мультивыносках. Я не ожидал, что возбудится такой нездорово живой (для той темы) интерес к ним.
skkkk вне форума  
 
Непрочитано 08.08.2015, 22:59
#28
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от skkkk Посмотреть сообщение
Честно, сейчас уже нет сил смотреть в кишки, как это работает, как в частности grvecs'ом (и им ли???) Вы нарисовали ttf-шрифт?
Там все автокад "рисует" - я ничего не рисовал - это копия объекта.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как визуализировать создаваемый объект?