Вставка блока из другого чертежа

Автор Тема: Вставка блока из другого чертежа  (Прочитано 30741 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока из другого чертежа
« Ответ #15 : 18-01-2015, 20:03:22 »
Рабочий код (хотя проверок на ошибки явно не хватает):

Код - C# [Выбрать]
  1. using Application = Autodesk.AutoCAD.ApplicationServices.Core.Application;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.Geometry;
  4. using AGThsDrw;
  5. using System;
  6. using System.IO;
  7. using System.Resources;
  8. using Exception = System.Exception;
  9. #if AUTOCAD
  10. using DbS = Autodesk.AutoCAD.DatabaseServices;
  11. using EdI = Autodesk.AutoCAD.EditorInput;
  12. using Rt = Autodesk.AutoCAD.Runtime;
  13. #endif
  14.  
  15. namespace AGThsDrw
  16. {
  17.   public class AcInsBlock
  18.   {
  19.     [Rt.CommandMethod("AGInsBlock", "AGInsBlock", Rt.CommandFlags.Modal)]
  20.     public void InsBlockRef()
  21.     {
  22.       // Активный документ в редакторе AutoCAD
  23.       var doc = Application.DocumentManager.MdiActiveDocument;
  24.       // База данных чертежа (в данном случае - активного документа)
  25.       var db = doc.Database;
  26.       // Редактор базы данных чертежа
  27.       EdI.Editor ed = doc.Editor;
  28.       EdI.PromptPointOptions pPtOpts;
  29.       pPtOpts = new EdI.PromptPointOptions("\nУкажите точку вставки блока: ");
  30.       // Выбор точки пользователем
  31.       var pPtRes = doc.Editor.GetPoint(pPtOpts);
  32.       if (pPtRes.Status != EdI.PromptStatus.OK)
  33.         return;
  34.       var ptStart = pPtRes.Value;
  35.  
  36.       // Запускаем транзакцию
  37.       using (DbS.Transaction tr = db.TransactionManager.StartTransaction())
  38.       {
  39.         DbS.BlockTable bt = tr.GetObject(db.BlockTableId, DbS.OpenMode.ForRead) as DbS.BlockTable;
  40.         DbS.BlockTableRecord model =
  41.           tr.GetObject(bt[DbS.BlockTableRecord.ModelSpace], DbS.OpenMode.ForWrite) as DbS.BlockTableRecord;
  42.         // Путь к файлу чертежа
  43.         string BlockPath;
  44.         // BlockPath = "H:\\ACAD+\\blocks\\схемы\\КШ.dwg";
  45.         BlockPath = "C:\\test.dwg";
  46.  
  47.         // Создаем новую базу
  48.         using (DbS.Database db1 = new DbS.Database(false, false))
  49.         {
  50.           // Получаем базу чертежа-донора
  51.           db1.ReadDwgFile(BlockPath, System.IO.FileShare.Read, true, null);
  52.           // Получаем ID нового блока
  53.           DbS.ObjectId BlkId = db.Insert(BlockPath, db1, false);
  54.           DbS.BlockReference bref = new DbS.BlockReference(ptStart, BlkId);
  55.           // Дефолтные свойства блока (слой, цвет и пр.)
  56.           bref.SetDatabaseDefaults();
  57.           // Добавляем блок в модель
  58.           model.AppendEntity(bref);
  59.           // Добавляем блок в транзакцию
  60.           tr.AddNewlyCreatedDBObject(bref, true);
  61.           // Расчленяем блок
  62.           //bref.ExplodeToOwnerSpace();
  63.           //bref.Erase();
  64.           // Закрываем транзакцию
  65.           tr.Commit();
  66.         }
  67.       }
  68.     }
  69.   }
  70. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Вставка блока из другого чертежа
« Ответ #16 : 18-01-2015, 20:34:32 »
Не хочет на строчке (db1.ReadDwgFile(BlockPath, System.IO.FileShare.Read, true, null);)
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока из другого чертежа
« Ответ #17 : 18-01-2015, 20:39:31 »
Путь к файлу правильный? Он вообще существует? Права для работы с ним есть?
Файл в AutoCAD открывается?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Вставка блока из другого чертежа
« Ответ #18 : 18-01-2015, 20:42:45 »
Да. Файл я создал. Правда не проверил, там может быть просто линия или блок?
На блок и на простую линию выскакивает ошибка... :(
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Вставка блока из другого чертежа
« Ответ #20 : 18-01-2015, 20:52:03 »
Не нужно выкладывать файл.
СТРАННО.
При отладке вылетает ошибка!!!
А если просто "подцепить" к автокаду all - блок вставляется...
Помогите!!! Я ж только решил написать пару "фиговин" на С#, а уже такой "затык" с отладкой :(
---
для работы dll - путь к файлу "С/test.dwg", команда "AGInsBlock"
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока из другого чертежа
« Ответ #21 : 18-01-2015, 21:07:26 »
А теперь всё, что ты написал выше, но только по-русски. Я ничего не понял.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Вставка блока из другого чертежа
« Ответ #22 : 18-01-2015, 21:10:16 »
если "AGThsDrw.dll" загрузить в автокад через "netload" и выполнить команду "AGInsBlock", блок из test.dwg вставится.
а вот отладка проекта происходит с ошибкой.
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока из другого чертежа
« Ответ #23 : 18-01-2015, 21:13:06 »
а вот отладка проекта происходит с ошибкой.
Тут возможны десятки разных причин. В чем причина у тебя - не знаю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Вставка блока из другого чертежа
« Ответ #24 : 18-01-2015, 21:13:44 »
отличная перспектива :)
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блока из другого чертежа
« Ответ #25 : 18-01-2015, 21:18:51 »
отличная перспектива :)
1) Убедись что у тебя установлены все обновления на VS 2013
2) Убедись, что ты отлаживаешь под чистым AutoCAD (без всяких левых приложений).
3) Установи режим для отладчика Use Managed Compatibility Mode
4) Почитай: http://adn-cis.org/forum/index.php?topic=1019.0
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Вставка блока из другого чертежа
« Ответ #26 : 18-01-2015, 23:00:43 »
Попробую установить еще один автокад на диск Д.  :o
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Вставка блока из другого чертежа
« Ответ #27 : 19-01-2015, 10:13:08 »
Странно, на D еще один автокад не хочет устанавливаться.
Написал код вставки блока на VB.net - та же картина...
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Вставка блока из другого чертежа
« Ответ #28 : 19-01-2015, 14:19:10 »
Странно, на D еще один автокад не хочет устанавливаться.
Если версия AutoCAD та же самая, что уже установлена, то ничего странного.

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Re: Вставка блока из другого чертежа
« Ответ #29 : 19-01-2015, 14:40:55 »
Попробую решить свою проблему, поставив VirtualBox.
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020