Вставка массива из блоков

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

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

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Добрый день,
Мне необходимо вставить из файла один и тот же блок на чертёж, но с разными углами поворота.
Получил я из Excell массив с углами поворота, а как блоки массивом вставлять не могу понять, если бы он был постоянного размера проблем бы не было, а у меня каждый раз разный

Код - C# [Выбрать]
  1.                 Database dbCurrent = Application.DocumentManager.MdiActiveDocument.Database;
  2.                 Editor edCurrent = Application.DocumentManager.MdiActiveDocument.Editor;
  3.                 Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.                 Database db = new Database(false, true);
  5.                 db.ReadDwgFile("H:/MainProg/ID_AutoCad/ID_AutoCad/bin/Debug/Sektor.dwg", System.IO.FileShare.Read, true, "");
  6.                 ObjectId idBTR = dbCurrent.Insert(BlockTableRecord.ModelSpace, "Sektor", db, true);
  7.                 if (!idBTR.IsNull)
  8.                 {
  9.                     PromptPointResult rse = edCurrent.GetPoint("\nУкажите точку вставки блока: ");
  10.                     if (rse.Status == PromptStatus.OK)
  11.                     {
  12.                         Point3d p = rse.Value;
  13.                         using (Transaction trans = dbCurrent.TransactionManager.StartTransaction())
  14.                         {
  15.                         BlockReference brf = new BlockReference(p, idBTR);
  16.                              brf.Rotation = 180 * Math.PI / 180;                  
  17.                               BlockTableRecord btr = (BlockTableRecord)trans.GetObject(dbCurrent.CurrentSpaceId, OpenMode.ForWrite);                      
  18.                             btr.AppendEntity(brf);
  19.                             trans.AddNewlyCreatedDBObject(brf, true);            
  20.                             trans.Commit();
  21.                         }          
  22.                     }
  23.                  }

Наведите на мысль

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Re: Вставка массива из блоков
« Ответ #1 : 23-04-2019, 07:47:19 »
Всё просто транзакция в цикле, а не делать массив блоков это видимо невозможно
Код - C# [Выбрать]
  1.   Database dbCurrent = Application.DocumentManager.MdiActiveDocument.Database;
  2.             Editor edCurrent = Application.DocumentManager.MdiActiveDocument.Editor;
  3.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.             Database db = new Database(false, true);
  5.  
  6.             db.ReadDwgFile("H:/MainProg/ID_AutoCad/ID_AutoCad/bin/Debug/Sektor.dwg", System.IO.FileShare.Read, true, "");
  7.             ObjectId idBTR = dbCurrent.Insert(BlockTableRecord.ModelSpace, "Sektor", db, true);
  8.  
  9.             if (!idBTR.IsNull)
  10.             {
  11.                 PromptPointResult rse = edCurrent.GetPoint("\nУкажите точку вставки блока: ");
  12.                 if (rse.Status == PromptStatus.OK)
  13.                 {
  14.                     Point3d p = rse.Value;
  15.                     int l = d.Length;
  16.                     int z = 0;
  17.                     while (z < l)
  18.                     {
  19.                         int deg = Convert.ToInt32(d[z]);
  20.                         using (Transaction trans = dbCurrent.TransactionManager.StartTransaction())
  21.                         {
  22.                             BlockReference brf = new BlockReference(p, idBTR);
  23.                             brf.Rotation = deg * Math.PI / 180;
  24.                             BlockTableRecord btr = (BlockTableRecord)trans.GetObject(dbCurrent.CurrentSpaceId, OpenMode.ForWrite);
  25.                             btr.AppendEntity(brf);
  26.                             trans.AddNewlyCreatedDBObject(brf, true);
  27.                             trans.Commit();
  28.                         }
  29.                         z++;
  30.                     }
  31.                 }
  32.             }
  33.  

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Вставка массива из блоков
« Ответ #2 : 23-04-2019, 09:03:20 »
Вы бы полный код давали...
В последнем коде не вполне понятно что за переменные d и deg.
Зачем транзакцию в цикл то пихать, почему не сделать в рамках одной транзакции?
Цикл while это конечно хорошо, но почему не foreach, зачем столько сложностей?

