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);
   }
}

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();

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();

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. 找到选中的墙 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();

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. 获取选中的轴网 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();
}

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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客BIM工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值