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

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

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

网易考拉推荐

弹簧的创建  

2011-01-11 18:54:49|  分类: ObjectARX |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

       这里介绍一下弹簧的绘制。并不是我的原创,事实上有人事先用VB.NET完成了该程序的编写,我只是将其改为C#的版本而已。在传统的AutoCAD中绘制三维弹簧是很困难的,而且效果也不是很好,但是通过使用二次开发,能够实现对弹簧的精确绘制,详细介绍如下。

       数学原理:

       弹簧究其本质来说是一段螺旋线,用参数方程表示为:

弹簧的创建 - Castor - 趁年轻,多折腾~~

 实际的弹簧参数如下:

弹簧的创建 - Castor - 趁年轻,多折腾~~

 

实际需要给定的参数:螺旋线半径、导程、圈数、丝径,其他参数均可由这几个参数计算求取。

1.Visual Studio中创建一个类库工程,并添加AcDbMgd.dllAcMgd.dll的引用。

2.在工程中添加一个名为Form1的窗体。

3.Class1中编写方法“spring”,该方法将会被AutoCAD解析为一个命令。该方法调用一个窗口,代码如下:

[CommandMethod("Spring")]

public void CreateSpring()

{

    Form1 f = new Form1();

    Application.ShowModalDialog(f);

}

4.编辑Form1的界面,效果如下:

弹簧的创建 - Castor - 趁年轻,多折腾~~

5.为“创建”按钮添加相应的事件,双击该按钮,编辑代码如下:

private void button1_Click(object sender, EventArgs e)

{

    //获取各个参数

    Point3d pc = new Point3d(Convert.ToDouble(textBox1.Text), Convert.ToDouble(textBox2.Text), Convert.ToDouble(textBox3.Text));

    double r = Convert.ToDouble(textBox4.Text);

    double h = Convert.ToDouble(textBox5.Text);

    int n = Convert.ToInt16(textBox6.Text);

    double sijing = Convert.ToInt16(textBox7.Text);

    double w = Math.PI * 2 / 180;

    double v = h / 180;

    double tt=0;

    //打开文档

    Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

    Database db = doc.Database;

    Editor ed = doc.Editor;

    DocumentLock dl = doc.LockDocument();

    Transaction trans = db.TransactionManager.StartTransaction();

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

    BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);

    //图形参数

    Point3d p = new Point3d(pc.X + r * Math.Cos(w * tt), pc.Y + r * Math.Sin(w * tt), pc.Z + v * tt);

    Point3dCollection p3dcoll = new Point3dCollection();

    p3dcoll.Add(p);

    Vector3d vc = p - pc;

    //扫略面

    Circle c = new Circle();

    c.Normal = vc.CrossProduct(Vector3d.ZAxis);

    c.Radius = sijing/2;

    c.Center = p;

    tt++;

    //扫略路径

    do

    {

        p = new Point3d(pc.X + r * Math.Cos(w * tt), pc.Y + r * Math.Sin(w * tt), pc.Z + v * tt);

        p3dcoll.Add(p);

        tt++;

    } while (tt <= n * 180);

    Polyline3d pl3d = new Polyline3d(Poly3dType.SimplePoly, p3dcoll, false);

    btr.AppendEntity(pl3d);

    trans.AddNewlyCreatedDBObject(pl3d, true);           

    DBObjectCollection dboc = new DBObjectCollection();

    dboc.Clear();

    dboc.Add(c);

    DBObjectCollection RegionColl = Autodesk.AutoCAD.DatabaseServices.Region.CreateFromCurves(dboc);

    Autodesk.AutoCAD.DatabaseServices.Region reg = RegionColl[0] as Autodesk.AutoCAD.DatabaseServices.Region;

    //弹簧实体

    Solid3d sld = new Solid3d();

    sld.ExtrudeAlongPath(reg, pl3d, 0);

    sld.ColorIndex = 1;

    btr.AppendEntity(sld);

    trans.AddNewlyCreatedDBObject(sld, true);

    trans.Commit();

    //释放资源

    trans.Dispose();

    dl.Dispose();

    this.Dispose();

}

6.F6编译程序,打开AutoCAD,并输入命令“netload”,加载编译的dll文件,并在命令行中输入“Spring”,单击“创建”按钮,将会自动生成一个红色的弹簧,调整视图和渲染后效果如下:

 

弹簧的创建 - Castor - 趁年轻,多折腾~~

 

  评论这张
 
阅读(887)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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