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

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

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

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

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


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


Ну, хотелось бы и по C# сюда же вопросы засовывать
AlexV, а зачем используешь Interop? Это ж обращение к acad.exe как внешнему приложению, как я понимаю. Попробуй сделать по-другому: обычным образом импортировать acdbmgd.dll и acmgd.dll и писать внутреннюю команду.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 13.12.2010, 12:43
#3
hwd

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


Цитата:
Сообщение от AlexV Посмотреть сообщение
1. Строки "Imports Autodesk.AutoCAD.Interop" импортируют в проект соответствующие "пространства имен" - объектные модели, позволяя использовать их в проекте.. На вкладке "Ссылки" есть также список "Импортированные пространства имен"; - "галочка" на соответствующей библиотеке - аналогична ли строке "Imports Autodesk...." и если да то в чем разница?
У вас в сообщении какая-то картинка-невидимка
Imports и "подключение библиотеки" - это совершенно разные вещи.
Imports используется для того, чтобы вам не набирать полное имя класса, с указаниями всех пространств имён.
Вы можете убрать все Imports и прописывать везде полные имена классов - ваш код будет работать.
Но если вы предварительно ("на вкладке Ссылки" (с)) не подключите библиотеку, то вам не поможет и наличие Imports - код работать не будет, поскольку библиотека не подключена.
Т.о. Imports добавляют для удобства написания кода, но обойтись можно и без неё.
Цитата:
Сообщение от AlexV Посмотреть сообщение
2. Как быть с импортом библиотек, если предполагается использовать программу и под 64, и под 32 бит?
Подключаете соответствующую версию AcDbMgd.dll и AcMgd.dll (х86 или х64). Исходный код останется почти тем же (но в ряде случаев вам могут потребоваться изменения, необходимость которых обусловлена разрядностью версии).
Цитата:
Сообщение от AlexV Посмотреть сообщение
3. В проект библиотеки классов возможно добавлять формы. Каким образом эту самую "Form1" вызвать на экран? Методом тыка попробовал в "Public Sub mAddPnt()" влепить строку "Form1.ActiveForm.Activate()", но эта единственное, к чему она приводит, - к вылету автокада с фатал эррором..
И правильно "вылетает" (с). Прежде чем хвататься использовать технологию WinForms, разберитесь с ней, хотя бы на начальном уровне. Информации на эту тему полно.
Цитата:
Сообщение от AlexV Посмотреть сообщение
4. Нижележащая процедура позволяет получить список установленных языков и замечательно работает в приложениях "Windows Forms". Свойство ".InputLanguage" принадлежит пространству имен "System.Windows.Forms". Возможно ли применить его в случае моего кода?
Вы изобретаете велосипед. Получение списка доступных локализаций, локализация ресурсов и интерфейса легко решается подходом, предложенным Майкрософт (я недавно показывал это в каком-то топике этой же ветки).
Цитата:
Сообщение от AlexV Посмотреть сообщение
5. Строка
<Autodesk.AutoCAD.Runtime.CommandMethod("mAddPnt")> _
"создает" новую команду, при введении имени которой в комстроке автокада выполняется процедура mAddPnt. А как создать процедуру, которая должна реагировать на события приложения Acad-а, - некий аналог "AcadDocument_BeginCommand(ByVal CommandName As String)" в VBA?
Вам сначала следует изучить азы дотнета, прежде чем садиться писать рабочие приложения. По данному вопросу вам нужно читать на тему делегатов и событий.
Цитата:
Сообщение от AlexV Посмотреть сообщение
6. Код снизу дает возможность использовать привычную объектную модель ThisDrawing... А возможно ли аналогично использовать объектную модель ASD при подключенных его библиотеках?
Код:
[Выделить все]
Public ReadOnly Property ThisDrawing() As AcadDocument
        Get
            Return Autodesk.AutoCAD _
            .ApplicationServices.Application. _
            DocumentManager.MdiActiveDocument. _
            AcadDocument
        End Get
    End Property
Этого вопроса я не понял. Что за "ASD"?
Цитата:
Сообщение от AlexV Посмотреть сообщение
вот первые 6 из примерно 1000 возникающих вопросов..
Если так, то я на них пожалуй отвечать не буду, т.к. не поощряю лень, и времени свободного у меня не вагон (Александр Ривилис более добрый на этот счёт, но и у него свободного времени не всегда море). Вам сначала нужно читать азы дотнета, тренироваться на обычных простеньких проектах (начните с консольных), затем определитесь с GUI: (WinForms/WPF) - потом это можно пришивать к автокаду.

По дотнету вопросы лучше задавать на дотнет-форумах, а не здесь. После того, как будете себя уверенно чувствовать в .нете - можно будет браться за автокад - т.е. шлёпать на этот форум.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 13.12.2010, 13:13
#4
AlexV

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


Цитата:
Сообщение от hwd Посмотреть сообщение
Если так, то я на них пожалуй отвечать не буду, т.к. не поощряю лень, и времени свободного у меня не вагон (Александр Ривилис более добрый на этот счёт, но и у него свободного времени не всегда море). Вам сначала нужно читать азы дотнета, тренироваться на обычных простеньких проектах (начните с консольных), затем определитесь с GUI: (WinForms/WPF) - потом это можно пришивать к автокаду. По дотнету вопросы лучше задавать на дотнет-форумах, а не здесь. После того, как будете себя уверенно чувствовать в .нете - можно будет браться за автокад - т.е. шлёпать на этот форум.
Да я понимаю, что разжевывать азы по нескольку раз начинающим - дело неинтересное и не благодарное. Я, тему создавая, расчитывал на две вещи: - во-первых, есть уже немало вчерашних чайников, которые хоть что-то знают и могут ответить на элементарные вопросы (в конце концов, в автокадовских топиках каждый вопрос про filedia найдет желающего ответить );
- и во-вторых, может кто-то в этой теме задаст более содержательные вопросы (на dwg.ru пока по технологии net информации не много).

Цитата:
Этого вопроса я не понял. Что за "ASD"?
AutoCAD Structural Detailing..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 13.12.2010, 13:16
#5
Лиспер


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


AlexV, лично я сначала бы с "чистым" кадом разобрался (кстати, точно так же, как и ты, я "подвис" на некоторых элементарных вещах). Насколько я понял, вертикальные решения позволяют просто обращаться к собственным объектам при условии импорта соответствующих библиотек.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 13.12.2010, 13:21
#6
hwd

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


>AlexV
Если вам это будет интересно - могу расшарить доступ на некоторые электронные книги по .net-технологиям (одни на русском, другие на английском). Линк на электронный мануал (английский) по .Net API AutoCAD у вас наверняка уже есть.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 13.12.2010, 13:22
#7
AlexV

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
AlexV, лично я сначала бы с "чистым" кадом разобрался (кстати, точно так же, как и ты, я "подвис" на некоторых элементарных вещах). Насколько я понял, вертикальные решения позволяют просто обращаться к собственным объектам при условии импорта соответствующих библиотек.
Да я понимаю, что надо бы разобраться.. Я, увы, не программист; так, - любитель; может и не замахивался бы на net, просто с переходом на 64-битные системы все накопившиеся vba-шные костыли либо совсем поломались, либо под них надо подставлять еще одни костыли.. Вот и пытаюсь с наскоку хоть что-нибудь начать на vb.net, не зарываясь глубоко в теорию (хотя и понимаю, что зарыться надо бы).. Честно говоря, и у VBA-шных моих проектов было только одно достоинство - они работали и делали то, что я от них хотел; сам же код заставил бы плеваться профессиональных программистов.

Цитата:
Если вам это будет интересно - могу расшарить доступ на некоторые электронные книги по .net-технологиям (одни на русском, другие на английском). Линк на электронный мануал (английский) по .Net API AutoCAD у вас наверняка уже есть.
hwd, заранее спасибо! (на русском желательно..)
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!

Последний раз редактировалось AlexV, 13.12.2010 в 13:28.
AlexV вне форума  
 
Непрочитано 13.12.2010, 14:14
#8
hwd

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


Цитата:
Сообщение от AlexV Посмотреть сообщение
hwd, заранее спасибо! (на русском желательно..)
До завтрашнего дня открываю доступ для возможности скачивания: тынц. Это из того, что сейчас есть под рукой... Вечером могу дома поискать на тему WinForms (если нет желания изучать WPF). Спецификацию по VB.Net я себе не искал, т.к. пишу на C#, но её можно найти в инете, например тут (нужно только версию смотреть, чтобы не старая была).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 13.12.2010 в 14:25.
hwd вне форума  
 
Автор темы   Непрочитано 13.12.2010, 14:24
#9
AlexV

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


Цитата:
Сообщение от hwd Посмотреть сообщение
До завтрашнего дня открываю доступ для возможности скачивания: тынц. Это из того, что сейчас есть под рукой...
Спасибо! Дома, если успею, скачаю!
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 13.12.2010, 14:30
#10
Vildar

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


AlexV, напиши каким ПО пользуешься, начиная с винды, NET, студии, акада, и прочее.

От идеологии ThisDrawing нужно отвыкать. И от com interop. Подклучай ссылки на net библиотеки акада (знаешь как, и знаешь какие, наверное уже).
Ссылка на активный документ, типа ThisDrawing на vba.
Код:
[Выделить все]
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
Примеры на c#. Но должно быть понятно.

По вопросам. В дополнение к ответам hwd.

1. Андрей разжевал хорошо.

2. Как в одном проекте это увязать, чтобы компилиось под х32 и х64, я хз. Но как-то же компилируют под разные операционки. Нужно матчасть осваивать.

3. Используй метод Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog(). Почему нужно делать так, я точно и не скажу. Действительно читать надо, начиная с того что такое приложение, процессы, ну и про запуск форм. Хорошобы кто-нибудь на пальцах объяснил.

4. Виндовые языки. Или локализацию акада. Уточни.

5. У класса Document есть событие CommandWillStart. На него нужно подписаться.

6. ASD 2011 дома стоит. Посмотрю вечером.

Какие книжки по NET есть, какие начал читать?
Да, и без msdn и не туды и не сюды.
Vildar вне форума  
 
Непрочитано 13.12.2010, 14:40
#11
hwd

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


Цитата:
Сообщение от Vildar Посмотреть сообщение
Но как-то же компилируют под разные операционки.
Как вариант - программно проверить разрядность и на основании этого выполнить тот или иной блок кода (if-else). Мне искать некогда, но при желании можно найти ответ Александра Ривилиса на тему того, как в автокаде определить его разрядность (проанализировав указатель). Тема была на кадюзере (если мне не изменяет память).
MSDN нужен однозначно - я его не упоминал, т.к. подразумевал по умолчанию
Проверить разрядность операционной системы можно разными способами (зависит от версии .NetFamework). Например в .NetFramework 4.0 появилась такая удобная возможность.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 13.12.2010, 15:23
#12
AlexV

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


Цитата:
Сообщение от Vildar Посмотреть сообщение
AlexV, напиши каким ПО пользуешься, начиная с винды, NET, студии, акада, и прочее.
Какие книжки по NET есть, какие начал читать?
Да, и без msdn и не туды и не сюды.
win 7 профессиональная 64 бит, VS2008 ("Microsoft Visual Basic 2008 Express Edition"); автокад 2010 - 2011, ASD 2011.
Книг по Net пока нет.. Заходил пару раз в Буквоед, но то "денег не було", то имевшееся в наличии не особо впечатлило (либо для начинающих, но слишком элементарно - на уровне "hello, word!", без реальных примеров. Либо на уровне справочника для профи.. Много есть уцененного по старым версиям VS.) Вобщем, будем искать!
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 13.12.2010, 15:27
#13
hwd

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


Цитата:
Сообщение от AlexV Посмотреть сообщение
win 7 профессиональная 64 бит, VS2008 ("Microsoft Visual Basic 2008 Express Edition"); автокад 2010 - 2011, ASD 2011.
Если AutoCAD 2011, то имхо лучше сразу использовать VS2010 и .Net 4.0 (не помню, можно ли под 2010 использовать .Net 4.0).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 13.12.2010, 15:42
#14
AlexV

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


Цитата:
Сообщение от hwd Посмотреть сообщение
Если AutoCAD 2011, то имхо лучше сразу использовать VS2010 и .Net 4.0 (не помню, можно ли под 2010 использовать .Net 4.0).
VS2010 вроде Express выпуска нет, только платные Professional..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 13.12.2010, 15:48
#15
hwd

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


>AlexV
А если не гадать, а спросить гугл?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 13.12.2010 в 15:55.
hwd вне форума  
 
Непрочитано 13.12.2010, 15:58
#16
Vildar

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


Цитата:
Сообщение от AlexV Посмотреть сообщение
win 7 профессиональная 64 бит
Ну все, я пас

Цитата:
Сообщение от AlexV Посмотреть сообщение
Microsoft Visual Basic 2008 Express Edition
че так?

Цитата:
Сообщение от AlexV Посмотреть сообщение
Вобщем, будем искать!
В эл.виде как грязи. Купи из серии для профессионалов, NET 3.5, или 4.

С языком тоже подумай. VB.NET после C# уже не перивариваю.

Цитата:
Сообщение от hwd Посмотреть сообщение
(не помню, можно ли под 2010 использовать .Net 4.0)
Попробовал, можно.
Vildar вне форума  
 
Непрочитано 13.12.2010, 16:05
#17
hwd

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


Цитата:
Сообщение от Vildar Посмотреть сообщение
Попробовал, можно.
Тогда тем более стоит юзать 4.0.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 13.12.2010, 16:19
#18
Vildar

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


На работе у всех NET 2.0 стоит
Vildar вне форума  
 
Непрочитано 13.12.2010, 16:25
#19
hwd

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


Цитата:
Сообщение от Vildar Посмотреть сообщение
На работе у всех NET 2.0 стоит
Offtop: Я с большой кровью добился, чтобы всем пользователям раскатали .Net 3.5 SP1 (теперь хоть LINQ можно использовать). Но устанавливать .Net 4.0 наотрез отказались - админы боятся "ада dll", не верят, что для .Net Framework этой проблемы не будет. Мне наложили VETO на установку его пользователям и на попытки поднятия этой темы средит IT-шников.

При установке AutoCAD 2009, автоматом накатывается .Net 3.0. Какая же у тебя версия AutoCAD, что фрэймворк только 2.0???
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 13.12.2010, 16:38
#20
Vildar

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


