Ошибка "eFileSharingViolation" при работе из Autocad 2016

Автор Тема: Ошибка "eFileSharingViolation" при работе из Autocad 2016  (Прочитано 11166 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Здравствуйте!
Опишу задачу подробнее.
Есть некий файл со скомпонованными листами. Нужно пересохранить этот файл в отдельные файлы с одним Листом в каждом файле. Т.е. если был файл "Плита_01.dwg" с листами с названиями

"Лист01"
"Лист02"
"Лист03"

то на выходе мы должны иметь 3 файла

Плита_01_[Лист01]_.dwg
Плита_01_[Лист02]_.dwg
Плита_01_[Лист03]_.dwg

с соответствующими листами.

Есть Код (библиотеки все подключены acdbmgd, accoremgd, acmgd):
Код - C# [Выбрать]
  1. using System;
  2. using System.IO;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. namespace ClassLibrary2
  9. {
  10.         public class Class1
  11.     {
  12.         [CommandMethod("dpSaveLayoutsToSeparateFiles2")]
  13.         public void dpSaveLayouts2()
  14.         {
  15.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  16.             Document doc = Application.DocumentManager.MdiActiveDocument;
  17.             HostApplicationServices hs = HostApplicationServices.Current;
  18.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  19.  
  20.             //системная переменная, проверяем сохранен ли файл или нет
  21.             object DWGTITLED = Application.GetSystemVariable("DWGTITLED");
  22.  
  23.             //если не сохранен выходим
  24.             if (System.Convert.ToInt16(DWGTITLED) == 0)
  25.             {
  26.                 Application.ShowAlertDialog("Перед использованием процедуры сохранить");
  27.                 return;
  28.             }
  29.  
  30.             //получаем полный путь к DWG файлу
  31.             string dwgFullPath = hs.FindFile(doc.Name, doc.Database, FindFileHint.Default);
  32.             //получаем имя DWG файла
  33.             string dwgName = Path.GetFileName(dwgFullPath);
  34.             //получаем имя DWG файла без расширения
  35.             string dwgNameWoExt = Path.GetFileNameWithoutExtension(dwgFullPath);
  36.             //получаем путь к DWG файлу
  37.             string dwgPath = Path.GetDirectoryName(dwgFullPath);
  38.             //путь для сохранения новых DWG файлов
  39.             string dwgNewFullPath = "";
  40.             //получаем путь к TEMP
  41.             string tempPath = System.IO.Path.GetTempPath();
  42.  
  43.             //блокируем документ
  44.             using (DocumentLock doclock = doc.LockDocument())
  45.             {
  46.                 //пошла транзакция
  47.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  48.                 {
  49.                     {
  50.                         //получаем коллекцию Layout
  51.                         DBDictionary acLayouts = tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary;
  52.                         //получаем количество вкладок
  53.                         int layoutsCount = acLayouts.Count;
  54.                         LayoutManager acLayoutMgr;
  55.                         acLayoutMgr = LayoutManager.Current;
  56.                         //перебираем все вкладки
  57.                         foreach (DBDictionaryEntry item in acLayouts)
  58.                         {
  59.                             //имя лейаута
  60.                             String layoutName = item.Key;
  61.                             //получаем Лейаут
  62.                             Layout acLayout = tr.GetObject(item.Value, OpenMode.ForRead) as Layout;
  63.  
  64.                             //если не модель то идем дальше
  65.                             if (acLayout.LayoutName.ToUpper() != "MODEL" && acLayout.LayoutName.ToUpper() != "МОДЕЛЬ")
  66.                             {
  67.                                 //acLayoutMgr.CurrentLayout = acLayout.LayoutName;
  68.                                 //активируем вкладку
  69.                                 acLayoutMgr.CurrentLayout = acLayout.LayoutName;
  70.                                 //получаем систменую переменную отображеня вывода в консоль
  71.                                 Object CMDECHO = Application.GetSystemVariable("CMDECHO");
  72.                                 //запрещаем вывод в консоль
  73.                                 Application.SetSystemVariable("CMDECHO", 0);
  74.                                 //создаем путь к нашему новому файлу
  75.                                 dwgNewFullPath = dwgPath + "" + dwgNameWoExt + "_[" + acLayout.LayoutName + "]_.dwg";
  76.                                 //сохраняем файл и экранируем слеши
  77.                                 db.SaveAs(dwgNewFullPath.Replace("", "\\"), DwgVersion.AC1021);
  78.  
  79.                                 //////////////////**/////////////////////////////////////////////////*/*///////////////
  80.                                 Database db2 = new Database(false, true);
  81.                                 db2.ReadDwgFile(dwgNewFullPath, FileOpenMode.OpenForReadAndWriteNoShare, false, "");
  82.                                 using (Transaction tr2 = db2.TransactionManager.StartTransaction())
  83.                                 {
  84.                                     db2.SaveAs(dwgNewFullPath.Replace("", "\\"), DwgVersion.Current);
  85.                                     tr2.Commit();
  86.                                 }
  87.                                 //////////////////**/////////////////////////////////////////////////*/*///////////////
  88.  
  89.                                 //восстанавливаем систменую переменную отображеня вывода в консоль
  90.                                 Application.SetSystemVariable("CMDECHO", CMDECHO);
  91.                                 //dpDelLayoutsFrom**DWG(dwgTempPath, dwgNewFullPath);
  92.                                 ed.WriteMessage("Сохранено: " + dwgNewFullPath + "\n");
  93.                             }
  94.                         }
  95.                     }
  96.                     tr.Commit();
  97.                 }
  98.             }
  99.         }
  100.     }
  101. }
При запуске на 2016 автокаде выдает сообщение :
Цитировать
Приложение не поддерживает оперативную (JIT)
отладку. Подробная информацию приводится в конце данного сообщения.

************** Текст исключения **************
Autodesk.AutoCAD.Runtime.Exception: eFileSharingViolation
в Autodesk.AutoCAD.DatabaseServices.Database.SaveAs(String fileName, DwgVersion version)
в ClassLibrary2.Class1.dpSaveLayouts2() в C:\Users\levanyukms\Documents\Visual Studio 2015\Projects\ClassLibrary2\ClassLibrary2\Class1.cs:строка 85
в Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
в Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
в Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, Boolean bLispFunction)
в Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()
« Последнее редактирование: 02-06-2016, 06:40:13 от intelligent »

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А это вообще что:
Код - C# [Выбрать]
  1. db.SaveAs(dwgNewFullPath.Replace("", "\\"), DwgVersion.AC1021);
