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(, 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

Revit API找到风管穿过的墙(当前文档和链接文档)的更多相关文章

  1. Openstack api 学习文档 & restclient使用文档

    Openstack api 学习文档 & restclient使用文档 转载请注明http://www.cnblogs.com/juandx/p/4943409.html 这篇文档总结一下我初 ...

  2. API接口文档中将Swagger文档转Word 文档

    一般的开发工作,尤其是API接口的开发工作,首先要有开发文档,接口说明文档 ok,后来开发完毕了 和页面联调,或者是和第三方联调的时候, 这个时候,SA systeam admin 就会开始直接让开发 ...

  3. 一个非常适合IT团队的在线API文档、技术文档工具 (ShowDoc)

    在逸橙呆了不到两年,开发时后端都有开发接口API,来到数库,好多后端开发和前端沟通是还是发doc文档,很不方便,我向cto反应,自己找到这个,老乡田雷(php,隔壁村的)也用过,可能某些原因选择其他的 ...

  4. [工具推荐]制作基于Dash的本地文档方便搜索文档api和内容

    [版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 最近在看es的文档,发现查起api来真的很麻烦,很多现在开源的文档都没有查询 ...

  5. Revit API改变风管及管件尺寸

    start , , )) < , , -)) < , dHeight = ;             ConnectorSetIterator csi = fi.MEPModel.Conn ...

  6. Revit API移动风管

    移动风管曲线就可以移动风管 , , ));//向上移动3         ts.Commit();         return Result.Succeeded;     } } url:http: ...

  7. C# : 操作Word文件的API - (将C# source中的xml注释转换成word文档)

    这篇博客将要讨论的是关于: 如何从C#的source以及注释, 生成一份Word格式的关于各个类,函数以及成员变量的说明文档. 他的大背景如下...... 最近的一个项目使用C#, 分N个模块, 在项 ...

  8. Revit API根据链接文件开洞

    开洞信息数据: ]);             ;                     ;                     ;                     ;          ...

  9. 关于Revit API修改元素参数的问题?

    >ADN: DEVR3894  >ADN service level: Professional  >产品:Revit MEP 2012  >版本:2012  >语言:中 ...

随机推荐

  1. Python 入门基础11 --函数基础4 迭代器、生成器、枚举类型

    今日目录: 1.迭代器 2.可迭代对象 3.迭代器对象 4.for循环迭代器 5.生成器 6.枚举对象 一.迭代器: 循环反馈的容器(集合类型) 每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的 ...

  2. deeplearning.ai学习seq2seq模型

    一.seq2seq架构图 seq2seq模型左边绿色的部分我们称之为encoder,左边的循环输入最终生成一个固定向量作为右侧的输入,右边紫色的部分我们称之为decoder.单看右侧这个结构跟我们之前 ...

  3. windows常用设置

    1.截图   A.QQ打开,ctrl + Alt + A   B. cmd 输入  截图工具 2.录制windows操作步骤    命令行输入:psr.exe

  4. 010_MAC下权限问题的那些事

    一. arun:bin arunyang$ sh catalina.sh start           #启动tomcat报一堆的没有权限~~~~(>_<)~~~~ 二.解决如下 aru ...

  5. http://blog.csdn.net/u011001723/article/details/45621027

    http://blog.csdn.net/u011001723/article/details/45621027 scp  + 脚本 config 外置 http://www.cnblogs.com/ ...

  6. Python_oldboy_常用模块(九)

    本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & pickle shelve xml处理 yaml处理 configpar ...

  7. webstorm2017添加vue模板

  8. Explain之key_len长度计算

    以前我很好奇通过执行计划Explain去分析SQL的时候看到的key_len值有时很小,有时看到很大,那时也不知道它是怎么算出来的,现在终于搞懂了,嘻.因为网上对key_len的长度的计算的资料也很少 ...

  9. Oracle学习笔记:使用replace、regexp_replace实现字符替换、姓名脱敏

    在数据库中难免会遇到需要对数据进行脱敏的操作,无论是姓名,还是身份证号. 最近遇到一个需求,需要对姓名进行脱敏: 姓名长度为2,替换为姓+*: 姓名长度为3,替换中间字符为*: 姓名长度为4,替换第3 ...

  10. 1044-Access denied for user 'root'@'%' to database 'lc_db'

    远程登录Linux中的MySQL时,如果直接在工具中创建数据库时,有可能出现下面图中这样的错误: 这种错误是在远程登录时造成的,如果直接在Linux中本地操作没有问题(在Linux中的MySQL下,通 ...