В нашем отделе у всех Autocad Architecture 2008. А вообще в институте, есть и 2009, не подумал.
Не поверишь, я задолбался просить обновления поставить на акады, на той неделе поставили.
Я с админами боле-менее дружу, но влиять на них не могу.
Цитата:
Сообщение от hwd Посмотреть сообщение
.Net 3.5 SP1 (теперь хоть LINQ можно использовать)
И wpf ты вроде юзал. Или как?
Vildar вне форума  
 
Непрочитано 13.12.2010, 16:46
#21
Александр Ривилис

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


Цитата:
Сообщение от Vildar Посмотреть сообщение
2. Как в одном проекте это увязать, чтобы компилиось под х32 и х64, я хз. Но как-то же компилируют под разные операционки. Нужно матчасть осваивать.
Устанавливаешь для проекта Platform target: Any CPU и будет грузится и в x86 и в x64. Нюансы могут возникнуть с функциями, вызываемыми через P/Invoke - там нужно определять разрядность AutoCAD (и своей сборки).
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 13.12.2010, 16:46
#22
AlexV

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


Цитата:
Сообщение от Vildar Посмотреть сообщение
С языком тоже подумай. VB.NET после C# уже не перивариваю.
Ну, не знаю.. Я VB.net - то пока могу проглотить (не то что переварить) разве что разжеванный кем-то, а ты предлагаешь мне замахнуться на Вильяма нашего Шекспира на Си нашего шарпа.. Тем более, если я не ошибаюсь, функционалы у них уже не сильно отличаются.
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 13.12.2010, 16:51
1 | #23
hwd

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


Цитата:
Сообщение от Vildar Посмотреть сообщение
Не поверишь, я задолбался просить обновления поставить на акады, на той неделе поставили.
Offtop: Работать в AutoCAD 2009 без SP3 - это жестоко... Без этого обновления и при работе с подшивками глюков хватает, и при самом черчении... На AutoCAD 2009 мы обязательно ставим SP3 (это даже не обсуждается).

Цитата:
Сообщение от Vildar Посмотреть сообщение
И wpf ты вроде юзал. Или как?
Offtop: WPF работает начиная с .Net 3.0 (т.е. для этого не обязательно ставить .Net 3.5 SP1). Но в 3.0 нет LINQ. Да, я использую WPF при построении пользовательского GUI. После WPF не могу смотреть на WinForms. Если использовать MVVM - получается вообще сказка: полное отделение интерфейса от кода - Весь интерфейс описан в виде XAML-разметки, не имея ни строчку кода. Можно менять GUI, не переписывая при этом ни строки кода. Такое разделение даёт возможность привлекать к работе дизайнеров, не разбирающихся в программировании, но имеющих богатую фантазию, с помощью которой они могут в том же MS Expression Blend нарисовать красивый GUI. Программист добавляет его в свой проект, не внося изменений в код и всё работает как часы.
Цитата:
Ну, не знаю.. Я VB.net - то пока могу проглотить (не то что переварить) разве что разжеванный кем-то, а ты предлагаешь мне замахнуться на Вильяма нашего Шекспира на Си нашего шарпа.. Тем более, если я не ошибаюсь, функционалы у них уже не сильно отличаются.
Когда-то я неслабо писал на VBA (написал в MS Access 2003 систему в которой взаимоувязаны документооборот, сметная программа, выполнение (формы КС-2, КС-3), заявки на материалы, заявки на механизмы, акты о перерасходах, журналы учёта выполненных работ и т.п. и т.д.). Сметы, КС-2 и КС-3 экспортировались в МС Ексель, с группировками столбцов, строк, с полной реализацией сложной паутины формул по всему документу, с ведомостями материалов и механизмов... Всё это циркулировало в сети, можно было проверить кто когда кому передал документ и на какой стадии он находился. В эту же систему была внедрена библиотека механизмов, материалов и работ, все расценки по сети отправлялись в отдел снабжения, где те проверялись и на каждую единицу измерения либо подтверждали расценку, либо ставили реальную (создваниваясь с поставщиками). Это дабы не сесть в лужу. Всё это контролировалось руководством (в этой же программе они ставили свою резолюцию, на основании которой программа давала дальнейший ход документтам)... Там много ещё чего было (позиции смет разносились по корпусам/ярусам/помещениям, для каждого из которых выводились (в планах было, чтобы это автоматом тянулось из автокада, но не успел это реализовать) такие данные как площади стен, пола, потолка... В общем система разрасталась, я был доволен, как кот, но... Я писал на VBA... Со временем начинал сталкиваться с ситуациями, которые не мог обойти. Например: в своём коде, в редакторе MS Access я точно знал строки, в которые нельзя было ставить курсор, иначе Аксесс сначала замерзал, на некоторое время, а потом осыпался в труху, вылетая с ошибкой, мол сорри, но я помер... Были и в графическом интерфейсе такие места, которые, к примеру, я знал, что при попытке изменить ширину TreeView в определённой форме, аксесс так же дох. Со временем таких артефактов насобиралось достаточно. Кроме того, количество пользователей системы разрасталось, а Аксесс не приветствует одновременное наличие подключений более чем 10 - начинает подтормаживать (об этом и в книгах пишут). В общем я решил сваливать с Аксесса, поскольку работать с чёрным ящиком, надеясь "авось не заглючит редактор кода или дизайнер форм" - не устраивало.
Начал думать, на какой язык/платформу переходить. С платформой определился быстро - решил перейти на .net, ибо самая мощная, удобная и т.п. Начал думать насчёт языка... Изначально планировал перейти на VB.Net, но посмотрев примеры, написанные на нём, понял, что на VBA он похож так же как собака на человека... Раз сходства нет, решил выбрать язык, наиболее популярный и удобный. Просмотрел литературу и увидел, что основная масса литературы по .Net написана на C#. Изначально такие слова как "С", "С++" и "С#" для меня были одинаково страшны, но почитав "C# для чайников" понял, что "С#" очень удобный и красивый язык. В то време VB.Net был слабее, чем C# (он и сейчас слабее, но MS обещает, что от версии к версии VB.Net будет подтягиваться к C# как элластичный жгут). В .Net 4.0 они по возможностям уже не сильно отличаются.
Т.о. Имхо - тому, кто писал на VBA, без разницы какой язык учить, ибо
мораль сей басни такова:
VB.Net имеет с VBA общего только первые две буквы (в прямом смысле), и более ничего.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 13.12.2010 в 17:21.
hwd вне форума  
 
Непрочитано 13.12.2010, 16:57
#24
Vildar

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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Устанавливаешь для проекта Platform target: Any CPU и будет грузится и в x86 и в x64.
Вы возможно не знаете всей глубины моего незнания. Я пока не собираюсь писать под х64. Просто любопытно. Ведь в ObjectARX2010 есть две папки inc-x64 и inc-win32, в обеих этих папках есть файлы acmgd.dll и acdbmgd.dll, я так понимаю они чем-то отличаются. Т.е. пишу под х32 вставляю ссылки из inc-win32, пишу под х64 вставляю - из inc-x64. А пишу сразу под обе платформы - на что ссылки вставлять, из обеих папок ведь не вствить ссылки, имена у файлов одинаковые.
Осознаю всю степень своего незнания. Мне особо пока не нужно. Алекс пущай мучается

hwd,
Пробовал wpf и blend. Очень круто. Но практически пока не могу применить. Опять же очень жаль.
Про MVVM не знал. Почитаю, спасиб.

AlexV,
Большая часть людей, котроые пишут под NET, используют C#. Я тебя не убеждаю. Просто советую

Последний раз редактировалось Vildar, 13.12.2010 в 17:19.
Vildar вне форума  
 
Непрочитано 13.12.2010, 17:47
#25
Meknotek

Проектирование заборов уже в прошлом
 
Регистрация: 29.10.2009
Рязань
Сообщений: 2,164


Цитата:
Сообщение от AlexV Посмотреть сообщение
Ну, не знаю.. Я VB.net - то пока могу проглотить (не то что переварить) разве что разжеванный кем-то, а ты предлагаешь мне замахнуться на Вильяма нашего Шекспира на Си нашего шарпа.. Тем более, если я не ошибаюсь, функционалы у них уже не сильно отличаются.
Я тебя тоже не убеждаю, но если ты VB.NET "со словарем" перевариваешь, то какая разница, что учить "со словарем"? Переходи на сторону С#
Meknotek вне форума  
 
Непрочитано 13.12.2010, 22:37
#26
Vildar

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


AlexV про ASD пока нечего сказать, не нашел его управляемых сборок. Он видимо по-другому сделан, в отличии от ACA. По F1 выдает справку только по Autocad 2011, а по ASD при запуске како-нибудь команды есть помощь, но там нет разделов по API. В ручную тоже не нашел.
Еще поковыряюсь, отпишусь.
Vildar вне форума  
 
Непрочитано 13.12.2010, 22:51
#27
Александр Ривилис

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


Цитата:
Сообщение от Vildar Посмотреть сообщение
Т.е. пишу под х32 вставляю ссылки из inc-win32, пишу под х64 вставляю - из inc-x64
Да собственно не важно, на что ссылаешься. Главное установить для них свойство CopyLocal=False. Это значит, что будут использоваться соответствующие файлы, загруженные в AutoCAD. А AutoCAD уж сам разберется, какие ему загружать.
Александр Ривилис вне форума  
 
Непрочитано 13.12.2010, 23:06
#28
Vildar

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


Александр Ривилис, не подумал про это. Сложновато без практики.

AlexV тебе именно нужно писать используя объекты ASD, или нет. Просто, может ты не вкурсе, обычные сборки acmgd.dll и acdbmgd.dll будут и в ASD работать.
У нас стоит ACA2008, но писать используя объекты AEC пока не приходилось. Но примеры видел, справку почитывал.
Уточни?

upd Есть куча сборок в папке ASD начинающихся с имени AmberCore.*.*.dll, может оно?

Последний раз редактировалось Vildar, 14.12.2010 в 00:11.
Vildar вне форума  
 
Автор темы   Непрочитано 14.12.2010, 00:09
#29
AlexV

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


Цитата:
Сообщение от Vildar Посмотреть сообщение
Александр Ривилис, не подумал про это. Сложновато без практики.
AlexV тебе именно нужно писать используя объекты ASD, или нет. Просто, может ты не вкурсе, обычные сборки acmgd.dll и acdbmgd.dll будут и в ASD работать.
У нас стоит ACA2008, но писать используя объекты AEC пока не приходилось. Но примеры видел, справку почитывал.
Уточни?
ACA - это что за зверь?
Да, я знаю, что обычные сборки автокада будут работать, ASD это ж не отдельно растущее дерево, а надстройка над автокадом. (я в VBA пытался его копать на своем уровне знаний..). Проблема получить доступ к объектной модели собственно ASD - модуля steel в частности. Я тупо подключал нужные библиотеки, получал объекты ASD из чертежа фильтром по их TypeName, объявлял переменные типов, принадлежащих asd-шной объектной модели, и передавал в них примитив ("Set ASDobj=AcadObj"), ну и получал доступ к части (очень небольшой) их свойств и методов. Понятно, что это "паллиативное решение", но большего я нарыть не сумел.
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 14.12.2010, 01:09
#30
Vildar

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


Цитата:
Сообщение от AlexV Посмотреть сообщение
ACA - это что за зверь?
Autocad Architecture. Писать очень длинно не охото.

Через com, можно и на NET действовать. Какие ты файлы подключал на vba? Их можно и в VB.NET подключить.
Но у ACA есть API, для NET, опять же наверно обертки над C++. И есть хелп по этому делу.
У акадовцев принято управляемые сборки (NET) обзывать *mgd*.dll. Но у ASD таких нету.
Vildar вне форума  
 
Автор темы   Непрочитано 14.12.2010, 09:04
#31
AlexV

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


Цитата:
Сообщение от Vildar Посмотреть сообщение
Через com, можно и на NET действовать. Какие ты файлы подключал на vba? Их можно и в VB.NET подключить.
Но у ACA есть API, для NET, опять же наверно обертки над C++. И есть хелп по этому делу.
У акадовцев принято управляемые сборки (NET) обзывать *mgd*.dll. Но у ASD таких нету.
Методом тыка нашел вот эти "референсы" ASD Steel:
C:\Program Files\Autodesk\AutoCAD Structural Detailing 2011\RBCSCommon.dll
C:\Program Files\Autodesk\AutoCAD Structural Detailing 2011\RbCSModel.arx
C:\Program Files\Autodesk\AutoCAD Structural Detailing 2011\rbcscomserver.arx
, причем применять у меня получалась только RbCSModel.arx..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 14.12.2010, 10:33
#32
Лиспер


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


Отбой, вроде бы разобрался с вопросом...
__________________
(/= RegDate StartReadDate)

Последний раз редактировалось Лиспер, 14.12.2010 в 10:41.
Лиспер вне форума  
 
Автор темы   Непрочитано 14.12.2010, 10:53
#33
AlexV

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Отбой, вроде бы разобрался с вопросом...
Дык, а чего удалил-то? Отредактировал бы, написал: проблема решилась так-то...
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 14.12.2010, 11:03
#34
Лиспер


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


Да я просто на сайт hwd зашел, а там реальный пример создания точки есть: https://sites.google.com/site/bushma...sozdanie-tocek
Код на VB.NET, я его переделал на C# (благо это нетрудно):

Код:
[Выделить все]
using System;

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

using AcAp = Autodesk.AutoCAD.ApplicationServices;
using AcDb = Autodesk.AutoCAD.DatabaseServices;
using AcGe = Autodesk.AutoCAD.Geometry;

namespace test
{
  public class Commands
  {

    [CommandMethod("Cmd1")]
    static public void Cmd1()    {
      Database db = HostApplicationServices.WorkingDatabase;
      Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor;
      PromptPointOptions ptOpt = new PromptPointOptions("\nУкажите точку <Отмена> : ");
      PromptPointResult ptRes = ed.GetPoint(ptOpt);
      if (ptRes.Status == PromptStatus.OK)
      {
        using (Transaction tr = db.TransactionManager.StartTransaction())
        {
          DBPoint ptObj = new DBPoint(ptRes.Value);
          BlockTableRecord btrOwner = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
          ObjectId ptID = btrOwner.AppendEntity(ptObj);
          tr.AddNewlyCreatedDBObject(ptObj, true);
          tr.Commit();
        }
      }
    }

  }
}

Я допустил ошибку, вместо DBPoint пытался работать с Point3d (а это, как я понял, просто массив из 3 вещественных чисел).
---
Добавлено: гы, перевел, переводчик, е-мое... Чуть ниже все есть и на C#
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 14.12.2010, 18:50
#35
Vildar

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


AlexV,
Про com понятно, подключаем ссылки, из закладки com, и работать аналогично vba.
Есть NET сборки от ASD. Лежат в GAC'e.
Цитата:
c:\WINDOWS\assembly\GAC_MSIL\
Далее у меня по этому пути есть 6 папок для Autodesk.ASD
Но это непонятно, что такое. Похоже не то.
Забыли они API прикрутить.

Я не знаю, как балку нарисовать в ASD, не то что писать под него что-то.
Vildar вне форума  
 
Непрочитано 14.12.2010, 22:08
#36
Александр Ривилис

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Я допустил ошибку, вместо DBPoint пытался работать с Point3d (а это, как я понял, просто массив из 3 вещественных чисел).
DBPoint - это класс примитива точка (в ObjectARX: AcDbPoint), а Point3d - это класс геометрической библиотеки, описывающий точку в пространстве 3D (в ObjectARX: AcGePoint3d). Экземпляры классов геометрической библиотеки добавлять в чертеж невозможно. Они для этого не предназначены. :-) Но сама по себе геометрическая библиотека достаточно мощная. Для нее нет аналогов ни в VisualLisp, ни в VBA. Настоятельно рекомендую изучить ее возможности.
Александр Ривилис вне форума  
 
