前段时间,对CAD的文件进行操作的开源代码,我看了好几个,从ASCII码出发去解析,实现一些功能。 介于最近的任务很重,需要写界面,对.dxf 文件进行操作等,需要去想软件的逻辑,我终于明确自己的任务,在这篇博客里写总结,催促自己多写代码多练习。
AutoCAD真的很强大,图形库,database很全面。 找来.net 开发的手册。首先粘上.net 的API.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
时间线,回来更新博客。 Document对象,实际上就是一个AutoCAD图形,是DocumentCollection对象的一部分,提供了访问与Document对象相关联的Database对象的功能。Database对象包含AutoCAD的全部图形对象和大部分非图形对象。 Document对象连同Database对象一起,提供了对图形状态栏、图形窗口、编辑器(Editor)及事务管理器(TransactionManager)对象的访问。Editor对象提供了获取用户输入的功能,用户输入的形式可以是一个点、键入的一个字串或数值等。
Database对象包含AutoCAD所有的图形对象和决大部分非图形对象,其中包括实体(图元)、符号表、命名字典等。实体(图元)表示图形里的图形对象,直线、圆、弧线、文字、填充和多义线等都是实体。用户能在屏幕上看到实体并可以对其进行操作。
可通过Document对象的Database成员属性来访问当前文档的Database对象: Application.DocumentManager.MdiActiveDocument.Database
图形对象,又称为实体,是组成图形的可见对象(线、圆、光栅图像,等等)。向当前图形添加图形对象的方法是,通过引用正确的块表记录,使用AppendEntity方法将要添加的新对象添加到图形中。
要修改或查询对象,先从相应的块表记录里获得对该对象的引用,然后调用该对象自己的方法或属性。每个图形对象都拥有一些方法,这些方法实现了与大部分AutoCAD编辑命令相同的功能,像复制、删除、移动、镜像,等等。
这些对象还有一些方法,用于检索扩展数据(xdata)、突出显示和取消突出显示、从别的实体设置属性等。大多数图形对象都拥有一些彼此共有的属性,比如LayerId、LinetypeId、Color、Handle等。另外每个图形对象还拥有自己特有的属性,比如Center、StartPoint、Radius,以及FitTolerance等。
AutoCAD使用集合或容器对象对大部分图形对象和非图形对象进行了分组。尽管集合包含不同的数据类型,仍可用相似的技术对它们进行处理。每个集合都拥有把一个对象添加到集合里的方法和从集合里获取一个集合项的方法。大多数集合调用Add方法或SetAt方法将一个对象添加到集合里。
大多数集合都提供类似的方法和属性,以便于使用和学习。Count属性返回集合里从0开始的对象计数,Item函数从集合里返回一个对象。AutoCAD .NET API中的集合成员举例如下:
• 图层符号表中的图层表记录;
• ACAD_LAYOUT字典中的布局;
• 文档集合中的文档;
• 块参考中的属性;
1. 如何引用对象层次中的对象
我们使用.NET API中的对象时,可以直接引用某些对象,或者通过基于所用对象的用户自定义变量引用该对象。要直接引用一个对象,只要在调用层次中包含该对象即可。例如,下面的代码将一个图形文件附加到当前图形的数据库中。注意其调用层次是从Application对象开始一直到Database对象,最后在Database对象上调用AttachXref()方法:
C#
string strFName, strBlkName;
Autodesk.AutoCAD.DatabaseServices.ObjectId objId;
strFName = "c:/clients/Proj 123/grid.dwg";
strBlkName = System.IO.Path.GetFileNameWithoutExtension(strFName);
objId = Application.DocumentManager.MdiActiveDocument.Database.AttachXref(strFName, strBlkName);
要通过用户自定义变量引用对象,首先定义一个所需类型的变量,然后将相应对象赋值给该变量。例如下列代码定义了一个Autodesk.AutoCAD.DatabaseServices.Database类型的变量acCurDb,并将当前数据库赋值给该变量:
C#
Autodesk.AutoCAD.DatabaseServices.Database acCurDb;
acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
接下来下面的代码使用自定义变量acCurDb将一个图形文件添加到数据库:
C#
string strFName, strBlkName;
Autodesk.AutoCAD.DatabaseServices.ObjectId objId;
strFName = "c:/clients/Proj 123/grid.dwg";
strBlkName = System.IO.Path.GetFileNameWithoutExtension(strFName);
objId = acCurDb.AttachXref(strFName, strBlkName);
2.从模型空间检索实体对象
下面示例代码返回模型空间中所有实体对象的列表。类似代码还可以对图纸空间的实体做相同的事情。注意所有图形对象都是实体对象:
C#
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
19
[CommandMethod("ListEntities")]
public static void ListEntities()
{
// 获取当前数据库,启动事务
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// 以读模式打开块表
BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
OpenMode.ForRead) as BlockTable;
// 以读模式打开块表记录模型空间
BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
OpenMode.ForRead) as BlockTableRecord;
int nCnt = 0;
acDoc.Editor.WriteMessage("\nModel space objects: ");
// 遍历模型空间里的每个对象,并显示找到的对象的类型
foreach (ObjectId acObjId in acBlkTblRec)
{
acDoc.Editor.WriteMessage("\n" + acObjId.ObjectClass.DxfName);
nCnt = nCnt + 1;
}
// 如果没发现对象则显示提示信息
if (nCnt == 0)
{
acDoc.Editor.WriteMessage("\n No objects found");
}
// 关闭事务
}
}
问题1: 仔细查看mesh 算法,对待不同的线的处理。绘制出mesh图
问题2: 继承ICAD类,修改cad的部分,对应到mesh去。
问题3:复杂shape的处理 记录,必须解决。再理一次仿真流程,隔离出几个part
问题4:Qt环境配置+qt creator