Revit API遍历全部风管,找到与风管相关的墙开洞
涉及向量计算,求相交等相关技术。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using WinForm = System.Windows.Forms; using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.Attributes; using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.ApplicationServices; using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.DB.ExtensibleStorage;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Architecture; using System.Xml;
using SelSet = HongYe.Revit.Public.SelectSet; namespace RevitCodes
{
//找洞口
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class cmdWallOpening : IExternalCommand
{
public Result Execute(ExternalCommandData cmdData, ref string messages, ElementSet elements)
{
UIApplication uiApp = cmdData.Application;
Document doc = uiApp.ActiveUIDocument.Document;
Selection sel = uiApp.ActiveUIDocument.Selection; Transaction ts = new Transaction(doc, "revit.5d6d.com");
ts.Start();
/*
//选择一面墙
WallSelectionFilter fWall = new WallSelectionFilter();
Reference ref1 = uiApp.ActiveUIDocument.Selection.PickObject(ObjectType.Element, fWall, "选择一面墙:");
Element elem1 = doc.GetElement(ref1);
Wall wall = elem1 as Wall;
//选择一个风管
DuctSelectionFilter fDuct = new DuctSelectionFilter();
Reference ref2 = uiApp.ActiveUIDocument.Selection.PickObject(ObjectType.Element, fDuct, "选择一个风管:");
Element elem2 = doc.GetElement(ref2);
Duct duct = elem2 as Duct;
*/
//开同心洞
//CenterOpen(doc, wall, duct, 640, 640);
List<Duct> listDuct = FindAllDuct(doc);
foreach (Duct duct in listDuct)
{
List<Wall> listWall = FindDuctWall(doc, duct);
foreach (Wall wall in listWall)
{
CenterOpen(doc, wall, duct, , );
}
} ts.Commit(); return Result.Succeeded;
}
//找到所有风管
List<Duct> FindAllDuct(Document doc)
{
List<Duct> listDuct = new List<Duct>();
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.OfClass(typeof(Duct)).OfCategory(BuiltInCategory.OST_DuctCurves); foreach (Element el in collector)
{
Duct duct = el as Duct;
if (duct != null)
listDuct.Add(duct);
}
return listDuct;
}
//找到与风管相交的墙
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;
}
//开同心洞
Result CenterOpen(Document doc, Wall wall, Duct duct, double dWidth, double dHeigh)
{
SubTransaction subTs = new SubTransaction(doc);
subTs.Start();
try
{
//求面和线的交点
Face face = FindWallFace(wall);
Curve curve = FindDuctCurve(duct);
XYZ xyz = FindFaceCurve(face, curve);
//墙线的向量
XYZ wallVector = FindWallVector(wall);
//交点向上向墙线正方向移动160(风管宽高320)
XYZ pt1 = xyz + new XYZ(, , ) * dHeigh / / 304.8;
pt1 = pt1 + wallVector.Normalize() * dWidth / / 304.8;
//交点向下向墙线反方向移动160(风管宽高320)
XYZ pt2 = xyz + new XYZ(, , -) * dHeigh / / 304.8;
pt2 = pt2 - wallVector.Normalize() * dWidth / / 304.8;
//开洞
doc.Create.NewOpening(wall, pt1, pt2); subTs.Commit();
return Result.Succeeded;
}
catch
{
subTs.RollBack();
return Result.Failed;
}
}
//找到墙线的向量
XYZ FindWallVector(Wall wall)
{
LocationCurve lCurve = wall.Location as LocationCurve;
XYZ xyz = lCurve.Curve.get_EndPoint() - lCurve.Curve.get_EndPoint();
return xyz;
}
//求线和面的交点
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;
}
//找到风管对应的曲线
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;
return curve;
}
//找到墙的正面
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);
foreach (GeometryObject obj in e.Objects)
{
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;
}
}
//墙的过滤条件
class WallSelectionFilter : ISelectionFilter
{
public bool AllowElement(Element e)
{
return e is Wall;
} public bool AllowReference(Reference r, XYZ p)
{
return true;
}
}
//风管的过滤条件
class DuctSelectionFilter : ISelectionFilter
{
public bool AllowElement(Element e)
{
return e is Duct;
} public bool AllowReference(Reference r, XYZ p)
{
return true;
}
}
}
url:http://greatverve.cnblogs.com/p/api-duct-wall-opening.html
Revit API遍历全部风管,找到与风管相关的墙开洞的更多相关文章
- Revit API通过相交过滤器找到与风管相交的对象。
相交过滤器的应用,比几何相交法简便.Excluding剔除 //找到与风管相交的对象,通过相交过滤器. [TransactionAttribute(Autodesk.Revit.Attributes. ...
- Revit API判断直线相交关系移动风管
start ) ); )) )) ); XYZ xyz12 = lCurve1.Curve.get_EndPoint(); XY ...
- Revit API遍历系统族布置喷头
系统族可以通过内参遍历,遍历出来是个FamilySymbol喷头属于系统族,但不能通过NewDuct();类似这样的方法布置.必须使用 NewFamilyInstance() ); ...
- Revit API找到风管穿过的墙(当前文档和链接文档)
start [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] public class c ...
- Revit API画垂直于风管的风管
start /// <summary> /// 选择风管与风管外一点,画与风管垂直的风管. /// </summary> [Transaction(TransactionMod ...
- 【Revit API】梁构件支座检查算法
一.前言 应该是第二次写关于Revit API的博文了.虽然在BIM企业中工作,从事桌面BIM软件开发,但是我是不怎么喜欢写Revit API相关的代码.平时更多的是在写界面展示,架构 ...
- Revit API 判断一个构件在某个视图中的可见性
查看 Revit API.发现有Element::IsHidden这个方法.通过UI创建一个element,注意要使得这个element在某些视图可见,但是在另一些视图不可见.运行下面的方法,你会发现 ...
- Revit API 操作共享参数和项目参数
1.获取共享参数 private string GetSharInfo(Autodesk.Revit.ApplicationServices.Application revitApp) { Strin ...
- revit API 生成墙图元
由于Revit的版本问题,在网上找的生成墙图元的代码,在我机器上的Revit 2016中编译不能通过,通过多次调试,终于找到在revit 2016中使用API生成墙图元的代码,现在贴出来. 下面的代码 ...
随机推荐
- 【API】NetUserEnum-获取系统所有账户名称
1 说明 该NetUserEnum函数检索服务器上所有用户帐户的信息. 函数原型: NET_API_STATUS NetUserEnum( _In_ LPCWSTR servername, _In_ ...
- Expression Tree Build
The structure of Expression Tree is a binary tree to evaluate certain expressions.All leaves of the ...
- Linux信号(signal)机制【转】
转自:http://gityuan.com/2015/12/20/signal/ 信号(signal)是一种软中断,信号机制是进程间通信的一种方式,采用异步通信方式 一.信号类型 Linux系统共定义 ...
- orm 缺点
背景 提起orm,在我开发这几年可是阴魂不散,因为我的开发没人带,全是自己琢磨,好处是很多东西都懂,都理解的透彻,缺点是见得少,接触少.而我一直没用orm,但是又到处听说orm,但我总想不明白有啥用处 ...
- MongoDB存储基础教程
一.MongoDB简介 1. mangodb是一种基于分布式.文件存储的非关系型数据库 2. C++写的,性能高 3. 为web应用提供可扩展的高性能数据存储解决方案 4. 所支持的格式是json格式 ...
- memcache 键名的命名规则以及和memcached的区别
2014年3月27日 07:47:46 Keys---- Data stored by memcached is identified with the help of a key. A keyis ...
- 推荐一些socket工具,TCP、UDP调试、抓包工具 (转载)
还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用.好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控. 假如有 ...
- 由time.tzname返回值引发的对str、bytes转换时编码问题实践
Windows 10家庭中文版,Python 3.6.4, 下午复习了一下time模块,熟悉一下其中的各种时间格式的转换:时间戳浮点数.struct_tm.字符串,还算顺利. 可是,测试其中的time ...
- day16作业
一.填空题 1.Integer Character 2.String s = "123";Integer i = new Integer(s);System.out.println ...
- h5手势密码开发(使用jq)
直接上代码: 目录结构: 本次开用到的技术jq,以及引入的jq插件jquery.gesture.password.min.js index.html <!DOCTYPE html> < ...