Реклама 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 возникающих вопросов..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
Просмотров: 121544
 
Непрочитано 19.08.2013, 17:19
#141
DEM

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


Олег (jr.)
ДЫк все таки по проще, VB вроде...
С Паскаля на него перейти не так уж и трудно, да и основные примеры по Роботу, с которым мне предстоит разбираться в основном на VB и VBA.
Правда вот прислали API СКАДа, там все на С++, но я так понимаю, потом это дело можно будет в отдельную dll запихнуть и пользоваться этим API с помошью VB.net.
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 19.08.2013, 17:42
#142
Олег (jr.)

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


Цитата:
Сообщение от DEM Посмотреть сообщение
ДЫк все таки по проще, VB вроде...
Если проще тогда стой на этом, я просто к слову, не предлагаю
Когда будешь переводить на VB.NET к примеру, реакции на события, типа
Doc.CommandWillstart+=...(Doc_CommandWillStart)
&&
Doc.CommandWillstart-=...(Doc_CommandWillStart)

в VB.NET это будет соответственно

AddHandler Doc.CommandWillStart, AddressOf(Doc_CommandWillStart)
&&
RemoveHandler Doc.CommandWillStart, AddressOf(Doc_CommandWillStart)

на всякий случай, кстати выражения на LINQ вообще не конвертируются,
тут только личный опыт и понимание синтаксиса
Олег (jr.) вне форума  
 
Непрочитано 19.08.2013, 17:44
#143
Boxa

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


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Это намек на то что лучше переходи на C#,
очень опытные программеры (не с этого форума)
настоятельно рекомендуют, я лично не могу однозначить
Читаю "Язык программирования C# 2005 и платформа .NET 2.0" и встречал там что разницы практически никакой, на уровне IL код и с VB.net и с C# одинаковый. Просто кому то нравятся скобочки, кому то слова. Каждый решает для себя сам. Зная VB.net поймешь код на C# и наоборот.

Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
на всякий случай, кстати выражения на LINQ вообще не конвертируются
Чегой то вдруг?
Миниатюры
Нажмите на изображение для увеличения
Название: f8f46cf464374737b42e3e79a9868eb6.png
Просмотров: 92
Размер:	73.9 Кб
ID:	110086  

Последний раз редактировалось Boxa, 19.08.2013 в 17:59.
Boxa вне форума  
 
Непрочитано 19.08.2013, 18:03
#144
DEM

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


Boxa
Кстати, ты то с API СКАДа не пытался случаем разобраться....
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 20.08.2013, 02:20
#145
Twenty


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


Тут тема, конечно, о VB.NET, но может, кто-то в курсе аналога строки
Код:
[Выделить все]
ToolbarButton1.SetBitmaps(Path.Combine(IconPath, IconName), Path.Combine(IconPath, IconName))
только на C#? Ничего подобного не подсвечивается в возможных вариантах после конкретной toolbarButton.
Twenty вне форума  
 
Непрочитано 20.08.2013, 09:54
#146
Олег (jr.)

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


Похоже не добавил в референсах:
Код:
[Выделить все]
using Autodesk.Windows;
using Autodesk.AutoCAD.Windows;
Проверь, писал по памяти
Олег (jr.) вне форума  
 
Непрочитано 21.08.2013, 15:00
#147
DEM

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


Странно, код работает...
Код:
[Выделить все]
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
    ' атрибут для указания имени команды
    Dim a(100, 100) As String
    <CommandMethod("Hel")> _
    Public Sub testFileOpen()
        Dim arrr_Na(50) As String
        Dim N As Integer
        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
            N = 0
            '' Перебор объектов в наборе
            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
                                    ' Задается путь и имя файла без разширения
                                    arr_block.Add(acBlock.ObjectId)
                                    N = N + 1
                                    arrr_Na(N) = arrr_Na(N) + blName
                                    a(N, 0) = blName
                                    If blr.HasAttributeDefinitions Then
                                        For Each idAtt As ObjectId In acBlock.AttributeCollection
                                            Dim obj As DBObject = acTrans.GetObject(idAtt, OpenMode.ForRead)
                                            If TypeOf obj Is AttributeReference Then
                                                Dim attRef As AttributeReference = CType(obj, AttributeReference)
                                                arrr_Na(N) = arrr_Na(N) + "|" + attRef.TextString
                                            End If
                                        Next
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            Next
            '' Сохранение нового объекта в базе данных
            acTrans.Commit()
            '' Очистка транзакции
            Dim i As Integer
            For i = 0 To N
                acDoc.Editor.WriteMessage(ControlChars.CrLf & arrr_Na(i))
            Next
        End Using
    End Sub
