计算机图形学期末作业基于C++的对Solidworks二次开发B5.docx

上传人:b****5 文档编号:29933410 上传时间:2023-08-03 格式:DOCX 页数:21 大小:283.12KB
下载 相关 举报
计算机图形学期末作业基于C++的对Solidworks二次开发B5.docx_第1页
第1页 / 共21页
计算机图形学期末作业基于C++的对Solidworks二次开发B5.docx_第2页
第2页 / 共21页
计算机图形学期末作业基于C++的对Solidworks二次开发B5.docx_第3页
第3页 / 共21页
计算机图形学期末作业基于C++的对Solidworks二次开发B5.docx_第4页
第4页 / 共21页
计算机图形学期末作业基于C++的对Solidworks二次开发B5.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

计算机图形学期末作业基于C++的对Solidworks二次开发B5.docx

《计算机图形学期末作业基于C++的对Solidworks二次开发B5.docx》由会员分享,可在线阅读,更多相关《计算机图形学期末作业基于C++的对Solidworks二次开发B5.docx(21页珍藏版)》请在冰豆网上搜索。

计算机图形学期末作业基于C++的对Solidworks二次开发B5.docx

计算机图形学期末作业基于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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1