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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > .NET 4.5. Баг с .MdiDocumentManager.ActiveDocument (Автокад 2015-17)

.NET 4.5. Баг с .MdiDocumentManager.ActiveDocument (Автокад 2015-17)

Ответ
Поиск в этой теме
Непрочитано 19.12.2018, 13:04 #1
.NET 4.5. Баг с .MdiDocumentManager.ActiveDocument (Автокад 2015-17)
p_sh
 
новичок
 
Ярославль
Регистрация: 19.06.2005
Сообщений: 3,415

не нахожу свойства ActiveDocument или GetDocument() в библиотеке AcCoreMgd.dll, чтобы использовать с .Interop.AcadDocument

есть ли решение проблемы?

в версиях 2012, 18-19 работает
__________________
хорошее - в обыденном
Просмотров: 4043
 
Непрочитано 19.12.2018, 13:15
#2
trir


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


MdiActiveDocument
CurrentDocument
trir вне форума  
 
Непрочитано 19.12.2018, 13:19
#3
Do$

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


А в AcMgd.dll нет, случаем?
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 19.12.2018, 13:24
#4
trir


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


Цитата:
А в AcMgd.dll нет, случаем?
там есть DocumentExtension с методом GetAcadDocument()
trir вне форума  
 
Автор темы   Непрочитано 19.12.2018, 14:03
#5
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


Цитата:
MdiActiveDocument
CurrentDocument
такого нет (см картинка)
Цитата:
Там есть DocumentExtension с методом GetAcadDocument()
но он с AcadDocument не дружит. или пользую не правильно
Миниатюры
Нажмите на изображение для увеличения
Название: нет cd.png
Просмотров: 47
Размер:	24.9 Кб
ID:	209233  
__________________
хорошее - в обыденном
p_sh вне форума  
 
Непрочитано 19.12.2018, 14:29
1 | #6
trir


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


Цитата:
или пользую не правильно
как то так:
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acDocCom as AcadDocument = DocumentExtension.GetAcadDocument(acDoc)
trir вне форума  
 
Автор темы   Непрочитано 19.12.2018, 14:38
#7
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


Цитата:
как то так:
заработало
__________________
хорошее - в обыденном
p_sh вне форума  
 
Автор темы   Непрочитано 19.12.2018, 18:34
#8
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


готовый проект https://yadi.sk/d/oWzio45REXcl3A
Миниатюры
Нажмите на изображение для увеличения
Название: dc14713_1.jpg
Просмотров: 34
Размер:	13.3 Кб
ID:	209245  
__________________
хорошее - в обыденном

Последний раз редактировалось p_sh, 19.12.2018 в 20:57.
p_sh вне форума  
 
Непрочитано 19.12.2018, 18:38
#9
Кулик Алексей aka kpblc
Moderator

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


VBA под ACAD не устанавливал, не устанавливаю и устанавливать не собираюсь. В остальном - почему не используется вариант Bundle-пакетов?
И, кстати, 700 kb прекрасно прикрепляются к посту.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.12.2018, 18:39
#10
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


Цитата:
Bundle-пакетов?
ээ-э.... пойду посмотрю в гугле, что за зверь.


Я решил, что пользователь может вставить привычные себе кнопки . И, потом я понятия не имел: что такое эти пакеты, и как их использовать пока не знаю.


C vba история такая, что для непрофессионала, занимающегося программированием по случаю, позволяет что-то реализовать довольно просто. (плюсы есть)
__________________
хорошее - в обыденном

Последний раз редактировалось p_sh, 19.12.2018 в 18:46.
p_sh вне форума  
 
Непрочитано 19.12.2018, 19:00
1 | #11
Сергей812


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


Цитата:
Сообщение от p_sh Посмотреть сообщение
C vba история такая, что для непрофессионала, занимающегося программированием по случаю, позволяет что-то реализовать довольно просто. (плюсы есть)
Полезно почитать - про производительность VBA
Сергей812 вне форума  
 
Автор темы   Непрочитано 19.12.2018, 19:05
#12
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


в моем случае совершенно справедливо утверждение: лучшее - враг хорошего.
я vb.net неделю назад только первый раз увидел, и если бы не basic...
__________________
хорошее - в обыденном
p_sh вне форума  
 
Непрочитано 19.12.2018, 19:20
#13
Сергей812


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


