- MxDraw 云图
- 快速入门
- 前端 mxdraw 和 mxcad 库预览编辑图纸
- 后台使用 Node.js 调用梦想 API
- CAD 与 GIS 集成说明
- 梦想云图 Node.JS 服务
- iOS 开发
- 安卓开发
- 网页 CAD 开发
- 网页快速入门 aspaps.netphpjava
- 图形数据库
- 参数化绘图
- 交互绘图
- 选择集
- 扩展数据
- 自定义实体
- 自定义命令
- 光栅图处理
- 图面搜索
- 控件事件
- 打印控制
- 界面控制
- COM 开发
- 视频教程
- VB 快速入门
- Delphi 快速入门
- CSharp 快速入门
- java 快速入门
- QT 快速入门
- 易语言快速入门
- Powerbuilder 快速入门
- wpf 控件入门
- 图形数据库
- 参数化绘图
- 交互绘图
- 选择集
- 扩展数据
- 自定义命令
- 自定义实体
- 打印控制
- 控件事件
- 图面搜索
- 光栅图处理
- 界面控制
- C++ 开发
- C++ bulider 快速入门
- C++ 快速入门(VS2010)
- C++ 快速入门(com 接口)
- 图纸数据库
- 参数化绘图
- 交互绘图
- 选择集
- 扩展程序
- 扩展数据
- 自定义函数
- 自定义实体
- 光栅图处理
- 图面搜索
- 控件事件
- 界面控制
- 常见问题
- 试用技术服务申请
- 会员下载最新程序
- 备用下载
- 控件安装运行说明
- 控件最新更新
- 控件功能简介
- 控件图形数据库
- 控件界面控制
- 控件命令执行原理
- 控件系统变量说明
- 控件常见问题说明
- 修改对象属性
- 网页加载 CAD 图纸的两个方案
- MxDraw3D 控件
- 前端基础工程化知识
块表
DWG数据库中,所有图块存放在块表中,块表类名:MxDrawBlockTable
,它的详细接口说明参考:http://www.mxdraw.com/help/IMxDrawBlockTable.htm
块表中每一条记录称为块表记录,类名:MxDrawBlockTableRecord
,它的详细接口说明参考:http://www.mxdraw.com/help/IMxDrawBlockTableRecord.htm
块表记录中存放所有实体数据。每个DWG数据库中,到少有一个名为"*Model_Space"
的块表记录(模型空间),CAD图纸打开后,默认看到的对象都存放在模型空间,有一种对象是块引用MxDrawBlockReference,它的详细接口说明参考:http://www.mxdraw.com/help/IMxDrawBlockReference.htm,块引用又可以指向另一个块表记录。
调用MxDrawDatabase::GetBlockTable 得到DWG数据库中块表
private void GetAllEntity() { MxDrawApplication app = new MxDrawApplication(); MxDrawUtility mxUtility = new MxDrawUtility(); // 得到当前图纸空间 MxDrawBlockTableRecord blkRec = app.WorkingDatabase().CurrentSpace(); // 创建一个用于遍历当前图纸空间的遍历器 MxDrawBlockTableRecordIterator iter = blkRec.NewIterator(); if (iter == null) return; // 所有实体的id数组。 List<Int32> aryId = new List<Int32>(); int iLineNum = 0; // 循环得到所有实体 for (; !iter.Done(); iter.Step(true, false)) { // 得到遍历器当前的实体 MxDrawEntity ent = iter.GetEntity(); if (ent == null) continue; // 得到实体的id aryId.Add((int)ent.ObjectID); if (ent is MxDrawLine) { // 当前实体是一个直线 MxDrawLine line = (MxDrawLine)ent; iLineNum++; } else if (ent is MxDrawBlockReference) { // 当前实体是一个块引用 MxDrawBlockReference blkRef = (MxDrawBlockReference)ent; for (int j = 0; j < blkRef.AttributeCount; j++) { // 得到块引用中所有的属性 MxDrawAttribute attrib = blkRef.AttributeItem(j); mxUtility.Prompt("n Tag: " + attrib.Tag + "Text:" + attrib.TextString); } } // else if (ent is 其它类型) //{ // ... .... //} } String sT; sT = "发现" + aryId.Count + "个实体,其中有" + iLineNum + "个直线"; MessageBox.Show(sT); }
E.添加块表记录
下面代码,判断块表中是否有指定名称的块表记录,如果没有就增一个块表记录。
// 创建一个选择集对象. MxDrawSelectionSet ss = new MxDrawSelectionSet(); // 让用户在图上选择对象. ss.Select(MCAD_McSelect.mcSelectionSetUserSelect, null, null, null); // 得到用户选择的对象,把对象的id放入aryID List<Int64> aryId = new List<Int64>(); for (Int32 i = 0; i < ss.Count; i++) { MxDrawEntity ent = ss.Item(i); if (ent != null) { aryId.Add(ent.ObjectID); ent.Close(); } } // 调用函数,把选择的对象做成一个块。 MakeEntitysToBlock(axMxDrawX1,aryId);
G. 把一个DWG文件插入到当前文件
调用控件的InsertBlock函数,把一个DWG文件,插入到图上,指定一个块名,放在块表记录中。InsertBlock的函数详细说明:http://www.mxdraw.com/help/MxDrawXLib___DMxDrawX__InsertBlock@BSTR@BSTR.htm,
如果给的图块名,当前图上已经有该名称的图块,可以调用Mx_InsertBlockEx 自定义函数,告诉控件是否需要重新定义图块。Mx_InsertBlockEx的详细说明: http://www.mxdraw.com/help/MxDrawXCustomFunction__Mx_InsertBlockEx@CString@CString@INT@CString@bool.htm
然后调用DrawBlockReference函数绘制块引用,引用InsertBlock创建的块表记录。函数详细说明:http://www.mxdraw.com/help/MxDrawXLib___DMxDrawX__DrawBlockReference@DOUBLE@DOUBLE@BSTR@DOUBLE@DOUBLE.htm
下面代码,演示如何插入DWG.
axMxDrawX1.InsertBlock("G:\pt1000.dwg", "MyBlkName"); axMxDrawX1.DrawBlockReference(0, 0, "MyBlkName", 1.0, 0.0); axMxDrawX1.ZoomAll();
H. 把一个图块插入基出,修正到图块的中心点。
下面,会遍历图块中所有实体,然后求所有实体的最小外包,再计算出外包的中心点,再把块记录的Origin属性修改到中心点。sBlkName是图块名。
private bool ModifyBlockInsertPointToCenter(String sBlkName) { //返回控件的数据库对象 MxDrawDatabase databae = (MxDrawDatabase)axMxDrawX1.GetDatabase(); //返回数据库中的块表对象 MxDrawBlockTable blkTab = databae.GetBlockTable(); MxDrawBlockTableRecord blkRec = blkTab.GetAt(sBlkName); if (blkRec == null) return false; //创建一个遍历块表中所有记录的遍历器 MxDrawBlockTableRecordIterator mBlockTableReciter = blkRec.NewIterator(); MxDrawPoint mMaxPt = new MxDrawPoint(); MxDrawPoint mMinPt = new MxDrawPoint(); MxDrawPoint mMaxPtTemp = new MxDrawPoint(); MxDrawPoint mMinPtTemp = new MxDrawPoint(); bool isFirstEnt = true; //移动当前遍历器位置 for (; !mBlockTableReciter.Done(); mBlockTableReciter.Step(true, false)) { //与用户交互在图面上选择一个实体 MxDrawEntity ent = mBlockTableReciter.GetEntity(); //返回实体的最小矩形框外包 ent.GetBoundingBox(out mMinPtTemp, out mMaxPtTemp); if ((mMinPtTemp == null) || (mMaxPtTemp == null)) break; if (isFirstEnt) { mMinPt.x = mMinPtTemp.x; mMinPt.y = mMinPtTemp.y; mMaxPt.x = mMaxPtTemp.x; mMaxPt.y = mMaxPtTemp.y; isFirstEnt = false; } else { mMaxPt.x = Math.Max(mMaxPt.x, mMaxPtTemp.x); mMaxPt.y = Math.Max(mMaxPt.y, mMaxPtTemp.y); mMinPt.x = Math.Min(mMinPt.x, mMinPtTemp.x); mMinPt.y = Math.Min(mMinPt.y, mMinPtTemp.y); } } if (isFirstEnt) { // 没有实体 return false; } MxDrawPoint mNewBasePt = new MxDrawPoint(); mNewBasePt.x = mMinPt.x + (mMaxPt.x - mMinPt.x) / 2; mNewBasePt.y = mMinPt.y + (mMaxPt.y - mMinPt.y) / 2; //块表记录的插入原点属性 blkRec.Origin = mNewBasePt; //重新生成图,重新生成所有显示数据 axMxDrawX1.Regen(); return true; }
I. 属性块
下面我们演示如果在AutoCAD中做一个属性块文件,然后在控件中如何插入该属性块,并修改它的属性。
1. 打开AutoCAD软件,画一些图形,比如我画了一个圆,然后用attdef命令,插入一个属性定义,如下图:
插入属性定义,如下图
2. 使用WBLOCK命令,把我们画的图形输入一个块文件,命令界面如下:
基点,选对圆的中心位置,它是图块的插入原点,点选择对象,选择我们刚画的圆和属性定义,目标指定我们的输出文件位置.
这样我们做好图块文件MyBlock.dwg
3. 下面代码,会插入MyBlock.dwg文件,然后绘一个属性块,然后修改图块属性文字,
c#如下:
private void InsertAttribBlock() { // 注释文本内容 String sNoteText = "这是属性文字"; // 注释图块名 String sNote = "NoteBlockName"; // 让用点取一个注释插入点。 MxDrawUtility mxUtility = new MxDrawUtility(); MxDrawPoint point = (MxDrawPoint)(mxUtility.GetPoint(null, "点取插入点 :")); if (point == null) { MessageBox.Show("用户取消.."); return; } // 得到当前应用对象 MxDrawApplication app = new MxDrawApplication(); // 得到当前数据库 MxDrawDatabase curDatabase = app.WorkingDatabase(); // 得到块表对象 MxDrawBlockTable blkTable = curDatabase.GetBlockTable(); // 得到当前空间 MxDrawBlockTableRecord curSpace = curDatabase.CurrentSpace(); // 当前块表中是否已经有名为sNote的块表记录,如有返回 MxDrawBlockTableRecord blkRec = blkTable.GetAt(sNote, true); if (blkRec == null) { // 没有就新插入块表记录 // sBlkFilePath是块文字路径 String sBlkFilePath = "H:\\MyBlock.dwg"; // 把dwg文件导入到当前数据库。 axMxDrawX1.InsertBlock(sBlkFilePath, sNote); // 得到新插入的块表记录 blkRec = blkTable.GetAt(sNote, true); } if (blkRec != null) { // 在当前空间中插入一个块引用。 MxDrawBlockReference blkRef = curSpace.InsertBlock(point.x, point.y, sNote, 4.0, 0.0); // 创建属性块的属性。 MxDrawResbuf param = new MxDrawResbuf(); blkRef.SetProp("createAttribute", param); // 修改属性文字。 for (int j = 0; j < blkRef.AttributeCount; j++) { // 得到块引用中所有的属性 MxDrawAttribute attrib = blkRef.AttributeItem(j); if (attrib.Tag == "MYATTRIB") { attrib.TextString = sNoteText; } } // 修改了属性文字,通知块引用更新显示。 blkRef.AssertWriteEnabled(); } }
运行效果如下图:
J.得到图上所有属性块的属性文本.
下面代码,得到图上所有图块,然后遍历每个图块,再遍历每个属性块的属性
C#代码:
private void TestGeAlltBlockAttrib() { // 构造一个选择集. MxDrawSelectionSet ss = new MxDrawSelectionSet(); // 创建一个过滤选择条件. MxDrawResbuf spFilte = new MxDrawResbuf(); // 把块引用对象,当着过滤条件. spFilte.AddStringEx("INSERT", 5020); // 得到图上,所有引用对象. ss.AllSelect(spFilte); String str = ""; // 遍历所有块引用。 for (var i = 0; i < ss.Count; i++) { MxDrawEntity ent = ss.Item(i); if (ent == null) continue; if (ent.ObjectName == "McDbBlockReference") { MxDrawBlockReference blkRef = (MxDrawBlockReference)ent; // 遍历属性块的属性。 for (var j = 0; j < blkRef.AttributeCount; j++) { // 得到块引用中所有的属性 MxDrawAttribute attrib = blkRef.AttributeItem(j); str += attrib.TextString + "---"; } } } MessageBox.Show(str); }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论