dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

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

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

AlexV вне форума Вставить имя

Есть у нас популярная тема: Научите лиспу на примере (или как 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 возникающих вопросов..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
Просмотров: 84610
 
Непрочитано 31.07.2015, 12:57
#221
trir


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


устарели уроки :=(
trir вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 31.07.2015, 13:15
#222
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 4,954


Цитата:
Сообщение от trir Посмотреть сообщение
устарели уроки :=(
Ну Бушман Андрей предлагал в свое время выпустить книгу по Net Api. Споткнулось, как обычно-на финансировании проекта. В конечном итоге это все вылилось в фрагменты книги Полещука Н.Н. "Программирование для AutoCAD 2013-2015". Есть еще книга на английском как раз про VB.NET 2010 года - но купить в России ее невозможно сейчас, скачать - одни фейки.
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 31.07.2015, 19:18
#223
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 349


Цитата:
Сообщение от Boxa Посмотреть сообщение
забыл подключить AcCoreMgd.dll (важно для 2013 и выше)
(http://help.autodesk.com/view/ACD/20...8-E00ED139E0D3
http://bushman-andrey.blogspot.ru/20...ms-visual.html
)
Огромное спасибо! Все получилось! Пример рабочего кода надеюсь можно не выкладывать..
art_rrc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.05.2018, 21:40
#224
kurstep


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


Есть код на VBA:
Код:
[Выделить все]
 Option Explicit

Sub SelectAllButLayer()
    Dim oSset As AcadSelectionSet
    With ThisDrawing.SelectionSets
        While .Count > 0
            .Item(0).Delete
        Wend
        Set oSset = .Add("$Allbutthislayer$")
    End With
    Dim fcode(0 To 2) As Integer
    Dim fvalue(0 To 2) As Variant
    Dim dxfCode, dxfValue
    fcode(0) = -4: fvalue(0) = "<not"
    fcode(1) = 8: fvalue(1) = InputBox(vbCrLf & "Enter layer name:", "Layer")
    fcode(2) = -4: fvalue(2) = "not>"
    dxfCode = fcode: dxfValue = fvalue
    oSset.SelectOnScreen dxfCode, dxfValue
    MsgBox oSset.Count

End Sub
Конкретно интересует метод
Код:
[Выделить все]
 object.SelectOnScreen [FilterType, FilterData]
Подскажите кто знает, как решить такую же задачу на с#.net при подключении COM библиотеки (как решить через библиотеки .net знаю, интересует именно COM), просто не знаю как поступить с типом данных "вариант" - его нет в с#
kurstep вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.05.2018, 21:58
#225
Александр Ривилис

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


Цитата:
Сообщение от kurstep Посмотреть сообщение
просто не знаю как поступить с типом данных "вариант" - его нет в с#
Есть тип object, который подходит для этого случая:
Код:
[Выделить все]
 Int16[] FilterType = new Int16[1]; 
object[] FilterDate = new object[1];
FilterType[0] = 0;
FilterDate[0] = "TEXT";

Последний раз редактировалось Александр Ривилис, 23.05.2018 в 22:09.
Александр Ривилис вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.05.2018, 22:02
#226
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 4,954


и не забудьте про Releasing COM objects - сам C# это делать не будет автоматически.
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.05.2018, 10:57
#227
kurstep


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


Спасибо). Подскажите пожалуйста еще с одним вопросом.Раньше пользовался Lisp, вот решил освоить .net:
Есть у меня в чертеже объекты Project Studio, через лисп я легко добирался до свойств этих объектов таким образом:
Код:
[Выделить все]
 (vlax-get-property (vlax-ename->vla-object (car (entsel ))) '"Название свойства проекта полученное из ДАМПА" )
Как такое можно осуществить на .net -Начал я так, И нужно мне получить значение свойства "PsDiamReinf" :
Код:
[Выделить все]
  [CommandMethod("FilterArmObj")]
            public static void FilterRelational()
            {

                Document acDoc = Application.DocumentManager.MdiActiveDocument;
                Database acCurDb = acDoc.Database;
                // Get the current document editor
                Editor acDocEd = acDoc.Editor;

                // Create a TypedValue array to define the filter criteria
                TypedValue[] acTypValAr = new TypedValue[6];
                acTypValAr.SetValue(new TypedValue((int)DxfCode.Operator, "<or"), 0);
                acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "PS_RBAR"), 1);
                acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "PS_RBARX"), 2);
                acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "PS_RSEC"), 3);
                acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "PS_REINF"), 4);
                acTypValAr.SetValue(new TypedValue((int)DxfCode.Operator, "or>"), 5);

                // Assign the filter criteria to a SelectionFilter object
                SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);

                // Request for objects to be selected in the drawing area
                PromptSelectionResult acSSPrompt;

                // Старт транзакции
                using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
                {


                    acSSPrompt = acDocEd.GetSelection(acSelFtr);

                    // If the prompt status is OK, objects were selected
                    if (acSSPrompt.Status == PromptStatus.OK)
                    {
                        SelectionSet acSSet = acSSPrompt.Value;

                        /// Application.ShowAlertDialog("Number of objects selected: " +
                        ///   acSSet.Count.ToString());

                        //Перебор объектов в наборе
                        foreach (SelectedObject acSSObj in acSSet)
                        {
                            // Проверка, нужно убедится в правильности полученного объекта
                            if (acSSObj != null)
                            {  // Открытие объекта для записи
                                Entity acEnt = acTrans.GetObject(acSSObj.ObjectId,
                                                      OpenMode.ForRead) as Entity;
                                if (acEnt != null)
                                {
                                    //Доступ к свойствам

                                    object acadObj = acEnt.AcadObject;
                                    var props = TypeDescriptor.GetProperties(acadObj);
                               /////ЧТОТО ЗДЕСЬ НАДО НАПИСАТЬ ЧТОБ ПОЛУЧИТЬ ЗНАЧЕНИЯ НАПРИМЕР СВОЙСТВА "PsDiamReinf"???
 }

                            }
                        }
                    }


                    else
                    {
                        Application.ShowAlertDialog("Объекты не выбраны");
                    }



                    acTrans.Commit();
                }//Конец транзакции


            }
