/// <summary>
/// 共享参数服务
/// </summary>
class SharedParameterService
{
Document _document = null;
readonly string ShareParamFileName = "visual_ShareParam.txt";
/// <summary>
///
/// </summary>
/// <param name="document"></param>
/// <param name="shareParamFileName">
/// 共享文件存储的名称
/// </param>
public SharedParameterService(Document document, string shareParamFileName = "")
{
System.Diagnostics.Debug.Assert(document != null);
_document = document;
if (!string.IsNullOrEmpty(shareParamFileName))
{
if (!shareParamFileName.ToLower().EndsWith(".txt"))
shareParamFileName += ".txt";
ShareParamFileName = shareParamFileName;
}
}
/// <summary>
/// 类别绑定共享参数
/// </summary>
/// <param name="cates">类别集合</param>
/// <param name="paramNames">共享参数名称集合</param>
/// <param name="groupName">分组名称</param>
/// <param name="paramType">参数类型</param>
/// <param name="groupType">分组类型</param>
/// <param name="isVisible">是否可见</param>
/// <param name="isReadonly">是否只读</param>
public void BindShareParam(
IEnumerable<BuiltInCategory> cates,
IEnumerable<string> paramNames,
string groupName,
ParameterType paramType = ParameterType.Text,
BuiltInParameterGroup groupType = BuiltInParameterGroup.PG_DATA,
bool isVisible = true,
bool isReadonly = false)
{
System.Diagnostics.Debug.Assert(cates != null);
System.Diagnostics.Debug.Assert(paramNames != null);
System.Diagnostics.Debug.Assert(!string.IsNullOrEmpty(groupName));
var group = GetGroup(groupName);
using (var trans = new Transaction(_document, "CreateShareParam"))
{
trans.Start();
//如果找到更新数据
var paramDefs = paramNames.Select(o => CreateParamDefinition(group, o, paramType, isVisible, isReadonly));
BindParam(cates, groupType, paramDefs);
trans.Commit();
}
}
/// <summary>
/// 类别绑定共享参数
/// </summary>
/// <param name="cates">类别集合</param>
/// <param name="paramName">共享参数名称</param>
/// <param name="groupName">分组名称</param>
/// <param name="paramType">参数类型</param>
/// <param name="groupType">分组类型</param>
/// <param name="isVisible">是否可见</param>
/// <param name="isReadonly">是否只读</param>
public void BindShareParam(
IEnumerable<BuiltInCategory> cates,
string paramName,
string groupName,
ParameterType paramType = ParameterType.Text,
BuiltInParameterGroup groupType = BuiltInParameterGroup.PG_DATA,
bool isVisible = true,
bool isReadonly = false)
{
System.Diagnostics.Debug.Assert(cates != null);
System.Diagnostics.Debug.Assert(!string.IsNullOrEmpty(paramName));
System.Diagnostics.Debug.Assert(!string.IsNullOrEmpty(groupName));
BindShareParam(cates, new List<string> { paramName }, groupName, paramType, groupType, isVisible, isReadonly);
}
public void RemoveShareParam(IEnumerable<BuiltInCategory> cates, IEnumerable<string> paramNames)
{
System.Diagnostics.Debug.Assert(cates != null);
System.Diagnostics.Debug.Assert(paramNames != null);
var definitionFile = GetOrCreateSharedParamsFile(_document.Application);
var paramsList = paramNames.ToList();
var findList = new List<Definition>();
foreach (var group in definitionFile.Groups)
foreach (var item in group.Definitions)
if (paramsList.Exists(o => o == item.Name))
findList.Add(item);
var cateSet = ToCategory(cates);
using (var trans = new Transaction(_document, "RemoveShareParam"))
{
trans.Start();
findList.ForEach(o => RemoveShareParam(cateSet, o));
trans.Commit();
}
}
public void RemoveShareParam(IEnumerable<BuiltInCategory> cates, string paramName)
{
System.Diagnostics.Debug.Assert(cates != null);
System.Diagnostics.Debug.Assert(!string.IsNullOrEmpty(paramName));
RemoveShareParam(cates, new List<string>() { paramName });
}
void RemoveShareParam(CategorySet cateSet, Definition definition)
{
if (definition != null)
{
var binding = _document.ParameterBindings.get_Item(definition);
var insBinding = binding as InstanceBinding;
if (insBinding != null)
{
foreach (Category cate in cateSet)
if (insBinding.Categories.Contains(cate))
insBinding.Categories.Erase(cate);
if (insBinding.Categories.Size > 0)
_document.ParameterBindings.ReInsert(definition, insBinding, definition.ParameterGroup);
else
_document.ParameterBindings.Remove(definition);
}
}
}
DefinitionGroup GetGroup(string groupName)
{
var definitionFile = GetOrCreateSharedParamsFile(_document.Application);
return GetOrCreateSharedParamsGroup(definitionFile, groupName);
}
DefinitionFile GetOrCreateSharedParamsFile(Autodesk.Revit.ApplicationServices.Application app)
{
var asm = System.Reflection.Assembly.GetExecutingAssembly();
var path = Path.GetDirectoryName(asm.Location);
path = Path.Combine(path, ShareParamFileName);
if (!File.Exists(path))
using (var fs = new FileStream(path, FileMode.Create))
using (var sw = new StreamWriter(fs))
{
sw.Close();
fs.Close();
}
app.SharedParametersFilename = path;
DefinitionFile file = app.OpenSharedParameterFile();
if (file == null)
throw new Exception(string.Format("打开共享文件失败,{0}", path));
return file;
}
DefinitionGroup GetOrCreateSharedParamsGroup(DefinitionFile file, string groupName)
{
var definGroup = file.Groups.get_Item(groupName);
if (null == definGroup)
definGroup = file.Groups.Create(groupName);
if (definGroup == null)
throw new Exception(string.Format("读取或创建共享参数组失败。groupName: {0}", groupName));
return definGroup;
}
Tuple<Definition, bool> CreateParamDefinition(
DefinitionGroup group,
string paramName,
ParameterType paramType,
bool isVisible,
bool isReadonly)
{
var definition = group.Definitions.get_Item(paramName);
bool exist = definition != null;
//存在就不管了
if (!exist)
{
#if REVIT2014 || REVIT2015
var opt = new ExternalDefinitonCreationOptions(paramName, paramType);
opt.UserModifiable = !isReadonly;
opt.Visible = isVisible;
definition = group.Definitions.Create(opt);
if (definition == null)
throw new Exception(string.Format("创建参数失败! {0}", paramName));
#else
var opt = new ExternalDefinitionCreationOptions(paramName, paramType);
opt.UserModifiable = !isReadonly;
opt.Visible = isVisible;
definition = group.Definitions.Create(opt);
if (definition == null)
throw new Exception(string.Format("创建参数失败! {0}", paramName));
#endif
}
return new Tuple<Definition, bool>(definition, exist);
}
void BindParam(IEnumerable<BuiltInCategory> cates, BuiltInParameterGroup groupType, IEnumerable<Tuple<Definition, bool>> definitions)
{
var cateSet = ToCategory(cates);
foreach (var def in definitions)
{
var insBinding = _document.ParameterBindings.get_Item(def.Item1) as InstanceBinding;
bool insBindingExist = insBinding != null;
if (!insBindingExist)
insBinding = _document.Application.Create.NewInstanceBinding(cateSet);
else
foreach (Category cate in cateSet)
if (!insBinding.Categories.Contains(cate))
insBinding.Categories.Insert(cate);
bool ret = def.Item2 && insBindingExist ?
_document.ParameterBindings.ReInsert(def.Item1, insBinding, groupType) :
_document.ParameterBindings.Insert(def.Item1, insBinding, groupType);
if (!ret)
throw new Exception(string.Format("绑定参数 \"{0}\" 失败!", def.Item1.Name));
}
}
CategorySet ToCategory(IEnumerable<BuiltInCategory> cates)
{
var cateSet = new CategorySet();
//如果没有找到Category对象, 抛异常
foreach (var cate in cates.Select(o => _document.Settings.Categories.get_Item(o)))
cateSet.Insert(cate);
return cateSet;
}
}
可以用上述接口创建只读的共享参数,注意:上诉接口创建的是实例的共享参数,稍稍改改就能创建类型的共享参数了。