LOGO
帮助文档
旧版文档
实现步骤
实现步骤

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);
        }