1、MicroStationMicroStation二次开发二次开发PPTPPT讲讲座座2008 MicroStation二次开二次开发发培培训训 项 目人数百分比使用过MicroStation9写过VB/VBA、.NET、C/C+程序2写过MDL程序3调 查 表2008 MicroStation二次开二次开发发培培训训1. 1. 软件安装软件安装2. 2. MicroStationMicroStation软件简介软件简介3. MicroStation3. MicroStation中各种编程语言介绍中各种编程语言介绍4. 4. MicroStation VBAMicroStation VBA5.
2、5. 用用.NET.NET开发开发M MicroStationicroStation应用应用AddinsAddins6. 6. 用用C+C+开发开发MstnMstn应用应用NativeCodeNativeCode7. 7. 摆脱黑窗口编译环境,手工建立摆脱黑窗口编译环境,手工建立VSVS项目项目8. 8. 扩展扩展您的您的MDLMDL程序程序9. 9. 建立建立MDLMDL程序的界面程序的界面资源文件资源文件10. 10. 设计设计MDLMDL程序中的工具程序中的工具11.11. MDL MDL中的高级功能中的高级功能12. 12. 面向面向对象开发对象开发MicroStation V8iMi
3、croStation V8i2008 MicroStation二次开二次开发发培培训训1.1 Microsoft Visual Studio.NET 20051.2 Bentley桌面应用预安装包bda08110505en.exe1.3 MicroStation V8ims08110517en.exe1. 1. 软件安装软件安装2008 MicroStation二次开二次开发发培培训训1.4 MicroStation SDK V8i mssdk08110517en.exe如果预安装包安装过程持续时间过长,可能是由于防病毒软件对.NET Framework 3.5的安装有影响,最好暂停您的防病毒
4、软件!也要选择Advanced方式安装,并分别指定C:Bentley08.11和C:Bentley08.11MDLProject目录2008 MicroStation二次开二次开发发培培训训2. 2. MicroStationMicroStation软件简介软件简介2008 MicroStation二次开二次开发发培培训训MicroStation软件的发展软件的发展2008 MicroStation二次开二次开发发培培训训MicroStation软件的功能软件的功能MicroStation 是 Bentley公司服务于基础工程设计、建造和运营活动的旗舰产品 2D图纸设计图纸设计功能灵活完善的二
5、维绘图工具 3D 建模建模完整的三维建模设计和渲染、动画工具 DWG 与与 DGN 的兼容的兼容与DWG格式无缝兼容 标准标准具有良好组织结构的工作流程及协调工作工具 数字安全数字安全 多种程度的安全控制 设计历史设计历史 完整的修订控制系统 打印出图打印出图多种形式的打印输出形式,可打印生成三维动画的PDFMicroStation软件演示软件演示2008 MicroStation二次开二次开发发培培训训3. MicroStation3. MicroStation中各种编程语言介绍中各种编程语言介绍pure MDLNativeCodeAddinsVBABASICJMDLUCMCSL独立VB/C
6、+V8iV8XM V8 ? J ? SE ? 95 ? 5.X 4.X 3.X 2008 MicroStation二次开二次开发发培培训训VBA - .mvba既是源文件又是最终的执行文件Addins - 标准的C#/ VB.NET/ VC.NET项目,最后生成.dll作为执行文件PureMDL - .mc为执行代码文件,.r为资源文件,最后生成.ma执行文件NativeCode - .c或.cpp为执行代码源文件,使用.r资源或Windows资源,最后生成.ma和.dll执行文件MicroStation-BASIC也叫作MicroStation Macro,源程序文件为.bas编译后为.ba
7、PureMDL C NativeCode C+ Addins C# VB.NET/C+.NET演示以上各编程手段2008 MicroStation二次开二次开发发培培训训4. 4. MicroStation VBAMicroStation VBA该部分内容引用另外一个PPT文件,此处略2008 MicroStation二次开二次开发发培培训训 Addins简介简介 Addins完全基于.NET平台,可用VB.NET、C#.NET和C+.NET等各种.NET下的语言编程 Addins类似于MDL应用,也有TaskID和命令表,但命令表以XML形式表达 使用WinForm作为用户界面(GUI) 少
8、量的Managed对象可用,需要通过PIA(Primary Interop Assembly)来调用COM, 需要通过PInvoke(Platform Invocation Services)来调用纯的MDL函数 Addins中所用到的对象和方法可参考MicroStation VBA手册中所述 MicroStationAddInWizard2005的安装及使用的安装及使用 将MicroStationAddinWizard2005.rar解压到VS2005对应的VC目录下启动VS2005,选择NewProject,然后如下图选择MicroStation Addins Wizard,按照提示 设置
9、Language、Feature和CommandType。5. 5. 用用.NET.NET开发开发M MicroStationicroStation应用应用AddinsAddins2008 MicroStation二次开二次开发发培培训训 启动MicroStation Developer Shell,进入刚建立的项目所在的目录中,键入bmake 进入MicroStation,键入MDL LOAD MyAddins装载Addins (如果装载不成功,可能是如果装载不成功,可能是MS_ADDINPATH的路径设置不正确,应包含刚生成的的路径设置不正确,应包含刚生成的Addins) 该Addins含
10、有三条命令:MyAddins open, MyAddins locate和MyAddins place 装载装载和卸载和卸载Addins Addins依附于应用程序域(AppDomain),要卸载Addins必须将其所在的应用程序域一起卸载 通过MDL LOAD MyAddins会将Addins加载到DefaultDomain应用程序域中, 而该应用程序域不能被卸载。这样,只能退出MicroStation才能卸载用户加载的Addins 不退出MicroStation实现Addins的加载和卸载: MDL LOAD MyAddins, MyDomain CLR UNLOAD DOMAIN MyD
11、omain CLR DIALOG 还能查看当前加载的应用程序域 (CLRCommon Language Runtime) 慎用自定义程序域:当你的Addins要用到系统 的内容时,最好还是加载到DefaultDomain中。2008 MicroStation二次开二次开发发培培训训 Addins结构分析结构分析(1). 派生于派生于Bentley.MicroStation.AddIn的类的类MyAddins位于位于MyAddins.cs internal sealed class MyAddins : Bentley.MicroStation.AddIn private static MyAd
12、dins s_addin = null;private static BCOM.Application s_comApp = null;private MyAddins (System.IntPtr mdlDesc) : base (mdlDesc) s_addin = this; protected override int Run (System.String commandLine) /必须要覆盖的虚函数 return 0;internal static MyAddins GetApp /两个重要的属性:GetApp和GetComApp get return s_addin; inter
13、nal static BCOM.Application GetComApp get return s_comApp; 2008 MicroStation二次开二次开发发培培训训(2). 处理命令键入的类处理命令键入的类KeyinCommands位于位于KeyinCommands.csinternal class KeyinCommands (3). XML格式的命令文件格式的命令文件位于位于commands.xml 2008 MicroStation二次开二次开发发培培训训(4). 派生于派生于BMW.Adapter的窗体的窗体(Form)Addinsform.cs internal clas
14、s MyAddinsform : BMW.Adapter 该窗体可作为工具设置(ToolSettings)对话框、顶级(TopLevel)对话框,也可被停靠(Dockable)。具体例子见(5)中有关MyAddinsPlacementCmd的IPrimitiveCommandEvents(5). 派生于派生于BCOM.IPrimitiveCommandEvents的放置命令的放置命令 MyAddinsPlacementCmd.cs internal class MyAddinsPlacementCmd : BCOM.IPrimitiveCommandEvents internal static
15、 void StartPlacementCommand (Bentley.MicroStation.AddIn addIn) #region IPrimitiveCommandEvents“public void Start() public void DataPoint(ref BCOM.Point3d Point, BCOM.View View) public void Keyin(string Keyin) public void Dynamics(ref BCOM.Point3d Point, BCOM.View View, BCOM.MsdDrawingMode DrawMode)
16、public void Reset() public void Cleanup() #endregion(6). 派生于派生于BCOM.ILocateCommandEvents的定位或修改命令的定位或修改命令 MyAddinsLocateCmd.cs internal class MyAddinsLocateCmd : BCOM.ILocateCommandEvents internal static void StartLocateCommand(BM.AddIn pAddIn)2008 MicroStation二次开二次开发发培培训训 #region ILocateCommandEvent
17、spublic void Start() public void Accept(BCOM.Element pElement, ref BCOM.Point3d pPoint, BCOM.View iView) public void Cleanup () public void Dynamics(ref BCOM.Point3d pPoint,BCOM.View iView, BCOM.MsdDrawingMode drawMode) public void LocateFailed () public void LocateFilter (BCOM.Element pElement,ref
18、BCOM.Point3d pPoint, ref bool accept) public void LocateReset () #endregion ILocateCommandEventsBentley常用命名空间缩写常用命名空间缩写using BMW = Bentley.MicroStation.WinForms;using BWW=Bentley.Windowing.WindowManager;using BMI = Bentley.MicroStation.InteropServices;using BCOM = Bentley.Interop.MicroStationDGN;usi
19、ng BM = Bentley.MicroStation;BCOM对应于文件MicroStationassembliesbentley.interop.microstationdgn.dll可通过对象浏览器来查看这些PIA的程序集清单2008 MicroStation二次开二次开发发培培训训 给给Addins增加实际功能增加实际功能 给给MicroStation Form窗体增加控件窗体增加控件MyAddinsform.cs (1). 在当前项目中增加一个WinForm然后再将其删除,目的是插入一些引用 (2). 将MyAddinsform的继承类由BMW.Adapter改为System.Wi
20、ndows.Forms.Form (3). 可视化打开MyAddinsform.cs增加任何控件 (4). 再将System.Windows.Forms.Form改回BMW.Adapter 实现实现MyAddins open命令命令KeyinCommands.cs public static void MyAddinsCommand (System.String unparsed) MyAddinsform myForm = new MyAddinsform (MyAddins.GetApp); myForm.Show(); 实现实现MyAddins place命令命令MyAddinsPlac
21、ementCmd.cs BCOM.Point3d basePt; int m_nPoints = 0; public void DataPoint (ref BCOM.Point3d Point, BCOM.View View) if (0 = m_nPoints) m_App.CommandState.StartDynamics();basePt = Point;m_nPoints = 1;m_App.ShowPrompt(“Enter End Point); elseDynamics(ref Point, View, BCOM.MsdDrawingMode.Normal); Reset (
22、); 2008 MicroStation二次开二次开发发培培训训public void Dynamics (ref BCOM.Point3d Point, BCOM.View View, BCOM.MsdDrawingMode DrawMode) if (1 = m_nPoints) BCOM.Point3d pts = new BCOM.Point3d2;pts0 = basePt;pts1 = Point;BCOM.LineElement line = m_App.CreateLineElement1 (null, ref pts);line.Redraw (DrawMode);if (D
23、rawMode = BCOM.MsdDrawingMode.Normal) m_App.ActiveModelReference.AddElement(line); public void Reset() try catch (NullReferenceException e) Console.WriteLine(no window + e.Message); / m_App.CommandState.StartDefaultCommand(); m_nPoints = 0;2008 MicroStation二次开二次开发发培培训训 捕获捕获COM事件举例事件举例模型改变事件模型改变事件(1)
24、. 声明一个类来实现接口internal sealed class MyAddin : Bentley.MicroStation.AddIn, BCOM.IModelChangeEvents(2). 实现接口中的方法public void ModelChange (BCOM.ModelReference modelRef, BCOM.MsdModelChangeType changeType) if (changeType = BCOM.MsdModelChangeType.dlModelChangeActive)MessageBox.Show (DesignFileName= + model
25、Ref.DesignFile.FullName);(3). 调用添加事件捕获的方法protected override int Run (System.String commandLine) s_comApp.AddModelChangeEventsHandler (this); 2008 MicroStation二次开二次开发发培培训训 MicroStation V8 2004用Visual Studio 6.0来开发最合适 MicroStation V8 XM 用Visual Studio 2003开发最合适 MicroStation V8i 用Visual Studio 2005开发最合
26、适 如果不涉及MFC编程,VS的版本要求不是很严格,也可用VS2005开发V8XM NativeCode代码的优点: 可方便地调用所有操作系统级的功能,如COM、ADO、ActiveX等; 对于复杂的计算量大的程序,在性能上会有较大的提升; 可以利用VS提供的直观而强大的调试功能对程序进行调试。 V8 2004下可用Bently MFC Application Wizard 6.0来生成NativeCode项目, 详细使用说明参见MDL程序设计一书的第9章 V8XM/V8i下可用下可用MDL Project Wizard来生成针对来生成针对V8XM/V8i版的版的NativeCode项项目目6
27、. 6. 用用C+C+开发开发MstnMstn应用应用NativeCodeNativeCode2008 MicroStation二次开二次开发发培培训训MDL Project Wizard的安装及使用的安装及使用 将MDLProjectWizard2005.rar解压到VS2005对应的VC目录下 启动VS2005,选择NewProject,然后如下图选择MDL Project Wizard,按照提示设置 Page1至Page4。其中,Page4中的三项可为空!中的三项可为空!2008 MicroStation二次开二次开发发培培训训 启动MicroStation V8i SDK下的Micro
28、Station Developer Shell,切换到项目所在目录,键入bmake 进行编译链接生成.ma 和.dll MicroStation Developer Shell使用的是 MicroStationmdlbinmstndevvars.bat; 目前用的Wizard是经过修改后的,不需要Bmake时每次带上 -dNOSTRICT参数了。 启动MicroStation V8i,键入MDL LOAD project1装载应用, 然后键入project1 RUN MFCTEST能出现右图所示对话框。 分析分析NativeCode应用程序的结构应用程序的结构extern C DLLEXPOR
29、T int MdlMain (int argc, char *argv )static MdlCommandName cmdNames = Project1_mdlCommand, Project1_mdlCommand , 0, ;mdlSystem_registerCommandNames (cmdNames);static MdlCommandNumber cmdNumbers = Project1_mdlCommand, CMD_PROJECT1_ACTION_DIALOG , 0, ;mdlSystem_registerCommandNumbers (cmdNumbers);2008
30、 MicroStation二次开二次开发发培培训训extern C Public void Project1_runToolSettingsDialog / 命令CMD_PROJECT1_RUN_TOOLSETTINGSDIALOG对应的函数 pTS = Project1Mfc_OpenToolSettingsContent();_declspec(dllexport) Project1ToolSettingsDlg *Project1Mfc_OpenToolSettingsContent( void ) AFX_MANAGE_STATE(AfxGetStaticModuleState();
31、Project1ToolSettingsDlg *pModelessBox = new Project1ToolSettingsDlg(); pModelessBox-Create(); return pModelessBox;命令表文件Project1Cmd.r保持原来的格式主窗口还是用MDL的资源格式在Project1dlg.r文件中定义的其它窗口均以Windows的资源格式在Project1Mfc.rc文件中定义2008 MicroStation二次开二次开发发培培训训 MFC对话框类对话框类 CBModalDialog 模态对话框 CBFramedModelessDialog 非模态对
32、话框 CBToolSettingsDialog 工具设置对话框 CBDockableDialog 可停靠对话框 CBHostedDialog 宿主对话框 (该对话框中可含有MDL条目)这些类的定义位于MicroStationmdlincludemfc目录下。后台动作主要通过mdlNativeWindow_XXX MDL API来实现,参见BDNZine2004年第一期“在MicroStation中支持MFC对话框和本机窗口”MDL Programmer Guide中也有MFC Dialog and Native Window Support 2008 MicroStation二次开二次开发发培
33、培训训 bmake a ddebug 生成带有调试信息的应用程序 启动MicroStation V8i 启动VS2005,打开要调试的项目Project1 在VS2005中打开要调试的源程序并设置断点 启动调试过程:DebugProcesses在Available Processes中选中ustation.exe点击Attach 进一步选择Native并OK 回到MicroStation V8i中,键入MDL LOAD project1,再键入project1 RUN MFCTEST, 此时VS2005进入调试环境。 调试调试NativeCode应用程序应用程序2008 MicroStatio
34、n二次开二次开发发培培训训 修改修改Project1【修改修改1】:克服在打开MFC-ToolSettings Dialog情况下直接卸载Project1时出现致命性错误int unloadApp_Func (int unloadType) Project1Mfc_CloseToolSettingsContent (pTS); return SUCCESS;mdlSystem_setFunction (SYSTEM_UNLOAD_PROGRAM, unloadApp_Func);【修改修改2】:在主程序Project1.cpp中响应ToolSettings对话框中的MFC控件(1). 给Pro
35、ject1ToolSettings对话框增加三个CheckBox控件IDC_CHECK1至IDC_CHECK3(2). 增加事件处理函数(非常重要的一环):void Project1ToolSettingsDlg:OnBnClickedCheck() mdlDialog_cmdNumberQueueByTaskId (“Project1, CMD_PROJECT1_ACTION, NULL, TRUE); (3). 增加提取CheckBox值的函数:_declspec(dllexport) bool const Project1Mfc_GetCheckBoxValue (Project1Too
36、lSettingsDlg *pTS, int idCheck)AFX_MANAGE_STATE(AfxGetStaticModuleState();if (NULL = pTS)return false;return (pTS-IsDlgButtonChecked(idCheck);2008 MicroStation二次开二次开发发培培训训(4). 在命令数组中增加一个处理CMD_PROJECT1_ACTION的函数 static MdlCommandNumber cmdNumbers = Project1_displayUserOptions, CMD_PROJECT1_ACTION, 0,
37、 ;(5). 显示ToolSettings中的值:extern C DLLEXPORT void Project1_displayUserOptions (char * unparsed)char str200;sprintf (str,Check1=%d, Check2=%d, Check3=%d, Project1Mfc_GetCheckBoxValue(pTS,IDC_CHECK1), Project1Mfc_GetCheckBoxValue(pTS,IDC_CHECK2), Project1Mfc_GetCheckBoxValue(pTS,IDC_CHECK3);mdlDialog_d
38、msgsPrint (str);(6). 包含文件:在Project1.cpp中,#include .mfcresource.h extern C bool const Project1Mfc_GetCheckBoxValue (void *, int);在Project1ToolSettings.cpp中,#include #include .project1cmd.h2008 MicroStation二次开二次开发发培培训训7. 7. 摆脱黑窗口编译环境,手工建立摆脱黑窗口编译环境,手工建立VSVS项目项目7.1. 在Windows操作系统级定义环境变量MSV8i指向V8i的安装路径200
39、8 MicroStation二次开二次开发发培培训训7.2 启动VS2005,新建MFC DLL项目7.3 配置VS及当前的项目 a) Tools(工具) Options(选项) Projects & Solution(项目和解决方案) VC+ Directories(目录) Include files(包含文件) =$(MSV8i)mdlinclude $(MSV8i)mdlMicroStationAPI Library files(库文件) =$(MSV8i)mdllibrary b) Project(项目) Properties(属性) Configuration Properties(
40、配置属性) General(常规) Output Directories(输出目录)=$(MSV8i)mdlapps c) C/C+ Preprocessor(预处理器) Preprocessor Definitions(预处理器定义) = winNT d) Linker(链接器) Input(输入) Additional Dependencies = mdlbltin.lib BentleyDgn.lib toolsubs.lib mdllib.lib e) Build Events(生成事件) Pre-Build Events(生成前事件) Command Line(命令行) = Make
41、Ma.bat2008 MicroStation二次开二次开发发培培训训7.4 建立MDL专用部分的文件 a) 建立制作文件*.MKE appName = mstnTool b) 建立ma与dll关联的资源文件mstnTool.r DllMdlApp DLLAPPID = “mstnTool”, “mstnTool” c) 建立命令表资源文件mstnToolCmd.r Table CT_MSTNTOOL = 1, CT_SUB, PLACEMENT, REQ, MSTNTOOL, ; d) 建立批处理文件MakeMa.bat CALL %MSV8i%mdlbinmstndevvars.bat %
42、MSV8i% %MSV8i% CD /D %ProjectDir% bmake2008 MicroStation二次开二次开发发培培训训7.5 按MDL NativeCode要求修改主cpp文件 a) 包含头文件 #include b) 建立主入口函数 extern “C” DLLEXPORT int MdlMain (int argc, char *argv) . c) 在主入口程序中增加与命令处理相关的代码 Private MdlCommandNumber s_commandNumbers = viewToolCommand, CMD_MSTNTOOL_VIEW, ; mdlResourc
43、e_openFile (&rscFileH, NULL, 0); mdlParse_loadCommandTable (NULL); mdlSystem_registerCommandNumbers (s_commandNumbers); 2008 MicroStation二次开二次开发发培培训训元素元素(MSElement)和元素描述符和元素描述符(MSElementDescr) MSElement用于在内存中保存MicroStation中的简单元素,如:线、线串、单行文字、标注、圆锥等 MSElementDescr用于在内存中保存MicroStation中的复杂元素(如:单元、B样条曲线、
44、曲面、多行文字等)或一系列无关的元素(如:选择集)文件和模型对应于文件和模型对应于DgnFileObj和和DgnCache DGN文件加载到内存中就是DgnFileObj 文件中的模型(DgnModelRef)加载到内存中就是DgnCache文件位置文件位置(FilePos)、元素标识、元素标识(ElementID)和元素参考和元素参考(ElementRef) FilePos在V8以前的MDL编程中最常用,V8中建议使用ElementRef FilePos在不同的MS会话期会不相同,同一文件的多个模型间会有重复 ElementID是元素的惟一标识,一旦建立后就不变,同一文件的多个模型间不重复,
45、但不同的文件间会有重复 ElementRef是元素操作中最根本和最直接的引用。它在同一MS的会话期内保持惟一,即使多个文件间也是不相同的。8. 8. 扩展扩展您的您的MDLMDL程序程序2008 MicroStation二次开二次开发发培培训训 元素描述符在内存中的结构元素描述符在内存中的结构单元单元Cell HeaderArcLineTextnextfirstElempreviousmyHeader(未列出的指针均为未列出的指针均为 NULL)MSElementDescr结构详见结构详见Mselems.h头文件头文件2008 MicroStation二次开二次开发发培培训训 元素描述符在内存
46、中的结构(续)元素描述符在内存中的结构(续)嵌套单元嵌套单元Cell HeaderLineTextCell HeaderEllipseArcnextfirstElempreviousmyHeader2008 MicroStation二次开二次开发发培培训训 DgnFileObj、DgnCache和和DgnModelRef关系图关系图DgnModelRefDgnCacheDgnFileObjDgnModelRefListmdlModelRef_getActivemdlModelRef_getCachemdlModelRef_getDgnFiledgnCache_getDgnFilemdlDgnF
47、ileObj_getModelRefListmdlModelRefList_getmdlModelRef_createWorking(保存当前装载的模型)mdlDgnFileObj_getMasterFile2008 MicroStation二次开二次开发发培培训训 FilePos、ElementID和和ElementRef关系图关系图FilePosElementRefElementIDMSElementdgnCache_findElemByFilePoselementRef_getElemIDmdlAssoc_getElementelementRef_getFilePosdgnCache_f
48、indElemByIDMSElementDescrmdlElement_getIDmdlAssoc_getElementDescredP-h.elementRefmdlElement_readmdlElmdscr_readelementRef_getElementmdlElmdscr_getByElemRef 2008 MicroStation二次开二次开发发培培训训 最常见的最常见的MDL函数的类别函数的类别mdlXXX_create 建立元素 (mdlLine_create/mdlArc_create)mdlElement_xxx / mdlElmdscr_xxx 元素及元素描述符操作类函
49、数mdlDialog_xxx MDL对话框操作函数mdlWindow_xxx MDL窗口操作函数(对话框和视图都是Window)mdlState_xxx 状态函数(已经被MstnTool类封装)mdlSystem_xxx 系统类函数(如设置许多系统级的Hook函数)mdlView_xxx/mdlViewInfo_xxx/mdlViewGroup_xxx/mdlViewGroupInfo_xxx 视图操作函数mdlLevel_xxx/mdlLevelIterator_xxx/mdlLevelFilter_xxx/mdlLevelLibrary_xxx/mdlLevelList_xxx/mdlLe
50、velMask_xxx/mdlLevelTable_xxx 层操作函数mdlTextStyle_xxx/mdlDimStyle_xxx/mdlLineStyle_xxx/mdlMlineStyle_xxx 各种样式的操作函数mdlVec_xxx / mdlRMatrix_xxx / mdlTMatrix_xxx 几何运算函数mdlKISolid_xxx / mdlBspline_xxx / mdlMesh_xxx / mdlPop_xxx 三维函数mdlModelRef_xxx / mdlDgnFileObj_xxx 模型及文件操作类函数mdlRaster_xxx / mdlRefFile_x