Revit API风管对齐
start
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class cmd : IExternalCommand
{
/// <summary>
/// 取得风管两端连接器
/// </summary>
/// <param name="duct"></param>
/// <returns></returns>
private List<Connector> getConn(Duct duct)
{
List<Connector> listConn = new List<Connector>();
ConnectorSetIterator csi = duct.ConnectorManager.Connectors.ForwardIterator();
while (csi.MoveNext())
{
Connector conn = csi.Current as Connector;
if (ConnectorType.End == conn.ConnectorType)
{
listConn.Add(conn);
}
else if (ConnectorType.Curve == conn.ConnectorType)
{
//return conn;
}
}
return listConn;
}
public Result Execute(ExternalCommandData cmdData, ref string msg, ElementSet elements)
{
UIDocument uiDoc = cmdData.Application.ActiveUIDocument;
UIApplication uiApp = cmdData.Application;
Document doc = uiDoc.Document;
Selection sel = uiDoc.Selection; Transaction ts = new Transaction(doc, "http://revit.5d6d.com");
ts.Start();
try
{
Element elDuct0 = doc.GetElement(sel.PickObject(ObjectType.Element, "选择风管1:"));
Element elDuct1 = doc.GetElement(sel.PickObject(ObjectType.Element, "选择风管2:"));
Duct duct0 = elDuct0 as Duct;
Duct duct1 = elDuct1 as Duct;
List<Connector> listConn0 = getConn(duct0);
List<Connector> listConn1 = getConn(duct1);
Line line0 = Line.get_Bound(listConn0[].Origin, listConn0[].Origin);
Line line1 = Line.get_Bound(listConn1[].Origin, listConn1[].Origin);
double dDis = line1.Distance(line0.get_EndPoint());//直接间距
XYZ xyzVector = GetXYVector(line0, line1);
LocationCurve lc = elDuct1.Location as LocationCurve;
lc.Move(dDis * xyzVector);
ts.Commit();
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException)
{
ts.RollBack();
return Result.Cancelled;
}
catch (Exception ex)
{
ts.RollBack();
} return Result.Succeeded;
} /// <summary>
/// 取得平行线的单位向量
/// </summary>
/// <param name="line0"></param>
/// <param name="line1"></param>
/// <returns></returns>
public XYZ GetXYVector(Line line0, Line line1)
{
//基准
XYZ startPoint0 = line0.get_EndPoint();
XYZ endPoint0 = line0.get_EndPoint();
//参照
XYZ startPoint1 = line1.get_EndPoint();
XYZ endPoint1 = line1.get_EndPoint();
//
XYZ resultVector = new XYZ(, , ); XYZ zStart = new XYZ(startPoint1.X, startPoint1.Y, );
XYZ zEnd = new XYZ(endPoint1.X, endPoint1.Y, ); Line line = Line.get_Bound(new XYZ(startPoint0.X, startPoint0.Y, ), new XYZ(endPoint0.X, endPoint0.Y, ));
line.MakeUnbound(); //取得一条直线所在直线相垂直的直线
XYZ tPoint = zStart - zEnd;
XYZ zVector = new XYZ(, , );
XYZ nPoint = tPoint.CrossProduct(zVector).Normalize() + zStart;
Line lineN = Line.get_Bound(zStart, nPoint);
lineN.MakeUnbound(); //与另外一条风管的交点
IntersectionResultArray intersectionR = new IntersectionResultArray();
SetComparisonResult comparisonR; comparisonR = line.Intersect(lineN, out intersectionR); if (SetComparisonResult.Disjoint != comparisonR)
{
if (!intersectionR.IsEmpty)
{
resultVector = intersectionR.get_Item().XYZPoint;
}
} if (!zStart.IsAlmostEqualTo(resultVector))
{
resultVector = (resultVector - zStart).Normalize();
} return resultVector;
}
}
url:http://greatverve.cnblogs.com/p/revit-api-duct-alignment.html
Revit API风管对齐的更多相关文章
- Revit API判断直线相交关系移动风管
start ) ); )) )) ); XYZ xyz12 = lCurve1.Curve.get_EndPoint(); XY ...
- Revit利用对正工具快速修改风管对齐方式
绘制风管的时候,可以对风管的对正方式进行设置,水平方向可以设置左对齐或者中心对齐或者右对齐,垂直方向可以设置为顶对齐或者中心对齐或者低对齐,如果需要对原来的对齐方式进行修改的时候应该如何操作呢?比如, ...
- 【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 API提供根据射线来寻找经过的元素.方法是固定模式,没什么好说.关键代码:doc.FindReferencesWithContextByDirection(ptStart, (ptEnd ...
- Revit API 加载族并生成实例图元
在Revit API中加载族可以使用Doc.LoadFamily方法,传入要加载的族文件路径名,但是这种方式有一种缺点,就是如果族文件在当前工程中没有加载的话则返回成功,如果已经加载过,则返回失败,也 ...
- Revit Family API 添加对齐
没测试成功,留待以后研究. [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)] ; ; i < nV ...
- Revit API画垂直于风管的风管
start /// <summary> /// 选择风管与风管外一点,画与风管垂直的风管. /// </summary> [Transaction(TransactionMod ...
随机推荐
- mybatis关联查询数据模型分析——(七)
1. 数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空字段.外键字段 3.数据库级别表与表 ...
- 【ARTS】01_08_左耳听风-20181231~20190106
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- apache+php windows下配置
2014年1月9日 13:58:54 现在PHP大部分是vc9编译的,其扩展在windows下大部分也都是用vc9编译的(memcache,xdebuge...),,所以要想Apache+PHP+PH ...
- 解决依赖的moduleBuildConfig.DEBUG总是未false的问题
Android 开发中一般会通过 BuildConfig.DEBUG 判断是否是 Debug 模式,从而做一些在 Debug 模式才开启的特殊操作,比如打印日志.这样好处是不用在发布前去主动修改,因为 ...
- Oracle优化技巧
现观察线上系统运行发现,线上某些业务查询存在等待时间长问题,后核查发现,部分问题出现在对数据库操作上Cost大部分时间,后根据网上各位前辈提供的优化技巧解决大部分问题,现写下本篇文章,一来巩固加深自己 ...
- java Set(集合)
set不保存重复的元素(至于如何判断元素相同则较为复杂,后面将会看到).Set中最常被使用的是测试归属表,你可以很容易地询问某个对象是否在某个Set中,正因如此,查找就成了Set最重要的操作,因此通常 ...
- laravel中短信发送验证码的实现方法
在阿里云上开通短信服务后需要做的: 1,申请签名 2,申请模板 3,创建Accesskey ,值得说的是,可以通过阿里云提供的子用户进行Accesskey的创建,这样可以更安全 4,充值 larave ...
- Ubuntu 12.04 下 Sublime Text 3 Build 3047 破解
1. $sudo vim /opt/sublime_text/sublime_text 2. 将文件转成十六进制形式.在 vim 中输入: :%!xxd 3. 查找数字串 “4333 3342 303 ...
- SqlServerDBCC SHRINKFILE不起作用
检查索引碎片的结果: CREATE DATABASE test_shrink USE test_shrink CREATE TABLE show_extent(a INT,b NVARCHAR(390 ...
- 关于Ocelot 网关结合Consul实现服务转发的坑爹问题
下面是我的网关配置来验证下Ocelot的问题,如果只是做网关转发应该还ok,但是要是结合Consul来检查并健康的转发有效服务器还是有很多弊端 关键在于通过设置 DeregisterCriticalS ...