SolidWorks软件是完全基于Windows的CAD/CAE/CAM/PDM桌面集成系统,它的核心技术是在Windows环境下生成的,充分利用和发挥了Windows的强大威力和OLE技术,具有用户界面友好,上手快的优点。该软件支持VisualBasic、VisualC 或其它OLE开发语言,免费提供二次开发工具API,用户二次开发的应用程序,可直接挂在SolidWorks菜单下,形成统一的界面。然而SolidWorks与许多商品化的CAD/CAM系统如PRO/E、ug、AUTOCAD等一样,它们虽然在模具行业中得到了广泛应用,但由于这些CAD/CAM系统都是作为通用机械设计与制造软件来设计的,不是特别针对模具的,因此为了提高模具设计的效率,需要对其进行二次开发。
' T3 p' P$ F8 v3 A% V+ ` C4 {' @0 Q6 L e4 K9 C& ~7 F+ i) X& K0 q
1用VISUALC 开发SolidWorks的原理
/ h; w& r$ K# K3 ]6 N" N' c( a9 [0 U% P- p
SolidWorks通过OLE技术为用户提供强大的二次开发接口API,其中包括含有数以百计的功能函数。API接口采用面向对象的方法,所有的函数都是有关对象的方法或属性。这些对象涵盖了所有SolidWorks的数据模型,通过这些对象属性的设置和方法的调用,用户可以在自己开发的DLL中实现与SolidWorks相同的功能。6 R9 J: i. a2 ~! [3 |5 ]8 u7 X; t
6 f5 z. { U( \4 O7 T* ~
这些API函数可被VisualC 、VisualBasic、Delphi、VBA(EXCEL、ACCESS)C、C 或SolidWorks的宏文件调用,使得开发出的程序具有直接访问SolidWorks的能力。当使用VisualBasic进行开发时,只能采用外挂的工作模式,即需要用户的应用程序和SolidWorks之间进行前台后台切换,所以降低了设计效率。而使用VisualC 开发的应用程序可以直接嵌入到SolidWorks内部,加载成功后应用程序菜单直接出现在SolidWorks的主菜单上,如同SolidWorks的自带功能一样进行工作,极大地提高了设计效率。7 [$ d* p) X0 E: g! i
5 Q+ p+ S2 x4 p& Q) |
2用VISUALC 开发SolidWorks的关键技术2 a t( \! f' M ?: l
# l/ O: x) E F" k2.1组件对象模型(COM)
j- p. M: @0 x( X
7 u: T* e1 J% i/ `3 m L* c开发*.DLL需要了解COM技术。COM是微软公司、数字设备公司(DEC)及其他一些公司所支持的一种软件结构的"工业标准"。SolidWorks作为基于Windows的原创软件,为便于用户开发的程序与SolidWorks通信,提供了采用COM技术开发应用程序的方法。用户开发的代码可以作为独立的EXE文件或DLL文件存在,它们就是COM模块。采用COM技术在SolidWorks平台上作二次开发时,通过直接访问SolidWorks底层对象可以方便地扩充SolidWorks的功能。0 X, A7 O8 U& o/ P
H# c# E1 z) L" ~! C7 y
2.2动态链接库(DLL)的建立
6 u/ T2 k0 j+ H! ~; N4 q, ^
9 F. j6 ~0 N- B, ]" s: g; s独立的EXE文件和DLL文件都可以作为COM的组件,但是编写EXE程序时,必须每次在做原型改变时都重建并测试。与此不同,可以创建较小的DLL模块,并单独测试,客户程序在运行时很快装载并连接用户的DLL。SolidWorks提供了DLL加载的接口,能够将用户的DLL通过加载嵌入到SolidWorks内部。+ u; q: ~, @- B9 D- c* M- h
( F' K6 O$ N2 x" |( R
2.3数据库的创建
. b: ^- d4 Y6 Z
0 ?4 j2 g" M4 _/ i7 S. A( E系统采用Access作为管理数据库的工具。使用DAO(DataAccessObjects)技术对数据库操作。VisualC 开发DAO数据库应用的方法和步骤与ODBC(OpenDataBaseConnectivity)基本类似,但VisualC 的MFC包含的DAO类比ODBC类更加丰富,使得利用DAO实现某些数据库操作(如数据库查询)更加简单、方便。
5 j3 T' l9 s' [. S1 A0 J- x# t
1 u1 A$ f' Y+ m* L" K- g3开发思路及技巧: h- A% }9 l9 P7 z! ~' o. l
" e' U6 P3 `0 _3 b; Y3 H
3.1开发思路
2 Y: m# B+ Y& ?& H; n! l/ Y& c6 U( D) X+ O8 X- p" w
SolidWorks是基于参数化和特征造型技术的软件,对其进行二次开发应遵循参数化CAD的原则。即对于企业中系列化、通用化和标准程度高的产品,其包含的拓扑信息基本上是一样的,不同的仅是几何信息。对于这类产品,可以将已知条件及其它随着产品规格而变化的基本参数用相应的变量代替,然后根据这些已知条件和基本参数,由SolidWorks查询数据库,或由SolidWorks计算出所需的全部数据,自动完成设计,并在屏幕上显示出来。; }; r4 M6 h* j3 o1 z
' |! P. T$ ~$ _
3.2开发方式的选择2 ^, e4 d0 g8 [
/ [! v& g' E4 l! X5 B
采用参数化原则设计标准件库大体分两种:程序驱动法;尺寸参数驱动法。选用程序驱动法时,可在用户界面的对话框中输入初始参数并对数据库进行查询,然后用从数据库中提取的参数进行绘图。其中绘图部分代码要靠程序员完成,程序驱动法可以借助SolidWorks的宏记录功能。SolidWorks的宏可以记录标准件模板生成的全部过程并生成VBScript程序代码,然后由人工转换为VisualC 程序。" d/ a' j. _: w, }
T! \7 p! e+ K3 p8 o选用尺寸参数驱动法时,首先在SolidWorks中绘制标准件的模板零件并保存为*.sldprt文件,同时对要进行尺寸驱动的尺寸命名,如"L@草图1"。然后等用户选择完参数后,在内存中打开已存的*.sldprt文件,并用从数据库中提取的参数替换"L@草图1"尺寸,重新建模,生成新的零件。
% f7 M0 q- h9 Q! a! F9 O
" q/ s1 g; L2 J9 w( ~3.3 开发步骤及技巧9 g( s8 g5 i& k6 d) b" a
; P0 S! |$ e4 O% K/ e* o. r(1)从SolidWorks公司网站下载向导文件SWIZARD.awx,将其添加到MicrosoftVisualstudio/Common/MSDev98/Template目录下。然后,在VisualC 中用该向导创建工程,添加相关代码,编译生成*.DLL文件。4 a0 H1 ~6 V! f7 x
5 D. I) n6 u. P3 E; k+ D+ D+ ^# T' d% q6 D1 n8 j" @6 Y4 ~( V2 R
(2)若使用程序驱动法,如果开发者本身对于SolidWorksAPI函数不是很了解,可以用宏录制标准件生成的过程并保存为*.swp文件,再用菜单里工具/宏操作/编辑打开VB界面,只需把这里的代码改为VisualC 的代码就可以了。而且VB与VisualC 的函数名基本相同,只是参数有所不同。
8 p$ o# ^$ T1 a* `4 p& L$ D. W" k" r/ Y
(3)调试的时候可以设置断点跟踪,也可以在有可能出错的地方放置如AfxMessageBox(-T("提取参数"),MB-OK,0)的语句,以便在程序调试运行时确定问题所在。( `; h9 \2 C0 V! d7 f. S0 j
+ e0 K- V$ c' {+ V# `* k
4系统组成" a) x' V+ _& k$ n
" Z0 S. Q# ^& P2 b9 f2 G. P
4.1界面的设计
' ^) d) h& Y3 X1 T) O4 I5 y j* A4 h& u/ B
系统界面的设计应遵循用户界面友好的原则。一个用户界面的友好属性应包括:使用方便、界面熟悉、有灵活的提示帮助信息、良好的交互方式、良好的出错处理等。按照模具国家标准,系统中设计的系统菜单如图1所示。
% k- d0 n6 V* V3 S# w+ L0 J, ]6 B
% ^5 j- f6 p5 F2 t0 Z4.2系统的使用. S$ G1 @6 j+ ^) G: e
1 T/ O- J. g, L$ [3 N5 z单击上述菜单将会出现如图2所示的标准件导入对话框。对话框界面由几个属性页组成,选择尺寸规格后按查询按钮,系统会根据数据输入控件里的数据(如4.00×20的圆柱头卸料螺钉)去查询标准件的数据库文件,查询所得的数据将出现在标准件属性表里,点击确定,零件将被导入。如果用户需要调整尺寸r和r1可以点击相应的按钮进行微调。
8 K% v" g7 J% v- P ! J& i( x8 n( W1 i# d6 n0 `) u) L% @
4.3系统数据库的使用
|" W2 z, i! }2 ]/ L) f3 Y
5 b& M& V4 W3 K6 k% J! o9 d9 O如果需要浏览当前零件所有的数据,只需要点击图2中的浏览按钮。例如用户当前界面是"带柄圆形上模座",点击浏览,则出现如图3所示的数据库管理对话框,在此可以浏览带柄圆形上模座的所有数据,并为有权限的用户提供可以添加、删除或修改数据的功能选项。( @6 D c) F) x$ w5 N( @( n6 k: w
8 O* ?" l3 o# d
, \8 @6 a' B# t% f
. n0 k/ k, u- O( L5一个实现程序驱动法的例
# m. `8 G" E: C) O }3 ?/ x# C4 q S0 N: T/ X: X4 E t1 G
(1)用SolidWorksAdd-InAppWizard向导创建Example1例子& d% A# a1 |+ v! n# q! M
(2)添加对话框资源,属性设置如下:IDD-DIALOG1CAPTION为"立方体例子",添加控件调整如图4。
: I& ^: G' z t3 ~1 \( W7 U. w% C
M- k7 A+ I- H2 A7 t7 K: ^8 C1 _! k; R5 q2 m* g" k
(3)添加对话框类CLIFANGTI和数据成员变量) Z. T9 a0 K* K t
0 B( ?( o3 ]* }+ ZIDC-EDIT1doublem-x
( ]& F$ r2 m7 [+ t! R. vIDC-EDIT2doublem-y
8 V) }- \2 Q2 Z7 G0 ~IDC-EDIT3doublem-l2 W5 ^6 r# Z& K4 p2 K3 i. R6 i% L
9 Z h: x: W: ^$ p5 c/ x- p; C(4)在工作区CLASSVIEW中,添加CExample1的公有成员函数voidlifangti(doubleca,doublecb,doublecl)
6 _- ~ r" A m' B# F+ W
! M+ Y7 P9 A* [5 h8 W B# k) Z(5)在EXAMPLEAPP.APP中添加#include"Resource.h"头文件,并完成程序驱动法绘图代码如下:
. y3 J* `/ g' i. q/ @9 e3 A+ i* q3 J- P/ E$ U9 `4 D: H
voidCExample1App::lifangti(doubleca,doublecb,doublecl)7 J5 ]5 N% Z, o
{LPMODELDOCpModDoc=NULL;
2 j: G B# [, v6 N; n9 I0 pLPPARTDOCret;
. s3 B; q3 n9 k# nTheApplication->m-pSldWorks->INewPart(&ret);
/ o; Y5 N; V* a- z* X/ l* hHRESULTres=TheApplication->GetSWApp()->get-IActiveDoc(&pModDoc);
/ n+ P) I* ~+ f3 L. B ^* `if(pModDoc==NULL)
5 d7 B. ]6 i! D3 D1 i& x* `$ ~returnFALSE;
% ]9 e, Z6 F0 Z+ cLPPARTDOCpPartDoc=NULL;" g2 z. a, d+ O( B, ?1 \! O- C2 {& I
res=pModDoc->QueryInterface(IID-IPartDoc,(LPVOID3)&pPartDoc);
2 W! E* g8 P% R. ^: A" }. r/ X: F% a5 I6 UASSERT(res==S-OK);
7 j3 C9 ^% H. s0 W: y* s, Q% lVARIANT-BOOLretval;pModDoc->SelectByID(auT("前视"),auT("PLANE"),0,0,0,&retval);
: y$ T$ c3 J# B1 u3 Z( v! s1 MpModDoc->ShowNamedView2(auT("3NormalTo"),0);+ `4 V% d5 d, D# b/ ^7 s
pModDoc->GridOptions(0,0.001,0,0,10,1,0,0,0.1,1);
/ _" T( b- q; v9 t1 ?/ C5 x$ y3 PpModDoc->InsertSketch();
8 Z4 y' h" N R. gpModDoc->CreateLineVB(-ca,cb,0,-ca cl,cb,0);. Q. ?% U1 z4 y5 M# h. U3 D6 I
pModDoc->CreateLineVB(-ca cl,cb,0,-ca cl,cb-cl,0);
1 m! [; [' a4 C% [( Z* Z6 U3 @9 bpModDoc->CreateLineVB(-ca cl,cb-cl,0,-ca,cb-cl,0);
! S V, |: D% W0 TpModDoc->CreateLineVB(-ca,cb-cl,0,-ca,cb,0);6 l5 A6 {! [" I* Z5 E
pModDoc->ClearSelection();
7 z4 Y h- u* QpPartDoc->FeatureExtrusion(1,0,0,0,0,cl,0.01,0,0,0,0,0.01745329251994,0.01745329251994,0,0);- R* [' f* c, R3 s
pModDoc->ShowNamedView2(auT("3Iso2metric"),7);
7 C* k, i: V' CpModDoc->ViewZoomtofit();0 P) E* [3 d$ j/ K
pModDoc->Release();# d+ N6 z& t. J, \) F T6 @9 R
pPartDoc->Release();" r6 @1 e3 u' Y2 G$ V, J& U7 l+ u
returnTRUE; J% B0 j9 y& {5 Z# N5 \
}. {. v' R9 W7 `4 o) D* H2 B/ d$ h
& d/ G+ G1 F) _! a& N3 o
/ q3 U" [$ g y; W5 n在Example1.cpp中添加#include"LIFANGTI.h"头文件,并在菜单响应函数MenuItemCB(void)里添加如下程序段) E9 V3 \1 p7 p
: [$ H! R$ R7 a6 {7 A8 L/ Q% t
voidMenuItemCB(void)
9 R- M& {) {2 u5 |: W{CLIFANGTIdlg;intn=dlg.DoModal();TheApplication->lifangti(dlg.m-x,dlg.m-y,dlg.m-l);
& Y: s* M: w; ^* ~" S, Oreturn;& B4 g' S, L2 E! b- i1 i0 a ^
}
+ I8 Z5 \1 k. k# \ P% ~) S% E* n$ @1 ?: ?
(7) 编译后用SolidWorks打开文件,选择加载Example1.dll文件。在左下角X和右下角Y中输入位置坐标,边长L中输入20,点击确定,运行情况如图5所示。 |