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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp/ActiveX Как создать лист и на нем видовой экран. Связь Модель->Лист

Lisp/ActiveX Как создать лист и на нем видовой экран. Связь Модель->Лист

Ответ
Поиск в этой теме
Непрочитано 17.06.2013, 15:11 #1
Lisp/ActiveX Как создать лист и на нем видовой экран. Связь Модель->Лист
Kirill_Ja
 
Мурманск
Регистрация: 28.07.2008
Сообщений: 208

Есть 3 точки в пространстве модели. Нужно создать лист произвольного размера и на нем видовой экран, чтобы там отразилась область,
ограниченная прямоугольником по 3-м точкам.

По задачам:
1. Создать лист. (тут вроде все просто создаем примитив, регистрируем в словаре "ACAD_LAYOUT") или AciveX-ом добавляем элемент в коллекцию
2. Создать примитив видового экрана. (тоже создаем, регистрируем в таблице "VPORT") или AciveX (тока еще не понял как точно)
3. Задать ему размеры (тут еще код 10 40 и 41 нас спасает)
4. Отобразить нужный участок модели на листе О_о (я нашел коды 45 и 63 - высота и ширина в модели, 110, 111, 112 - данные о системе координат ВЭ), но дальше я в тупике.
Не могу найти ни одной точки привязки. Как изображение на ВЭ однозначно связано с моделью? В AciveX тоже нет никакой связи с моделью, а вот все
вышеперечисленное есть, но называется по-другому.


((-1 . <Имя объекта: 7e9bfe78>)
(0 . "VIEWPORT")
(5 . "837")
(102 . "{ACAD_XDICTIONARY")
(360 . <Имя объекта: 7e9bfe80>)
(102 . "}")
(330 . <Имя объекта: 7e9bced0>)
(100 . "AcDbEntity")
(67 . 1)
(410 . "Лист1")
(8 . "0")
(100 . "AcDbViewport")
(10 128.5 97.5 0.0)
(40 . 205.6)
(41 . 156.0)
(68 . 2)
(69 . 2)
(12 977.371 971.019 0.0) O_o это вообще что за точка??? Точно что-то значит, но что не нашел
(13 0.0 0.0 0.0)
(14 10.0 10.0 0.0)
(15 10.0 10.0 0.0)
(16 0.0 0.0 1.0)
(17 0.0 0.0 0.0)
(42 . 50.0)
(43 . 0.0)
(44 . 0.0)
(45 . 1873.86)
(50 . 0.0)
(51 . 0.0)
(72 . 1000)
(90 . 819296)
(281 . 0)
(71 . 1)
(74 . 0)
(110 0.0 0.0 0.0)
(111 1.0 0.0 0.0)
(112 0.0 1.0 0.0)
(79 . 0)
(146 . 0.0)
(170 . 0)
(61 . 5)
(348 . <Имя объекта: 7e9bcfa8>)
(292 . 1)
(282 . 1)
(141 . 0.0)
(142 . 0.0)
(63 . 250)
(421 . 3355443))


