Lisp/ActiveX Как создать лист и на нем видовой экран. Связь Модель->Лист
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум 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. Причина: Уточнил тему
Просмотров: 12427
 
Непрочитано 17.06.2013, 19:27
#2
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
<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


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


Я делал так: вычислял центр (точку пересечения диагоналей) прямоугольника, и свойству 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


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


Насколько я понял, все манипуляции штатными средствами не меняют свойство 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


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


Не ясно, найдено только на зачеркнутый вопрос решение? Если так, то 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
Санкт-Петербург
Сообщений: 508
<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,701
Отправить сообщение для 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ä
Сообщений: 811


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


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


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

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

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

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


Цитата:
Сообщение от 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 Кб, 3452 просмотров)
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.

Последний раз редактировалось 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,701
Отправить сообщение для 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,701
Отправить сообщение для Do$ с помощью Skype™


Наверное, потому что это не точка, а вектор направления взгляда.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 26.11.2013, 18:09
#21
Евгенич

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


В свойствах написано, что именно точка. Вектор взгляда в справке нарисован из точки центра в точку target.
__________________
AC 2009
Евгенич вне форума  
 
Непрочитано 26.11.2013, 19:29
#22
Do$

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


Мне недавно нужно было определить объекты модели, видимые в ВЭ, для этого я определял границы ВЭ в модели. По сути - это как раз то, что Вы хотели.
Цитата:
Сообщение от Евгенич Посмотреть сообщение
У меня стоит обратная задача: вынести в модель контуры видовых экранов из листов.
При отладке я рисовал контуры ВЭ в модели - тютелька в тютельку сходилось с границами.
Алгоритм такой:
1. Циклом проходим по листам
2. Циклом проходим по ВЭ листа
3. Получаем точки контура ВЭ
4. Устанавливаем ВЭ текущим (это важно)
5. Транслируем координаты из листа в модель через этот ВЭ. В NET для этого подключается acedTrans, в AutoLISP есть trans.
6... Дальше эти точки сохраняем в список/ строим замкнутый контур/ делаем выбор объектов - по желанию.
Не вижу причин, по которым такой алгоритм не будет работать в лиспе. Он, однако, не учитывает того, что могут быть криволинейные сегменты контура.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 26.11.2013, 19:50
#23
Евгенич

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


Проблема решена. Ответ найден на Autodesk Community.
Опишу порядок действий:
  1. Переходим в лист.
  2. Делаем активным в любом видовом экране пространство модели.
  3. Перебором коллекции PViewport находим нужный нам видовой экран и делаем его активным для документа.
  4. Извлекаем координаты точки центра вида экрана через переменную viewctr.
Можно, наверное, более элегантно решить эту задачу, но я получил, что хотел - очертания видовых экранов в виде полилиний в пространстве Модели.

----- добавлено через ~3 мин. -----
Do$, я не обновлял сообщения, пока писал своё решение. Пусть будут оба
__________________
AC 2009
Евгенич вне форума  
 
Автор темы   Непрочитано 26.11.2013, 20:18
#24
Kirill_Ja


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


Offtop: Зачет))) и красота. Коллективный разум в действии.
Я тоже писал почти то же, но постеснялся постить без кода))))
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.
Kirill_Ja вне форума  
 
Непрочитано 27.11.2013, 10:37
#25
Евгенич

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


Выкладываю код. Он был написан наспех для решения сиюминутной задачи, потому с удовольствием приму любую критику.
Код:
[Выделить все]
 
;;; Стандартные процедуры по подключению ActiveX
(vl-load-com)
(setq								;; получение указателей на:
  acad_application   (vlax-get-acad-object)			;; приложение;
  document           (vla-get-ActiveDocument acad_application)	;; текущий документ;
  mspace             (vla-get-ModelSpace document)		;; пространство Модели документа;
  pspace             (vla-get-PaperSpace document)		;; пространство Листа документа.
)

;;; Функция для определения гипотенузы
(defun пифагор (x y)
  (sqrt (+ (* x x) (* y y)))
)

(setq i 0)							;; обнуление счётчика

(vl-cmdf "_mspace")						;; переход в пространство модели через ВЭ

