您的位置:首页 > 其它

AutoCAD二次开发(.Net)之多重引线(MLeader)创建

2017-12-29 10:06 645 查看
using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;

[CommandMethod("CREATEMLEADER")]
public void CreateMLeader()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
const string arrowName = "_DOT";
ObjectId arrId = GetArrowObjectId(arrowName);

// Get the start point of the leader
PromptPointResult result =ed.GetPoint("/n 选择标注起始位置: " );
if (result.Status != PromptStatus.OK)
return;
Point3d startPt = result.Value;

// Get the end point of the leader
PromptPointOptions opts =new PromptPointOptions("/n选择标注终止位置: ");
opts.BasePoint = startPt;
opts.UseBasePoint = true;
result = ed.GetPoint(opts);
if (result.Status != PromptStatus.OK)
return;
Point3d endPt = result.Value;

Transaction tr =db.TransactionManager.StartTransaction();
using (tr)
{
try
{
BlockTable bt =(BlockTable)tr.GetObject(db.BlockTableId,OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(  bt[BlockTableRecord.ModelSpace],  OpenMode.ForWrite );

// Create the MLeader
MLeader mld = new MLeader();
int ldNum = mld.AddLeader();
int lnNum = mld.AddLeaderLine(ldNum);
mld.AddFirstVertex(lnNum, startPt);
mld.AddLastVertex(lnNum, endPt);
mld.ArrowSymbolId = arrId;
mld.LeaderLineType = LeaderType.SplineLeader;

// Create the MText
MText mt = new MText();
mt.Contents = "ABC";
mt.Location = endPt;
mld.ContentType = ContentType.MTextContent;
mld.MText = mt;

// Add the MLeader
btr.AppendEntity(mld);
tr.AddNewlyCreatedDBObject(mld, true);
tr.Commit();
}
catch
{
// Would also happen automatically
// if we didn't commit
tr.Abort();
}
}
}
static ObjectId GetArrowObjectId(string newArrName)
{
ObjectId arrObjId = ObjectId.Null;

Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;

// Get the current value of DIMBLK
string oldArrName = Application.GetSystemVariable("DIMBLK") as string;

// Set DIMBLK to the new style
// (this action may create a new block)
Application.SetSystemVariable("DIMBLK", newArrName);

// Reset the previous value of DIMBLK
if (oldArrName.Length != 0)
Application.SetSystemVariable("DIMBLK", oldArrName);

// Now get the objectId of the block
Transaction tr = db.TransactionManager.StartTransaction();
using (tr)
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
arrObjId = bt[newArrName];
tr.Commit();
}
return arrObjId;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: