返回介绍

com 接口的命令执行

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

DoCommand说明: 该函数开始执行控件的一个用户自定义命令,参数是命令的id,这个id值可以随便取值,它是用来标识该命令, 多个命令之间的id值不能重复 。

前面的DoCommand的调用后,程序将会跳转命令执行事件函数中。 命令调用过程流程图:

step.png

如C#语言

开始执行一个命令: 在界面上放一个按钮“ 打开DWG ” 给按钮增加点击事件如下:

private void button6_Click(object sender, EventArgs e)
        {
            axMxDrawX1.DoCommand(6);
        }

axMxDrawX1.DoCommand调用后就会跳到命令事件中,给窗口增加CAD控件命令执行事件,并加代码,如下:

   private void axMxDrawX1_ImplementCommandEvent(object sender, AxMxDrawXLib._DMxDrawXEvents_ImplementCommandEventEvent e)
        {
 
if (e.iCommandId == 6)
             {
                // 打开文件.
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter = "dwg 文件(*.dwg)|*.dwg";
 
                if(ofd.ShowDialog() ==  DialogResult.OK)
                {
                    axMxDrawX1.OpenDwgFile(ofd.FileName);
                }
             }
  }

如JS语言

开始执行一个命令: 在界面上放一个按钮“打开DWG ” 给按钮增加点击事件如下:

<input type="button" value="写扩展数据" onclick="DoCmd(11)">

调用DoCommand执行用户命令,DoCommand调用后就会跳到命令事件中,DoCmd代码如下:

function DoCmd(iCmd) {
    mxOcx.DoCommand(iCmd);
}

添加命令事件:

document.getElementById("MxDrawXCtrl").ImplementCommandEventFun = DoCommandEventFunc;

命令事件函数实现:

function DoCommandEventFunc(iCmd)
{
     if (iCmd == 11) {
        WriteXData();
    }
}

写扩展数据函数实现:

function WriteXData() {
    var selEnt = mxOcx.NewComObject("IMxDrawUiPrEntity");

    selEnt.message = "选择要写扩展数据的对象";
    if (selEnt.go() != 1)
        return;

    var ent = selEnt.Entity();
    if (ent == null)
        return;

    if (ent.SetxDataString("ExDataName", 0, "ExDataValue")) {
        alert("写扩展数据成功");
    }
    else {
        alert("写扩展数据失败");
    }
}

在工具条定义文件中执行用户命令

工具条定义文件中一行代表一个工具条上的按钮,如果用户想点击工具条上的按钮,按钮执行命令事件,如下定义工具条:

("保存dwg文件" "保存dwg文件" "SaveDwg" "IDB_SAVEDWG_BITMAP" "" "MxDraw.dll" "15")

上述定义了一个打开dwg文件按钮,点击这个按钮,相当于执行DoCommand(15)。

在菜单条中执行用户命令

菜单条定义文件中一行代表一个菜单命令,如果用户想点击菜单,执行命令事件,如下定义菜单条定义文件:

"打开(&O)" "Mx_OpenMxg" "IDB_OPENMXG_BITMAP" "" "" "15"

上述定义了一个打开文件菜单,点击这个菜单项,相当于执行DoCommand(15)。

为命令注册一个命令名称,方便命令输入和调用

RegistUserCustomCommand function

作用:向控件注册一个命令,用户在命令行输入命令名这个字符串,就会触发执行命令事件 命令事件的id就是该注册时的id值。

接口:BOOL RegistUserCustomCommand(LPCTSTR pszCommandName, long lId)

参数:

名称说明
pszCommandName命令名称
lId命令id

参考例程(VB代码):

MxDrawX1.RegistUserCustomCommand " MyTest11", 15

参考例程(c#代码):

axMxDrawX1.RegistUserCustomCommand("MyTest11",9999);
        axMxDrawX1.Focus();
      // 命令 响应代码
        private void axMxDrawX1_ImplementCommandEvent(object sender, AxMxDrawXLib._DMxDrawXEvents_ImplementCommandEventEvent e)
        {
           if (e.iCommandId == 9999)
            {
                MessageBox.Show("用户定义命令执行....");
            }
        }

调用控件自带命令

CAD控件工具条上的按钮,都是CAD控件内部命令实现,点击工具条上的按钮,就会在命令行看到相关命令名称。如下图所示:

hh.png

如果用户想在自己的按钮中,调用画线命令。如下:

axMxDrawX1.SendStringToExecute("Mx_Line");

在命令执行中,再调用另一个命令

控件是不允许命令被重入,也就是说不能同时执行两个命令,比如当前用户正交到绘制直线,当用户点击绘制圆按钮时,绘制直线命令就需要立即退出,并进入绘圆命令。

那么如果用户想要在命令中,调用另一个命令,可以把另一个命令当前一个函数调用,调用如下:

axMxDrawX1.SendStringToExecuteFun("Mx_Line");

命令函数执行完后,可以调用GetEntitysLastCmd函数返回,命令函数新增加的实体,它返一个MxDrawResbuf对象,也就是说,得到一个数组,得到多个新增加的实体。

如下JS代码,调用控件的绘制样条线命令,并得到新绘制样的样条线,然后修改它的线重:

function DrawSpline() {
    mxOcx.Cal("Mx_ShowWeight");
 
    var param = mxOcx.NewResbuf();
    mxOcx.SendStringToExecuteFun("_DrawSpline", param);
    var retparam = mxOcx.GetEntitysLastCmd();
    if (retparam == null)
        return;
 
    if (retparam.Count == 0)
        return;
 
    var spline = retparam.AtObject(0);
    if (spline == null) {
        return;
    }
 
    spline.Lineweight = 40;
 
}

有些命令在用时,可以转入参数,调用SendStringToExecuteEx函数。 如:调用阵列命令,并传递参数:

MxDrawSelectionSet ss = new MxDrawSelectionSet();
                        MxDrawUtility utility = new MxDrawUtility();
                        utility.Prompt("选择阵列对象:");
                        ss.Select(MCAD_McSelect.mcSelectionSetUserSelect, null, null, null);
                        if (ss.Count == 0)
                            return; 
                        MxDrawResbuf param = new MxDrawResbuf();
 
                        // 10行.
                        param.AddLongEx(10, 1070);
 
                        // 20列.
                        param.AddLongEx(20, 1070);
 
                        // 行偏移.
                        param.AddDoubleEx(100, 1040);
 
                        // 列偏移.
                        param.AddDoubleEx(150, 1040);
 
                        // 阵列角度.
                        param.AddDoubleEx(15.0, 1040);
 
                        // 阵列对象个数.
                        param.AddLongEx(ss.Count, 1070);
                        for (int i = 0; i < ss.Count; i++)
                        {
                            MxDrawEntity ent = ss.Item(i);
                            param.AddObjectId(ent.ObjectID);
                        }
 
                        // 调用阵列命令.
                        axMxDrawX1.SendStringToExecuteEx("Mx_Array", param);

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

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

发布评论

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