Chinaunix首页 | 论坛 | 博客
  • 博客访问: 221754
  • 博文数量: 93
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 542
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-09 16:59
文章分类

全部博文(93)

文章存档

2016年(27)

2015年(66)

我的朋友

分类: C/C++

2016-02-17 09:54:16

1.在PureMDL中MDL是指MicroStation Development Language,它是Bentley公司基于C语言的一种扩展语言,编译器和链接器均由Bentley公司提供


在NativeCode MDL中MDL是指MicroStation Development Library,它是Bentley公司用C/C++写的第三方库,是第三方C/C++库,提供给开发人员帮助开发MicroStation应用程序


2.VS重置设置步骤:
“工具”->“导入和导出设置”->“重置所有设置”

3.先使bmake命令找到工程中的.mke文件(若未指定,则只能找到与文件夹同名的.mke文件,大小写不敏感),然后再根据.mke文件确定其他文件的命名,其中可以通过.mke文件确定.ma文件(这里面包含了dllName的信息,由DllMdlApp的第二个参数确定),也可以
确定.dll文件(它的改变牵涉到许多其他文件),.ma文件中包含的dllName信息必须与对应的.dll文件一致,taskid是由.ma文件名确定的(大写),即DllMdlApp资源的第一个参数无效,第二个参数有效


4.工程里面除了c/c++文件,其他文件一般都是大小写不敏感的


5.MSElement: 简单元素 大小固定(最大为256K字节)
MSElementDescr* : 复杂元素 大小不确定
EditElemHandle: 被修改元素


#define (EditElemHandle &) EditElemHandleR 


从MSElement到MSElementDescr的转化用mdlElmdscr_new函数


6.命令表
根(主)命令表的tableid值必须为1,tableid是一个32无符号整形数
没有子表的命令的subtableid值为0
根命令的commandclass一般为PLACEMENT,子命令的commandclass一般为INHERIT
命令的options若指定为REQ,则必须从子表中选择

7.MstnViewTool
MstnPrimitiveTool
MstnElementSetTool


AllowSelection:设置参数
BeginComplexDynamics:启动一个动作,启动动态
EndComplexDynamics():停止动态
OnDataButton:处理用户事件
mdlAccuSnap_enableSnap:启动精确捕捉
ExitTool():退出工具




OnPostInstall():工具被加载后执行
InstallTool():启动工具
OnRestartCommand:工具被打断时调用该函数
OnComplexDynamics:调用BeginComplexDynamics后,当光标在视图区移动时,此函数
将被反复调用
OnDataButton:当用户在视图区域点击鼠标的数据键(默认为左键)后,此函数被调用
OnResetButton:当用户在视图区点鼠标拒绝键(默认为右键)后,调用此函数


8.
PureMDL对话框设计步骤:


生成对话框资源:DialogBoxRsc


对话框条目列表说明:DialogItemRsc


对话框条目资源:
文本对话框:DItem_TextRsc


NativeMDL对话框设计步骤:


对话框资源框已自动生成,即为命令对应的工具设置对话框

工具设置对话框条目列表:CmdItemListRsc

对话框条目资源:
文本对话框:DItem_TextRsc

9. .mke文件总结:


%include mdl.mki //系统自带


MA_DEST = $(basedir)debug/ //指定.ma和.dll文件输出目录
MA_NAME = Draw //定义变量MA_NAME为工程名,以供后面代码引用
MA_OBJS = $(o)$(MA_NAME).rsc $(o)$(MA_NAME)Cmd.rsc $(o)$(MA_NAME)Typ.rsc ... //指定编译生成目标




DLM_NAME = $(MA_NAME) //定义变量DLM_NAME为工程名,这里DLM_NAME是为引用.cpp文件而定义
DLM_OBJS = $(o)$(MA_NAME)$(oext) ... //指定.cpp文件编译生成目标




%include dlmRules.mki //自创与.mke文件同级工程管理文件




$(o)$(MA_NAME)$(oext) : $(basedir)$(MA_NAME).cpp //生成目标文件


...


%include dlmlink.mki //dlmRules.mki生成的对应文件




$(o)$(MA_NAME).rsc : $(basedir)$(MA_NAME).r //编译生成.rsc文件,还有可能先由.mt文件生成.r文件,再生成.rsc文件


$(o)$(MA_NAME)Typ.r : $(basedir)$(MA_NAME)Typ.mt


$(o)$(MA_NAME)Typ.rsc : $(o)$(MA_NAME)Typ.r


$(basedir)$(MA_NAME)Cmd.h : $(basedir)$(MA_NAME)Cmd.r //生成.h文件


$(o)$(MA_NAME)Cmd.rsc : $(basedir)$(MA_NAME)Cmd.r


...


%include malink.mki //自创与.mke文件同级工程管理文件


10.资源文件总结:


