Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Захаров Максим от 19-03-2024, 10:53:49

Название: Работа с ExplodeProxy
Отправлено: Захаров Максим от 19-03-2024, 10:53:49
Добрый день.
Подскажите пожалуйста, есть возможность запустить ExplodeProxy на множестве файлов dwg. т.е. создать цикл открыть файл, запустить EXPLODEALLPROXY потом REMOVEALLPROXY, сохранить, закрыть файл. Я что то попытался, но вот закрытие файла не работает. Может уже есть готовое решение?
Название: Re: Работа с ExplodeProxy
Отправлено: alz от 19-03-2024, 12:32:38
По идее через accoreconsole можно сделать.
у меня было примерно вот так реализовано

Код - C# [Выбрать]
  1.            
  2.             using (StreamWriter writer = new StreamWriter("D:\\print.scr", false))
  3.             {
  4.                 //загрузка приложения
  5.                 writer.WriteLine("(arxload \"Приложение\" nil)");
  6.                 writer.WriteLine("команда");
  7.                 writer.WriteLine("_close");
  8.                 writer.WriteLine("_y");
  9.             }
  10.             //запускаем скрипт
  11.             Process start = new Process();
  12.             start.StartInfo.Arguments = "/i " + FileName +  "/s D:\\print.scr";
  13.             start.StartInfo.FileName = accoreconsolePath;
  14.             start.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
  15.             start.Start();
  16.             //ждем пока отработает
  17.             start.WaitForExit();
  18.             File.Delete("D:\\print.scr");

Правда были проблемы с кириллицей в названии или в пути к чертежу, решил копированием файла во временный каталог  с названием без кирилицы, и если нужно сохранить то заменял оригинальный файл обработанной копией.
В чате мне объяснили что проблема в кодировке файла скрипта(фиг знает причем если кирилицы в скрипте нет), но тут я ничего не проверял так как все и так работает.
Название: Re: Работа с ExplodeProxy
Отправлено: Захаров Максим от 19-03-2024, 14:09:38
Спасибо, я посмотрю
Я пытался вот так решить, но на этапе сохранения вылезает ошибка
Код - vb.net [Выбрать]
  1. <CommandMethod("ExpodeProxyObjectUser")>
  2.     Public Sub ExpodeProxyObjectUser()
  3.         '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  4.         '1. получем доступ к пользовательскому каталогу
  5.         'временный каталог для автосохранения таблицы
  6.         Dim TempDir As String = FuncFiles.FuncGetAbsoluteFolderPathName("Выберите папку", 1)
  7.         '=============================================================================================
  8.         'читаем файлы dwg
  9.         If IO.Directory.Exists(TempDir) = True Then
  10.             Try
  11.                 'создаем дерево в TreeView
  12.                 For Each fileDWG As String In Directory.GetFiles(TempDir)
  13.                     Dim ext As String = Path.GetExtension(fileDWG)
  14.                     If ext Like ".dwg" Then
  15.                         Dim acDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.Open(fileDWG, False)
  16.                         Dim docs As DocumentCollection = Application.DocumentManager
  17.                         Dim db As Database = acDoc.Database()
  18.                         acDoc.SendStringToExecute("EXPLODEALLPROXY ", False, False, True)
  19.                         acDoc.SendStringToExecute("REMOVEALLPROXY ", False, False, True)
  20.                         'If acDoc.IsReadOnly Then
  21.                         '    acDoc.CloseAndDiscard()
  22.                         'Else
  23.                         '    If docs.MdiActiveDocument <> acDoc Then
  24.                         '        docs.MdiActiveDocument = acDoc
  25.                         '    End If
  26.                         '    Dim isModified As Integer = System.Convert.ToInt32(Application.GetSystemVariable("DBMOD"))
  27.                         '    If isModified = 0 Then
  28.                         '        acDoc.SendStringToExecute("^C^C ", False, False, True)
  29.                         '        acDoc.CloseAndDiscard()
  30.                         '    Else
  31.                         '        acDoc.SendStringToExecute("^C^C ", False, False, True)
  32.                         '        acDoc.CloseAndSave(acDoc.Name)
  33.                         '    End If
  34.                         'End If
  35.                     End If
  36.                 Next
  37.             Catch ex As IOException
  38.             Catch ex As UnauthorizedAccessException
  39.             Catch ex As ArgumentException
  40.             End Try
  41.         End If
  42.     End Sub
Название: Re: Работа с ExplodeProxy
Отправлено: alz от 19-03-2024, 14:25:25
Недавно обсуждали, SendStringToExecute это асинхронный метод, команда запустилась и программа не дожидаясь ее окончания сразу переходит к закрытию файла, ну и когда я подобным методом считывал данные из файлов сохранял я через базу данных а не документ, примерно вот такой конструкцией, но тут ориентировочно, давно в эту степь не лазил, аргументы надо бы проверить и не факт что в открытой так базе данных можно использовать командные методы, имхо тут все же лучше через консоль делать, экземпляров консоли параллельно можно открывать несколько, отрабатываю быстро.

Код - C# [Выбрать]
  1. using (Database db = new Database(false, true))
  2. {
  3.     db.ReadDwgFile(fileName, FileShare.ReadWrite, true, String.Empty);
  4.     //действия
  5.     //
  6.     db.SaveAs(fileName, DwgVersion.Current);
  7. }

Название: Re: Работа с ExplodeProxy
Отправлено: Александр Ривилис от 19-03-2024, 17:21:22
Подскажите пожалуйста, есть возможность запустить ExplodeProxy на множестве файлов dwg. т.е. создать цикл открыть файл, запустить EXPLODEALLPROXY потом REMOVEALLPROXY, сохранить, закрыть файл.
Если переписать сами EXPLODEALLPROXY и REMOVEALLPROXY, то можно. Но я не рекомендую это делать. Причины объяснять не буду - просто запомните мое мнение. Все остальные варианты использования пакетного запуска ненадежные. Что касается accoreconsole, то в нее arx-файл не грузится и его следует переименовать в  crx-файл (поменять расширение). В этом случае есть шанс, что сработает.
Название: Re: Работа с ExplodeProxy
Отправлено: Захаров Максим от 20-03-2024, 08:28:34
Спасибо, за ответ Александр. Еще немного попробую, не получится, брошу тогда это "гиблое" дело
Название: Re: Работа с ExplodeProxy
Отправлено: Захаров Максим от 21-03-2024, 13:40:13
Скажите пожалуйста, а можно не открывая напрямую чертеж, узнать, есть ли в нем proxi. И если есть, то тогда открыть?
Название: Re: Работа с ExplodeProxy
Отправлено: alz от 21-03-2024, 13:49:24
Ну насколько я знаю определить есть что-то в чертеже или нет можно только перебором по базе, соответственно как минимум нужно открыть базу чертежа, код я чуть выше выкладывал. Вчера как раз понадобилось пакетно чертежи обработать, так что код проверил и чутка изменил.
Название: Re: Работа с ExplodeProxy
Отправлено: Александр Ривилис от 21-03-2024, 15:36:58
Скажите пожалуйста, а можно не открывая напрямую чертеж, узнать, есть ли в нем proxi. И если есть, то тогда открыть?
Нет. Более того даже открытие базы без открытия в редакторе AutoCAD не то, что нужно, т.к. открытие в редакторе AutoCAD может приводить к замене proxy на нормальные примитивы при подгрузке соответствующих arx/dbx-файлов.