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 ...
随机推荐
- spring boot 中的热部署
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>sprin ...
- 使用navicat premium将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL
有时候我们有迁移数据库的需求,例如从Oracle迁移到SQL Server,或者从MySQL迁移到Oracle. 很多江湖好汉一时不知如何手工操作,所幸的是Navicat提供了迁移的自动化操作界面. ...
- 错误/异常:java.io.FileNotFoundException: .\src\db.properties (系统找不到指定的路径。);的解决方法
1.异常视图 2.解决方法 与之相关的部分代码: static{ try { //读取db.properties Properties props = new Properties(); FileIn ...
- PHP 日期时间类 Carbon 的常见用法
Carbon 继承了 PHP DateTime 类,所以 DateTime 类的方法同样适用于 Carbon 类. 初始化一个日期 use Carbon\Carbon; $today = new Ca ...
- 《转》理解restful
越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...
- ERP出库审核业务(四十四)
结束表单流程的代码: protected void btnSubmit_Click(object sender, EventArgs e) { if(this.txtreceiveDate.Text! ...
- 《LINQ技术详解C#》-2.查询表达式翻译为标准查询操作符
(1)透明标识符 有些翻译步骤要使用透明标识符(*)插入枚举变量. 透明标识符只在翻译过程中存在,翻译结束将不再出现. (2)翻译步骤 ①带有into连续语句的Select和Group语句 from. ...
- Hibernate的主配置文件hibernate.cfg.xml
1:Hibernate的主配置文件的名字必须是hibernate.cfg.xml(主要配置文件中主要配置:数据库连接信息,其他参数,映射信息):常用配置查看源码:Hibernate\hibernate ...
- requirejs模块路径配置问题
三种情况:一.设置data-main,没配置baseUrl,以data-main的文件为基准:二.设置data-main,配置baseUrl,baseUrl以值以引用require.js的HTML为基 ...
- 放弃WebView,使用Crosswalk做富文本编辑器
版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/4100132.html 为什么放弃WebView Androi ...