End Class
Добавляю ссылкой Эксель
добавляю Imports Microsoft.Office.Interop.Excel
И возникает ошибка...
Цитата:
Error 1 'Application' is ambiguous, imported from the namespaces or types 'Microsoft.Office.Interop.Excel, Autodesk.AutoCAD.ApplicationServices'.
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.

Последний раз редактировалось Кулик Алексей aka kpblc, 21.08.2013 в 15:47.
DEM вне форума  
 
Непрочитано 21.08.2013, 15:19
#148
Do$

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


Похоже, и там и там есть Application и компилятор не понимает, какой из них имеется в виду. Похожая ситуация возникает, если в одном месте сделать ссылки на пространства "Autodesk.AutoCAD.ApplicationServices" и "System.Windows.Forms"
VS же явно должна подчеркивать слово Application в 16-й строке. И по щелчку мыши должны предлагаться варианты подстановки пространств имен.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)

Последний раз редактировалось Do$, 21.08.2013 в 15:32.
Do$ вне форума  
 
Непрочитано 21.08.2013, 15:32
#149
DEM

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


ХММ, ну это я так и понял...
Сделал класс2, как мне теперь запустить его из класса 1..
Цитата:
Imports Microsoft.Office.Interop.Excel
Public Class Class2

Sub a()

Dim xlApp As Object
Dim Sheet As Object

Dim oldCI As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture

System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("en-US")

Try
xlApp = GetObject(, "Excel.Application")
Catch ex As Exception
xlApp = CreateObject("Excel.Application")
End Try

Sheet = xlApp.Workbooks(1).Worksheets(1)

Dim a, b, c As Integer

a = 1
b = 2
c = a + b

Sheet.Cells(1, 1).Value = c

System.Threading.Thread.CurrentThread.CurrentCulture = oldCI

End Sub

End Class
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 21.08.2013, 15:46
#150
Do$

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


Классы не запускаются, запускаются методы. Как это в VB сделать не подскажу, ищите примеры. Интуитивно предполагаю, что что-то типа "Class2.a", если в нем нет понятий статический и не статический класс/метод.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 21.08.2013, 15:49
#151
DEM

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Классы не запускаются, запускаются методы.

Цитата:
Как это в VB сделать не подскажу, ищите примеры
Ни за что бы не догадался...
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 21.08.2013, 15:49
#152
Кулик Алексей aka kpblc
Moderator

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


DEM, у тебя код не C++, на фига ставишь форматирование под другой язык? Это раз. Второе: касательно Application - я не знаю, в VB.NET есть понятие алиасов или нет. В C#, например, вполне допустима конструкция типа
Код:
[Выделить все]
using Autodesk.AutoCAD.ApplicationServices;

using AcAp = Autodesk.AutoCAD.ApplicationServices;
Третье: все же возьми книжку по VB.NET - благо их немеряно. Так "тыркаться" можно до посинения с минимальным эффектом.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.08.2013, 16:09
#153
Boxa

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Второе: касательно Application - я не знаю, в VB.NET есть понятие алиасов или нет. В C#, например, вполне допустима конструкция типа
Есть такое понтятие.
Код:
[Выделить все]
Imports Primeta = Autodesk.AutoCAD.ApplicationServices
А по поводу книжки, совет разумный, но мимо =)
Boxa вне форума  
 
Непрочитано 21.08.2013, 16:37
#154
DEM

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


Boxa
Книгу узе в метро читаю...
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 21.08.2013, 18:39
#155
Олег (jr.)

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


удалено

Последний раз редактировалось Олег (jr.), 22.08.2013 в 00:58.
Олег (jr.) вне форума  
 
Непрочитано 21.08.2013, 21:46
#156
DEM

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


Олег (jr.)
Пасиб!
Завтра утром, качну..
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 21.08.2013, 23:00
#157
Олег (jr.)

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


удалено

Последний раз редактировалось Олег (jr.), 22.08.2013 в 00:58.
Олег (jr.) вне форума  
 
Непрочитано 21.08.2013, 23:27
#158
DEM

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


дык ссылка то на облако, все нормуль, скачал уже.
Еще раз огромное спасибо...
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 23.08.2013, 17:18
#159
DEM

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


Чей то я тут заплутал..
Ни как не могу из модальной формы(кнопка1) запустить метод класса2 at()

В принципе я уже нашел как можно сделать...
Можно будет с помощью класса создать команды в автокаде, но все основные операции, будут выполняться в модуле...
Форма так же будет использоваться только для вызова "команд" из модуля....
Вложения
Тип файла: zip Lab1_Complete.zip (117.9 Кб, 46 просмотров)
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 23.08.2013, 18:11
#160
Do$

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


Думаю, проще всего тут будет перенести метод "at" в класс формы. С классом Class1 (или Class2??) он никак не связан.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
Ответ
Вернуться   Форум 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