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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > "VB.net для чайников". Вопросы программирования под Autocad и ©.

"VB.net для чайников". Вопросы программирования под Autocad и ©.

Ответ
Поиск в этой теме
Непрочитано 13.12.2010, 10:58
"VB.net для чайников". Вопросы программирования под Autocad и ©.
AlexV
 
Инженер
 
С-Пб
Регистрация: 02.10.2008
Сообщений: 3,685

Есть у нас популярная тема: Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) .. Есть, конечно, и это и, но хотелось бы иметь аналогичную возможность задавать тупые (для начала очень тупые) вопросы по VB.Net здесь..
Простейший пример из ссылки в теме про миграцию VBA - Net посмотрел..
Имеем проект - "библиотеку классов", с подключенными ссылками (на рисунке).



Имеем код, который при загрузке построенной dll-ки "добавляет" в автокад команду mAddPnt, создающую точку..
Код:
[Выделить все]
Imports Autodesk.AutoCAD.Interop
Imports Autodesk.AutoCAD.Interop.Common
Public Class AdskCom
    Public ReadOnly Property ThisDrawing() As AcadDocument
        Get
            Return Autodesk.AutoCAD _
            .ApplicationServices.Application. _
            DocumentManager.MdiActiveDocument. _
            AcadDocument
        End Get
    End Property
    <Autodesk.AutoCAD.Runtime.CommandMethod("mAddPnt")> _
    Public Sub mAddPnt()
        On Error Resume Next
        Dim location(0 To 2) As Double
        location(0) = 5.0# : location(1) = 5.0# : location(2) = 0.0#
        location = ThisDrawing.Utility.GetPoint(, "Укажите точку")
        ThisDrawing.ModelSpace.AddPoint(location)
    End Sub
End Class
Возникают следующие вопросы:
1. Строки "Imports Autodesk.AutoCAD.Interop" импортируют в проект соответствующие "пространства имен" - объектные модели, позволяя использовать их в проекте.. На вкладке "Ссылки" есть также список "Импортированные пространства имен"; - "галочка" на соответствующей библиотеке - аналогична ли строке "Imports Autodesk...." и если да то в чем разница?

2. Как быть с импортом библиотек, если предполагается использовать программу и под 64, и под 32 бит?

3. В проект библиотеки классов возможно добавлять формы. Каким образом эту самую "Form1" вызвать на экран? Методом тыка попробовал в "Public Sub mAddPnt()" влепить строку "Form1.ActiveForm.Activate()", но эта единственное, к чему она приводит, - к вылету автокада с фатал эррором..

4. Нижележащая процедура позволяет получить список установленных языков и замечательно работает в приложениях "Windows Forms". Свойство ".InputLanguage" принадлежит пространству имен "System.Windows.Forms". Возможно ли применить его в случае моего кода?
Может, надо импортировать эти самые пространства в проект..
Код:
[Выделить все]
 Public Sub GetLanguages()
    ' Gets the list of installed languages.
    Dim lang As InputLanguage
    For Each lang In  InputLanguage.InstalledInputLanguages
        textBox1.Text &= lang.Culture.EnglishName & ControlChars.Cr
    Next lang
End Sub 'GetLanguages
5. Строка
<Autodesk.AutoCAD.Runtime.CommandMethod("mAddPnt")> _
"создает" новую команду, при введении имени которой в комстроке автокада выполняется процедура mAddPnt. А как создать процедуру, которая должна реагировать на события приложения Acad-а, - некий аналог "AcadDocument_BeginCommand(ByVal CommandName As String)" в VBA?

6. Код снизу дает возможность использовать привычную объектную модель ThisDrawing... А возможно ли аналогично использовать объектную модель ASD при подключенных его библиотеках?
Код:
[Выделить все]
Public ReadOnly Property ThisDrawing() As AcadDocument
        Get
            Return Autodesk.AutoCAD _
            .ApplicationServices.Application. _
            DocumentManager.MdiActiveDocument. _
            AcadDocument
        End Get
    End Property
вот первые 6 из примерно 1000 возникающих вопросов..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
Просмотров: 121555
 
Непрочитано 15.12.2010, 09:58
#41
Александр Ривилис

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


