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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Обращение к коллекции вызывает краш автокада (VB.NET)

Обращение к коллекции вызывает краш автокада (VB.NET)

Ответ
Поиск в этой теме
Непрочитано 07.11.2018, 12:02 #1
Обращение к коллекции вызывает краш автокада (VB.NET)
ramber
 
Регистрация: 18.04.2011
Сообщений: 35

Всем привет!
Начинаю медленный и плавный переход из VBA в VB.NET. Идет тяжело...
Написал программку, которая сохраняет все открытые файлы, которые возможно сохранить и закрывает автокад.

Вылетает в строке:
For Each Document In Document.Application.Documents

На VBA она была :
For Each Document In Documents
но так компилятор сильно ругался((

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

    Public Class Commands

        <CommandMethod("SNE")>
        Public Shared Sub SaveAndExit()

            Dim Document As AutoCAD.AcadDocument

            For Each Document In Document.Application.Documents

                On Error Resume Next

                Document.Save()

                If Err.Number <> 0 Then
                    Document.Close(False)
                Else
                    Document.Close(True)
                End If

                On Error GoTo 0

            Next
            Autodesk.AutoCAD.ApplicationServices.Core.Application.Quit()

        End Sub
    End Class
End Namespace
Просмотров: 8838
 
Непрочитано 07.11.2018, 12:14
#2
Кулик Алексей aka kpblc
Moderator

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


Возможно, я ошибаюсь - но наверняка ошибка возникает при попытке закрытия активного документа, из которого и была запущена команда.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.11.2018, 12:34
#3
trir


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


жуть
Код:
[Выделить все]
Imports AppServ = Autodesk.AutoCAD.ApplicationServices
...
    <CommandMethod("SNE")>
    Public Shared Sub SaveAndExit()

        'Dim Document As AutoCAD.AcadDocument

        For Each doc In AppServ.Application.DocumentManager

                AppServ.DocumentExtension.CloseAndSave(doc, doc.Name)

        Next
        AppServ.Application.Quit()

    End Sub
On Error Resume Next - ох ты боже мой...

Последний раз редактировалось trir, 07.11.2018 в 12:48.
trir на форуме  
 
Непрочитано 07.11.2018, 12:41
#4
frostmourn


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


Переходите на лисп!
frostmourn вне форума  
 
Непрочитано 07.11.2018, 12:49
#5
trir


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


Цитата:
Переходите на лисп!
на нём это не сделаешь, без больших танцев с бубном
trir на форуме  
 
Непрочитано 07.11.2018, 13:10
#6
Сергей812


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


хм, а почему не в контексте приложения запускаете команду (флаг Session) ?

----- добавлено через 58 сек. -----
собственно на это Алексей и намекал)
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
наверняка ошибка возникает при попытке закрытия активного документа, из которого и была запущена команда.
Сергей812 вне форума  
 
Непрочитано 07.11.2018, 13:16
#7
trir


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


не всё так просто...
Код:
[Выделить все]
    <CommandMethod("SNE")>
    Public Shared Sub SaveAndExit()

        For Each doc As AppServ.Document In AppServ.Application.DocumentManager
            If Not doc.IsActive Then
                AppServ.DocumentExtension.CloseAndSave(doc, doc.Name)
            Else
                doc.Database.SaveAs(doc.Name, True, DwgVersion.Current, doc.Database.SecurityParameters)
                doc.Window.Close()
            End If
        Next
        AppServ.Application.Quit()

    End Sub
trir на форуме  
 
Автор темы   Непрочитано 07.11.2018, 13:24
#8
ramber


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Возможно, я ошибаюсь - но наверняка ошибка возникает при попытке закрытия активного документа, из которого и была запущена команда.
Возможно на ней тоже возникнет, но до нее я еще не дошел)

Цитата:
Сообщение от trir Посмотреть сообщение
жуть
Согласен.. Но на VBA по-другому никак.

Подскажите, пожалуйста, переменной "doc" какой тип нужно задать?
ramber вне форума  
 
Непрочитано 07.11.2018, 13:26
#9
trir


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


не нужно - doc As AppServ.Document
не забудь про Imports AppServ = Autodesk.AutoCAD.ApplicationServices

