[Desenvolvimento secundário do Revit] Crie uma seção e mude a vista para a seção

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.

Espero que o conteúdo acima seja útil para você, obrigado pela atenção!

Supongo que te gusta

Origin blog.csdn.net/weixin_44631419/article/details/108319057
Recomendado
Clasificación