Цитата:
Сообщение от Vildar Посмотреть сообщение
Т.е. вместо того, чтобы строить в базе временные примитивы для каких-то вспомогательных вычислений
Именно. Кстати, если уж и строить временные объекты, то для вспомогательных вычислений их совсем не обязательно помещать базу чертежа, а просто по окончании вычислений вызывать для них метод Dispose() - чтобы избежать утечки памяти. У объектов классов геометрической библиотеки больше средств, чем у объектов классов примитивов, но требуются дополнительные действия для создания таких геометрических объектов на основе данных примитивов. Например, на основе примитива сплайн не так просто получить его геометрическое представление. Например чтобы замкнуть сплайн, нужен такой код: http://www.caduser.ru/forum/index.ph...#message125061
Цитата:
Сообщение от Vildar Посмотреть сообщение
На родителей забыл поглядеть
А родителей у него масса и масса переопределенных методов.
Александр Ривилис вне форума  
 
Непрочитано 15.12.2010, 10:22
#42
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Мамма Миа, Кергуду!
Спасибо. Ушел в себя, приду не скоро.
Vildar вне форума  
 
Непрочитано 17.12.2010, 16:34
#43
Лиспер


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


В чертеже имеются объекты СПДС GraphiCS с именами типа "spdsNotePosition". Лиспом выбрать только такие объекты невозможно в принципе. Попробовал через .NET примерно таким вариантом:
Код:
[Выделить все]
    [CommandMethod("dwg_filter2")]
    public static void dwgFilter2()
    {
      Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor;
      TypedValue[] dwgTypeValue = new TypedValue[1];
      dwgTypeValue.SetValue(new TypedValue(0, "spdsNotePosition"), 0);
      SelectionFilter dwgSelFilter = new SelectionFilter(dwgTypeValue);
      PromptSelectionOptions prOpt = new PromptSelectionOptions();
      prOpt.MessageForAdding = "Выберите узловые отметки СПДС <Отмена> : ";
      PromptSelectionResult prRes = ed.GetSelection(prOpt, dwgSelFilter);
      if (prRes.Status == PromptStatus.OK)
      {
        SelectionSet selset = prRes.Value;
        AcAp.Application.ShowAlertDialog(selset.Count.ToString());
      }
    }
Тоже получил отлуп. А можно ли вообще выбрать объекты СПДС не через ObjectARX?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 17.12.2010, 16:49
#44
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Цитата:
Сообщение от Лиспер Посмотреть сообщение
В чертеже имеются объекты СПДС GraphiCS с именами типа "spdsNotePosition". Лиспом выбрать только такие объекты невозможно в принципе. Попробовал через .NET примерно таким вариантом..
Тоже получил отлуп. А можно ли вообще выбрать объекты СПДС не через ObjectARX?
Ну, насчет "Лиспом невозможно в принципе..", - Kpblc до них как-то лиспом добирался..
Посмотри вот это..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 17.12.2010, 16:57
#45
Лиспер


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


Я имел в виду не "добраться до свойств объекта", а "выбрать объекты по аналогии с (ssget) или SelectByWindow (кажется, в VBA это так именуется).
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 17.12.2010, 17:52
#46
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Лиспер,
Как я думаю.
Незнаю как выбрать сразу через select с фильтром по spdsNotePosition.
Но можно в лоб. Перебрать объекты (или в наборе или во всем чертеже), и отобрать нужные вручую.
0. Открыть объект для чтения.
1. Проверить у объектов RXClass.DXFName = "spdsNotePosition". RXClass получить методом GetRXClass().
2. Profit.

Возможно это не самый оптимальный вариант. Все не знгаю.

Про лисп. Есть такая тема:
Выбор узловых выносок СПДС (SpdsNoteKnot) по образцу текущей выделенной.
http://forum.dwg.ru/showthread.php?t=27273
Там Крыс вопрос решил.

Последний раз редактировалось Vildar, 17.12.2010 в 18:06.
Vildar вне форума  
 
Непрочитано 17.12.2010, 20:52
#47
Кулик Алексей aka kpblc
Moderator

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


Ха, решил! Насколько я помню, там как раз и шел выбор всех объектов с последующим исключением "не тех". Именно лобовое решение...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.12.2010, 11:03
#48
Лиспер


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


Возник у меня тут вопрос по получению ключа в реестре, связанного с текущим AutoCAD (наподобие лиспового vlax-product-key). Решение-то я нашел:
Код:
[Выделить все]
Autodesk.AutoCAD.Runtime.SystemObjects.DynamicLinker.ProductKey
И проблема в другом. Начал читать про DynamicLinker и как-то не очень понял его сути. Что такое реакторы DynamicLinker? Что такое сервисы, регистрируемые им (если я правильно перевел документацию)? Зачем эти вещи вообще могут понадобиться?
Прошу прощения за тупые вопросы, но пока ответов на них я не нашел...
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 20.12.2010, 12:00
#49
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Лиспер, я не знаю.
Вот пример получения ключа текущего акада, взято отсюда http://through-the-interface.typepad...20a8c2933c970b
private static string GetAutoCADKey()

