CAD-страница НП | Статьи | English

Н.Н.Полещук. AutoCAD 2010 .NET API: eFileSharingViolation в Database.SaveAs

Ссылка на блог Д.Бергмарка с этой темой

Если открыть справку по AutoCAD 2010 .NET (в составе документации к ObjectARX 2010) вы увидите, класс Autodesk.AutoCAD.DatabaseServices.Database имеет метод SaveAs, который представлен тремя перегруженными функциями:

  • Database.SaveAs (string, [MarshalAs(UnmanagedType.U1)] bool, DwgVersion, Autodesk.AutoCAD.DatabaseServices.SecurityParameters)

  • Database.SaveAs (string, Autodesk.AutoCAD.DatabaseServices.SecurityParameters)

  • Database.SaveAs (string, DwgVersion)

  • Однако использование последней из них является проблематичным (в 2009 и других версиях все нормально). Она не работает, если вы пытаетесь сохранить файл, который был открыт (не создан!) в данной сессии AutoCAD.

    Построим пример. Определите команду SaveDr, которая сохраняет текущий чертеж с тем же именем и в той версии DWG-формата с помощью функции Database.SaveAs (string, DwgVersion).

    Используя мастер ObjectARX для VB-приложений с управляемым кодом, создайте новый проект Visual Basic.NET с названием VbSaveYourDrawing и замените текст файла Command.vb на следующий:

    Imports Autodesk.AutoCAD.ApplicationServices
    Imports Autodesk.AutoCAD.DatabaseServices
    Imports Autodesk.AutoCAD.Runtime
    Public Class Commands

    <CommandMethod("SaveDr")> _
    Public Sub SaveYourDrawing()
    If MsgBox("Hi!" & vbCrLf & "Is it time to save the drawing?", _
    MsgBoxStyle.YesNo, _
    "Database.SaveAs") = MsgBoxResult.Yes Then
    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
    acDoc.Database.SaveAs(acDoc.Name, DwgVersion.Current)
    End If
    End Sub
    End Class

    Выполните сборку версии Release для проекта VbSaveYourDrawing.

    Далее:
    1. Запустите AutoCAD 2010 и откройте какой-нибудь существующий DWG-файл.
    2. Введите команду NETLOAD и загрузите с ее помощью файл VbSaveYourDrawing.dll (обычно он находится в папке VbSaveYourDrawing\VbSaveYourDrawing\bin\Release).
    3. Выполните команду SaveDr.
    4. Программа откроет окно MessageBox (Рис.1).

    Рисунок 1

    5. Щелкните Да.
    6. Это вызовет исключение (Рис.2 при открытых Сведениях).

    Рисунок 2

    Таким образом, мы не можем сохранить текущий чертеж при некоторых обстоятельствах. Вот почему в AutoCAD .NET Developer's Guide вместо этого используется более надежный вариант acDoc.Database.SaveAs(acDoc.Name, True, DwgVersion.Current, acDoc.Database.SecurityParameters).

    Проект с текстом примера можно скачать отсюда.

    Такая же проблема присутствует и в C#.


    CAD-страница НП | Статьи | English