Example #1
0
        /// <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();
            }
        }
Example #3
0
        /// <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);
        }