(vlax-dump-Object a t)
; IAcadPViewport: Интерфейс AutoCAD для работы с видовыми экранами.
; Значения свойств:
; Application (RO) = #<VLA-OBJECT IAcadApplication 00767814>
; ArcSmoothness = 1000
; Center = (128.033 98.9766 0.0)
; Clipped (RO) = 0
; CustomScale = 0.65
; Direction = (0.0 0.0 1.0)
; DisplayLocked = 0
; Document (RO) = #<VLA-OBJECT IAcadDocument 24f90734>
; EntityTransparency = "ПоСлою"
; GridOn = 0
; Handle (RO) = "256"
; HasExtensionDictionary (RO) = -1
; HasSheetView (RO) = 0
; Height = 84.5
; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 16abee54>
; LabelBlockId = 0
; Layer = "0"
; LayerPropertyOverrides (RO) = 0
; LensLength = 50.0
; Linetype = "ByLayer"
; LinetypeScale = 1.0
; Lineweight = -1
; Material = "ByLayer"
; ModelView = nil
; ObjectID (RO) = 2123766064
; ObjectName (RO) = "AcDbViewport"
; OwnerID (RO) = 2123906768
; PlotStyleName = "ByLayer"
; ShadePlot = 0
; SheetView = nil
; SnapBasePoint = (0.0 0.0)
; SnapOn = 0
; SnapRotationAngle = 0.0
; StandardScale = 1
; StandardScale2 = 1
; Target = (0.0 0.0 0.0)
; TrueColor = #<VLA-OBJECT IAcadAcCmColor 252df380>
; TwistAngle = 5.47195
; UCSIconAtOrigin = -1
; UCSIconOn = -1
; UCSPerViewport = -1
; ViewportOn = -1
; Visible = -1
; VisualStyle = 1
; Width = 162.5
; Поддерживаемые методы:
; ArrayPolar (3)
; ArrayRectangular (6)
; Copy ()
; Delete ()
; Display (1)
; GetBoundingBox (2)
; GetExtensionDictionary ()
; GetGridSpacing (2)
; GetSnapSpacing (2)
; GetXData (3)
; Highlight (1)
; IntersectWith (2)
; Mirror (2)
; Mirror3D (3)
; Move (2)
; Rotate (2)
; Rotate3D (3)
; ScaleEntity (2)
; SetGridSpacing (2)
; SetSnapSpacing (2)
; SetXData (2)
; SyncModelView ()
; TransformBy (1)
; Update ()
T
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.

Последний раз редактировалось Kirill_Ja, 18.06.2013 в 19:11. Причина: Уточнил тему
Просмотров: 8546
 
Непрочитано 17.06.2013, 19:27
#2
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 501
<phrase 1=


Цитата:
Сообщение от Kirill_Ja Посмотреть сообщение
Не могу найти ни одной точки привязки. Как изображение на ВЭ однозначно связано с моделью? В AciveX тоже нет никакой связи с моделью, а вот все
вышеперечисленное есть, но называется по-другому.
ViewHeight, ViewTarget и ViewCenter в .net
http://docs.autodesk.com/ACD/2010/EN...umber=d0e49632
там внизу есть пример для ActiveX
__________________
Алексей
bargool вне форума  
 
Непрочитано 17.06.2013, 20:45
#3
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,289


Я делал так: вычислял центр (точку пересечения диагоналей) прямоугольника, и свойству target видового экрана присваивал это значение, не забыв при этом, естественно, задать ширину, высоту и масштаб видового экрана такими, чтоб они соответствовали прямоугольнику в модели. Проверить сейчас возможности нет, по памяти примерно так:
Код:
[Выделить все]
 (vla-put-Width vla_Vport 395)
(vla-put-Height vla_Vport 287)
(vla-put-Target vla_Vport 
				(vlax-SafeArray->List 
					(vlax-Variant-Value pt)))
(vla-put-CustomScale vla_Vport 2)
где vla-Vport - vla-указатель на видовой экран, pt - вычисленная точка
skkkk на форуме  
 
Автор темы   Непрочитано 18.06.2013, 09:45
#4
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Знаю, что надо пробовать, но почему у него Target = (0.0 0.0 0.0) в дампе ActiveX?
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.
Kirill_Ja вне форума  
 
Непрочитано 18.06.2013, 10:26
#5
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,289


Насколько я понял, все манипуляции штатными средствами не меняют свойство target, и по умолчанию его координаты равны (0.0 0.0 0.0), даже, если по факту ВЭ смотрит совсем в другое место модели. Изменить это свойство, видимо, можно только программно. Могу ошибаться.
skkkk на форуме  
 
Автор темы   Непрочитано 18.06.2013, 11:30
#6
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Это ценно. Надо пробовать.
Еще вопрос:
После создания Layout'а на том же листе появляется видовой экран. Как мне получить на него указатель?

