Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Alex от 22-12-2013, 09:57:38

Название: Вопросы новичка
Отправлено: Alex от 22-12-2013, 09:57:38
Здравствуйте.
Я только недавно начал изучать .NET API (для AutoCAD 2010), и периодически у меня возникают вопросы.
В перспективе их может быть много, поэтому темы решил не плодить - обойдусь пока одной.
Заранее спасибо за помощь.
Название: Re: Вопросы новичка
Отправлено: Alex от 22-12-2013, 10:35:46
Первый вопрос - по поводу документации.
Где можно найти справочник по .NET API?
Мне уже отвечал Александр Ривилис: "Она в составе ObjectARX SDK (Managed Class Reference)".
У меня установлен ObjectARX SDK 2010, в папке docs есть несколько chm-файлов. Но ни в одном из них я не нашел полного описания всех классов.
Взять, к примеру, тот же RibbonButton. У него есть несколько свойств (LargeImage, CommandHandler и т. п.), но найти описание класса я навскидку не смог.
Есть ObjectARX Reference Guide и есть ObjectARX For AutoCAD 2010: Developer Guide, в котором приведено приблизительное соответствие между "ObjectARX class prefixes and .NET namespaces". Но там есть не все - в частности, Autodesk.Windows там не перечислен.
Подскажите, пожалуйста, где нужно искать.
Название: Re: Вопросы новичка
Отправлено: Дмитрий Загорулькин от 22-12-2013, 10:39:11
Все мы в какой-то мере новички: всегда найдется кто-то, кто знает лучше. Пожалейте время того, кто будет искать похожие вопросы потом по форуму - следуйте правилам форума: один вопрос - одна тема.
Название: Re: Вопросы новичка
Отправлено: Alex от 22-12-2013, 11:06:50
Хорошо, учту. Просто мне показалось, что много простых вопросов вряд ли стоит выносить наружу. Ничего сверхъестественного я, скорее всего, спрашивать не буду.)
Название: Re: Вопросы новичка
Отправлено: Андрей Бушман от 22-12-2013, 11:30:23
Для начала тебе следует избавиться от иллюзий на тему того, что мол справка ObjectARX содержит в себе полную информацию: это далеко не так (к сожалению). Конкретно по RibbonButton проверить наличие информации сейчас не могу, т.к. дома Linux. В данном случае, тебе будет полезно почитать на тему WPF, поскольку риббоны используют эту технологию. На тему WPF хорошей информации много (гугл в помощь). Навыки работы в WinForms не помогут при использовании WPF. Конструировать риббоны (и не только их) в AutoCAD можно не только с помощью программного кода, но и посредством XAML разметки (это одна из "фишек" WPF). Я на двг.ру когда-то по теме различные примеры показывал, например: тынц (http://forum.dwg.ru/showpost.php?p=707348&postcount=10), тынц (http://forum.dwg.ru/showpost.php?p=981234&postcount=11).
Название: Re: Вопросы новичка
Отправлено: Alex от 22-12-2013, 13:11:20
Спасибо, я это посмотрю. Хотя эта разметка выглядит как-то очень незнакомо. Как ее к коду прикручивать - совершенно непонятно. Может, со временем разберусь.
...
В целом процесс создания кнопок я стырил из доклада Mike Tuersley "Creating a Ribbon Bar for AutoCAD® with VB.NET". Оно работает, вопросов нет. И вообще примеров в Сети куча.
Но как-то хотелось бы знать, что этот код делает. Потому что просто из костылей все вязать - это как-то очень печально.
Вот кусок кода, который там приведен:
Imports System
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Windows
Imports Autodesk.Windows

Public Class Class1 Implements IExtensionApplication

Public Sub Initialize() Implements IExtensionApplication.Initialize
createRibbon()
End Sub

Public Sub Terminate() Implements IExtensionApplication.Terminate
End Sub

Private Sub CreateRibbon()
'declare a ribboncontrol object
Dim ribCntrl As RibbonControl = ComponentManager.Ribbon
'create a ribbontab
Dim ribTab As New RibbonTab()
'set a few properties
ribTab.Title = "AU2009"
ribTab.Id = "AU2009"
'add the tab to the ribbon
ribCntrl.Tabs.Add(ribTab)
'set as active tab
ribTab.IsActive = True
End Sub

End Class


Private Sub addContent(ByVal ribTab As RibbonTab)
'create the panel source
Dim ribSourcePanel As RibbonPanelSource = New RibbonPanelSource()
ribSourcePanel.Title = "Dev Tools"
'now the panel
Dim ribPanel As New RibbonPanel()
ribPanel.Source = ribSourcePanel
ribTab.Panels.Add(ribPanel)
'create a button
Dim ribButton1 As RibbonButton = New RibbonButton()
ribButton1.Text = "Net load"
ribButton1.CommandParameter = "NETLOAD "
ribButton1.ShowText = True
ribButton1.CommandHandler = New AdskCommandHandler()
'add the button
ribSourcePanel.Items.Add(ribButton1)
End Sub

Public Class AdskCommandHandler Implements System.Windows.Input.ICommand

Public Function CanExecute(ByVal parameter As Object) As Boolean _ Implements System.Windows.Input.ICommand.CanExecute
Return True
End Function

Public Event CanExecuteChanged As EventHandler Implements _ System.Windows.Input.ICommand.CanExecuteChanged

Public Sub Execute(ByVal parameter As Object) Implements _ System.Windows.Input.ICommand.Execute
Dim ribBtn As RibbonButton = TryCast(parameter, RibbonButton)
If ribBtn IsNot Nothing Then
Autodesk.AutoCAD.ApplicationServices.Application. DocumentManager.MdiActiveDocument. SendStringToExecute(_ ribBtn.CommandParameter, True, False, True)
End If
End Sub
End Class

Во-первых, откуда-то взялся класс IExtensionApplication. Видимо, именно благодаря ему можно использовать Initialize() и Terminate(). (Уже потом я наткнулся на запись в ивестном блоге http://through-the-interface.typepad.com/through_the_interface/2006/09/initialization_.html (http://through-the-interface.typepad.com/through_the_interface/2006/09/initialization_.html)).
Во-вторых, объявляются всяческие Ribbon и RibbonTab. То, что это лента и вкладка на ленте, понятно на интуитивном уровне. Пока неважно - все равно они не главную роль играют в коде.
Потом на сцену выступают RibbonPanelSource и RibbonPanel. Не знаю, не понимаю, в чем отличие. Это, похоже, тоже разработка Autodesk (по крайней мере, находится оно в Autodesk.Window namespace).
После всего этого в коде появляется КНОПКА RibbonButton. У нее используются параметры Text, CommandParameter (это, видимо, команда AutoCAD, которая запускается при нажатии кнопки), ShowText (булевская переменная, видимо, отвечающая за отображение текста) и CommandHandler (обработчик, который будет исполняться при нажатии кнопки).
Затем определяется этот самый обработчик, причем отдельным классом. Отдельным классом он определен, как я понимаю, потому, что он должен реализовывать интерфейс System.Windows.Input.ICommand. В рамках класса AdskCommandHandler определены: функция CanExecute(), событие CanExecuteChanged и функция Execute() (все это просто для реализации интерфейса ICommand - так, CanExecute() в этом примере всегда возвращает true, а событие CanExecuteChanged вроде бы нигде не используется).
В итоге я добавил кнопку (с картинкой, там дальше в примере это было) и в Execute() поместил логику. Работает.
При этом я понятия не имею, какие еще у кнопки есть методы (то есть поля и методы я могу просмотреть в IDE, но что они делают - черт их знает).
Аналогичная ситуация и со многими другими объектами. И что делать?
Название: Re: Вопросы новичка
Отправлено: Андрей Бушман от 22-12-2013, 13:49:17
Во-первых, откуда-то взялся класс IExtensionApplication. Видимо, именно благодаря ему можно использовать Initialize() и Terminate()
Тынц (https://sites.google.com/site/bushmansnetlaboratory/arx/rukovodstvo-razrabotcika-objectarx/netuse/wrapclasses/wrapstart/initopt/attuse), тынц (https://sites.google.com/site/bushmansnetlaboratory/moi-zametki/iextensionapplication).

Цитировать
Хотя эта разметка выглядит как-то очень незнакомо. Как ее к коду прикручивать - совершенно непонятно.
...
Потом на сцену выступают RibbonPanelSource и RibbonPanel. Не знаю, не понимаю, в чем отличие.
...
При этом я понятия не имею, какие еще у кнопки есть методы (то есть поля и методы я могу просмотреть в IDE, но что они делают - черт их знает).
Аналогичная ситуация и со многими другими объектами. И что делать?
Я тебе уже ответил: если хочешь нормально разобраться в вопросе, то изучи технологию WPF, ибо механизм работы риббонов построен на ней. Сможешь в риббонах (и не только в них) делать намного более навороченные вещи, чем показывают даже в блогах разработчиков ADN. Литература по теме WPF (и не только по ней) мною была обозначена здесь (http://adn-cis.org/forum/index.php?topic=400.0) (см. пункты 9-11).
Название: Re: Вопросы новичка
Отправлено: Александр Ривилис от 22-12-2013, 13:55:13
Alex,
В итоге я добавил кнопку (с картинкой, там дальше в примере это было) и в Execute() поместил логику. Работает.
Так замечательно же!  :)
При этом я понятия не имею, какие еще у кнопки есть методы (то есть поля и методы я могу просмотреть в IDE, но что они делают - черт их знает).
Задавай конкретные вопросы (один вопрос - одна тема). Не стесняйся. Если сами не будем знать ответы - передадим их в ADN DevHelp ("скорая помощь" разработчикам под платформы Autodesk). Раньше или позже, но ответ на свой вопрос ты получишь.
Онлайн документация (на английском) - Руководство разработчика - http://www.autodesk.com/autocad-net-developers-guide
Андрей Бушман частично его перевёл - ссылку он тебе сам даст.
Название: Re: Вопросы новичка
Отправлено: Alex от 22-12-2013, 13:58:02
Спасибо всем за помощь. Буду потихоньку разбираться. Вопросы будут; наверное, много.)
Название: Re: Вопросы новичка
Отправлено: Андрей Бушман от 22-12-2013, 13:59:22
ссылку он тебе сам даст.
А вы это сделать не можете по каким соображениям? ;)
Цитировать
Вопросы будут; наверное, много.)
Очень желательно, чтобы вопросы задавались не потому, что лень заглянуть в google\справку\SDK\блоги\известные сайты, а в случае, если нужная информация не была найдена в обозначенных источниках :)
Название: Re: Вопросы новичка
Отправлено: Александр Ривилис от 22-12-2013, 14:01:50
А вы это сделать не можете по каким соображениям? ;)
1. Не помню точную ссылку.
2. Думал, что тебе будет самому приятно её дать.
 ;D