今天一早上看了群里有小伙伴有这样的需求,是实现用户用鼠标点击拾取AutoCAD平面,拾取点然后作为插入编号文字位置,按住esc键后,退出自动编号。按照他的需求,我这里大致想了一下,如果按照该小伙伴提出的用多线程和委托,想必有点复杂了。首先AutoCAD是不支持多线程的,至于使用委托,我想大概意思是使用鼠标的点击事件回调而已。还有他另外提到的使用钩子,这估计就更复杂了。我做了一个简单的实现,使用的while循环,然后拾取屏幕上面的点,插入编号的文字即可。至于设置文字的样式什么,可以按照需求进行调整。这里参考了AutoCAD二次开发(.Net)之设置MText字体(1)这篇博客进行修改。具体实现效果如下图所示。
好了,现在来看一下实现的源代码。
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace OrderAuto
{
public class Class1
{
public int orderIndex = 1;
[CommandMethod("zdbh")]
public void demo() {
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
while (true)
{
Transaction trans = db.TransactionManager.StartTransaction();
using (trans)
{
BlockTable blockTbl = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord modelSpace = trans.GetObject(blockTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
MText mt = new MText();
mt.Contents = Convert.ToString(orderIndex);
PromptPointResult ppr = ed.GetPoint("n指点编号的插入点: ");
Point3d location;
if (ppr.Status!=PromptStatus.OK)
{
return;
}else{
location = ppr.Value;
}
DBText acText = new DBText();
acText.Position = location;
acText.Height = 50;
acText.TextString = Convert.ToString(orderIndex);
modelSpace.AppendEntity(acText);
trans.AddNewlyCreatedDBObject(acText, true);
/*
mt.TextStyleId = AddTextStyle("宋体", "1", "3", 20, 20);
mt.Width = 50;
mt.Height = 50;
mt.Location = location;
modelSpace.AppendEntity(mt);
trans.AddNewlyCreatedDBObject(mt, true);*/
trans.Commit();
orderIndex++;
}
}
}
public static ObjectId AddTextStyle(string name, string smallfont, string bigfont, double height, double xscale)
{
Database dbH = HostApplicationServices.WorkingDatabase;
using (Transaction trans = dbH.TransactionManager.StartTransaction())
{
TextStyleTable TST = (TextStyleTable)trans.GetObject(dbH.TextStyleTableId, OpenMode.ForWrite);
ObjectId id = GetIdFromSymbolTable(TST, name);
if (id == ObjectId.Null)
{
TextStyleTableRecord TSTR = new TextStyleTableRecord();
TSTR.Name = name;
TSTR.FileName = smallfont;
TSTR.BigFontFileName = bigfont;
TSTR.TextSize = height;
TSTR.XScale = xscale;
TST.UpgradeOpen();
id = TST.Add(TSTR);
trans.AddNewlyCreatedDBObject(TSTR, true);
}
return id;
}
}
//取得符号表的Id
public static ObjectId GetIdFromSymbolTable(SymbolTable st, string key)
{
Database dbH = HostApplicationServices.WorkingDatabase;
using (Transaction trans = dbH.TransactionManager.StartTransaction())
{
if (st.Has(key))
{
ObjectId idres = st[key];
if (!idres.IsErased)
return idres;
foreach (ObjectId id in st)
{
if (!id.IsErased)
{
SymbolTableRecord str = (SymbolTableRecord)trans.GetObject(id, OpenMode.ForRead);
if (str.Name == key)
return id;
}
}
}
}
return ObjectId.Null;
}
}
}
更多内容,请关注公众号
最后
以上就是活力奇迹最近收集整理的关于AutoCAD二次开发&实现简单的自动编号的全部内容,更多相关AutoCAD二次开发&实现简单内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复