1. 控件支持扩展模块加载(类拟于AutoCAD ARX 程序),扩展模块文件扩展名为 mrx ,在CAD控件安装目录sample下有 ExApp 工程,就是一个扩展模块例程。
2. 打开ExApp.sln工程,增加我们的自定义函数如下:
bool GetArcBulge(IN const MxResbuf* pParam, OUT MxResbuf* pRetData) { // 三点坐标,X1,Y1,X2,Y2,X3,Y3共六个参数。 if(pParam->GetCount() < 6) { pRetData->AddString(_T("FALSE")); return false; } double dX1 = 0.0,dY1 = 0.0,dX2 = 0.0,dY2 = 0.0,dX3 = 0.0,dY3 = 0.0; dX1 = pParam->AtDouble(0); dY1 = pParam->AtDouble(1); dX2 = pParam->AtDouble(2); dY2 = pParam->AtDouble(3); dX3 = pParam->AtDouble(4); dY3 = pParam->AtDouble(5); McGePoint2d pt1(dX1,dY1); McGePoint2d pt2(dX2,dY2); McGePoint2d pt3(dX3,dY3); double dBulge = 0.0; if(!GetArcBulgeImp(pt1, pt2, pt3, dBulge) ) { return false; } else { pRetData->AddDouble(dBulge); // 计算成功。 return true; } }
pParam:是传入参数链表
pRetData:是返回参数链表
GetArcBulgeImp函数实现代码:
bool GetArcBulgeImp(McGePoint2d pt1, McGePoint2d pt2, McGePoint2d pt3, OUT double& dBulge) { dBulge = 0.0; if(pt1.isEqualTo(pt2) || pt1.isEqualTo(pt3) || pt2.isEqualTo(pt3) ) { // 点相等,无法构成圆弧 return false; } McGeCircArc2d tmpArc(pt1,pt2,pt3 ); dBulge = tan(0.25 * (tmpArc.endAng() - tmpArc.startAng()) ); if(tmpArc.isClockWise()) { dBulge = -dBulge; } return true; }
3. 到void initApp()函数处,注册自定义函数:
void initApp() { Mx::AddCustomFunction(_T("SampleExApp"), _T("GetArcBulge"),GetArcBulge); }
GetArcBulge是我们自定义函数名,该函数是用来,给三个点座标计算圆弧凸度。
4. 在扩展模块卸载时,反注册,如下:
void unloadApp() { Mx::RemoveCustomFunction(_T("SampleExApp")); }
5. 编译工程,在Release目录下生成文件ExApp.mrx。
6. 打开sample\ CSharp 工程,调用我们刚才写的函数。
在对话框资源编辑中,编辑控件的属性,在设置IniFilePath属性,值为:LoadMrx=ExApp.mrx,这样在控件加载时,绘自动加载MxDrawX.ocx所在目录下的ExApp.mrx。
7. 增加一个按钮,在按钮单击事件中,增加调用我们写的自定义函数代码。
private void button15_Click(object sender, EventArgs e) { double dX1 = 0.0; double dY1 = 0.0; double dX2 = 10.0; double dY2 = 10.0; double dX3 = 50.0; double dY3 = 0.0; // 初始化输入参数param,三个点的X,Y坐标 MxDrawResbuf param = new MxDrawResbuf(); param.AddDouble(dX1, -10); param.AddDouble(dY1, -10); param.AddDouble(dX2, -10); param.AddDouble(dY2, -10); param.AddDouble(dX3, -10); param.AddDouble(dY3, -10); // 调用我们GetArcBulge自定义函数 // ret是函数返回值。 MxDrawResbuf ret = (MxDrawResbuf) axMxDrawX1.CallCustomFunctionEx("GetArcBulge", param); double dBluge = 0.0; if(ret != null && ret.Count >= 2 ) { // 函数返回成功,取凸度值。 dBluge = ret.AtDouble(1); } // 输入凸度值到对话框。 string sT; sT = dBluge.ToString(); MessageBox.Show(sT); }