Непрочитано 15.12.2010, 00:28
#37
Лиспер


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


Александр Ривилис, спасибо, попробую. Без конкретных задач тяжело
Все время пытаюсь на лиспе рисовать решение ))
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 15.12.2010, 00:43
#38
Vildar

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


Например AcGeLine2d, имитирует линию в 2d пространстве? Практическое применение что-то скрыто в тумане. Просветите плиз.
Vildar вне форума  
 
Непрочитано 15.12.2010, 09:08
#39
Александр Ривилис

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


Цитата:
Сообщение от Vildar Посмотреть сообщение
Практическое применение что-то скрыто в тумане
А ты посмотри какие методы есть у этого класса и у его родителей и увидишь практическое применение. Например метод isOn проверяет лежит ли точка на линии, closestPointTo находит ближайшую точку на линии или ближайшие точки на двух линиях (ну для прямых это может и не слишком интересно, но ведь функции то работают и дугами, и с сплайнами). Ну и так далее. Масса интересных методов.
Александр Ривилис вне форума  
 
Непрочитано 15.12.2010, 09:43
#40
Vildar

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


Т.е. вместо того, чтобы строить в базе временные примитивы для каких-то вспомогательных вычислений. Лучше использовать объекты классов из пространства Geometry (AcGe).
Слова сложно подобрать. Т.е. например линия AcGeLine2d, будет "имитировать" линию в базе чертежа.
Не пробую, т.к. нет пока конкретных задач. Просто на будущее буду знать.

А метод у Line2d только Set. На родителей забыл поглядеть
Vildar вне форума  
 
Непрочитано 15.12.2010, 09:58
#41
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,274
Отправить сообщение для Александр Ривилис с помощью 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
Сообщений: 979


В чертеже имеются объекты СПДС 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,649


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


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


Я имел в виду не "добраться до свойств объекта", а "выбрать объекты по аналогии с (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
С.-Петербург
Сообщений: 36,754


Ха, решил! Насколько я помню, там как раз и шел выбор всех объектов с последующим исключением "не тех". Именно лобовое решение...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.12.2010, 11:03
#48
Лиспер


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


Возник у меня тут вопрос по получению ключа в реестре, связанного с текущим 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,274
Отправить сообщение для Александр Ривилис с помощью Skype™


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


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


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
Сообщений: 979


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,274
Отправить сообщение для Александр Ривилис с помощью 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
Сообщений: 979


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

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,274
Отправить сообщение для Александр Ривилис с помощью 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
Сообщений: 979


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 вне форума  
 
Непрочитано 20.12.2010, 15:14
#61
Александр Ривилис

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
(ведь типа основатель)
Не "типа", а основатель.
Цитата:
Сообщение от Vildar Посмотреть сообщение
Первым делом справшивал на форуме, потом писал, а уж потом читал. Шутка.
В каждой шутке...
Александр Ривилис вне форума  
 
Непрочитано 20.12.2010, 15:14
#62
hwd

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


Цитата:
Сообщение от Vildar Посмотреть сообщение
Хотя, есть положительный пример твоему утверждению - Modis. Он все одновременно делал. Первым делом справшивал на форуме, потом писал, а уж потом читал.
Насчёт Modis я согласен (при условии, что не придётся открывать его исходники, хотя и мои исходники с большим натягом на 3-ку тянут, если тянут вообще). У него энергии и фантазии хватает с избытком. Правда читать он не любит - отсюда не всегда "красивый" код + чесание ногой уха.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 20.12.2010, 15:18
#63
Лиспер


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


Александр Ривилис, а понимаю что он основатель. Но пока до второй половины его книги не добрался, ничего не понимал. И потом по идее все надо перечитывать. Это ж уму нерастяжимо
Насчет Modis'a... Пока стараюсь сначала сам разобраться, и только потом спрашивать
P.S. Пока умолкаю, будут вопросы - снова выдам
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 21.12.2010, 12:28
#64
Modis


 
Регистрация: 12.06.2010
Липецк, Москва
Сообщений: 534


Цитата:
Сообщение от hwd Посмотреть сообщение
Насчёт Modis я согласен (при условии, что не придётся открывать его исходники, хотя и мои исходники с большим натягом на 3-ку тянут, если тянут вообще). У него энергии и фантазии хватает с избытком. Правда читать он не любит - отсюда не всегда "красивый" код + чесание ногой уха.
Ну плохо у меня с чтением
Modis вне форума  
 
Непрочитано 21.12.2010, 12:31
#65
hwd

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


Цитата:
Сообщение от Modis Посмотреть сообщение
Ну плохо у меня с чтением
Offtop: разбанили что ли? поздравляю.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 25.12.2010, 10:59
#66
Лиспер


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


Спрошу совета Вопрос вот в чем: некоторые вещи приходится хранить / читать / модифицировать, работая с xml-файлами (при этом, строго говоря, xml-файлы не всегда валидны, и необязательно имеют расширение xml). Подскажите, пожалуйста, какие способы лучше использовать для выполнения таких задач? XmlReader + XmlWriter, работать через DOM (насколько понял, DOM - самый медленный вариант), XmlNavigator, или какие-то сочетания?

Код:
[Выделить все]
<?xml version="1.0" encoding="UTF-8"?>
<Project Name="name" Number="001" ProjectLocation="Some path1" Id="{AF7FC567-70BE-4451-9B70-DA9D95590943}" UseNumberPrefix="No" UseRelativePath="No" SyncSheetWithView="No">
  <Version>55</Version>
  <Description>String</Description>
  <Templates>
    <SystemTemplate>Some file1</SystemTemplate>
    <ElementTemplate>Some file2</ElementTemplate>
    <ViewTemplate>Some file3</ViewTemplate>
    <SectionElevationViewTemplate>Some file4</SectionElevationViewTemplate>
    <DetailViewTemplate>Some file5</DetailViewTemplate>
    <DocumentTemplate>Some path2</DocumentTemplate>
    <ProjectSheetSetTemplate>Some file6</ProjectSheetSetTemplate>
    <ProjectDetailsTemplate>Some file7</ProjectDetailsTemplate>
  </Templates>
  <FileLocations>
    <ProjectImagePath>Some path</ProjectImagePath>
    <ProjectBulletinBoardPath>Some path</ProjectBulletinBoardPath>
    <PropertySetLocation>Some path</PropertySetLocation>
    <PalettesLocation>Some path</PalettesLocation>
    <ContentCatalog SharedWorkspaceCatalog="No" ContentRootPath="Some path">
      <ContentBrowserLibraryPath></ContentBrowserLibraryPath>
    </ContentCatalog>
    <ConstructLocation>Some path</ConstructLocation>
    <ElementLocation>Some path</ElementLocation>
    <ViewLocation>Some path</ViewLocation>
    <SheetLocation>Some path</SheetLocation>
  </FileLocations>
  <Standards>
    <StandardsEnabled>Yes</StandardsEnabled>
    <SyncOption>
      <StandardsSyncMethod>Manual</StandardsSyncMethod>
      <CreateLogFileOnSync>No</CreateLogFileOnSync>
      <ShowIgnoredObjectsOnSync>Yes</ShowIgnoredObjectsOnSync>
    </SyncOption>
    <AECStandards>
      <DisplaySettingsDrawing></DisplaySettingsDrawing>
      <File>
        <Path>Some file</Path>
        <Objects>
          <Object>AECObjectName</Object>
        </Objects>
      </File>
      <File>
        <Path>Some file</Path>
        <Objects>
          <Object>AECObjectName</Object>
          <Object>AECObjectName</Object>
        </Objects>
      </File>
    </AECStandards>
    <ACADStandards/>
  </Standards>
  <DetailComponentDatabases UseOnlyProjectDatabases="No"/>
  <KeynoteDatabases UseOnlyProjectDatabases="No"/>
  <Level Id="25" Name="24" Description="" Elevation="67960" Height="2800" ScheduleId="24"/>
  <Level Id="24" Name="23" Description="" Elevation="65160" Height="2800" ScheduleId="23"/>
  <Division Id="1" Name="1" Description="" ScheduleId="1"/>
  <Division Id="2" Name="2" Description="" ScheduleId="2"/>
</Project>

Спасибо.
---
P.S. Нашел такую статью, но хотелось бы услышать мнение гуру
__________________
(/= RegDate StartReadDate)

Последний раз редактировалось Лиспер, 25.12.2010 в 11:37.
Лиспер вне форума  
 
Непрочитано 25.12.2010, 11:51
#67
hwd

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
при этом, строго говоря, xml-файлы не всегда валидны, и необязательно имеют расширение xml
При работе с xml-файлами их расширение роли никакой не играет. Насчёт "валидности" не понял.... В моём понимании "валидность", в рамках данного контекста - это соответствие правилам синтаксиса XML. Судя по всему, в вашем понимании это что-то иное.
Цитата:
Сообщение от Лиспер Посмотреть сообщение
Подскажите, пожалуйста, какие способы лучше использовать для выполнения таких задач? XmlReader + XmlWriter, работать через DOM (насколько понял, DOM - самый медленный вариант), XmlNavigator, или какие-то сочетания?
Ответ очевиден: Linq to XML, а использовать DOM - это прошлый век.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 25.12.2010, 12:01
#68
Лиспер


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


hwd, иногда попадаются файлы без первой строки
Код:
[Выделить все]
<?xml version="1.0" encoding="UTF-8"?>
. Насколько я понял, это неверно.
Цитата:
Сообщение от hwd Посмотреть сообщение
Linq to XML
А будет это работать внутри .NET 2.0? Простые примеры использования в MSDN или еще где-то есть? (пока не искал, для меня это недосягаемые материи. Надеюсь, ненадолго). Спасибо.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 25.12.2010, 12:10
#69
hwd

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
иногда попадаются файлы без первой строки
Код:
[Выделить все]
<?xml version="1.0" encoding="UTF-8"?>
. Насколько я понял, это неверно.
Не то, чтобы "неверно"... Скорее "нежелательно". При чтении всегда можно принудительно указать кодировку (если по умолчанию будет применяться не та, что нужна). Отсутствие данной строки не смертельно, хотя лучше, чтобы она присутствовала.
Цитата:
Сообщение от Лиспер Посмотреть сообщение
А будет это работать внутри .NET 2.0? Простые примеры использования в MSDN или еще где-то есть? (пока не искал, для меня это недосягаемые материи. Надеюсь, ненадолго). Спасибо.
Нет, внутри .Net 2.0 это работать не будет. Эта технология присутствует, если мне не изменяет память, начиная с версии 3.0, в версии 3.5 SP1 она точно есть (именно эту версию я использую для AutoCAD 2009).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 09.01.2011, 03:17
#70
Лиспер


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


Приподниму тему...
Уважаемые, подскажите, как правильно назначать системные переменные в AutoCAD, если эти системные переменные имеют тип double[]? То есть координаты точек?
Как, например, назначить системную переменную "insbase"?
Пытался сделать наподобие:
Код:
[Выделить все]
Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("insbase", new Point3d(10.0, 10.0, 10.0));
В коде VS вроде бы меняется, но после выхода из команды проверяю значение - как было, так и есть. Пните в нужном направлении, пожалуйста...
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 09.01.2011, 14:27
#71
Олег (jr.)

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


Легко
Код:
[Выделить все]
AutoCAD.ApplicationServices.Application.SetSystemVariable("insbase", (object)new Point3d(10.0, 10.0, 10.0));
Олег (jr.) вне форума  
 
Непрочитано 10.01.2011, 00:52
#72
Лиспер


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


Что-то не сработало... Попробовал прогнать код (AutoCAD 2011, VS 2008), после выполнения проверяю:
Код:
[Выделить все]
Command: (getvar "insbase")
(0.0 0.0 0.0)
В чем я ошибаюсь?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 10.01.2011, 01:10
#73
Олег (jr.)

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Что-то не сработало... Попробовал прогнать код (AutoCAD 2011, VS 2008), после выполнения проверяю:
Код:
[Выделить все]
Command: (getvar "insbase")
(0.0 0.0 0.0)
В чем я ошибаюсь?
Проверил в 2009-м
Работает нормально и после закрытия чертежа все сохраняется
Олег (jr.) вне форума  
 
Непрочитано 10.01.2011, 09:12
#74
Александр Ривилис

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Что-то не сработало...
Значение переменной INSBASE сохраняется в конкретном чертеже. Ты часом не из немодальной формы этот код выполняешь? Может это значение меняется для другого чертежа?
Александр Ривилис вне форума  
 
Непрочитано 11.01.2011, 01:31
#75
Petrov-Vodkin


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


И я, и я теперь тоже хочу задавать глупые вопросы
Выходные провел с толком: прочитал книгу С.Н. Лукина "Понятно о Visual Basik.net" и поглядел AutoCAD .Net Laboratory. Проникся.

Вопрос1: Что дальше порекомендуете прочитать? (такое же хорошее и доходчивое)

Вопрос2:Что за зверь <CommandMethod("______")> и как правильно им пользоваться? (ну кроме как имя команды акада назначить)
А то не могу заставить работать форму и всё тут.
Хотел, чтобы (при вводе команды в ком. строку) сначала вылезала форма для ввода исходных данных, а потом по этим данным чего-нибудь рисуется.
Ну всё уже поперепробовал, а автокад по прежнему ошибку выдает. Событие для кнопки ему не нравится.

