среда, 25 ноября 2015 г.

[Revit API] - Граница подрезки вида

В примере справки показано создание области подрезки вида по помещению.

Опишу принцип работы на примере построения прямоугольной границы подрезки вида:


        public void SquareViewCropRegion()
        {
            _currentView = ActiveGraphicalView;
            
            try
            {
                using (var tr = new Transaction(Document))
                {
                    tr.Start("Изменение границы подрезки вида");
                    
                    ActivateCropBox();
                    if (!CanCropView())
                        return;
                    
                    ChangeViewCropRegion();
                    
                    tr.Commit();
                }
            }
            catch (Exception ex)
            {
                TaskDialog.Show("ChangeViewCropRegion",ex.ToString());
            }
        }
 
        private void ChangeViewCropRegion()
        {
            var ptMin = new UV(-50,-50);
            var ptMax = new UV(50,50);
            
            // Получение объекта для управления границами подрезки
            var manager = _currentView.GetCropRegionShapeManager();

            // Создание списка точек для построения контура
            var points = new List<XYZ>
            {
                ConvertUV2XYZ(ptMin),
                ConvertUV2XYZ(new UV(ptMax.U,ptMin.V)),
                ConvertUV2XYZ(ptMax),
                ConvertUV2XYZ(new UV(ptMin.U,ptMax.V)),
                ConvertUV2XYZ(ptMin)
            };

            // Создание объекта цепочки кривых
            var loop = new CurveLoop();

            // Добавление отрезков в цепочку кривых
            for (var i = 1; i < points.Count; i++)
                loop.Append(Line.CreateBound(points[i - 1], points[i]));
            
            // Назначение границ подрезки
            manager.SetCropShape(loop);
        }
 
        private void ActivateCropBox()
        {
            if (!_currentView.CropBoxActive)
                _currentView.CropBoxActive = true;

            if (!_currentView.CropBoxVisible)
                _currentView.CropBoxVisible = true;
        } 
 
        // Проверка на возможность произвольной подрезки вида
        private bool CanCropView()
        {
            if (!_currentView.GetCropRegionShapeManager().CanHaveShape)
            {
                TaskDialog.Show("ChangeViewCropRegion""Текущий вид не предназначен для произвольной подрезки");
                return false;
            }
            
            return true;
        }


 Небольшой метод для перевода координат из локальной системы в систему модели:

        private XYZ ConvertUV2XYZ(UV pt)
        {
            return _currentView.Origin + _currentView.UpDirection*pt.V + _currentView.RightDirection*pt.U;
        }

Минимальный тестовый пример можно скачать тут.
Запуск макроса выполняется из диспетчера макросов.

Удачи!

Комментариев нет:

Отправить комментарий