【Revit 二次开发】与Revit内容有关(视图、族类型、族实例等)操作的相关方法
#region 与Revit内容有关(视图、族类型、族实例等)操作的相关方法
/// <summary>
/// 新建一个文件副本
/// </summary>
/// <param name="commandData">Revit项目文档</param>
public static void SaveFileCopy(ExternalCommandData commandData)
{
Document document = commandData.Application.ActiveUIDocument.Document;
string filePath = Path.GetDirectoryName(document.PathName);
string oldPath = "";
for (int i = 1; i < 100; i++)
{
string fileName = filePath + "\\" + document.Title.Replace(".rvt", "") + "副本" + i + ".rvt";
oldPath = filePath + "\\" + document.Title;
if (!File.Exists(fileName))
{
document.SaveAs(fileName);
break;
}
}
commandData.Application.OpenAndActivateDocument(oldPath);
document.Close();
}
/// <summary>
/// 获取过程中生成族的保存路径
/// </summary>
/// <param name="document">项目文档</param>
/// <param name="typeName">类型名称</param>
/// <returns></returns>
public static string GetFileSavePath(Document document, string typeName)
{
string fileSavePath = null;
if (string.IsNullOrEmpty(document.PathName))
{
MessageBox.Show("请先保存文件,然后在执行此操作!");
}
fileSavePath = Path.GetDirectoryName(document.PathName) + "\\" + document.Title.Replace(".rvt", "") +
"族模型\\" + typeName;
if (!Directory.Exists(fileSavePath))
{
Directory.CreateDirectory(fileSavePath);
}
return fileSavePath;
}
/// <summary>
/// 载入族文件到项目文档
/// </summary>
/// <param name="document">项目文档</param>
/// <param name="filPath">族文件路径</param>
public static void LoadFamily(Document document, string filPath)
{
using (Transaction loadFamily = new Transaction(document, "载入族"))
{
loadFamily.Start();
Family family = null;
MyFamilyLoadOptions options = new MyFamilyLoadOptions();
document.LoadFamily(filPath, options, out family);
loadFamily.Commit();
}
}
/// <summary>
/// 载入族文件到项目文档
/// </summary>
/// <param name="document">项目文档</param>
/// <param name="filPath">族文件路径</param>
public static Family LoadFamily1(Document document, string filPath)
{
Family family = null;
using (Transaction loadFamily = new Transaction(document, "载入族"))
{
loadFamily.Start();
MyFamilyLoadOptions options = new MyFamilyLoadOptions();
document.LoadFamily(filPath, options, out family);
loadFamily.Commit();
}
return family;
}
/// <summary>
/// 创建自定义任务对话框
/// </summary>
/// <param name="mainContent">主要内容</param>
/// <param name="commandLinkText1">命令连接文字1</param>
/// <param name="commandLinkText2">命令连接文字2</param>
/// <returns>对话结果</returns>
public static TaskDialogResult HintWinform(string mainContent,string commandLinkText1,string commandLinkText2)
{
TaskDialog mainDialog = new TaskDialog("提示");
mainDialog.MainInstruction = "提示";
mainDialog.MainContent = mainContent;
mainDialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink1, commandLinkText1);
mainDialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink2, commandLinkText2);
mainDialog.CommonButtons = TaskDialogCommonButtons.Close;
mainDialog.DefaultButton = TaskDialogResult.CommandLink1;
return mainDialog.Show();
}
/// <summary>
/// 生成图纸时对视口进行相应调整
/// </summary>
/// <param name="document">项目文档</param>
/// <param name="viewport">视口</param>
public static void EditViewport(Document document, Viewport viewport)
{
viewport.LookupParameter("视图比例").Set(100);
viewport.LookupParameter("注释裁剪").Set(1);
var elementType = Assist.GetElementType(document, viewport);
viewport.ChangeTypeId(elementType.Id);
}
/// <summary>
/// 获取视口类型
/// </summary>
/// <param name="document">项目文档</param>
/// <param name="viewport">视口</param>
/// <returns></returns>
public static ElementType GetElementType(Document document, Viewport viewport)
{
ElementType elementType = null;
ICollection<ElementId> collection = viewport.GetValidTypes();
foreach (ElementId element in collection)
{
ElementType elementt = document.GetElement(element) as ElementType;
if (elementt.Name.Contains("无标题"))
{
elementType = elementt;
}
}
return elementType;
}
/// <summary>
/// 删除名称包含关键字的物体
/// </summary>
/// <param name="document">项目文档</param>
/// <param name="type">物体类别</param>
/// <param name="category">物体类型</param>
/// <param name="name">关键字</param>
public static void DeleteObject(Document document, Type type, BuiltInCategory category, string name)
{
List<ElementId> elementIds = new List<ElementId>();
using (Transaction deleteObjects = new Transaction(document, "删除物体"))
{
deleteObjects.Start();
FilteredElementCollector collector = new FilteredElementCollector(document);
collector.OfClass(type).OfCategory(category);
foreach (Element element in collector)
{
if (element.Name.Contains(name))
{
elementIds.Add(element.Id);
}
}
for (int i = 0; i < elementIds.Count; i++)
{
document.Delete(elementIds[i]);
}
document.Regenerate();
deleteObjects.Commit();
}
}
/// <summary>
/// 删除单个构件
/// </summary>
/// <param name="document">revit项目文档</param>
/// <param name="familyInstance">构件</param>
public static void DeleteObject(Document document, FamilyInstance familyInstance)
{
using (Transaction deleteObject = new Transaction(document, "删除构件"))
{
deleteObject.Start();
document.Delete(familyInstance.Id);
deleteObject.Commit();
}
}
/// <summary>
/// 删除多个构件
/// </summary>
/// <param name="document">revit项目文档</param>
/// <param name="familyInstances">构件集合</param>
public static void DeleteObject(Document document, List<FamilyInstance> familyInstances)
{
using (Transaction deleteObject = new Transaction(document, "删除构件"))
{
deleteObject.Start();
for (int i = 0; i < familyInstances.Count; i++)
{
document.Delete(familyInstances[i].Id);
}
deleteObject.Commit();
}
}
/// <summary>
/// 隐藏东南西北立面图信息
/// </summary>
/// <param name="document">项目文档</param>
/// <param name="view">视图</param>
public static void HideView(Document document, Autodesk.Revit.DB.View view)
{
ICollection<ElementId> elementIds = new List<ElementId>();
FilteredElementCollector collector = new FilteredElementCollector(document);
collector.OfCategory(BuiltInCategory.OST_Viewers);
foreach (Element element in collector)
{
if (element.Name.Contains("东") || element.Name.Contains("南") || element.Name.Contains("西") ||
element.Name.Contains("北"))
{
elementIds.Add(element.Id);
}
}
FilteredElementCollector collector2 = new FilteredElementCollector(document);
collector2.OfClass(typeof (ElevationMarker)).OfCategory(BuiltInCategory.OST_Elev);
foreach (Element element in collector2)
{
ElevationMarker temp = element as ElevationMarker;
if (temp.Name.Contains("立面"))
{
elementIds.Add(element.Id);
}
}
if (elementIds.Count!=0)
{
view.HideElements(elementIds);
}
}
/// <summary>
/// 创建于标高对应的楼层平面
/// </summary>
/// <param name="document">项目文档</param>
/// <param name="levelName">平面名称</param>
/// <param name="levelHeight">平面标高</param>
/// <returns>楼层平面</returns>
public static ViewPlan GetViewPlan(Document document,string levelName,double levelHeight)
{
ViewPlan viewPlan = null;
using (Transaction tran = new Transaction(document, "创建楼层平面"))
{
tran.Start();
Level level = GetLevel(document, levelName, levelHeight);
ViewFamilyType viewFamilyType = Assist.GetViewFamilyType(document);
viewPlan = ViewPlan.Create(document, viewFamilyType.Id, level.Id);
HideView(document, viewPlan);
tran.Commit();
}
return viewPlan;
}
/// <summary>
/// 创建指定标高的楼层平面(若已存在,则删除)
/// </summary>
/// <param name="document">项目文档</param>
/// <param name="levelName">楼层平面名称</param>
/// <param name="levelHeight">楼层平面标高</param>
/// <returns></returns>
private static Level GetLevel(Document document, string levelName, double levelHeight)
{
Level level0 = null;
FilteredElementCollector collector = new FilteredElementCollector(document);
collector.OfClass(typeof (Level)).OfCategory(BuiltInCategory.OST_Levels);
foreach (Element element in collector)
{
Level temp = element as Level;
if (temp.Name == levelName)
{
level0 = temp;
}
}
if (level0 != null)
{
document.Delete(level0.Id);
}
Level level = Level.Create(document, levelHeight/304.8);
level.Name = levelName;
return level;
}
/// <summary>
/// 获取楼层平面类别
/// </summary>
/// <param name="document">项目文档</param>
/// <returns></returns>
public static ViewFamilyType GetViewFamilyType(Document document)
{
ViewFamilyType viewFamilyType = null;
FilteredElementCollector collector = new FilteredElementCollector(document);
collector.OfClass(typeof(ViewFamilyType));
foreach (Element element in collector)
{
ViewFamilyType temp = element as ViewFamilyType;
if (temp.Name.Contains("楼层平面"))
{
viewFamilyType = temp;
}
}
return viewFamilyType;
}
/// <summary>
/// 获得指定名称的族类型
/// </summary>
/// <param name="doc">项目文档</param>
/// <param name="name">名称</param>
/// <returns>族类型</returns>
public static FamilySymbol GetSymbolType(Document doc, string name)
{
FilteredElementIdIterator elementIdIterator =
new FilteredElementCollector(doc).OfClass(typeof (Family)).GetElementIdIterator();
elementIdIterator.Reset();
FamilySymbol result = null;
while (elementIdIterator.MoveNext())
{
Family family = doc.GetElement(elementIdIterator.Current) as Family;
foreach (ElementId current in family.GetFamilySymbolIds())
{
FamilySymbol familySymbol = doc.GetElement(current) as FamilySymbol;
if (familySymbol.Name.Contains(name))
{
result = familySymbol;
}
}
}
return result;
}
/// <summary>
/// 获取指定名称的族类型
/// </summary>
/// <param name="document">项目文档</param>
/// <param name="keyName">族类型关键字名称</param>
/// <returns>族类型</returns>
public static FamilySymbol GetFamilySymbol(Document document,string keyName)
{
FamilySymbol familySymbol = null;
FilteredElementCollector pipeCollector = new FilteredElementCollector(document);
pipeCollector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_GenericModel);
foreach (Element element in pipeCollector)
{
FamilySymbol fInstance = element as FamilySymbol;
if (fInstance.Name == keyName)
{
familySymbol = fInstance;
}
}
return familySymbol;
}
/// <summary>
/// 获取电缆接头族类型
/// </summary>
/// <param name="document"></param>
/// <returns></returns>
public static FamilySymbol GetFamilySymbol(Document document)
{
FamilySymbol familySymbol = null;
FilteredElementCollector filteredElementCollector =
new FilteredElementCollector(document).OfClass(typeof (FamilySymbol));
using (IEnumerator<Element> enumerator = filteredElementCollector.GetEnumerator())
{
while (enumerator.MoveNext())
{
FamilySymbol familySymbol2 = (FamilySymbol) enumerator.Current;
if (familySymbol2.Name.Contains("电缆接头") || familySymbol2.Name.Contains("CCN"))
{
familySymbol = familySymbol2;
break;
}
}
}
return familySymbol;
}
/// <summary>
/// 获得指定名称的族
/// </summary>
/// <param name="doc">项目文档</param>
/// <param name="name">名称</param>
/// <returns>族</returns>
public static Family GetFamilyType(Document doc, string name)
{
FilteredElementIdIterator elementIdIterator =
new FilteredElementCollector(doc).OfClass(typeof (Family)).GetElementIdIterator();
elementIdIterator.Reset();
Family result = null;
while (elementIdIterator.MoveNext())
{
Family family = doc.GetElement(elementIdIterator.Current) as Family;
if (family.Name == name)
{
result = family;
}
}
return result;
}
/// <summary>
/// 获取详图线样式
/// </summary>
/// <param name="document">项目文档</param>
/// <param name="line">详图线</param>
/// <param name="name">详图线名称</param>
/// <returns></returns>
public static Element GetDetailCurveStyle(Document document, DetailCurve line, string name)
{
Element style = null;
var styles = line.GetLineStyleIds();
foreach (ElementId styleId in styles)
{
var temp = document.GetElement(styleId);
if (temp.Name == name)
{
style = temp;
break;
}
}
return style;
}
/// <summary>
/// 获取模型线样式
/// </summary>
/// <param name="document">项目文档</param>
/// <param name="line">模型线</param>
/// <param name="name">模型线名称</param>
/// <returns></returns>
public static Element GetModelCurveStyle(Document document, ModelCurve line, string name)
{
Element style = null;
var styles = line.GetLineStyleIds();
foreach (ElementId styleId in styles)
{
var temp = document.GetElement(styleId);
if (temp.Name == name)
{
style = temp;
break;
}
}
return style;
}
/// <summary>
/// 获取文字注释型号
/// </summary>
/// <param name="document">项目文档</param>
/// <param name="typeName">文字注释类别名称关键字</param>
/// <returns></returns>
public static TextNoteType GetTextNoteType(Document document, string typeName)
{
TextNoteType textNoteType = null;
FilteredElementCollector collector = new FilteredElementCollector(document);
collector.OfClass(typeof (TextNoteType));
foreach (Element element in collector)
{
TextNoteType temp = element as TextNoteType;
if (temp.Name == typeName)
{
textNoteType = temp;
break;
}
}
return textNoteType;
}
/// <summary>
/// 获取指定名称的实例属性
/// </summary>
/// <param name="fi">实例</param>
/// <param name="parameterName">属性名称</param>
/// <returns>属性值</returns>
public static string GetParameterValue(FamilyInstance fi, string parameterName)
{
string result = " ";
Parameter parameter = fi.LookupParameter(parameterName);
if (parameter == null)
{
MessageBox.Show(@"ID为" + fi.Id.ToString() + "的构件中找不到名称为“" + parameterName + "”的属性!");
}
else
{
result = !string.IsNullOrEmpty(parameter.AsString()) ? parameter.AsString() : parameter.AsValueString();
}
if (result==null)
{
result = " ";
}
return result;
}
#endregion