Revit SDK:CreateFillPattern 创建填充样式
前言
这个例子介绍的是如何创建填充样式。关于填充样式,在先前的博客已经做了详细记录:Revit API: 填充样式 - FillPatternElement、FillPattern、FillGrid
内容
1 - 填充样式的初始化
这里有两种填充:LinePatternElement
和 FillPatternElement
。代码主体逻辑,遍历获取这两种填充,然后用 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
核心逻辑:
- 找到选中的墙
Wall
- 找到墙的材质
Material
- 设置墙材质的前景填充样式
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
关键逻辑:
- 通过
FillPatternElement.GetFillPatternElementByName
获取已有填充样式 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;
}
创建填充样式按钮的逻辑:
- 找到选中的墙
Wall
- 找到墙的材质
Material
- 设置墙材质的前景填充样式
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;
}
创建线形填充的逻辑:
- 获取选中的轴网
Grid
的类型 - 创建线形填充
CreateLinePatternElement
- 设置轴网类型的参数 “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);