感觉这个函数不错。通过这种方式寻找元素经常需要用到。


感觉这个函数不错。通过这种方式寻找元素经常需要用到。

//封装一个通用函数“过名称找元素”

[TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]

public class cmdFindElementByName : IExternalCommand

{

    //通过类型与名称找Element

    Element findElement(Document _rvtDoc, Type targetType, string targetName)

    {

        // get the elements of the given type

        //

        FilteredElementCollector collector = new FilteredElementCollector(_rvtDoc);

        collector.WherePasses(new ElementClassFilter(targetType));


        // parse the collection for the given name

        // using LINQ query here. 

        // 

        var targetElems = from element in collector where element.Name.Equals(targetName) select element;

        List<Element> elems = targetElems.ToList<Element>();


        if (elems.Count > 0)

        {  // we should have only one with the given name. 

            return elems[0];

        }


        // cannot find it.

        return null;

    }

    public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)

    {

        UIApplication app = commandData.Application;

        Document doc = app.ActiveUIDocument.Document;

        Selection sel = app.ActiveUIDocument.Selection;


        View pViewPlan = (View)findElement(doc,typeof(ViewPlan), "Lower Ref. Level");

        ReferencePlane refFront = (ReferencePlane)findElement(doc, typeof(ReferencePlane), "Front");

        Level lowerLevel = findElement(doc,typeof(Level), "Lower Ref. Level") as Level;

        Material pMat = findElement(doc, typeof(Material), "Glass") as Material;

        if (refFront != null)

            TaskDialog.Show("info", refFront.Name.ToString());



        return Result.Succeeded;

    }

}