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

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

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

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

Такой вопрос.
Как можно визуализировать создаваемы объект?
Допустим создаю выноску. Задал текст выноски, указал первую точку. Как сделать так чтобы выноска с указанным текстом отображалась на экране при перемещении в момент выбора второй точки? Или же например в результате работы некоторой программы был создан некоторый объект, как сделать чтобы он отображался на экране при выборе точки вставки этого объекта?
Попутный вопрос, как определить длину текста в линейных размерностях при создании выноски? для определения необходимой длины полки под выносной надписью.
Спасибо.
__________________
Инженер-конструктор.
Просмотров: 10172
 
Непрочитано 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 > Программное обеспечение > Программирование > Как визуализировать создаваемый объект?