Цитата:
Сообщение от p_sh Посмотреть сообщение
я vb.net неделю назад только первый раз увидел, и если бы не basic...
.Net и basic - две параллельные вселенные) Даже если использовать VB.Net через Interop.
Сергей812 вне форума  
 
Автор темы   Непрочитано 19.12.2018, 19:30
#14
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


Мне показались очень похожими. Большими фрагментами мог код vba использовать
__________________
хорошее - в обыденном
p_sh вне форума  
 
Непрочитано 19.12.2018, 19:36
#15
trir


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


Цитата:
Мне показались очень похожими. Большими фрагментами мог код vba использовать
это фишка VB.NET (и вообще BASIC от Microsoft) - можно писать в VBA-style, а можно и не писать и это, ять, как небо и земля
Я вставлял код из GW BASIC в VBA - и он там работал! с минимум изменений, а один кусок я там потом оставил вообще без изменений
trir вне форума  
 
Непрочитано 19.12.2018, 19:36
#16
Сергей812


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


Цитата:
Сообщение от p_sh Посмотреть сообщение
Большими фрагментами мог код vba использовать
это Interop потому что. Там да - очень большая похожесть на код VBA акада при использовании VB.Net, ну а минус - небольшая скорость работы с объектами чертежа.

----- добавлено через ~5 мин. -----
Цитата:
Сообщение от trir Посмотреть сообщение
Я вставлял код из GW BASIC в VBA - и он там работал! с минимум изменений, а один кусок я там потом оставил вообще без изменений
Это логично - что базовый синтаксис VB.Net похож на VB/VBA, а синтаксис C# - на С/С++. Было бы удивительно - если бы вообще все новое придумали бы)
Сергей812 вне форума  
 
Автор темы   Непрочитано 19.12.2018, 19:47
#17
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


Я имею в виду синтаксис
dim a as string
for - next
if else endif
и пр.
а какие объекты из каких библиотек в них вкладывать совершенно все равно (если знаешь какие)
__________________
хорошее - в обыденном
p_sh вне форума  
 
Непрочитано 20.12.2018, 07:01
#18
trir


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


Цитата:
for - next
какой? их два
trir вне форума  
 
Автор темы   Непрочитано 20.12.2018, 07:39
#19
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


я только одним пользуюсь
for i=1 to n
...
next
__________________
хорошее - в обыденном
p_sh вне форума  
 
Непрочитано 20.12.2018, 07:55
1 | #20
trir


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


Цитата:
я только одним пользуюсь
for i=1 to n
...
next
я им почти не пользуюсь

Последний раз редактировалось trir, 20.12.2018 в 08:01.
trir вне форума  
 
Автор темы   Непрочитано 20.12.2018, 08:08
#21
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


я не тороплюсь..

с использованием
for next: https://yadi.sk/i/QC49yDHRp9zo2g
__________________
хорошее - в обыденном
p_sh вне форума  
 
Непрочитано 20.12.2018, 09:08
#22
Boxa

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


Цитата:
Сообщение от p_sh Посмотреть сообщение
готовый проект https://yadi.sk/d/oWzio45REXcl3A
Я бы так не сказал, скорее заготовка и вот почему:
1. Использование зоопарка из VBA + Lisp + .NET
2. Использование абсолютных путей во всех методах, а если злобный админ или правила компании не позволяют создать каталог C:\p_sh.net\ , тогда что?
3. Вся логика программы внутри форм, более того, внутри кнопок.
4. Реакторы, которые Вы активируете по командам из лисп файла, поместите в автозагрузку dll, не издевайтесь над пользователем. Не так давно, на форуме обсуждали автозагрузку dll из Lisp, посмотрите, там более полный вариант, чем у Вас.
5. Методы P_sh_context_toolbar_load, AppEndOpen, AppNewDrawing, AppActivateDrawing класса P_sh_context_toolbar_load это лютый .... вызывать команду netload для загрузки команд определенных в этом же классе, простите, но это за гранью добра и зла.

ЗЫ.
Если что, то я не программист и программы писать не умею, на жизнь зарабатываю проектированием ЖБ конструкций.
__________________
_бложиг
Boxa на форуме  
 
Автор темы   Непрочитано 20.12.2018, 09:51
#23
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


