注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

旋转类三维实体的创建  

2010-12-06 16:48:45|  分类: ObjectARX |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

前面介绍了通过对面域的创建实现了三维实体的拉伸,虽然这种方式能创建出很多比较复杂的三维实体,但显然还不够,许多零件,例如轴类,绝大部分都是用车床加工出来的,这类零件沿轴线方向上的图形是变化的,而且还不连续,这个时候采用拉升将是一个不明智的选择,因为这会涉及到多次创建面域及拉伸、并集的运算,如果采用旋转的方式将会大大简化模型创建。

采用旋转方式创建三维实体可以采用Solid3d类中的Revolve方法,该方法原型如下:

public virtual void Revolve(Region region, Point3d axisPoint, Vector3d axisDir, Double angleOfRevolution);

第一个参数是被旋转的面域,这再次说明面域的重要性,第二个参数是指定旋转轴上的一个点,第三个参数则是旋转轴的方向,最后一个参数则是旋转的角度。

       下面还是用一个实例来说明。如下图中的一个轴,各尺寸参数如下所示:

旋转类三维实体的创建 - 379910987 - 年轻,就要多折腾~~

现在如何创建这一实体呢?首先还是使用多义线由于可以使用旋转,我们只需要条母线上的关键点即可,各关键点标记位置如下图:

 

旋转类三维实体的创建 - 379910987 - 年轻,就要多折腾~~

 

设编号为1的点坐标为(0,0),则各点坐标分别如下:

编号

坐标

编号

坐标

1

(0,0)

11

(214,37)

2

(320,0)

12

(214,36)

3

(320,25)

13

(212,34)

4

(318,27)

14

(144,34)

5

(278,27)

15

(142,32)

6

(276,29)

16

(80,32)

7

(276,31)

17

(79,31)

8

(226,31)

18

(2,31)

9

(224,33)

19

(0,29)

10

(224,37)

 

 

实现代码如下:

[CommandMethod("SHAFT")]

public void Shaft()

{

    Document doc = Application.DocumentManager.MdiActiveDocument;

    Database db = doc.Database;

    Transaction trans = db.TransactionManager.StartTransaction();

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

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

    double pi = Math.PI;

    Polyline p = new Polyline();

    p.AddVertexAt(0, new Point2d(0, 0), 0, 0, 0);

    p.AddVertexAt(1, new Point2d(320, 0), 0, 0, 0);

    p.AddVertexAt(2, new Point2d(320, 25), 0, 0, 0);

    p.AddVertexAt(3, new Point2d(318,27), 0, 0, 0);

    p.AddVertexAt(4, new Point2d(278, 27), -Math.Tan(pi / 8), 0, 0);

    p.AddVertexAt(5, new Point2d(276, 29), 0, 0, 0);

    p.AddVertexAt(6, new Point2d(276, 31), 0, 0, 0);

    p.AddVertexAt(7, new Point2d(226, 31), -Math.Tan(pi / 8), 0, 0);

    p.AddVertexAt(8, new Point2d(224, 33), 0, 0, 0);

    p.AddVertexAt(9, new Point2d(224, 37), 0, 0, 0);

    p.AddVertexAt(10, new Point2d(214, 37), 0, 0, 0);

    p.AddVertexAt(11, new Point2d(214, 36), -Math.Tan(pi/8), 0, 0);

    p.AddVertexAt(12, new Point2d(212, 34), 0, 0, 0);

    p.AddVertexAt(13, new Point2d(144, 34), -Math.Tan(pi / 8), 0, 0);

    p.AddVertexAt(14,new Point2d(142,32),0,0,0);

    p.AddVertexAt(15, new Point2d(80, 32), -Math.Tan(pi / 8), 0, 0);

    p.AddVertexAt(16, new Point2d(79, 31), 0, 0, 0);

    p.AddVertexAt(17,new Point2d(2,31),0,0,0);

    p.AddVertexAt(18,new Point2d(0,29),0,0,0);

    p.Closed = true;

    //创建面域

    DBObjectCollection dboc = new DBObjectCollection();

    dboc.Add(p);

    DBObjectCollection RegionCollection = Region.CreateFromCurves(dboc);

    Region reg = RegionCollection[0] as Region;

    Solid3d sol = new Solid3d();//实体

    //创建旋转实体

    sol.Revolve(reg, new Point3d(0, 0, 0), Vector3d.XAxis, 2 * pi);

    btr.AppendEntity(sol);

    trans.AddNewlyCreatedDBObject(sol, true);

    trans.Commit();

    trans.Dispose();

}

运行好输入“SHAFT”,用体着色方式并选择一种颜色,效果如下:

旋转类三维实体的创建 - 379910987 - 年轻,就要多折腾~~

 

  评论这张
 
阅读(806)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016