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

ADN Club => AutoCAD .NET API => Тема начата: Yusuf от 24-11-2020, 17:22:55

Название: Как правильно получать всегда путь к файлу
Отправлено: Yusuf от 24-11-2020, 17:22:55
Подскажите как правильно получать название и путь к файлу.
Хочу перенести с чертежа где много листов каждый лист в отдельный файл, вроде переносится но проблема в имени файла, то появляется в папке где основной чертеж то создается где не знаю.
Создаю чертежи в такой последовательности
1. Выбираю рамкой границы блока
2. Создаю чертеж
3. Копирую что выбрано
4. Сохраняю закрываю
В editor вывожу путь он правильный показывает, при сохранении указываю этот же путь.
перебробовал все ссылки ниже, везде результат одинаковый, иногда есть иногда нет, думал из за того что не сохранен файл, но в папке Temp тоже нет.Я  в отчаянии. Что делать подскажите?


https://www.keanw.com/2008/03/getting-the-ful.html

https://forums.autodesk.com/t5/net/current-drawing-location-path/td-p/3008548

https://adndevblog.typepad.com/autocad/2013/02/quick-tip-get-the-dwg-file-path-from-acdbdatabase-object.html
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Александр Ривилис от 24-11-2020, 17:30:17
Yusuf,
И как ты получаешь путь к файлу? Код где?
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Yusuf от 24-11-2020, 17:35:29
И как ты получаешь путь к файлу? Код где?
разные способы пробовал

Код - C# [Выбрать]
  1.  Document doc =
  2.  
  3.         Application.DocumentManager.MdiActiveDocument;
  4.  
  5.       HostApplicationServices hs =
  6.  
  7.         HostApplicationServices.Current;
  8.  
  9.       string path =
  10.  
  11.         hs.FindFile(
  12.  
  13.           doc.Name,
  14.  
  15.           doc.Database,
  16.  
  17.           FindFileHint.Default
  18.  
  19.         );

это последнее

Код - C# [Выбрать]
  1.                     //HostApplicationServices hs = HostApplicationServices.Current;
  2.                     //string path = Application.GetSystemVariable("DWGPREFIX");
  3.                         //hs.FindFile(doc.Name, doc.Database, FindFileHint.Default);
  4.                     string path = Path.GetFullPath(db.OriginalFileName);
  5.                     string createdwgFolder = Path.GetFileNameWithoutExtension(db.OriginalFileName);
  6.  
  7.                     string folderdwg = Path.GetDirectoryName(db.OriginalFileName);
  8.                     string dwgFilename = Path.Combine(folderdwg, fileName+".dwg");
  9.  


Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Александр Ривилис от 24-11-2020, 17:43:04
Yusuf,
А Document.Name не пробовал? Но если чертеж новый и еще ни разу не сохранялся (т.е когда Document.IsNamedDrawing == false) - ничего не выйдет. Файл всегда нужно сначала сохранить.
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Yusuf от 24-11-2020, 17:46:11
Yusuf,
А Document.Name не пробовал? Но если чертеж новый и еще ни разу не сохранялся (т.е когда Document.IsNamedDrawing == false) - ничего не выйдет. Файл всегда нужно сначала сохранить.
пробовал, та же ситуация была, главный документ не новый, из него копирую и создаю новые и даю путь со старого + название файла из атрибута блока
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Александр Ривилис от 24-11-2020, 17:49:42
Yusuf,
А Document.Name не пробовал? Но если чертеж новый и еще ни разу не сохранялся (т.е когда Document.IsNamedDrawing == false) - ничего не выйдет. Файл всегда нужно сначала сохранить.
пробовал, та же ситуация была, главный документ не новый, из него копирую и создаю новые и даю путь со старого + название файла из атрибута блока
Document.Name тебе давал правильный путь к файлу "главного документа"?
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Yusuf от 24-11-2020, 17:56:55
Document.Name тебе давал правильный путь к файлу "главного документа"?
да давал и сейчас правильный путь, знаете что только что заметил мистика какая то, если гружу netload не создается файл, процесс идет но не создается даже сообщает что создан, а если запускаю команду из плагина Вильдар, за что ему спасибо, работает, создается
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Александр Ривилис от 24-11-2020, 18:05:10
Document.Name тебе давал правильный путь к файлу "главного документа"?
да давал и сейчас правильный путь, знаете что только что заметил мистика какая то, если гружу netload не создается файл, процесс идет но не создается даже сообщает что создан, а если запускаю команду из плагина Вильдар, за что ему спасибо, работает, создается

Ничего не понял.
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Yusuf от 24-11-2020, 18:09:40
Ничего не понял.
Пользуюсь плагином от Вильдара который по ссылке
https://adn-cis.org/forum/index.php?topic=10129.msg46033#msg46033

