Объединение стен

Автор Тема: Объединение стен  (Прочитано 7489 раз)

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

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Объединение стен
« : 04-08-2015, 16:46:40 »
Добрый день, есть ли возможность объединения стен с помощью API?
я нашел только такой вариант
Код - C# [Выбрать]
  1. RevitCommandId commandId = RevitCommandId.LookupPostableCommandId(PostableCommand.TrimOrExtendToCorner);
возможно ли это без участия пользователя и в качестве параметра использовать Id стен.
« Последнее редактирование: 04-08-2015, 16:56:41 от Виктор Чекалин »

Отмечено как Решение shss 20-08-2015, 09:54:24

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Объединение стен
« Ответ #1 : 05-08-2015, 06:15:52 »
День добрый!

Попробовал, оказалось достаточно подправить положение стенок, а Revit их объединяет самостоятельно:
Код - C# [Выбрать]
  1. public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  2. {
  3.         var uiapp = commandData.Application;
  4.         var uidoc = uiapp.ActiveUIDocument;
  5.         var doc = uidoc.Document;
  6.  
  7.         var selectedWalls = uidoc
  8.                 .Selection
  9.                 .GetElementIds()
  10.                 .Select(doc.GetElement)
  11.                 .OfType<Wall>()
  12.                 .ToList();
  13.  
  14.         if (selectedWalls.Count != 2)
  15.         {
  16.                 message = "Необходимо выбрать 2 стены";
  17.                 return Result.Failed;
  18.         }
  19.  
  20.         var intersectionPoint = GetWallsIntersectionPoint(selectedWalls[0], selectedWalls[1]);
  21.         if (intersectionPoint == null)
  22.         {
  23.                 message = "Не найдена точка пересечения стен";
  24.                 return Result.Failed;
  25.         }
  26.  
  27.         using (var transaction = new Transaction(doc, "trim or extend walls"))
  28.         {
  29.                 transaction.Start();
  30.                 if (selectedWalls.Any(selectedWall => !TrimOrExtendWallToPoint(selectedWall, intersectionPoint)))
  31.                 {
  32.                         message = "Ожидается, что стены прямые";
  33.                         return Result.Failed;
  34.                 }
  35.  
  36.                 transaction.Commit();
  37.         }
  38.         // проверим на всякий случай, что Revit эти стенки объединил
  39.         var wallLocationCurve = ((LocationCurve) selectedWalls[0].Location);
  40.         var wallJoinsIds = wallLocationCurve
  41.                 .get_ElementsAtJoin(0).OfType<Element>()
  42.                 .Union(wallLocationCurve.get_ElementsAtJoin(1).OfType<Element>())
  43.                 .Select(x => x.Id)
  44.                 .ToList();
  45.  
  46.         var areSelectedWallJoined = selectedWalls
  47.                 .Select(x => wallJoinsIds.Contains(x.Id))
  48.                 .Aggregate(true, (result, elem) => result && elem);
  49.  
  50.         if (!areSelectedWallJoined)
  51.         {
  52.                 message = "Стенки не объединены!";
  53.                 return Result.Failed;
  54.         }
  55.        
  56.         return Result.Succeeded;
  57. }
  58.  
  59. private XYZ GetWallsIntersectionPoint(Wall firstWall, Wall secondWall)
  60. {
  61.         var firstCurve = ((LocationCurve) firstWall.Location).Curve.Clone();
  62.         firstCurve.MakeUnbound();
  63.  
  64.         var secondCurve = ((LocationCurve)secondWall.Location).Curve.Clone();
  65.         secondCurve.MakeUnbound();
  66.  
  67.         IntersectionResultArray intersectionResults;
  68.         if (firstCurve.Intersect(secondCurve, out intersectionResults) != SetComparisonResult.Overlap)
  69.                 return null;
  70.  
  71.         return intersectionResults.get_Item(0).XYZPoint;
  72. }
  73.  
  74. private bool TrimOrExtendWallToPoint(Wall wall, XYZ point)
  75. {
  76.         var wallLocationCurve = (LocationCurve) wall.Location;
  77.  
  78.         var wallLine = wallLocationCurve.Curve as Line;
  79.         if (wallLine == null)
  80.                 return false;
  81.  
  82.         var wallStart = (wallLine.GetEndPoint(0) - point).GetLength() >
  83.                                         (wallLine.GetEndPoint(1) - point).GetLength()
  84.                                                 ? wallLine.GetEndPoint(0)
  85.                                                 : wallLine.GetEndPoint(1);
  86.  
  87.         var newWallLine = Line.CreateBound(wallStart, point);
  88.         wallLocationCurve.Curve = newWallLine;
  89.  
  90.         return true;
  91. }

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Объединение стен
« Ответ #2 : 05-08-2015, 08:54:51 »
Спасибо за подсказку. Отличное решение.
Но столкнулся с проблемой при таком решении если соединил две стены ( 1 и 2 ), и пытаешься соединить ( 1 и 3 ) стены комнаты, то вылетает ошибка
и нужно разъединить стены.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Объединение стен
« Ответ #3 : 06-08-2015, 05:55:33 »
Честно говоря, не разобрал, что там на картинке, а при нажатии на главную фастпика попадает.

Попробовал с соединенными стенами, вроде все получилось...

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Объединение стен
« Ответ #4 : 20-08-2015, 09:56:06 »
Доработал код, все отлично работает!
Просто вот в этом куске мне немножко по-другому обрабатывать надо
Код - C# [Выбрать]
  1. var wallStart = (wallLine.GetEndPoint(0) - point).GetLength() >
  2.                                         (wallLine.GetEndPoint(1) - point).GetLength()
  3.                                                 ? wallLine.GetEndPoint(0)
  4.                                                 : wallLine.GetEndPoint(1);
Еще раз Спасибо за подсказку.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Объединение стен
« Ответ #5 : 20-08-2015, 10:48:42 »
А что в этом куске не так и в каких случаях не работает?

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Объединение стен
« Ответ #6 : 20-08-2015, 11:01:12 »
Когда я строил комнату (прямоугольник), поставил первые две стены (1) и (2), они соединились, все хорошо (то есть крайняя точка первого отрезка стены продлилась до начальной точки второй стены), ставлю третью стену (3), и соединяю (2) и (3), и из этого условия берется начальная точка второй стены и соединяется с начальной точкой третьей стены, и вылетает ошибка которую описывал выше.
Поэтому сделал проще
Код - C# [Выбрать]
  1. wallLocationCurve.Curve = Line.CreateBound(point, wallLine.GetEndPoint(1));