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

Вернуться   Форум 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
 
Непрочитано 19.08.2013, 14:53
#121
swell{d}

гадание на конечно-элементной гуще
 
Регистрация: 31.05.2006
Düsseldorf
Сообщений: 7,604


Цитата:
Сообщение от Boxa Посмотреть сообщение
И все это внутри нанокада.
ну я ж чайник. в экселе я умею, а формы создавать - не умею. да и эксель намного универсальнее любой формы, как мне кажется.
+ в экселе есть какая-никакая среда разработки (отладчики всякие и т.п.), а как писать под нано без VS я хз.
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Непрочитано 19.08.2013, 14:58
#122
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Цитата:
Сообщение от Boxa Посмотреть сообщение
а что это?
А эта хрень появилась в 2013 Автогаде...
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 19.08.2013, 15:22
#123
Do$

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


Цитата:
Сообщение от DEM Посмотреть сообщение
Do$
Тогда может программно разбивать эти объекты, а потом востанавливать?
В этом нет необходимости. Это даже посложнее будет, чем показанные способы.
Пробовали блок с атрибутами взрывать?
Do$ вне форума  
 
Непрочитано 19.08.2013, 15:26
#124
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от swell{d} Посмотреть сообщение
ну я ж чайник. в экселе я умею, а формы создавать - не умею. да и эксель намного универсальнее любой формы, как мне кажется.
+ в экселе есть какая-никакая среда разработки (отладчики всякие и т.п.), а как писать под нано без VS я хз.
НУ насколько я понимаю, у тебя в определенных ячейках нужные параметры, то же самое в форме...
А чем VS Express не нравится, бесплатно и очень удобно.

