阿强加油 发表于 2016-1-10 22:28:36

SolidWorks 二次开发 求助

请问有没有哪位大哥大姐对用c++对SolidWorks进行二次开发比较熟悉的,比如下面这个轮毂怎么用C++程序画出来
这是轮毂源文件
各位大哥大姐如有其他三维建模程序的,能不能传给小弟我学习学习,感激不尽了!小弟这边也有些机械方面的资料可以和大家共享。
下面是小弟编的一个程序,新建文件——创建圆柱。
/* NOTE: You will need to add the -GX flag to your Project Options in Project->Settings->C/C++*/
// swobj.cpp : Implementation of Cswobj
#include "stdafx.h"
#include "111.h"
#include "swobj.h"

/////////////////////////////////////////////////////////////////////////////
// Cswobj

void Cswobj::AddUserInterface()
{
        AddToolbar();
        AddMenus();
}

void Cswobj::RemoveUserInterface()
{
        RemoveMenus();
        RemoveToolbar();
}

void Cswobj::AddMenus()
{
        long retval = 0;
        VARIANT_BOOL ok;
        long type;
        long position;
        CComBSTR menu;
        CComBSTR method;
        CComBSTR update;
        CComBSTR hint;

        // Add menu for main frame
        type = swDocNONE;
        position = 3;
        menu.LoadString(IDS_MY1_MENU);
        m_iSldWorks->AddMenu(type, menu, position, &retval);

        position = -1;
        menu.LoadString(IDS_MY1_START_NOTEPAD_ITEM);
        method.LoadString(IDS_MY1_START_NOTEPAD_METHOD);
        hint.LoadString(IDS_MY1_START_NOTEPAD_HINT);
        m_iSldWorks->AddMenuItem2(type, m_swCookie, menu, position, method, update, hint, &ok);

        position = -1;//wb
        menu.LoadString(IDS_111_ITEM);
        method.LoadString(IDS_111_METHOD);
        hint.LoadString(IDS_111_HINT);
        m_iSldWorks->AddMenuItem2(type, m_swCookie, menu, position, method, update, hint, &ok);

        // Add menu for part frame
        type = swDocPART;
        position = 5;
        menu.LoadString(IDS_MY1_MENU);
        m_iSldWorks->AddMenu(type, menu, position, &retval);

        position = -1;//wb
        menu.LoadString(IDS_111_ITEM);
        method.LoadString(IDS_111_METHOD);
        hint.LoadString(IDS_111_HINT);
        m_iSldWorks->AddMenuItem2(type, m_swCookie, menu, position, method, update, hint, &ok);

        position = -1;//wb
        menu.LoadString(IDS_111_ITEM2);
        method.LoadString(IDS_111_METHOD2);
        hint.LoadString(IDS_111_HINT2);
        m_iSldWorks->AddMenuItem2(type, m_swCookie, menu, position, method, update, hint, &ok);

        position = -1;
        menu.LoadString(IDS_MY1_START_NOTEPAD_ITEM);
        method.LoadString(IDS_MY1_START_NOTEPAD_METHOD);
        hint.LoadString(IDS_MY1_START_NOTEPAD_HINT);
        m_iSldWorks->AddMenuItem2(type, m_swCookie, menu, position, method, update, hint, &ok);

        // Add menu for assembly frame
        type = swDocASSEMBLY;
        position = 5;
        menu.LoadString(IDS_MY1_MENU);
        m_iSldWorks->AddMenu(type, menu, position, &retval);

        position = -1;
        menu.LoadString(IDS_MY1_START_NOTEPAD_ITEM);
        method.LoadString(IDS_MY1_START_NOTEPAD_METHOD);
        hint.LoadString(IDS_MY1_START_NOTEPAD_HINT);
        m_iSldWorks->AddMenuItem2(type, m_swCookie, menu, position, method, update, hint, &ok);

        // Add menu for drawing frame
        type = swDocDRAWING;
        position = 5;
        menu.LoadString(IDS_MY1_MENU);
        m_iSldWorks->AddMenu(type, menu, position, &retval);
        position = -1;
        menu.LoadString(IDS_MY1_START_NOTEPAD_ITEM);
        method.LoadString(IDS_MY1_START_NOTEPAD_METHOD);
        hint.LoadString(IDS_MY1_START_NOTEPAD_HINT);
        m_iSldWorks->AddMenuItem2(type, m_swCookie, menu, position, method, update, hint, &ok);

}

