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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > ActiveX. Получаю свойства и методы vlax-dump-object, но где всё это?

ActiveX. Получаю свойства и методы vlax-dump-object, но где всё это?

Ответ
Поиск в этой теме
Непрочитано 09.01.2015, 19:36 #1
ActiveX. Получаю свойства и методы vlax-dump-object, но где всё это?
fasadel
 
Регистрация: 17.03.2009
Сообщений: 316

Как чайник зашёл в тупик непонимания.

Мне важно научиться работать с камерами и проч. при помощи VBA, Lisp или чего-нибудь ещё (мне всё равно, что освоить, лишь бы сделать). В объектной модели ActiveX ничего не сказано про такой объект как камеры.

Но! При этом выбираю камеру и смотрю её при помощи vlax-dump-object. Получаю вывод:

Код:
[Выделить все]
Select object: ; IAcCameraWrapper: IAcCameraWrapper Interface
; Property values:
;   Application (RO) = #<VLA-OBJECT IAcadApplication 000000013ff29110>
;   BackPlane = 0.0
;   Clipping = "Off"
;   Document (RO) = #<VLA-OBJECT IAcadDocument 0000000022fe7808>
;   EntityTransparency = "ByLayer"
;   FieldOfView = 0.872665
;   FrameHeight = 15651.4
;   FrameWidth = 23477.1
;   FrontPlane = 0.0
;   Handle (RO) = "452E"
;   HasExtensionDictionary (RO) = 0
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 000000004add86e8>
;   IsPlotable = 0
;   Layer = "*temporary_system_cameras_layer"
;   LensLength = 38.6011
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   Location = (-12000.0 -22000.0 1000.0)
;   Material = "ByLayer"
;   Name = "главный_и_левый"
;   ObjectID (RO) = 42
;   ObjectName (RO) = "AcDbCamera"
;   OwnerID (RO) = 43
;   PlotStyleName = "ByLayer"
;   RollAngle = 0.0
;   Target = (1500.0 0.0 3500.0)
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 000000004ade6a20>
;   Visible = -1
; Methods supported:
;   ArrayPolar (3)
;   ArrayRectangular (6)
;   Copy ()
;   Delete ()
;   GetBoundingBox (2)
;   GetExtensionDictionary ()
;   GetXData (3)
;   Highlight (1)
;   IntersectWith (2)
;   Mirror (2)
;   Mirror3D (3)
;   Move (2)
;   Rotate (2)
;   Rotate3D (3)
;   ScaleEntity (2)
;   SetXData (2)
;   TransformBy (1)
;   Update ()
T
Т.е. и свойства и методы ActiveX вроде как имеются! Но где про это написано? В хелпе ничего такого нет.

И что такое указано в первой строке IAcCameraWrapper? Подозреваю это какое-то имя класса. Оно вообще в каком "измерении" живёт. Это ведь не объект ActiveX, его нет в списке? И даже не класс Object Arx (нет такого слова в Иерархии классов).
Просмотров: 5049
 
Непрочитано 09.01.2015, 21:46
1 | #2
skkkk


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


Не работаю в 3D, поэтому про камеры не знаю практически ничего, кроме обрывков информации с форума, поступившей случайно в голову да кроме догадок, основанных на логических умозаключениях. Но просто глядя на представленный материал, уже понимаю, что камера является таким же объектом Автокада, как и полилиния, например. Про себя скажу, что я совсем не профессиональный программист и что ни разу, изучая ActiveX, не использовал ничего, кроме форума, уже имеющихся знаний по программированию и книги Полещука, которую использовал как лиспо-русский словарь. Плюс еще всегда очень помогало знание английского.
По сему, встань передо мной такая задача, как работа с камерами, я бы не пугаясь попробовал применять к ним те же принципы, что и в работе с любыми другими объектами Автокада. А они (принципы) у меня следующие:
1. Делаю дамп объекта, получаю список значений свойств (Property values), аналогичный вставленному в первом посте.
2. Используя логику, познания в английском и - если их недостаточно - англо-русский словарь, выявляю название свойства, которое мне нужно определить или изменить. Пусть, для примера это будет ширина рамки (FrameHeight).
3. Простыми конструкциями узнаю
Код:
[Выделить все]
(vla-get-FrameHeight (vlax-ename->vla-object (car (entsel))))
или меняю
Код:
[Выделить все]
(vla-put-FrameHeight (vlax-ename->vla-object (car (entsel))) 16000)
значения свойств.
4. Далее, присвоив значения этих свойств переменным, можно оперировать ими в лиспе, или вычислив нужное свойство, присваиваю его нужному объекту.

