Вставка файла dwg как блока

Автор Тема: Вставка файла dwg как блока  (Прочитано 8534 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Нужно вставить целый файл dwg с диска как блок в свой чертеж программно. Внутри этого файла заготовка блока с атрибутами -  геометрия и атрибуты(сам файл получен в результате сохранения Save block as описания блока из Block Editora в dwg файл). Встречал код вставляющий описание существующего блока из одного чертежа в другой. А как вставить такую файл-заготовку блока из dwg? Ведь он не содержит описания блока.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Вставка файла dwg как блока
« Ответ #1 : 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);
Что-то типа того. Только для вставляемого блока нужно еще имя задать

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка файла dwg как блока
« Ответ #2 : 27-10-2018, 23:04:44 »
Что-то типа того. Только для вставляемого блока нужно еще имя задать
Точнее нужно из sourceFileInfo.FullName нужно сделать допустимое имя блока. Так что скорее это sourceFileInfo.Name
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Вставка файла dwg как блока
« Ответ #3 : 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. }
Метод учитывал уже имеющиеся блоки с таким именем и создавал новое имя, прибавляя секунды. В моем случае было не важно, так как блок потом расчленялся

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка файла dwg как блока
« Ответ #4 : 27-10-2018, 23:10:19 »
Вот так я делал:
Ну конечно tr.Commit() ты случайно забыл... Мелочь, но на каждой транзакции у тебя происходит откат...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Вставка файла dwg как блока
« Ответ #5 : 27-10-2018, 23:12:05 »
Вот так я делал:
Ну конечно tr.Commit() ты случайно забыл... Мелочь, но на каждой транзакции у тебя происходит откат...
Дык она мне в этом методе была нужна только для открытия BlockTable

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка файла dwg как блока
« Ответ #6 : 27-10-2018, 23:14:08 »
Дык она мне в этом методе была нужна только для открытия BlockTable
Дык всё-равно откат будет. А это дополнительные временные задержки. Тут бы лучше вообще без транзакций обходится...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Вставка файла dwg как блока
« Ответ #7 : 27-10-2018, 23:16:36 »
Дык она мне в этом методе была нужна только для открытия BlockTable
Дык всё-равно откат будет. А это дополнительные временные задержки. Тут бы лучше вообще без транзакций обходится...
Ну да - так-то задержки может и будут, но в контексте самого плагина это просто несущественно, так как метод вызывается один раз при его работе. Оптимизация не всегда нужна и полезна - иногда это просто трата времени ))

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка файла dwg как блока
« Ответ #8 : 27-10-2018, 23:18:20 »
Оптимизация не всегда нужна и полезна - иногда это просто трата времени ))
Правильно говоришь. Поэтому сразу нужно было писать оптимально - без транзакции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Вставка файла dwg как блока
« Ответ #9 : 27-10-2018, 23:22:28 »
Поэтому сразу нужно было писать оптимально - без транзакции
Вот тут могу поспорить =))
В процессе написания кода не всегда получается адекватно оценить оптимальность написанного метода. Просто не хватает взгляда со стороны. Когда смотришь на свой код, над которым ты просидел уже несколько часов, то внимание уже притупляется и очевидные вещи просто не видны.
В этом случае хорошо помогает Code review (и желательно не один раз перед релизом). А в нашем случае - форум )))

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка файла dwg как блока
« Ответ #10 : 27-10-2018, 23:28:53 »
Кстати, есть пара интересных и полезных в данном контексте методов:
Код - C# [Выбрать]
  1. SymbolUtilityServices.GetBlockNameFromInsertPathName(string pathName)
  2. SymbolUtilityServices.RepairSymbolName(string oldName, bool allowVerticalBar)
Первый получает получить имя блока из пути доступа к файлу, а второй исправляет это имя, делая его допустимым.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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