• Revit SDK:CreateFillPattern 创建填充样式


    前言

    这个例子介绍的是如何创建填充样式。关于填充样式,在先前的博客已经做了详细记录:Revit API: 填充样式 - FillPatternElement、FillPattern、FillGrid

    内容

    在这里插入图片描述

    1 - 填充样式的初始化

    这里有两种填充:LinePatternElementFillPatternElement。代码主体逻辑,遍历获取这两种填充,然后用 WPF 显示。

    private void IniTreeView()
    {
       this.treeViewLinePattern.Nodes.Clear();
       TreeNode iniNode2 = new TreeNode("LinePatterns");
       treeViewLinePattern.Nodes.Add(iniNode2);
    
       List<LinePatternElement> lstLinePatterns = GetAllElements<LinePatternElement>();
       for (int i = 0; i < lstLinePatterns.Count; i++)
       {
          TreeNode node = new TreeNode(lstLinePatterns[i].Name);
          node.Name = lstLinePatterns[i].Id.IntegerValue.ToString();
          iniNode2.Nodes.Add(node);
       }
    
       this.treeViewFillPattern.Nodes.Clear();
       TreeNode iniNode1 = new TreeNode("FillPatterns");
       treeViewFillPattern.Nodes.Add(iniNode1);
    
       List<FillPatternElement> lstFillPatterns = GetAllElements<FillPatternElement>();
       for (int i = 0; i < lstFillPatterns.Count; i++)
       {
          TreeNode node = new TreeNode(lstFillPatterns[i].Name);
          node.Name = i.ToString();
          iniNode1.Nodes.Add(node);
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    2 - Apply To Surface

    核心逻辑:

    1. 找到选中的墙 Wall
    2. 找到墙的材质 Material
    3. 设置墙材质的前景填充样式 SurfaceForegroundPatternId
    Wall targetWall = GetSelectedWall();
    List<FillPatternElement> lstPatterns = GetAllElements<FillPatternElement>();
    int patternIndex = int.Parse(treeViewFillPattern.SelectedNode.Name);
    Material targetMaterial = doc.GetElement(targetWall.GetMaterialIds(false).First<ElementId>()) as Material;
    Transaction trans = new Transaction(doc);
    trans.Start("Apply fillpattern to surface");
    targetMaterial.SurfaceForegroundPatternId = lstPatterns[patternIndex].Id;
    trans.Commit();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3 - Apply To Cut Surface

    逻辑和 2 - Apply To Surface 类似,唯一差别是设置的是材质的剖切表面CutForegroundPatternId

    Wall targetWall = GetSelectedWall();
    List<FillPatternElement> lstPatterns = GetAllElements<FillPatternElement>();
    int patternIndex = int.Parse(treeViewFillPattern.SelectedNode.Name);
    Material targetMaterial = doc.GetElement(targetWall.GetMaterialIds(false).First<ElementId>()) as Material;
    Transaction trans = new Transaction(doc);
    trans.Start("Apply fillpattern to cutting surface");
    targetMaterial.CutForegroundPatternId = lstPatterns[patternIndex].Id;
    trans.Commit();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4 - Create Fill Pattern

    关键逻辑:

    1. 通过 FillPatternElement.GetFillPatternElementByName 获取已有填充样式
    2. new FillPattern 并用 FillPatternElement.Create 创建填充样式
    private FillPatternElement GetOrCreateFacePattern(string patternName)
    {
       FillPatternTarget target = FillPatternTarget.Model;
       FillPatternElement fillPatternElement = FillPatternElement.GetFillPatternElementByName(doc, target, patternName);
    
       if (fillPatternElement == null)
       {
          //Create a fillpattern with specified angle and spacing
          FillPattern fillPattern = new FillPattern(patternName, target,
          FillPatternHostOrientation.ToView, 0.5, 0.5, 0.5);
    
          Transaction trans = new Transaction(doc);
          trans.Start("Create a fillpattern element");
          fillPatternElement = FillPatternElement.Create(doc, fillPattern);
          trans.Commit();
       }
       return fillPatternElement;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    创建填充样式按钮的逻辑:

    1. 找到选中的墙 Wall
    2. 找到墙的材质 Material
    3. 设置墙材质的前景填充样式 SurfaceForegroundPatternId
    Wall targetWall = GetSelectedWall();
    FillPatternElement mySurfacePattern = GetOrCreateFacePattern("MySurfacePattern");
    Material targetMaterial = doc.GetElement(targetWall.GetMaterialIds(false).First<ElementId>()) as Material;
    Transaction trans = new Transaction(doc);
    trans.Start("Apply fillpattern to surface");
    targetMaterial.SurfaceForegroundPatternId = mySurfacePattern.Id;
    trans.Commit();
    this.Close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5 - Create Line Pattern

    创建 Line Pattern:
    LinePatternSegment => LinePattern => LinePatternElement

    private LinePatternElement CreateLinePatternElement(string patternName)
    {
       //Create list of segments which define the line pattern
       List<LinePatternSegment> lstSegments = new List<LinePatternSegment>();
       lstSegments.Add(new LinePatternSegment(LinePatternSegmentType.Dot, 0.0));
       lstSegments.Add(new LinePatternSegment(LinePatternSegmentType.Space, 0.02));
       lstSegments.Add(new LinePatternSegment(LinePatternSegmentType.Dash, 0.03));
       lstSegments.Add(new LinePatternSegment(LinePatternSegmentType.Space, 0.02));
       LinePattern linePattern = new LinePattern(patternName);
       linePattern.SetSegments(lstSegments);
    
       Transaction trans = new Transaction(doc);
       trans.Start("Create a linepattern element");
       LinePatternElement linePatternElement = LinePatternElement.Create(doc, linePattern);
       trans.Commit();
       return linePatternElement;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    创建线形填充的逻辑:

    1. 获取选中的轴网 Grid 的类型
    2. 创建线形填充 CreateLinePatternElement
    3. 设置轴网类型的参数 “End Segment Pattern”
    private void buttonCreateLinePattern_Click(object sender, EventArgs e)
    {
       List<ElementId> lstGridTypeIds = new List<ElementId>();
       GetSelectedGridTypeIds(lstGridTypeIds);
       LinePatternElement myLinePatternElement = CreateLinePatternElement("MyLinePattern");
       foreach (ElementId typeId in lstGridTypeIds)
       {
          Element gridType = doc.GetElement(typeId);
          //set the parameter value of End Segment Pattern
          SetParameter("End Segment Pattern", myLinePatternElement.Id, gridType);
       }
       this.Close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6 - Create Complex Fill Pattern

    创建复杂填充样式,和 4 - Create Fill Pattern 的唯一区别 SetFillGrids

    FillPattern fillPattern = new FillPattern(patternName, target, FillPatternHostOrientation.ToHost);
    // 增加分隔线
    List<FillGrid> grids = new List<FillGrid>();
    // 水平分隔线  
    grids.Add(CreateGrid(new UV(0, 0.1), 0.5, 0, 0.55, 1.0, 0.1));
    grids.Add(CreateGrid(new UV(0, 0.5), 0.5, 0, 0.55, 1.0, 0.1));
    // 垂直分隔线  
    grids.Add(CreateGrid(new UV(0, 0.1), 0.55, Math.PI / 2, 0.5, 0.4, 0.6));
    grids.Add(CreateGrid(new UV(1.0, 0.1), 0.55, Math.PI / 2, 0.5, 0.4, 0.6));
    fillPattern.SetFillGrids(grids);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    C#:实现蚁群优化算法(附完整源码)
    Django使用jinja2时出现的问题
    【TypeScript】类、类的属性及抽象类(七)
    GBase 8a MPP集群管理之虚拟集群镜像表
    python 异常
    SAP MTS/ATO/MTO/ETO专题之七:ATO模式1 M+M模式策略用82(6892)
    使用 TensorFlow 创建 DenseNet 121
    Unity实战之一个脚本实现雷达图
    openai的跨域转发教程
    太牛啦!Python入门到精通 只用了3个多月
  • 原文地址:https://blog.csdn.net/weixin_44153630/article/details/126690353