void Cswobj::RemoveMenus()
{
        VARIANT_BOOL ok;
        CComBSTR menu;

        menu.LoadString(IDS_MY1_MENU);
        m_iSldWorks->RemoveMenu(swDocNONE, menu, NULL, &ok);
        m_iSldWorks->RemoveMenu(swDocPART, menu, NULL, &ok);
        m_iSldWorks->RemoveMenu(swDocASSEMBLY, menu, NULL, &ok);
        m_iSldWorks->RemoveMenu(swDocDRAWING, menu, NULL, &ok);
}

void Cswobj::AddToolbar()
{
        VARIANT_BOOL stat = VARIANT_FALSE;
        VARIANT_BOOL ok;
        HRESULT hres;

        CComBSTR title;
        CComBSTR callback;
        CComBSTR update;
        CComBSTR tip;
        CComBSTR hint;
        if (m_lToolbarID == 0)
        {
                title.LoadString(IDS_MY1_TOOLBAR_TITLE);
                callback.LoadString(IDS_MY1_TOOLBAR_CALLBACK);
                update.LoadString(IDS_MY1_TOOLBAR_UPDATE);
                tip.LoadString(IDS_MY1_TOOLBAR_TIP);
                hint.LoadString(IDS_MY1_TOOLBAR_HINT);

                hres = m_iSldWorks->AddToolbar3(m_swCookie, title, IDR_TOOLBAR_SMALL, IDR_TOOLBAR_LARGE, -1,
                                                                                swDocTemplateTypeNONE|swDocTemplateTypePART|swDocTemplateTypeASSEMBLY|swDocTemplateTypeDRAWING, &m_lToolbarID);

                m_iSldWorks->AddToolbarCommand2(m_swCookie, m_lToolbarID, 0, callback, update, tip, hint, &ok);
                m_iSldWorks->AddToolbarCommand2(m_swCookie, m_lToolbarID, 1, callback, update, tip, hint, &ok);
                m_iSldWorks->AddToolbarCommand2(m_swCookie, m_lToolbarID, 2, callback, update, tip, hint, &ok);

        }
}

void Cswobj::RemoveToolbar()
{
        if (m_lToolbarID != 0)
        {
                VARIANT_BOOL stat;

                HRESULT hres = m_iSldWorks->RemoveToolbar2( m_swCookie, m_lToolbarID, &stat);
                m_lToolbarID = 0;
        }
}


/////////////////////////////////////////////////////////////////////////////
// ISwAddin implementation

STDMETHODIMP Cswobj::ConnectToSW(IDispatch * ThisSW, LONG Cookie, VARIANT_BOOL * IsConnected)
{
        VARIANT_BOOL status;

        if (IsConnected == NULL)
                return E_POINTER;

       
        m_swCookie = Cookie;
        m_iSldWorks = CComQIPtr<ISldWorks, &__uuidof(ISldWorks)>(ThisSW);
        if (m_iSldWorks != NULL)
        {       
                m_iSldWorks->SetAddinCallbackInfo((long)_Module.GetModuleInstance(), static_cast<Iswobj*>(this), m_swCookie, &status);
                AddUserInterface();
        }

        return S_OK;
}

STDMETHODIMP Cswobj::DisconnectFromSW(VARIANT_BOOL * IsDisconnected)
{
        if (IsDisconnected == NULL)
                return E_POINTER;

        if (m_iSldWorks != NULL)
        {
                RemoveUserInterface();
                m_iSldWorks.Release();
        }

        return E_NOTIMPL;
}


/////////////////////////////////////////////////////////////////////////////
// DSldWorksEvents implementation


/////////////////////////////////////////////////////////////////////////////
// Iswobj implementation

STDMETHODIMP Cswobj::StartNotepad()
{
        // TODO: Add your implementation code here
        ::WinExec("Notepad.exe", SW_SHOW);

        return S_OK;
}

STDMETHODIMP Cswobj::ToolbarUpdate(long *status)
{
        HRESULT retval = S_OK;

        *status = 1;

        return S_OK;
}

STDMETHODIMP Cswobj::first()//新建文件
{
        AFX_MANAGE_STATE(AfxGetStaticModuleState())

        // TODO: Add your implementation code here
        HRESULT retval;
       
        CComPtr<IPartDoc>pPartDoc = NULL;
        retval = m_iSldWorks->NewPart((IDispatch**)&pPartDoc);
        if(pPartDoc == NULL)
        {
                AfxMessageBox(_T("新建零件文件失败"));
                return S_FALSE;
        }
        return S_OK;
}

