CAD二次开发

参考博客:

https://blog.csdn.net/yzk1062913581/category_9820791.html

 

网址:

https://mp.weixin.qq.com/s?__biz=MzA3NzI3MjgyNQ==&mid=2247484008&idx=1&sn=8dac6e256c4bd0cfb533f33d5856ae9c&chksm=9f55c1fea82248e86a217b133202809420686ab0c52fd53877ce37f76e47a8e0663ae70429ea&token=1778975585&lang=zh_CN#rd

 

 

CAD中的文本会设计到与外部文件的交互,需要输出到Excel或是txt中进行统计分析,关于C#读写Excel和txt的方式有多种,可自行查阅相关资料。

 

先上结果:

图片

 

如何实现,请见下文!

 

 

1 输出到Excel

 

 

添加一个Windows窗体

 




图片


 

添加两个按钮




图片


 

可以在属性Text中设置窗口和控件的名称以及大小,这个自行去摸索,都是可视化界面操作的东西。

 

图片




图片


 

给按钮添加点击事件

 




图片


 

写入代码




图片


 

C#读取Excel的方式有多种(可参考:https://www.cnblogs.com/kenjiang/p/10790652.html)

 

这里使用NPOI的方式读写Excel

NPOI项目地址:https://github.com/tonyqus/npoi

 

在这方式读取Excel不需要安装Office,读取速度也很快,可以直接在Nuget下载,你可以准备下载好的dll,离线使用

 

有网就直接在Nuget下载,这样方便

 




图片


 

安装即可

 




图片


 

添加引用命名空间

 

using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;   
using NPOI.XSSF.UserModel;

 

这下就可以开始将你需要输出的文本内容输出到Excel了

 

通过选择集过滤方式,选取多行文本,然后遍历每一个选择对象,将遍历结果添加至一个List中

List<string> lstAddStr = new List<string>();  //读取的结果存在这里

Database db = HostApplicationServices.WorkingDatabase;
Document doc = Application.DocumentManager.MdiActiveDocument;
SetFocus(doc.Window.Handle);       //选择完文件在切换焦点
                                   //锁定文档
using (DocumentLock acLckDoc = doc.LockDocument())
{
    //框选获取文字 
    //设置选择集过滤器为只选择多行文本
    TypedValue[] typeValue = new TypedValue[1];
    typeValue.SetValue(new TypedValue(0, "MTEXT"), 0);
    SelectionSet acSSet = this.SelectSsGet("GetSelection", null, typeValue);

    if (acSSet != null)
    {
        foreach (SelectedObject selObj in acSSet)
        {
            // 确认返回的是合法的SelectedObject对象  
            if (selObj != null) //
            {

                using (Transaction trans = db.TransactionManager.StartTransaction())
                {
                    MText myent = trans.GetObject(selObj.ObjectId, OpenMode.ForWrite) as MText;
                    lstAddStr.Add(myent.Contents); 
                }
            }
        }
    }

 

输出到Excel

 

IWorkbook wk = null;  //新建IWorkbook对象

string localFilePath = "D:\\TEST.xlsx";

// 调用一个系统自带的保存文件对话框 写一个EXCEL
SaveFileDialog saveFileDialog = new SaveFileDialog();   //新建winform自带保存文件对话框对象
saveFileDialog.Filter = "Excel Office97-2003(*.xls)|*.xls|Excel Office2007及以上(*.xlsx)|*.xlsx";  //过滤只能存储的对象
DialogResult result = saveFileDialog.ShowDialog();     //显示对话框
localFilePath = saveFileDialog.FileName.ToString();
//07版之前和之后创建方式不一样
if (localFilePath.IndexOf(".xlsx") > 0) // 2007版
{
    wk = new XSSFWorkbook();   //创建表格对象07版之后
}
else if (localFilePath.IndexOf(".xls") > 0) // 创建表格对象 2003版本
{
    wk = new HSSFWorkbook();  //03版
}
//创建工作簿
ISheet tb = wk.CreateSheet("输出的文本");
for (int i = 0; i < lstAddStr.Count; i++)
{
    ICell cell = tb.CreateRow(i).CreateCell(0);  //单元格对象 第i行第0列  cell 单元格对象
    cell.SetCellValue(lstAddStr[i]);//循环往单元格赋值
}
//创建文件
using (FileStream fs = File.OpenWrite(localFilePath)) //打开一个xls文件,如果没有则自行创建,如果存在myxls.xls文件则在创建是不要打开该文件!
{
    wk.Write(fs);   //文件IO 创建EXCEL
    MessageBox.Show("提示:创建成功!");
    fs.Close();
}

 

 

2 输出到txt

 

将获取的多行文本输出到TxT

 

C# 读写txt文本的方案可参考:

https://www.cnblogs.com/stilldream/p/10044011.html

跟上面一样,选择集过滤选取后,输出到txt中

 

代码:

SaveFileDialog saveDlg = new SaveFileDialog();
saveDlg.Title = "输出文本内容";
saveDlg.Filter = "文本文件(*.txt)|*.txt";

saveDlg.InitialDirectory = Path.GetDirectoryName(db.Filename);
string fileName = Path.GetFileName(db.Filename);
saveDlg.FileName = fileName.Substring(0, fileName.IndexOf('.'));
DialogResult saveDlgRes = saveDlg.ShowDialog();
if (saveDlgRes == DialogResult.OK)
{
    string[] contents = new string[lstAddStr.Count];
    for (int i = 0; i < lstAddStr.Count; i++)
    {
        contents[i] = lstAddStr[i].ToString();
    }
    File.WriteAllLines(saveDlg.FileName, contents);
}

 

最后在类文件中新建一个命令来调用写好的窗口程序,可以选择模态和非模态的方式

using Autodesk.AutoCAD.Runtime;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _09_输出文本
{
    public class Class1
    {
        [CommandMethod("CTE")] //CAD启动界面
        public void CADTextExport()
{
            myForm myfrom = new myForm();
            //  Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(myfrom); //在CAD里头显示界面  模态显示

            Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog(myfrom); //在CAD里头显示界面  非模态显示
                                                                                         // myfrom.sh


        }
    }
}

 

CAD里面通过命令就可以调用该窗口程序了

 

 这里输出的是多行文本,如果想输出单行文本或者都输出,只需要在选择集过滤那里改一下即可。

 

完整代码自取地址:https://gitee.com/yuzhaokai/CADExampleDemo.git

posted @   Domefy  阅读(1042)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示