From 500da4176a400fc0284d54cfa084e41913c964c1 Mon Sep 17 00:00:00 2001 From: vlastroG Date: Wed, 17 Jun 2026 13:07:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D1=83=20=D1=81=D0=BE=D0=BE=D1=81?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=BD=D0=B0=20=D0=BE=D1=82=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Models/OpeningUnion/OpeningsGroup.cs | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/RevitOpeningPlacement/Models/OpeningUnion/OpeningsGroup.cs b/src/RevitOpeningPlacement/Models/OpeningUnion/OpeningsGroup.cs index e1a391b7d..d972a8776 100644 --- a/src/RevitOpeningPlacement/Models/OpeningUnion/OpeningsGroup.cs +++ b/src/RevitOpeningPlacement/Models/OpeningUnion/OpeningsGroup.cs @@ -145,19 +145,44 @@ private bool IsTouchingOpening(OpeningMepTaskOutcoming otherOpeningTask) { private bool OpeningsLocatedOnTheSameLine(OpeningMepTaskOutcoming otherOpeningTask) { if(_elements.Count == 0) { return true; } if(_elements.Count == 1) { - var firstNormal = _elements.First().GetFamilyInstance().FacingOrientation; + var firstOrientation = _elements.First().GetFamilyInstance().FacingOrientation; + var secondOrientation = otherOpeningTask.GetFamilyInstance().FacingOrientation; + if(!firstOrientation.IsAlmostEqualTo(secondOrientation)) { + return false; + } + + var firstHandOrientation = _elements.First().GetFamilyInstance().HandOrientation; var firstLocation = _elements.First().Location; var secondLocation = otherOpeningTask.Location; var direction = (secondLocation - firstLocation).Normalize(); - return firstNormal.IsAlmostEqualTo(direction) || firstNormal.IsAlmostEqualTo(direction.Negate()); + return AngleIsMultiplyOf(firstOrientation.AngleTo(direction), Math.PI / 2) + && AngleIsMultiplyOf(firstHandOrientation.AngleTo(direction), Math.PI / 2); } else { var firstToOtherDirection = GetDirectionBetween(_elements.First(), otherOpeningTask); var lastToOtherDirection = GetDirectionBetween(_elements.Last(), otherOpeningTask); double angle = firstToOtherDirection.AngleTo(lastToOtherDirection); - bool angleIsZero = Math.Round(angle, 9) == 0; - bool angleIsPi = Math.Round(angle - Math.PI, 9) == 0; - return angleIsZero || angleIsPi; + return AngleIsMultiplyOf(angle, Math.PI); + } + } + + /// + /// Проверяет, что заданный угол кратен другому углу + /// + /// Угол для проверки + /// Угол, которому должен быть кратен первый + /// Точность сравнения углов + /// True, если первый угол кратен второму + private bool AngleIsMultiplyOf(double angle, double multiplyAngle, double epsilon = 1e-9) { + if(Math.Abs(angle) <= epsilon) { + return true; } + + if(Math.Abs(angle - multiplyAngle) <= epsilon) { + return true; + } + + double reminder = Math.Abs(angle % multiplyAngle); + return reminder <= epsilon || Math.Abs(reminder - multiplyAngle) <= epsilon; } ///