STDMETHODIMP Cswobj::second()//创建圆柱
{
        AFX_MANAGE_STATE(AfxGetStaticModuleState())

        // TODO: Add your implementation code here
VARIANT_BOOL bRetval = VARIANT_FALSE;

        CComPtr<IModelDoc2> swDoc;//定义ModelDoc对象
        CComPtr<IModelDocExtension> swDocExt;//定义ModelDocExtension对象
        CComPtr<IFeatureManager> swFeatMgr;//定义FeatureManager对象

        m_iSldWorks->get_IActiveDoc2(&swDoc);///获得当前活动文档对象
        swDoc->get_Extension(&swDocExt);///获得当前ModelDocExtension对象
        swDoc->get_FeatureManager(&swFeatMgr);///获得当前特征管理器对象

        CComPtr<ISketch> swSketch;//定义Sketch对象
        swDoc->IGetActiveSketch2(&swSketch);///获得当前激活的草图对象

        if (swSketch == NULL)///如果当前没有激活的草图对象
        {
                swDocExt->SelectByID2(L"Front Plane", L"PLANE", 0.0, 0.0, 0.0, VARIANT_FALSE, 0, NULL, swSelectOptionDefault, &bRetval);///选择前视基准面
                swDoc->InsertSketch2(VARIANT_TRUE);///添加草图
        }

        CComPtr<ISketchSegment> swSkSeg;//定义SketchSegment对象
        swDoc->ICreateCircle2(0.0, 0.0, 0.0, 0.050, 0.0, 0.0, &swSkSeg);///新建一个圆
        CComPtr<IFeature> swFeat;//定义Feature对象

        swFeatMgr->FeatureExtrusion2(VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE,0, 0, 0.100, 0.100,///拉伸

        VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, 0.0, 0.0,

        VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE, VARIANT_FALSE,

        VARIANT_TRUE, VARIANT_FALSE, VARIANT_TRUE, 0, 0.0, VARIANT_FALSE, &swFeat);
        return S_OK;
}


喂我袋盐 发表于 2016-1-10 23:39:54

还要学习高级编程语言,搞这么复杂,主要用在什么方面?

无敌老大 发表于 2016-1-11 07:50:51

看的眼都花了

去上海 发表于 2016-1-11 08:18:41

尤记哪年哪月学过c语言 c++好像成绩还不错 现在这 扎一看 不明觉厉a 

毛血旺的尖叫 发表于 2016-1-11 09:52:10

二次开发对复杂装配体的变型设计才有用吧,单个零件拿来干嘛,做重构库?

Brian_Hou 发表于 2016-1-11 11:00:06

额,我做过VB的SolidWorks二次开发。C++的不会,跟你说一下VB下的SolidWorks二次开发大致思路吧,希望对你有些帮助。我当时做的时候,是通过录制宏及查阅API的help文档做的,单个零件建模的话,其实就是不断的草图绘制和特征建立,而这里面最难的就是草图、基准面什么的选取,找准ID就好了,你可以录制macro文件之后看看。至于你说的这个轮毂的建模,难度应该不大,就只是工作量的问题。

余存 发表于 2016-1-11 11:35:55

弱弱的问一句,为啥要用二次开发画呢?这玩意不是能直接画出来吗?好像也不是特别难得样子啊。。。小白我完全不会用二次开发,但是感觉好像也能画出来。

阿强加油 发表于 2016-1-11 17:52:20

喂我袋盐 发表于 2016-1-10 23:39 static/image/common/back.gif
还要学习高级编程语言,搞这么复杂,主要用在什么方面?

这个好搞零件库

阿强加油 发表于 2016-1-11 17:53:28

余存 发表于 2016-1-11 11:35 static/image/common/back.gif
弱弱的问一句,为啥要用二次开发画呢?这玩意不是能直接画出来吗?好像也不是特别难得样子啊。。。小白我完 ...

要弄零件库,和各种轮胎装配

阿强加油 发表于 2016-1-11 17:54:03

Brian_Hou 发表于 2016-1-11 11:00 static/image/common/back.gif
额,我做过VB的SolidWorks二次开发。C++的不会,跟你说一下VB下的SolidWorks二次开发大致思路吧,希望对你有 ...

初学小弟感觉很难啊
页: [1] 2
查看完整版本: SolidWorks 二次开发 求助