kurstep вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.05.2018, 10:03
#228
Boxa

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


Для начала, необходимо под отладчиком посмотреть, что у Вас находится в переменных acadObj и props.
А потом, можно почитать про System.Reflection; и посмотреть примеры получения списка свойств и методов объекта.
После этого, стане понятно, что нужно написать, для получения значений нужных свойств.
__________________
_бложиг
Boxa вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.05.2018, 12:35
#229
kurstep


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


Ну то есть это довольно проблематично... В таком случае наверно лучше все-таки использовать библиотеки COM?, как считаете?
kurstep вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.05.2018, 12:44
#230
trir


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


надо dll'ку соответсвующую подключить
trir вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.05.2018, 12:47
#231
kurstep


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


К сожалению библиотеки Project studio закрыты для доступа)
kurstep вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.05.2018, 15:12
#232
kurstep


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Для начала, необходимо под отладчиком посмотреть, что у Вас находится в переменных acadObj и props.
А потом, можно почитать про System.Reflection; и посмотреть примеры получения списка свойств и методов объекта.
После этого, стане понятно, что нужно написать, для получения значений нужных свойств.
Данные получил, подскажите пожалуйста, как теперь вытащить?, наверно ответ на поверхности но еще очень мало знаком с .net
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.JPG
Просмотров: 12
Размер:	81.5 Кб
ID:	202840  Нажмите на изображение для увеличения
Название: 222.JPG
Просмотров: 10
Размер:	247.6 Кб
ID:	202841  
kurstep вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.05.2018, 15:22
#233
Кулик Алексей aka kpblc
Moderator

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


Попробуй обратиться к свойству как к элементу коллекции - по имени. Правда, я далеко не уверен, что сработает.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.05.2018, 15:41
#234
Boxa

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


Если бы я не был бы уверен в статичности адресов (именно 33 объект в массиве содержит нужные данные), то для вытаскивания этих свойств воспользовался бы LINQ...
что то типа: var p = (from q in props where q.DisplayName == "PsDiam...." select q).firstOrDefault();
ЗЫ. строчку кода писал наобум по памяти, как там на самом деле смотрите в студии и в справке.
__________________
_бложиг
Boxa вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.05.2018, 15:49
#235
Кулик Алексей aka kpblc
Moderator

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


CollectionName.Item["RsDiamReinf"] - так нельзя?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.05.2018, 15:59
#236
kurstep


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
CollectionName.Item["RsDiamReinf"] - так нельзя?
Код:
[Выделить все]
 props.Item["RsDiamReinf"];
выдает ошибку, у props нет метода Item


У меня получилось так
Код:
[Выделить все]
  var t= props.Find("PsDiamReinf", false);
 var value=t.GetValue(acadObj);
kurstep вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.05.2018, 16:12
#237
Boxa

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
CollectionName.Item["RsDiamReinf"] - так нельзя?
=о) а так: CollectionName["RsDiamReinf"] ?
__________________
_бложиг
Boxa вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.05.2018, 16:15
#238
Кулик Алексей aka kpblc
Moderator

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


Boxa, ну извини - я капитально испорчен COM-моделью
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.05.2018, 16:19
#239
kurstep


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
а так: CollectionName["RsDiamReinf"] ?
Код:
[Выделить все]
 var t=props["PsDiamReinf"];
 var value = t.GetValue(acadObj);
Есть контакт, так работает))

Если в одну строчку то так):


Код:
[Выделить все]
 var value = TypeDescriptor.GetProperties(acadObj)["PsDiamReinf"].GetValue(acadObj)

Последний раз редактировалось kurstep, 28.05.2018 в 16:28.
kurstep вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 30.05.2018, 12:08
#240
Do$

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


Цитата:
Код:
[Выделить все]
 //Доступ к свойствам
object acadObj = acEnt.AcadObject;
var props = TypeDescriptor.GetProperties(acadObj);
 /////ЧТОТО ЗДЕСЬ НАДО НАПИСАТЬ ЧТОБ ПОЛУЧИТЬ ЗНАЧЕНИЯ НАПРИМЕР СВОЙСТВА "PsDiamReinf"???
А так не будет работать?
Код:
[Выделить все]
 dynamic acadObj = acEnt.AcadObject;
int psDiamReinf = acadObj.PsDiamReinf; // <= Здесь может быть и другой тип: int, short, long, byte. Надо смотреть в отладчике
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (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

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||