AutoCAD实现批量复制要素至指定点位置(附插件下载地址)

本文介绍了如何使用C#.NETFramework3.5开发一个AutoCAD2008的加载项,实现在模型空间中将选定要素复制到用户指定的多个点。开发者提供了详细步骤和源代码,适用于简单的自动化任务。
摘要由CSDN通过智能技术生成

一、背景

        在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

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值