И еще. После создания листа из модели (когда находишься во вкладке модель) (vla-get-paper-space) выдает указатель на пространство только что созданного листа, а вот когда из листа (когда открыта вкладка листа) выдает указатель на текущий лист. Как получить указатель на пространство листа по указателю на лист?
Более того, даже при переходе на лист (setvar 'ctab ...) выдает ссылку на пространство предыдущего листа.


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

Решение найдено. Спасибо за советы.
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.

Последний раз редактировалось Kirill_Ja, 18.06.2013 в 13:04.
Kirill_Ja вне форума  
 
Непрочитано 18.06.2013, 16:01
#7
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,289


Не ясно, найдено только на зачеркнутый вопрос решение? Если так, то vla-указатель на ВЭ я получал так:
Код:
[Выделить все]
 (vlax-ename->vla-object (ssname (ssget "_X" (list (cons 0 "VIEWPORT")(cons 410 "Лист1"))) 0))
Вместо "Лист1" можно подставить (выяснив программно) имя новоиспеченного листа.
skkkk на форуме  
 
Автор темы   Непрочитано 18.06.2013, 17:33
#8
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Согласен. Сам использовал похожую конструкцию.

В принципе, работает почти все. Только Target ведет себя непристойно. Никак не хочет оказываться в центре видового экрана.



Код:
[Выделить все]
 (defun tg_new_layout (name center wi hi ang / ss scale vport)

(if (member name (layoutlist)) (progn (alert "Имя листа должно быть уникальным") (exit)))
(vla-add (vla-get-Layouts curent_doc) name)
(setvar 'ctab name)
(if (setq ss (ssget "_X" (list (cons 410 name))))
  (mapcar (function
	    (lambda (x / ent)
	      (if (= 'ename (type (setq ent (cadr x))))
		(entdel ent))))
	  (ssnamex ss)))
(if  (null (setq scale (tg_get_scale))) (setq scale 1))
(setq vport (vla-AddPViewport (vla-get-PaperSpace curent_doc) (vlax-3d-point '(200 200 0)) wi hi))
(vla-put-Target vport (vlax-3d-point center))
(vla-put-CustomScale vport scale)
(vla-put-TwistAngle vport ang)
(vla-put-ViewportOn vport :vlax-true)
(command "_regenall")
);end defun


Может, увидите навскидку почему ВЭ не попадает в цель (Target =))))
Или это свойство как-то по-другому работает. Не пойму ничего.
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.
Kirill_Ja вне форума  
 
Непрочитано 18.06.2013, 17:57
#9
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 501
<phrase 1=


Не знаю, вот здесь можно увидеть этот самый target. Отличный от 0,0,0 нужен только если мы как-нибудь вращаем камеру. В своей проге по созданию листов я всегда выставляю target в 0,0,0 (подразумевается, что плоскость видового экрана совпадает с XY в мировой системе координат, чтоли)
__________________
Алексей
bargool вне форума  
 
Непрочитано 18.06.2013, 18:10
#10
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,683
Отправить сообщение для Do$ с помощью Skype™


Есть подозрение, что надо смотреть свойство Center а не Target.
Do$ вне форума  
 
Автор темы   Непрочитано 18.06.2013, 19:04
#11
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Секунду. За вращение камеры отвечает свойство TwistAngle = 5.47195 (по крайней мере в плоскости XOY).
Center - положение центра ВЭ на листе. Он же и задается при создании ВЭ. Он же виден в дампе ActiveX.

Цитата:
Не знаю, вот здесь можно увидеть этот самый target. Отличный от 0,0,0 нужен только если мы как-нибудь вращаем камеру. В своей проге по созданию листов я всегда выставляю target в 0,0,0 (подразумевается, что плоскость видового экрана совпадает с XY в мировой системе координат, чтоли)
Цитата из приведенного источника:
Цитата:
Target X
For current and model views only, displays the X coordinate of the view's target.
Target Y
For current and model views only, displays the Y coordinate of the view’s target.
Target Z
For current and model views only, displays the Z coordinate of the view’s target.
Все правильно. "view’s target" (цель взгляда) - это и есть то самое место куда надо смотреть. Откуда только сдвиг?
У меня при создании ВЭ с Target. Видовой экран несколько смещен относительно цели. (центральная точка ВЭ и Target на модели не совпадают). Я проверил, в функцию я передаю правильные координаты.

Хотя там написано: Для текущего вида и вида модели (For current and model views only). Что они имели в виду?

А если не Center и не Target и не .net (сорри bargool) тогда что это еще может быть?
Или все же Target?
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.
Kirill_Ja вне форума  
 
Непрочитано 18.06.2013, 21:01
#12
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


View это вид (объект) а не цель взгляда, тебе нужно создать вид и
установить его для новой вкладки для него же установить target,
center, direction и тд
Это долгая канитель ищи в Гугле или используй команды
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 18.06.2013, 23:32
#13
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Олег, пост №8. Примерно такая канитель?
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.
Kirill_Ja вне форума  
 
Непрочитано 19.06.2013, 00:13
#14
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,289


Нашел описание Target в VBA-reference

Попытался перевести:
Получает или устанавливает целевую точку для ВЭ как набор из 3D координат в Мировой СК, отображающих целевую точку. Линия взгляда отрисована из центра в целевую точку. Возвращает трехэлементный массив вещественных чисел.

Ничего не понял из этого.
Когда-то проходил подобные процедуры, но я просто программно вертел созданную вручную рамку в модели и соответственно ей изменял видовой экран, также вручную настроенный (ему я как раз менял высоту, ширину, масштаб и этот пресловутый таргет). Все получалось. Теперь мне кажется, что рамка в модели у меня вертелась вокруг точки пересечения диагоналей, соответственно, эта точка была неизменной. Хотя странно это все как-то... Тогда я был убежден, что без нее никак, и что она - это то, что надо, стало быть, ошибался. Сегодня сколько ни бился, так и не смог понять закономерности поведения этого таргета
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.JPG
Просмотров: 1329
Размер:	27.7 Кб
ID:	105818  
skkkk на форуме  
 
Непрочитано 19.06.2013, 00:29
1 | #15
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Kirill_Ja Посмотреть сообщение
Олег, пост №8. Примерно такая канитель?
Да ход мысли приблизительно правильный,
только vla-методами это сделать очень трудно,
я, по-крайней, мере не возьмусь, лучше для таких действий
подходят обычные команды
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 19.06.2013, 08:14
#16
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Мне, как-то наоборот показалось)))
А как стандартными методами связать лист и модель?

