/// <summary> /// 创建水管管径标注 /// </summary> [Transaction(TransactionMode.Manual)] public class CreatPipeDiameterTag : IExternalCommand { #region IExternalCommand Members public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIDocument uiDoc = commandData.Application.ActiveUIDocument; Document doc = uiDoc.Document; // 当前活动文档 Autodesk.Revit.DB.View view = uiDoc.ActiveView; // 当前活动视图 Selection sel = uiDoc.Selection; // 选择集 Transaction ts = new Transaction(doc, " 水管管径标记 "); try { ts.Start(); PipeSelectionFilter psf = new PipeSelectionFilter(doc); Reference refer = sel.PickObject(ObjectType.Element, psf, " 请选择要标注的水管: "); Pipe pipe = doc.GetElement(refer) as Pipe; if (pipe == null) { ts.Dispose(); TaskDialog.Show( " RevitMassge ", " 没有选中水管 "); return Result.Failed; } // Define tag mode and tag orientation for new tag TagMode tageMode = TagMode.TM_ADDBY_CATEGORY; TagOrientation tagOri = TagOrientation.Horizontal; // Add the tag to the middle of duct LocationCurve locCurve = pipe.Location as LocationCurve; XYZ pipeMid = locCurve.Curve.Evaluate( 0.275, true); IndependentTag tag = doc.Create.NewTag(view, pipe, false, tageMode, tagOri, pipeMid); // 遍历类型 FilteredElementCollector filterColl = GetElementsOfType(doc, typeof(FamilySymbol), BuiltInCategory.OST_PipeTags); // WinFormTools.MsgBox(filterColl.ToElements().Count.ToString()); int elId = 0; foreach (Element el in filterColl.ToElements()) { if (el.Name == " 管道尺寸标记 ") elId = el.Id.IntegerValue; } tag.ChangeTypeId( new ElementId(elId)); ElementId eId = null; if (tag == null) { ts.Dispose(); TaskDialog.Show( " RevitMassge ", " 创建标注失败! "); return Result.Failed; } ICollection<ElementId> eSet = tag.GetValidTypes(); foreach (ElementId item in eSet) { if (item.IntegerValue == 532753) { eId = item; } } tag = doc.get_Element(eId) as IndependentTag; } catch (Exception) { ts.Dispose(); return Result.Cancelled; } ts.Commit(); return Result.Succeeded; } FilteredElementCollector GetElementsOfType(Document doc, Type type, BuiltInCategory bic) { FilteredElementCollector collector = new FilteredElementCollector(doc); collector.OfCategory(bic); collector.OfClass(type); return collector; } #endregion } /// <summary> /// 水管选择过滤器 /// </summary> public class PipeSelectionFilter : ISelectionFilter { #region ISelectionFilter Members Document doc = null; public PipeSelectionFilter(Document document) { doc = document; } public bool AllowElement(Element elem) { return elem is Pipe; } public bool AllowReference(Reference reference, XYZ position) { return doc.GetElement(reference) is Pipe; } #endregion }