В примере справки показано создание области подрезки вида по помещению.
Опишу принцип работы на примере построения прямоугольной границы подрезки вида:
Опишу принцип работы на примере построения прямоугольной границы подрезки вида:
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());
}
}
{
_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);
}
{
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;
}
{
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;
}
{
if (!_currentView.GetCropRegionShapeManager().CanHaveShape)
{
TaskDialog.Show("ChangeViewCropRegion", "Текущий вид не предназначен для произвольной подрезки");
return false;
}
return true;
}
{
return _currentView.Origin + _currentView.UpDirection*pt.V + _currentView.RightDirection*pt.U;
}
Минимальный тестовый пример можно скачать тут.
Запуск макроса выполняется из диспетчера макросов.
Удачи!
Комментариев нет:
Отправить комментарий