EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 542|回复: 1
打印 上一主题 下一主题

如何编程计算斜墙与水平面的夹角以及斜墙相关的话题

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12404

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-15 13:32:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Revit 可以创建斜墙,方法是通过先创建一个体量,然后在体量的斜面上创建斜墙。具体步骤请参考帮助。

如果用API来创建斜墙,可用FaceWall.Create() 方法。



那么我们怎样辨别是垂直墙还是斜墙呢? 方法是通过墙的类名称来判断。斜墙用FaceWall类来表达,一般垂直墙用Wall类表达。



一个开发者问到一个问题,如何求出斜墙与水平面的夹角呢?

方法: 用几何数据Geometry方法获得斜墙的几何体,遍历这Solid的六个面,若某一个面的面积乘以墙的厚度等于墙的体积,并且该面的法向向量的Z值为正,那么这个面就是上表面。再构造一个垂直向上的向量(0,0,1),然后用Revit的两个向量的夹角函数获得夹角。

如下图所示:





请看下面的代码演示上面完整过程,显示模型中第一个斜墙与水平面夹角。。



[c-sharp] view plaincopy
//Code for Revit 2011.   
using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Windows.Forms;  

using  Autodesk.Revit .DB;  
using Autodesk.Revit.UI;  
using Autodesk.Revit .ApplicationServices;  
using Autodesk.Revit.Attributes ;  



  [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]  
  [RegenerationAttribute(Autodesk.Revit.Attributes.RegenerationOption.Manual)]  
public class GetSlantedWallAndAngle : IExternalCommand  
{  
    public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)  
    {  

      UIApplication app = commandData.Application;  
      Document doc = app.ActiveUIDocument.Document;  

      //Iterate to find the slanted wall.  
      FilteredElementCollector collector = new FilteredElementCollector(doc);  
      collector.OfCategory(BuiltInCategory.OST_Walls);  

      FaceWall slantedWall = null;  
      foreach (Element elem in collector)  
      {  
        if (elem is FaceWall) //use the class to identify slanted wall  
        {  
          slantedWall = elem as FaceWall;  
          break;  
        }  
      }  

      if (slantedWall == null)  
      {  
        messages = "There is no slanted wall in this model";  
        return Result.Failed;  
      }  
      //get geometry.  

      Options options = app.Application.Create.NewGeometryOptions();  
      GeometryElement geoElement = slantedWall.get_Geometry(options);  


      //get the only one solid  
      Solid wallSolid = null;  
      foreach (GeometryObject geoObject in geoElement.Objects)  
      {  
        if (geoObject is Solid)  
        {  
          wallSolid = geoObject as Solid;  
          break;  

        }  
      }  

      //get the wall's width  
      ElementId typeId = slantedWall.GetTypeId();  
      WallType type = doc.get_Element(typeId) as WallType;  
      double dWidth = type.Width;  


      double dTolerance = 0.01;  
      double dAngle = 0.0;  
      foreach (PlanarFace face in wallSolid.Faces)  
      {  
        if (Math.Abs(face.Area * dWidth - wallSolid.Volume) < dTolerance)  
        {  
          if (face.Normal.Z > dTolerance)  
          {  
            //calculate the angle.  
            XYZ verticalVector = new XYZ(0, 0, 1);  
            dAngle = verticalVector.AngleTo(face.Normal) * 180 / 3.1415926;  
            TaskDialog.Show("Slant wall angle to XOY plane", dAngle.ToString());  
            break;  
          }  
        }  
      }  

      return Result.Succeeded ;  
    }  
}  

作者:叶雄进文章来源:http://blog.csdn.net/joexiongjin/article/category/782739

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对

相关帖子

工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-16 19:40

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表