{

// Start by getting the CurrentUser location



RegistryKey hive = Registry.CurrentUser;



// Open the main AutoCAD key



RegistryKey ack =

hive.OpenSubKey(

"Software\\Autodesk\\AutoCAD"

);

using (ack)

{

// Get the current major version and its key



string ver = ack.GetValue("CurVer") as string;

if (ver == null)

{

return "";

}

else

{

RegistryKey verk = ack.OpenSubKey(ver);

using (verk)

{

// Get the vertical/language version and its key



string lng = verk.GetValue("CurVer") as string;

if (lng == null)

{

return "";

}

else

{

RegistryKey lngk = verk.OpenSubKey(lng);

using (lngk)

{

// And finally return the path to the key,

// without the hive prefix



return lngk.Name.Substring(hive.Name.Length + 1);

}

}

}

}

}

}
Vildar вне форума  
 
Непрочитано 20.12.2010, 13:10
#50
Александр Ривилис

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Прошу прощения за тупые вопросы, но пока ответов на них я не нашел...
Вопросы совсем не тупые. Но для того, чтобы с ними разобраться нужно лезть не в ObjectARX .NET, а в чистый ObjectARX. Точнее в его документацию.
Александр Ривилис вне форума  
 
Непрочитано 20.12.2010, 13:26
#51
Лиспер


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


Vildar, лезьть в реестр бесполезно и немного даже вредно. Если работа выполняется, например, в AutoCAD 2008, а потом был открыт и закрыт, к примеру, AutoCAD MEP 2011, то в ключе "CurVer" будет далеко не то значение, которое ожидаешь.
Александр Ривилис, я в общем-то и старался там почитать, но как-то с трудом доходит. Я правильно подозреваю, что этот класс на самом деле один из определяющих, позволяет загружать и выгружать arx-модули, именно он устанавливает и снимает блокировку документа? И грузится он в .NET-сборки через строку using Autodesk.AutoCAD.Runtime ?
Хотя вопросы из #48 все еще остались: что такое и зачем нужны реакторы AcRxDynamicLinker?
А то пока у меня получается как у Лемма: "Сепульки - используются в сепулькарии (см. сепулькарий)"; "Сепулькарий - место для сепуления"; "Сепуление - процесс использования сепулек" или наподобие того...
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 20.12.2010, 13:54
#52
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Offtop: Похоже скоро Лиспер сменит ник на Дотнетчик
В DotNet нет такого понятия, как "реакторы", есть события (events).
Arx-модули грузятся методом статического класса Application:
Код:
[Выделить все]
using acad = Autodesk.AutoCAD.ApplicationServices.Application;
...
((AcadApplication)acad.AcadApplication).LoadArx(file);
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 20.12.2010, 13:58
#53
Лиспер


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


hwd, хотелось бы, да нескоро это будет (если будет вообще )
Я тупо перевел документацию:
Цитата:
AcRxDynamicLinker Notification Functions
addReactor
removeReactor
<...>
AcRxDynamicLinker::addReactor Function
Код:
[Выделить все]
virtual void addReactor(AcRxDLinkerReactor* newReactor) = 0;
newReactor Input pointer to reactor object to be added to the reactor list

This function adds the reactor object pointed to by newReactor to the dynamic linker's reactor list. newReactor must point to an object of a class derived from the AcRxDLinkerReactor class.
<...>
AcRxDynamicLinker::removeReactor Function
Код:
[Выделить все]
virtual void removeReactor(AcRxDLinkerReactor* oldReactor) = 0;
oldReactor Reactor object to be removed from the reactor list

This function removes the reactor object pointed to by oldReactor from the dynamic linker's reactor list.
Но полный смысл прочитанного ускользает...
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 20.12.2010, 14:05
#54
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Я тупо перевел документацию:
Но полный смысл прочитанного ускользает...
Да вроде в общих чертах понятно. О классе AcRxDLinkerReactor тоже уже прочитали?