А документировано (имеет описание, справку) в Автокаде далеко не все, но это не значит, что по общему принципу это работать не будет.
skkkk вне форума  
 
Непрочитано 12.01.2015, 14:53
1 | #3
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,085


Цитата:
Сообщение от fasadel Посмотреть сообщение
Т.е. и свойства и методы ActiveX вроде как имеются! Но где про это написано? В хелпе ничего такого нет.
Специфические свойства полностью соответствуют англ. названиям свойств камеры, отображаемых в панели свойств (которая по ctrl+1 вызывается). Плюс имя и некоторые другие свойства, общие для всех графических объектов (цвет, слой и проч.). Некотрые из них не отображаются в панели свойств, т.к. не имеют смысла для камеры (тип линий, например).
Методы - тоже общие для всех графических объектов Акада, ни одного специфического.
kp+ вне форума  
 
Автор темы   Непрочитано 12.01.2015, 18:23
#4
fasadel


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


1. Замечу, что написанного в окне свойств недостаточно, т.к. имена свойств могут быть совсем другими и иметь неочевидный тип.

2. Всплывает ещё одна проблема. Чтобы протестировать свойства камеры я, естественно, объявляю её для начала
Код:
[Выделить все]
Dim MyCam As Object
Да, я могу увидеть
Код:
[Выделить все]
 MyCam.ObjectName = "AcDbCamera"
но чтобы получить доступ к специфическим методам и свойствам необходимо знать имя класса для камеры... Вот тут-то и затык. Ни хелп, ни всплывающая подсказка в IDE ничего не знают.

3. Действительно ли в ActiveX/VBA нет такого класса или как? А если есть, почему нет никакой документации? И дело касается не только камер, но и свойств освещения, настроек рендера и прочих интересующих меня вещей.
fasadel вне форума  
 
Непрочитано 12.01.2015, 19:14
1 | #5
skkkk


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


Я тут проверил свои огрызки кода из #2 и оказалось, что указанные мной в примере свойства не поддерживаются в ActiveX. Поддерживаются лишь те, которые присущи и другим объектам. Например, (vla-get-Target) возвращает значение, а вот специфичные для камер - ни в какую. Пишет
Код:
[Выделить все]
ошибка: no function definition: VLA-GET-FRAMEHEIGHT
Прошу прощение за дезинформацию. Видимо, камеры не только не документированы в ActiveX, но и вовсе не поддерживаются им, по крайней мере, не объявлены в объектной модели. Может, что-то особенное нужно подгрузить, типа (vl-load-com), но для камер и прочих 3D-инструментов? Но я о таком не слышал
skkkk вне форума  
 
Автор темы   Непрочитано 12.01.2015, 19:27
#6
fasadel


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


Правильно ли я вам понял, что для многих объектов (лучше сказать "штук") в AutoCad нет доступного API? Может ли здесь помочь изучение Object Arx?

P.S.: Это меняет моё миропонимание
fasadel вне форума  
 
Непрочитано 12.01.2015, 20:09
#7
skkkk


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


Не знаю, как насчет "нет доступного API", но знаю точно, что в нем есть много недокументированных системных переменных, а также много недокументированных возможностей, на которые неоднократно проливали свет некоторые из сильных форума сего, что и послужило мне почвой для моих предположений. Я не теряю надежды, что все же до этих свойств можно как-то добраться программно, коли они существуют, может, есть какой-нибудь секрет.

Цитата:
Сообщение от fasadel Посмотреть сообщение
Может ли здесь помочь изучение Object Arx?
Вот чего не знаю, того не знаю. Но вероятность, что это сможет Object Arx или .NET - думаю, намного выше, чем у LISP или VBA.
А что именно нужно делать с камерами?
skkkk вне форума  
 
