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

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 27-10-2018, 22:48:35

Название: Вставка файла dwg как блока
Отправлено: Atomohod от 27-10-2018, 22:48:35
Здравствуйте!
Нужно вставить целый файл dwg с диска как блок в свой чертеж программно. Внутри этого файла заготовка блока с атрибутами -  геометрия и атрибуты(сам файл получен в результате сохранения Save block as описания блока из Block Editora в dwg файл). Встречал код вставляющий описание существующего блока из одного чертежа в другой. А как вставить такую файл-заготовку блока из dwg? Ведь он не содержит описания блока.
Название: Re: Вставка файла dwg как блока
Отправлено: Александр Пекшев aka Modis от 27-10-2018, 22:54:09
Код - C# [Выбрать]
  1. var dm = AcApp.DocumentManager;
  2. var destDb = dm.MdiActiveDocument.Database;
  3. var sourceDb = new Database(false, true);
  4. sourceDb.ReadDwgFile(Path.Combine(_dwgBaseFolder, selectedItem.SourceFile), FileShare.Read, true, "");
  5. var insertedBlkName = DwgBaseHelpers.GetBlkNameForInsertDrawing(sourceFileInfo.Name, destDb);
  6. var insertedDrawingId = destDb.Insert(sourceFileInfo.FullName, sourceDb, true);
Что-то типа того. Только для вставляемого блока нужно еще имя задать
Название: Re: Вставка файла dwg как блока
Отправлено: Александр Ривилис от 27-10-2018, 23:04:44
Что-то типа того. Только для вставляемого блока нужно еще имя задать
Точнее нужно из sourceFileInfo.FullName нужно сделать допустимое имя блока. Так что скорее это sourceFileInfo.Name
Название: Re: Вставка файла dwg как блока
Отправлено: Александр Пекшев aka Modis от 27-10-2018, 23:07:26
Что-то типа того. Только для вставляемого блока нужно еще имя задать
Точнее нужно из sourceFileInfo.FullName нужно сделать допустимое имя блока. Так что скорее это sourceFileInfo.Name
У меня это было, но я просто решил словами написать ))
Вот так я делал:
Код - C# [Выбрать]
  1. public static string GetBlkNameForInsertDrawing(string blkName, Database db)
  2. {
  3.     var returnedBlkName = blkName.Replace(".dwg", "");
  4.     using (var tr = db.TransactionManager.StartTransaction())
  5.     {
  6.         var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  7.         while (bt.Has(returnedBlkName))
  8.         {
  9.             returnedBlkName = blkName + "_" + DateTime.Now.Second;
  10.         }
  11.     }
  12.     return returnedBlkName;
  13. }
Метод учитывал уже имеющиеся блоки с таким именем и создавал новое имя, прибавляя секунды. В моем случае было не важно, так как блок потом расчленялся
Название: Re: Вставка файла dwg как блока
Отправлено: Александр Ривилис от 27-10-2018, 23:10:19
Вот так я делал:
Ну конечно tr.Commit() ты случайно забыл... Мелочь, но на каждой транзакции у тебя происходит откат...
Название: Re: Вставка файла dwg как блока
Отправлено: Александр Пекшев aka Modis от 27-10-2018, 23:12:05
Вот так я делал:
Ну конечно tr.Commit() ты случайно забыл... Мелочь, но на каждой транзакции у тебя происходит откат...
Дык она мне в этом методе была нужна только для открытия BlockTable
Название: Re: Вставка файла dwg как блока
Отправлено: Александр Ривилис от 27-10-2018, 23:14:08
Дык она мне в этом методе была нужна только для открытия BlockTable
Дык всё-равно откат будет. А это дополнительные временные задержки. Тут бы лучше вообще без транзакций обходится...
Название: Re: Вставка файла dwg как блока
Отправлено: Александр Пекшев aka Modis от 27-10-2018, 23:16:36
Дык она мне в этом методе была нужна только для открытия BlockTable
Дык всё-равно откат будет. А это дополнительные временные задержки. Тут бы лучше вообще без транзакций обходится...
Ну да - так-то задержки может и будут, но в контексте самого плагина это просто несущественно, так как метод вызывается один раз при его работе. Оптимизация не всегда нужна и полезна - иногда это просто трата времени ))
Название: Re: Вставка файла dwg как блока
Отправлено: Александр Ривилис от 27-10-2018, 23:18:20
Оптимизация не всегда нужна и полезна - иногда это просто трата времени ))
Правильно говоришь. Поэтому сразу нужно было писать оптимально - без транзакции.
Название: Re: Вставка файла dwg как блока
Отправлено: Александр Пекшев aka Modis от 27-10-2018, 23:22:28
Поэтому сразу нужно было писать оптимально - без транзакции
Вот тут могу поспорить =))
В процессе написания кода не всегда получается адекватно оценить оптимальность написанного метода. Просто не хватает взгляда со стороны. Когда смотришь на свой код, над которым ты просидел уже несколько часов, то внимание уже притупляется и очевидные вещи просто не видны.
В этом случае хорошо помогает Code review (и желательно не один раз перед релизом). А в нашем случае - форум )))
Название: Re: Вставка файла dwg как блока
Отправлено: Александр Ривилис от 27-10-2018, 23:28:53
Кстати, есть пара интересных и полезных в данном контексте методов:
Код - C# [Выбрать]
  1. SymbolUtilityServices.GetBlockNameFromInsertPathName(string pathName)
  2. SymbolUtilityServices.RepairSymbolName(string oldName, bool allowVerticalBar)
Первый получает получить имя блока из пути доступа к файлу, а второй исправляет это имя, делая его допустимым.
Название: Re: Вставка файла dwg как блока
Отправлено: Александр Ривилис от 27-10-2018, 23:30:29
А здесь и сам код:
https://www.keanw.com/2011/01/combining-autocad-blocks-in-separate-files-into-a-single-dwg-using-net-take-2.html