返回介绍

实现步骤

发布于 2023-08-09 23:10:33 字数 3265 浏览 0 评论 0 收藏 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文