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

萧闫子 发表于 2014-1-9 11:43:18

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

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:
http://spiderinnet.typepad.com/.a/6a013489b64e31970c014e88d4589f970d-800wi

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:<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; ">
#region Namespaces</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">using System;
using System.Text;
using System.Linq;
using System.Xml;
using System.Reflection;
using System.ComponentModel;
using System.Collections;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Forms;
using System.IO;</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.UI.Events;</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">using Autodesk.Revit.Collections;
using Autodesk.Revit.Exceptions;
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;
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; ">
namespace RevitAddinCS1
{
    class ParameterConverter
    {
      public class RawParameterInfo
      {
            publicstring Name { get; set; }
            publicstring ID { get; set; }
            publicstring Value { get; set; }
            publicBuiltInParameterGroup Group { get; set; }
            publicParameterType Type { get; set; }
            publicStorageType Storage { get; set; }
            publicstring Unit { get; set; }
            publicbool Shared { get; set; }
            publicbool ReadOnly { get; set; }
      }</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">      public static string RawGetDUTString(Parameter p)
      {
            string unitType = string.Empty;
            try { unitType = p.DisplayUnitType.ToString(); }
            catch { }
            
            return unitType;
      }</div><div align="left" style="color: rgb(105, 105, 105); font-family: 'Microsoft Yahei', Simsun; ">      public static List<RawParameterInfo> RawGetParametersInfo(Element e)
      {
            List<RawParameterInfo> paramList =
                (from Parameter p in e.Parameters
               select new RawParameterInfo
               {
                  Name = p.Definition.Name,
                  ID = p.IsShared ? p.GUID.ToString() : (p.Definition as InternalDefinition).BuiltInParameter.ToString(),
                  Value = p.AsValueString(),
                  Group = p.Definition.ParameterGroup,
                  Type = p.Definition.ParameterType,
                  Storage = p.StorageType,
                  Unit = RawGetDUTString(p),
                  Shared = p.IsShared,
                  ReadOnly = p.IsReadOnly,
            
               }).ToList();
            return paramList;
      }
      
      public static string RawParametersInfoToCSVString<T>(List<T> infoList, ref string title)
      {
            StringBuilder sb = new StringBuilder();
            PropertyInfo[] propInfoArrary = typeof(T).GetProperties();
            foreach (PropertyInfo pi in propInfoArrary)
            {
                title += pi.Name + ",";
            }
            title = title.Remove(title.Length - 1);
      
            foreach (T info in infoList)
            {
                foreach (PropertyInfo pi in propInfoArrary)
                {
                  object obj = info.GetType().InvokeMember(pi.Name, BindingFlags.GetProperty, null, info, null);
                  IList list = obj as IList;
                  if (list != null)
                  {
                        string str = string.Empty;
                        foreach (object e in list)
                        {
                            str += e.ToString() + ";";
                        }
                        str = str.Remove(str.Length - 1);
      
                        sb.Append(str + ",");
                  }
                  else
                  {
                        sb.Append((obj == null ? string.Empty : obj.ToString()) + ",");
                  }
                }
                sb.Remove(sb.Length - 1, 1).Append(Environment.NewLine);
            }
      
            return sb.ToString();
      }
      
      
      public static List<T> RawConvertSetToList<T>(IEnumerable set)
      {
            List<T> list = (from T p in set select p).ToList<T>();
            return list;
      }
      
      
      public static Definition RawCreateSharedParameter(RvtApplication app, string name, string group, ParameterType type, bool visible)
      {
            DefinitionFile defFile = app.OpenSharedParameterFile();
            if (defFile == null) throw new Exception("No SharedParameter File!");
      
            DefinitionGroup dg = RawConvertSetToList<DefinitionGroup>(defFile.Groups).FirstOrDefault(g => g.Name == group);
            if (dg == null) dg = defFile.Groups.Create(group);
      
            Definition def = RawConvertSetToList<Definition>(dg.Definitions).FirstOrDefault(d => d.Name == name);
            if (def != null) return def; //dg.Definitions.Erase(def);   //ReadOnly Exception!!
            def = dg.Definitions.Create(name, type, visible);
            
            return def;
      }
      
      public static void ConvertParameterToSharedParameter(Element e, string name, bool convertSharedOnly, bool visibilityOverride)
      {
            List<RawParameterInfo> pList = RawGetParametersInfo(e);
            List<RawParameterInfo> pListOfInterest = pList.FindAll(p => p.Name == name);
            foreach (RawParameterInfo info in pListOfInterest)
            {
                if (info.Type == ParameterType.Invalid)
                {
                  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!
                }
               
                if (convertSharedOnly)
                {
                  if (info.Shared)
                  {
                        RawCreateSharedParameter(e.Document.Application, name, "For_" + e.Category.Name, info.Type, visibilityOverride);
                  }
                }
                else
                {
                  RawCreateSharedParameter(e.Document.Application, name, "For_" + e.Category.Name, info.Type, visibilityOverride);
                }
            }
      }
      
      public static void ConvertAllParametersToSharedParameters(Element e, bool convertSharedOnly, bool visibilityOverride)
      {
            List<RawParameterInfo> pList = RawGetParametersInfo(e);
            
            foreach (RawParameterInfo info in pList)
            {
                if (info.Type == ParameterType.Invalid)
                {
                  info.Type = ParameterType.Text;
                }
      
                if (convertSharedOnly)
                {
                  if (info.Shared)
                  {
                        RawCreateSharedParameter(e.Document.Application, info.Name, "For_" + e.Category.Name, info.Type, visibilityOverride);
                  }
                }
                else
                {
                  RawCreateSharedParameter(e.Document.Application, info.Name, "For_" + e.Category.Name, info.Type, visibilityOverride);
                }
            }
      }
    }
}</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.

ben7 发表于 2014-2-25 10:33:40

路过!!!
不发表意见……

江枫 发表于 2014-6-12 09:42:40

路过!!!
不发表意见……



卡巴kala 发表于 2014-6-12 09:38:04

路过!!!
不发表意见……


黑超BB 发表于 2014-2-20 15:11:37

路过!!!
帮顶……


熊猫 发表于 2014-2-25 10:28:55

(*^__^*) 嘻嘻……

波罗友 发表于 2014-3-4 13:59:57

顶!!!!!!!!!!

爬爬``PA 发表于 2014-3-10 10:47:20

顶起来…………

宇航员 发表于 2014-3-10 16:20:26

顶!!!!!!!!!!!!

猫猫girl 发表于 2014-3-10 16:23:17

顶!!!!!!!!!!!!

OK佬 发表于 2014-3-10 16:32:37

谢谢老师…



悠悠筱荷 发表于 2014-3-10 16:33:57

谢谢老师…

教父 发表于 2014-3-10 16:48:37

顶!!!!!!!!!!

鹦鹉仔 发表于 2014-3-10 16:49:57

顶起来…………

筱雅 发表于 2014-3-10 16:55:17

顶!!!!!!!!!!!!

猫猫girl 发表于 2014-3-10 17:15:17

谢谢老师…

雁田佬 发表于 2014-3-10 17:20:37

谢谢BIM大神…
页: [1] 2 3 4 5
查看完整版本: Parameter of Revit API – 50: Parameter Converter – Parameter to SharedParamete