博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Revit API找到风管穿过的墙(当前文档和链接文档)
阅读量:6159 次
发布时间:2019-06-21

本文共 3980 字,大约阅读时间需要 13 分钟。

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://tehfa.baihongyu.com/

你可能感兴趣的文章
实现WebSocket和WAMP协议的开源库WampSharp
查看>>
通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃
查看>>
BugkuCTF web3
查看>>
僵尸进程、孤儿进程
查看>>
413 Request Entity Too Large
查看>>
VCL组件之重要的公用属性
查看>>
异常球称重问题
查看>>
java 十六进制数的转换
查看>>
Divide and conquer method
查看>>
[sharepoint]根据用户名获取该用户的权限
查看>>
多线程模拟实现生产者/消费者模型 (借鉴)
查看>>
iOS开发需要哪些图片?
查看>>
命令行远程链接MySQL
查看>>
logstash向elasticsearch写入数据,如何指定多个数据template
查看>>
Node.js:Web模块、文件系统
查看>>
【转】灵活运用 SQL SERVER FOR XML PATH
查看>>
WCF角色服务
查看>>
常用sql001_partition by 以及 row_number()和 dense_rank()和rank()区别
查看>>
dev c++ Boost库的安装
查看>>
Windows10搭建PHP7开发环境
查看>>