EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 2168|回复: 53
打印 上一主题 下一主题

Parameter of Revit API – 50: Parameter Converter – Parameter to SharedParamete

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12406

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-9 11:43:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
We talked about programmatically converting parameters from one to another manually before. Now let’s see how Parameter Converter of RevitAddinWizard can assist us to hit the target with just a few mouse clicks. The Parameter Converter can be found from either Revit Addin Coder sub-menu under the Tools or from Revit Addin Coder toolbar.

When the menu item or the tool button is clicked, the Parameter Converter window will show up:


If the Parameter (to SharedParameter) Converter is selected from the check list box and a class is chosen from the combo box, a Parameter to SharedParameter Converter will be created and added into the class automatically. The entire converter code and necessary namespaces and class declarations have been appended below:
  1. <div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; "></div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">
  2. #region Namespaces</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">using System;
  3. using System.Text;
  4. using System.Linq;
  5. using System.Xml;
  6. using System.Reflection;
  7. using System.ComponentModel;
  8. using System.Collections;
  9. using System.Collections.Generic;
  10. using System.Windows;
  11. using System.Windows.Media.Imaging;
  12. using System.Windows.Forms;
  13. using System.IO;</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">using Autodesk.Revit.ApplicationServices;
  14. using Autodesk.Revit.Attributes;</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">using Autodesk.Revit.DB;
  15. using Autodesk.Revit.DB.Events;
  16. using Autodesk.Revit.DB.Architecture;
  17. using Autodesk.Revit.DB.Structure;
  18. using Autodesk.Revit.DB.Mechanical;
  19. using Autodesk.Revit.DB.Electrical;
  20. using Autodesk.Revit.DB.Plumbing;</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">using Autodesk.Revit.UI;
  21. using Autodesk.Revit.UI.Selection;
  22. using Autodesk.Revit.UI.Events;</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">using Autodesk.Revit.Collections;
  23. using Autodesk.Revit.Exceptions;
  24. using Autodesk.Revit.Utility;</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">using RvtApplication = Autodesk.Revit.ApplicationServices.Application;
  25. using RvtDocument = Autodesk.Revit.DB.Document;</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">#endregion</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">
  26. namespace RevitAddinCS1
  27. {
  28.     class ParameterConverter
  29.     {
  30.         public class RawParameterInfo
  31.         {
  32.             public  string Name { get; set; }
  33.             public  string ID { get; set; }
  34.             public  string Value { get; set; }
  35.             public  BuiltInParameterGroup Group { get; set; }
  36.             public  ParameterType Type { get; set; }
  37.             public  StorageType Storage { get; set; }
  38.             public  string Unit { get; set; }
  39.             public  bool Shared { get; set; }
  40.             public  bool ReadOnly { get; set; }
  41.         }</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">        public static string RawGetDUTString(Parameter p)
  42.         {
  43.             string unitType = string.Empty;
  44.             try { unitType = p.DisplayUnitType.ToString(); }
  45.             catch { }
  46.             
  47.             return unitType;
  48.         }</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">        public static List<RawParameterInfo> RawGetParametersInfo(Element e)
  49.         {
  50.             List<RawParameterInfo> paramList =
  51.                 (from Parameter p in e.Parameters
  52.                  select new RawParameterInfo
  53.                  {
  54.                     Name = p.Definition.Name,
  55.                     ID = p.IsShared ? p.GUID.ToString() : (p.Definition as InternalDefinition).BuiltInParameter.ToString(),
  56.                     Value = p.AsValueString(),
  57.                     Group = p.Definition.ParameterGroup,
  58.                     Type = p.Definition.ParameterType,
  59.                     Storage = p.StorageType,
  60.                     Unit = RawGetDUTString(p),
  61.                     Shared = p.IsShared,
  62.                     ReadOnly = p.IsReadOnly,
  63.             
  64.                  }).ToList();
  65.             return paramList;
  66.         }
  67.         
  68.         public static string RawParametersInfoToCSVString<T>(List<T> infoList, ref string title)
  69.         {
  70.             StringBuilder sb = new StringBuilder();
  71.             PropertyInfo[] propInfoArrary = typeof(T).GetProperties();
  72.             foreach (PropertyInfo pi in propInfoArrary)
  73.             {
  74.                 title += pi.Name + ",";
  75.             }
  76.             title = title.Remove(title.Length - 1);
  77.         
  78.             foreach (T info in infoList)
  79.             {
  80.                 foreach (PropertyInfo pi in propInfoArrary)
  81.                 {
  82.                     object obj = info.GetType().InvokeMember(pi.Name, BindingFlags.GetProperty, null, info, null);
  83.                     IList list = obj as IList;
  84.                     if (list != null)
  85.                     {
  86.                         string str = string.Empty;
  87.                         foreach (object e in list)
  88.                         {
  89.                             str += e.ToString() + ";";
  90.                         }
  91.                         str = str.Remove(str.Length - 1);
  92.         
  93.                         sb.Append(str + ",");
  94.                     }
  95.                     else
  96.                     {
  97.                         sb.Append((obj == null ? string.Empty : obj.ToString()) + ",");
  98.                     }
  99.                 }
  100.                 sb.Remove(sb.Length - 1, 1).Append(Environment.NewLine);
  101.             }
  102.         
  103.             return sb.ToString();
  104.         }
  105.         
  106.         
  107.         public static List<T> RawConvertSetToList<T>(IEnumerable set)
  108.         {
  109.             List<T> list = (from T p in set select p).ToList<T>();
  110.             return list;
  111.         }
  112.         
  113.         
  114.         public static Definition RawCreateSharedParameter(RvtApplication app, string name, string group, ParameterType type, bool visible)
  115.         {
  116.             DefinitionFile defFile = app.OpenSharedParameterFile();
  117.             if (defFile == null) throw new Exception("No SharedParameter File!");
  118.         
  119.             DefinitionGroup dg = RawConvertSetToList<DefinitionGroup>(defFile.Groups).FirstOrDefault(g => g.Name == group);
  120.             if (dg == null) dg = defFile.Groups.Create(group);
  121.         
  122.             Definition def = RawConvertSetToList<Definition>(dg.Definitions).FirstOrDefault(d => d.Name == name);
  123.             if (def != null) return def; //dg.Definitions.Erase(def);   //ReadOnly Exception!!
  124.             def = dg.Definitions.Create(name, type, visible);
  125.             
  126.             return def;
  127.         }
  128.         
  129.         public static void ConvertParameterToSharedParameter(Element e, string name, bool convertSharedOnly, bool visibilityOverride)
  130.         {
  131.             List<RawParameterInfo> pList = RawGetParametersInfo(e);
  132.             List<RawParameterInfo> pListOfInterest = pList.FindAll(p => p.Name == name);
  133.             foreach (RawParameterInfo info in pListOfInterest)
  134.             {
  135.                 if (info.Type == ParameterType.Invalid)
  136.                 {
  137.                     info.Type = ParameterType.Text; //It's weird that a valid Parameter can have an invalid ParameterType! We set it as the most popular Text type in this case. Otherwise, the DefinitionGroup.Definitions.Create() would fail!
  138.                 }
  139.                
  140.                 if (convertSharedOnly)
  141.                 {
  142.                     if (info.Shared)
  143.                     {
  144.                         RawCreateSharedParameter(e.Document.Application, name, "For_" + e.Category.Name, info.Type, visibilityOverride);
  145.                     }
  146.                 }
  147.                 else
  148.                 {
  149.                     RawCreateSharedParameter(e.Document.Application, name, "For_" + e.Category.Name, info.Type, visibilityOverride);
  150.                 }
  151.             }
  152.         }
  153.         
  154.         public static void ConvertAllParametersToSharedParameters(Element e, bool convertSharedOnly, bool visibilityOverride)
  155.         {
  156.             List<RawParameterInfo> pList = RawGetParametersInfo(e);
  157.             
  158.             foreach (RawParameterInfo info in pList)
  159.             {
  160.                 if (info.Type == ParameterType.Invalid)
  161.                 {
  162.                     info.Type = ParameterType.Text;
  163.                 }
  164.         
  165.                 if (convertSharedOnly)
  166.                 {
  167.                     if (info.Shared)
  168.                     {
  169.                         RawCreateSharedParameter(e.Document.Application, info.Name, "For_" + e.Category.Name, info.Type, visibilityOverride);
  170.                     }
  171.                 }
  172.                 else
  173.                 {
  174.                     RawCreateSharedParameter(e.Document.Application, info.Name, "For_" + e.Category.Name, info.Type, visibilityOverride);
  175.                 }
  176.             }
  177.         }
  178.     }
  179. }</div>
复制代码
We would not create test command to extercise these parameter converter code here. In case needed, please refer to earlier posts for ideas and code examples.

As mentioned, Parameter Converter of RevitAddinCodercan create all these code automatically in a second.

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言

22

主题

983

帖子

4033

积分

BIM总监

Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

积分
4033
推荐
发表于 2014-2-25 10:33:40 | 只看该作者
路过!!! 不发表意见……

2

主题

897

帖子

1365

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1365
推荐
发表于 2014-6-12 09:42:40 | 只看该作者
路过!!! 不发表意见……

18

主题

702

帖子

1270

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1270
推荐
发表于 2014-6-12 09:38:04 | 只看该作者
路过!!! 不发表意见……

8

主题

902

帖子

1597

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1597
6F
发表于 2014-2-25 10:28:55 | 只看该作者
(*^__^*) 嘻嘻……

6

主题

870

帖子

1737

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1737
17F
发表于 2014-3-10 17:20:37 | 只看该作者
谢谢BIM大神…
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-27 05:31

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表