当前位置: 首页 > news >正文

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

相关文章:

  • 当mybatisPlus与tk.mybatis遇到更新
  • sp.coo_matrix(), sp.eye()
  • linux虚拟机未建分区的情况下对磁盘进行扩容
  • 猿创征文|【数据结构】牛客网刷题
  • 【函数式编程】Java函数式编程学习
  • 基于springboot,vue旅游信息推荐系统
  • SSLError(MaxRetryError(‘HTTPSConnectionPool(host=\‘repo.anaconda.com\‘, port
  • vs生成dll且被java通过jna调用
  • DDD - 六边形架构和CQRS架构
  • 宠物寄养小程序实战教程02
  • 【计算机网络】运输层习题(谢希仁)(1)
  • 微信小程序抓包-夜神模拟器结合BurpSuite抓包(可用于现在最新版本微信)
  • SAR/毫米波雷达 论文阅读 | Freehand, Agile, and High-Resolution Imaging, IEEE Access 2019
  • 神经网络一词在英文中是,网络词神经质什么意思
  • KOOM原理讲解(上)-JAVA内存分析
  • 「译」Node.js Streams 基础
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript设计模式系列一:工厂模式
  • MySQL的数据类型
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • python_bomb----数据类型总结
  • Redis字符串类型内部编码剖析
  • ucore操作系统实验笔记 - 重新理解中断
  • 机器学习中为什么要做归一化normalization
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 记录一下第一次使用npm
  • 讲清楚之javascript作用域
  • 异步
  • 正则表达式
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • (3)nginx 配置(nginx.conf)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (转)3D模板阴影原理
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .net6 webapi log4net完整配置使用流程
  • .NET开源项目介绍及资源推荐:数据持久层
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • ::前边啥也没有
  • @Bean注解详解
  • @拔赤:Web前端开发十日谈
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [.net] 如何在mail的加入正文显示图片
  • [20171106]配置客户端连接注意.txt
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • [C]整形提升(转载)
  • [CISCN2019 华北赛区 Day1 Web2]ikun