Цитата:
Сообщение от skkkk Посмотреть сообщение
Нашел описание Target в VBA-reference

Попытался перевести:
Получает или устанавливает целевую точку для ВЭ как набор из 3D координат в Мировой СК, отображающих целевую точку. Линия взгляда отрисована из центра в целевую точку. Возвращает трехэлементный массив вещественных чисел.

Ничего не понял из этого.
Когда-то проходил подобные процедуры, но я просто программно вертел созданную вручную рамку в модели и соответственно ей изменял видовой экран, также вручную настроенный (ему я как раз менял высоту, ширину, масштаб и этот пресловутый таргет). Все получалось. Теперь мне кажется, что рамка в модели у меня вертелась вокруг точки пересечения диагоналей, соответственно, эта точка была неизменной. Хотя странно это все как-то... Тогда я был убежден, что без нее никак, и что она - это то, что надо, стало быть, ошибался. Сегодня сколько ни бился, так и не смог понять закономерности поведения этого таргета
Все правильно. В теории так и должно быть. Луч видимости из точки CENTER на листе на точку TARGET в модели. Сейчас файлик прикреплю, будет попонятнее суть вопроса.



Код:
[Выделить все]
 (defun tg_new_layout (name center wi hi ang / ss scale vport)
;;;Функция создает лист и на нем видовой экран.
;;;name - имя листа
;;;center - место в модели куда смотрим
;;;wi - ширина отражаемой на листе области в единицах модели
;;;hi - то же, что и пред, но высота
;;;ang - угол поворота вида на ВЭ

(if (member name (layoutlist)) (progn (alert "Имя листа должно быть уникальным") (exit)))
(vla-add (vla-get-Layouts curent_doc) name)
(setvar 'ctab name)
(if (setq ss (ssget "_X" (list (cons 410 name))))
  (mapcar (function
	    (lambda (x / ent)
	      (if (= 'ename (type (setq ent (cadr x))))
		(entdel ent))))
	  (ssnamex ss)))
(if  (null (setq scale (tg_get_scale))) (setq scale 1))

(setq vport (vla-AddPViewport (vla-get-PaperSpace curent_doc) (vlax-3d-point '(0 0 0)) wi hi))
;;;Создан ВЭ в начале координат листа
(vla-put-Target vport (vlax-3d-point center))
;;;Установлена точка в модели, на которую смотрим
(vla-put-CustomScale vport scale)
;;;Установлен масштабный коэффициент ВЭ
(vla-put-TwistAngle vport ang)
;;;Установлен угол поворота вида в ВЭ
(vla-put-ViewportOn vport :vlax-true)
;;;Включен ВЭ
(command "_regenall")
);end defun


Решение нашел. Команда (vl-cmdf "ПОКАЗАТЬ" "Ц") рулит. И в обход всех этик миллиона настроек ВЭ.
Олег, спасибо. Что-то я поздно сообразил что ты имел в виду.
Вложения
Тип файла: dwg
DWG 2004
222.dwg (65.1 Кб, 3440 просмотров)
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.

Последний раз редактировалось Kirill_Ja, 23.06.2013 в 14:32. Причина: Нашел решение.
Kirill_Ja вне форума  
 
Непрочитано 25.11.2013, 18:31
#17
Евгенич

инженер-проектировщик
 
Регистрация: 15.08.2007
Санкт-Петербург
Сообщений: 67
<phrase 1=


Я всё равно так и не понял причины расхождения значения свойства Target с реальностью... У меня стоит обратная задача: вынести в модель контуры видовых экранов из листов. И, собственно, дело яйца выеденного не стоит, но...
__________________
AC 2009
Евгенич вне форума  
 
Непрочитано 25.11.2013, 20:55
#18
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,683
Отправить сообщение для Do$ с помощью Skype™


Найти точки контура - не проблема, надеюсь. А дальше - воспользоваться функцией TRANS. На лиспе не пробовал, но в NET работает.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 26.11.2013, 11:47
#19
Евгенич

инженер-проектировщик
 
Регистрация: 15.08.2007
Санкт-Петербург
Сообщений: 67
<phrase 1=


Do$, в данном случае точки контура определяются относительно центра (свойство target) прямоугольника видового экрана, а он не совпадает ни с Моделью, ни с тем, что написано в свойствах, доступных через Ctrl+1.

----- добавлено через ~1 ч. -----
Интересное наблюдение: имеются четыре абсолютно разных видовых экрана на листе, но (vla-AddPoint <Модель> <значение target ВЭ>) для каждого из них ставит точку в одно и то же место в Модели!
__________________
AC 2009

Последний раз редактировалось Евгенич, 26.11.2013 в 12:50.
Евгенич вне форума  
 
Непрочитано 26.11.2013, 17:10
#20
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,683
Отправить сообщение для Do$ с помощью Skype™


Наверное, потому что это не точка, а вектор направления взгляда.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp/ActiveX Как создать лист и на нем видовой экран. Связь Модель->Лист

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать на "листе" нужное мне "окно " в модель? (видовой экран) azetown Программирование 8 09.06.2011 09:16
Ищу листы Специальной карты Европейской России М:1дюйм-10верст KSI Поиск литературы, чертежей, моделей и прочих материалов 6 19.04.2009 12:04