Последний раз редактировалось Petrov-Vodkin, 11.01.2011 в 12:19.
Petrov-Vodkin вне форума  
 
Непрочитано 11.01.2011, 08:26
#76
Лиспер


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


Александр Ривилис, да нет, никаких форм нет вообще. Полный код:
Код:
[Выделить все]
using System;

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

namespace dwgruTest
{
	public class test
	{
		[CommandMethod("test")]
		static public void cmdTest()
		{
			Database db = HostApplicationServices.WorkingDatabase;
			using (Transaction tr = db.TransactionManager.StartTransaction())
			{
				Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("insbase", (object)new Point3d(10.0, 10.0, 10.0));
			}
		}
	}
}
После выполнения проверяю обычным getvar - облом-с, значение не изменилось.
Проверял на VisualStudio 2008, AutoCAD 2008 32 bit, AutoCAD 2011 32 bit, AutoCAD 2011 64 bit - эффект нулевой. В чем может быть дело?
Естественно, что acdbmgd.dll и acmgd.dll подключены для соответсвующих версий, CopyLocal установлено в False.
После пошагового прохода увидел, что значение возвращается в исходное состояние после окончания блока using для транзакции. Так и должно быть?

Тупо написал микрокод:
Код:
[Выделить все]
using System;

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;

using AcAp = Autodesk.AutoCAD.ApplicationServices;

namespace test1
{
  public class test
    {
    [CommandMethod("cmd2")]
    static public void cmd2()
    {
      Database db = HostApplicationServices.WorkingDatabase;
      Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor;
      using (Transaction tr = db.TransactionManager.StartTransaction())
      {
        ed.WriteMessage("\nCurrent \"insbase\" value : " + db.Insbase.ToString());
        db.Insbase = new Point3d(100.0, 100.0, 100.0);
        ed.WriteMessage("\n\"insbase\" value in tr : " + db.Insbase.ToString());
      }
      ed.WriteMessage("\n\"insbase\" value out tr : " + db.Insbase.ToString());
    }
  }
}
В результате лог выполнения в AutoCAD 2008^
Код:
[Выделить все]
Command: cmd2
Current "insbase" value : (0,0,0)
"insbase" value in tr : (100,100,100)
"insbase" value out tr : (0,0,0)

---
Решение: Ну да, все верно... tr.Commit() не было - вот и не работало как надо.
---
Добавлено
И вот еще. Как можно получить имя объекта, который выделил пользователь для 2008 версии? В 2011 достаточно просто:
Код:
[Выделить все]
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
PromptEntityOptions prEntOpt = new PromptEntityOptions("Select an entity");
PromptEntityResult prEntRes = ed.GetEntity(prEntOpt);
// <...>
string sObjectName = prEntRes.ObjectId.ObjectClass.DxfName;
Но в 2008 версии такой код не срабатывает. Как можно обойти?
---
Добавлено 2:
Не уверен, что нашел правильное решение:
Код:
[Выделить все]
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
PromptEntityOptions prEntOpt = new PromptEntityOptions("Select an entity");
PromptEntityResult prEntRes = ed.GetEntity(prEntOpt);
// <...>
Autodesk.AutoCAD.DatabaseServices.Entity ent = (Autodesk.AutoCAD.DatabaseServices.Entity)tr.GetObject(prEntRes.ObjectId, OpenMode.ForRead);
string sObjectName = ent.GetRXClass().Name;
Насколько корректен такой код?
__________________
(/= RegDate StartReadDate)

Последний раз редактировалось Лиспер, 16.01.2011 в 12:20.
Лиспер вне форума  
 
Непрочитано 02.09.2011, 10:20
#77
Кореш

Самоходная нейросеть
 
Регистрация: 12.12.2007
Питер
Сообщений: 760


Простите пожалуйста, что не в тему, но как на VB6 в форму добавить таблицу? какой компонент подключить? спасибо
Кореш вне форума  
 
Непрочитано 02.09.2011, 10:54
#78
Кулик Алексей aka kpblc
Moderator

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


Контролов, реализующих таблицы в формах - пруд пруди (в том числе и достаточно простые по функционалу штатные от Microsoft). Ставишь отдельный контрол и понеслась
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.11.2011, 23:26
#79
це ментовозик

Водопровод-канализация
 
Регистрация: 26.09.2011
Минск
Сообщений: 8


Здравствуйте)
Есть несколько Combobox в одной форме. Есть база данных. Как сделать так, чтобы в каждом комбобоксе выбиралось своё значение из базы (сейчас при выборе значения в одном комбобоксе второй принимает такое же значение)?
це ментовозик вне форума  
 
Непрочитано 26.11.2011, 23:47
#80
hwd

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


Цитата:
Сообщение от це ментовозик Посмотреть сообщение
Здравствуйте)
Есть несколько Combobox в одной форме. Есть база данных. Как сделать так, чтобы в каждом комбобоксе выбиралось своё значение из базы (сейчас при выборе значения в одном комбобоксе второй принимает такое же значение)?
Тяжёлый случай
Почитай про ADO.NET/LINQ to Entities (на выбор) - подобного рода вопросы отвалятся сами.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 27.11.2011, 00:28
#81
Олег (jr.)

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


Цитата:
Сообщение от це ментовозик Посмотреть сообщение
Как сделать так, чтобы в каждом комбобоксе выбиралось своё значение из базы (сейчас при выборе значения в одном комбобоксе второй принимает такое же значение)?
У каждого комба должен быть свой объект BindingContext тогда если они имеют одинаковые члены:
Valuemember, DisplayMember и грузятся от одного и того же Datasource (напр. DataTable или List)
тогда будут работать независимо друг ото друга, поищи в гуглях Bind two Combobox to the same Datatable или
вроде того, я где-то видел точно такой ответ, не могу найти по-новой
Олег (jr.) вне форума  
 
Непрочитано 27.11.2011, 01:34
#82
це ментовозик

Водопровод-канализация
 
Регистрация: 26.09.2011
Минск
Сообщений: 8


Спасибо, Олег! благодаря статье http://blogs.msdn.com/b/bethmassi/ar...atasource.aspx и методом тыка разобрался...
достаточно перетащить из источника данных нужную таблицу на нужный элемент - и создается следующий по порядку BindingSourсe...
До этого тщетно пытался ковыряться в свойствах)
це ментовозик вне форума  
 
Непрочитано 27.11.2011, 10:12
#83
Олег (jr.)

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


Не за что
Ты сам все сделал
Олег (jr.) вне форума  
 
Непрочитано 08.01.2013, 23:11
#84
rass

Конструктор
 
Регистрация: 22.03.2007
Киев
Сообщений: 86
<phrase 1=


Здравствуйте!
Перехожу из VBA на VB.NET. И конечно же не все так просто.
Кое-какие проблемы методом тыка, опираясь на примеры, найденные в интернете, удается решать.
Но вот уже третий день ломаю голову над следующей задачей:
В VBA есть код при работе которого в области модели Автокад можно выделить обекты МТЕКСТ и поменять им СТИЛЬ текста, выбранный из существующих в чертеже, показанных в Форме (код формы не привожу, но там определяется знаечение текстовой переменной MTextStyleName).
Вот код в VBA
Код:
[Выделить все]
Sub MTextStyle()
         On Error Resume Next
    Dim Entry As AcadObject
    Dim SSet As AcadSelectionSet
    Dim insPoint(2) As Double
    Dim TextObj(1000) As AcadMText
    Dim intNum As Integer
    Dim i As Integer
    Dim TextHeight(1000) As Double
    i = 0
   Dim gpCode(0) As Integer
   Dim dataValue(0) As Variant
      
   Load frmMTextStyle
        gpCode(0) = 0
        dataValue(0) = "mtext"
    Set SSet = ThisDrawing.SelectionSets.Add("Selection")
        SSet.SelectOnScreen gpCode, dataValue
    For Each Entry In SSet
         Set TextObj(i) = Entry
         i = i + 1
    Next Entry
    For i = 0 To SSet.count - 1
        TextHeight(i) = TextObj(i).Height
        TextObj(i).StyleName = MTextStyleName
        TextObj(i).Height = TextHeight(i)
    Next i
    ThisDrawing.SelectionSets.Item("Selection").Delete
End Sub

При переносе этого кода на VB.NET сталкнулся с проблемой что свойств Стиль МТекста поменять нельзя - только для чтения.



Код:
[Выделить все]
 

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Interop
Imports Autodesk.AutoCAD.Interop.Common
Imports Autodesk.AutoCAD.Geometry

Public Class RassTools

<CommandMethod("NetMTextStyle")> _
    Public Sub MTextStyle()
        On Error Resume Next
        Dim TextHeight As Double
        Dim frMTextStyle As New frmMTextStyle
        frMTextStyle.Show()
        '' Получаем текущий документ и базу данных 
        Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
        Dim acCurDb As Database = acDoc.Database
     ' Создание ссылки на Менеджер Транзакций 
        Dim acTransMgr As Autodesk.AutoCAD.DatabaseServices.TransactionManager
        acTransMgr = acCurDb.TransactionManager
        ' Create a TypedValue array to define the filter criteria
        Dim acTypValAr(0) As TypedValue
        acTypValAr.SetValue(New TypedValue(DxfCode.Start, "mtext"), 0)
        ' Assign the filter criteria to a SelectionFilter object
        Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
        '' Создание новой транзакции 
        Using acTrans1 As Transaction = acCurDb.TransactionManager.StartTransaction()
            '' Request for objects to be selected in the drawing area
            Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection(acSelFtr)
            '' If the prompt status is OK, objects were selected
            If acSSPrompt.Status = PromptStatus.OK Then
                Dim acSSet As SelectionSet = acSSPrompt.Value
                '' Step through the objects in the selection set
                For Each acSSObj As SelectedObject In acSSet
                    '' Check to make sure a valid SelectedObject object was returned
                    If Not IsDBNull(acSSObj) Then
                        '' Open the selected object for write
                        Dim acEnt As MText = acTrans1.GetObject(acSSObj.ObjectId, OpenMode.ForWrite)
                        'TextObj = acEnt
                        If Not IsDBNull(acEnt) Then
                            '' Change the object
                            TextHeight = acEnt.TextHeight
                            acEnt.TextStyleName = MTextStyleName ' на этой строчке тормоза, так как acEnt.TextStyleName - только для чтения
                            acEnt.Height = TextHeight
                        End If
                    End If
                Next
                acTrans1.Commit()
            End If
        End Using
    End Sub
End Class
Уверен, что код на VB.NET крывой, не совсем пока понимаю предназначение Транзакций, как-то хитро стали подгружатся Формы и многого другое, так как VBA и VB.NET отличаются хорошо.
Поэтому прошу не ругать, но критику, как метод обучения, с благодарностью выслушаю. Спасибо.
rass вне форума  
 
Непрочитано 08.01.2013, 23:16
#85
Modis


 
Регистрация: 12.06.2010
Липецк, Москва
Сообщений: 534


Должен быть не TextStyleName , а TextStyleId
Modis вне форума  
 
Непрочитано 09.01.2013, 00:29
#86
Олег (jr.)

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


rass,
попробуй так
Код:
[Выделить все]
        <CommandMethod("NetMTextStyle")> _
        Public Sub MTextStyle()
            'Set desired text style name here:
            Dim MTextStyleName As String = "Standard"
            On Error Resume Next
            Dim TextHeight As Double
              Dim frMTextStyle As New frmMTextStyle
             frMTextStyle.Show()
            '' Получаем текущий документ и базу данных 
            Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
            Dim acCurDb As Database = acDoc.Database
            ' Создание ссылки на Менеджер Транзакций 
            Dim acTransMgr As Autodesk.AutoCAD.DatabaseServices.TransactionManager
            acTransMgr = acCurDb.TransactionManager
            ' Create a TypedValue array to define the filter criteria
            Dim acTypValAr(0) As TypedValue
            acTypValAr.SetValue(New TypedValue(DxfCode.Start, "mtext"), 0)
            ' Assign the filter criteria to a SelectionFilter object
            Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
            '' Создание новой транзакции 
            Using acTrans1 As Transaction = acCurDb.TransactionManager.StartTransaction()

                Dim mtextStyleID As ObjectId = ObjectId.Null
                Dim textStyleTable As TextStyleTable = DirectCast(acTrans1.GetObject(acCurDb.TextStyleTableId, OpenMode.ForRead), TextStyleTable)
                ' check if text style name "Standard" exist
                If Not textStyleTable.Has(MTextStyleName) Then
                    MsgBox("Text style " + MTextStyleName + " does not exists. Exit")
                Else
                    'get ObjectId of textstyle named "Standard" for the future use
                    mtextStyleID = textStyleTable(MTextStyleName)
                End If


                '' Request for objects to be selected in the drawing area
                Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection(acSelFtr)
                '' If the prompt status is OK, objects were selected
                If acSSPrompt.Status = PromptStatus.OK Then
                    Dim acSSet As SelectionSet = acSSPrompt.Value
                    '' Step through the objects in the selection set
                    For Each acSSObj As SelectedObject In acSSet
                        '' Check to make sure a valid SelectedObject object was returned
                        If Not IsDBNull(acSSObj) Then
                            '' Open the selected object for write
                            Dim acEnt As MText = acTrans1.GetObject(acSSObj.ObjectId, OpenMode.ForWrite)
                            'TextObj = acEnt
                            If Not IsDBNull(acEnt) Then
                                '' Change the object
                                TextHeight = acEnt.TextHeight
                                ''acEnt.TextStyleName = MTextStyleName ' на этой строчке тормоза, так как acEnt.TextStyleName - только для чтения
                                acEnt.TextStyleId = mtextStyleID 'A2009
                                ''acEnt.TextStyle = mtextStyleID 'A2010
                                acEnt.Height = TextHeight
                            End If
                        End If
                    Next
                    acTrans1.Commit()
                End If
            End Using
        End Sub
Олег (jr.) вне форума  
 
Непрочитано 09.01.2013, 00:31
#87
rass

Конструктор
 
Регистрация: 22.03.2007
Киев
Сообщений: 86
<phrase 1=


Modis
Я думал над таким вариантом, но не понял, что мне нужно назначать переменной MTextStyleName, в VBA коде это было строковое значение с именем Стиля.
acEnt.TextStyleId = MTextStyleName

