CAD二开(c#)小试牛刀系列2 简单的数量统计实列表格与单行文字 添加实体

文章介绍了如何在CAD2019环境中,利用VisualStudio2022编写代码,实现选择多条直线,测量其长度,并将长度分段后插入表格,并在图中以单行文字形式显示表格序号的功能。
摘要由CSDN通过智能技术生成

使用工具==CAD2019+VS2022

主要作用==选择多条直线,将直线的长度分段汇入表格,并以单行文字的形式将表格序号绘制在图中

代码内容一:添加实体到cad中

//添加实体
public static ObjectId AddToModelSpace(this Database db, Entity ent)
{
    ObjectId entId;
    
    using (Transaction trans = db.TransactionManager.StartTransaction())
    {        
        BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
        BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
        entId = btr.AppendEntity(ent);
        trans.AddNewlyCreatedDBObject(ent, true);
        trans.Commit();
    return entId; 
}

代码内容二:

public void Test()
{            
    Database db =HostApplicationServices.WorkingDatabase; 
    Editor ed = AutoCad.Application.DocumentManager.MdiActiveDocument.Editor;
    
    List<Point3d> points = new List<Point3d>();//点集合
    Line xian = new Line();//直线
    List<Line> lines = new List<Line>();  //直线集合          
    List<double> lineLenth = new List<double>(); //直线长集合           
    int nums = lineLenth.Count;  //计量          
    double allLength = 0;  //   直线总长
//获取图层       
    string firstLayName = null;//初始图层名            
    PromptEntityResult pEntr = ed.GetEntity("\n" + "指定图层所在实体");
    if (pEntr.Status == PromptStatus.OK)
    {
        ObjectId entId = pEntr.ObjectId;
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            Entity ent = trans.GetObject(entId, OpenMode.ForRead) as Entity;
            firstLayName = ent.Layer;
            trans.Commit();
        }

    }
    wind.MessageBox.Show("指定的图层为:" + firstLayName);
//按图层获取数据
    TypedValue[] values = new TypedValue[]
    {
          new TypedValue((int)DxfCode.LayerName,firstLayName),
          new TypedValue((int)DxfCode.Start,"LINE"),
    };
    SelectionFilter filter = new SelectionFilter(values);
    PromptSelectionResult psResult = ed.GetSelection(filter);

    if (psResult.Status == PromptStatus.OK)
    {
        ObjectId[] ids = psResult.Value.GetObjectIds();
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            foreach (ObjectId item in ids)
            {
                Entity ents = trans.GetObject(item, OpenMode.ForRead) as Entity;
                if (ents is Line)
                {
                    xian = ents as Line;
                    lines.Add(xian);
                    lineLenth.Add(xian.Length);
                }
                else
                {
                    wind.MessageBox.Show("选择的不是直线类型");
                }
            }
            //allLength = CalculateSum(lineLenth);//统计
            trans.Commit();
        }

        //绘制表格
        Table tab = new Table();

        for (int j = 0; j < lineLenth.Count; j++)
        {
            PromptPointResult psPoint = ed.GetPoint("选择表格插入位置");
            tab.Position = new Point3d(330.4926, 198.9996, 0);
            tab.SetSize(j + 2, 5);
            //宽度
            //tab.Width = 60;
            tab.Columns[0].Width = 20;
            tab.Columns[1].Width = 20;
            tab.Columns[2].Width = 30;
            tab.Columns[3].Width = 30;
            tab.Columns[4].Width = 30;
            //表头
            tab.Cells[0, 0].TextString = "统计表";
            tab.Cells[1, 0].TextString = "点名";
            tab.Cells[1, 1].TextString = "线长";
            tab.Cells[1, 2].TextString = "图层名";
            tab.Cells[1, 3].TextString = "X坐标";
            tab.Cells[1, 4].TextString = "Y坐标";

            //内容
            tab.Cells[1 + j, 0].TextString = j.ToString();//点名
            tab.Cells[1 + j, 1].TextString = lineLenth[j].ToString("0.00");//线长
            tab.Cells[1 + j, 2].TextString = firstLayName; //图层名
            tab.Cells[1 + j, 3].TextString = lines[j].StartPoint.X.ToString("0.000"); //X坐标
            tab.Cells[1 + j, 4].TextString = lines[j].StartPoint.Y.ToString("0.000"); //Y坐标

        }
        Tools.AddToModelSpace(db, tab);

        //添加文字
        for (int j = 0; j < lineLenth.Count; j++)
        {
            DBText dText = new DBText();

            Point3d point3 = new Point3d(lines[j].StartPoint.X, lines[j].StartPoint.Y, 0);
            points.Add(point3);
            dText.Position = points[j];
            dText.TextString = j.ToString();//点名;
            Tools.AddToModelSpace(db, dText);
        }
        
    }

    //没有选择
    else
    {
        wind.MessageBox.Show("选择不能为空");
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值