C++实现SolidWorks二次开发第一步:画一个方块

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事件中执行地,点击按钮,就可以生成一个画了方地文件了。

你可能感兴趣的:(solidworks)