Фатал при сохранении если открыт один dwg

Автор Тема: Фатал при сохранении если открыт один dwg  (Прочитано 17016 раз)

0 Пользователей и 4 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Добрый день

Есть простой код сохранения dwg, если открыто несколько чертежей, то всё нормально сохраняется (и 1.dwg и 2.dwg) , а если остался открыт только один чертеж (1.dwg) и выполнить команду в примере - возникает фатал и autocad вылетает (AutoCAD 2014 в составе С3D), если выполнить эту же команду с другим dwg (2.dwg - открыт только он), то автокад не вылетает.

Подскажите пожалуйста почему вылетает только на 1.dwg и только когда он один открыт (когда открыт только 2.dwg ошибки то нету)?
Код - C# [Выбрать]
  1. [CommandMethod("testsavedwg", CommandFlags.Session)]
  2. public void testsavedwg()
  3. {
  4.    Document acDoc = Application.DocumentManager.MdiActiveDocument;
  5.    acDoc.CloseAndDiscard();
  6.    Database tempDb = new Database(false, true);
  7.    tempDb.ReadDwgFile(@"c:\Тест\1.dwg", FileShare.ReadWrite, false, "");
  8.    tempDb.SaveAs(@"c:\Тест\1_1.dwg", DwgVersion.Current);
  9. }
« Последнее редактирование: 13-08-2015, 10:45:11 от Doublefish »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я не рассматривал специфику приложенных чертежей, но зачем ты закрываешь активный текущий чертеж?
И что это за двойное создание базы???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Есть необходимость сначала закрыть файл, затем выполнить с ним определённые действия и сохранить под другим именем.

1.dwg - я выделил всё в нём и удалил, нарисовал пару объектов, проверил что ошибок нет и очистил.
2.dwg  - создал новый dwg и нарисовал один объект - проверил что ошибок в файле нет.

Если открыто несколько чертежей в автокаде - то ни с 1.dwg ни 2.dwg  ошибки не возникает (поэтому не возникает мысли что проблема в dwg).

Почему фатал возникает если открыт только один dwg, при этом на каких то вылетает (наример 1.dwg), а на других не вылетает (например 2.dwg)

(код поправил)

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
а tempDb - это кто?
опс . не проснулся еще
з.ы. - может просто не успевает записать.

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
А метод помечен как CommandFlags.Session?
Алексей

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
да - [CommandMethod("testsavedwg", CommandFlags.Session)] код поправил

Проверил в AutoCAD 2013, 2014, 2015 (в составе С3D) - фатал возникает только с 1.dwg и только когда он открыт один, с 2.dwg фатал не возникает если открыт только он.
« Последнее редактирование: 13-08-2015, 10:48:17 от Doublefish »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Проверил в AutoCAD 2013, 2014, 2015 (в составе С3D) - фатал возникает только с 1.dwg и только когда он открыт один, с 2.dwg фатал не возникает если открыт только он.
Проверил в AutoCAD 2015 - ошибка не возникает ни с 1.dwg, ни с 2.dwg
P.S.: AutoCAD очень не любит состояния Zero Document (т.е. когда нет ни одного открытого документа). Так что советую как-то его предотвращать (например, создавать новый пустой документ).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
P.S.S: Проверил в AutoCAD 2013 - тоже никаких Fatal Error нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Я думаю что проблема опять в AutoCAD который входит в состав С3D - у вас я полагаю что просто AutoCAD 2015.
Есть предположиение  что он реагирует на какие то объекты в 1.dwg и при сохранении если не открыт ни один dwg этого сделать не может (в 2.dwg видимо таких объектов нет).

Подскажите пожалуйста каким образом создать пустой dwg и закрыть его после выполнения действий, чтобы обойти данную проблему?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
у вас я полагаю что просто AutoCAD 2015
Уже проверил с Civil3D 2015 - ошибка есть. Более того (чего никогда у меня не было ни в одной из версий в чистом AutoCAD) - после аварийного завершения сбрасывается в 0 системная переменная FILEDIA. Это с учетом того, что у меня "девственно чистый" Civil3D без никаких дополнений и изменений конфигурации.
Подскажите пожалуйста каким образом создать пустой dwg и закрыть его после выполнения действий, чтобы обойти данную проблему?
Закрывать его не нужно. Пусть один открытый пустой болтается:
Код - C# [Выбрать]
  1. [CommandMethod("testsavedwg", CommandFlags.Session)]
  2. public void testsavedwg()
  3. {
  4.   Document acDoc = Application.DocumentManager.MdiActiveDocument;
  5.   if (Application.DocumentManager.Count == 1)
  6.     Application.DocumentManager.Add("acadiso.dwt");
  7.   acDoc.CloseAndDiscard();
  8.   Database tempDb = new Database(false, true);
  9.   tempDb.ReadDwgFile(@"c:\Тест\1.dwg", FileShare.ReadWrite, false, "");
  10.   tempDb.SaveAs(@"c:\Тест\1_1.dwg", DwgVersion.Current);
  11. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Да - filedia слетает каждый раз при этом фатале.

Приведённый вариант выше не работает

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Приведённый вариант выше не работает
Приведённый выше вариант я, перед тем как опубликовать, проверил - работает. Ты проверял именно тот код, который я написал?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Да именно этот код - я его скопировал и назвал testsavedwg2

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А теперь открой 1.dwg или 2.dwg и запусти этот же код.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Doublefish 13-08-2015, 12:30:31

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Открыл только 2.dwg - таже ошибка: чертеж занят.

Вот так работает
Код - C# [Выбрать]
  1. [CommandMethod("testsavedwg3", CommandFlags.Session)]
  2.         public void testsavedwg3()
  3.         {
  4.             if (acadapp.DocumentManager.Count == 1)
  5.             {
  6.                 Document acDoc = Application.DocumentManager.MdiActiveDocument;
  7.                 acDoc.CloseAndDiscard();
  8.                 Application.DocumentManager.Add("acadiso.dwt");
  9.                 Database tempDb = new Database(false, true);
  10.                 tempDb.ReadDwgFile(@"c:\Тест\1.dwg", FileShare.ReadWrite, false, "");
  11.                 tempDb.SaveAs(@"c:\Тест\1_1.dwg", DwgVersion.Current);
  12.                 Document acDocTmp = Application.DocumentManager.MdiActiveDocument;
  13.                 acDocTmp.CloseAndDiscard();
  14.             }
  15.         }