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

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

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

Ответ
Поиск в этой теме
Непрочитано 17.06.2013, 15:11
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. Причина: Уточнил тему
Просмотров: 11696
 
Непрочитано 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,702
Отправить сообщение для 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,702
Отправить сообщение для 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