На тему окошек, посмотри видео вот тут: http://through-the-interface.typepad...introduct.html
и с поправкой на эту информацию (http://habrahabr.ru/company/nanosoft/blog/188188/) думаю все получится.
Boxa вне форума  
 
Непрочитано 19.08.2013, 15:32
#125
hwd

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


Цитата:
Сообщение от Boxa Посмотреть сообщение
и с поправкой на эту информацию (http://habrahabr.ru/company/nanosoft/blog/188188/) думаю все получится.
По указанной ссылке, в комментариях - поправка на поправку...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 19.08.2013, 15:37
#126
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


ХМММ
acBlock.AttributeCollection.Count - возвращает количество атрибутов блока
Соответственно acBlock.AttributeCollection.Item(1) по хорошему должен выдавать значение 1-го атрибута...
Чей то туплю похоже...
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 19.08.2013, 15:42
#127
hwd

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


Цитата:
Сообщение от DEM
Чей то туплю похоже...
Однозначно. В C-подобных языках (C\C++\C#) индексация начинается с 0.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 19.08.2013, 15:45
#128
AlexV

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


Цитата:
Сообщение от DEM Посмотреть сообщение
А эта хрень появилась в 2013 Автогаде...
в 2012..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 19.08.2013, 15:46
#129
swell{d}

гадание на конечно-элементной гуще
 
Регистрация: 31.05.2006
Düsseldorf
Сообщений: 7,604


Цитата:
Сообщение от Boxa Посмотреть сообщение
А чем VS Express не нравится
я ж тебе писал =) тем, что на мой 40gb ssd он отказался ставиться даже при наличии практически пустого 1Tb диска D
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Непрочитано 19.08.2013, 15:51
#130
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


hwd
Дык ставлю 0, не компилируется, пишет ошибку...
Типа значение должно быть Integer
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 19.08.2013, 15:55
#131
hwd

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


@DEM,
Код и полное сообщение об ошибке.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 19.08.2013, 16:06
#132
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Цитата:
Сообщение от hwd Посмотреть сообщение
@DEM,
Код и полное сообщение об ошибке.
Дык код Boxa выкладывал, я его пробую редактирую и т.д.
Код:
[Выделить все]
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.DataExtraction

Public Class Class1
    ' атрибут для указания имени команды
    <CommandMethod("Hel")> _
    Public Sub testFileOpen()
        Dim arr_block As New ObjectIdCollection
        Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
        Dim acCurDb As Database = acDoc.Database
        '' Старт транзакции
        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()

            '' Создание массива TypedValue для определение критериев фильтра
            Dim acTypValAr(0) As TypedValue
            'Выбираем только Блоки
            acTypValAr.SetValue(New TypedValue(DxfCode.Start, "INSERT"), 0)
            '' Назначение критериев фильтра объекту SelectionFilter
            Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
            '' Запрос выбора объектов в области чертежа
            Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection(acSelFtr)
            '' Если статус запроса равен OK, объекты выбраны
            If acSSPrompt.Status = PromptStatus.OK Then
            Else
                Exit Sub
            End If
            Dim acSSet As SelectionSet = acSSPrompt.Value
            '' Перебор объектов в наборе
            For Each acSSObj As SelectedObject In acSSet
                '' Проверка, нужно убедится в правильности полученного объекта
                If Not IsDBNull(acSSObj) Then
                    '' Открытие объекта для чтения
                    Dim acEnt As Entity = CType(acTrans.GetObject(acSSObj.ObjectId, _
                                                            OpenMode.ForRead), Entity)
                    If Not IsDBNull(acEnt) Then
                        If TypeOf acEnt Is BlockReference Then
                            Dim acBlock As BlockReference
                            acBlock = CType(acEnt, BlockReference)
                            Dim blName As String = acBlock.Name

                            'Проверяю является ли выделенный блок динамическим
                            If acBlock.IsDynamicBlock = True Then
                                'Получаю настоящие/родное имя динамического блока
                                Dim blr As BlockTableRecord = CType(acTrans.GetObject(acBlock.DynamicBlockTableRecord, _
                                                                                   OpenMode.ForRead), BlockTableRecord)
                                'Проверяю наличие аттрибутов
                                If blr.HasAttributeDefinitions Then
                                    'Если все условия соблюдены, добавляю блок в коллекцию
                                    Dim blr_nam As BlockTableRecord = CType(acTrans.GetObject(blr.ObjectId, _
                                                                                      OpenMode.ForRead), BlockTableRecord)
                                    Dim acBlock_nam As String = blr_nam.Name



                                    Select Case acBlock_nam.ToUpper
                                        Case "Block_1".ToUpper
                                            ' Задается путь и имя файла без разширения
                                            arr_block.Add(acBlock.ObjectId)
                                            acDoc.Editor.WriteMessage(ControlChars.CrLf & acBlock.AttributeCollection.Count)


                                        Case "Block_2".ToUpper
                                            arr_block.Add(acBlock.ObjectId)
                                        Case Else
                                            If InStr(acBlock_nam.ToUpper, "Block_".ToUpper, CompareMethod.Text) Then
                                                acDoc.Editor.WriteMessage(ControlChars.CrLf & "В выборке имеется блок не обрабатываеый данной версией программы! ")
                                                acDoc.Editor.WriteMessage(ControlChars.CrLf & "Данные в этом блоке будут ПРОИГНОРИРОВАНЫ!! ")
                                            End If
                                    End Select
                                End If
                            End If
                        End If
                    End If
                End If
            Next
            '' Сохранение нового объекта в базе данных
            acTrans.Commit()
            '' Очистка транзакции
        End Using

    End Sub


End Class
Смотрю разбираюсь в структуре и сиртаксисе....
Хочу сделать следующее, создать массив с информацией о блоках(атрибуты,), а потом его уже обрабатывать, подсчитывать количество и т.п.
Потом экспортировать в эксель....
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 19.08.2013, 16:08
#133
hwd

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


Это VBA.NET. Возможно там индексация начинается и не с нуля - тут я не в курсе. Но ты можешь посмотреть в отладчике, там напротив каждой записи будет стоять её индекс.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 19.08.2013 в 16:13.
hwd вне форума  
 
Непрочитано 19.08.2013, 16:14
#134
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от DEM Посмотреть сообщение
ХМММ
acBlock.AttributeCollection.Count - возвращает количество атрибутов блока
Соответственно acBlock.AttributeCollection.Item(1) по хорошему должен выдавать значение 1-го атрибута...
Чей то туплю похоже...
Не должен. Там по дурацки сделано, acBlock.AttributeCollection.Count это общее количество атрибутов от единицы и далее.
а вот последний атрибут имеет адрес (acBlock.AttributeCollection.Count-1), так что если у тебя один атрибут, то количество будет 1, а вот порядковый номер = 0 И я сильно сомневаюсь что у тебя много атрибутов в блоке, по этому вариант с перебором хоть и не самый быстрый, но самый наглядный и понятный. К тому же редактируя блок порядковый номер может и сбиться...
Boxa вне форума  
 
Непрочитано 19.08.2013, 16:23
#135
hwd

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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Там по дурацки сделано
Это не "по дурацки". Причина в том, что указатель на массив содержит адрес первого элемента. Смещение указателя на очередной элемент массива выполняется либо инкрементацией самого указателя, либо его индексацией. В случае индексации число, указываемое в качестве индекса, обозначает позицию элемента массива относительно первого элемента (смещение). Т.о. нулевой индекс указывает на первый элемент массива (т.е. нулевое смещение). Это если в VBA.NET индексация начинается так же с нуля...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 19.08.2013, 16:36
#136
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Boxa
ХМММ чей то не получается
acDoc.Editor.WriteMessage(ControlChars.CrLf & acBlock.AttributeCollection.Item(0) )
Вывести в командную строку, грут это не строка...
А в в каком же качестве возвращаются значния acBlock.AttributeCollection.Item, если не в строковом,,,
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 19.08.2013, 16:43
#137
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от DEM Посмотреть сообщение
Вывести в командную строку, грут это не строка...
А в в каком же качестве возвращаются значния acBlock.AttributeCollection.Item, если не в строковом,,,
НУ ты на код то смотри, который тебе дают.
Код:
[Выделить все]
If blr.HasAttributeDefinitions Then
	For Each idAtt As ObjectId In acBlock.AttributeCollection
        'бла - бла -бла
        'acBlock.AttributeCollection.item(0) - это ObjectID атрибута.
        'соответственно дальше открываешь этот объект для чтения и читаешь значение или тег
        'Все это есть в коде в сообщении 120
	Next
End If
Boxa вне форума  
 
Непрочитано 19.08.2013, 16:51
#138
Олег (jr.)

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


Цитата:
Сообщение от DEM Посмотреть сообщение
acDoc.Editor.WriteMessage(ControlChars.CrLf & acBlock.AttributeCollection.Item(0)
чтобы редактор выводил записи независимо от типа объекта пиши всегда так

acDoc.Editor.WriteMessage(VbLf & "{0}" & acBlock.AttributeCollection.Item(0))

это равнозначно выражению

acDoc.Editor.WriteMessage(string.Format (VbLf & "(0}", мой объект как есть))

Например для точки:

Editor.WriteMessage(vblf & "{0:f3}", point1)

покажет значение точки с точностью 3 десятичных знака
Не забывай использовать указание на объект объявленный в начале
блока кода

dim ed as editor=doc.editor

и пиши далее

ed.writemessage(vblf + "{0}", " бла бла бла")
Олег (jr.) вне форума  
 
Непрочитано 19.08.2013, 17:03
#139
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Boxa
Угу все за работало....
Теперь буду создавать массив, а потом его обрабатывать.
Кстати вопрос по поводу
Цитата:
Это VBA.NET.
Хмм а чем этот код отличаектся от чистого VB.net
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 19.08.2013, 17:13
#140
Олег (jr.)

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


Цитата:
Сообщение от DEM Посмотреть сообщение
Кстати вопрос по поводу

Цитата:




Это VBA.NET.
Это намек на то что лучше переходи на C#,
очень опытные программеры (не с этого форума)
настоятельно рекомендуют, я лично не могу однозначить
Олег (jr.) вне форума  
Ответ
Вернуться   Форум 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