UPD.
Олег (jr.)
Спасибо! Правда, еще не совсем все понятно (столько всяких праматеров и свойств у объектов Автокада, и чувствую они преумножились в .NET), но пока собрал такой код.
вот ее главная исполнительная часть.
Код:
[Выделить все]
   Dim mtextStyleID As ObjectId = ObjectId.Null
   Dim textStyleTable As TextStyleTable = DirectCast(acTrans1.GetObject(acCurDb.TextStyleTableId, OpenMode.ForRead), TextStyleTable)
   mtextStyleID = textStyleTable(MTextStyleName)
If Not IsDBNull(acEnt) Then
   '' Change the object
   TextHeight = acEnt.TextHeight
   acEnt.TextStyleId = mtextStyleID
   acEnt.TextHeight = TextHeight
End If

Последний раз редактировалось rass, 09.01.2013 в 01:21.
rass вне форума  
 
Непрочитано 04.08.2013, 07:22
#88
DEM

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


Начинаю разбираться с VB.net
Установил Microsoft Visual Basic 2010 Express и ObjectARX 2013
Возникла следующая ошибка не хочет добавлять команду (<CommandMethod("HelloWorld")> _) в автокад....
У него вообще CommandMethod отсутствует почему то....
Файлы acdbmgd.dll и acmgd.dll добавляю из папки C:\ObjectARX 2013\inc
Вроде всё делаю в соответствии с тренингами...
Изображения
Тип файла: jpg Безымянный.jpg (67.2 Кб, 663 просмотров)
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 04.08.2013, 10:56
#89
Олег (jr.)

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


Попробуй так:
Изображения
Тип файла: jpg StartProject.jpg (127.8 Кб, 671 просмотров)
Олег (jr.) вне форума  
 
Непрочитано 04.08.2013, 11:40
#90
Do$

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


Удалено

Последний раз редактировалось Do$, 04.08.2013 в 11:59.
Do$ вне форума  
 
Непрочитано 04.08.2013, 19:06
#91
DEM

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


Олег (jr.)
Я поступил проще...
Добавил все dll которые были в папке C:\ObjectARX 2013\inc, и все появилось...
Потом просто удалил не использованные пространства имен...
Способ конечно через Ж...
НО я пока только осваиваю VB.net
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 04.08.2013, 19:09
#92
Олег (jr.)

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


Зато теперь ты знаешь только нужные,
уже легче
Удачи
Олег (jr.) вне форума  
 
Непрочитано 09.08.2013, 22:41
#93
DEM

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


Хммм...
И так начал изучать VB.net...
Возник дурацкий вопрос, если создаю форму и кидаю на неё OpenFileDialog то получается запустить свою форму и запустить диалог выбора файла...
А вот сразу вызвать диалог выбора файла чей то не получается....
А везде примеры запуска данного диалога с формы...
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 09.08.2013, 23:21
#94
Олег (jr.)

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


Тогда надо использоватьродной автокадовский диалог,
навскидку где-то так
Код:
[Выделить все]
           <CommandMethod("sf")> _
        Public Sub testFileOpen()
            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
            Dim ed As Editor = doc.Editor
            Dim file As String
            Dim opts As PromptOpenFileOptions = New PromptOpenFileOptions("Выбери файл: ")
            opts.Filter = ("Drawing (*.dwg)|*.dwg")
            opts.AllowUrls = False
            Dim pr As PromptFileNameResult = ed.GetFileNameForOpen(opts)
            If (pr.Status = PromptStatus.OK) Then
                file = pr.StringResult
                Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("Файл: " + file + vblf +"Дальше вызываешь форму и работай с ней")
            Else
                Return
            End If
        End Sub
Олег (jr.) вне форума  
 
Непрочитано 10.08.2013, 06:46
#95
DEM

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


Олег (jr.)
ООО
Пасиб, заработало однако...
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 10.08.2013, 10:22
#96
Олег (jr.)

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


Не за что,
Удачи
Олег (jr.) вне форума  
 
Непрочитано 14.08.2013, 17:57
#97
DEM

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


А случаем примеров с подсчетом динамических блоков нету у кого нибудь...
И еще чтобы блоки считались в Динамических массивах, кторые в 2013 появились...
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 14.08.2013, 20:56
#98
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,347
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от DEM Посмотреть сообщение
А случаем примеров с подсчетом динамических блоков нету у кого нибудь...
А какая разница, обрабатываются как и простые, только атрибуты по другому - копай в сторону ACADObject.GetAttributes
Цитата:
Сообщение от DEM Посмотреть сообщение
Динамических массивах, кторые в 2013 появились...
А лучше файл с примером блока дай если они конечно будут работать в 2009, что за зверь ?
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума  
 
Непрочитано 14.08.2013, 21:28
#99
Boxa

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


Цитата:
Сообщение от DEM Посмотреть сообщение
А случаем примеров с подсчетом динамических блоков нету у кого нибудь...
Код корявый конечно, но думаю будет полезен:
Код:
[Выделить все]
Dim arr_block As New ObjectIdCollection
        '' Старт транзакции
        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)
                                        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
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 14.08.2013, 22:38
#100
DEM

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


Спасибо!
Буду разбираться....
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 15.08.2013, 00:01
#101
swell{d}

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


я сейчас пишу программку для автоматизации рисования развёрток стен. сегодня решил посчитать строки кода, насчитал ~3200 и обалдел блин, т.к. до этого моя самая большая программа не превышала 100 строк =)
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Непрочитано 15.08.2013, 06:42
#102
DEM

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


swell{d}
Обработчики ошибок делаешь???
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 15.08.2013, 20:17
#103
swell{d}

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


только входной контроль исходных данных, задаваемых пользователем. а дальше - тупо построения.

ещё не доделал. пока так: https://dl.dropboxusercontent.com/u/...8-15-20-12.avi (тормоза построений связаны с тормозами связи экселя с нанокадом. но выглядит забавно)
скоро закончу и будет получаться сразу готовый лист со спецификацией и всеми необходимыми плюшками =)
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Непрочитано 15.08.2013, 20:26
#104
DEM

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


swell{d}
Дык в конце выгружать надоть в эксель...
Я наверное на С++ перейду ща т.к. АПИ СКАДа прислали, а он на С++.
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 15.08.2013, 21:42
#105
swell{d}

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


В эксель я ничего не выгружаю, я из экселя подключаюсь к нано и управляю им
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Непрочитано 15.08.2013, 21:49
#106
DEM

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


swell{d}
А чего не сразу на net?
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 15.08.2013, 23:22
#107
swell{d}

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


а в нано есть "net" ?
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Непрочитано 16.08.2013, 07:17
#108
DEM

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


swell{d}
А разве нету????
Ну ты батенька меня удивляешь....
Импорт координат из текстового файла в чертёж nanoCAD на классическом .NET API
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 16.08.2013, 09:12
#109
swell{d}

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


Vba меня всем устраивает и отлично работает
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Непрочитано 16.08.2013, 09:52
#110
DEM

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


Цитата:
Сообщение от swell{d} Посмотреть сообщение
Vba меня всем устраивает и отлично работает
Цитата:
Сообщение от swell{d} Посмотреть сообщение
(тормоза построений связаны с тормозами связи экселя с нанокадом. но выглядит забавно)

Ну не знаю....
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 16.08.2013, 21:53
#111
swell{d}

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


Есть другой путь. Сохранить скрипт в текстовый файл, а потом из нано запустить этот скрипт. Отрисовывает мгновенно, но надо нажтмать кнопку в экселе, затем переключаться в нано и там нажимать кнопку. Долго =)
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Непрочитано 17.08.2013, 07:56
#112
DEM

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


А еще вариант, с делать в vb.net и загружать эту dll в Нанокад, вызвать команду и все мгновенно выгрузится в файл экселя....
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Автор темы   Непрочитано 17.08.2013, 09:10
#113
AlexV

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


Цитата:
Сообщение от swell{d} Посмотреть сообщение
Есть другой путь. Сохранить скрипт в текстовый файл, а потом из нано запустить этот скрипт. Отрисовывает мгновенно, но надо нажтмать кнопку в экселе, затем переключаться в нано и там нажимать кнопку. Долго =)
А че, кнопка в екселе не может сама нажимать кнопку в нано?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 17.08.2013, 12:19
#114
swell{d}

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


А вот это идея =) попробую..
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Непрочитано 17.08.2013, 12:25
#115
DEM

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


Можно скрипт autoit добавить для этого....
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Автор темы   Непрочитано 17.08.2013, 12:48
#116
AlexV

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


Цитата:
Сообщение от swell{d} Посмотреть сообщение
я сейчас пишу программку для автоматизации рисования развёрток стен. сегодня решил посчитать строки кода, насчитал ~3200 и обалдел блин, т.к. до этого моя самая большая программа не превышала 100 строк =)
Задумался.. пересчитал строки в своей екселевской проге для подсчету врс.. Однако, тож примерно 3000 с небольшим! Начал писать "на коленке" и не смог остановиться..
А какой-нить монстр типа hwd небось все это в пару сотен уложил бы..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 19.08.2013, 12:55
#117
DEM

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


Boxa
Вроде с основой твоего кода разобрался, и он у меня работает сейчас, по крайней мере блоки считает...
Но вот как атрибуты перебирать чей то не разберусь...
И еще как с динамическими массивами разобраться...
__________________
Шаг 12й......
Мои публикации

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

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


Цитата:
Сообщение от DEM Посмотреть сообщение
Но вот как атрибуты перебирать чей то не разберусь...
У вставки блока BlockReference есть свойство AttributeCollection. В нем ID-коллекция всех атрибутов блока.
Вот тут код на C#, в нем это видно. На VB переделать несложно будет: http://adn-cis.org/forum/index.php?topic=113.0
Код:
[Выделить все]
И еще как с динамическими массивами разобраться...
Фишка новая, вряд ли ее кто-то успел программно поковырять.
Do$ вне форума  
 
Непрочитано 19.08.2013, 13:54
#119
DEM

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


Do$
Тогда может программно разбивать эти объекты, а потом востанавливать?
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 19.08.2013, 14:11
#120
Boxa

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


Цитата:
Сообщение от swell{d} Посмотреть сообщение
Есть другой путь.
А почему просто не сделать форму с полями и не трогать excel? Или читать данные о стенах из xml файла?
И все это внутри нанокада.


Цитата:
Сообщение от DEM Посмотреть сообщение
Но вот как атрибуты перебирать чей то не разберусь...
Как то так, хотя дмаю можно и средствами Linq это сделать.
Код:
[Выделить все]
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)
			If attRef.Tag.ToUpper() = "ОТМЕТКА" Then
				attRef.UpgradeOpen()
				attRef.TextString = znak_otn & CStr(Format(nov_otn, "0.000"))
				attRef.DowngradeOpen()
			End If
			If attRef.Tag.ToUpper() = "ВТОРАЯ_СТРОЧКА" Then
				attRef.UpgradeOpen()
				attRef.TextString = znak_abs & CStr(Format(nov_abs, "0.000"))
				attRef.DowngradeOpen()
			End If
		End If
	Next
End If
Цитата:
Сообщение от DEM Посмотреть сообщение
И еще как с динамическими массивами разобраться...
а что это?
__________________
_бложиг

Последний раз редактировалось Boxa, 19.08.2013 в 14:19.
Boxa вне форума  
 
Непрочитано 19.08.2013, 14:53
#121
swell{d}

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


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

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


Цитата:
Сообщение от Boxa Посмотреть сообщение
а что это?
А эта хрень появилась в 2013 Автогаде...
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 19.08.2013, 15:22
#123
Do$

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


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

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


Цитата:
Сообщение от 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,785


ХМММ
acBlock.AttributeCollection.Count - возвращает количество атрибутов блока
Соответственно acBlock.AttributeCollection.Item(1) по хорошему должен выдавать значение 1-го атрибута...
Чей то туплю похоже...
__________________
Шаг 12й......
Мои публикации
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,649


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

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


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

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


hwd
Дык ставлю 0, не компилируется, пишет ошибку...
Типа значение должно быть Integer
__________________
Шаг 12й......
Мои публикации
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,785


Цитата:
Сообщение от 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
Смотрю разбираюсь в структуре и сиртаксисе....
Хочу сделать следующее, создать массив с информацией о блоках(атрибуты,), а потом его уже обрабатывать, подсчитывать количество и т.п.
Потом экспортировать в эксель....
__________________
Шаг 12й......
Мои публикации
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,066


Цитата:
Сообщение от 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,785


Boxa
ХМММ чей то не получается
acDoc.Editor.WriteMessage(ControlChars.CrLf & acBlock.AttributeCollection.Item(0) )
Вывести в командную строку, грут это не строка...
А в в каком же качестве возвращаются значния acBlock.AttributeCollection.Item, если не в строковом,,,
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 19.08.2013, 16:43
#137
Boxa

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


Цитата:
Сообщение от 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,785


Boxa
Угу все за работало....
Теперь буду создавать массив, а потом его обрабатывать.
Кстати вопрос по поводу
Цитата:
Это VBA.NET.
Хмм а чем этот код отличаектся от чистого VB.net
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 19.08.2013, 17:13
#140
Олег (jr.)

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


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

Цитата:




Это VBA.NET.
Это намек на то что лучше переходи на C#,
очень опытные программеры (не с этого форума)
настоятельно рекомендуют, я лично не могу однозначить
Олег (jr.) вне форума  
 
Непрочитано 19.08.2013, 17:19
#141
DEM

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


Олег (jr.)
ДЫк все таки по проще, VB вроде...
С Паскаля на него перейти не так уж и трудно, да и основные примеры по Роботу, с которым мне предстоит разбираться в основном на VB и VBA.
Правда вот прислали API СКАДа, там все на С++, но я так понимаю, потом это дело можно будет в отдельную dll запихнуть и пользоваться этим API с помошью VB.net.
__________________
Шаг 12й......
Мои публикации
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,066


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

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

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

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


Boxa
Кстати, ты то с API СКАДа не пытался случаем разобраться....
__________________
Шаг 12й......
Мои публикации
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,785


Странно, код работает...
Код:
[Выделить все]
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'.
__________________
Шаг 12й......
Мои публикации

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

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,683
Отправить сообщение для 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,785


ХММ, ну это я так и понял...
Сделал класс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
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 21.08.2013, 15:46
#150
Do$

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


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

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


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