Чем обусловлен интерес к AcRxDynamicLinker (какая задача решается)?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 20.12.2010, 14:08
#55
Александр Ривилис

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Я правильно подозреваю, что этот класс на самом деле один из определяющих, позволяет загружать и выгружать arx-модули
Правильно понимаешь. DynamicLinker.LoadApp и DynamicLinker.LoadModule позволяют загрузить, а DynamicLinker.UnloadApp и DynamicLinker.UnloadModule позволяют выгрузить arx/dbx-файл.
Цитата:
Сообщение от Лиспер Посмотреть сообщение
именно он устанавливает и снимает блокировку документа?
Нет. К блокировке документа этот класс никакого отношения не имеет. За блокировку документа отвечает класс DocumentLock из пространства имен Autodesk.AutoCAD.ApplicationServices (в ObjectARX это AcAp).
Цитата:
Сообщение от Лиспер Посмотреть сообщение
И грузится он в .NET-сборки через строку using Autodesk.AutoCAD.Runtime ?
Он никуда этой строкой не грузится. Просто дает возможность использовать его классы и методы без указания "полного пути" Autodesk.AutoCAD.Runtime...
Александр Ривилис вне форума  
 
Непрочитано 20.12.2010, 14:16
#56
Лиспер


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


Цитата:
Сообщение от hwd Посмотреть сообщение
Чем обусловлен интерес к AcRxDynamicLinker (какая задача решается)?
Интерес обусловлен абсолютным незнанием, наверное... Про класс AcRxDLinkerReactor читал, спасибо Я думаю - как событие / реактор не называй, суть его от этого не меняется. Или я заблуждаюсь? Если да, то в чем (конечно, если это не требует развернутого трактата)?
Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
К блокировке документа этот класс никакого отношения не имеет
Ясно, спасибо. А вот как быть с блокировкой приложения? Если блокировку документа я еще как-то способен осознать, то зачем блокировать приложение - пока мимо... Максимум - это модальные окна и сообщения.
P.S. Да, с загрузкой я сильно погорячился Спасибо за исправление
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 20.12.2010, 14:23
#57
Александр Ривилис

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Если блокировку документа я еще как-то способен осознать, то зачем блокировать приложение - пока мимо...
Для того, чтобы его нельзя было выгрузить из AutoCAD. Как пример, мою программу GeomProps нельзя выгружать из AutoCAD после того как она уже в него загружена. Если выгрузить - аварийно завершится AutoCAD при открытой панели свойств. Пока я этого не сделал, но наверное добавлю блокировку от выгрузки.
Цитата:
Сообщение от Лиспер Посмотреть сообщение
Я думаю - как событие / реактор не называй
В терминах AutoCAD и ObjectARX - это реактор, в терминах .NET - события.
Александр Ривилис вне форума  
 
Непрочитано 20.12.2010, 14:24
#58
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


>Лиспер рекомендую сначала изучить сам DotNet и только после этого пытаться писать на нём в AutoCAD. Тогда вопросы типа
Цитата:
И грузится он в .NET-сборки через строку using Autodesk.AutoCAD.Runtime ?
отвалятся при изучении азов .Net.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 20.12.2010, 14:29
#59
Лиспер


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


hwd, скажу честно - я пытался прочитать C++ Страуструпа (ведь типа основатель). Повесился разбиравшись. Шилдт в этом смысле намного более понятен. Но дело не в этом. А в том, что на моем уровне пытаться сейчас читать .NET - значит гарантированно им не заниматься. Закопаюсь в теории и никогда не приступлю к практике...
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 20.12.2010, 14:50
#60
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Лиспер, про curver, согласен с твоим замечанием.

Цитата:
Сообщение от Лиспер Посмотреть сообщение
Но дело не в этом. А в том, что на моем уровне пытаться сейчас читать .NET - значит гарантированно им не заниматься. Закопаюсь в теории и никогда не приступлю к практике...
Согласен наполовину. Сам завяз в теории. И ни теорию хорошо не знаю, ни писать в акаде.
Но, пытаться писать, без знания синтаксиса и ключевых слов и понятий NET, это по-моему безумие.

Offtop: Хотя, есть положительный пример твоему утверждению - Modis. Он все одновременно делал. Первым делом справшивал на форуме, потом писал, а уж потом читал. Шутка. Надо у него самого спросить, про опыт освоения NET.
Vildar вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > "VB.net для чайников". Вопросы программирования под Autocad и ©.

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
Ноутбук б/у и AutoCad 2D - вопросы Elenka AutoCAD 14 23.12.2005 13:47
Ноутбук б/у и AutoCad 2D - вопросы Elenka AutoCAD 1 20.12.2005 21:33
AUTOCAD 2006 Aragorn AutoCAD 14 01.04.2005 00:55
Что нового в AutoCAD 2005 ilka_t AutoCAD 40 19.05.2004 16:48