Непрочитано 12.01.2015, 20:37
#8
Кулик Алексей aka kpblc
Moderator

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


Если не срабатывает vla-put-target <ent>, можно попробовать vlax-put-property <ent> 'target или vlax-put-property <ent> "target"
С методами иногда подобное срабатывает, может быть, и здесь поможет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.01.2015, 22:13
#9
skkkk


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


Вот и появился силач и рассказал секрет.
Я и забыл о такой альтернативе, поскольку всегда срабатывал предложенный мной метод.
Проверил:
Код:
[Выделить все]
(vlax-get-property (vlax-ename->vla-object (car (entsel))) 'FrameHeight)
и
Код:
[Выделить все]
(vlax-get-property (vlax-ename->vla-object (car (entsel))) "FrameHeight")
оба варианта сработали, так что в какой-то мере все же я был прав:
Цитата:
Сообщение от skkkk Посмотреть сообщение
А документировано (имеет описание, справку) в Автокаде далеко не все, но это не значит, что по общему принципу это работать не будет.
skkkk вне форума  
 
Непрочитано 13.01.2015, 11:55
1 | #10
Александр Ривилис

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


Небольшая цитата из документации ObjectARX по поводу класса AcDbCamera:
Цитата:
The camera entity represents a named view in model space. Camera entities are not persisted into the drawing file. A camera entity is created when the CAMERADISPLAY sysvar is set to 1. When a named view is deleted its corresponding camera is also deleted, and vice versa.

Rather than creating a camera entity directly, it is recommended instead that you simply create a named view.

By default, camera entities are created on a hidden layer. Moving a camera entity to another layer is not recommended.
Основное подчеркнул.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 13.01.2015, 16:07
#11
fasadel


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


Александр, спасибо.

1. Прежде чем писать на форуме я перелопатил много чего и читал (прям зачитывался) справочником по ObjectARX, и изучал класс AcDbCamera, в том числе то, что вы написали я прекрасно понимаю (а также, что для glyph-ов камер есть скрытый слой). Но, кстати, вопрос, класса, который я бы назвал "AcDbView" в той же документации нет! Первоначальный вопрос у меня даже не про камеры (то что мне надо было на начальных порах я сделал на LISP: выставление прямоугольника с фоновой картинкой строго перпендикулярно лучу зрения с любой камеры и так, чтобы картинка была чётко отмасштабирована на поле зрения камеры). Вопрос принципиальный — существует огромная "подводная" недокументированная часть ActiveX, с которой не понятно как работать.

2. Большинство вещей от собственно AutoCAD, LIPS, VBA изучал по хелпу. Также, конечно, и с ObjectARX и VB.NET (или лучше C#?) сейчас разберусь. Но нет ли чего-нибудь "популярного" по ObjectARX, помимо документации, читая которую многие концептуальные вещи доходят совсем не сразу. Хелп неудобен тем, что надо надо знать, что искать (например имена функций и классов), а понятийную инфу приходится додумывать самому.
fasadel вне форума  
 
Непрочитано 13.01.2015, 18:39
1 | #12
Александр Ривилис

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


Цитата:
Сообщение от fasadel Посмотреть сообщение
Но нет ли чего-нибудь "популярного" по ObjectARX, помимо документации
Из написанного на русском есть только одна книга: Н.Н.Полещук. "Программирование для AutoCAD 2013-2015". ДМК Пресс, 2015, 462 с. ISBN 978-5-97060-066-5.
Обсуждение этой книги здесь.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > ActiveX. Получаю свойства и методы vlax-dump-object, но где всё это?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как поймать изменения в BlockEditor'е? DanmerRUS Программирование 7 21.02.2014 07:16
AutoCAD 2012 zenon AutoCAD 168 08.04.2013 16:01
Создание копии объекта Sleekka Программирование 2 10.10.2011 11:47
Программа для построения аксонометрии. Несколько вопросов. Zaghim Программирование 5 03.06.2011 19:29
ГОСТы, СНиПы, ПРАВИЛА и т.д. ki Разное 120 19.09.2007 09:05