个人的第一个F# JIG代码——截断线绘制
由于.NET编程一直似懂非懂,不过最近看了一些F#的介绍之后,对其颇有好感
于是啃了两天帮助
仔细阅读了才鸟兄的C# 五角星jig例子、KEAN的F# 螺旋线jig例子和AUTODESK公司的椭圆C# JIG例子
照葫芦画瓢地写下了如下一段简单的截断线例子
在此对以上作者表示衷心的感谢
而本人水平有限,代码非常不简洁,没有体现出F#的任何优点,各位见笑了,请不吝指教
后续希望能有所改进
源代码和项目如附件,内有说明
使用说明
(1) 可在2007 或2011 中,用netload命令,加载这个myfirstjig.dll
则可以通过命令 mybl来调用画截断线,效果可见gif文件
w1mbocoi5ya.gif
(2)源码使用说明:请用VS2008+F# 2.0安装包或者 VS2010打开
注意:要修改引用中ACMGD.DLL和ACDBMGD.DLL的路径(重新删除再引用,并设置拷贝到本地为false)
要修改项目属性中debug里面的acad.exe的路径(重新查找)
by qjchen
-
- //本文参照了才鸟兄的五角星例子、KEAN的螺旋线例子和AUTODESK公司的椭圆JIG例子
- //在此对他们表示衷心的感谢
- //by qjchen@gmail.com 华南理工大学 2010.08.10
- module File1_mod.Commands
- //引入一些空间,类似C#的using
- open System
- open Autodesk.AutoCAD.ApplicationServices
- open Autodesk.AutoCAD.DatabaseServices
- open Autodesk.AutoCAD.EditorInput
- open Autodesk.AutoCAD.Geometry
- open Autodesk.AutoCAD.GraphicsInterface
- open Autodesk.AutoCAD.Runtime
- //根据才鸟兄实体书中的例子编写函数,仿LISP的polar
- let PolarPoint (basePt:Point2d) (angle:double) (distance:double):Point2d=
- let point = Point2d(basePt.X+distance*Math.Cos angle,basePt.Y+distance*Math.Sin angle)
- point
- //Ang2Rad,仿才鸟兄的函数,不过才鸟兄写成了rad2ang,或许是笔误?
- let Ang2Rad (angle:double) =
- let rad=angle*Math.PI/180.0
- rad
- //定义一个继承于DrawJig的JdxJig类
- type JdxJig() as this = class
- inherit DrawJig()
- //此处定义的两个变量,一个来自于jdx的初始赋值,一个来自于起始点
- let mutable (_pl : Polyline) = null
- let mutable _startPt=new Point3d()
- //member是这个类中的一个函数,仿Kean函数编写
- member x.StartJig(ed:Editor,pt,pl) =
- //将之前获取的点及构造的函数赋予此两变量
- _startPt endPt then
- //赋予起始点给p0,赋予当前移动点给p6
- let p0:Point2d = new Point2d(_startPt.X, _startPt.Y)
- let p6:Point2d = new Point2d(curPt.X, curPt.Y)
- //计算起始点和终止点的矢量和角度
- let vec:Vector2d = p6-p0
- let ang:double = vec.Angle
- //下面这几段写的真丑陋,没有一点F#简洁的特点,下一步来进行修改
- let mutable p1=new Point2d()
- let mutable p2=new Point2d()
- let mutable p3=new Point2d()
- let mutable p4=new Point2d()
- let mutable p5=new Point2d()
- let mutable p2a=new Point2d()
- let mutable p4a=new Point2d()
- let mutable d06:double = p6.GetDistanceTo(p0)
- //以下是截断线的画法,是按照1:100的比例画的,没有考虑比例问题
- if d06 ignore
- true
- end
- //下面是函数命令部分
- []
- let jigjdx() =
- // 开始常用语句
- let doc =
- Application.DocumentManager.MdiActiveDocument
- let ed = doc.Editor
- let db = doc.Database
- // 提示选择起始点
- let startRes = ed.GetPoint("\nSelect first point: ")
- if startRes.Status = PromptStatus.OK then
- let startPt = startRes.Value
- // 创建polyline和运行jig
- let pl:Polyline = new Polyline(7)
- for i=0 to 6 do
- pl.AddVertexAt(i, Point2d(0.0,0.0),0.0,0.0,0.0)
- let jig = new JdxJig()
- let res = jig.StartJig(ed, startPt, pl)
- if res.Status = PromptStatus.OK then
- use tr =
- db.TransactionManager.StartTransaction()
- // 得到块表和块记录
- let bt =
- tr.GetObject
- (db.BlockTableId,OpenMode.ForRead)
- :?> BlockTable
- let ms =
- tr.GetObject
- (bt.[BlockTableRecord.ModelSpace],
- OpenMode.ForWrite)
- :?> BlockTableRecord
- // 把截断线加入到模型空间
- let id = ms.AppendEntity(pl)
- tr.AddNewlyCreatedDBObject(pl, true)
- tr.Commit()
本帖以下内容被隐藏保护;需要你回复后,才能看到! 游客,如果您要查看本帖隐藏内容请 回复 |