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

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 660|回复: 0
打印 上一主题 下一主题

[实体对象] 浅析AutoCAD中的面域

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

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

积分
12404

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-8 15:16:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

在AutoCAD中使用拉伸方法创建三维实体的时候,很多人会碰到这样一个问题,分明是多个首位相连的直线段,为什么拉升的时候会导致创建实体失败呢?如何解决呢?第一种方法是将该封闭图形换做多段线(Polyline)来绘制,第二种则是使用面域(Region),将多个直线段转化为一个面域,问题也能得到了解决,下面就简单说说面域的问题。
面域,顾名思义,面就是平面,域就是范围,即平面区域。封闭区域和面域在AutoCAD中是两个不同的概念,虽然在几何上,一个封闭的平面图形确实可以表示出其所在的平面,但是在AutoCAD中,没有创建面域之前,封闭的几何体是没有面域概念的。从视觉上我们会觉得这是一个封闭的平面区域,但是AutoCAD内部并不是这样表示的,只有当利用该几何图形创建面域之后,封闭的图形才局限出一个面,该几何图形所包围的部分即为面域
在AutoCAD中,可以将封闭区域转换为面域,这些封闭区域可以是圆、椭圆、封闭的二维多段线和封闭的样条曲线等对象,也可以是由圆弧、直线、二维多段线、椭圆弧、样条曲线等多种对象构成的封闭区域。但是,在显式转换为面域之前,
面域通常有三个作用,第一个作用是用来检验图形是否是封闭的,只有能转化为面域才能说明图形是封闭的,第二个作用是计算某些几何参数,因为面域具有物理属性,如形心,面积等。第三个作用则是用来创建三维模型,因为一般的平面图形只有转化为面域才能拉伸为立体图形,这也是本文讨论的重点。
计算面积,周长
对于规则的平面图形,我们可以使用一般的计算公式求解,但是一旦图形变得稍微复杂一点,例如图形中有椭圆弧,对于周长的求解将会是一个灾难,如果还有样条曲线,传统的计算方法就显得捉襟见肘了,这个时候使用面域将是一个明智的选择。
例如下图:


使用命令”region”将该封闭区域转换为面域后,使用”massprop”命令显示该对象的属性,结果如下:


详细的几何参数都被显示出来。
实体的创建
实体的创建在AutoCAD用户交互环境下还是比较简单的,这里就不赘述了,主要讨论一下如何用程序创建三维实体。

首先,对于规则的三维实体,Solid3d类有许多现成的方法,例如CreateBox、CreateSphere等,或者是他们的布尔运算,但是许多实体并没有那么简单,这个时候面域的作用就凸显出来了,通过给Solid3d的Extrude方法传递一个面域作为参数,将能创建很大一部分的三维实体,这类实体的特点是界面轮廓比较复杂,但是每个截面是相同或者相似的。问题的重点落在如何创建一个符合要求的面域。

下面以热轧等边角钢(GB9787-88)表中的8号角钢为例详细说明复杂面域的创建。8号角钢有5种,这里只取厚度为10mm的做一个演示,截面图如下:


首先用多义线绘制该封闭区域,例如我们以下图中的顺序创建多义线:

点坐标列表:
编号
坐标
1
(0,0)
2
(80,0)
3
(70,10)
4
(19,10)
5
(10,19)
6
(10,70)
7
(0,80)
许多人被多义线给误导了,总以为它只能创建线段,其实多义线是可以创建圆弧的,这主要有第三个参数决定,我的博客中也做了详细的说明。
然后是将该多义线转化为面域。这里要详细说明一下。根据《AutoCAD.NET Developer’s Guide》一书中的说明,这个时候要使用Region的静态方法CreateFromCurves,这个方法很有意思,它的输入参数是一个对象集合(DBObjectCollection),该集合包含了创建面域的封闭区域,输出参数也是一个对象集合,该对象则是包含了创建好的面域的集合。或许有些人会感到疑惑:为什么不直接返回一个面域呢?书中也做了详细的解释:如果两个或以上的曲线共享一个终点的话,创建的结果将会是随意的,基于这一原因,CreateFromCurves实际上会创建多个面域,这也使得对象集合显得有必要了。

最后就是拉伸了。一旦面域创建好,拉升将会显得非常简单,通过使用Solid3d的Extrude方法,为该方法提供三个参数:面域,高度和斜度。
下面是代码清单:

  1. [CommandMethod("LBAR")]
  2. public void LBar()
  3. {

  4. Document doc =Application.DocumentManager.MdiActiveDocument;

  5. Database db = doc.Database;

  6. Editor ed = doc.Editor;

  7. Transaction trans = db.TransactionManager.StartTransaction();

  8. BlockTable bt = trans.GetObject(db.BlockTableId,OpenMode.ForRead) as BlockTable;

  9. BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace],OpenMode.ForWrite) as BlockTableRecord;

  10. Polyline p = new Polyline();
  11.     double pi = Math.PI;
  12.     p.AddVertexAt(0, new Point2d(0, 0), 0, 0, 0);
  13.     p.AddVertexAt(1, new Point2d(80, 0), Math.Tan(pi / 8), 0, 0);
  14.     p.AddVertexAt(2, new Point2d(70, 10), 0, 0, 0);
  15.     p.AddVertexAt(3, new Point2d(19, 10), -Math.Tan(pi / 8), 0, 0);
  16.     p.AddVertexAt(4, new Point2d(10, 19), 0, 0, 0);
  17.     p.AddVertexAt(5, new Point2d(10, 70), Math.Tan(pi / 8), 0, 0);
  18.     p.AddVertexAt(6, new Point2d(0, 80), 0, 0, 0);
  19.     p.Closed = true;
  20.     //将p添加到一个对象集合中

  21. DBObjectCollection dboc = new DBObjectCollection();
  22.     dboc.Add(p);

  23. DBObjectCollection RegionCollection =Region.CreateFromCurves(dboc);
  24.     //获取面域

  25. Region reg = RegionCollection[0] as Region;

  26. Solid3d sol = new Solid3d();
  27.     sol.Extrude(reg, 200, 0);//根据面域拉升创建实体
  28.     //添加到数据库
  29.     btr.AppendEntity(sol);
  30.     trans.AddNewlyCreatedDBObject(sol, true);
  31.     trans.Commit();
  32.     trans.Dispose();
复制代码
加载,并输入“LBAR”命令后,将创建一个角钢,截图如下:

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

相关帖子

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

本版积分规则

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

GMT+8, 2024-11-23 13:48

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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