//以下是个人第一个用F#编写的ACAD 二次开发程序,用于测试几个功能
// Learn more about F# at http://fsharp.net
module HelloWorld.Commands
open Autodesk.AutoCAD.Runtime
open Autodesk.AutoCAD.ApplicationServices
open Autodesk.AutoCAD.Geometry
open Autodesk.AutoCAD.DatabaseServices
open Autodesk.AutoCAD.EditorInput
//下面的例子涵括了几种常见的ACAD操作,如画线
[<CommandMethod("MyLine")>]
let Testline () =
//let db=HostApplicationServices.WorkingDatabase
let doc =
Application.DocumentManager.MdiActiveDocument
let ed = doc.Editor
let db = doc.Database
//获取点
let pt1= new Point3d(300.0,100.0,0.0)
let pt1=(300.0,150.0,0.0)
let pt2= new Point3d(900.0,500.0,0.0)
//use tr=db.TransactionManager.StartTransaction();
let optPoint=new PromptPointOptions("Please select a point")
let resPoint:PromptPointResult=ed.GetPoint(optPoint)
let pt:Point3d=resPoint.Value
let lineEnt=new Line(pt,pt2)
//注 point3d是在geometry目录下的,而circle是在databaseservices目录下的
let cEnt=new Circle(pt,Vector3d.ZAxis,600.0)
//画线和画圆
use tr=db.TransactionManager.StartTransaction();
let bt=tr.GetObject(db.BlockTableId,OpenMode.ForRead):?>BlockTable
let btr=tr.GetObject(bt.[BlockTableRecord.ModelSpace],OpenMode.ForWrite):?>BlockTableRecord
let id=btr.AppendEntity(lineEnt)
tr.AddNewlyCreatedDBObject(lineEnt, true)
let id=btr.AppendEntity(cEnt)
tr.AddNewlyCreatedDBObject(cEnt, true)
tr.Commit()
use tr=db.TransactionManager.StartTransaction();
let optSel=new PromptSelectionOptions()
///下面这句话是赋值的意思,反正很混乱,什么时候用=什么时候用<-
optSel.MessageForAdding <- "xixi"
//删除选择集
let ressel:PromptSelectionResult=ed.GetSelection(optSel)
let sset:SelectionSet=ressel.Value
let ids = new ObjectId()
let ids=sset.GetObjectIds()
for ssid:ObjectId in ids do
let ent=tr.GetObject(ssid,OpenMode.ForWrite)
ent.Erase()
tr.Commit()
//下面这段得到物体的boundingbox
use tr=db.TransactionManager.StartTransaction();
let optSel=new PromptSelectionOptions()
///下面这句话是赋值的意思,反正很混乱,什么时候用=什么时候用<-
optSel.MessageForAdding <- "select object"
//删除选择集
let ressel:PromptSelectionResult=ed.GetSelection(optSel)
let sset:SelectionSet=ressel.Value
let ids = new ObjectId()
let ids=sset.GetObjectIds()
for ssid:ObjectId in ids do
//let ent=tr.GetObject(ssid,OpenMode.ForWrite)
//ent.Erase()
//非常幸运,看了kean的表达和microsoft的帮助
//http://msdn.microsoft.com/zh-cn/library/dd233220.aspx
let ent=tr.GetObject(ssid,OpenMode.ForRead):?>Entity
let btl:Point3d = ent.GeometricExtents.MinPoint
let tpr:Point3d = ent.GeometricExtents.MaxPoint
let lineEnt=new Line(btl,tpr)
let bt=tr.GetObject(db.BlockTableId,OpenMode.ForRead):?>BlockTable
let btr=tr.GetObject(bt.[BlockTableRecord.ModelSpace],OpenMode.ForWrite):?>BlockTableRecord
let id=btr.AppendEntity(lineEnt)
tr.AddNewlyCreatedDBObject(lineEnt, true)
tr.Commit()
//draw polyline
let Pl:Polyline = new Polyline(5)
Pl.AddVertexAt(0, new Point2d(0.0, 0.0), 0.0, -1.0, -1.0)
Pl.AddVertexAt(1, new Point2d(100.0, 0.0), 0.0, -1.0, -1.0)
Pl.AddVertexAt(2, new Point2d(100.0, 100.0), 0.0, -1.0, -1.0)
Pl.AddVertexAt(3, new Point2d(0.0, 100.0), 0.0, -1.0, -1.0)
Pl.AddVertexAt(4, new Point2d(0.0, 0.0), 0.0, -1.0, -1.0)
use tr=db.TransactionManager.StartTransaction();
let bt=tr.GetObject(db.BlockTableId,OpenMode.ForRead):?>BlockTable
let btr=tr.GetObject(bt.[BlockTableRecord.ModelSpace],OpenMode.ForWrite):?>BlockTableRecord
let id=btr.AppendEntity(Pl)
tr.AddNewlyCreatedDBObject(Pl, true)
tr.Commit()
let doc =
Application.DocumentManager.MdiActiveDocument
let ed = doc.Editor
ed.WriteMessage("\nHello World1!")