через него можно загружать библиотеки и потом выходит список команд, если оттуда запускать все работает, а если netload-ом гружу, весь процесс идет но файл не появляется в нужной папке.
Так вот только что опять проверил удалил из этого плагина все dll загрузил в автокад, не работает, запустил с плагина все файлы создаются.
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Александр Ривилис от 24-11-2020, 18:13:37
Yusuf,
Откажись от плагина Вильдара и проверяй нормально. Есть куча побочных явлений, о которых ни ты, ни я, ни Вильдар не догадываемся. Тем более что твоя сборка будет работать в совсем других условиях.
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Yusuf от 24-11-2020, 18:19:23
Откажись от плагина Вильдара и проверяй нормально. Есть куча побочных явлений, о которых ни ты, ни я, ни Вильдар не догадываемся. Тем более что твоя сборка будет работать в совсем других условиях.
как теперь чинить убрал bundle плагина, гружу в autocad стандартным способом все равно не работает
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Александр Ривилис от 24-11-2020, 18:23:00
как теперь чинить убрал bundle плагина, гружу в autocad стандартным способом все равно не работает
Ищи ошибку в своей программе.
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Yusuf от 25-11-2020, 07:15:49
как теперь чинить убрал bundle плагина, гружу в autocad стандартным способом все равно не работает
Ищи ошибку в своей программе.
нашел, как говорится утро вечера мудренее, т.е не нашел а просто добавил Database.SaveAs раньше просто стоял Document.CloseAndSave, а до этого столько времени потратил на варианты поиска пути документа.
файл закрываю потому что активным должным быть "главный" документ для последующей итерации, может надо как то по другому обращаться чтобы всегда знать какой документ активировать, а то после закрытия нового обращается опять Document.Database, а если файл случайно не закроется выскочит исключение, поэтому боюсь немного никаких подводных камней нет случайно в таком коде?
Код - C# [Выбрать]
  1.             acDbNewDoc.SaveAs(dwgFilename, DwgVersion.Current);
  2.             //Application.ShowAlertDialog(Active.Document.Name);
  3.             acNewDoc.CloseAndSave(dwgFilename);
  4.  

и еще теперь не зуммируется, до этого даже при создании показывал зуммировал к границам работал, а теперь почему новый файл не создается а активным остается старый почему то,  ведь только добавил строку
Код - C# [Выбрать]
  1. acDbNewDoc.SaveAs(dwgFilename, DwgVersion.Current);

как исправить привожу код метода?

Код - C# [Выбрать]
  1.         public void CopyObjectsBetweenDatabases(ObjectIdCollection acObjIdColl, string dwgFilename)
  2.         {
  3.             //ObjectIdCollection acObjIdColl = new ObjectIdCollection();
  4.             // Get the current document and database
  5.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  6.             Database acCurDb = acDoc.Database;
  7.            
  8.             // Change the file and path to match a drawing template on your workstation
  9.             string sLocalRoot = Application.GetSystemVariable("LOCALROOTPREFIX") as string;
  10.             string sTemplatePath = sLocalRoot + "Template\\acadiso.dwt";
  11.             // Create a new drawing to copy the objects to
  12.             DocumentCollection acDocMgr = Application.DocumentManager;
  13.             Document acNewDoc = acDocMgr.Add(sTemplatePath);
  14.             Database acDbNewDoc = acNewDoc.Database;
  15.             // Lock the new document
  16.             using (DocumentLock acLckDoc = acNewDoc.LockDocument())
  17.             {
  18.                 // Start a transaction in the new database
  19.                 using (Transaction acTrans = acDbNewDoc.TransactionManager.StartTransaction())
  20.                 {
  21.                     // Open the Block table for read
  22.                     BlockTable acBlkTblNewDoc;
  23.                     acBlkTblNewDoc = acTrans.GetObject(acDbNewDoc.BlockTableId,
  24.                                                        OpenMode.ForRead) as BlockTable;
  25.                     // Open the Block table record Model space for read
  26.                     BlockTableRecord acBlkTblRecNewDoc;
  27.                     acBlkTblRecNewDoc = acTrans.GetObject(acBlkTblNewDoc[BlockTableRecord.ModelSpace],
  28.                                                         OpenMode.ForRead) as BlockTableRecord;
  29.                     // Clone the objects to the new database
  30.                     IdMapping acIdMap = new IdMapping();
  31.                     acCurDb.WblockCloneObjects(acObjIdColl, acBlkTblRecNewDoc.ObjectId, acIdMap,
  32.                                                DuplicateRecordCloning.Ignore, false);
  33.                     ZoomExtCmd();
  34.                     // Save the copied objects to the database
  35.                     acTrans.Commit();
  36.                 }
  37.                 // Unlock the document
  38.             }
  39.             // Set the new document current
  40.             //acDocMgr.MdiActiveDocument = acNewDoc;
  41.             dynamic acadApp = Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication;
  42.             acadApp.ZoomExtents();
  43.             //Active.Document.SendStringToExecute("_.zoom _all ", true, true, false);
  44.  
  45.             acDbNewDoc.SaveAs(dwgFilename, DwgVersion.Current);
  46.             acNewDoc.CloseAndSave(dwgFilename);
  47.  
  48.         }
  49.  
  50.         public void ZoomExtCmd()
  51.         {
  52.             var ed = Application.DocumentManager.MdiActiveDocument.Editor;
  53.             ed.Command("_.zoom", "_extents");
  54.         }
  55.  
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Александр Ривилис от 25-11-2020, 13:36:34
Объясни мне зачем ты создаёшь новый документ, если можно просто создать новую базу (Database), скопировать в неё всё что нужно и сохранить. И даже на экране ничего мелькать не будет...
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Yusuf от 25-11-2020, 13:45:58
Объясни мне зачем ты создаёшь новый документ, если можно просто создать новую базу (Database), скопировать в неё всё что нужно и сохранить. И даже на экране ничего мелькать не будет...
Александр Наумович подскажите как это сделать, замучился уже
я брал отсюда http://docs.autodesk.com/ACD/2011/ENU/filesMDG/WS1a9193826455f5ff2566ffd511ff6f8c7ca-3f78.htm , других примеров не нашел

