《zwcad二次开发文档简易指南.docx》由会员分享,可在线阅读,更多相关《zwcad二次开发文档简易指南.docx(12页珍藏版)》请在三一办公上搜索。
1、2二.使用SDS进行二次开发2.2SDS和ADS接口的主要差异2编译SDS应用程序4三. 使用AUTOLISP进行开发4四. 使用VBA/VB进行开发5五. ZWCAD的定制5.5屏幕菜单及其定制5Image菜单(图标菜单)的定制7PROFILE的定制 9ZWCAD-LSP和 ZWCAD-SDS文件的作用和定制10别名的定制11其他定制11(内部参考)一.概述在zwcad上可以通过二次开发来定制和扩展zwcad的功能.当前的zwcad提供 AutoLISP,SDS 以及 Visual Basic for Applications (VBA,COM开发包进行二次 开发.在zwcad上,你也可以使
2、用许多原来在autocad平台上开发的应用程序.例 如使用autolisp编制的程序可以在几乎不用修改的情况下移植到zwcad平 台.Zwcad还完整支持AutoCAD Dialog Control (DCL)语言,不需修改.目前的 zwcad 还不支持 Object ARX,DBX.二. 使用SDS进行二次开发SDS 是一个和 ADS (AutoCAD Development System)开发包相兼容的C/C+ 语言接口.大部分ads应用程序经过再编译可以直接应用于zwcad。中望建筑就 是用sds sdk开发的。下面所述内容均以ads开发包为比较对象,以ads开发程 序员为讲解对象.具体
3、的sds函数说明请参考帮助文档.SDS和ADS接口的主要差异SDS和ADS的接口差异可以直接从sds.h和ads.h这两个头文件的比较得出. 主要差异如下.1.Sds开发包的接口函数以sds_为前缀.Ads开发包的接口函数主要以ads_, acad_, and acrx等为前缀.在sds.h中提供了移植ads用的宏例如 #define adsentdelsdsentdel这样只需要在ads应用程序源代码中将#include “ads.h”以#include“sds.h”替换,并将要链接的库文件改为sds.lib编译链接即可完成从ads到 sds的移植.2. sds开发包主要扩展的函数#if d
4、efined(_WINDOWS_)HDC *sds_getviewhdc(void);int sds_getrgbvalue(int nColor); RGBHPALETTE sds_getpalette(void);HWND sds_getviewhwnd(void);HWND sds_getmainhwnd(void);int sds_drawLinePattern(HDC h_dc, RECT rect, struct sds_resbuf *lineParam);#endif int sds_setcallbackfunc(int (*cbfnptr)(int flag,void *a
5、rg1,void *arg2,void *arg3);/ Command Start/End.#define SDS_CBCMDBEGIN 0/ arg1=command name cast as (char *)/ Callback return RTERROR will cause command to not be called.#define SDS_CBCMDEND1/ arg1=command name cast as (char *) / Return code does not matter./ Mouse movements and Mouse buttons.#define
6、 SDS_CBMOUSEMOVE#define SDS_CBLBUTTONDN#define SDS_CBLBUTTONUP#define SDS_CBLBUTTONDBLCLK#define SDS_CBRBUTTONDN#define SDS_CBRBUTTONUP234567/ arg1=X pixel/ arg1=X pixel/ arg1=X pixel/ arg1=X pixel/ arg1=X pixel/ arg1=X pixelarg2=Y pixelarg2=Y pixelarg2=Y pixelarg2=Y pixelarg2=Y pixelarg2=Y pixeletc
7、.进度条的控制.int sds_progresspercent(int iPercentDone);int sds_progressstart(void);int sds_progressstop(void);加载别名文件-pgp文件int sds_readaliasfile(char *szAliasFile);不同于sds_printf,这个函数可以发送命令,例如”LINE” int sds_sendmessage(char *szCommandMsg);/在绘制窗口和命令历史窗口间切换焦点.int sds_swapscreen();组操作int sds_createGroup(const
8、 char* pName, const char* pDescription, int selectable, int unnamed, sds_name sdsGroupName);int sds_modifyGroup(const char* pNewName, const char* pNewDescription, int selectable, sds_name sdsGroupName);int sds_addSSToGroup(sds_name ss, sds_name sdsGroupName);int sds_removeSSFromGroup(sds_name ss, sd
9、s_name sdsGroupName);int sds_getSSFromGroup(sds_name ss, sds_name sdsGroupName);int sds_findGroup(const char* pName, sds_name sdsGroupName);int sds_findGroupByEnt(sds_name entity, sds_name ssGroups);/求实体交点int sds_intersect(sds_name entFirst, sds_name entSecond, struct sds_resbuf *ptList);实体所占矩形空间voi
10、d sds_entextent(sds_name ename, sds_point minPoint, sds_point maxPoint);SDS不支持的ads函数主要有以下几个intads_ssGetKwordCallbackPtr(struct resbuf* (*pFunc)(const char*);intads_ssSetKwordCallbackPtr(struct resbuf* (*pFunc)(const char*);intads_ssGetOtherCallbackPtr(struct resbuf* (*pFunc)(const char*);intads_ssSe
11、tOtherCallbackPtr(struct resbuf* (*pFunc)(const char*);adsw_acadMainWnd,/sds 中使用 HWND sds_getmainhwnd(void);and adsw_acadDocWnd./sds 中使用 HWND sds_getviewhwnd(void);注意一个函数SDS: int sds_dictdel(const sds_name nmDict, const char *szDelThis);ADS: int ads_dictremove (const ads_name dictname, const char* s
12、ymname);编译SDS应用程序一般使用VC编译环境主要做好sds头文件和库文件的路径设置,然后#include “sds.h”#pragma comment( lib,sds ) 或设置链接弓|用到 sds.libOK三. 使用AutoLISP进行开发zwcad提供了调用Autolisp程序的接口,可以将大部分的lisp程序正常执行,但需要注意以下事项1. 最为重要的一点。Zwcad中的LISP无法进行COM调用,无法使用VLA开头的函数。因 此,在ZWCAD中,你就不能通过lisp使用ACTICEX方式产生图元并用变量储存该图元的 指针以进行以后的修改查询等操作,你只能使用COMMAND
13、和ENTMAKE的方式进行产生图 元,同时你只能使用图元名间接对图元进行操作。(VLISP提供的AutoLISP扩展函 数由曲线测量函数、数据转换函数、对象处理函数、特性处理函数、集合操作函数和 词典函数组成。函数名以vlax-为前缀。这些函数和ActiveX方法都提供vla-*函 数。有些vlax-*函数在使用ActiveX命令时是必需的。)2. 无实现如VLISP中的反应器及其机制。3. Zwcad也并没有提供一个如acad中的visual lisp的编译环境,只能直接使用写好的的 lisp程序。4. ZWCA D能加载未经加密的*.LSP文件或以“AutoCAD PROTECTED LI
14、SP file”方式加密的 *.LSP文件。ZWCAD的LISP中能使用DCL文件。5. ZWCAD不能加载经AUTOCAD的VISUAL LISP编译集成的VISUAL LISP可执行文件vax (一 个或多个LSP文件和/或对话框控制语言(DCL)文件的编译集合。)ZWCAD不能加载FAS文件(.fas)- 一个LSP程序文件的二进制编译版本。四. 使用VBA/VB进行开发zwcad可以提供vba/vb支持,但是在一般的版本里没有提供.重要区别:Automation对象不同.使用支持vba版本的zwcad,最重要的是理解,zwcad里面的对象和acad的对象是不相同 的.zwcad的对象和
15、acad的对象可能在使用上和名字上有很多相似的地方,但是他们是不同的 对象,有自己的唯一标识id.以前基于acad开发的vba/vb应用引用到的acad对象,其对象实现 在acad里,不在zwcad里,所以不能把这些应用直接拿到zwcad上使用。另外,Acad中关于界面 的对象如MenuBar,PopMenu,MenuGroup(s),Toolbar(s),PopMen uItem,ToolbarItem等对象在中望CAD中还没有实现.五. ZWCAD的定制屏幕菜单及其定制zwcad提供一个和ACAD2000及 以后版本类似的屏幕菜单.中望建筑软件使用了该功能,如右图所示.功能详解:1. 样式
16、如F立 面的浅蓝色底,实心箭头朝下的按钮表明了 当前激活的菜单.图中所示,尺寸标注为当前激活的菜单.除了顶级菜 单按钮(这里是“中望建筑”)外,可以右键点击当前激活的菜单按钮, 可以弹出其下的所有级别的菜单及菜单项.2. 带有卜的按钮,左键点击可以进入的下一层菜单.右键点击 可以弹出其下的所有级别的菜单及菜单项.3. 带有的按钮是当前激活菜单的上级菜单.左键点击可以百 接回到该菜单。右键点击可以弹出其下的所有级别的菜单及菜单项.4. 没有箭头的按钮是菜单命令项.左键点击执行命令。中望CAD开始运行时,会检测当前日录下是否存在 ScreenMnu.mnu文件,如果存在就会加载该菜单文件.定制该文
17、件主要注意事项1. 可以使用/*.*/及/来注释内容2. MENU_TITLE指出该屏幕菜单的顶级文字,如中望建筑中为 MENU_TITLE二中望建筑.3. *SCREEN行下开始定义菜单菜单项定义如下.MENUITEM_ID MenuItemNameCommandStringMenuItemName是显示在屏幕菜单上的名称CommandString是发送给命令行窗口的命令如 ID_Desaxis直线轴网CCCzhxzhw如果要指明当前的项有子菜单可以使用- 符号表明菜单进入点.如ID_Axis- 轴网使用-表明该菜单项为子菜单最后一项,如ID_axin-取消外偏CCCqxwp又如ID_DEL
18、MDBT:-TestID_SCREENMENUITEMID_SCREENMENUITEMItem1$I=JZD $i=*-Item2$I=WTBZ $i=*IMAGE *JZD 界址相关符号 cass2(jzd1,界址线)ACACAPjzline;APcass2(jzd2,街道线)ACACAPdd;300010,Pcass2(jzd3,街坊线)ACACAPdd;300020,P*WTBZ 图标菜单项调用图标菜单cass3(bz1,Test)$i=JZD $i=* *RESOURCEID_SCREENMENUITEM=1.bmp,欢迎”点击Item 1的效果如下profile的定制通过profi
19、le的定制可以在zwcad上指定菜单以及工具栏和指定支持路径(搜索路径).定制profile的方法是:1. 在程序图标的“日标”项加命令参数“/p配置项”(配置项是字符串,如 zwarch、zwfur 等)和“起始位置”项加程序的工作路径(如右图),这样以“/p配置项”来启动ZWCAD,ZWCAD会在注册表里的 HKEY_CURRENT_USERSoftware中望龙腾 ZWCAD建立一个为 “配 置项”的配置。2. 在注册表里的HKEY_CURRENT_USERSoftware中望龙腾 ZWCAD 配置项Config的Menu File项指定菜单位置(路径和名称不包 括菜单的扩展名)和Dra
20、wing”、Font、Help、Xref、 HatchPat、Blocks指定相应的支持路径(搜索路径)路径间用 分号连接。下面以中望建筑软件为例说明:“配置项”为ZWARCHZWCAD 的安装路径为:“D:Program Files中望 CADzwcad.exe”中望建筑软件安装路径为:“D:Program Files中望建筑软件1.0”,要加载的菜单为 ZWARCH.mnUo1. 程序图标项设置:如:目标:D:Program Files中望 CADzwcad.exe /P ZWARCH起始位置:D:Program Files中望建筑软件1.02. 注册表项设置:需在注册表里写以下注册项HK
21、EY_CURRENT_USERSoftware中望龙腾ZWCADZWARCHConfig/菜单:Menu File=D:Program Files、中望建筑软件1.0ZWARCH /菜单文件目录和文件名 (不要加扩展名)支持路径:HKEY_CURRENT_USERSoftware中望龙腾ZWCADZWARCHConfigDrawings=path1;path2.Font=path3;path4.Help=path3;path4.Xrefs=path5;path6.Hatch patterns=path7;path8.Blocks=path9;path10.zwcad.lsp和zwcad.sds
22、文件的作用和定制zwcad在每次打开或新建文件的时候,都会在当前路径搜索 zwcad.lsp和zwcad.sds这两个文件,如果找到文件就加载.对于zwcad.lsp,你可以用autolisp语言在里面作一些初始化的工 作.对于zwcad.sds,该文件其实是一个文本文件,每行是一个需要加载的sds应用程序的名称.例如目前中望建筑中使用的zwcad.sds 内容如下:extend.dllarchinit.dll表明中望建筑中任何打开或新建文档都会先加载这两个应用程序.发现的问题:其实这些应用程序只需加载一次就可以了,如果打开或新建 多个文档,后面的重复加载实际上是失败的也是多余的.别名的定制目前我还找不到一个仅仅使用pgp文件就能在zwcad开始运行时就加载的方式.不过在sds中可以使用int sds_readaliasfile (char *filenam)这个函数帮助加载.其他定制菜单(除了屏幕菜单和image菜单外),工具栏和快捷键的程序定制.若前面的profile功能中使用acad菜单文件能正确识别里面的相关信息即可.I目前还有待改善.