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

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

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

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

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

Всем привет!
Начинаю медленный и плавный переход из 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
Просмотров: 665
 
Непрочитано 07.11.2018, 12:14
#2
Кулик Алексей aka kpblc
Moderator

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


Возможно, я ошибаюсь - но наверняка ошибка возникает при попытке закрытия активного документа, из которого и была запущена команда.
__________________

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


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


жуть
Код:
[Выделить все]
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
Сообщений: 140


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


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


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


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


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

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


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


не всё так просто...
Код:
[Выделить все]
    <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
Сообщений: 33


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

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

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


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


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

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


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


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

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


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


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


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


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


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

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


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


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


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


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


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


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


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


frostmourn как успехи?
trir на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 13.11.2018, 11:36
#18
frostmourn


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


Если тут какой-то подвох, то я не увидел. Вот простейший пример
Код:
[Выделить все]
 
(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
Сообщений: 5,516


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


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


Цитата:
А разве лисп не в контексте документа выполняется всегда?
через 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

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