1012 lines
28 KiB
C#
1012 lines
28 KiB
C#
using System.IO;
|
||
using System.Reflection;
|
||
|
||
using Autodesk.Revit.ApplicationServices;
|
||
using Autodesk.Revit.DB;
|
||
using Autodesk.Revit.UI;
|
||
|
||
namespace Sai.Toolkit.Revit.Helpers;
|
||
|
||
public class SharedParamsAssist
|
||
{
|
||
public static IEnumerable<string> InstanceCategories
|
||
{
|
||
get
|
||
{
|
||
yield return "HVAC 区";
|
||
yield return "专用设备";
|
||
yield return "体量";
|
||
yield return "停车场";
|
||
yield return "卫浴装置";
|
||
yield return "喷头";
|
||
yield return "图纸";
|
||
yield return "地形";
|
||
yield return "场地";
|
||
yield return "坡道";
|
||
yield return "墙";
|
||
yield return "天花板";
|
||
yield return "安全设备";
|
||
yield return "家具";
|
||
yield return "家具系统";
|
||
yield return "导线";
|
||
yield return "屋顶";
|
||
yield return "常规模型";
|
||
yield return "幕墙嵌板";
|
||
yield return "幕墙竖梃";
|
||
yield return "幕墙系统";
|
||
yield return "开关系统";
|
||
yield return "房间";
|
||
yield return "护理呼叫设备";
|
||
yield return "数据设备";
|
||
yield return "机械设备";
|
||
yield return "材质";
|
||
yield return "柱";
|
||
yield return "标高";
|
||
yield return "栏杆扶手";
|
||
yield return "植物";
|
||
yield return "楼板";
|
||
yield return "楼梯";
|
||
yield return "橱柜";
|
||
yield return "火警设备";
|
||
yield return "灯具";
|
||
yield return "照明设备";
|
||
yield return "环境";
|
||
yield return "电气装置";
|
||
yield return "电气设备";
|
||
yield return "电缆桥架";
|
||
yield return "电缆桥架管路";
|
||
yield return "电缆桥架配件";
|
||
yield return "电话设备";
|
||
yield return "电路";
|
||
yield return "空间";
|
||
yield return "窗";
|
||
yield return "竖井洞口";
|
||
yield return "管件";
|
||
yield return "管道";
|
||
yield return "管道占位符";
|
||
yield return "管道系统";
|
||
yield return "管道附件";
|
||
yield return "线管";
|
||
yield return "线管管路";
|
||
yield return "线管配件";
|
||
yield return "组成部分";
|
||
yield return "结构加强板";
|
||
yield return "结构区域钢筋";
|
||
yield return "结构基础";
|
||
yield return "结构柱";
|
||
yield return "结构桁架";
|
||
yield return "结构框架";
|
||
yield return "结构梁系统";
|
||
yield return "结构路径钢筋";
|
||
yield return "结构连接";
|
||
yield return "结构钢筋";
|
||
yield return "结构钢筋网";
|
||
yield return "结构钢筋网区域";
|
||
yield return "视图";
|
||
yield return "详图项目";
|
||
yield return "软管";
|
||
yield return "软风管";
|
||
yield return "轴网";
|
||
yield return "通讯设备";
|
||
yield return "道路";
|
||
yield return "部件";
|
||
yield return "钢筋形状";
|
||
yield return "门";
|
||
yield return "面积";
|
||
yield return "项目信息";
|
||
yield return "预制零件";
|
||
yield return "风管";
|
||
yield return "风管内衬";
|
||
yield return "风管占位符";
|
||
yield return "风管管件";
|
||
yield return "风管系统";
|
||
yield return "风管附件";
|
||
yield return "风管隔热层";
|
||
yield return "风道末端";
|
||
}
|
||
}
|
||
|
||
public static IEnumerable<string> ProjectParamGroups
|
||
{
|
||
get
|
||
{
|
||
yield return "IFC参数";
|
||
yield return "主端点";
|
||
yield return "光域";
|
||
yield return "其他";
|
||
yield return "分区几何图形";
|
||
yield return "分析平差";
|
||
yield return "分析模型";
|
||
yield return "分析结果";
|
||
yield return "力";
|
||
yield return "力矩";
|
||
yield return "卫浴";
|
||
yield return "可见性";
|
||
yield return "图层";
|
||
yield return "图形";
|
||
yield return "尺寸标注";
|
||
yield return "常规";
|
||
yield return "数据";
|
||
yield return "整个图例";
|
||
yield return "文字";
|
||
yield return "机械";
|
||
yield return "机械 - 流量";
|
||
yield return "机械 - 负荷";
|
||
yield return "材质和装饰";
|
||
yield return "构造";
|
||
yield return "标识数据";
|
||
yield return "标题文字";
|
||
yield return "模型属性";
|
||
yield return "次端点";
|
||
yield return "消防系统";
|
||
yield return "电气";
|
||
yield return "电气 - 照明";
|
||
yield return "电气 - 线路";
|
||
yield return "电气 - 负荷";
|
||
yield return "电气工程";
|
||
yield return "管段和管件";
|
||
yield return "结构";
|
||
yield return "结构分析";
|
||
yield return "绿色建筑属性";
|
||
yield return "编辑板形状";
|
||
yield return "能量分析";
|
||
yield return "释放/杆件力";
|
||
yield return "钢筋集";
|
||
yield return "阶段化";
|
||
yield return "限制条件";
|
||
}
|
||
}
|
||
|
||
public static IEnumerable<string> TypeCategories
|
||
{
|
||
get
|
||
{
|
||
yield return "专用设备";
|
||
yield return "体量";
|
||
yield return "停车场";
|
||
yield return "卫浴装置";
|
||
yield return "喷头";
|
||
yield return "地形";
|
||
yield return "场地";
|
||
yield return "坡道";
|
||
yield return "墙";
|
||
yield return "天花板";
|
||
yield return "安全设备";
|
||
yield return "家具";
|
||
yield return "家具系统";
|
||
yield return "导线";
|
||
yield return "屋顶";
|
||
yield return "常规模型";
|
||
yield return "幕墙嵌板";
|
||
yield return "幕墙竖梃";
|
||
yield return "幕墙系统";
|
||
yield return "开关系统";
|
||
yield return "护理呼叫设备";
|
||
yield return "数据设备";
|
||
yield return "机械设备";
|
||
yield return "柱";
|
||
yield return "标高";
|
||
yield return "栏杆扶手";
|
||
yield return "植物";
|
||
yield return "楼板";
|
||
yield return "楼梯";
|
||
yield return "橱柜";
|
||
yield return "火警设备";
|
||
yield return "灯具";
|
||
yield return "照明设备";
|
||
yield return "环境";
|
||
yield return "电气装置";
|
||
yield return "电气设备";
|
||
yield return "电缆桥架";
|
||
yield return "电缆桥架管路";
|
||
yield return "电缆桥架配件";
|
||
yield return "电话设备";
|
||
yield return "窗";
|
||
yield return "管件";
|
||
yield return "管道";
|
||
yield return "管道占位符";
|
||
yield return "管道系统";
|
||
yield return "管道附件";
|
||
yield return "线管";
|
||
yield return "线管管路";
|
||
yield return "线管配件";
|
||
yield return "组成部分";
|
||
yield return "结构加强板";
|
||
yield return "结构区域钢筋";
|
||
yield return "结构基础";
|
||
yield return "结构柱";
|
||
yield return "结构桁架";
|
||
yield return "结构框架";
|
||
yield return "结构梁系统";
|
||
yield return "结构路径钢筋";
|
||
yield return "结构连接";
|
||
yield return "结构钢筋";
|
||
yield return "结构钢筋网";
|
||
yield return "结构钢筋网区域";
|
||
yield return "详图项目";
|
||
yield return "软管";
|
||
yield return "软风管";
|
||
yield return "轴网";
|
||
yield return "通讯设备";
|
||
yield return "部件";
|
||
yield return "钢筋形状";
|
||
yield return "门";
|
||
yield return "预制零件";
|
||
yield return "风管";
|
||
yield return "风管内衬";
|
||
yield return "风管占位符";
|
||
yield return "风管管件";
|
||
yield return "风管系统";
|
||
yield return "风管附件";
|
||
yield return "风管隔热层";
|
||
yield return "风道末端";
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 关联族参数
|
||
/// </summary>
|
||
/// <param name="familyMgr"></param>
|
||
/// <param name="lengthElementPara"></param>
|
||
/// <param name="lengthFamilyPara"></param>
|
||
public static void AssociateParametersInFamilyDocument(
|
||
FamilyManager familyMgr,
|
||
Parameter lengthElementPara, // 长度类型的图元参数
|
||
FamilyParameter lengthFamilyPara
|
||
) // 长度类型的族参数
|
||
{
|
||
#if REVIT2018 || REVIT2020
|
||
var lengthElementParaType = lengthElementPara.Definition.ParameterType;
|
||
var lengthFamilyParaType = lengthFamilyPara.Definition.ParameterType;
|
||
#elif REVIT2025
|
||
var lengthElementParaType = lengthElementPara.Definition.GetDataType();
|
||
var lengthFamilyParaType = lengthFamilyPara.Definition.GetDataType();
|
||
#endif
|
||
// 能关联起来的图元参数和族参数的类型要相同
|
||
if (lengthElementParaType != lengthFamilyParaType)
|
||
{
|
||
// 注意:有些类型不同的图元参数和族参数也是可以关联的。
|
||
// 比如PipeSize和Length类型的参数可以关联,因为他们代表了相同的物理量:长度
|
||
return;
|
||
}
|
||
|
||
// 判断该长度单位是否能够和族参数关联
|
||
if (!familyMgr.CanElementParameterBeAssociated(lengthElementPara))
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 进行关联操作
|
||
familyMgr.AssociateElementParameterToFamilyParameter(lengthElementPara, lengthFamilyPara);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 绑定新建参数参数
|
||
/// </summary>
|
||
/// <param name="doc"></param>
|
||
/// <param name="e"></param>
|
||
/// <param name="definition"></param>
|
||
/// <param name="isInstance"></param>
|
||
public static void BindingElementCategory(Document doc, Element e, Definition definition, bool isInstance)
|
||
{
|
||
var app = doc.Application;
|
||
var bindmap = doc.ParameterBindings;
|
||
Binding binding = null;
|
||
var dep = bindmap.ForwardIterator();
|
||
while (dep.MoveNext())
|
||
{
|
||
var depKey = dep.Key;
|
||
var definitionName = depKey.Name;
|
||
if (definitionName == definition.Name)
|
||
{
|
||
#if REVIT2018 || REVIT2020
|
||
|
||
_ = depKey.ParameterType;
|
||
#elif REVIT2025
|
||
_ = depKey.GetDataType();
|
||
#endif
|
||
|
||
binding = bindmap.get_Item(depKey);
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (binding == null)
|
||
{
|
||
var categorySet = app.Create.NewCategorySet();
|
||
categorySet.Insert(e.Category);
|
||
binding = isInstance ? app.Create.NewInstanceBinding(categorySet) : app.Create.NewTypeBinding(categorySet);
|
||
|
||
bindmap.Remove(definition);
|
||
|
||
#if REVIT2018 || REVIT2020
|
||
bindmap.ReInsert(definition, binding, BuiltInParameterGroup.PG_ADSK_MODEL_PROPERTIES);
|
||
#elif REVIT2025
|
||
bindmap.ReInsert(definition, binding, GroupTypeId.AdskModelProperties);
|
||
#endif
|
||
}
|
||
else
|
||
{
|
||
CategorySet categorySet;
|
||
if (binding is InstanceBinding instanceBinding)
|
||
{
|
||
categorySet = instanceBinding.Categories;
|
||
}
|
||
else
|
||
{
|
||
var typeBinding = binding as TypeBinding;
|
||
categorySet = typeBinding!.Categories;
|
||
}
|
||
|
||
categorySet.Insert(e.Category);
|
||
}
|
||
}
|
||
|
||
public static FamilyParameter CreateFamilyPara(
|
||
Document famdoc,
|
||
string paraName,
|
||
#if REVIT2018 || REVIT2020
|
||
BuiltInParameterGroup paraGroup,
|
||
ParameterType paramType,
|
||
#elif REVIT2025
|
||
ForgeTypeId paraGroup,
|
||
ForgeTypeId paramType,
|
||
#endif
|
||
bool isInstance
|
||
)
|
||
{
|
||
// 得到FamilyManager
|
||
if (!famdoc.IsFamilyDocument)
|
||
{
|
||
throw new Exception("不是族文档");
|
||
}
|
||
|
||
var familyMgr = famdoc.FamilyManager;
|
||
return familyMgr.AddParameter(paraName, paraGroup, paramType, isInstance);
|
||
}
|
||
|
||
public static void CreateSharedFamilyParam(Application app, Document famdoc)
|
||
{
|
||
var familyMgr = famdoc.FamilyManager;
|
||
|
||
// 共享参数的基本信息, 包括定义文件路径,参数分组名称,参数名称和参数类型。
|
||
var sharedParameterFilePath = @"C:\SharedParameter.txt";
|
||
var sharedParameterGroupName = "Shared_Group";
|
||
var sharedParameter = "Shared_Parameter";
|
||
#if REVIT2018 || REVIT2020
|
||
var sharedParameterType = ParameterType.Length;
|
||
#elif REVIT2025
|
||
var sharedParameterType = SpecTypeId.Length;
|
||
#endif
|
||
ExternalDefinitionCreationOptions externalDefinitionCreationOptions = new(sharedParameter, sharedParameterType);
|
||
// 打开或创建共享参数定义文件。
|
||
app.SharedParametersFilename = sharedParameterFilePath;
|
||
var sharedDefinitonFile = app.OpenSharedParameterFile();
|
||
if (sharedDefinitonFile == null)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 查找共享参数的分组名称,如果没找到,就创建一个。
|
||
DefinitionGroup sharedGroup;
|
||
sharedGroup = sharedDefinitonFile.Groups.get_Item(sharedParameterGroupName);
|
||
if (null == sharedGroup)
|
||
{
|
||
sharedGroup = sharedDefinitonFile.Groups.Create(sharedParameterGroupName);
|
||
}
|
||
|
||
// 查找共享参数的定义,如果没有找到,就用名字和类型创建一个。
|
||
if (sharedGroup.Definitions.get_Item(sharedParameter) is not ExternalDefinition parameterDef)
|
||
{
|
||
parameterDef = sharedGroup.Definitions.Create(externalDefinitionCreationOptions) as ExternalDefinition;
|
||
}
|
||
|
||
// 创建共享族参数
|
||
#if REVIT2018 || REVIT2020
|
||
_ = familyMgr.AddParameter(parameterDef, BuiltInParameterGroup.PG_CONSTRAINTS, true);
|
||
#elif REVIT2025
|
||
_ = familyMgr.AddParameter(parameterDef, GroupTypeId.Constraints, true);
|
||
#endif
|
||
}
|
||
|
||
public void CreateSharedParam(
|
||
Application app,
|
||
Document doc,
|
||
bool instanceParameter,
|
||
string sharedParametersFilePath,
|
||
string groupName,
|
||
string definitionName
|
||
)
|
||
{
|
||
#if REVIT2018 || REVIT2020
|
||
var parameterType = ParameterType.Text;
|
||
var parameterGroup = BuiltInParameterGroup.PG_DATA;
|
||
#elif REVIT2025
|
||
var parameterType = SpecTypeId.String.Text;
|
||
var parameterGroup = GroupTypeId.Data;
|
||
#endif
|
||
CategorySet categorySet = new();
|
||
var wallCategory = doc.Settings.Categories.get_Item(BuiltInCategory.OST_Walls);
|
||
categorySet.Insert(wallCategory);
|
||
|
||
if (!File.Exists(sharedParametersFilePath))
|
||
{
|
||
try
|
||
{
|
||
var sw = File.CreateText(sharedParametersFilePath);
|
||
sw.Close();
|
||
}
|
||
catch (Exception)
|
||
{
|
||
throw new Exception("无法创建共享参数文件: " + sharedParametersFilePath);
|
||
}
|
||
}
|
||
|
||
// 设置共享参数文件
|
||
app.SharedParametersFilename = sharedParametersFilePath;
|
||
|
||
// 打开共享参数文件
|
||
var definitionFile = app.OpenSharedParameterFile();
|
||
if (definitionFile == null)
|
||
{
|
||
throw new Exception("无法打开共享参数文件");
|
||
}
|
||
|
||
// 获取参数组的集合
|
||
var groups = definitionFile.Groups;
|
||
|
||
// 获取参数组
|
||
var group = groups.get_Item(groupName);
|
||
if (null == group)
|
||
{
|
||
// 如果参数组不存在,则创建一个
|
||
group = groups.Create(groupName);
|
||
}
|
||
|
||
if (null == group)
|
||
{
|
||
throw new Exception("获取参数组失败: " + groupName);
|
||
}
|
||
|
||
// 获取参数定义
|
||
var definition = group.Definitions.get_Item(definitionName);
|
||
// 如果参数定义不存在,则创建一个
|
||
definition ??= group.Definitions.Create(new ExternalDefinitionCreationOptions(definitionName, parameterType));
|
||
|
||
// 调用不同的函数创建类型参数或者实例参数
|
||
ElementBinding binding = instanceParameter
|
||
? app.Create.NewInstanceBinding(categorySet)
|
||
: app.Create.NewTypeBinding(categorySet);
|
||
|
||
// 把参数定义和类别绑定起来,元素的新的参数就创建成功了。
|
||
var insertSuccess = doc.ParameterBindings.Insert(definition, binding, parameterGroup);
|
||
|
||
if (!insertSuccess)
|
||
{
|
||
throw new Exception("绑定类别失败");
|
||
}
|
||
}
|
||
|
||
public DefinitionFile CreateTempSharedParameterFile(Application revitApp, string fileName)
|
||
{
|
||
var shapeFile = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + $"\\{fileName}.txt";
|
||
System.Text.StringBuilder contents = new();
|
||
contents.AppendLine("# This is a Revit shared parameter file.");
|
||
contents.AppendLine("# Do not edit manually.");
|
||
contents.AppendLine("*META VERSION MINVERSION");
|
||
contents.AppendLine("META 2 1");
|
||
contents.AppendLine("*GROUP ID NAME");
|
||
contents.AppendLine("*PARAM GUID NAME DATATYPE DATACATEGORY GROUP VISIBLE");
|
||
File.WriteAllText(shapeFile, contents.ToString());
|
||
revitApp.SharedParametersFilename = shapeFile;
|
||
return revitApp.OpenSharedParameterFile();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 生成共享文件
|
||
/// </summary>
|
||
/// <param name="groups">参数组</param>
|
||
/// <param name="definitions">参数外部定义</param>
|
||
/// <returns></returns>
|
||
public static string GenerateSharedParameterFile(List<DefinitionGroup> groups, List<ExternalDefinition> definitions)
|
||
{
|
||
var name = Assembly.GetCallingAssembly().GetName();
|
||
var date = string.Format(
|
||
"{0:s}",
|
||
File.GetLastWriteTime(Assembly.GetExecutingAssembly().Location).ToUniversalTime()
|
||
);
|
||
var result =
|
||
"# This is a Revit shared parameter file, generated "
|
||
+ DateTime.Now.ToShortDateString()
|
||
+ " using "
|
||
+ name.Name
|
||
+ " v"
|
||
+ name.Version
|
||
+ " built "
|
||
+ date
|
||
+ "\r\n";
|
||
result += "# Do not edit manually.\r\n";
|
||
result += "*META\tVERSION\tMINVERSION\r\n";
|
||
result += "META\t2\t1\r\n";
|
||
result += "*GROUP\tID\tNAME\r\n";
|
||
for (var i = 0; i < groups.Count; i++)
|
||
{
|
||
var group = groups[i];
|
||
result += "GROUP\t" + $"{i + 1}" + "\t" + group.Name + "\r\n";
|
||
}
|
||
|
||
result += "*PARAM\tGUID\tNAME\tDATATYPE\tDATACATEGORY\tGROUP\tVISIBLE\tDESCRIPTION\tUSERMODIFIABLE\r\n";
|
||
foreach (var definition in definitions)
|
||
{
|
||
var id = groups.FindIndex(g => g.Name == definition.OwnerGroup.Name) + 1;
|
||
if (id > 0)
|
||
{
|
||
result +=
|
||
"PARAM\t"
|
||
+ definition.GUID
|
||
+ "\t"
|
||
+ definition.Name
|
||
+ "\t"
|
||
#if REVIT2018 || REVIT2020
|
||
+ definition.ParameterType.ToString().ToUpper()
|
||
#elif REVIT2025
|
||
+ definition.GetDataType().ToString().ToUpper()
|
||
#endif
|
||
+ "\t\t"
|
||
+ id
|
||
+ (definition.Visible ? "\t1\t" : "\t0\t")
|
||
+ System.Text.RegularExpressions.Regex.Replace(definition.Description, @"\t|\n|\r", string.Empty)
|
||
+ "\t"
|
||
+ (definition.UserModifiable ? "1" : string.Empty)
|
||
+ "\r\n";
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
public static ExternalDefinition GetDefinition(
|
||
DefinitionFile sharedParamFile,
|
||
string definitionName,
|
||
#if REVIT2018 || REVIT2020
|
||
ParameterType paramType,
|
||
#elif REVIT2025
|
||
ForgeTypeId paramType,
|
||
#endif
|
||
ref Guid guid,
|
||
DefinitionGroup group
|
||
)
|
||
{
|
||
new List<ExternalDefinition>();
|
||
foreach (var definitionGroup in sharedParamFile.Groups)
|
||
{
|
||
foreach (var definition in definitionGroup.Definitions)
|
||
{
|
||
var externalDefinition = (ExternalDefinition)definition;
|
||
if (externalDefinition.Name == definitionName)
|
||
{
|
||
return externalDefinition;
|
||
}
|
||
}
|
||
}
|
||
|
||
ExternalDefinitionCreationOptions externalDefinitionCreationOptions = new(definitionName, paramType);
|
||
return group.Definitions.Create(externalDefinitionCreationOptions) as ExternalDefinition;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取或创建共享参数文件的参数组中的参数
|
||
/// </summary>
|
||
/// <param name="group"></param>
|
||
/// <param name="paramName"></param>
|
||
/// <param name="canEdit"></param>
|
||
/// <returns></returns>
|
||
public static Definition GetDefinition(DefinitionGroup group, string paramName, bool canEdit = false)
|
||
{
|
||
if (group is null)
|
||
{
|
||
throw new ArgumentNullException(nameof(group));
|
||
}
|
||
|
||
if (paramName is null)
|
||
{
|
||
throw new ArgumentNullException(nameof(paramName));
|
||
}
|
||
|
||
var definition = group.Definitions.get_Item(paramName);
|
||
|
||
if (definition != null)
|
||
{
|
||
return definition;
|
||
}
|
||
#if REVIT2018 || REVIT2020
|
||
var opt = new ExternalDefinitionCreationOptions(paramName, ParameterType.Text) { UserModifiable = canEdit };
|
||
|
||
#elif REVIT2025
|
||
var opt = new ExternalDefinitionCreationOptions(paramName, SpecTypeId.String.Text) { UserModifiable = canEdit };
|
||
#endif
|
||
|
||
return group.Definitions.Create(opt);
|
||
}
|
||
|
||
public static DefinitionGroup GetGroup(DefinitionFile myDefinitionFile, string groupName, string log)
|
||
{
|
||
DefinitionGroup definitionGroup = null;
|
||
var groups = myDefinitionFile.Groups;
|
||
foreach (var definitionGroup2 in groups)
|
||
{
|
||
if (definitionGroup2.Name == groupName)
|
||
{
|
||
using (StreamWriter streamWriter = new(log, true))
|
||
{
|
||
streamWriter.WriteLine("Group {0} already exists", groupName);
|
||
}
|
||
|
||
definitionGroup = definitionGroup2;
|
||
return definitionGroup;
|
||
}
|
||
}
|
||
|
||
using (StreamWriter streamWriter2 = new(log, true))
|
||
{
|
||
streamWriter2.WriteLine("Group {0} not found", groupName);
|
||
}
|
||
|
||
definitionGroup = groups.Create(groupName);
|
||
using (StreamWriter streamWriter3 = new(log, true))
|
||
{
|
||
streamWriter3.WriteLine("Group {0} created", definitionGroup.Name);
|
||
}
|
||
|
||
return definitionGroup;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取共享参数文件中的参数组
|
||
/// </summary>
|
||
/// <param name="groups"></param>
|
||
/// <param name="groupName">分组</param>
|
||
/// <returns></returns>
|
||
public static DefinitionGroup GetGroup(DefinitionGroups groups, string groupName)
|
||
{
|
||
return groups is null
|
||
? throw new ArgumentNullException(nameof(groups))
|
||
: groupName is null
|
||
? throw new ArgumentNullException(nameof(groupName))
|
||
: groups.get_Item(groupName) ?? groups.Create(groupName);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取共享参数文件中的参数组
|
||
/// </summary>
|
||
/// <param name="uiapp"></param>
|
||
/// <param name="parmPath">共享文件路径</param>
|
||
/// <returns></returns>
|
||
public static DefinitionGroups GetGroupList(UIApplication uiapp, string parmPath)
|
||
{
|
||
if (uiapp is null)
|
||
{
|
||
throw new ArgumentNullException(nameof(uiapp));
|
||
}
|
||
|
||
if (parmPath is null)
|
||
{
|
||
throw new ArgumentNullException(nameof(parmPath));
|
||
}
|
||
|
||
if (!File.Exists(parmPath))
|
||
{
|
||
File.CreateText(parmPath);
|
||
}
|
||
|
||
uiapp.Application.SharedParametersFilename = parmPath;
|
||
|
||
return uiapp.Application.OpenSharedParameterFile()?.Groups;
|
||
}
|
||
|
||
public void GetSharedPara(Application revitApp)
|
||
{
|
||
// 打开共享参数文件
|
||
var definitionFile = revitApp.OpenSharedParameterFile();
|
||
// 获取参数组的集合
|
||
var groups = definitionFile.Groups;
|
||
|
||
foreach (var group in groups)
|
||
{
|
||
// 获取参数组内的参数定义
|
||
foreach (var definition in group.Definitions)
|
||
{
|
||
_ = definition.Name;
|
||
#if REVIT2018 || REVIT2020
|
||
_ = definition.ParameterType;
|
||
#elif REVIT2025
|
||
_ = definition.GetDataType();
|
||
#endif
|
||
// 对参数定义的其他操作
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 初始化元素绑定(或类型)
|
||
/// </summary>
|
||
/// <param name="uiapp"></param>
|
||
/// <param name="elm">要绑定类别的元素</param>
|
||
/// <param name="paramPath">共享文件路径</param>
|
||
public static void InitParamList(UIApplication uiapp, Element elm, string paramPath)
|
||
{
|
||
if (uiapp is null)
|
||
{
|
||
throw new ArgumentNullException(nameof(uiapp));
|
||
}
|
||
|
||
if (elm is null)
|
||
{
|
||
throw new ArgumentNullException(nameof(elm));
|
||
}
|
||
|
||
if (paramPath is null)
|
||
{
|
||
throw new ArgumentNullException(nameof(paramPath));
|
||
}
|
||
|
||
var doc = uiapp.ActiveUIDocument.Document;
|
||
|
||
var bindingMap = doc.ParameterBindings;
|
||
|
||
var groups = GetGroupList(uiapp, paramPath);
|
||
|
||
CategorySet elmCtgs = new();
|
||
|
||
elmCtgs.Insert(elm.Category);
|
||
|
||
foreach (var groupPram in groups)
|
||
{
|
||
var paramGroup = GetGroup(groups, groupPram.Name);
|
||
|
||
foreach (var definition in groupPram.Definitions)
|
||
{
|
||
var binding = bindingMap.get_Item(definition);
|
||
|
||
// If the parameter group's name contains type key, it's means type binding.
|
||
if (!paramGroup.Name.Contains("Group"))
|
||
{
|
||
if (binding is InstanceBinding instanceBinding)
|
||
{
|
||
bindingMap.ReInsert(definition, instanceBinding);
|
||
}
|
||
else
|
||
{
|
||
instanceBinding = uiapp.Application.Create.NewInstanceBinding(elmCtgs);
|
||
|
||
bindingMap.Insert(definition, instanceBinding);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (binding is TypeBinding typeBinding)
|
||
{
|
||
bindingMap.ReInsert(definition, typeBinding);
|
||
}
|
||
else
|
||
{
|
||
typeBinding = uiapp.Application.Create.NewTypeBinding(elmCtgs);
|
||
|
||
bindingMap.Insert(definition, typeBinding);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
public bool IsExistSharedParam(
|
||
Document doc,
|
||
string paramName,
|
||
out Definition definition,
|
||
out ElementBinding binding
|
||
)
|
||
{
|
||
DefinitionBindingMap map = doc.ParameterBindings;
|
||
var dep = map.ForwardIterator();
|
||
var isExist = false;
|
||
binding = null;
|
||
definition = null;
|
||
while (dep.MoveNext())
|
||
{
|
||
definition = dep.Key;
|
||
var definitionName = definition.Name;
|
||
binding = dep.Current as ElementBinding;
|
||
//ParameterType parameterType = definition.ParameterType;
|
||
//InstanceBinding instanceBinding = dep.Current as InstanceBinding;
|
||
//if (instanceBinding != null)
|
||
//{
|
||
// CategorySet categorySet = instanceBinding.Categories;
|
||
//}
|
||
if (definitionName == paramName)
|
||
{
|
||
isExist = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
return isExist;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 判断共享参数和项目参数
|
||
/// </summary>
|
||
/// <param name="parameter">The parameter<see cref="Parameter" /></param>
|
||
/// <returns></returns>
|
||
public bool IsSharedPara(Parameter parameter)
|
||
{
|
||
var definition = parameter.Definition as InternalDefinition;
|
||
|
||
var isSharedParameter = parameter.IsShared; //共享参数
|
||
|
||
var isProjectParameter = definition.BuiltInParameter == BuiltInParameter.INVALID && !parameter.IsShared; //项目参数
|
||
return isSharedParameter;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 修改内建参数
|
||
/// </summary>
|
||
/// <param name="parameter"></param>
|
||
/// <param name="value"></param>
|
||
/// <exception cref="Exception"></exception>
|
||
public static void ModifyBuiltInParameter(Parameter parameter, object value)
|
||
{
|
||
var success = false;
|
||
if (parameter != null && !parameter.IsReadOnly)
|
||
{
|
||
switch (parameter.StorageType)
|
||
{
|
||
case StorageType.Double:
|
||
success = parameter.Set((double)value);
|
||
break;
|
||
|
||
case StorageType.ElementId:
|
||
success = parameter.Set((ElementId)value);
|
||
break;
|
||
|
||
case StorageType.String:
|
||
success = parameter.Set((string)value);
|
||
break;
|
||
|
||
case StorageType.Integer:
|
||
success = parameter.Set((int)value);
|
||
break;
|
||
}
|
||
|
||
if (!success)
|
||
{
|
||
throw new Exception("赋值失败");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
throw new Exception("参数是只读的");
|
||
}
|
||
}
|
||
|
||
public static DefinitionFile OpenSharedParametersFile(Application application)
|
||
{
|
||
var sharedParametersFile = application.OpenSharedParameterFile();
|
||
return sharedParametersFile;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 移除当前文档中所有族的某些参数
|
||
/// </summary>
|
||
/// <param name="doc"></param>
|
||
/// <param name="paramnames"></param>
|
||
public static void RemoveParams(Document doc, params string[] paramnames)
|
||
{
|
||
var instances = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).Cast<FamilyInstance>();
|
||
foreach (var instance in instances)
|
||
{
|
||
var family = instance.Symbol.Family;
|
||
var famdoc = doc.EditFamily(family);
|
||
using (Transaction trans = new(famdoc, "删除参数"))
|
||
{
|
||
trans.Start();
|
||
foreach (var paramname in paramnames)
|
||
{
|
||
var param1 = instance.Symbol.GetParameters(paramname).FirstOrDefault();
|
||
if (param1 != null)
|
||
{
|
||
var fparam1 = famdoc.FamilyManager.get_Parameter(paramname);
|
||
if (fparam1 != null)
|
||
{
|
||
famdoc.FamilyManager.RemoveParameter(fparam1);
|
||
}
|
||
}
|
||
|
||
//MessageBox.ShowAhead(famdoc.Title);
|
||
//var fparams = famdoc.FamilyManager.GetAllTypeParameter();
|
||
|
||
//var para = from p in fparams
|
||
// where p.Definition.Name == "Code"
|
||
// select p;
|
||
}
|
||
|
||
famdoc.LoadFamily(doc, new LoadFamilyOptions());
|
||
trans.Commit();
|
||
}
|
||
|
||
famdoc.Close(false);
|
||
}
|
||
}
|
||
|
||
public static void SharedParamsBindingCategoryset(
|
||
UIApplication uiapp,
|
||
DefinitionFile sharedParametersFile,
|
||
ExternalDefinition param,
|
||
CategorySet categorySet,
|
||
bool isInstance
|
||
)
|
||
{
|
||
#if REVIT2018 || REVIT2020
|
||
var paramGroup = param.ParameterGroup;
|
||
#elif REVIT2025
|
||
var paramGroup = param.GetGroupTypeId();
|
||
#endif
|
||
|
||
var instanceBinding = uiapp.Application.Create.NewInstanceBinding(categorySet);
|
||
var typeBinding = uiapp.Application.Create.NewTypeBinding(categorySet);
|
||
var bindingMap = uiapp.ActiveUIDocument.Document.ParameterBindings;
|
||
|
||
var extDef = GetSharedParameter(sharedParametersFile, param.OwnerGroup.Name, param.Name);
|
||
|
||
if (isInstance)
|
||
{
|
||
bindingMap.Insert(extDef, instanceBinding, paramGroup);
|
||
}
|
||
else
|
||
{
|
||
bindingMap.Insert(extDef, typeBinding, paramGroup);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取类别和参数的绑定
|
||
/// </summary>
|
||
/// <param name="doc">激活的文档</param>
|
||
public void ShareParameterBinging(Document doc)
|
||
{
|
||
var map = doc.ParameterBindings;
|
||
var dep = map.ForwardIterator();
|
||
while (dep.MoveNext())
|
||
{
|
||
var definition = dep.Key;
|
||
// 获取参数定义的基本信息
|
||
var definitionName = definition.Name;
|
||
#if REVIT2018 || REVIT2020
|
||
var parameterType = definition.ParameterType;
|
||
#elif REVIT2025
|
||
var parameterType = definition.GetDataType();
|
||
#endif
|
||
// 几乎都可以转型为InstanceBinding
|
||
if (dep.Current is InstanceBinding instanceBinding)
|
||
{
|
||
// 获取绑定的类别列表
|
||
var categorySet = instanceBinding.Categories;
|
||
}
|
||
}
|
||
}
|
||
|
||
private static ExternalDefinition GetSharedParameter(DefinitionFile file, string groupname, string paramname)
|
||
{
|
||
var myGroups = file.Groups;
|
||
var myGroup = myGroups.get_Item(groupname);
|
||
|
||
ExternalDefinition extDef = null;
|
||
|
||
if (myGroup != null)
|
||
{
|
||
extDef = myGroup.Definitions.get_Item(paramname) as ExternalDefinition;
|
||
}
|
||
|
||
return extDef;
|
||
}
|
||
}
|