если правильно понял можно так https://spiderinnet1.typepad.com/blog/2013/03/autocad-net-safely-create-new-database-and-saveas.html через итерацию, вставлям и сохраняем?

 
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Александр Ривилис от 25-11-2020, 14:10:15
если правильно понял можно так https://spiderinnet1.typepad.com/blog/2013/03/autocad-net-safely-create-new-database-and-saveas.html через итерацию, вставлям и сохраняем?
Не самый удачный пример. Посмотри вот эти:
https://adn-cis.org/pri-ispolzovanii-wblockcloneobjects-skopirovannyie-v-prostranstvo-modeli-primitivyi-ischezayut-v-tekushhem-chertezhe.html
И вообще поиском по "ReadDwgFile" найдёшь массу примеров.
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Yusuf от 25-11-2020, 14:58:33
Не самый удачный пример. Посмотри вот эти:
https://adn-cis.org/pri-ispolzovanii-wblockcloneobjects-skopirovannyie-v-prostranstvo-modeli-primitivyi-ischezayut-v-tekushhem-chertezhe.html
2 пример вроде подходит но там тоже же надо файл создавать?

И вообще поиском по "ReadDwgFile" найдёшь массу примеров.
ReadDwgFile разве не для того чтобы прочитать закрытый чертеж? У меня команда будет запускаться с главного файла с которого надо создать на один лист один чертеж.
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Александр Ривилис от 25-11-2020, 15:57:20
ReadDwgFile разве не для того чтобы прочитать закрытый чертеж? У меня команда будет запускаться с главного файла с которого надо создать на один лист один чертеж.
Этот метод не нужно тебе использовать. Просто рядом с этим методом в примерах всегда есть создание базы (new Database(...)) и её сохранение (Database.SaveAs(...))
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Yusuf от 26-11-2020, 08:19:45
Этот метод не нужно тебе использовать. Просто рядом с этим методом в примерах всегда есть создание базы (new Database(...)) и её сохранение (Database.SaveAs(...))
Спасибо за new Database() так намного лучше, быстрее, вопрос можно ли теперь ZoomExtents применить к вставленным объектам ? Так как объекты в памяти я думаю не получится, придется открыть зумировать и закрывать?
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Александр Ривилис от 26-11-2020, 14:30:37
Спасибо за new Database() так намного лучше, быстрее, вопрос можно ли теперь ZoomExtents применить к вставленным объектам ? Так как объекты в памяти я думаю не получится, придется открыть зумировать и закрывать?
ZoomExtents применить к Database нельзя. Оно применяется только к активному документу.
Почитай: https://adndevblog.typepad.com/autocad/2012/11/wblock-to-and-zoom-in-side-database.html
Там пример кода на VB.NET, который несложно сконвертировать в C#
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Александр Ривилис от 26-11-2020, 14:39:34
Опа! Вспомнил давнюю тему: https://adn-cis.org/forum/index.php?topic=831
Я тогда нашел такое решение: https://adn-cis.org/forum/index.php?topic=831.msg3438#msg3438
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Yusuf от 26-11-2020, 15:21:24
Опа! Вспомнил давнюю тему: https://adn-cis.org/forum/index.php?topic=831
Я тогда нашел такое решение: https://adn-cis.org/forum/index.php?topic=831.msg3438#msg3438

Ну Вы просто гений, 2 дня, нет 3 дня (с учетом того, что изначально выбрал неправильный вариант создания документа) мучаюсь, живите долго. Теперь надо понасоздавать удалить те  старые, потом переименовать новые.
Название: Re: Как правильно получать всегда путь к файлу
Отправлено: Александр Ривилис от 26-11-2020, 15:23:07
Ну Вы просто гений
Я знаю.  ;D