Chào mừng đến với blog của mình 🥰
Crop View là gì?
Crop View giới hạn những gì một view hiển thị: chỉ các đối tượng nằm trong vùng được khoanh mới được vẽ ra, phần ngoài bị cắt bỏ.
Bật Crop View trong Revit thế nào?
Bật hai thuộc tính trong bảng Properties, hoặc dùng icon như hình dưới.

Vậy làm sao crop nhiều view bằng RevitAPI?
Trong RevitAPI, Crop View được định nghĩa bởi thuộc tính CropBox, và nó nhận
vào một BoundingBoxXYZ.
Bắt đầu thôi 🚀🚀🚀
Bước 1
Vùng crop được xác định bởi hai điểm — trong view hiện hành là góc trên bên phải
và góc dưới bên trái. Phương thức PickBox trả về cả hai chỉ trong một lần gọi:
// Chọn vùng bằng cách kéo một hình chữ nhật
PickedBox pickedBox = uidocument.Selection.PickBox(PickBoxStyle.Directional, "Draw Rectangular Box, Press ESC to exit");
XYZ pointBottomLeft = pickedBox.Min;
XYZ pointTopRight = pickedBox.Max;
Bước 2
View hiện hành có Transform riêng của nó. Hai điểm vừa lấy đang ở toạ độ model,
nên phải đưa chúng về hệ toạ độ của view thì CropBox mới đặt đúng chỗ.
// Lấy transform nghịch đảo của view hiện hành
Transform transform = view.get_BoundingBox(null).Transform.Inverse;
// Đưa hai điểm về hệ toạ độ của view
pointBottomLeft = transform.OfPoint(pointBottomLeft);
pointTopRight = transform.OfPoint(pointTopRight);
// Xác định đúng giá trị min và max
double minX = Math.Min(pBox.Min.X, pBox.Max.X);
double maxX = Math.Max(pBox.Min.X, pBox.Max.X);
double minY = Math.Min(pBox.Min.Y, pBox.Max.Y);
double maxY = Math.Max(pBox.Min.Y, pBox.Max.Y);
Bỏ qua bước này thì vùng crop vẫn ra một kết quả trông có vẻ hợp lý nhưng sai vị trí — và kiểu sai đó khó phát hiện hơn là sai hẳn.
Bước 3
Tạo BoundingBoxXYZ mới rồi gán cho CropBox.
// Tạo instance boundingBox mới
BoundingBoxXYZ boundingBoxXYZ = new BoundingBoxXYZ();
boundingBoxXYZ.Min = new XYZ(minX, minX, 0);
boundingBoxXYZ.Max = new XYZ(maxX, maxY, 0);
boundingBoxXYZ.Transform = view.CropBox.Transform;
// Bật Crop View và áp boundingBox mới vào CropBox
view.CropBoxActive = true;
view.CropBoxVisible = true;
view.CropBox = boundingBoxXYZ;
doc.Regenerate();
Bước 4
Bọc lại trong một while-loop để crop được nhiều view liên tiếp mà không phải
chạy lại lệnh. Nhớ dùng Transaction, không có nó thì không có gì được ghi vào
model.
PickedBox pickedBox = null;
while (true)
{
try
{
pickedBox = uiDocument.Selection.PickBox(PickBoxStyle.Directional, "Draw Rectangular, Press ESC to exit");
}
catch
{
break;
}
if (pickedBox != null)
{
using (Transaction transaction = new Transaction(document))
{
transaction.Start("Crop view by selection");
// khối lệnh xử lý
transaction.Commit();
}
}
}
Vài điểm đáng nhớ
CropBoxActivephải bằngtruethìCropBoxmới có tác dụng nhìn thấy được.CropBoxVisiblequyết định đường bao có được in ra hay không.- Mọi thay đổi phải nằm trong
Transaction, nếu không sẽ không commit.
Kết
Vậy là xong 🎯 — một công cụ nhỏ giúp tạo Crop View nhanh hơn nhiều so với làm tay.
Tham khảo
Toàn bộ source code và vài công cụ khác nằm ở RevitAPI-Learning