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

这里有两种填充: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);
}
}
核心逻辑:
WallMaterialSurfaceForegroundPatternIdWall 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();
逻辑和 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();
关键逻辑:
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;
}
创建填充样式按钮的逻辑:
WallMaterialSurfaceForegroundPatternIdWall 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();
创建 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 的类型CreateLinePatternElementprivate 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();
}
创建复杂填充样式,和 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);