Установка мультивыноски в центр объекта(полилинии) расположенного в блоке.

Автор Тема: Установка мультивыноски в центр объекта(полилинии) расположенного в блоке.  (Прочитано 4618 раз)

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

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Здравствуйте!

Коллеги, вопрос следующего характера.
Имеется блок, в нем полилинии мне нужно провести сортировку по площади и в центр полилинии с максимальной площадью установить мультивыноску. Есть кусок кода(не мой). Как я примерно понял в нем для каждой полилинии формируется мультивыноска, а мне нужно сделать сортировку и выбрать только одну полилинию. Не понимаю как из blkTabRec выдернуть и сравнить полилинии.
Код - C++ [Выбрать]
  1.  
  2.                 for (int i = 0; i < psr.Value.Count; i++)
  3.                 {
  4.                     DBObject obj = psr.Value[i].ObjectId.GetObject(OpenMode.ForWrite);
  5.                     if (!(obj is BlockReference)) continue;
  6.  
  7.                     BlockReference blkRef = obj as BlockReference;
  8.                     BlockTableRecord blkTabRec = blkRef.BlockTableRecord.GetObject(OpenMode.ForWrite) as BlockTableRecord;
  9.  
  10.                     if (!blkTabRec.HasAttributeDefinitions) continue;
  11.                     zb.AttributesUpdate(blkRef);
  12.  
  13.                     foreach (ObjectId InnerObject in blkTabRec)
  14.                     {
  15.                         Entity TempObject = (Entity)InnerObject.GetObject(OpenMode.ForWrite);
  16.  
  17.                         if (!(TempObject is Polyline)) continue;
  18.  
  19.                         Polyline poly = TempObject as Polyline;
  20.  
  21.                         Point3d ptC = Utilities.Geometry.GetCenterPoint(poly);
  22.  
  23.                         ptC = Utilities.Geometry.IsPointInsidePolyline(poly, ptC) ? ptC : poly.GetClosestPointTo(ptC, false);
  24.                         Point3d ptP = new Point3d(ptC.X + 10f, ptC.Y + 10f, 0);
  25.  
  26.                         MLeader lead = Utilities.STD.CreateMLeader(true, zb["zu"].Value);
  27.  
  28.                         int idx = lead.AddLeaderLine(ptC);
  29.                         lead.SetFirstVertex(idx, ptC);
  30.                         lead.SetLastVertex(idx, ptP);
  31.                         lead.DoglegLength = 0d;
  32.                         lead.ArrowSize = 0d;
  33.                         lead.TextAttachmentDirection = TextAttachmentDirection.AttachmentHorizontal;
  34.                         lead.TextAlignmentType = TextAlignmentType.CenterAlignment;
  35.                         lead.TextAttachmentType = TextAttachmentType.AttachmentBottomOfTopLine;
  36.                         lead.TextHeight = 2.5d;
  37.  
  38.                         lead.Layer = LayName;
  39.  
  40.                         poly.Color = ColorByBlock;
  41.  
  42.                         AdditionalObjects.Add(lead);
  43.                     }
  44.  
Если есть какие-нибудь темы ткните носом.)

Заранее спасибо!

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

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

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Я бы сделал сортировку с помощью Linq, получил бы ObjectId нужной полилинии, а  дальше дело техники.

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Мультивыноску нужно запихать внутрь BlockTableRecord, в которой полилинии?
Нет, мультивыноска не вписывается в блок.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А как ты тогда позиционируешь мультивыноску, если блок может быть вставлен не с координатами (0, 0, 0), да еще и с поворотом или не единичным масштабом???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
А как ты тогда позиционируешь мультивыноску, если блок может быть вставлен не с координатами (0, 0, 0), да еще и с поворотом или не единичным масштабом???
В кадастре за такие просчеты по ушам надают). Поэтому блоки стоят каждый в своих координатах, без поворотов, без масштабирования и никак иначе.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Поэтому блоки стоят каждый в своих координатах
В своих координатах, это значит не в (0, 0, 0). И соответственно если внутри этих блоков есть полилинии, то их необходимо транспонировать в точку вставки блока. Или транспонировать найденный центр полилинии для вставки мультилидера.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Цитировать
В кадастре за такие просчеты по ушам надают
в кадастре не делают блоки из участков, достаточно полигона с атрибутами
а если у нас "многоконтурный участок"?
И вообще - такой функционал есть в Map 3D

Код - C# [Выбрать]
  1.         public TLineString GetOuterBoundary()
  2.         {
  3.             var AllMBR = this.Rings.Select(r => r.GetMBR()).ToArray();
  4.             int res = -1;
  5.             for (int i = 0; i < this.Rings.Count; i++)
  6.             {
  7.                 var tMBR = AllMBR[i];
  8.                 for (int j=0; j < this.Rings.Count; j++)
  9.                 {
  10.                     if (j == i) continue;
  11.                     if (!tMBR.Contains(AllMBR[j])) break;
  12.                     res = i;
  13.                 }
  14.             }
  15.             return res == -1 ? null : this.Rings[res];
  16.         }
https://github.com/triroakenshield/RosReestrImpLib/blob/master/RosReestrImp/Geometry/TPolygon.cs

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Имеется блок, в нем полилинии мне нужно провести сортировку по площади и в центр полилинии с максимальной площадью установить мультивыноску.
Судя по логике сортировка не нужна вообще. Достаточно найти полилинию с максимальной площадью.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Код не тестировал:

Код - C# [Выбрать]
  1. /// <summary>
  2. /// Функция возвращает самую большую по площади полилинию из тех,
  3. /// которые содержатся в BlockTableRecord
  4. /// Внимание: Должна быть хоть одна активная транзакция
  5. /// </summary>
  6. /// <param name="btr">Блок или пространство (модели или Листа)</param>
  7. /// <returns>ObjectId самой большой полилинии</returns>
  8. public static ObjectId GetBiggestPolyId(BlockTableRecord btr)
  9. {
  10.   ObjectId idPoly = ObjectId.Null;
  11.   double area = -1;
  12.   foreach (ObjectId id in btr)
  13.   {
  14.     Polyline pl =
  15.       btr.Database.TransactionManager.GetObject(id, OpenMode.ForRead) as Polyline;
  16.     if (pl !=  null) {
  17.       double curArea = pl.Area;
  18.       if (curArea > area) {
  19.         idPoly = id; area = curArea;
  20.       }
  21.     }
  22.   }
  23.   return idPoly;
  24. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
а если там везде одинаковая площадь?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
а если там везде одинаковая площадь?
Надеюсь, что этот вопрос не ко мне. Я лишь привёл код, соответствующий вопросу MDA без относительно предметной области, хотя и у меня есть ряд сомнений.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
нет конечно, меня просто убивает, то упорство с каким люди пытаются реализовать функционал Map 3D, при том, что он давно идёт в комплекте...

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0