Revit API根据链接文件开洞
开洞信息数据:
<?xml version="1.0" encoding="utf-8"?>
<Openings>
<Opening WallId="618644">
<PT1 X="-46.4673223917839" Y="25.9434404529416" Z="9.8753280839895" />
<PT2 X="-46.4673223917839" Y="24.2374037075347" Z="8.16929133858268" />
</Opening>
<Opening WallId="618699">
<PT1 X="28.3358272145153" Y="24.2374037075345" Z="9.8753280839895" />
<PT2 X="28.3358272145153" Y="25.9434404529413" Z="8.16929133858268" />
</Opening>
<Opening WallId="618722">
<PT1 X="-10.7125018356066" Y="57.0806634229704" Z="9.8753280839895" />
<PT2 X="-12.4185385810134" Y="57.0806634229704" Z="8.16929133858268" />
</Opening>
<Opening WallId="618662">
<PT1 X="-20.8620650191645" Y="-1.31828670826329" Z="9.8753280839895" />
<PT2 X="-19.1560282737577" Y="-1.31828670826329" Z="8.16929133858268" />
</Opening>
</Openings>
start
//根据导出开洞信息开洞
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class cmdOpening : IExternalCommand
{
public Result Execute(ExternalCommandData cmdData, ref string msg, ElementSet elements)
{
UIDocument uiDoc = cmdData.Application.ActiveUIDocument;
Document doc = uiDoc.Document;
Selection sel = uiDoc.Selection; Transaction ts = new Transaction(doc, "http://revit.5d6d.com");
ts.Start(); string strPath = @"C:\Users\HongYe\Desktop\OpeningInfo.xml";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(strPath); foreach (XmlNode node in xmlDoc.DocumentElement.ChildNodes)
{
//;
Wall wall = doc.get_Element(new ElementId(Convert.ToInt32(node.Attributes["WallId"].Value))) as Wall;
XmlNode nodePt1 = node.SelectSingleNode("PT1");
XYZ pt1 = new XYZ(double.Parse(nodePt1.Attributes["X"].Value), double.Parse(nodePt1.Attributes["Y"].Value), double.Parse(nodePt1.Attributes["Z"].Value));
XmlNode nodePt2 = node.SelectSingleNode("PT2");
XYZ pt2 = new XYZ(double.Parse(nodePt2.Attributes["X"].Value), double.Parse(nodePt2.Attributes["Y"].Value), double.Parse(nodePt2.Attributes["Z"].Value));
doc.Create.NewOpening(wall, pt1, pt2);
} ts.Commit(); return Result.Succeeded;
}
}
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
//导出开洞信息
public class cmd : IExternalCommand
{
/// <summary>
/// 找到链接文档中与风管相交的墙
/// </summary>
/// <param name="doc"></param>
/// <param name="duct"></param>
/// <returns></returns>
public static 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);
//
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;
}
public Result Execute(ExternalCommandData cmdData, ref string msg, ElementSet elements)
{
UIDocument uiDoc = cmdData.Application.ActiveUIDocument;
UIApplication uiApp = cmdData.Application;
Document doc = uiDoc.Document;
Selection selection = uiDoc.Selection; try
{
Transaction ts = new Transaction(doc, "http://revit.5d6d.com");
ts.Start(); string strPath = @"C:\Users\HongYe\Desktop\OpeningInfo.xml";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(strPath); List<string> listPath = GetLinkFilePaths(doc);
Document docLink = uiApp.Application.OpenDocumentFile(listPath[]);
//
FilteredElementCollector collIns = new FilteredElementCollector(doc);//
collIns.OfClass(typeof(Instance)).OfCategory(BuiltInCategory.OST_RvtLinks);//RevitLinkType
Transform transForm = null;
foreach (Element elDoc in collIns)
{
Instance ins = elDoc as Instance;
if (ins != null)
{
transForm = ins.GetTransform();
}
}
//风管
FilteredElementCollector collDuct = new FilteredElementCollector(doc);
collDuct.OfClass(typeof(Duct)).OfCategory(BuiltInCategory.OST_DuctCurves);
foreach (Element elDuct in collDuct)
{
Duct duct = elDuct as Duct;
List<Wall> listWall = FindDuctWall(docLink, duct);//找到链接文档中与风管相交的墙
foreach (Wall wall in listWall)
{
//求面和线的交点
Face face = FindWallFace(wall);
Curve curve = FindDuctCurve(duct);
XYZ xyz = FindFaceCurve(face, curve);
//墙线的向量
XYZ wallVector = FindWallVector(wall); //找到风管的宽和高
double dWidth = GetDuctWidth(duct);
double dHeigh = GetDuctHeight(duct); int iUp = ;
int iDown = ;
int iLeft = ;
int iRight = ;
//左上角
XYZ pt1 = xyz + new XYZ(, , ) * (dHeigh / + iUp) / 304.8;
pt1 = pt1 - wallVector.Normalize() * (dWidth / + iLeft) / 304.8;
pt1 = pt1 - transForm.Origin;
//右下角
XYZ pt2 = xyz + new XYZ(, , -) * (dHeigh / + iDown) / 304.8;
pt2 = pt2 + wallVector.Normalize() * (dWidth / + iRight) / 304.8;
pt2 = pt2 - transForm.Origin;
//开洞
//doc.Create.NewOpening(wall, pt1, pt2);
//wall.Id.IntegerValue.ToString();
//pt1.X;
XmlElement xmlEl = xmlDoc.CreateElement("Opening");
xmlEl.SetAttribute("WallId", wall.Id.IntegerValue.ToString());
XmlElement elPt1 = xmlDoc.CreateElement("PT1");
elPt1.SetAttribute("X", pt1.X.ToString());
elPt1.SetAttribute("Y", pt1.Y.ToString());
elPt1.SetAttribute("Z", pt1.Z.ToString());
xmlEl.AppendChild(elPt1);
XmlElement elPt2 = xmlDoc.CreateElement("PT2");
elPt2.SetAttribute("X", pt2.X.ToString());
elPt2.SetAttribute("Y", pt2.Y.ToString());
elPt2.SetAttribute("Z", pt2.Z.ToString());
xmlEl.AppendChild(elPt2);
xmlDoc.DocumentElement.AppendChild(xmlEl);
}
} ts.Commit();
xmlDoc.Save(strPath);
}
catch (Exception ex)
{
WinFormTools.MsgBox(ex.ToString());
} return Result.Succeeded;
}
//找到风管宽度
public static double GetDuctWidth(Duct duct)
{
double dWidth = ;
foreach (Parameter p in duct.Parameters)
{
if (p.Definition.Name == "宽度")
{
dWidth = double.Parse(p.AsValueString());
break;
}
}
return dWidth;
}
//找到风管高度
public static double GetDuctHeight(Duct duct)
{
double dHeigh = ;
foreach (Parameter p in duct.Parameters)
{
if (p.Definition.Name == "高度")
{
dHeigh = double.Parse(p.AsValueString());
break;
}
}
return dHeigh;
}
/// <summary>
/// 找到墙线的向量
/// </summary>
/// <param name="wall"></param>
/// <returns></returns>
public static XYZ FindWallVector(Wall wall)
{
LocationCurve lCurve = wall.Location as LocationCurve;
XYZ xyz = lCurve.Curve.get_EndPoint() - lCurve.Curve.get_EndPoint();
return xyz;
}
/// <summary>
/// 求线和面的交点
/// </summary>
/// <param name="face"></param>
/// <param name="curve"></param>
/// <returns></returns>
public static XYZ FindFaceCurve(Face face, Curve curve)
{
//求交点
IntersectionResultArray intersectionR = new IntersectionResultArray();//交点集合
SetComparisonResult comparisonR;//Comparison比较
comparisonR = face.Intersect(curve, out intersectionR);
XYZ intersectionResult = null;//交点坐标
if (SetComparisonResult.Disjoint != comparisonR)//Disjoint不交
{
if (!intersectionR.IsEmpty)
{
intersectionResult = intersectionR.get_Item().XYZPoint;
}
}
return intersectionResult;
}
/// <summary>
/// 找到风管对应的曲线
/// </summary>
/// <param name="duct"></param>
/// <returns></returns>
public Curve FindDuctCurve(Duct duct)
{
//得到风管曲线
IList<XYZ> list = new List<XYZ>();
ConnectorSetIterator csi = duct.ConnectorManager.Connectors.ForwardIterator();
while (csi.MoveNext())
{
Connector conn = csi.Current as Connector;
list.Add(conn.Origin);
}
Curve curve = Line.get_Bound(list.ElementAt(), list.ElementAt()) as Curve;
curve.MakeUnbound();
return curve;
}
/// <summary>
/// 找到墙的正面
/// </summary>
/// <param name="wall"></param>
/// <returns></returns>
public Face FindWallFace(Wall wall)
{
Face normalFace = null;
//
Options opt = new Options();
opt.ComputeReferences = true;
opt.DetailLevel = Autodesk.Revit.DB.DetailLevels.Medium; //
GeometryElement e = wall.get_Geometry(opt);
/*下版改进
IEnumerator<GeometryObject> enm = e.GetEnumerator();
while (enm.MoveNext())
{
Solid solid = enm.Current as Solid;
}*/
foreach (GeometryObject obj in e.Objects)//待改2013
{
Solid solid = obj as Solid;
if (solid != null && solid.Faces.Size > )
{
foreach (Face face in solid.Faces)
{
PlanarFace pf = face as PlanarFace;
if (pf != null)
{
if (pf.Normal.AngleTo(wall.Orientation) < 0.01)//数值在0到PI之间
{
normalFace = face;
}
}
}
}
}
return normalFace;
}
/// <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>
private string GetPath(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-opening-info.html
Revit API根据链接文件开洞的更多相关文章
- Revit API修改链接文件房间边界
start [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] );//设置房间边界 ...
- Revit API找到风管穿过的墙(当前文档和链接文档)
start [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] public class c ...
- Expo大作战(三十八)--expo sdk api之 FileSystem(文件操作系统)
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- Revit API 加载族并生成实例图元
在Revit API中加载族可以使用Doc.LoadFamily方法,传入要加载的族文件路径名,但是这种方式有一种缺点,就是如果族文件在当前工程中没有加载的话则返回成功,如果已经加载过,则返回失败,也 ...
- 纯前端下载pdf链接文件,而不是打开预览的解决方案
纯前端下载pdf链接文件,而不是打开预览的解决方案 一,介绍与需求 1.1,介绍 XMLHttpRequest 用于在后台与服务器交换数据.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行 ...
- 详解:基于WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器功能
文件同步传输工具比较多,传输的方式也比较多,比如:FTP.共享.HTTP等,我这里要讲的就是基于HTTP协议的WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器这样的一个工具(简称:一 ...
- 复制”链接文件“到虚拟机(VirtualBox)的”共享文件夹“时报错:创建符号链接时报错:只读文件系统
问题描述: 1.Ubuntu 中的 /www/目录,是宿主主机 Windows 7 以“共享文件夹”的形式挂载的: 2./etc/php.ini 是 /opt/software/php/etc/php ...
- visual studio 添加链接文件
本文转载http://blog.163.com/zhongpenghua@yeah/blog/static/87727415201282432345613/ 那个有个箭头的文件就是链接文件了,添加 ...
- Windows系统创建硬链接文件
源文件夹:E:\深海 创建新硬链接文件夹:D:\微云同步盘\719179409\4-工作资料\深海 打开命令提示符(管理员) 敲入以下命令: 创建成功后,进入目录 D:\微云同步盘\71917 ...
随机推荐
- Android天气预报
Android天气预报 1.指定 WebService 的命名空间和调用方法import org.ksoap2.serialization.SoapObject;private static fina ...
- 测试开发之Django——No8.Django中的视图与URL配置
在Django中,页面内容是靠views function(视图函数)来产生,URL定义在URLconf中. 这是一个纯净项目的url配置文件,他存在的目录,是与setting文件在同一个目录中. u ...
- Java8 容器类详解
ArrayList Vector CopyOnWriteArrayList LinkedList HashMap ConcurrentHashMap LinkedHashMap 使用场景 随机访问 ...
- 2018-2019 2 20165203 《网络对抗技术》 Exp3 免杀原理与实践
2018-2019 2 20165203 <网络对抗技术> Exp3 免杀原理与实践 免杀原理与实践说明及基础问答部分 实验任务 正确使用msf编码器(0.5分),msfvenom生成如j ...
- JavaScrit全面总结
前端技术的发展变化太快了,各种各样的框架.再变也离不开js.所以,在此把js的高级语法总结一遍. js解析和执行包括:全局和函数 一:全局预处理 <script type="te ...
- 用两个int值实现读写锁
private int readcount = 0; private int writecount = 0; public void lockread() throws InterruptedExce ...
- flex布局简介
一.概述 浮动在移动布局中不再重要,flex盒模型越来越重要. flexbox经历过三个版本,主要区别是2009年到2012年之间的语法变化. 最新的语法和现在规范是同步的(例display:flex ...
- POJ 3262 Protecting the Flowers 【贪心】
题意:有n个牛在FJ的花园乱吃.所以FJ要赶他们回牛棚.每个牛在被赶走之前每秒吃Di个花朵.赶它回去FJ来回要花的总时间是Ti×2.在被赶走的过程中,被赶走的牛就不能乱吃 思路: 先赶走破坏力大的牛假 ...
- thinkphp3.2自定义success及error跳转页面
首先我们需要配置目录 在conf下新建一个config文件 <?php return array( 'TMPL_ACTION_SUCCESS'=>'Public:dispatch_jump ...
- docker compose不同配置文件之间的 网络连接
一.引用自https://blog.csdn.net/luckyjiet/article/details/80979378 二.