(while (not (vl-catch-all-error-p				;; пока не встречена ошибка
	      (vl-catch-all-apply 'vla-item (list pspace i))	;; при переборе элементов пространства листа
	    )
       )

  (cond	((and (eq							;; если
		(vlax-get-property (vla-item pspace i) 'ObjectName)	;; получен объект с именем
		"AcDbViewport"						;; "AcDbViewport"
	      )								;; и
	      (not (vl-catch-all-error-p				;; его можно сделать активным
		     (vl-catch-all-apply				;; для текущего документа
		       'vla-put-ActivePViewport				;; (этим мы исключаем видовой экран
		       (list document (vla-item pspace i))		;; пространства листа)
		     )
		   )
	      )
	 )
	 (progn
	   (vla-put-ActivePViewport	;; делаем
	     document			;; видовой экран
	     (vla-item pspace i)	;; активным
	   )

	   (setq								;; создаём переменные для обращения к:
	     вэ		  (vla-item pspace i)					;; видовому экрану;
	     масштаб	  (vlax-get-property вэ 'CustomScale)			;; масштабу;
	     ширина	  (vlax-get-property вэ 'Width)				;; ширине видового экрана;
	     высота	  (vlax-get-property вэ 'Height)			;; высоте видового экрана;
	     поворот_вида (- (* 2 pi) (vlax-get-property вэ 'TwistAngle))	;; значению поворота видового экрана относительно системы координат Модели;
	     цель	  (getvar "viewctr")					;; значению центра вида видового экрана;
	     угол	  (atan (/ высота ширина))				;; углу наклона диагонали видового экрана;
	     диагональ	  (пифагор высота ширина)				;; длине диагонали;

	     pt1	  (reverse (cdr	(reverse (polar				;; 2D-координатам первой точки контура;
						   цель
						   (+ угол поворот_вида)
						   (/ диагональ 2 масштаб)
						 )
					)
				   )
			  )
	     pt2	  (reverse (cdr	(reverse (polar				;; 2D-координатам второй точки контура;
						   цель
						   (+ (- pi угол) поворот_вида)
						   (/ диагональ 2 масштаб)
						 )
					)
				   )
			  )
	     pt3	  (reverse (cdr	(reverse (polar				;; 2D-координатам третьей точки контура;
						   цель
						   (+ (+ pi угол) поворот_вида)
						   (/ диагональ 2 масштаб)
						 )
					)
				   )
			  )
	     pt4	  (reverse (cdr	(reverse (polar				;; 2D-координатам четвёртой точки контура.
						   цель
						   (+ (- угол) поворот_вида)
						   (/ диагональ 2 масштаб)
						 )
					)
				   )
			  )
	   ) ; SETQ
	   
	   (vla-AddLightweightPolyline		;; Создаём полилинию
	     mspace				;; в пространстве Модели:
	     (vlax-make-variant			;; создаём вариант
	       (vlax-safearray-fill		;; из безопасного массива
		 (vlax-make-safearray
		   5				;; элементов типа Double
		   '(0 . 7)			;; в количестве восьми штук (четыре пары координат)
		 )
		 (append
		   pt1
		   pt2
		   pt3
		   pt4
		 )
	       )
	     )
	   )
	 ) ; PROGN
	) ; CASE_1
  ) ; COND
  
  (setq i (1+ i))	;; инкремент счётчика
)
От себя:
  1. Полилинии не замкнуты - изменение одного свойства.
  2. Можно более элегантно и запутано решить задачу заполнения списка координат вершин полилинии - я выбрал наиболее очевидный способ.

----- добавлено через ~2 мин. -----
В source код выглядит более симпатично
__________________
AC 2009

Последний раз редактировалось Евгенич, 27.11.2013 в 11:27.
Евгенич вне форума  
 
Непрочитано 27.11.2013, 14:34
#26
Do$

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


Offtop: Русские имена переменных в коде выглядят дико
Мне показалось, или видовой экран дважды делается активным? Сперва в условии COND, затем в последующем коде.
А если ВЭ не прямоугольный?
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 27.11.2013, 14:53
#27
Евгенич

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


Согласен. Как-то совсем не обратил внимание про двойную активацию.
В случае с многогранным ВЭ придётся по DXF-коду 340 получить указатель на ограничивающую полилинию и воспроизвести её в Модели.
__________________
AC 2009
Евгенич вне форума  
 
Непрочитано 28.11.2013, 14:55
#28
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Здравствуйте коллеги!
Связь между видовым экраном и моделью - это координаты центра видового экрана в модели.
При entity подходе их можно найти в dxf коде 12
При объектном подходе проанализировав РД объекта
Код:
[Выделить все]
 
(vla-getxdata(vlax-ename->vla-object(car(entsel)))"ACAD" 'dt 'dv)
Далее зная масштабный коэффициент и размеры экрана в листе можно вычислить углы экрана в модели.
Эдуард вне форума  
 
Непрочитано 29.11.2013, 13:02
#29
Евгенич

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


Эдуард, в 12-м коде для всех ВЭ у меня нули.
__________________
AC 2009
Евгенич вне форума  
 
Непрочитано 10.06.2015, 23:03
#30
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=



Сам тыкался на днях с этой темой. Нужно было найти центры прямоугольных видовых экранов в модели. Не нравился подход с перебором и активацией каждого экрана. Методом тыка нашел, что если к 12 коду прибавить координаты 17 кода, то координата в моделе совпадает с координатой центра видового экрана. Возможно это не работает на повернутых экранах или при измении ПСК, но для моей задачи хватило. Может кому пригодится.
Mozgunov вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp/ActiveX Как создать лист и на нем видовой экран. Связь Модель->Лист



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