123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- using System;
- using System.Collections.Generic;
- using System.IO;
- using Autodesk.Revit.DB;
- using Autodesk.Revit.UI;
- using SAGA.DotNetUtils;
- namespace SAGA.RevitUtils.Extends
- {
- public static class SharedParameterExtend
- {
- //默认共享参数文件名称
- private const string Sharedfile = "SAGASharedParameters.txt";
- //默认共享参数创建分组
- private const string Sharedgroup = "SAGAParameters";
- /// <summary>
- /// 获取共享参数文件定义
- /// </summary>
- /// <param name="uiApp"></param>
- /// <param name="strFileName"></param>
- /// <returns></returns>
- public static DefinitionFile GetSharedParameterFile(this UIApplication uiApp, string strFileName)
- {
- string sharedParameterFile;
- if (strFileName.IndexOf("\\") >= 0)
- {
- sharedParameterFile = strFileName;
- }
- else
- {
- sharedParameterFile = Path.Combine(AppBaseInfo.AppRunPath, strFileName);
- }
- //Method's return
- DefinitionFile informationFile = null;
- // Check if the file is exit
- FileInfo documentMessage = new FileInfo(sharedParameterFile);
- bool fileExist = documentMessage.Exists;
- // Create file for external shared parameter since it does not exist
- if (!fileExist)
- {
- FileStream fileFlow = File.Create(sharedParameterFile);
- fileFlow.Close();
- }
- // Set ourselves file to the externalSharedParameterFile
- uiApp.Application.SharedParametersFilename = sharedParameterFile;
- informationFile = uiApp.Application.OpenSharedParameterFile();
- return informationFile;
- }
- /// <summary>
- /// 新建共享参数
- /// </summary>
- /// <param name="uiApp">文档对象</param>
- /// <param name="strParaName">唯一参数名</param>
- /// <param name="paramType">参数类型</param>
- /// <param name="strFileName">共享参数文件名</param>
- /// <param name="strGroupName">组名</param>
- /// <param name="blnVisible">是否在属性中可见</param>
- /// <returns></returns>
- public static Definition GetSharedParameter(this UIApplication uiApp, string strParaName,
- ParameterType paramType, string strGroupName = Sharedgroup, string strFileName = Sharedfile,
- bool blnVisible = true)
- {
- //Open the shared parameters file
- DefinitionFile informationFile = uiApp.GetSharedParameterFile(strFileName);
- if (null == informationFile)
- {
- return null;
- }
- // Access an existing or create a new group in the shared parameters file
- DefinitionGroups informationCollections = informationFile.Groups;
- DefinitionGroup informationCollection = null;
- informationCollection = informationCollections.get_Item(strGroupName);
- if (null == informationCollection)
- {
- informationCollections.Create(strGroupName);
- informationCollection = informationCollections.get_Item(strGroupName);
- }
- // Access an existing or create a new external parameter definition
- // belongs to a specific group
- Definition information = informationCollection.Definitions.get_Item(strParaName);
- if (null == information)
- {
- ExternalDefinitionCreationOptions optrions = new ExternalDefinitionCreationOptions(strParaName, paramType) { Visible = blnVisible };
- information = informationCollection.Definitions.Create(optrions);
- }
- return information;
- }
- /// <summary>
- /// 查找自定义的共享参数文件中是否含有指定名称的参数
- /// </summary>
- /// <param name="uiApp"></param>
- /// <param name="strParaName"></param>
- /// <param name="definiton"></param>
- /// <returns></returns>
- public static bool ExistDefinition(this UIApplication uiApp, string strParaName, ref Definition definiton)
- {
- string strFileName = Sharedfile;
- string strGroupName = Sharedgroup;
- DefinitionFile informationFile = uiApp.GetSharedParameterFile(strFileName);
- if (null == informationFile)
- {
- return false;
- }
- // Access an existing or create a new group in the shared parameters file
- DefinitionGroups informationCollections = informationFile.Groups;
- DefinitionGroup informationCollection = null;
- informationCollection = informationCollections.get_Item(strGroupName);
- if (null == informationCollection)
- {
- return false;
- }
- // Access an existing or create a new external parameter definition
- // belongs to a specific group
- definiton = informationCollection.Definitions.get_Item(strParaName);
- if (null == definiton)
- {
- return false;
- }
- return true;
- }
- /// <summary>
- /// 新建共享参数(默认共享参数文件名为revit程序目录下SAGASharedParameters.txt,组名为SAGAParameters,类型为text)
- /// </summary>
- /// <param name="uiApp">文档对象</param>
- /// <param name="strParaName">唯一参数名</param>
- /// <param name="cat">要设置参数的类型</param>
- /// <param name="paramType">参数类型</param>
- /// <param name="strFileName">共享参数文件名称</param>
- /// <param name="strGroupName">默认共享参数创建分组</param>
- /// <param name="blnBindType">类型参数true、实例参数false</param>
- /// <returns></returns>
- public static void BindSharedParameter(this UIApplication uiApp, string strParaName, BuiltInCategory cat,
- ParameterType paramType = ParameterType.Text, string strGroupName = Sharedgroup,
- string strFileName = Sharedfile,
- bool blnBindType = false)
- {
- List<BuiltInCategory> lstCategorie = new List<BuiltInCategory>();
- lstCategorie.Add(cat);
- uiApp.BindSharedParameter(strParaName, lstCategorie, paramType, strFileName, strGroupName,
- blnBindType);
- }
- /// <summary>
- /// 新建共享参数(默认共享参数文件名为revit程序目录下SAGASharedParameters.txt,组名为SAGAParameters)
- /// </summary>
- /// <param name="uiApp">文档对象</param>
- /// <param name="strParaName">唯一参数名</param>
- /// <param name="paramType">参数类型</param>
- /// <param name="lstCategorie"></param>
- /// <param name="blnBindType">类型参数、实例参数</param>
- /// <param name="blnVisible">参数是否显示在属性栏</param>
- /// <param name="strFileName"></param>
- /// <param name="strGroupName">共享参数组名</param>
- /// <returns></returns>
- public static void BindSharedParameter(this UIApplication uiApp, string strParaName,
- List<BuiltInCategory> lstCategorie, ParameterType paramType = ParameterType.Text,
- string strGroupName = Sharedgroup, string strFileName = Sharedfile, bool blnBindType = false,
- bool blnVisible = true)
- {
- Definition paraDef = uiApp.GetSharedParameter(strParaName, paramType, strGroupName, strFileName,
- blnVisible: blnVisible);
- uiApp.BindSharedParameter(paraDef, lstCategorie, blnBindType);
- }
- /// <summary>
- /// 创建共享参数
- /// </summary>
- /// <param name="uiApp"></param>
- /// <param name="paraDef"></param>
- /// <param name="lstCategorie"></param>
- /// <param name="blnBindType"></param>
- /// <returns></returns>
- public static void BindSharedParameter(this UIApplication uiApp, Definition paraDef,
- List<BuiltInCategory> lstCategorie, bool blnBindType = false)
- {
- // Create a new Binding object with the categories to which the parameter will be bound
- CategorySet categories = uiApp.Application.Create.NewCategorySet();
- foreach (BuiltInCategory catType in lstCategorie)
- {
- Category cat = uiApp.ActiveUIDocument.Document.Settings.Categories.get_Item(catType);
- categories.Insert(cat);
- }
- //检查共享参数是否已经存在
- bool isContains = IsContains(uiApp, paraDef, categories);
- //绑定类型
- Binding caseTying;
- if (blnBindType)
- {
- //为类型参数
- caseTying = uiApp.Application.Create.NewTypeBinding(categories);
- }
- else
- {
- //为实例参数
- caseTying = uiApp.Application.Create.NewInstanceBinding(categories);
- }
- //指定参数名已被绑定需要使用ReInsert进行刷新
- if (isContains)
- {
- uiApp.ActiveUIDocument.Document.ParameterBindings.ReInsert(paraDef, caseTying);
- }
- else
- {
- uiApp.ActiveUIDocument.Document.ParameterBindings.Insert(paraDef, caseTying);
- }
- }
- /// <summary>
- /// 移除共享参数
- /// </summary>
- /// <param name="uiApp"></param>
- /// <param name="defList">参数定义</param>
- /// <param name="categoryList">所绑定类别</param>
- /// <param name="typeParameter">是否是类型参数</param>
- public static void RemoveSharedParameter(this UIApplication uiApp, List<Definition> defList,
- List<BuiltInCategory> categoryList, bool typeParameter = false)
- {
- CategorySet categorySet = uiApp.Application.Create.NewCategorySet();
- foreach (BuiltInCategory builtCategory in categoryList)
- {
- Category category = uiApp.ActiveUIDocument.Document.Settings.Categories.get_Item(builtCategory);
- categorySet.Insert(category);
- }
- Binding categoryBinding = uiApp.Application.Create.NewInstanceBinding(categorySet);
- if (typeParameter)
- {
- categoryBinding = uiApp.Application.Create.NewTypeBinding(categorySet);
- }
- foreach (Definition def in defList)
- {
- uiApp.ActiveUIDocument.Document.ParameterBindings.Remove(def);
- }
- }
- /// <summary>
- /// 检查是否包含要定义的类型,若已包含,则将已绑定的类型添加到新类型列表中
- /// </summary>
- /// <param name="uiApp"></param>
- /// <param name="paraDef"></param>
- /// <param name="category">需要绑定的类型集合</param>
- /// <returns></returns>
- private static bool IsContains(UIApplication uiApp, Definition paraDef, CategorySet category)
- {
- //遍历所有绑定定义
- DefinitionBindingMapIterator iterator = uiApp.ActiveUIDocument.Document.ParameterBindings.ForwardIterator();
- while (iterator.MoveNext())
- {
- Definition def = iterator.Key;
- ElementBinding elemBind = (ElementBinding)iterator.Current;
- //判断共享参数是否已经被绑定
- if (paraDef.Name.Equals(def.Name, StringComparison.CurrentCultureIgnoreCase))
- {
- //判断指定的类型是否已经绑定了指定类型
- foreach (Category c in elemBind.Categories)
- {
- if (!category.Contains(c))
- {
- //将已绑定的类型加入新类别列表中
- category.Insert(c);
- }
- }
- return true;
- }
- }
- return false;
- }
- }
- }
|