如何实现自定义函数?
-
回答:
1、 实现步骤:
1) 控件支持扩展模块加载(类拟于AutoCAD ARX 程序),扩展模块文件扩展名为mrx,在控件安装目录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);
}