一、背景
在AutoCAD文档中需要将选择的要素复制到指定的多个点的位置上去,实际项目需求如不确定图块的样式,先用一个点代替,后续再作替换。
二、解决办法
使用C# .NET Framework 3.5对AutoCAD2008进行加载项开发。
下面是源代码
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.DatabaseServices;
namespace CAD要素复制至指定点
{
public class Class1
{
[CommandMethod("FECOPYTOPOINTS")]
public static void copy_fe_to_pt()
{
var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
var db = doc.Database;
ed.WriteMessage("选择需要复制的要素:\n");
var proselectionres_fe = ed.GetSelection();
if (proselectionres_fe.Status != PromptStatus.OK || proselectionres_fe.Value.Count == 0)
{
ed.WriteMessage("未选择任何要素:\n");
return;
}
var objids_fe = proselectionres_fe.Value.GetObjectIds();
var st_pt_promt = ed.GetPoint("指定基点:\n");
if (st_pt_promt.Status != PromptStatus.OK)
{
ed.WriteMessage("已取消!\n");
return;
}
var st_pt = st_pt_promt.Value;
ed.WriteMessage("选择需要插入的点位置:\n");
TypedValue[] tv_s = new TypedValue[] { new TypedValue((int)DxfCode.Start, "POINT") };
SelectionFilter sf_pt = new SelectionFilter(tv_s);
var proselectionres_pt = ed.GetSelection(sf_pt);
if (proselectionres_pt.Status != PromptStatus.OK)
{
ed.WriteMessage("未选择任何点!已退出!\n");
return;
}
var objids_pt = proselectionres_pt.Value.GetObjectIds();
using (var tr = db.TransactionManager.StartTransaction())
{
var bt = tr.GetObject(db.BlockTableId,OpenMode.ForRead) as BlockTable;
var btr = tr.GetObject(bt[BlockTableRecord.ModelSpace],OpenMode.ForWrite) as BlockTableRecord;
foreach (var pt_id in objids_pt)
{
var pt = tr.GetObject(pt_id,OpenMode.ForRead) as DBPoint;
foreach (var fe_id in objids_fe)
{
Entity fe = tr.GetObject(fe_id,OpenMode.ForRead) as Entity;
Matrix3d mt = Matrix3d.Displacement(st_pt.GetVectorTo(pt.Position));
var fe_copy = fe.GetTransformedCopy(mt);
btr.AppendEntity(fe_copy);
tr.AddNewlyCreatedDBObject(fe_copy,true);
}
}
tr.Commit();
}
ed.WriteMessage("处理完成!\n");
ed.WriteMessage("熊顺兵 2024-01!\n");
}
}
}
三、插件使用
1、打开AutoCAD2008,交互窗口输入加载命令:netload;
2、选择文件:CAD要素复制至指定点.dll;
3、在AutoCAD2008交互窗口输入:FECOPYTOPOINTS;
4、根据窗口提示操作即可;
四、本插件的应用场景可能很单一,逻辑也很简单但是有的时候还是可以帮大忙的,如果您觉得可以帮到您的话请点个赞吧。
最后附上插件的下载地址:
链接:https://pan.baidu.com/s/1tAkHCZ09lsCPtWf8KdCcsA
提取码:c29m