4.3.2. Сохранение и закрытие чертежа

Источник здесь.[перевод не проверен];[перевёл Андрей Бушман]

    Используйте метод SaveAs (сохранить как) объекта Database для сохранения содержимого этого объекта. При использовании этого метода, вы можете указать следует ли переименовывать файл и если запасная копия файла на диск должна быть переименована в копию файла путём передачи значения True параметру bBakAndRename метода. Вы можете определять, будет ли база данных по умолчанию назначать имена Drawing1, Drawing2 и т.д. согласно значению системной переменной DWGTITLED, для которой значение 0 означает, что чертёж не был переименован.
    Иногда вы можете захотеть узнать, были ли внесены изменения в текущий чертёж. Хорошей идеей является выполнение данной проверки перед тем, как вы завершите сессию AutoCAD или откроете новый чертёж. Для этого, вам необходимо проверить значение системной переменной DBMOD.

Закрытие чертежа

    Экземплярные методы CloseAndDiscard или CloseAndSave класса Document используются для закрытия открытого чертежа со сбрасыванием всех произведённых изменений или же наоборот - с их сохранением. Вы можете использовать экземплярный метод CloseAll (закрыть всё) класса DocumentCollection для закрытия всех открытых в AutoCAD чертежей.

Сохранение текущего чертежа

    Этот пример сохраняет текущий документ в "c:\MyDrawing.dwg", если до сих пор не был сохранён или не имеет текущего1 имени.

Код VB.NET

   1:  Imports Autodesk.AutoCAD.ApplicationServices
   2:  Imports Autodesk.AutoCAD.Runtime
   3:   
   4:  <CommandMethod("SaveActiveDrawing")> _
   5:  Public Sub SaveActiveDrawing()
   6:    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
   7:    Dim strDWGName As String = acDoc.Name
   8:   
   9:    Dim obj As Object = Application.GetSystemVariable("DWGTITLED")
  10:   
  11:    '' Проверка на то, присваивал ли пользователь файлу имя
  12:    If System.Convert.ToInt16(obj) = 0 Then
  13:        '' Если файл имеет имя, присвоенное по умолчанию (Drawing1, Drawing2, и т.п.),
  14:        '' то предоставить ему новое имя
  15:        strDWGName = "c:\MyDrawing.dwg"
  16:    End If
  17:   
  18:    '' Сохранение текущего чертежа
  19:    acDoc.Database.SaveAs(strDWGName, True, DwgVersion.Current, _
  20:                          acDoc.Database.SecurityParameters)
  21:  End Sub

Код C#

   1:  using Autodesk.AutoCAD.ApplicationServices;
   2:  using Autodesk.AutoCAD.Runtime;
   3:   
   4:  [CommandMethod("SaveActiveDrawing")]
   5:  public static void SaveActiveDrawing()
   6:  {
   7:    Document acDoc = Application.DocumentManager.MdiActiveDocument;
   8:    string strDWGName = acDoc.Name;
   9:   
  10:    object obj = Application.GetSystemVariable("DWGTITLED");
  11:   
  12:    // Проверка на то, присваивал ли пользователь файлу имя
  13:    if (System.Convert.ToInt16(obj) == 0)
  14:    {
  15:        // Если файл имеет имя, присвоенное по умолчанию (Drawing1, Drawing2, и т.п.),
  16:        // то предоставить ему новое имя
  17:        strDWGName = "c:\\MyDrawing.dwg";
  18:    }
  19:   
  20:    // Сохранение текущего чертежа
  21:    acDoc.Database.SaveAs(strDWGName, true, DwgVersion.Current,
  22:                          acDoc.Database.SecurityParameters);
  23:  }

Код VBA / ActiveX

   1:  Sub SaveActiveDrawing()
   2:      ' Сохранение текущего чертежа под новым именем
   3:      ThisDrawing.SaveAs "MyDrawing.dwg"
   4:  End Sub

