【msce c#】录制宏后仿照它写KEYIN但是参数没有正常设置进去

想仿照录制的宏实现自动匹配打印,能打开打印对话框,但是并不能完成打印,且设置也未生效。

录制的宏和仿写的代码如下:

BIM.Application ComApp = Bentley.MstnPlatformNET.InteropServices.Utilities.ComApp;
ComApp.CadInputQueue.SendKeyin("PLACE FENCE ICON");
ComApp.CadInputQueue.SendKeyin("Point absolute 136884,2994");
ComApp.CadInputQueue.SendKeyin("Point absolute 196360,-39772");//增量 59476,-42066
ComApp.CadInputQueue.SendKeyin("DIALOG PLOT");
ComApp.CadInputQueue.SendKeyin("plotUI.uiPaperName = ISO A2");
ComApp.CadInputQueue.SendKeyin("打印缩放助手 Shown");
ComApp.CadInputQueue.SendKeyin("plotUI.uiScaleBox2Edit = 100");
ComApp.CadInputQueue.SendKeyin("打印缩放助手 Closed");
ComApp.CadInputQueue.SendKeyin("plotUI.uiColorMode = 0");
ComApp.CadInputQueue.SendKeyin("PRINT EXECUTE");
ComApp.CadInputQueue.SendKeyin("另存打印为 Shown");
ComApp.CadInputQueue.SendKeyin("MDL COMMAND MGDSHOOK,fileList_setDirectoryCmd C:\\Users\\46054\\Desktop\\");
ComApp.CadInputQueue.SendKeyin("MDL COMMAND MGDSHOOK,fileList_setFileNameCmd 测试打印0524.pdf");
ComApp.CadInputQueue.SendKeyin("另存打印为 Closed");
ComApp.CadInputQueue.SendKeyin("PRINT EXIT PLOTDLG");
ComApp.CadInputQueue.SendKeyin("MDL UNLOAD PLOTDLG");

实际运行效果停在下面这个界面:

  • 这个录制的并不都是直接的Keyin,比如Point absolute 136884,2994和plotUI.uiPaperName = ISO A2就不是。故不能都用SendKeyin来模拟。你可以打开这个宏后点击如下图所示的Promote将宏升级到VBA代码再来查看。VBA代码更接近于C# 代码。



  • 根据VB的改了之后,能进行打印了,但是设置变化了却没有生效。就是在界面上,看见已经改成了黑白和a2,但是生成的文件没有按照设置的效果生成。而且是需要额外打开对话框的,如缩放和文件位置,这两个生效了,在打印本页面中的颜色和纸张匹配没生效。

    static public void PrintTest()
            {
                BIM.Application ComApp = Bentley.MstnPlatformNET.InteropServices.Utilities.ComApp;
                KeyInDlgClass kic = new KeyInDlgClass();
                ComApp.AddModalDialogEventsHandler(kic);
    
                ComApp.CadInputQueue.SendKeyin("PLACE FENCE ICON");
                ComApp.CadInputQueue.SendKeyin("Point absolute 136884,2994");
                ComApp.CadInputQueue.SendKeyin("Point absolute 196360,-39772");//增量 59476,-42066
                ComApp.CadInputQueue.SendKeyin("DIALOG PLOT");
                ComApp.SetCExpressionValue("plotUI.uiPaperName", "ISO A1", "PLOTDLG");
                ComApp.SetCExpressionValue("plotUI.uiColorMode", "0", "PLOTDLG");
                //Thread.Sleep(2000);//延迟也无用
                ComApp.CadInputQueue.SendKeyin("PRINT EXECUTE");
                ComApp.CadInputQueue.SendKeyin("PRINT EXIT PLOTDLG");
                ComApp.CadInputQueue.SendKeyin("MDL UNLOAD PLOTDLG");
                ComApp.RemoveModalDialogEventsHandler(kic);
            }
    class KeyInDlgClass : IModalDialogEvents
        {
             public void OnDialogOpened(string DialogBoxName, ref MsdDialogBoxResult DialogResult)
            {
                BIM.Application ComApp = Bentley.MstnPlatformNET.InteropServices.Utilities.ComApp;
                if (DialogBoxName == "打印缩放助手")
                {
                    ComApp.SetCExpressionValue("plotUI.uiScaleBox2Edit", "100", "PLOTDLG");
                    DialogResult = MsdDialogBoxResult.OK;
                }
                if (DialogBoxName == "另存打印为")
                {
                    ComApp.CadInputQueue.SendKeyin("MDL COMMAND MGDSHOOK,fileList_setDirectoryCmd C:\\Users\\46054\\Desktop\\");
                    ComApp.CadInputQueue.SendKeyin("MDL COMMAND MGDSHOOK,fileList_setFileNameCmd 测试打印0525.pdf");
                    DialogResult = MsdDialogBoxResult.OK;
                }
            }
        }

    测试还发现一个奇怪的效果,运行代码:

    ComApp.SetCExpressionValue("plotUI.uiPaperName", "ISO A2", "PLOTDLG");
    ComApp.SetCExpressionValue("plotUI.uiColorMode", "0", "PLOTDLG");

    左侧图是手动设置颜色和纸张之后的效果,右侧图是代码改过后的面板效果:

  • 其实您的所有需求都可以通过键入命令Print来实现,而不必严格去模拟录制的动作。因为录制的动作还涉及到了对话框操作,有些结果未能及时得到更新。

    比如,设置打印颜色为单色可以用:Print ColorMode Monochrome

    设置打印纸张可用:Print PaperName ISO A2

    这些命令的查找可用Key-in本身的浏览功能如下:

    MS学习资源:

    MicroStation Wednesday视频分享 

    深入探讨MicroStation DGN基本概念系列

    一步步学习MicroStation CE Addin开发

    一步步学习MicroStation CE MDL开发



    Answer Verified By: 徐 明卉 

  • 用键入命令,设置能生效了。但是昨天还能查看到print下面的命令,今天打开OPM就查不到了,输入print后效果如下,请问下有可能是什么问题?

  • 您先手工操作随便print一张图纸以后,这些命令就可以用了。