cad操作方式以及解析:
1):新建一个类库,NetFramework 框架选择3.5,添加AutoCAD 2008的两个dll引用:acmgd.dll,acdbmgd.dll。(在安装目录下能找到)
2):添加命名空间
Autodesk.AutoCAD.ApplicationServices; //CAD实体
Autodesk.AutoCAD.EditorInput;//命令栏
Autodesk.AutoCAD.Runtime;//运行时,如设置 指令
Autodesk.AutoCAD.DatabaseServices;//数据库服务
-
获取当前文档,数据库,和命令栏
-
启一个事务,获取模型空间的所有块表记录;
-
遍历块表记录的所有对象,判定是否为单行文本,如果是则在命令栏输出文本内容。
-
编译和运行
打开CAD,输入netload 加载编译的dll,输入指令:sss,即可看到运行效果
解析单行文本替换:
using (Database blkDb = new Database(false, true))
{
//read drawing
blkDb.ReadDwgFile(ThisAppPath, System.IO.FileShare.Read, true, null);
blkDb.CloseInput(true);
#region 处理替换数据
using (Transaction Bst = blkDb.TransactionManager.StartTransaction())
{
BlockTable btY = (BlockTable)Bst.GetObject(blkDb.BlockTableId, OpenMode.ForRead);
BlockTableRecord btrY = (BlockTableRecord)Bst.GetObject(btY[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
foreach (ObjectId btrId in btrY)///替换对应的数据
{
Entity baseEntity = (Entity)Bst.GetObject(btrId, OpenMode.ForWrite);///获取当前正在处理的
if (baseEntity.GetType() == typeof(DBText))
{
DBText ThisText = (DBText)baseEntity;
if (ThisText.TextString == "05-07-1")
{
ThisText.TextString = "这个是测试清除";
}
if (ThisText.TextString == "TIN-23046")
{
ThisText.TextString = "这是测试清除";
}
}
}
Bst.Commit();
}
}
拷贝数据到已经打开的文件里
[CommandMethod("InsertOut")]
//插入外面的块文件
public static void InsertOut()
{
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
//PromptPointResult ppr = ed.GetPoint("选择插入点");
//Point3d pt = ppr.Value;//获取到插入点
Point3d pt; //utility.WriteToEditor(pt.ToString());
DBOP dal = new DBOP();
List<FileSet> listFiles = new List<FileSet>();
listFiles = dal.Query().ToList();
if (listFiles != null)
{
for (int i = 0; i < listFiles.Count; i++)
{
pt = new Point3d(800 * i, 300, 300);//获取到插入点
string ThisAppPath = $"{Environment.CurrentDirectory}\\modelFile\\{listFiles[i].FileName}";
using (Database blkDb = new Database(false, true))
{
//read drawing
blkDb.ReadDwgFile(ThisAppPath, System.IO.FileShare.Read, true, null);
blkDb.CloseInput(true);
#region 处理替换数据
using (Transaction Bst = blkDb.TransactionManager.StartTransaction())
{
BlockTable btY = (BlockTable)Bst.GetObject(blkDb.BlockTableId, OpenMode.ForRead);
BlockTableRecord btrY = (BlockTableRecord)Bst.GetObject(btY[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
foreach (ObjectId btrId in btrY)///替换对应的数据
{
Entity baseEntity = (Entity)Bst.GetObject(btrId, OpenMode.ForWrite);///获取当前正在处理的
if (baseEntity.GetType() == typeof(DBText))
{
DBText ThisText = (DBText)baseEntity;
if (ThisText.TextString == "05-07-1")
{
ThisText.TextString = "这个是测试清除";
}
if (ThisText.TextString == "TIN-23046")
{
ThisText.TextString = "这是测试清除";
}
}
}
Bst.Commit();
}
#endregion
using (DocumentLock docLock = doc.LockDocument())//多文档要先这样,否则报至命错误
{
using (Transaction t = doc.TransactionManager.StartTransaction())
{
string name = $"a{i}";//aa是不与blockPath文件中的任何块重名的字符串
//insert it as a new block
ObjectId idBTR = doc.Database.Insert(name, blkDb, false);
//create a ref to the block
BlockTable bt = (BlockTable)t.GetObject(doc.Database.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
using (BlockReference bref = new BlockReference(pt, idBTR)) //pt是一个Point3D坐标,这里是插入进当前dwg文件中
{
btr.AppendEntity(bref);
t.AddNewlyCreatedDBObject(bref, true);
}
t.Commit();
}
}
}
}
}
}
创建dll
l链接文件:
command "netload" "D:\test\CAD\CAD控件Test\CadCommand\CadCommand\CadCommand\bin\Debug\CadCommand.dll"