需求分析
在打开CAD之后,用户输入一个命令,CAD会弹出一个对话框,然后用户输入文本,点击确定之后,用户在CAD图面上选择要插入的点,然后点击之后则会在点击的地方插入文字和图块。
一、思路
开发环境:cad版本为2010,vs2015
AutoCAD.NET API 专门提供了两个有关的函数来实现对话框,
ShowModalDialog(Form formToShow)函数,所以我们需要创建一个Form类的对象。
二、实现
首先创建一个类库项目,添加acdbmgd.dll和acmgd.dll引用,记得将复制本地改为False,在添加一个窗体,用户设计我们的窗体界面,界面比较简单,如下所示
确定按钮事件,插入文字部份之前有提到,这里就不在赘述了,插入图块这次使用的是插入外部图块的方法。
private void button1_Click(object sender, EventArgs e)
{
this.Close();
Database db = HostApplicationServices.WorkingDatabase;
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
PromptPointResult ppr = ed.GetPoint("请选择插入点");
Point3d pt = ppr.Value;
string CutId = this.textBoxCutId.Text;
double x = pt.X;
double y = pt.Y;
double z = pt.Z;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
string path = @"D:\cad\";
BlockTools.InsertBlockFromDwg("ST-GGXHB", path + "GGXHB.dwg", pt, new Scale3d(1)); // 规格型号表格
db.AddToModelSpace(addText(CutId, new Point3d(x + 13.79, y - 6.09, 0), 1.9, "Standard"), "0");
db.AddToModelSpace(addText("W-" + CutId, new Point3d(x + 43.95, y - 6.09, 0), 1.9, "Standard"), "0");
db.AddToModelSpace(addText("75", new Point3d(x + 66.86, y - 6.09, 0), 2.0, "Standard"), "0");
db.AddToModelSpace(addText(CutId + "(50)", new Point3d(x + 13.79, y - 9.83, 0), 1.9, "Standard"), "0");
db.AddToModelSpace(addText("W-" + CutId + "(50)", new Point3d(x + 43.95, y - 9.83, 0), 1.9, "Standard"), "0");
db.AddToModelSpace(addText("50", new Point3d(x + 66.86, y - 9.83, 0), 2.0, "Standard"), "0");
db.AddToModelSpace(addText(CutId + "-K", new Point3d(x + 13.79, y - 13.61, 0), 1.9, "Standard"), "0");
db.AddToModelSpace(addText(CutId + "(BZ)", new Point3d(x + 13.79, y - 17.4, 0), 1.9, "Standard"), "0");
trans.Commit();
}
}
public static void InsertBlockFromDwg(string BlockName, string filename, Point3d position, Scale3d scale)
{
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
using (Database db = new Database(false, true))
{
using (Transaction trans = doc.TransactionManager.StartTransaction())
{
//如果文件存在
if (File.Exists(filename))
{
db.ReadDwgFile(filename, FileShare.Read, true, null);
db.CloseInput(true);
string name = BlockName;
ObjectId btrId = doc.Database.Insert(name, db, false);
//獲取數據庫塊表對象
BlockTable bt = (BlockTable)trans.GetObject(doc.Database.BlockTableId, OpenMode.ForRead);
//打開數據庫模型空間塊表記錄對象
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
using (BlockReference br = new BlockReference(position, btrId))
{
br.ScaleFactors = scale;//设置块参照的缩放比例
btr.AppendEntity(br);
trans.AddNewlyCreatedDBObject(br, true);
}
}
trans.Commit();
}
}
}
最后在类库项目中添加一个命令,名字自定义
[CommandMethod("AD")]
public static void AD()
{
ModalForm form = new ModalForm(); // 創建對話框
Application.ShowModalDialog(form); // 顯示對話框
}
最后打开CAD,输入netload加载项目生成的dll,然后输入ad命令,操作即可。
三、效果
最后实现效果如下