SolidWorks是一款很强大的机械设计建模软件,同其他同类型软件一样,它也提供二次开发的接口。
一个二次开发入门的很好的方法就是,利用宏录制来生成代码,再将其用到程序里。但如果要用C++来做二次开发,较VB和C#还需费些周折。
俺用的是SolidWorks2016版本,如果需要宏录制生成C#代码,需要在安装的时候选择“ Microsoft Visual Studio Tools for Applications (VSTA)”,否则宏录制生成的代码只有VB代码。
看到这里,不知有没有人发现了一个问题,没错,宏录制是不生成C++代码的。至少SolidWorks2016不会生成。更过分的是,api文档中的C++实例文档也很少,很多都只给出了VB和C#的。嗯,有人说C++是最难的一门编程语言,可能宏录制也觉得难吧~
宏录制之后的代码是不能直接用的,因为宏录制是记录操作的过程,会产生很多冗余的代码。正确的方式是参考宏录制生成的代码,了解画图,今天这篇文章画的是方,我们就用他来举例。参考宏录制生成的代码,了解画一个方需要调用那些接口,再参考api文档中的说明,了解用C++语言做二次开发,需要做什么准备工作,用什么类和函数。
以下是宏录制生成的C#代码,我已经将冗余部分删得7788了。
SldWorks.SldWorks swApp;
SldWorks.ModelDoc2 Part;
swApp = new SldWorks.SldWorks();//创建一个SldWorks实例
swApp.NewDocument("C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS 2016\\templates\\gb_part.prtdot", 0, 0, 0);//新建一个零件类型的文档
Part = swApp.ActiveDoc;//ModelDoc2包含了一些常用的对文档的操作,例如绘制,保存等。ActiveDoc返回一个在用的文档,如果没有的话,返回的是null
Part.SketchManager.InsertSketch(true);//插入一个草图
Part.Extension.SelectByID2("前视基准面", "PLANE", -5.51688046000562E-02, 6.20552978418983E-02, -1.37730216225479E-03, false, 0, null, 0);//选择前视基准面
Part.ClearSelection2(true);
Part.SketchManager.CreateCenterRectangle(0, 0, 0, -2.56018390836871E-02, 2.57775321181576E-02, 0);//画一个方形
Part.ShowNamedView2("*上下二等角轴测", 8);
Part.ClearSelection2(true);
Part.FeatureManager.FeatureExtrusion2(true, false, false, 0, 0, 0.032, 0.01, false, false, false, false, 1.74532925199433E-02, 1.74532925199433E-02, false, false, false, false, true, true, true, 0, 0, false);//特征操作
Part.SaveAs3("D:\\desktopfiles\\三维示意图\\lingjian10.SLDPRT", 0, 2);//保存绘制的图纸
swApp.ExitApp();//退出
swApp = null;
让我们看看,将上述C#代码转换为C++代码是什么样纸的。
在写代码之前,先要引入相关的包。
#import "D:\\solidworks_install_file\\SOLIDWORKS\\sldworks.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "D:\\solidworks_install_file\\SOLIDWORKS\\swconst.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
_COM_SMARTPTR_TYPEDEF(ISldWorks,__uuidof(ISldWorks));
_COM_SMARTPTR_TYPEDEF(IModelDoc2, __uuidof(IModelDoc2));
_COM_SMARTPTR_TYPEDEF(IFeature, __uuidof(IFeature));
CoInitialize(NULL);
//use smart pointers
ISldWorksPtr swApp;
IModelDoc2Ptr Part;
IModelViewPtr myModelView;
long* i=0;
//create an instance of soldworks
HRESULT hres = swApp.CreateInstance(__uuidof(SldWorks),NULL, CLSCTX_LOCAL_SERVER);
if (hres == S_OK) {
IDispatchPtr retval;
IDispatchPtr retval5;
VARIANT_BOOL retval2=false;
IModelDocPtr imodeldoc_re;
HRESULT hres1=swApp->INewDocument(_com_util::ConvertStringToBSTR("C:\\ProgramData\\SOLIDWORKS\\SOLIDWORKS 2016\\templates\\gb_part.prtdot"), 0, 0, 0, &(IModelDocPtr)Part);
HRESULT hres3=swApp->get_IActiveDoc2(&Part);
Part->InsertSketch();
Part->SelectByID(_com_util::ConvertStringToBSTR("前视基准面"), _com_util::ConvertStringToBSTR("PLANE"), -5.51688046000562E-02, 6.20552978418983E-02, -1.37730216225479E-03, &retval2);
Part->ClearSelection2(true);
_COM_SMARTPTR_TYPEDEF(ISketchManager, __uuidof(ISketchManager));
ISketchManagerPtr ISMg;
Part->get_SketchManager(&ISMg);
VARIANT retval3;
ISMg->CreateCenterRectangle(0, 0, 0, -2.56018390836871E-02, 2.57775321181576E-02, 0, &retval3);
Part->ShowNamedView2(_com_util::ConvertStringToBSTR("*上下二等角轴测"), 8);
Part->ClearSelection2(true);
_COM_SMARTPTR_TYPEDEF(IFeatureManager, __uuidof(IFeatureManager));
IFeatureManagerPtr myFmg;
IFeaturePtr IFretval;
Part->get_FeatureManager(&myFmg);
myFmg->FeatureExtrusion2(true, false, false, 0, 0, 0.032, 0.01, false, false, false, false, 1.74532925199433E-02, 1.74532925199433E-02, false, false, false, false, true, true, true, 0, 0, false, &IFretval);
HRESULT hres5 = Part->SaveAs(_com_util::ConvertStringToBSTR("D:\\desktopfiles\\三维示意图\\lingjian12.SLDPRT"),&retval2);
swApp->ExitApp();
}
swApp=NULL;
CoUninitialize();
懂C++的人看得出来,俺写的代码很烂。求不喷。毕竟成长空间很足。对于一个C++小白来说,把C#的代码转换为C++的代码是很不容易的。
几乎是一行一行地出bug,一行一行地改。期间还因为无知而碰到各种奇奇怪怪的问题。
C++相比C#更为严格,有些转换必须显式地强制转换,而有些转换压根不能做。方法地调用也颇费周章。
以上代码俺是放在button地click事件中执行地,点击按钮,就可以生成一个画了方地文件了。