Цитата:
зарабатываю проектированием ЖБ конструкций.
коллега. (зацените VBA https://yadi.sk/i/QC49yDHRp9zo2g )
Цитата:
и программы писать не умею
симметрично.
но меня устраивает уже тот факт, что:
1 использование удобно.
2 программа работает = выдает ожидаемый результат.

Я готов конечно расширять горизонты, но в случае если к этому будет необходимость или интерес.

с "классами" начал знакомится вот только что.
__________________
хорошее - в обыденном
p_sh вне форума  
 
Непрочитано 20.12.2018, 10:17
#24
Boxa

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


Вы меня извините, за назойливость, но тут не про расширение горизонтов нужно говорить, а об основах и понимании принципов. Понимании, что такое типы данных и как с ними работать, что такое архитектура программы и какие они бывают...

И еще совет, если уж Вам так нравиться работать с ini файлами (хотя это очень странно хранить настройки в INI, при наличии xml и json), выделите это в отдельные методы, т.к. натыкаться постоянно на конструкции типа:
Код:
[Выделить все]
Dim text As String = Strings.Space(255)
Dim text2 As String = "p_sh_contexttoolbar"
Dim text3 As String = "bmpfromcopy"
Dim text4 As String = ""
Dim arg_3A_4 As Long = 255L
Dim text5 As String = "C:\p_sh.net\p_sh_contexttoolbar.ini"
Dim num As Integer = CInt(P_Sh_context_toolbar_command.GetPrivateProfileString(text2, text3, text4, text, arg_3A_4, text5))
text = Strings.Left(text, num)
совсем не комильфо и постоянное обращение к диску явно снижает скорость работы, тут нужен несколько другой механизм, и если уж начали изучать классы, то погуглите, что такое синглтон и как с ним работать.
__________________
_бложиг
Boxa на форуме  
 
Автор темы   Непрочитано 20.12.2018, 10:27
#25
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


как понимаю тут о внутренней кухне речь, а если у пользователей спросить: почувствуют они разницу или нет.

создам тему в разделе автокад...
__________________
хорошее - в обыденном
p_sh вне форума  
 
Непрочитано 20.12.2018, 11:40
#26
Сергей812


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


Цитата:
Сообщение от p_sh Посмотреть сообщение
как понимаю тут о внутренней кухне речь,
Здесь не о внутренней кухне - а о подходе к структуре программы. Еще один образец:

Код:
[Выделить все]
 
      this.Button11 = new Button();
      this.Button12 = new Button();
      this.Button13 = new Button();
      this.Button14 = new Button();
      this.Button15 = new Button();
      this.Button16 = new Button();
      ...
      this.Button53 = new Button();
      this.Button52 = new Button();
      this.Button51 = new Button();
и т.д.
А если понадобиться изменить количество кнопок? Скажете - все решаемо и пойдете копипастить строки кода?

Или открыть любой из учебников по WinForms и дочитать до главы о контейнерах. И тогда код примет более "опрятный" вид:

Код:
[Выделить все]
    ''' <summary>
    ''' Общий обработчик события нажатия кнопки
    ''' </summary>
    ''' <param name="sender">Источник сообщения - кнопка</param>
    ''' <param name="e">Дополнительные аргументы</param>
    Private Sub ActionClickButton(sender As Object, e As EventArgs)
        ' Получаем нажатую кнопку
        Dim lButton As Button = CType(sender, Button)
        ' Получаем информацию из Tag и просто отображаем. 
        ' А можно хранить любую информацию, хоть подготовленные команды к исполнению
        MsgBox("Нажата кнопка № " & CStr(lButton.Tag))
    End Sub


    ''' <summary>
    ''' Событие загрузки формы
    ''' </summary>
    ''' <param name="sender">Источник сообщения - форма</param>
    ''' <param name="e">Дополнительные аргументы</param>
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Количество строк и столбцов (Можно вместо констант задавать из настроек динамически)
        Const CountRows = 10
        Const CountColumns = 10
        ' Создаем сетку-таблицу
        Dim lGrid As TableLayoutPanel = New TableLayoutPanel()
        ' Задаем отступы
        lGrid.Margin = New Padding(3)
        lGrid.Padding = New Padding(3)
        ' Задаем размещение во всю форму
        lGrid.Dock = DockStyle.Fill
        ' Задаем количество и стиль строк
        lGrid.RowCount = CountRows
        For i As Integer = 0 To CountRows - 1
            lGrid.RowStyles.Add(New RowStyle)
            lGrid.RowStyles(i).SizeType = SizeType.Percent
            lGrid.RowStyles(i).Height = 100 / CountRows
        Next i
        ' Задаем количество и стиль столбцов
        lGrid.ColumnCount = CountColumns
        For i As Integer = 0 To CountColumns - 1
            lGrid.ColumnStyles.Add(New ColumnStyle)
            lGrid.ColumnStyles(i).SizeType = SizeType.Percent
            lGrid.ColumnStyles(i).Width = 100 / CountColumns
        Next i
        ' Добавляем сетку на форму
        Me.Controls.Add(lGrid)
        ' В цикле заполняем кнопками
        For lRow As Integer = 1 To CountRows
            For lColumn As Integer = 1 To CountColumns
                ' Создаем объект кнопки
                Dim lButton As Button = New Button()
                ' Задаем все необходимые параметры кнопки
                lButton.Dock = DockStyle.Fill
                lButton.Tag = (lRow - 1) * 10 + lColumn
                lButton.Text = CStr(lButton.Tag)
                ' Подключаем обработчик нажатия кнопки (один на все кнопки)
                AddHandler lButton.Click, AddressOf ActionClickButton
                ' Добавляем в сетку в указанную ячейку
                lGrid.Controls.Add(lButton, lColumn - 1, lRow - 1)
            Next lColumn
        Next lRow
    End Sub
и можно будет дать пользователю настраивать - кому то и 10-ти кнопок хватит, кому то и сотни мало будет.
Сергей812 вне форума  
 
Автор темы   Непрочитано 20.12.2018, 11:46
#27
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


красиво.
Цитата:
открыть любой из учебников по WinForms
обработчик то у меня один...(почти)
а вот кнопки рисовать это да-с, учебник зря-с не открывали-с.

и главное: нужно было представлять, что он есть.
__________________
хорошее - в обыденном

Последний раз редактировалось p_sh, 20.12.2018 в 11:59.
p_sh вне форума  
 
Непрочитано 20.12.2018, 12:03
#28
Сергей812


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


Цитата:
Сообщение от p_sh Посмотреть сообщение
обработчик то у меня один...(почти)
Хм, и где он почти один?

Код:
[Выделить все]
private void Button12_Click(object sender, EventArgs e)
private void Button13_Click(object sender, EventArgs e)
private void Button14_Click(object sender, EventArgs e)
и т.д.
Сергей812 вне форума  
 
Автор темы   Непрочитано 20.12.2018, 12:29
#29
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Хм, и где он почти один?

Код:
[Выделить все]
private void Button12_Click(object sender, EventArgs e)
private void Button13_Click(object sender, EventArgs e)
private void Button14_Click(object sender, EventArgs e)
и т.д.
унутре ссылка на одну функцию
__________________
хорошее - в обыденном
p_sh вне форума  
 
Непрочитано 20.12.2018, 12:41
1 | 1 #30
Сергей812


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


Цитата:
Сообщение от p_sh Посмотреть сообщение
унутре ссылка на одну функцию
Там один и тот же код в десяток строк в каждом обработчике - полтысячи лишних строк. Когда можно было написать один обработчик даже в вашем варианте и просто присвоить всем кнопкам.

----- добавлено через ~9 мин. -----
отвыкайте от VBA стиля обработчиков -> не просто же так введен аргумент sender (ссылающийся на контрол-источник сообщения) в обработчиках событий контролов.
Сергей812 вне форума  
 
Непрочитано 20.12.2018, 15:08
#31
Boxa

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


Цитата:
Сообщение от p_sh Посмотреть сообщение
коллега. (зацените VBA https://yadi.sk/i/QC49yDHRp9zo2g )
Т.к. Вы коллега и немного программируете, то отвечу честно и вероятно Вас обижу, но это должно пойти Вам на пользу. То, что я увидел, это:
1 - чудовищно долго и трудоемко, 2 - рекомендую познакомиться с динамическими блоками, 3 - рекомендую посмотреть на задачу под другим углом, что позволит существенно увеличить производительность на пару порядков.
__________________
_бложиг
Boxa на форуме  
 
Автор темы   Непрочитано 20.12.2018, 18:35
#32
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


коллега, ничуть.
1,2 может быть.
3. порядков
__________________
хорошее - в обыденном
p_sh вне форума  
 
Автор темы   Непрочитано 29.12.2018, 08:53
#33
p_sh

новичок
 
Регистрация: 19.06.2005
Ярославль
Сообщений: 3,415


Цитата:
А если понадобиться изменить количество кнопок? Скажете - все решаемо и пойдете копипастить строки кода?

Или открыть любой из учебников по WinForms и дочитать до главы о контейнерах. И тогда код примет более "опрятный" вид:

Код:
[Выделить все]
    ''' <summary>
    ''' Общий обработчик события нажатия кнопки
    ''' </summary>
    ''' <param name="sender">Источник сообщения - кнопка</param>
    ''' <param name="e">Дополнительные аргументы</param>
    Private Sub ActionClickButton(sender As Object, e As EventArgs)
        ' Получаем нажатую кнопку
        Dim lButton As Button = CType(sender, Button)
        ' Получаем информацию из Tag и просто отображаем. 
        ' А можно хранить любую информацию, хоть подготовленные команды к исполнению
        MsgBox("Нажата кнопка № " & CStr(lButton.Tag))
    End Sub


    ''' <summary>
    ''' Событие загрузки формы
    ''' </summary>
    ''' <param name="sender">Источник сообщения - форма</param>
    ''' <param name="e">Дополнительные аргументы</param>
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Количество строк и столбцов (Можно вместо констант задавать из настроек динамически)
        Const CountRows = 10
        Const CountColumns = 10
        ' Создаем сетку-таблицу
        Dim lGrid As TableLayoutPanel = New TableLayoutPanel()
        ' Задаем отступы
        lGrid.Margin = New Padding(3)
        lGrid.Padding = New Padding(3)
        ' Задаем размещение во всю форму
        lGrid.Dock = DockStyle.Fill
        ' Задаем количество и стиль строк
        lGrid.RowCount = CountRows
        For i As Integer = 0 To CountRows - 1
            lGrid.RowStyles.Add(New RowStyle)
            lGrid.RowStyles(i).SizeType = SizeType.Percent
            lGrid.RowStyles(i).Height = 100 / CountRows
        Next i
        ' Задаем количество и стиль столбцов
        lGrid.ColumnCount = CountColumns
        For i As Integer = 0 To CountColumns - 1
            lGrid.ColumnStyles.Add(New ColumnStyle)
            lGrid.ColumnStyles(i).SizeType = SizeType.Percent
            lGrid.ColumnStyles(i).Width = 100 / CountColumns
        Next i
        ' Добавляем сетку на форму
        Me.Controls.Add(lGrid)
        ' В цикле заполняем кнопками
        For lRow As Integer = 1 To CountRows
            For lColumn As Integer = 1 To CountColumns
                ' Создаем объект кнопки
                Dim lButton As Button = New Button()
                ' Задаем все необходимые параметры кнопки
                lButton.Dock = DockStyle.Fill
                lButton.Tag = (lRow - 1) * 10 + lColumn
                lButton.Text = CStr(lButton.Tag)
                ' Подключаем обработчик нажатия кнопки (один на все кнопки)
                AddHandler lButton.Click, AddressOf ActionClickButton
                ' Добавляем в сетку в указанную ячейку
                lGrid.Controls.Add(lButton, lColumn - 1, lRow - 1)
            Next lColumn
        Next lRow
    End Sub
и можно будет дать пользователю настраивать - кому то и 10-ти кнопок хватит, кому то и сотни мало будет.
попробовал реализовать предложенный вариант
получается интересно
__________________
хорошее - в обыденном
p_sh вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > .NET 4.5. Баг с .MdiDocumentManager.ActiveDocument (Автокад 2015-17)

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автокад 2015 виснет при смене формата отображения точек markfsm AutoCAD 2 23.01.2018 08:40
Помогите решить проблему с настройками(?) автокад 2008, 2015: невозможно одновременно посылать на печать несколько листов Ir4a AutoCAD 1 16.03.2017 15:12
Автокад 2015. Долго думает при вводе с клавиатуры ошибочной команды Бали AutoCAD 3 11.12.2016 13:58