И это тоже:
Код - C# [Выбрать]
  1. db2.SaveAs(dwgNewFullPath.Replace("", "\\"), DwgVersion.Current);
???
Представь себе что у тебя есть путь к файлу "C:\\A\\B\\C\\file.dwg". В результате замены Replace("", "\\") ты получишь строку имени файла "C:ABCfile.dwg" в который ты пытаешься сохранить файл. С большой вероятностью (если ты работаешь не под учетной записью Администратора) ты не сможешь записать в этот файл.
Кроме того код вообще не делает то, что тебе нужно. Во всяком случае как я понял тебе нужно просто сохранить чертеж под новыми именами, открыть каждый из сохранённых чертежей и удалить в нём все листы, кроме одного нужного.

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Добрый день!  Да вы правы по поводу каких функций должен выполнять данный код.
Последовательность действий которые я сейчас выполняю:
1.Беру файл "01-002.dwg"
2.Открываю его
3.Смотрю сколько там листов (1, 2, 3 ...)
4. Закрываю файл
5. Делаю копии данного файла в количестве листом в файле
6. Переименовываю полученные файлы добавляя к каждому файлу номер листа (01-002_л.1.dwg, 01-002_л.2.dwg, 01-002_л.3.dwg, ...)
7. Захожу в каждый файл и удаляю лишние листы, оставляя тот который в наименовании файла.

Данная работа отнимает время и я хочу ее перевести в автоматизированный режим.
Но так как я абсолютно пока не разбираюсь в программировании мне тяжело это осуществить хотя понимаю что это должно быть элементарно. Уже начал изучать C#, но код нужен сейчас :(
В поисках кода на форумах наткнулся на данный код который представил ранее.
А сейчас по вашим комментариям понял что код не правильный.

По поводу функций сохранения я думаю понял что вы сказали а значит надо просто в каждой строке сохранения убрать .Replace("","\\")

Отмечено как Решение intelligent 02-06-2016, 09:29:02

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
На то, что тебе нужно больше похож этот код: http://www.acadnetwork.com/index.php?topic=151.msg309#msg309
Но его работоспособность я не проверял.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Александр Ривилис, спасибо огромное !!! Код работает как надо ! На 3-х форумах тему создал и только тут быстро и по делу дан ответ !

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

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

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Выявилась неизвестная ошибка. Код выполняет все что требуется но...
Когда в Autocad открылись все файлы уже разделенные, я их просматриваю и пытаюсь закрыть но они не закрываются Autocad виснет.
После закрытия процесса самого автокада файлы грузятся нормально.
Автокад причем виснет не на первом листе а на всех последующих, закрывая первый лист сформированный кодом все хорошо при последующих виснет.
Причина думаю во временном сохранении файлов в папку Temp.

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати есть и аналогичная программа на lisp: http://jtbworld.com/autocad-export-layouts-to-drawings-layoutstodwgs-lsp
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Lisp код работает полностью ! Спасибо , а с C# попробую сам разобраться , так как решение данной задачи на данный момент через lisp меня устраивает.

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Добрый день!  Да вы правы по поводу каких функций должен выполнять данный код.
Последовательность действий которые я сейчас выполняю:
1.Беру файл "01-002.dwg"
2.Открываю его
3.Смотрю сколько там листов (1, 2, 3 ...)
4. Закрываю файл
5. Делаю копии данного файла в количестве листом в файле
6. Переименовываю полученные файлы добавляя к каждому файлу номер листа (01-002_л.1.dwg, 01-002_л.2.dwg, 01-002_л.3.dwg, ...)
7. Захожу в каждый файл и удаляю лишние листы, оставляя тот который в наименовании файла.

Есть же штатное средство для этого:  _EXPORTLAYOUT  или надо что то специфично?

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

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

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Угу, лист в модель копирует и разделяет, но на выходе то, отдельный лист и ничего лишнего.
(Иногда передаю так чертежи, когда требуют в одном файле-один лист. Правда к дальнейшей работе такой файл не пригоден, но это мелочи)