Prefácio
As seções precisam ser usadas durante o processo de modelagem do Revit e desenhos posteriores, mas toda vez que criamos uma seção manualmente e depois ajustamos a vista da seção, será muito problemático e a carga de trabalho será muito grande.
Se usarmos o RevitAPI, podemos conseguir uma função de geração automática de seções selecionando componentes apenas com código simples.
Demonstração
A seguir demonstramos como selecionar componentes no Revit e gerar uma vista de seção do componente usando código e, finalmente, definir a vista de exibição atual para a vista de seção recém-gerada.
namespace LjsGo.Example
{
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class CreateSection : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
var uiDoc = commandData.Application.ActiveUIDocument;
var doc = commandData.Application.ActiveUIDocument.Document;
var elem = commandData.Application.ActiveUIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Face);
var instance = commandData.Application.ActiveUIDocument.Document.GetElement(elem) as FamilyInstance;
var face = instance.GetGeometryObjectFromReference(elem) as Face;
// 过滤视图类型
var viewFamilyTypes = new FilteredElementCollector(doc).OfClass(typeof(ViewFamilyType)).Cast<ViewFamilyType>().ToList();
var viewFamilyType = viewFamilyTypes.FirstOrDefault(o => o.ViewFamily == ViewFamily.Section);
if (viewFamilyType == null)
{
return Result.Failed;
}
Transaction transaction = new Transaction(doc, "Create Section");
transaction.Start();
// 创建剖面
UV uvmax = face.GetBoundingBox().Max;
UV uvmin = face.GetBoundingBox().Min;
double width = uvmax.U - uvmin.U + 200 / 304.8;
double height = uvmax.V - uvmin.V + 200 / 304.8;
//生成剖面
XYZ face_Y = face.ComputeDerivatives(new UV(0, 0)).BasisY;
XYZ face_Z = -face.ComputeNormal(new UV(0, 0));
XYZ face_X = -face_Z.CrossProduct(face_Y);
XYZ center = face.Evaluate((uvmax + uvmin) / 2);
Transform tf = null;
tf = Transform.Identity;
tf.Origin = center;
tf.BasisX = face_X;
tf.BasisY = face_Y;
tf.BasisZ = face_Z;
BoundingBoxXYZ box = new BoundingBoxXYZ();
box.Transform = tf;
box.Min = new XYZ(-width / 2, -height / 2, 0);
box.Max = new XYZ(width / 2, height / 2, 500 / 304.8);
var viewSection = ViewSection.CreateSection(doc, viewFamilyType.Id, box);
viewSection.get_Parameter(BuiltInParameter.SECTION_COARSER_SCALE_PULLDOWN_IMPERIAL).Set(1000);
viewSection.CropBoxActive = true;
viewSection.DisplayStyle = DisplayStyle.ShadingWithEdges;
viewSection.DetailLevel = ViewDetailLevel.Fine;
viewSection.IsolateElementTemporary(instance.Id);
transaction.Commit();
// 跳转到改视图
uiDoc.ActiveView = viewSection;
return Result.Succeeded;
}
}
}
Resumir
- A vista de seção pode ser criada diretamente por meio do código acima.
- Nota: A direção de geração da seção está relacionada à Transformação em BoundingBoxXYZ.