И к сожалению из Вашего текста я не вполне понял, что Вы хотите... =(

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Re: Вставка массива из блоков
« Ответ #3 : 23-04-2019, 09:37:48 »
Полный код нет смысла давать там куча лишнего и не доделанного, только больше запутает.
Переменная d[] хранит массив строк с углами поворота блока (их я выдёргиваю из Excel они там в формате "90.0"). Поэтому я её обрезаю до "90" и конвертирую в int deg.
В конечном итоге цель автоматически получать вот такую картинку просто указав Excel файл Заказчика


Стрелочки секторов по азимутам я уже автоматически расставил видимо коряво, но всё же.
Цикл while, а не foreach наверное потому что опыта мало. Как сделать одной транзакцией я не смог понять.

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Вставка массива из блоков
« Ответ #4 : 23-04-2019, 09:57:08 »
Я код не проверял, но как то так...
Код - C# [Выбрать]
  1.       App.Document doc = App.Application.DocumentManager.MdiActiveDocument;
  2.       Db.Database dbCurrent = doc.Database;
  3.       Ed.Editor edCurrent = doc.Editor;
  4.  
  5.  
  6.       Db.ObjectId idBTR = Db.ObjectId.Null;
  7.  
  8.       using (Db.Database db = new Db.Database(false, true))
  9.       {
  10.         db.ReadDwgFile(
  11.           "H:/MainProg/ID_AutoCad/ID_AutoCad/bin/Debug/Sektor.dwg",
  12.           System.IO.FileShare.Read,
  13.           true,
  14.           "");
  15.         idBTR = dbCurrent.Insert(Db.BlockTableRecord.ModelSpace, "Sektor", db, true);
  16.       }
  17.  
  18.       if (idBTR.IsNull)
  19.       {
  20.         edCurrent.WriteMessage("\nНет блока");
  21.         return;
  22.       }
  23.  
  24.       Ed.PromptPointResult rse = edCurrent.GetPoint("\nУкажите точку вставки блока: ");
  25.       if (rse.Status != Ed.PromptStatus.OK) return;
  26.  
  27.       using (Db.Transaction trans = dbCurrent.TransactionManager.StartTransaction())
  28.       {
  29.         Db.BlockTableRecord btr = (Db.BlockTableRecord)trans.GetObject(dbCurrent.CurrentSpaceId, Db.OpenMode.ForWrite);
  30.         Gem.Point3d p = rse.Value;
  31.         foreach (var i in d)
  32.         {
  33.  
  34.           int deg = Convert.ToInt32(i);
  35.           using (Db.BlockReference brf = new Db.BlockReference(p, idBTR))
  36.           {
  37.             brf.Rotation = deg * Math.PI / 180;
  38.             btr.AppendEntity(brf);
  39.             trans.AddNewlyCreatedDBObject(brf, true);
  40.           }
  41.         }
  42.         trans.Commit();
  43.       }

Если кратко: открываем транзакцию, открываем текущее пространство для записи, добавляем туда кучу блоков и закрываем транзакцию. По хорошему, перед добавлением блока из фала, надо бы проверить есть ли такой блок в текущем файле...

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка массива из блоков
« Ответ #5 : 23-04-2019, 11:38:05 »
Владимир Шу, serega374,
Только мне кажется, что все блоки будут вставлены в одну и туже точку, только с разными углами поворота? Не думаю, что это то что нужно. Или я не прав?
Ну и кроме того возникает вопрос про систему координат...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Re: Вставка массива из блоков
« Ответ #6 : 23-04-2019, 11:40:13 »
Александр Ривилис, именно так и нужно, эта картинка указывает направления секторов антенн базовой станции. Грубо говоря для масштаба 1:500 они висят в одной точке.

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Re: Вставка массива из блоков
« Ответ #7 : 23-04-2019, 11:41:07 »
А что с системой координат?

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Вставка массива из блоков
« Ответ #8 : 23-04-2019, 11:46:05 »
Ну и кроме того возникает вопрос про систему координат...
Да, возникает, но на основании авторского кода я предположил, что автор работает в мировой и не стал заморачиваться по этому поводу.
А вообще конечно нужно пересчитывать указанную точку...

А что с системой координат?
Если я правильно помню, то метод edCurrent.GetPoint вернет точку в текущей системе координат, а блок вставляется в мировой

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка массива из блоков
« Ответ #9 : 23-04-2019, 11:53:24 »
А что с системой координат?
Кроме того, что указанную точку следует пересчитывать из ПСК (UCS) в МСК (UCS), так еще и углы следует пересчитывать из одной системы координат в другую. Если чертеж в МСК, то этого делать не нужно, но чаще всего топографические карты в своей системе координат (т.е. ПСК не соответствует МСК).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Re: Вставка массива из блоков
« Ответ #10 : 23-04-2019, 12:18:52 »
картинку я вставляю вручную из Google Earth Pro это просто съёмка с космоса. В будущем думал автоматически, если возможно
но вначале мне хотелось бы автоматически расставлять сектора и вписывать электрические и механические параметры антенн в Мтекст. При проектировании это простой перенос из Excell, но антенн бывает много и бывают опечатки, за которые прилетают замечания.
Владимир Шу, видимо не подходит мне цикл foreach
ругается на вот эту строку
Код - C# [Выбрать]
  1. int deg = Convert.ToInt32(i);
  2.  

Входная строка имеет неверный формат.

я сделал преобразование, сразу после получения данных из Excel
Код - C# [Выбрать]
  1. d[x] = xlSht.Cells[y, 4].Text; // получаем значение угла поворота в формате "90.0"
  2. d[x] = d[x].Substring(0, d[x].Length - 2);// убираем два последних символа получаем "90"
  3.  

С циклом while работало

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка массива из блоков
« Ответ #11 : 23-04-2019, 12:22:49 »
С циклом while работало
Цикл тут точно не причем. Непонятны извращения с обрезанием двух символов и зачем вообще следует преобразовывать угол в целое число. Угол должен быть вещественным (double).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Re: Вставка массива из блоков
« Ответ #12 : 23-04-2019, 12:24:29 »
Ладно мне надо подумать спасибо!

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Вставка массива из блоков
« Ответ #13 : 23-04-2019, 12:50:00 »
я сделал преобразование, сразу после получения данных из Excel
Я потому и просил больше кода... предполагаю, что в массиве d лежат строки...
Код - C# [Выбрать]
  1. //d[x] = xlSht.Cells[y, 4].Text; // получаем значение угла поворота в формате "90.0"
  2. //d[x] = d[x].Substring(0, d[x].Length - 2);// убираем два последних символа получаем "90"
  3. foreach (string i in d)
  4. {
  5.   double deg = 0;
  6.   if (double.TryParse(i, out deg))
  7.     using (Db.BlockReference brf = new Db.BlockReference(p, idBTR))
  8.     {
  9.       brf.Rotation = deg * Math.PI / 180;
  10.       btr.AppendEntity(brf);
  11.       trans.AddNewlyCreatedDBObject(brf, true);
  12.     }
  13. }