Цитата:
Как это в VB сделать не подскажу, ищите примеры
Ни за что бы не догадался...
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 21.08.2013, 15:49
#152
Кулик Алексей aka kpblc
Moderator

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


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

using AcAp = Autodesk.AutoCAD.ApplicationServices;
Третье: все же возьми книжку по VB.NET - благо их немеряно. Так "тыркаться" можно до посинения с минимальным эффектом.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.08.2013, 16:09
#153
Boxa

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


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

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


Boxa
Книгу узе в метро читаю...
__________________
Шаг 12й......
Мои публикации
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,785


Олег (jr.)
Пасиб!
Завтра утром, качну..
__________________
Шаг 12й......
Мои публикации
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,785


дык ссылка то на облако, все нормуль, скачал уже.
Еще раз огромное спасибо...
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 23.08.2013, 17:18
#159
DEM

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


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

В принципе я уже нашел как можно сделать...
Можно будет с помощью класса создать команды в автокаде, но все основные операции, будут выполняться в модуле...
Форма так же будет использоваться только для вызова "команд" из модуля....
Вложения
Тип файла: zip Lab1_Complete.zip (117.9 Кб, 40 просмотров)
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 23.08.2013, 18:11
#160
Do$

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


Думаю, проще всего тут будет перенести метод "at" в класс формы. С классом Class1 (или Class2??) он никак не связан.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 23.08.2013, 18:21
#161
DEM

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


Do$
Дык там еще переменные надо будет импортировать...
Ща заново проект создам все вычищу....
У меня сейчас чей то вообще ничего не работает, где то ошибка, хотя компилируется все без ошибок....
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 23.08.2013, 20:34
#162
Do$

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


Если запустить в режиме отладки, покажет где ошибка.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 23.08.2013, 20:56
#163
DEM

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


та нашел уже....
Действительно надо модуль делать, так правильнее будет.
При добавлении методов и функций в модуль, к ним можно будет обращаться как из формы, так и из класса.
Такая структура будет более правильная в общем то.
__________________
Шаг 12й......
Мои публикации

Последний раз редактировалось DEM, 24.08.2013 в 10:51.
DEM вне форума  
 
Непрочитано 26.08.2013, 15:14
#164
DEM

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


В общем, вот так поступил...
Вывел методы в Модуль, и могу спокойно из вызывать из формы и из классов....
Теперь вот вопросы такие возникли...
Как вставлять таблицу в определенную точку с отображением её контура...
Я так понимаю, можно вставлять её в виде блока, а потом разбивать.
Или есть еще какие то приемы?
И еще преположим у меня есть какой то стиль таблицы, как мне его назначить, новой таблице?
Вложения
Тип файла: zip SpeciF.zip (110.2 Кб, 72 просмотров)
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 26.08.2013, 21:32
#165
Do$

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


NET такая штука, что она не зависит от языка. Будь то VB или C#, NET API AutoCAD от этого не изменится. Поэтому, можно посмотреть примеры создания таблиц на C# и сделать то же самое в VB:
http://through-the-interface.typepad...ng_an_aut.html
http://through-the-interface.typepad...using-net.html
http://through-the-interface.typepad...le-in-net.html
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 26.08.2013, 22:11
#166
DEM

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


Do$
Там в примерах варианты с указанием точки, но без контура таблицы.
Может в буфер обмена таблицу поместить, а потом вставить....
И еще где то примеры бы с трансформацией USC...
А то вставляются таблицы под наклоном, если USC повернута.
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 26.08.2013, 23:49
#167
Do$

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


Что подразумевается под контуром? Граничные линии ячеек? Они в стилях таблиц/ячеек настраиваются. Или отдельно для каждой созданной таблицы/ячейки можно переопределить.
По умолчанию все создается в WCS ("мировой" системе координат), если в текущей UCS надо, то пересчитывается геометрия. Создается матрица пересчета и векторы/точки пересчитываются по ней, даже метод есть у них специальный. Погугли, в общем: "WCS to USC AutoCAD NET" или что-то подобное.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 27.08.2013, 07:16
#168
DEM

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Что подразумевается под контуром? Граничные линии ячеек?
Хочестя вставлять таблицу, так же как и блоки, чтобы при указании точки, таблица была видима контуром(ну или вся)....
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 27.08.2013, 09:15
#169
Boxa

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


Цитата:
Сообщение от DEM Посмотреть сообщение
Хочестя вставлять таблицу, так же как и блоки, чтобы при указании точки, таблица была видима контуром(ну или вся)....
http://through-the-interface.typepad...a_jig_fro.html
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 27.08.2013, 12:31
#170
DEM

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


Угу получилось на VB.
Теперь почистить код надо еще....
Код:
[Выделить все]
[VB]       <CommandMethod("neww")> _
        Public Sub CreateBlockWithJig11()
            Dim doc As Document = Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor
            ' First let's get the name of the block
            AddNewBTRB()
            Dim pr = "CircleBlock"
            Dim tr As Transaction = doc.TransactionManager.StartTransaction()
            Using tr
                ' Then open the block table and check the
                ' block definition exists
                Dim bt As BlockTable = DirectCast(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)
                Dim blockId As ObjectId = bt("CircleBlock")
                    ' We loop until the jig is cancelled
                Dim pt As New Point3d(0, 0, 0)
                        Dim br As New BlockReference(pt, blockId)
                        Dim entJig As New BlockJig(br)
                        ' Perform the jig operation
                ' Call a function to make the graphics display
                            ' (otherwise it will only do so when we Commit)
                doc.TransactionManager.QueueForGraphicsFlush()
                Dim pkr As PromptResult = ed.Drag(entJig)
                If pkr.Status = PromptStatus.OK Then
                    ' If all is OK, let's go and add the
                    ' entity to the modelspace
                    Dim btr As BlockTableRecord = DirectCast(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)
                    btr.AppendEntity(entJig.GetEntity())
                    tr.AddNewlyCreatedDBObject(entJig.GetEntity(), True)
                    ' Call a function to make the graphics display
                    ' (otherwise it will only do so when we Commit)
                    doc.TransactionManager.QueueForGraphicsFlush()
                End If
                tr.Commit()
            End Using

        End Sub
        Public Sub AddNewBTRB()
            Dim myTransMan As DatabaseServices.TransactionManager
            Dim myTrans As DatabaseServices.Transaction
            Dim myDwg As Document
            Dim myBT As BlockTable
            Dim myBTR As BlockTableRecord

            myDwg = Application.DocumentManager.MdiActiveDocument
            myTransMan = myDwg.TransactionManager
            myTrans = myTransMan.StartTransaction

            'Open the database for Write
            myBT = myDwg.Database.BlockTableId.GetObject(OpenMode.ForWrite)

            'Add a new BlockTableRecord
            myBTR = New BlockTableRecord
            myBTR.Name = "CircleBlock"

            'Draw to the Block
            myBTR.AppendEntity(New DatabaseServices.Circle( _
                New Geometry.Point3d(0, 0, 0), New Geometry.Vector3d(0, 0, 1), 1.5))

            myBT.Add(myBTR)

            'Commit the Transaction
            myTrans.AddNewlyCreatedDBObject(myBTR, True)
            myTrans.Commit()

            'Dispose of the Transaction Objects
            myTrans.Dispose()
            myTransMan.Dispose()
        End Sub[/VB]
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 27.08.2013, 15:46
#171
Boxa

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


Цитата:
Сообщение от DEM Посмотреть сообщение
Угу получилось на VB.
Теперь почистить код надо еще...
У тебя в коде не не проверяется есть ли уже в базе чертежа блок с таким именем...
Код:
[Выделить все]
        Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
        Dim acCurDb As Database = acDoc.Database
        Dim acEd As Editor = acDoc.Editor
        Dim sec_block_name As String = "Sech"
        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
            Dim acBlTbl As BlockTable
            acBlTbl = acTrans.GetObject(acCurDb.BlockTableId, _
                                         OpenMode.ForRead)
            If acBlTbl.Has(sec_block_name) = True Then
                acDoc.Editor.WriteMessage(vbLf & "Хорошо, блок " & sec_block_name & " присутствует в базе чертежа. ")
            Else
                acDoc.Editor.WriteMessage(vbLf & "Ошибка, блок " & sec_block_name & " отсутствует в базе чертежа. ")
                acDoc.Editor.WriteMessage(vbLf & "Программа завершена с ошибкой.")
                Exit Sub
            End If
        End Using
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 27.08.2013, 16:14
#172
DEM

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


Boxa
Ок, а вот как добавить столбцы и строки в таблицу, не разберусь, и как разбить потом этот блок?
Код:
[Выделить все]
[VB]        Public Sub AddNewBTRB()
            Dim myTransMan As DatabaseServices.TransactionManager
            Dim myTrans As DatabaseServices.Transaction
            Dim myDwg As Document
            Dim myBT As BlockTable
            Dim myBTR As BlockTableRecord

            myDwg = Application.DocumentManager.MdiActiveDocument
            myTransMan = myDwg.TransactionManager
            myTrans = myTransMan.StartTransaction

            'Open the database for Write
            myBT = myDwg.Database.BlockTableId.GetObject(OpenMode.ForWrite)

            'Add a new BlockTableRecord
            myBTR = New BlockTableRecord
            myBTR.Name = "Table_Block"

            'Draw to the Block
            'Dim myTable As New DatabaseServices.Table
            'myBTR.AppendEntity(myTable)
            'myTrans.AddNewlyCreatedDBObject(myTable, True)
            'myTable.InsertColumns(1, 0.25, 4)
            'myTable.InsertRows(1, 1, 3)
            myBTR.AppendEntity(New DatabaseServices.Table())
            myBT.Add(myBTR)
            'Commit the Transaction
            myTrans.AddNewlyCreatedDBObject(myBTR, True)
            myTrans.Commit()

            'Dispose of the Transaction Objects
            myTrans.Dispose()
            myTransMan.Dispose()
        End Sub[/VB]
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 28.08.2013, 10:56
#173
Boxa

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


2 DEM
Ээээ... ты как то все через одно место стараешься сделать...
Код:
[Выделить все]
Public Class acad_boxa_tabJig
    <CommandMethod("neww_tab", CommandFlags.NoBlockEditor+CommandFlags.NoPaperSpace)> _
    Public Sub CreateBlockWithJig11_tab()
        Dim doc As Document = Application.DocumentManager.MdiActiveDocument
        Dim db As Database = doc.Database
        Dim ed As Editor = doc.Editor
        Dim tr As Transaction = doc.TransactionManager.StartTransaction()
        Using tr
            Dim tabId As ObjectId = CreateAndSetTableStyle(New Point3d(0, 0, 0))
            Dim acTab As Table = CType(tr.GetObject(tabId, OpenMode.ForRead), Table)
            Dim entJig As New TabJig(acTab)
            doc.TransactionManager.QueueForGraphicsFlush()
            Dim pkr As PromptPointResult = ed.Drag(entJig)
            If pkr.Status = PromptStatus.OK Then
                acTab.UpgradeOpen()
                acTab.Position = pkr.Value
                acTab.GenerateLayout()
                acTab.DowngradeOpen()
                doc.TransactionManager.QueueForGraphicsFlush()
            End If
            tr.Commit()
        End Using
    End Sub

    Private Function CreateAndSetTableStyle(ByRef acPnt As Point3d) As ObjectId
        Dim sTableStyleName As String = "SV"
        Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
        Dim acCurDb As Database = acDoc.Database
        Dim acEd As Editor = acDoc.Editor
        Dim TableStyleId As ObjectId
        Dim tbID As ObjectId

        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
            Dim ts As TableStyle
            Dim TableDict As DBDictionary = CType(acTrans.GetObject(acCurDb.TableStyleDictionaryId, _
                                                                    OpenMode.ForRead), DBDictionary)
            If TableDict.Contains(sTableStyleName) Then
                TableStyleId = TableDict.GetAt(sTableStyleName)
            Else
                'Создаем стиль таблице
                ts = New TableStyle()
                'Высота текста в таблице
                ts.SetTextHeight(350, RowType.HeaderRow)
                ts.SetTextHeight(350, RowType.DataRow)
                ts.SetTextHeight(500, RowType.TitleRow)
                'Выравнивание  текста в таблице
                ts.SetAlignment(CellAlignment.MiddleCenter, RowType.HeaderRow)
                ts.SetAlignment(CellAlignment.MiddleCenter, RowType.TitleRow)
                ts.SetAlignment(CellAlignment.MiddleCenter, RowType.DataRow)
                ts.IsHeaderSuppressed = False
                ts.IsTitleSuppressed = False
                TableStyleId = ts.PostTableStyleToDatabase(acCurDb, sTableStyleName)
                acTrans.AddNewlyCreatedDBObject(ts, True)
            End If
            'Берем текстовый стиль
            ts = CType(acTrans.GetObject(TableStyleId, OpenMode.ForWrite), TableStyle)
            'Формирую таблицу
            Dim tb As Table = New Table()
            If TableStyleId = ObjectId.Null Then
                tb.TableStyle = acCurDb.Tablestyle
            Else
                tb.TableStyle = TableStyleId
            End If
            tb.Rows(0).Height = 800
            tb.InsertRows(1, 1600, 1)
            tb.InsertColumns(0, 2000, 1)
            tb.InsertColumns(1, 3000, 1)
            tb.InsertColumns(2, 1500, 1)
            tb.InsertColumns(3, 2000, 4)
            tb.InsertColumns(7, 1500, 1)
            tb.Columns(8).Width = 2500
            'Заголовок таблици
            tb.Cells(0, 0).TextHeight = 500
            tb.Cells(0, 0).TextString = "Спецификация свай"
            tb.Cells(0, 0).Alignment = CellAlignment.MiddleCenter
            'Заполняю шапку таблицы
            Dim str(8) As String
            str(0) = "Номера  свай"
            str(1) = "Марка свай"
            str(2) = "Условн. обозн."
            str(3) = "Длина, мм"
            str(4) = "Сечение, мм"
            str(5) = "Абс. отм.  пяты сваи"
            str(6) = "Абс. отм. верха сваи"
            str(7) = "Кол-во, шт."
            str(8) = "Примечание"
            For i = 0 To 8
                tb.Cells(1, i).TextString = str(i)
                tb.Cells(1, i).TextHeight = 300
                tb.Cells(1, i).Alignment = CellAlignment.MiddleCenter
            Next
            'Указываю точку вставки таблицы
            tb.Position = acPnt 'out_Re.Value
            tb.GenerateLayout()
            Dim acBlkTbl As BlockTable
            Dim acBlkTblRec As BlockTableRecord
            ' Save the changes and dispose of the transaction
            Try
                ' Save the changes and dispose of the transaction
                acBlkTbl = CType(acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead), BlockTable)
                acBlkTblRec = CType(acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)
                acBlkTblRec.AppendEntity(tb)
                tbID = tb.ObjectId
                acTrans.AddNewlyCreatedDBObject(tb, True)
                acTrans.Commit()
            Catch ex As Exception
                acDoc.Editor.WriteMessage(ControlChars.CrLf & "Не удалось добавить стиль таблици в базу чертежа.")
            End Try
        End Using
        Return tbID
    End Function
