public class SharedParameterInfo
{
public Guid inGuid;
public string GroupName;
public string OptionName;
public ParameterType OptionType;
public string OptionDescription;
}
public class SharedParameterTool
{
public static void CreateSharedParamterForIds(Document doc,List<ElementId> diVec, SharedParameterInfo info)
{
var set=GetCateSet(doc, diVec);
createSharedParameter(doc,set,info);
}
private static CategorySet GetCateSet(Document doc,List<ElementId> idVec)
{
CategorySet set = new CategorySet();
foreach (var item in idVec)
{
var curCate = doc.GetElement(item)?.Category;
if (curCate == null) continue;
set.Insert(curCate);
}
return set;
}
private static void createSharedParameter(Document doc,CategorySet set,
SharedParameterInfo paramInfo)
{
var paramGuid = paramInfo.inGuid;// new Guid("283d7711-6c4a-471f-ae21-dca9bd4a7b0a");
//2dd0c56d-804e-45bb-b398-a954deb5dd42
String tempPath = System.IO.Path.GetTempPath();
String path = String.Format("{0}//{1}.txt", tempPath, paramGuid.ToString());
if (File.Exists(path))
{
File.Delete(path);
}
System.IO.FileStream fileStream = System.IO.File.Create(path);
fileStream.Close();
doc.Application.SharedParametersFilename = path;
try
{
DefinitionFile definitionFile = doc.Application.OpenSharedParameterFile();
DefinitionGroup group = definitionFile.Groups.Create(paramInfo.GroupName);
ExternalDefinitionCreationOptions option = new ExternalDefinitionCreationOptions(paramInfo.OptionName, paramInfo.OptionType);
option.GUID = paramGuid;// new Guid(GlobalConfig.GetInstance().SharedParameterGUID);
option.UserModifiable = false;
option.Description = paramInfo.OptionDescription;
Definition definition = group.Definitions.Create(option);
BindingMap bindingMap = doc.ParameterBindings;
if (bindingMap.Contains(definition))
{
bindingMap.Remove(definition);
}
InstanceBinding instanceBinding = doc.Application.Create.NewInstanceBinding(set);
bindingMap.Insert(definition, instanceBinding, BuiltInParameterGroup.PG_DATA);
}
catch (System.Exception ex)
{
}
doc.Application.SharedParametersFilename = String.Empty;
}
}