必须有一个“主”资源文件,须包含头文件,其中包含DllMdlApp资源,起到连接MA和DLL的作用,一般如下:
#define DLLAPPID 1
DllMdlApp DLLAPPID =
{
"Draw","Draw" //taskid,dllName
}


一般还包含一个命令资源文件,用于给应用添加命令,须包含头问价,然后用Table结构定义
命令表,命令资源文件还须生成对应的.h文件

在.cpp文件中须定义MdlCommandNumber结构绑定命令和其对应的处理函数,一般如下:

RscFileHandle rscFileH;
mdlResource_openFile(&rscFileH,NULL,RSC_READ); //打开资源文件
mdlParse_loadCommandTable(NULL); //从资源文件中装载命令表资源

 //定义命令号与对应的处理函数
Private MdlCommandNumber commandNumber[] =
{
{处理函数名,命令资源文件对应的头文件中的命令宏定义},
...
{...},
0
};

mdlSystem_registerCommandNumbers(commandNumbers); //注册上述对应关系


工具栏显示信息和命令提示信息资源文件,可以直接声明在Draw.r文件中,也可以另建一个资源文件,用MessageList结构在
资源文件中定义好信息“键值对”,然后在.cpp文件中用mdlState_registerStringIds函数注册,第一个参数注册工具栏显示信息
第二个参数注册命令提示信息(只有这两个宏定义参数有区别),然后在命令资源文件中改成CMDSTR(CMDNAME_PlaceBsSurfaceTool),
然后将键CMDNAME_PlaceBsSurfaceTool和PROMPT_PlaceBsSurfaceTool传入相应的函数,如下:

mdlState_registerStringIds(STRINGLISTID_Commands,STRINGLISTID_Prompts);



自定义的数据结构(或其实例)若要在.r文件中使用,则必须新建一个.mt文件,并在.mt文件中用publishStructures函数“发布”此数据
结构,如:publishStructures(helloworldinfo);

将自定义数据结构生成资源,可以在Draw.r文件中直接定义,也可以在另建的资源文件中定义,定义使用结构体resourceclass,如下:
resourceclass HelloWorldInfo RTYPE_HelloWorld;
HelloWorldInfo RSCID_HelloWorld = {2000,"Default"};

然后可以在.cpp文件中用mdlResource_load函数获得此资源,用mdlResource_add或mdlResource_write函数将数据更新到资源,若更新
资源要以读写的方式打开资源文件


定义对话框资源,在资源文件中用结构CmdItemListRsc定义对话框中的条目(如文本框),用具体的条目结构定义条目,如下:
CmdItemListRsc 命令号 = 
{
{
{...},
}
}; 

DItem_TextRsc TEXTID_BaseArcRadius =
{
...
};

然后在.cpp文件中将对话框资源中用到的数据结构“发布到对话框”,如下:
SymbolSet *setP = mdlCExpression_initializeSet (VISIBILITY_DIALOG_BOX, 0, 0); 
mdlDialog_publishComplexVariable (setP, "helloworldinfo", "g_helloWorld", &g_helloWorld); 


11.建立钩函数:
在.cpp文件中用结构DialogHookInfo结构定义一个数组,如下:
DialogHookInfo uHooks[] =
{
{HOOKITEMID_MyLevelCombo,(PFDialogHook)钩函数名},
};


并在.cpp文件中发布:mdlDialog_hookPublish(sizeof(uHooks)/sizeof(DialogHookInfo),uHooks);

这里的这个钩函数遍历当前设计文件中有效的层并将它们赋给组合框条目COMBOBOXID_MyLevel,进而更新g_helloWorld.levelName的值

12. mdlSystem_setFunction (SYSTEM_UNLOAD_PROGRAM, unloadFunction(函数名)); 这个函数指定一个卸载应用时执行的函数


13.#undef:取消宏定义


DialogBoxRsc


14.高级对话框
容器DialogBoxRsc(防雷设计)
容器(条目)Ditem_TabPageListRsc(防雷设计页面)
容器(条目)DItem_TabPageRsc(接闪杆)
容器(条目)DItem_GroupBoxRsc(设置被保护物高度)(位置以DialogBoxRsc为参照,并不以DItem_TabPageRsc为参照)

“防雷设计”DialogBoxRsc 包含一个
“防雷设计页面”DItem_TabPageListRsc 包含一个
“接闪杆”DItem_TabPageRsc 包含一个 (和一个) “接闪杆2”DItem_TabPageRsc 包含一个
“设置被保护物高度”DItem_GroupBoxRsc “设置被保护物高度2”DItem_GroupBoxRsc

15. pTool->InstallTool();  启动工具,工具被加载后先执行OnInstall() 再执行OnPostInstall()


OnComplexDynamics //光标在视图区移动时被反复调用
OnDataButton
OnResetButton
OnRestartCommand
阅读(2552) | 评论(0) | 转发(0) |
0

上一篇:MicroStation操作总结

下一篇:java线程同步

给主人留下些什么吧!~~