日常更新
This commit is contained in:
243
ParameterResolve/ParameterEdit.cs
Normal file
243
ParameterResolve/ParameterEdit.cs
Normal file
@@ -0,0 +1,243 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Windows.Data;
|
||||
|
||||
using Autodesk.Revit.Attributes;
|
||||
using Autodesk.Revit.DB;
|
||||
using Autodesk.Revit.UI;
|
||||
using Autodesk.Revit.UI.Selection;
|
||||
|
||||
namespace ParameterResolve
|
||||
{
|
||||
/// <summary>
|
||||
/// Revit执行命令
|
||||
/// </summary>
|
||||
[Transaction(TransactionMode.Manual)]
|
||||
[Regeneration(RegenerationOption.Manual)]
|
||||
public class ParameterEdit : IExternalCommand
|
||||
{
|
||||
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
|
||||
{
|
||||
//程序UI界面
|
||||
UIApplication uiapp = commandData.Application;
|
||||
//获取元素(选择) 显示元素 视图(活动视图)管理(对象)
|
||||
UIDocument uidoc = uiapp.ActiveUIDocument;
|
||||
//程序
|
||||
Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;
|
||||
//获取位置和场地 视图(多个视图)管理 获取元素(Revit 项目里的全部元素)
|
||||
Document doc = uidoc.Document;
|
||||
//获取所有打开文档
|
||||
DocumentSet docset = uiapp.Application.Documents;
|
||||
//当前视图
|
||||
View view = doc.ActiveView;
|
||||
|
||||
var parameterElements = new FilteredElementCollector(doc)
|
||||
.OfClass(typeof(SharedParameterElement)).Cast<SharedParameterElement>()
|
||||
.Where(p => IsResolveParameter(p.Name)).ToList();
|
||||
var groups = parameterElements.GroupBy(p => p.Name).Where(g => g.Count() > 1).ToList();
|
||||
|
||||
using (Transaction transaction = new Transaction(doc, "删除重复参数"))
|
||||
{
|
||||
transaction.Start();
|
||||
foreach (var group in groups)
|
||||
{
|
||||
if (group.Key == "TC-100-宽度")
|
||||
{
|
||||
|
||||
}
|
||||
Definition firstDef = null;
|
||||
ElementBinding binding = null;
|
||||
CategorySet cateSet = app.Create.NewCategorySet();
|
||||
//所有的绑定
|
||||
var dict = GetDefinitionBindingDic(doc, group.Key);
|
||||
if (dict.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
firstDef = dict.FirstOrDefault().Key;
|
||||
binding = dict[firstDef];
|
||||
//if (dict.All(d => d.Key.ParameterType == ParameterType.Number))
|
||||
//{
|
||||
// firstDef = dict.First(d => d.Key.ParameterType == ParameterType.Number).Key;
|
||||
// binding = dict[firstDef];
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// firstDef = dict.First(d => d.Key.ParameterType == ParameterType.Text).Key;
|
||||
// binding = dict[firstDef];
|
||||
//}
|
||||
//所有的绑定的类别
|
||||
foreach (var item in dict)
|
||||
{
|
||||
foreach (Category cate in item.Value.Categories)
|
||||
{
|
||||
if (!cateSet.Contains(cate))
|
||||
{
|
||||
cateSet.Insert(cate);
|
||||
}
|
||||
}
|
||||
}
|
||||
//删除多余参数
|
||||
if (firstDef is InternalDefinition internalDefinition)
|
||||
{
|
||||
var idToDel = group.Where(p => p.GetDefinition().Id.IntegerValue != internalDefinition.Id.IntegerValue)
|
||||
.Select(p => p.Id)
|
||||
.ToList();
|
||||
doc.Delete(idToDel);
|
||||
}
|
||||
binding.Categories = cateSet;
|
||||
var res = doc.ParameterBindings.ReInsert(firstDef, binding);
|
||||
}
|
||||
transaction.Commit();
|
||||
}
|
||||
return Result.Succeeded;
|
||||
}
|
||||
|
||||
private void SystemCommonParameters(Autodesk.Revit.ApplicationServices.Application app, Document doc)
|
||||
{
|
||||
var parameterElements = new FilteredElementCollector(doc)
|
||||
.OfClass(typeof(SharedParameterElement)).Cast<SharedParameterElement>()
|
||||
.Where(p => IsResolveParameter(p.Name)).ToList();
|
||||
//存在则使用现有项目参数
|
||||
using (Transaction transaction = new Transaction(doc, "关联项目参数"))
|
||||
{
|
||||
transaction.Start();
|
||||
var cateSet = app.Create.NewCategorySet();
|
||||
cateSet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_Walls));
|
||||
cateSet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_Floors));
|
||||
cateSet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_Roofs));
|
||||
cateSet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_Ceilings));
|
||||
cateSet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_StairsRailing));
|
||||
cateSet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_Ramps));
|
||||
cateSet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_Stairs));
|
||||
cateSet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_DuctCurves));
|
||||
cateSet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_PipeCurves));
|
||||
cateSet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_Conduit));
|
||||
cateSet.Insert(Category.GetCategory(doc, BuiltInCategory.OST_CableTray));
|
||||
try
|
||||
{
|
||||
foreach (var parameterElement in parameterElements)
|
||||
{
|
||||
var exist = IsExistProjectParam(doc, parameterElement.Name, out var def, out ElementBinding binding);
|
||||
//存在但未关联到项目信息
|
||||
//if (!foundBinding.Categories.Contains(Category.GetCategory(doc, BuiltInCategory.OST_ProjectInformation)))
|
||||
//{
|
||||
// foundBinding.Categories.Insert(Category.GetCategory(doc, BuiltInCategory.OST_ProjectInformation));
|
||||
// doc.ParameterBindings.ReInsert(firstDef, foundBinding, BuiltInParameterGroup.PG_IDENTITY_DATA);
|
||||
//}
|
||||
if (exist && binding != null)
|
||||
{
|
||||
binding.Categories = cateSet;
|
||||
var res = doc.ParameterBindings.ReInsert(def, binding);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
}
|
||||
transaction.Commit();
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsResolveParameter(string paramName)
|
||||
{
|
||||
var array = paramName.Split('-');
|
||||
if (array.Length >= 3)
|
||||
{
|
||||
var prefix = array[0].Trim();
|
||||
if (prefix is ("ID" or "LC" or "ST" or "GJ" or "MF" or "AM" or "FM" or "TM" or "CM" or "TC"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/// <summary>
|
||||
/// 是否存在该项目参数
|
||||
/// </summary>
|
||||
/// <param name="doc"></param>
|
||||
/// <param name="paramName"></param>
|
||||
/// <param name="definition"></param>
|
||||
/// <param name="binding"></param>
|
||||
/// <returns></returns>
|
||||
public static bool IsExistProjectParam(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;
|
||||
|
||||
if (definition.Name == paramName)
|
||||
{
|
||||
isExist = true;
|
||||
binding = dep.Current as ElementBinding;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return isExist;
|
||||
}
|
||||
/// <summary>
|
||||
/// 查找共享参数元素的项目参数的定义和绑定
|
||||
/// </summary>
|
||||
/// <param name="doc"></param>
|
||||
/// <param name="paramName"></param>
|
||||
/// <param name="foundDefinition"></param>
|
||||
/// <param name="foundBinding"></param>
|
||||
/// <returns></returns>
|
||||
public static bool TryGetDefinitionBinding(Document doc, SharedParameterElement param, out Definition foundDefinition, out ElementBinding foundBinding, ParameterType pt = ParameterType.Text)
|
||||
{
|
||||
DefinitionBindingMap map = doc.ParameterBindings;
|
||||
var dep = map.ForwardIterator();
|
||||
foundDefinition = null;
|
||||
foundBinding = null;
|
||||
bool isExist = false;
|
||||
while (dep.MoveNext())
|
||||
{
|
||||
foundDefinition = dep.Key;
|
||||
if (foundDefinition is InternalDefinition internalDefinition && internalDefinition.Id == param.GetDefinition().Id && foundDefinition.Name == param.Name)
|
||||
{
|
||||
isExist = true;
|
||||
foundBinding = dep.Current as ElementBinding;
|
||||
}
|
||||
}
|
||||
return isExist;
|
||||
}
|
||||
/// <summary>
|
||||
/// 找到同名的项目参数的定义和绑定
|
||||
/// </summary>
|
||||
/// <param name="doc"></param>
|
||||
/// <param name="paramName"></param>
|
||||
/// <param name="definition"></param>
|
||||
/// <param name="binding"></param>
|
||||
/// <returns></returns>
|
||||
public static Dictionary<Definition, ElementBinding> GetDefinitionBindingDic(Document doc, string paramName)
|
||||
{
|
||||
Dictionary<Definition, ElementBinding> dic = new Dictionary<Definition, ElementBinding>();
|
||||
DefinitionBindingMap map = doc.ParameterBindings;
|
||||
var dep = map.ForwardIterator();
|
||||
ElementBinding binding = null;
|
||||
Definition definition = null;
|
||||
while (dep.MoveNext())
|
||||
{
|
||||
definition = dep.Key;
|
||||
|
||||
if (definition.Name == paramName)
|
||||
{
|
||||
binding = dep.Current as ElementBinding;
|
||||
dic.Add(definition, binding);
|
||||
}
|
||||
}
|
||||
|
||||
return dic;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user