End Class

Class TabJig
    Inherits EntityJig
    Private mCenterPt As Point3d, mActualPoint As Point3d

    Public Sub New(br As Table)
        MyBase.New(br)
        mCenterPt = br.Position
    End Sub

    Protected Overrides Function Sampler(prompts As JigPrompts) As SamplerStatus
        Dim jigOpts As New JigPromptPointOptions()
        jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates Or UserInputControls.NoZeroResponseAccepted Or UserInputControls.NoNegativeResponseAccepted)
        jigOpts.Message = vbLf & "Enter insert point: "
        Dim dres As PromptPointResult = prompts.AcquirePoint(jigOpts)
        If mActualPoint = dres.Value Then
            Return SamplerStatus.NoChange
        Else
            mActualPoint = dres.Value
        End If
        Return SamplerStatus.OK
    End Function

    Protected Overrides Function Update() As Boolean
        mCenterPt = mActualPoint
        Try
            DirectCast(Entity, Table).Position = mCenterPt
        Catch generatedExceptionName As System.Exception
            Return False
        End Try
        Return True
    End Function

    Public Function GetEntity() As Entity
        Return Entity
    End Function
End Class
__________________
_бложиг

Последний раз редактировалось Boxa, 28.08.2013 в 12:31.
Boxa вне форума  
 
Непрочитано 28.08.2013, 11:16
#174
DEM

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


Boxa
Ну я пока еще учусь на херурга...
Код:
[Выделить все]
[VB]Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD

Namespace BlockJigTest
    Class BlockJig
        Inherits EntityJig
        Private mCenterPt As Point3d, mActualPoint As Point3d
        Public Sub New(ByVal br As BlockReference)
            MyBase.New(br)
            mCenterPt = br.Position
        End Sub
        Protected Overrides Function Sampler(ByVal prompts As JigPrompts) As SamplerStatus
            Dim jigOpts As New JigPromptPointOptions()
            jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates Or UserInputControls.NoZeroResponseAccepted Or UserInputControls.NoNegativeResponseAccepted)
            jigOpts.Message = vbLf & "Enter insert point: "
            Dim dres As PromptPointResult = prompts.AcquirePoint(jigOpts)
            If mActualPoint = dres.Value Then
                Return SamplerStatus.NoChange
            Else
                mActualPoint = dres.Value
            End If
            Return SamplerStatus.OK
        End Function
        Protected Overrides Function Update() As Boolean
            mCenterPt = mActualPoint
            Try
                DirectCast(Entity, BlockReference).Position = mCenterPt
            Catch generatedExceptionName As System.Exception
                Return False
            End Try
            Return True
        End Function
        Public Function GetEntity() As Entity
            Return Entity
        End Function
    End Class
    Public Class Commands
        <CommandMethod("neww")> _
        Public Sub CreateBlockWithJig11()
            Dim doc As Document = Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor
            ' First let's get the name of the block
            AddNewBTRB()
            Dim pr = "Table_Block"
            Dim tr As Transaction = doc.TransactionManager.StartTransaction()
            Using tr
                ' Then open the block table and check the
                ' block definition exists
                Dim bt As BlockTable = DirectCast(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)
                Dim blockId As ObjectId = bt(pr)
                ' We loop until the jig is cancelled
                Dim pt As New Point3d(0, 0, 0)
                Dim br As New BlockReference(pt, blockId)
                Dim entJig As New BlockJig(br)
                ' Perform the jig operation

                Dim pkr As PromptResult = ed.Drag(entJig)
                If pkr.Status = PromptStatus.OK Then
                    ' If all is OK, let's go and add the
                    ' entity to the modelspace
                    Dim btr As BlockTableRecord = DirectCast(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)
                    btr.AppendEntity(entJig.GetEntity())
                    'Dim btr As BlockTableRecord = DirectCast(tr.GetObject(bt(BlockTableRecord.PaperSpace), OpenMode.ForWrite), BlockTableRecord)
                    'btr.AppendEntity(entJig.GetEntity())
                    tr.AddNewlyCreatedDBObject(entJig.GetEntity(), True)
                    ' Call a function to make the graphics display
                    ' (otherwise it will only do so when we Commit)
                    doc.TransactionManager.QueueForGraphicsFlush()
                End If
                br.ExplodeToOwnerSpace()
                br.Erase()

                tr.Commit()
            End Using


        End Sub
        Public Sub AddNewBTRB()
            Dim myTransMan As DatabaseServices.TransactionManager
            Dim myTrans As DatabaseServices.Transaction
            Dim myDwg As Document
            Dim myBT As BlockTable
            Dim myBTR As BlockTableRecord

            myDwg = Application.DocumentManager.MdiActiveDocument
            myTransMan = myDwg.TransactionManager
            myTrans = myTransMan.StartTransaction

            'Open the database for Write
            myBT = myDwg.Database.BlockTableId.GetObject(OpenMode.ForWrite)

            'Add a new BlockTableRecord
            myBTR = New BlockTableRecord
            myBTR.Name = "Table_Block"
            Dim tb As New DatabaseServices.Table()
            tb.InsertColumns(1, 0.25, 4)
            tb.InsertRows(1, 1, 3)
            myBTR.AppendEntity(tb)
            myBT.Add(myBTR)
            'Commit the Transaction
            myTrans.AddNewlyCreatedDBObject(myBTR, True)
            myTrans.Commit()
            'Dispose of the Transaction Objects
            myTrans.Dispose()
            myTransMan.Dispose()
        End Sub



    End Class

End Namespace[/VB]
В принципе то что надо получилось, но повторно не получается запустить команду, т.к. такой блок уже имеется....
Его надо удалить из таблицы блоков...
Твой код конечно же более правильный, ща буду разбираться....
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 28.08.2013, 11:41
#175
Boxa

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


Цитата:
Сообщение от DEM Посмотреть сообщение
В принципе то что надо получилось, но повторно не получается запустить команду, т.к. такой блок уже имеется....
ответ тут: http://forum.dwg.ru/showpost.php?p=1...&postcount=171
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 28.08.2013, 11:53
#176
DEM

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


Boxa
Мне кажется его удалять лучше из базы, т.к. он все равно временный....
Возможно следует сделать проверку на то сущетсвует ли блок, а потом еще и удалить его...
PS. У тебя там тоже косячек в коде, нету проверки на то в какое пространство активное....
ЕСли например находишься в пространстве листа, то таблица вставляется в пространстве модели, и при этом не отображается её контур....
Я понимаю что гдей то вот тут надо применить метод, по удалению блока из базы, но не могу его ни как применить...
Цитата:
br.ExplodeToOwnerSpace()
br.Erase()-не работает...
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 28.08.2013, 12:25
#177
Boxa

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


Цитата:
Сообщение от DEM Посмотреть сообщение
Мне кажется его удалять лучше из базы, т.к. он все равно временный....
Да не нужен тебе этот блок. Ты посмотри внимательно на код в CreateBlockWithJig11, там ты вызываешь процедуру создания блока, а потом получаешь ID этого блока и работаешь уже с ним, для Jig все равно с каким объектом работать, ID передал и ладно. Кто тебе не дает так же работать с таблицей? Текстом? Линией? Окружностью? Разницы то никакой.
Просто скопируй код из 173 сообщения в новый проект и все, в функции CreateAndSetTableStyle настраивай и заполняй таблицу как тебе хочется.


PS. Это не косяк, это фитча. =)
Там все размеры таблицы заданы для работы в модели. При этом этот кусок кода вырванный из проекта. В моем коде команду neww_tab необходимо запускать с флагами NoBlockEditor и NoPaperSpace. Код в 173 поправил.
__________________
_бложиг

Последний раз редактировалось Boxa, 28.08.2013 в 12:31.
Boxa вне форума  
 
Непрочитано 28.08.2013, 12:39
#178
DEM

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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Да не нужен тебе этот блок. Ты посмотри внимательно на код в CreateBlockWithJig11, там ты вызываешь процедуру создания блока, а потом получаешь ID этого блока и работаешь уже с ним, для Jig все равно с каким объектом работать, ID передал и ладно
А че ты материшься???
НУ слушай я с VB.net пока на вы....
3-ю неделю только разбираюсь
Ща разберусь в твоем коде...
Спасиб еще раз....
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 30.08.2013, 11:34
#179
DEM

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


Извлечение и добавление данных в колонку dtDataTable с классом List
Код:
[Выделить все]
        Dim dsDataSet As SysD.DataSet = New SysD.DataSet("DocumentDataSet")
        Dim dtDataTable As SysD.DataTable = New SysD.DataTable("Documents")
        dtDataTable.Columns.Add("Name", GetType(String))
        dtDataTable.Columns.Add("Atrib", GetType(IList(Of String)))
        dtDataTable.NewRow()
        dtDataTable.Rows.Add()
        dtDataTable.Rows(0).Item(0) = "ewf"
        dtDataTable.Rows(0).Item(1) = {"wef", "efwwe3", "wfqf"}
ДАнные извлечь к сожалению не получается...
Может сделать как то по другому.

Вопрос снят, разобрался
__________________
Шаг 12й......
Мои публикации

Последний раз редактировалось DEM, 30.08.2013 в 11:47.
DEM вне форума  
 
Непрочитано 30.08.2013, 11:59
#180
Олег (jr.)

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


Эта строка не применима к System.Data.DataTable:
Код:
[Выделить все]
dtDataTable.Columns.Add("Atrib", GetType(IList(Of String)))
Ты можешь использовать только простые типы System.Data,
для списка атрибутов только один столбец для каждого,
название столбца - тэг атрибута, значение по соответствию
См. документацию по DataTable, пригодится...
Олег (jr.) вне форума  
 
Непрочитано 30.08.2013, 12:16
#181
DEM

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


Олег (jr.)
ХЗ все работаетс....
Код:
[Выделить все]
        Dim reer As IList(Of String)
        Dim dsDataSet As SysD.DataSet = New SysD.DataSet("DocumentDataSet")
        Dim dtDataTable As SysD.DataTable = New SysD.DataTable("Documents")
        dtDataTable.Columns.Add("Name", GetType(String))
        dtDataTable.Columns.Add("Atrib", GetType(IList(Of String)))
        dtDataTable.NewRow()
        dtDataTable.Rows.Add()
        dtDataTable.Rows(0).Item(0) = "ewf"
        dtDataTable.Rows(0).Item(1) = {"few", "wef"}
        MsgBox(dtDataTable.Rows(0).Item(1)(1))
        reer = dtDataTable.Rows(0).Item(1)
        MsgBox(reer.Count)
правда работать с этими ячейками через попу получается...
__________________
Шаг 12й......
Мои публикации

Последний раз редактировалось DEM, 30.08.2013 в 13:12.
DEM вне форума  
 
Непрочитано 30.08.2013, 18:38
#182
Олег (jr.)

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


Ну тогда и программа будет ХЗ, делай как тебе нравится
Олег (jr.) вне форума  
 
Непрочитано 02.09.2013, 06:37
#183
DEM

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


Олег (jr.)
Ну так и получается
Работать дальше с этими данными фактически не возможно....
Решил хранить их в списке, и дальше выводить обрабатывать с помошью стрингсплит...
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 30.10.2013, 08:16
#184
DEM

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


НЕ подскажете как сделать фильтр выбора объектов по тегам атрибутов, и выбор поллинии принадлежащей определенному слою...
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 30.10.2013, 11:08
#185
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,843


т.к. ты калач уже тертый - по упрощенке - Editor.GetSelection(SelectionFilter [TypedValue(xxx,yyy);...]) xxx,yyy - аналогично DXF - [(0,"INSERT");(8,"Рельсы")] - фильтр на вхождение блоков на слое рельсы.
з.ы. а простите - мы же из-под "умного" языка делаем - вместо отсталых 0 и 8 -> int DxfCode.Start, int DxfCode.LayerName...
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 30.10.2013 в 11:18.
Дима_ вне форума  
 
Непрочитано 30.10.2013, 13:51
#186
DEM

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


Дима_
Дык нее я ж не постоянно занимаюсь программированием..
Перерывчик вышел, и вернулся к коду, ща смотрю на него критически и собираюсь переделать...
Обернуть все в функции и убрать перебор блоков...
Код:
[Выделить все]
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()    '' Создание массива TypedValue для определение критериев фильтра
            Dim acTypValAr(1) As TypedValue 'Выбираем только Блоки
            acTypValAr.SetValue(New TypedValue(DxfCode.Start, "INSERT"), 0)
            acTypValAr.SetValue(New TypedValue(DxfCode.AttributeTag, "НАИМЕНОВАНИЕ"), 1)

            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
__________________
Шаг 12й......
Мои публикации

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

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


Не работает - это не создается массив или не выбираются атрибуты?
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 30.10.2013, 15:59
#188
DEM

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


брал за основу вот эту функцию...
Код:
[Выделить все]
Public Function getBlockInsPoints(ByVal tag As String) As List(Of Point3d)
        Dim doc As Document = Application.DocumentManager.MdiActiveDocument
        Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Edit​or
        Dim db As Database = doc.Database

        Dim ipoints As New List(Of Point3d)

        Dim p1, p2 As Point3d

        Using acTrans As Transaction = db.TransactionManager.StartTransaction()
            Dim acTypValAr(1) As TypedValue
            Dim blkref As BlockReference

            acTypValAr.SetValue(New TypedValue(DxfCode.Start, "INSERT"), 0)
            acTypValAr.SetValue(New TypedValue(DxfCode.AttributeTag, tag), 1)

            Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
            Dim acSSPrompt As PromptPointResult = doc.Editor.GetPoint("Select First Point:")

            If acSSPrompt.Status = PromptStatus.OK Then
                p1 = acSSPrompt.Value
                acSSPrompt = doc.Editor.GetCorner("Select Second Point: ", p1)
                If acSSPrompt.Status = PromptStatus.OK Then
                    p2 = acSSPrompt.Value
                    Dim wssprompt As PromptSelectionResult

                    wssprompt = ed.SelectCrossingWindow(p1, p2, acSelFtr)
                    If wssprompt.Status = PromptStatus.OK Then
                        Dim wss As SelectionSet = wssprompt.Value
                        For Each acSSObj As SelectedObject In wss
                            If Not IsDBNull(acSSObj) Then
                                blkref = acSSObj.ObjectId.GetObject(OpenMode.ForRead)
                                ipoints.Add(blkref.Position)
                            End If
                        Next
                    End If
                End If
            End If
            acTrans.Commit()
        End Using
        Return ipoints
    End Function
