计算机图形学期末作业基于C++的对Solidworks二次开发B5.docx
《计算机图形学期末作业基于C++的对Solidworks二次开发B5.docx》由会员分享,可在线阅读,更多相关《计算机图形学期末作业基于C++的对Solidworks二次开发B5.docx(21页珍藏版)》请在冰豆网上搜索。
![计算机图形学期末作业基于C++的对Solidworks二次开发B5.docx](https://file1.bdocx.com/fileroot1/2023-8/3/cb0607a9-fa91-4abd-90ae-c06c8df3715b/cb0607a9-fa91-4abd-90ae-c06c8df3715b1.gif)
计算机图形学期末作业基于C++的对Solidworks二次开发B5
1.实验目的
(1)了解SolidWorks二次开发的基本内容。
(2)掌握SolidWorks二次开发的基本知识和基本方法。
(3)理解SolidWorks二次开发的基本思路,能根据实际开发需求,查找SolidWorksAPI帮助中的相关函数,解决开发中实际问题。
(4)用MicrosoftVisualStudio2005完成一次简单的SolidWorks2012二次开发实例。
2.实验内容
用MicrosoftVisualStudio2005对SolidWorks2012进行二次开发,生成插件,实现长方体的参数化设计。
使用方法:
(1)打开SolidWorks2012,新建零件,激活并启动Changfangti插件;
(2)输入长方体的长度(Length)、宽度(Width)、高度(Height)参数;
(3)输入相应参数后,点击OK,生成一个长方体,如图2.1,图2.2所示
图2.1输入参数
图2.2生成长方体
3.实验步骤
步骤1、安装MicrosoftVisualStudio2005和SolidWorks2012。
注意,MicrosoftVisualStudio2005要安装在C盘中。
步骤2、安装SolidWorks2012API_SDK。
步骤3、运行MicrosoftVisualStudio2005,选择【文件】|【新建】|【项目】命令,如图3.1所示,打开【新建项目】对话框,在“项目类型”中选择SolidWorksCOM模板,在“名称”中输入Changfangti,然后单击【确定】按钮。
图3.1创建项目类型
出现图3.2所示对话框,选择下一步,直到SwOptions项,勾选PartEvents,其他的默认,点击Finish。
图3.2创建项目
步骤4、在stdafx.h中更改SolidWorks类型库的路径,将图3.3中第一行和第三行中红色部分改成本机上类型库的路径
图3.3更改SolidWorks类型库的路径
步骤5、实现对话框与SolidWorksAPI的连接
在CChangfangtiDialog.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中三个EditControl中分别添加图3.8所示的变量
图3.8添加键的尺寸变量
步骤7、添加生成长方体的代码
编好代码添加到CChangfangti.cpp中的OnBnClickedOk()函数中,如图3.9(部分代码)
图3.9生成长方体的代码(部分)
4.实验分析
4.1SolidWorks二次开发原理和关键技术
SolidWorks的API(ApplicationProgramInterface,应用程序接口)是一个基于OLE(ObjectLinkingandEmbedding,对象的嵌入与链接)Automation或COM(ComponentObjectModel,组件对象模型)的编程接口,其中包含了数以百计的功能函数,利用这些函数,用户可以开发出所需要的SolidWorks的专用模块。
SolidWorksAPI是指SolidWorks程序暴露给开发人员使用的接口,它为开发人员提供SolidWorks软件本身的功能,如生成拉伸特征、生成草图等,开发人员可以通过在这些接口的基础上实现需要的功能。
SolidWorksAPI是由组成SolidWorks软件的COM组件提供的,每一个SolidWorks2012对象都是采用COM技术构造的,因此有着与一般COM对象同样的性质,都是由接口、属性、方法与事件组成的。
本次实验所用的SolidWorksAPI对象有
(1)SldWorks对象,是所有其他对象的父类,提供了直接或间接访问其他所有SolidWorksAPI接口的方法,在二次开发中访问其他接口都要通过它。
他是所有SolidWorksAPI接口的基类。
(2)ModelDoc2对象,是所有文档模型对象的父对象,它封装了不同文档模型通用的属性和方法,包括文档打开、关闭、打印和保存等。
其中使用的ModelDoc2中的子对象有ModelDocExtension对象、Sketch对象、SketchManager对象FeatureManager对象。
4.2所使用的SolidWorksAPI中的函数
(1)ISldWorks->get_IActiveDoc2(&IModelDoc2),该函数返回当前活动文档对象。
(2)IModelDoc2->get_Extension(&IModelDocExtension),该函数返回当前ModelDocEx-tension对象。
(3)IModelDoc2->IGetActiveSketch2(&ISketch),该函数返回当前Sketch对象。
(4)ModelDocExtension->SelectByID2(StringName,StringType,doubleX,doubleY,doubleZ,boolAppend,intMark,CalloutCallout,intSelectOption,&VARIANT_BOOL),该函数选择草图中具体的实体。
(5)IModelDoc2->InsertSketch2(VARIANT_TRUE),该函数新建一个草图。
(6)IModelDoc2->get_SketchManager(&ISketchManager),该函数获得草图管理器。
(7)ISketchManager->CreateLine(doubleX1,doubleY1,doubleZ1,doubleX2,doubleY2,doubleZ2,&ISketchSegment),该函数在草图中绘制一条直线。
(8)IModelDoc2->get_FeatureManager(&IFeatureManager),该函数获得当前特征管理器。
(9)IFeatureManager->FeatureExtrusion2(boolSd,boolFlip,boolDir,intT1,intT2,doubleD1,doubleD2,boolDchk1,boolDchk2,boolDdir1,boolDdir2,doubleDang1,doubleDang2,boolOffsetReverse1,boolOffsetReverse2,boolTranslateSurface1,boolTranslateSurface2,boolMerge,boolUseFeatScope,boolUseAutoSelect,&IFeature),该函数用于拉伸草图。
5.程序代码
//Changfangti.cpp:
ImplementationofCChangfangti
#include"stdafx.h"
#include"Changfangti.h"
#include"SwDocument.h"
#include"CChangfangtiDialog.h"
#include
#include"BitmapHandler.h"
//CChangfangti
voidCChangfangti:
:
AddCommandManager()
{
CComPtricmdGroup;
CComObject:
:
CreateInstance(&iBmp);
longcmdIndex0,cmdIndex1;
constintnumDocumentTypes=3;
intdocTypes[numDocumentTypes];
docTypes[0]=swDocASSEMBLY,
docTypes[1]=swDocDRAWING,
docTypes[2]=swDocPART;
CComBSTRtitle;
title.LoadString(IDS_TOOLBAR_TITLE);
CComBSTRhint;
hint.LoadString(IDS_MENU_HINT);
iCmdMgr->CreateCommandGroup(MAIN_CMD_GROUP_ID,title,title,hint,-1,&icmdGroup);
CComBSTRsmallImageFile;
iBmp->CreateBitmapFileFromResource(IDB_TOOLBAR_SMALL,&smallImageFile);
icmdGroup->put_SmallIconList(smallImageFile);
CComBSTRlargeImageFile;
iBmp->CreateBitmapFileFromResource(IDB_TOOLBAR_LARGE,&largeImageFile);
icmdGroup->put_LargeIconList(largeImageFile);
CComBSTRlargeIconFile;
iBmp->CreateBitmapFileFromResource(IDB_ICON_LARGE,&largeIconFile);
icmdGroup->put_LargeMainIcon(largeIconFile);
CComBSTRsmallIconFile;
iBmp->CreateBitmapFileFromResource(IDB_ICON_SMALL,&smallIconFile);
icmdGroup->put_SmallMainIcon(smallIconFile);
CComBSTRtip;
CComBSTRcallback;
CComBSTRenable;
VARIANT_BOOLcmdActivated;
callback.LoadString(IDS_TOOLBAR_CALLBACK0);
enable.LoadString(IDS_TOOLBAR_ENABLE0);
tip.LoadString(IDS_TOOLBAR_TIP0);
hint.LoadString(IDS_TOOLBAR_HINT0);
icmdGroup->AddCommandItem2(tip,-1,hint,tip,0,callback,enable,0,3,&cmdIndex0);
icmdGroup->put_HasToolbar(true);
icmdGroup->put_HasMenu(true);
icmdGroup->Activate(&cmdActivated);
for(inti=0;i{
CComPtrcmdTab=NULL;
longTabCount,docType=docTypes[i];
iCmdMgr->GetCommandTabCount(docType,&TabCount);
//checkiftabexists
iCmdMgr->GetCommandTab(docType,title,&cmdTab);
if(cmdTab==NULL)
{
//ifnot,addone
iCmdMgr->AddCommandTab(docType,title,&cmdTab);
CComPtrcmdBox;
cmdTab->AddCommandTabBox(&cmdBox);
//create2commandsonthistab
longCommandIDCount=2;
longCommandIDs[2];
longTextDisplayStyles[2];
longcmdID=0;
//the2commandbuttonshavedifferenttextstyles
icmdGroup->get_CommandID(cmdIndex0,&cmdID);
CommandIDs[0]=cmdID;
TextDisplayStyles[0]=swCommandTabButton_TextHorizontal;
icmdGroup->get_ToolbarId(&cmdID);
CommandIDs[1]=cmdID;
TextDisplayStyles[1]=swCommandTabButton_TextHorizontal;
VARIANT_BOOLvbResult=VARIANT_FALSE;
cmdBox->IAddCommands(CommandIDCount,CommandIDs,TextDisplayStyles,&vbResult);
CommandIDCount=1;
icmdGroup->get_ToolbarId(&cmdID);
CommandIDs[0]=cmdID;
TextDisplayStyles[0]=swCommandTabButton_TextBelow|swCommandTabButton_ActionFlyout;
CComPtrcmdBox1;
cmdTab->AddCommandTabBox(&cmdBox1);
cmdBox1->IAddCommands(CommandIDCount,CommandIDs,TextDisplayStyles,&vbResult);
CComPtrcmdBoxNew1;
cmdTab->AddSeparator(cmdBox1,cmdID,&cmdBoxNew1);
}
}
//Cleanup
iBmp->Dispose();
iBmp->Release();
}
voidCChangfangti:
:
RemoveCommandManager()
{
VARIANT_BOOLcmdRemoved=VARIANT_FALSE;
iBmp->Dispose();
iBmp->Release();
iCmdMgr->RemoveCommandGroup(MAIN_CMD_GROUP_ID,&cmdRemoved);
}
STDMETHODIMPCChangfangti:
:
OnDocChange(void)
{
//TODO:
Addyourimplementationcodehere
returnS_OK;
}
//Calledafteradocumentisopened
STDMETHODIMPCChangfangti:
:
OnFileOpenPostNotify(BSTRfileName)
{
HRESULThres=S_OK;
hres=AttachEventsToAllDocuments();
returnhres;
}
//Calledwhenanewdocumentiscreatedoradocumentisloaded
STDMETHODIMPCChangfangti:
:
OnDocLoad(BSTRdocTitle,BSTRdocPath)
{
returnS_OK;
}
VARIANT_BOOLCChangfangti:
:
AttachEventHandlers()
{
VARIANT_BOOLattached=VARIANT_TRUE;
this->m_libid=LIBID_SldWorks;
this->m_wMajorVerNum=GetSldWorksTlbMajor();
this->m_wMinorVerNum=0;
CSldWorksEvents:
:
_tih.m_wMajor=this->m_wMajorVerNum;
//ConnecttotheSldWorkseventsink
HRESULTsuccess=this->DispEventAdvise(iSwApp,&__uuidof(DSldWorksEvents));
if(success!
=S_OK)
returnVARIANT_FALSE;
//Connecteventhandlerstoallpreviouslyopendocuments
success=AttachEventsToAllDocuments();
if(success!
=S_OK)
attached=VARIANT_FALSE;
returnattached;
}
HRESULTCChangfangti:
:
AttachEventsToAllDocuments()
{
VARIANT_BOOLattached=VARIANT_TRUE;
USES_CONVERSION;
TMapIUnknownToDocument:
:
iteratoriter;
CComPtriModelDoc2;
iSwApp->IGetFirstDocument2(&iModelDoc2);
while(iModelDoc2!
=NULL)
{
iter=openDocs.find(iModelDoc2);
if(iter==openDocs.end())
{
ATLTRACE("\tCChangfangti:
:
DocumentLoadNotifycurrentpartnotfound\n");
attached=AttachModelEventHandler(iModelDoc2);
if(!
attached)
returnE_FAIL;
}
CComPtriNextModelDoc2;
iModelDoc2->IGetNext(&iNextModelDoc2);
iModelDoc2.Release();
iModelDoc2=iNextModelDoc2;
}
returnS_OK;
}
//Createaneventhandlingobjectforthisdocumentandlistenforthemodel'sevents
VARIANT_BOOLCChangfangti:
:
AttachModelEventHandler(CComPtriModelDoc2)
{
VARIANT_BOOLattached=VARIANT_TRUE;
if(iModelDoc2==NULL)
returnVARIANT_FALSE;
TMapIUnknownToDocument:
:
iteratoriter;
iter=openDocs.find(iModelDoc2);
if(iter==openDocs.end())
{
//CretaeanewDocumenteventhandler
CComObject*pDoc;
CComObject:
:
CreateInstance(&pDoc);
pDoc->Init((CComObject*)this,iModelDoc2);
//Listenforthedoc'sevents
attached=pDoc->AttachEventHandlers();
if(!
attached)
returnVARIANT_FALSE;
//Addittothemap
openDocs.insert(TMapIUnknownToDocument:
:
value_type(iModelDoc2,pDoc));
iModelDoc2.p->AddRef();
pDoc->AddRef();
}
returnattached;
}
//StoplisteningforSolidWorksEvents
VARIANT_BOOLCChangfangti:
:
DetachEventHandlers()
{
VARIANT_BOOLdetached=VARIANT_TRUE;
//DisconnectfromtheSldWorkseventsink
HRESULTsuccess=this->DispEventUnadvise(iSwApp,&__uuidof(DSldWorksEvents));
CSldWorksEvents:
:
_tih.m_plibid=&GUID_NULL;
if(success!
=S_OK)
returnVARIANT_FALSE;
//Disconnectalleventhandlers
TMapIUnknownToDocument:
:
iteratoriter;
iter=openDocs.begin();
for(iter=openDocs.begin();iter!
=openDocs.end();/*iter++*/)//Theiterationisperformedinsidetheloop
{
TMapIUnknownToDocument:
:
value_typeobj=*iter;
iter++;
CComObject*pDoc=(CComObj