Цитата:
Идет тяжело...
Цитата:
которая сохраняет все открытые файлы
сложную тему взял
Существует большая разница между COM и NET API - и хотя вполне можно использовать COM, так почти никогда не делают...
trir на форуме  
 
Непрочитано 07.11.2018, 14:21
#10
Сергей812


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


а еще не забудьте, что файл *.dwg может иметь атрибут файловой системы "Только для чтения" либо быть открыт другим пользователем в случае нахождения на сервере. Если не изменяет память - то это логическое свойство document.IsReadOnly .
Сергей812 вне форума  
 
Непрочитано 07.11.2018, 15:19
#11
Boxa

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


я не очень хорошо помню этот момент, но разве можно применять ForEach к меняющейся коллекции...
Если я правильно помню, как раскрывается этот "сахарок" в IL, то удаляя/закрывая первый элемент коллекции она вся смещается "вверх", а количество элементов и инкремент не меняются и рано или поздно попытка получить объект встречает Null...
Boxa вне форума  
 
Непрочитано 07.11.2018, 15:23
#12
trir


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


по идее да, но у меня всё работает
trir на форуме  
 
Непрочитано 07.11.2018, 15:26
#13
Сергей812


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


главное, чтобы потом ТС не встретил ситуацию - когда "напортачил" в файле и поэтому не сохранил, а автоматизация любезно сделала это за него)

----- добавлено через ~7 мин. -----
а еще нелишним будет напомнить по системную переменную DWGTITLED для определения - был ли вообще чертеж сохранен после создания.
Сергей812 вне форума  
 
Непрочитано 08.11.2018, 10:37
#14
frostmourn


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


Цитата:
Сообщение от trir Посмотреть сообщение
на нём это не сделаешь, без больших танцев с бубном
Не согласен. Всё довольно просто.
frostmourn вне форума  
 
Непрочитано 08.11.2018, 10:47
#15
trir


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


Цитата:
Не согласен. Всё довольно просто.
покажи
trir на форуме  
 
Непрочитано 08.11.2018, 12:01
#16
Сергей812


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


И для коллекции - реализация резервного копирования от Бушмана Андрея. Не пугайтесь простыни кода - само сохранение копии: 3 строки - №183..185.
Сергей812 вне форума  
 
Непрочитано 09.11.2018, 09:33
#17
trir


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


frostmourn как успехи?
trir на форуме  
 
Непрочитано 13.11.2018, 11:36
#18
frostmourn


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


Если тут какой-то подвох, то я не увидел. Вот простейший пример
Код:
[Выделить все]
 
(defun SaveAndClose ( / adoc ACAD docs)
	(vl-load-com)
	(setq adoc (vla-get-activedocument (setq ACAD (vlax-get-acad-object))))
	(vlax-for doc (vla-get-documents ACAD)
		(if (= (vla-get-active doc) :vlax-false)
			(setq docs (cons doc docs))
		)
	)
	(foreach doc docs
		(vl-catch-all-apply '(lambda () (vla-save doc)))
		(vl-catch-all-apply '(lambda () (vla-close doc :vlax-false)))
	)
	(vl-catch-all-apply '(lambda () (vla-save adoc)))
	(command "_.quit" "_y")
	(princ)
)
frostmourn вне форума  
 
Непрочитано 13.11.2018, 11:39
#19
Сергей812


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


А разве лисп не в контексте документа выполняется всегда?
Сергей812 вне форума  
 
Непрочитано 13.11.2018, 11:58
#20
trir


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


Цитата:
А разве лисп не в контексте документа выполняется всегда?
через COM закрывает все документы и толко в конце активный. На .NET всё равно проще, правда там под капотом кажется тоже COM
trir на форуме  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Обращение к коллекции вызывает краш автокада (VB.NET)

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глюк автокада при построении линий командами сценария pwn Программирование 15 05.11.2016 23:37
Подскажите, гуру! Можно ли в разделенном на 2 части окне автокада открыть два разных чертежа? Или это возможно только в 2 запущенных копиях АВТОКАДА? Ridder AutoCAD 5 22.07.2010 06:02
Трудность установки проверенного и работавшего Автокада 2008 gonch AutoCAD 2 30.04.2010 11:18
Что является элементом коллекции, а что нет? Supermax Программирование 1 07.01.2010 22:46
Объектная модель Автокада (настоящая) Supermax Программирование 16 05.01.2010 15:08