zoukankan      html  css  js  c++  java
  • Revit API找到风管穿过的墙(当前文档和链接文档)

    start
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    public class cmdDuctWall : IExternalCommand
    {
        public Result Execute(ExternalCommandData cmdData, ref string msg, ElementSet elements)
        {
            UIApplication uiApp = cmdData.Application;
            UIDocument uiDoc = cmdData.Application.ActiveUIDocument;
            Document doc = uiDoc.Document;
            Selection sel = uiDoc.Selection;

            Transaction ts = new Transaction(uiDoc.Document, "delete");
            ts.Start();
            //加载链接文件
            FilteredElementCollector collector = new FilteredElementCollector(doc);//
            collector.OfClass(typeof(Instance)).OfCategory(BuiltInCategory.OST_RvtLinks);//RevitLinkType
            List<string> listPath = GetLinkFilePaths(doc);

            Duct duct = doc.GetElement(sel.PickObject(ObjectType.Element, "duct")) as Duct;
            foreach (Element elDoc in collector)
            {
                Instance ins = elDoc as Instance;

                if (ins != null)
                {
                    Transform transForm = ins.GetTransform();
                    string strKey = elDoc.Name.Substring(0, elDoc.Name.IndexOf(".rvt"));//找到链接文件名称
                    string strPath = GetLinkPath(listPath, strKey);
                    Document docLink = uiApp.Application.OpenDocumentFile(strPath);

                    List<Wall> listWall = FindDuctWall(doc, duct, docLink, ins.GetTransform().Origin);
                    TaskDialog.Show("count", listWall.Count.ToString());
                    List<Wall> listWall1 = FindDuctWall(doc, duct);
                    TaskDialog.Show("count", listWall1.Count.ToString());
                }
            }

            ts.Commit();

            return Result.Succeeded;
        }
        /// <summary>
        
    /// 找到当前文档穿过的墙
        
    /// </summary>
        
    /// <param name="doc"></param>
        
    /// <param name="duct"></param>
        
    /// <returns></returns>
        public List<Wall> FindDuctWall(Document doc, Duct duct)
        {
            List<Wall> listWall = new List<Wall>();
            //找到outLine
            BoundingBoxXYZ bb = duct.get_BoundingBox(doc.ActiveView);
            Outline outline = new Outline(bb.Min, bb.Max);
            //WinFormTools.MsgBox(bb.Min + "|" + bb.Max);
            
    //
            FilteredElementCollector collector = new FilteredElementCollector(doc);
            BoundingBoxIntersectsFilter invertFilter = new BoundingBoxIntersectsFilter(outline, false);
            IList<Element> noIntersectWalls = collector.OfClass(typeof(Wall)).WherePasses(invertFilter).ToElements();
            foreach (Element el in noIntersectWalls)
            {
                Wall wall = el as Wall;
                if (wall != null)
                    listWall.Add(wall);
            }
            return listWall;
        }
        /// <summary>
        
    /// 找到穿过链接文件的墙
        
    /// </summary>
        
    /// <param name="doc"></param>
        
    /// <param name="duct"></param>
        
    /// <param name="docLink"></param>
        
    /// <param name="xyz">依稀量</param>
        
    /// <returns></returns>
        public List<Wall> FindDuctWall(Document doc, Duct duct, Document docLink, XYZ xyz)
        {
            List<Wall> listWall = new List<Wall>();

            //找到outLine
            BoundingBoxXYZ bb = duct.get_BoundingBox(doc.ActiveView);
            Outline outline = new Outline(bb.Min - xyz, bb.Max - xyz);
            //
            FilteredElementCollector collector = new FilteredElementCollector(docLink);
            BoundingBoxIntersectsFilter invertFilter = new BoundingBoxIntersectsFilter(outline, false);
            IList<Element> noIntersectWalls = collector.OfClass(typeof(Wall)).WherePasses(invertFilter).ToElements();
            foreach (Element el in noIntersectWalls)
            {
                Wall wall = el as Wall;
                if (wall != null)
                    listWall.Add(wall);
            }
            return listWall;
        }
        /// <summary>
        
    /// 取得链接文件路径
        
    /// </summary>
        
    /// <param name="doc"></param>
        
    /// <returns></returns>
        public List<string> GetLinkFilePaths(Document doc)
        {
            List<string> listPath = new List<string>();
            foreach (ElementId elId in ExternalFileUtils.GetAllExternalFileReferences(doc))
            {
                if (doc.get_Element(elId).IsExternalFileReference())
                {
                    ExternalFileReference fileRef = doc.get_Element(elId).GetExternalFileReference();
                    if (ExternalFileReferenceType.RevitLink == fileRef.ExternalFileReferenceType)
                        listPath.Add(ModelPathUtils.ConvertModelPathToUserVisiblePath(fileRef.GetAbsolutePath()));
                }
            }
            return listPath;
        }
        /// <summary>
        
    /// 根据链接文件名称找到对应链接路径,模糊匹配,待改进
        
    /// </summary>
        
    /// <param name="listPath"></param>
        
    /// <param name="strKey"></param>
        
    /// <returns></returns>
        public string GetLinkPath(List<string> listPath, string strKey)
        {
            foreach (string strPath in listPath)
            {
                if (strPath.Contains(strKey))
                    return strPath;
            }
            return "";
        }
    }
    url:http://greatverve.cnblogs.com/p/revit-api-ductWall.html
  • 相关阅读:
    java几种数据的默认扩容机制
    web.xml配置详解
    Bootstrap文件上传组件
    JAVA四则运算算法
    Oracle 和 mysql 的批量操作Sql语句 的区别
    JAVA使用ItextPDF
    c# 状态机实现
    c++11模拟boost元占位符placeholder
    vs2012 函数参数内存对齐引发编译错误
    windows下matplotlib编译安装备忘
  • 原文地址:https://www.cnblogs.com/greatverve/p/revit-api-ductWall.html
Copyright © 2011-2022 走看看