Проверка файла на наличие несохранённых изменений

    Этот пример смотрит, является ли чертёж не сохранённым, а так же проверяет, нажал ли пользователь кнопку OK в диалоговом окне (если не нажал, то прерывает выполнение и завершает работу). Если нажата ОК, то вызывается метод SaveAs для сохранения текущего чертежа, как показано далее:

Код VB.NET

   1:  Imports Autodesk.AutoCAD.ApplicationServices
   2:  Imports Autodesk.AutoCAD.DatabaseServices
   3:  Imports Autodesk.AutoCAD.Runtime
   4:   
   5:  <CommandMethod("DrawingSaved")> _
   6:  Public Sub DrawingSaved()
   7:    Dim obj As Object = Application.GetSystemVariable("DBMOD")
   8:   
   9:    '' Проверка значения системной переменной DBMOD. Если 0 - значит чертёж не был изменён
  10:    If Not (System.Convert.ToInt16(obj) = 0) Then
  11:        If MsgBox("Do you wish to save this drawing?", _
  12:                  MsgBoxStyle.YesNo, _
  13:                  "Save Drawing") = MsgBoxResult.Yes Then
  14:            Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  15:            acDoc.Database.SaveAs(acDoc.Name, True, DwgVersion.Current, _
  16:                                  acDoc.Database.SecurityParameters)
  17:        End If
  18:    End If
  19:  End Sub

Код C#

   1:  using Autodesk.AutoCAD.ApplicationServices;
   2:  using Autodesk.AutoCAD.DatabaseServices;
   3:  using Autodesk.AutoCAD.Runtime;
   4:   
   5:  [CommandMethod("DrawingSaved")]
   6:  public static void DrawingSaved()
   7:  {
   8:    object obj = Application.GetSystemVariable("DBMOD");
   9:   
  10:    // Проверка значения системной переменной DBMOD. Если 0 - значит чертёж не был изменён
  11:    if (System.Convert.ToInt16(obj) != 0)
  12:    {
  13:        if (System.Windows.Forms.MessageBox.Show("Do you wish to save this drawing?",
  14:                                  "Save Drawing",
  15:                                  System.Windows.Forms.MessageBoxButtons.YesNo,
  16:                                  System.Windows.Forms.MessageBoxIcon.Question)
  17:                                  == System.Windows.Forms.DialogResult.Yes)
  18:        {
  19:            Document acDoc = Application.DocumentManager.MdiActiveDocument;
  20:            acDoc.Database.SaveAs(acDoc.Name, true, DwgVersion.Current,
  21:                                  acDoc.Database.SecurityParameters);
  22:        }
  23:    }
  24:  }

VBA/ActiveX Code Reference

  1:  Sub DrawingSaved()
   2:      If Not (ThisDrawing.Saved) Then
   3:          If MsgBox("Желаете сохранить этот чертёж?", _
   4:                    vbYesNo) = vbYes Then
   5:              ThisDrawing.Save
   6:          End If
   7:      End If
   8:  End Sub

    2Внимание! 
    К сожалению один из перегруженных вариантов метода SaveAs в AutoCAD .Net API реализован некорректно и не годится к использованию. Об этом пишет и Н.Н. Полещук в своей статье. Я использую свой вариант решения этой проблемы, оформленного в виде метода расширения:

   1:      public static class DataBaseExtendedMethods
   2:      {
   3:          /// <summary>
   4:          /// Сохранение чертежа
   5:          /// </summary>
   6:          /// <param name="db">База данных чертежа</param>
   7:          /// <param name="fileName">Имя файла</param>
   8:          /// <param name="version">Версия</param>
   9:          public static void SaveAs2(this Database db, string fileName, DwgVersion version)
  10:          {
  11:              db.SaveAs(fileName, true, version, db.SecurityParameters);
  12:          }    
  13:      }

Примечания переводчика:
1назначенного пользователем
2 - дополнительная информация

Comments