----- добавлено через 28 сек. -----
Не работает фильтр....
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 30.10.2013, 16:39
#189
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,843


#186 - как именно не работает фильтр (ничего не выбирает или все подряд) - на всякий случай - у тебя написанно выбирать только блоки (причем если динамический - то только "не тронутый") с именем "НАИМЕНОВАНИЕ" - только почему-то ты используешь AttributeTag, вместо BlockName = но и то и то двойке равно.
з.ы. если ты таким образом хочешь вытащить только блоки с аттрибутами с именем "НАИМЕНОВАНИЕ" - то так не прокатит, на стадии выборки, можно отсеять, только по критериям доступных из непосредственного вхождения DXF (например проверить флаг, еслть ли в принципе аттрибуты - DxfCode.HasSubentities что есть DXF 66), можно дабавить коомбинацию логики "<OR" "OR>" "<AND" "AND>" и пр., но только на непосредственные значения выбираемого примитива (отделить на стадии выбора, например, тела объемом=XXX - не получится, только постфильтрация, либо создавать самому аналог GetSelection - если будешь заморачиваться на такое - не забудь выложить).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 30.10.2013, 16:43
#190
DEM

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
з.ы. если ты таким образом хочешь вытащить только блоки с аттрибутами с именем "НАИМЕНОВАНИЕ" - то так не прокатит, на стадии выборки, можно отсеять, только по критериям доступных из непосредственного вхождения DXF (например проверить флаг, еслть ли в принципе аттрибуты - DxfCode.HasSubentities что есть DXF 66),
Угу так и хотел, чтобы выбрал динамические блоки с наименованием атрибута "Наименование"
Просто потом выборку не хотел делать....
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 30.10.2013, 16:47
#191
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,843


ну че - так как насчет расширенного GetSelection?? что-то типа выбирать только те, на которые заданный делегат возвращает true?
з.ы. - мне лень.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 30.10.2013, 16:55
#192
Boxa

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
з.ы. а простите - мы же из-под "умного" языка делаем - вместо отсталых 0 и 8 -> int DxfCode.Start, int DxfCode.LayerName...
Сколько желчи =)
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 30.10.2013, 17:04
#193
DEM

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
ну че - так как насчет расширенного GetSelection?? что-то типа выбирать только те, на которые заданный делегат возвращает true?
Мне пока проще тогда выбрать только динамические блоки, а потом во время перебора блоков оставить только те, что с атрибутом Наименование....
Цитата:
Сообщение от Дима_ Посмотреть сообщение
ну че - так как насчет расширенного GetSelection?? что-то типа выбирать только те, на которые заданный делегат возвращает true?
Та я уж и не знаю, что лучше, мне то еще бы с С++ разобраться, есть просто АПИ СКАДа а оно на С++
__________________
Шаг 12й......
Мои публикации
DEM вне форума  
 
Непрочитано 30.10.2013, 17:18
#194
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,843


То Boxa - да не - тут все правильно - с цифрами удобней до поры, до времени - это уже этап пройденный. В MSDos'овские временна были только цифры - да так и вызывались функции с прединициализированными регистрами с числовыми значениями - да еще в документации они всегда были шестнадцетиричными - так удобней было (количество символов одинаковое). Но когда количество функций перескочило всего-лишь за сотню (в MSDos практически все функции "висели" на 21h - (HEX) прерывании, да были еще функции биос (на 10h, 13h и пр.), но в самом досе почти все использовалось только с 21h (на остальном небольшом количестве прерываний (interput - основной метод вызова внешних "системных" функций того времени) - было по 1 - 2 функции, или вобще не было, а просто оно использовалось в определенных целях как таковое), то стало очевидно что в них (и их подфункциях) уже не создать такой типизированной структуры с четким принципом разделения регистров. Оно-же и с DXF - чем более новые навороты в ней описываються, тем геморней их достать - т.к. "поверхостными", схожими по смыслу полями (как в ранних версиях DXF) все описать не получается.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 08.05.2014, 13:02
#195
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 207


Подскажите пожалуйста по простому примеру, как здесь организовать вызов команды AddLine, чтобы она принимала значения точек x1,y1 и x2,y2 в качестве параметров или "тыком" на рабочем поле АвтоГада.
Пробовал написать
Код:
[Выделить все]
 public static void AddLine(double x1, double y1, double x2, double y2)
, но не пойму, как вызвать в АвтоГаде. Если просто AddLine -> полет к дяде Биллу, а остальные варианты типа AddLine(100,200,300,400) не проходят. До чего еще я не додумался?


Код:
[Выделить все]
 #region "Imports"
//system
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Threading;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Collections;
//acad
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
#endregion


namespace AddLine
{
    public class Class1
    {
        [CommandMethod("AddLine")]
        public static void AddLine()

        {
            double x1; double y1; double x2; double y2;
            x1 = 0; y1 = 0; x2 = 200; y2 = 400;
            //Получение текущего документа и базы данных чертежа
            Document acDoc = Application.DocumentManager.MdiActiveDocument;
            Database acCurDb = acDoc.Database;
            //Начало транзакции
            using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
            {
                //Открыть таблицу блоков для чтения
                BlockTable acBlkTbl;
                acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
                                                  OpenMode.ForRead) as BlockTable;

                //Открыть таблицу блоков пространства модели для записи
                BlockTableRecord acBlkTblRec;
                acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
                                                     OpenMode.ForWrite) as BlockTableRecord;

                // Создание линии по точкам x1,y1 и x2,y2
                Line acLine = new Line(new Point3d(x1, y1, 0),new Point3d(x2, y2, 0));
                acLine.SetDatabaseDefaults();

                // Добавление нового объекта в базу и транзакция
                acBlkTblRec.AppendEntity(acLine);
                acTrans.AddNewlyCreatedDBObject(acLine, true);

                // Сохранение нового объекта в базе данных чертежа
                acTrans.Commit();
            }
        }
    }
}
alex8888 вне форума  
 
Непрочитано 08.05.2014, 15:29
#196
Boxa

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


Цитата:
Сообщение от alex8888 Посмотреть сообщение
"тыком" на рабочем поле АвтоГада
Код:
[Выделить все]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using App = Autodesk.AutoCAD.ApplicationServices;
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Gem = Autodesk.AutoCAD.Geometry;
using Rtm = Autodesk.AutoCAD.Runtime;

// [assembly: Rtm.CommandClass(typeof(MyClassSerializer.Commands))]

namespace AddLine
{
    public class Commands
    {
        [Rtm.CommandMethod("AddLine")]
        static public void AddLine()
        {
            // Получение текущего документа и базы данных
            App.Document acDoc = App.Application.DocumentManager.MdiActiveDocument;
            Db.Database acCurDb = acDoc.Database;

            Ed.PromptPointOptions p1Opt = new Ed.PromptPointOptions("\nУкажите первую точку:");
            Ed.PromptPointResult p1Res = acDoc.Editor.GetPoint(p1Opt);
                if (p1Res.Status != Ed.PromptStatus.OK)
                    return;

            Ed.PromptPointOptions p2Opt = new Ed.PromptPointOptions("\nУкажите вторую точку:");
            p2Opt.BasePoint = p1Res.Value;
            p2Opt.UseBasePoint = true;
            Ed.PromptPointResult p2Res = acDoc.Editor.GetPoint(p2Opt);
            if (p2Res.Status != Ed.PromptStatus.OK)
                return;           
            
            // старт транзакции
            using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
            {
                // Открытие таблицы Блоков для чтения
                Db.BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, Db.OpenMode.ForRead) as Db.BlockTable;

                // Открытие записи таблицы Блоков пространства Модели для записи
                Db.BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[Db.BlockTableRecord.ModelSpace],
                                                                                Db.OpenMode.ForWrite) as Db.BlockTableRecord;
                // Создание отрезка
                Db.Line acLine = new Db.Line(p1Res.Value, p2Res.Value);
                acLine.SetDatabaseDefaults();
                // Добавление нового объекта в запись таблицы блоков и в транзакцию
                acBlkTblRec.AppendEntity(acLine);
                acTrans.AddNewlyCreatedDBObject(acLine, true);
                // Сохранение нового объекта в базе данных
                acTrans.Commit();
            }
        }
    }
}
PS.
Забавно в теме "VB.net для чайников". Вопросы программирования под Autocad и © читать код на C# =)
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 08.05.2014, 16:10
#197
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 207


Boxa, спасибо, пойду дальше разбирать

Цитата:
Забавно в теме "VB.net для чайников".
Упс, прошу прощения, немного обшибся
alex8888 вне форума  
 
Непрочитано 08.05.2014, 17:39
#198
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,550


Может быть закрепить эту тему?
gomer вне форума  
 
Непрочитано 25.12.2014, 19:10
#199
Борейша Константин

Инженер
 
Регистрация: 18.12.2014
Сообщений: 1


Друзья, помогите разобраться!
Раньше по мере необходимости писал приложения для AutoCad на VBA.
И каждая новая версия AutoCad заставляла перерабатывать написанное всё заново.
Прочитал много тем на этом и других форумах. Все переходят на -.NET
Который, как я понимаю, позволяет писать на любом удобном языке и компилировать в одно приложение.
Размышления - вопросы у меня такие. Если в редакторе VBA, непосредственно я мог посмотреть результат сразу
что там делает программа, то теперь мне нужно кучу действий совершить чтобы посмотреть как программа работает в AutoCad?
Потом, если я продолжу создавать приложения в VB, на базе -.NET то нет гарантии, что в следующей версии
опять не изменятся имена классов, объектов или что там они меняют, что не работают программы.
Могу ли я поставить старый AutoCad 2010 и скомпилировать dll, подгрузив те старые библиотеки и новые из AutoCad 2013, будет ли это работать?
И по скольку придётся изучать по новому синтаксис и многие другие вещи, если перейду под .NET , то может лучше
VisualLISP изучить, на сколько я понимаю приложения на нём более долговечнее в AutoCad, чем написанные на VBA?

Спасибо.
Борейша Константин вне форума  
 
Непрочитано 30.12.2014, 09:37
#200
Александр Ривилис

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


Если главный критерий - долговечность, то лисп. А если гибкость, скорость работы, возможность создания красивого и удобного интерфейса - то один из .NET языков. Лучше C# - как минимум больше примеров.
Александр Ривилис вне форума  
 
Непрочитано 30.12.2014, 11:42
#201
Сергей812


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


И если на NetApi - то разделяйте логику программы.. работа с БД чертежа отдельно, обработка данных, взаимодействие с файлами xml, БД и т.д. -отдельно в своих функциях, модулях, классах. В результате даже при изменении методов взаимодействия с БД чертежа придется переписывать и отлаживать лишь часть кода, а не перелопачивать весь проект. Хотя простенькие "макросы" можно писать и в VBA стиле - все в кучу)
Сергей812 вне форума  
 
Непрочитано 30.12.2014, 12:39
#202
trir


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


dotNet, переход с 2013 на 2015 - подключить новые библиотеки + одна новая, изменений классов не заметил, просто некоторые классы ввывели в отдельную библиотеку - очень логично и рационально...
trir вне форума  
 
Непрочитано 30.12.2014, 12:44
#203
Александр Ривилис

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


Цитата:
Сообщение от trir Посмотреть сообщение
переход с 2013 на 2015
Уточнение. Разделение acmgd.dll на acmgd.dll и accoremgd.dll произошло в AutoCAD 2013. Так что новые библиотеки в 2015 по сравнению с 2013 (а не 2012) не нужны.
Александр Ривилис вне форума  
 
Непрочитано 30.12.2014, 14:21
#204
Boxa

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


По поводу долговечности.
У меня такой опыт: Утилиты написанные в 2011 году, работают в акаде 2015 (компилирую под новые версии и все, в код ни разу не лазил). ИМХО, с 2006 года АПИ уже достаточно устоялся.
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 30.12.2014, 14:47
#205
trir


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


Таки да с 2012 на 2013,2015. И так у меня были проблемы - нужно было добавить accoremgd.dll и всё!
trir вне форума  
 
Непрочитано 30.12.2014, 14:57
#206
Александр Ривилис

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


Цитата:
Сообщение от Boxa Посмотреть сообщение
ИМХО, с 2006 года АПИ уже достаточно устоялся.
Точнее с 2007-го. В 2007-ом появилась возможность писать lisp-функции на .NET и исправили баг с ResultBuffer (в 2006-ом нельзя было использовать вложенные списки и соотвественно была проблема с DXF-кодами)
Александр Ривилис вне форума  
 
Непрочитано 30.12.2014, 15:28
#207
Boxa

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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Точнее с 2007-го.
Я имел в виду. что net api появился в 2006 году
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 30.12.2014, 15:33
#208
Александр Ривилис

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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Я имел в виду. что net api появился в 2006 году
Тогда еще одна неточность. .NET API появилась в AutoCAD 2005, т.е. в 2004 году.
Александр Ривилис вне форума  
 
Непрочитано 30.12.2014, 15:40
#209
ur_naz


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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Если главный критерий - долговечность, то лисп.
Как показывает практика, долговечность лиспа - миф
ur_naz вне форума  
 
Непрочитано 30.12.2014, 15:43
#210
Александр Ривилис

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


Цитата:
Сообщение от ur_naz Посмотреть сообщение
Как показывает практика, долговечность лиспа - миф
Так как это опровержение моих слов, то жду подтверждения.
P.S.: Какие-то из моих lisp-программ в неизменном виде работают уже 25 лет. Не это ли долговечность?

Последний раз редактировалось Александр Ривилис, 30.12.2014 в 16:17.
Александр Ривилис вне форума  
 
Непрочитано 30.12.2014, 17:24
#211
Do$

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


Цитата:
Сообщение от ur_naz Посмотреть сообщение
Как показывает практика, долговечность лиспа - миф
Если программа - сплошной набор строк (command ...) - то да.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума