1、计算机图形学期末作业基于C+的对Solidworks二次开发B51. 实验目的(1)了解SolidWorks二次开发的基本内容。(2)掌握SolidWorks二次开发的基本知识和基本方法。(3)理解SolidWorks二次开发的基本思路,能根据实际开发需求,查找SolidWorks API帮助中的相关函数,解决开发中实际问题。(4)用Microsoft Visual Studio 2005完成一次简单的SolidWorks 2012二次开发实例。2. 实验内容用Microsoft Visual Studio 2005对SolidWorks 2012进行二次开发,生成插件,实现长方体的参数化设计
2、。使用方法:(1)打开SolidWorks 2012,新建零件,激活并启动Changfangti插件;(2)输入长方体的长度(Length)、宽度(Width)、高度(Height)参数;(3)输入相应参数后,点击OK,生成一个长方体,如图2.1,图2.2所示图2.1 输入参数图2.2 生成长方体3. 实验步骤步骤1、安装Microsoft Visual Studio 2005 和SolidWorks2012。注意,Microsoft Visual Studio 2005要安装在C盘中。步骤2、安装SolidWorks2012 API_SDK。步骤3、运行Microsoft Visual St
3、udio 2005,选择【文件】|【新建】|【项目】命令,如图3.1所示,打开【新建项目】对话框,在“项目类型”中选择SolidWorks COM模板,在“名称”中输入Changfangti,然后单击【确定】按钮。图3.1 创建项目类型出现图3.2所示对话框,选择下一步,直到SwOptions项,勾选PartEvents,其他的默认,点击Finish。图3.2 创建项目步骤4、在stdafx.h中更改SolidWorks类型库的路径,将图3.3中第一行和第三行中红色部分改成本机上类型库的路径图3.3 更改SolidWorks类型库的路径步骤5、实现对话框与SolidWorks API的连接在C
4、ChangfangtiDialog.h文件中声明新的成员变量和成员函数,如图3.4所示图3.4 声明新的成员变量和成员函数在CChangfangti.cpp中定义getSW函数,如图3.5所示图3.5定义getSW函数在Changfangti.cpp中的ToolbarCallback0中调用对话框的getSW函数,如图3.6图3.6 调用getSW函数步骤6、对话框界面设计在资源窗口中点击Dialog,更改对话框界面,在对话框内添加编辑控件3个,静态文本控件3个,按钮控件1 个。更改后如图3.7图3.7 界面设计在图3.7中三个Edit Control中分别添加图3.8所示的变量图3.8 添加
5、键的尺寸变量步骤7、添加生成长方体的代码编好代码添加到CChangfangti.cpp中的OnBnClickedOk()函数中,如图3.9(部分代码)图3.9 生成长方体的代码(部分)4. 实验分析4.1 SolidWorks二次开发原理和关键技术SolidWorks 的API(Application Program Interface,应用程序接口)是一个基于OLE(Object Linking and Embedding,对象的嵌入与链接)Automation 或COM(Component Object Model,组件对象模型)的编程接口,其中包含了数以百计的功能函数,利用这些函数,用户
6、可以开发出所需要的SolidWorks 的专用模块。SolidWorks API是指SolidWorks 程序暴露给开发人员使用的接口,它为开发人员提供SolidWorks 软件本身的功能,如生成拉伸特征、生成草图等,开发人员可以通过在这些接口的基础上实现需要的功能。SolidWorks API是由组成SolidWorks 软件的COM组件提供的,每一个SolidWorks 2012对象都是采用COM技术构造的,因此有着与一般COM对象同样的性质,都是由接口、属性、方法与事件组成的。本次实验所用的SolidWorks API对象有(1)SldWorks对象,是所有其他对象的父类,提供了直接或间
7、接访问其他所有SolidWorks API接口的方法,在二次开发中访问其他接口都要通过它。他是所有SolidWorks API接口的基类。(2)ModelDoc2对象,是所有文档模型对象的父对象,它封装了不同文档模型通用的属性和方法,包括文档打开、关闭、打印和保存等。其中使用的ModelDoc2中的子对象有ModelDocExtension对象、Sketch对象、SketchManager对象FeatureManager对象。4.2 所使用的SolidWorks API中的函数(1)ISldWorks-get_IActiveDoc2(&IModelDoc2),该函数返回当前活动文档对象。(2)
8、IModelDoc2-get_Extension(&IModelDocExtension),该函数返回当前ModelDocEx-tension对象。(3)IModelDoc2-IGetActiveSketch2(&ISketch),该函数返回当前Sketch对象。(4)ModelDocExtension -SelectByID2(String Name, String Type, double X, double Y, double Z, bool Append, int Mark, Callout Callout, int SelectOption, & VARIANT_BOOL),该函数选
9、择草图中具体的实体。(5)IModelDoc2-InsertSketch2(VARIANT_TRUE),该函数新建一个草图。(6)IModelDoc2- get_SketchManager(&ISketchManager),该函数获得草图管理器。(7)ISketchManager - CreateLine(double X1, double Y1, double Z1, double X2, double Y2, double Z2, & ISketchSegment),该函数在草图中绘制一条直线。(8)IModelDoc2-get_FeatureManager(&IFeatureManage
10、r),该函数获得当前特征管理器。(9)IFeatureManager -FeatureExtrusion2(bool Sd, bool Flip, bool Dir, int T1, int T2, double D1, double D2, bool Dchk1, bool Dchk2, bool Ddir1, bool Ddir2, double Dang1, double Dang2, bool OffsetReverse1, bool OffsetReverse2, bool TranslateSurface1, bool TranslateSurface2, bool Merge,
11、bool UseFeatScope, bool UseAutoSelect, & IFeature),该函数用于拉伸草图。5. 程序代码/ Changfangti.cpp : Implementation of CChangfangti#include stdafx.h#include Changfangti.h#include SwDocument.h#include CChangfangtiDialog.h#include #include BitmapHandler.h/ CChangfangtivoid CChangfangti:AddCommandManager() CComPtr
12、icmdGroup; CComObject:CreateInstance(&iBmp); long cmdIndex0, cmdIndex1; const int numDocumentTypes = 3; int docTypesnumDocumentTypes; docTypes0 = swDocASSEMBLY, docTypes1 = swDocDRAWING, docTypes2 = swDocPART; CComBSTR title; title.LoadString(IDS_TOOLBAR_TITLE); CComBSTR hint; hint.LoadString(IDS_ME
13、NU_HINT); iCmdMgr-CreateCommandGroup(MAIN_CMD_GROUP_ID,title,title,hint,-1,&icmdGroup); CComBSTR smallImageFile; iBmp-CreateBitmapFileFromResource(IDB_TOOLBAR_SMALL, &smallImageFile); icmdGroup-put_SmallIconList(smallImageFile); CComBSTR largeImageFile; iBmp-CreateBitmapFileFromResource(IDB_TOOLBAR_
14、LARGE, &largeImageFile); icmdGroup-put_LargeIconList(largeImageFile); CComBSTR largeIconFile; iBmp-CreateBitmapFileFromResource(IDB_ICON_LARGE, &largeIconFile); icmdGroup-put_LargeMainIcon(largeIconFile); CComBSTR smallIconFile; iBmp-CreateBitmapFileFromResource(IDB_ICON_SMALL, &smallIconFile); icmd
15、Group-put_SmallMainIcon(smallIconFile); CComBSTR tip; CComBSTR callback; CComBSTR enable; VARIANT_BOOL cmdActivated; callback.LoadString(IDS_TOOLBAR_CALLBACK0); enable.LoadString(IDS_TOOLBAR_ENABLE0); tip.LoadString(IDS_TOOLBAR_TIP0); hint.LoadString(IDS_TOOLBAR_HINT0); icmdGroup-AddCommandItem2(tip
16、,-1,hint,tip,0,callback,enable,0,3,&cmdIndex0); icmdGroup-put_HasToolbar(true); icmdGroup-put_HasMenu(true); icmdGroup-Activate(&cmdActivated); for(int i=0; i numDocumentTypes; i+) CComPtr cmdTab = NULL; long TabCount, docType = docTypesi; iCmdMgr-GetCommandTabCount(docType, &TabCount); / check if t
17、ab exists iCmdMgr-GetCommandTab(docType, title, &cmdTab); if(cmdTab = NULL) / if not, add one iCmdMgr-AddCommandTab(docType, title, &cmdTab); CComPtr cmdBox; cmdTab-AddCommandTabBox(&cmdBox); / create 2 commands on this tab long CommandIDCount = 2; long CommandIDs2; long TextDisplayStyles2; long cmd
18、ID = 0; / the 2 command buttons have different text styles icmdGroup-get_CommandID(cmdIndex0, &cmdID); CommandIDs0 = cmdID; TextDisplayStyles0 = swCommandTabButton_TextHorizontal; icmdGroup-get_ToolbarId(&cmdID); CommandIDs1 = cmdID; TextDisplayStyles1 = swCommandTabButton_TextHorizontal; VARIANT_BO
19、OL vbResult = VARIANT_FALSE; cmdBox-IAddCommands(CommandIDCount, CommandIDs, TextDisplayStyles, &vbResult); CommandIDCount = 1; icmdGroup-get_ToolbarId(&cmdID); CommandIDs0 = cmdID; TextDisplayStyles0 = swCommandTabButton_TextBelow | swCommandTabButton_ActionFlyout; CComPtr cmdBox1; cmdTab-AddComman
20、dTabBox(&cmdBox1); cmdBox1-IAddCommands(CommandIDCount, CommandIDs, TextDisplayStyles, &vbResult); CComPtr cmdBoxNew1; cmdTab-AddSeparator(cmdBox1, cmdID, &cmdBoxNew1); /Clean up iBmp-Dispose(); iBmp-Release();void CChangfangti:RemoveCommandManager() VARIANT_BOOL cmdRemoved = VARIANT_FALSE; iBmp-Dis
21、pose(); iBmp-Release(); iCmdMgr-RemoveCommandGroup(MAIN_CMD_GROUP_ID,&cmdRemoved);STDMETHODIMP CChangfangti:OnDocChange(void) / TODO: Add your implementation code here return S_OK;/Called after a document is openedSTDMETHODIMP CChangfangti:OnFileOpenPostNotify(BSTR fileName) HRESULT hres = S_OK; hre
22、s = AttachEventsToAllDocuments(); return hres;/Called when a new document is created or a document is loadedSTDMETHODIMP CChangfangti:OnDocLoad(BSTR docTitle, BSTR docPath) return S_OK;VARIANT_BOOL CChangfangti:AttachEventHandlers() VARIANT_BOOL attached = VARIANT_TRUE; this-m_libid = LIBID_SldWorks
23、; this-m_wMajorVerNum = GetSldWorksTlbMajor(); this-m_wMinorVerNum = 0; CSldWorksEvents:_tih.m_wMajor = this-m_wMajorVerNum; / Connect to the SldWorks event sink HRESULT success = this-DispEventAdvise(iSwApp, &_uuidof(DSldWorksEvents); if (success != S_OK) return VARIANT_FALSE; / Connect event handl
24、ers to all previously open documents success = AttachEventsToAllDocuments(); if (success != S_OK) attached = VARIANT_FALSE; return attached;HRESULT CChangfangti:AttachEventsToAllDocuments() VARIANT_BOOL attached = VARIANT_TRUE; USES_CONVERSION; TMapIUnknownToDocument:iterator iter; CComPtr iModelDoc
25、2; iSwApp-IGetFirstDocument2(&iModelDoc2); while (iModelDoc2 != NULL) iter = openDocs.find(iModelDoc2); if (iter = openDocs.end() ATLTRACE(tCChangfangti:DocumentLoadNotify current part not foundn); attached = AttachModelEventHandler(iModelDoc2); if(!attached) return E_FAIL; CComPtr iNextModelDoc2; i
26、ModelDoc2-IGetNext(&iNextModelDoc2); iModelDoc2.Release(); iModelDoc2 = iNextModelDoc2; return S_OK;/Create an event handling object for this document and listen for the models eventsVARIANT_BOOL CChangfangti:AttachModelEventHandler(CComPtr iModelDoc2) VARIANT_BOOL attached = VARIANT_TRUE; if (iMode
27、lDoc2 = NULL) return VARIANT_FALSE; TMapIUnknownToDocument:iterator iter; iter = openDocs.find(iModelDoc2); if (iter = openDocs.end() /Cretae a new Document event handler CComObject *pDoc; CComObject:CreateInstance( &pDoc); pDoc-Init(CComObject*)this, iModelDoc2); /Listen for the docs events attache
28、d = pDoc-AttachEventHandlers(); if(!attached) return VARIANT_FALSE; /Add it to the map openDocs.insert(TMapIUnknownToDocument:value_type(iModelDoc2, pDoc); iModelDoc2.p-AddRef(); pDoc-AddRef(); return attached;/Stop listening for SolidWorks EventsVARIANT_BOOL CChangfangti:DetachEventHandlers() VARIA
29、NT_BOOL detached = VARIANT_TRUE; / Disconnect from the SldWorks event sink HRESULT success = this-DispEventUnadvise(iSwApp, &_uuidof(DSldWorksEvents); CSldWorksEvents:_tih.m_plibid = &GUID_NULL; if (success != S_OK) return VARIANT_FALSE; / Disconnect all event handlers TMapIUnknownToDocument:iterator iter; iter = openDocs.begin(); for (iter = openDocs.begin(); iter != openDocs.end(); /*iter+*/) /The iteration is performed inside the loop TMapIUnknownToDocument:value_type obj = *iter; iter+; CComObject *pDoc = (CComObj
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1