/// <summary>Фильтр стен по пересечению секущей плоскостью секущего диапазона</summary> /// <param name="advancedWalls"></param> /// <param name="doc"></param> public static void FilterByCutPlan(List <AdvancedWall> advancedWalls, Document doc) { var checkedZ = GeometryHelpers.GetViewPlanCutPlaneElevation((ViewPlan)doc.ActiveView); for (var i = advancedWalls.Count - 1; i >= 0; i--) { if (checkedZ < advancedWalls[i].GetMinZ() || checkedZ > advancedWalls[i].GetMaxZ()) { advancedWalls.RemoveAt(i); } } }
/// <summary>Проставить внешние размеры</summary> public void DoWork() { var doc = _uiApplication.ActiveUIDocument.Document; _cutPlanZ = GeometryHelpers.GetViewPlanCutPlaneElevation((ViewPlan)doc.ActiveView); // select var selectedElements = SelectElements(); if (selectedElements == null) { return; } // get list of advanced elements foreach (var element in selectedElements) { switch (element) { case Wall wall: var advancedWall = new AdvancedWall(wall); if (advancedWall.IsDefined) { _advancedWalls.Add(advancedWall); } break; case Grid grid: var advancedGrid = new AdvancedGrid(grid); if (advancedGrid.IsDefined) { _advancedGrids.Add(advancedGrid); } break; } } if (!_advancedWalls.Any()) { MessageBox.Show(Language.GetItem(LangItem, "msg7"), MessageBoxIcon.Close); return; } // Фильтрую стены по толщине AdvancedHelpers.FilterByWallWidth(_advancedWalls); if (!_advancedWalls.Any()) { MessageBox.Show(Language.GetItem(LangItem, "msg8"), MessageBoxIcon.Close); return; } // Фильтрую стены, оставляя которые пересекаются секущим диапазоном AdvancedHelpers.FilterByCutPlan(_advancedWalls, _uiApplication.ActiveUIDocument.Document); // Вдруг после этого не осталось стен! if (!_advancedWalls.Any()) { MessageBox.Show(Language.GetItem(LangItem, "msg9"), MessageBoxIcon.Close); return; } AdvancedHelpers.FindExtremes( _advancedWalls, out var leftExtreme, out var rightExtreme, out var topextreme, out var bottomExtreme); using (var transactionGroup = new TransactionGroup(doc, _transactionName)) { transactionGroup.Start(); var createdDimensions = new List <Dimension>(); if (_exteriorConfiguration.RightDimensions) { createdDimensions.AddRange(CreateSideDimensions(rightExtreme, _advancedWalls, ExtremeWallVariant.Right)); } if (_exteriorConfiguration.LeftDimensions) { createdDimensions.AddRange(CreateSideDimensions(leftExtreme, _advancedWalls, ExtremeWallVariant.Left)); } if (_exteriorConfiguration.TopDimensions) { createdDimensions.AddRange(CreateSideDimensions(topextreme, _advancedWalls, ExtremeWallVariant.Top)); } if (_exteriorConfiguration.BottomDimensions) { createdDimensions.AddRange(CreateSideDimensions(bottomExtreme, _advancedWalls, ExtremeWallVariant.Bottom)); } if (createdDimensions.Any(d => d != null)) { using (var tr = new Transaction(doc, "Remove zeroes")) { tr.Start(); foreach (var createdDimension in createdDimensions.Where(d => d != null)) { if (Dimensions.TryRemoveZeroes(createdDimension, out var referenceArray) && createdDimension.Curve is Line line) { doc.Delete(createdDimension.Id); doc.Create.NewDimension(doc.ActiveView, line, referenceArray); } } tr.Commit(); } } transactionGroup.Assimilate(); } }
/// <summary>Получение линии размера для цепочки в зависимости от внешнего направления</summary> /// <param name="doc"></param> /// <param name="sideWalls">Набор "боковых" стен</param> /// <param name="extremeWallVariant">Вариант направления</param> /// <param name="offset">Отступ от крайней стены</param> /// <returns></returns> public static Line GetDimensionLineForChain( Document doc, List <AdvancedWall> sideWalls, ExtremeWallVariant extremeWallVariant, double offset) { var cutPlanZ = GeometryHelpers.GetViewPlanCutPlaneElevation((ViewPlan)doc.ActiveView); var points = new List <XYZ>(); foreach (var wall in sideWalls) { points.Add(wall.EndPoint); points.Add(wall.StartPoint); points.AddRange(wall.GetPointsFromGeometry(doc.ActiveView)); } if (!points.Any()) { return(null); } switch (extremeWallVariant) { case ExtremeWallVariant.Right: { points.Sort((x, y) => x.X.CompareTo(y.X)); var maxX = points.Last().X; points.Sort((x, y) => x.Y.CompareTo(y.Y)); var minY = points.First().Y; var maxY = points.Last().Y; return(TryCreateBound( new XYZ(maxX + offset, minY, cutPlanZ), new XYZ(maxX + offset, maxY, cutPlanZ))); } case ExtremeWallVariant.Left: { points.Sort((x, y) => x.X.CompareTo(y.X)); var minX = points.First().X; points.Sort((x, y) => x.Y.CompareTo(y.Y)); var minY = points.First().Y; var maxY = points.Last().Y; return(TryCreateBound( new XYZ(minX - offset, minY, cutPlanZ), new XYZ(minX - offset, maxY, cutPlanZ))); } case ExtremeWallVariant.Top: { points.Sort((x, y) => x.X.CompareTo(y.X)); var minX = points.First().X; var maxX = points.Last().X; points.Sort((x, y) => x.Y.CompareTo(y.Y)); var maxY = points.Last().Y; return(TryCreateBound( new XYZ(minX, maxY + offset, cutPlanZ), new XYZ(maxX, maxY + offset, cutPlanZ))); } case ExtremeWallVariant.Bottom: { points.Sort((x, y) => x.X.CompareTo(y.X)); var minX = points.First().X; var maxX = points.Last().X; points.Sort((x, y) => x.Y.CompareTo(y.Y)); var minY = points.First().Y; return(TryCreateBound( new XYZ(minX, minY - offset, cutPlanZ), new XYZ(maxX, minY - offset, cutPlanZ))); } } return(null); }