阀门零件BOM二次开发与数据转换设计

发布时间:2011-06-15  点击数:3257

    三维CAD软件工程图中可以生成包含装配体组成零件各种参数的材料明细表(BOM),通过BOM可以得到产品从设计到制造的整个过程的记录和零件清单,这些信息在整个产品的生产过程中将起到决定性的作用,应用到网络化制造平台,共享这些数据将大大提高制造系统的运行效率,节约成本。

一、调节阀的典型三维零件的建模

    阀门是流体管路的控制装置,其基本功能是接通或切断管路介质的流通及其,改变介质的流通及其流动方向,调节其压力和流量,保护管路的设备的正常运行。

    阀门的用途广泛、种类繁多,这里选择锅炉中最常用的两种阀门:闸阀截止阀,在SolidWorks中建立模型如图1、2所示。

图1 闸阀        图2 截止阀

二、典型零件二次开发的相关技术

    SolidWorks是一套基于Windows平台的面向产品级的三维CAD软件,具有较好的开发性接口和功能扩充性,提供了基于Windows的COM(组件对象模型)技术的API接口,开发人员可使用任何支持COM的编程语言作为SolidWorks二次开发的编程工具,通过API可创造出自行定制的SolidWorks功能模块。

    程序将采用DLL的形式,使用DLL的主要目的是为了共享代码,DLL的代码可被所有的Windows应用程序共享,使用DLL还可以便于程序模块化,且只有在需要的时候载入内存,达到节省资源的目的。

    XML(可扩展标识语言)是一种非常好的数据交换工具,被广泛地应用于各种平台和系统,XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,支持XML的程序可以更容易的与Windows,Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中加以分析,并以XML格式输出结果。

三、零件BOM到XML的数据转换

    阀门工程图中生成的BOM,列出了阀门零件或装配体的每个配置的数量。这些信息可以应用于相关的生产制造系统中。下面将通过实例来阐述如何实现BOM到XML的数据转换。

本程序秉承面向对象的开发思想,需要实现嵌入SolidWorks,用户界面、读取BOM,数据转换,文件保存等5个基本功能,并分为3个模块各自    独立,便于修改和后期的维护升级。

    1、嵌入SolidWorks,实现添加自定义菜单的功能

    下载并安装SolidWorksAPISDK,并将Swizard.awx复制到VisualC++6.0的安装目录\Common\MSDev98\Template文件夹中,然后运行VisualC++6.0,选择工程目录下的SolidWorksAdd-InAppWiz2ard,编译并生成.dll文件,接下来就可以开始添加自定义菜单,与菜单添加有关的几个方法是(均为COM格式)如下:

    (1)获取SolidWorks程序主窗体框架对象的指针。

    status=SldWorks->IFrameObject(&retval);

    (2)添加菜单到菜单栏

    status=Frame->AddMenu(Menu,Position,&retval);

    (3)添加菜单项或分割条到现有的下拉菜单

    status=Frame->AddMenuItem(Menu,Item,Position,CallbackFcnAndModule,&retval);

    打开SolidWorks主程序,在下拉菜单工具->插件中选择编译生成的DLL文件,点击确定,即完成.dll程序的导入。

    2、用户界面,实现友好简洁的操作环境

    采用弹出式对话框,点击相应按钮来完成后续的操作,步骤如下:

    (1)新建一个含有按钮控件的模态或非模态对话框。

    (2)在程序中添加该对话框的调用方法,当点击下拉菜单中相应菜单项时,弹出对话框。

    在调用对话框的过程中,如果同时加载几个不同的插件,会出现分别调用时出现冲突的情况。产生这个问题的根源在于应用程序与MFC规则DLL共享MFCDLL(或MFC扩展DLL)的程序总是默认使用EXE的资源,因此SolidWorks不能充分识别系统资源和用户资源,解决的方法是必须进行资源模块句柄的切换,在程序中通过AfxGetResourceHandle和AfxSetResourceHandle的合理变更,能够灵活地设置程序的资源模块句柄。

    上述功能具体实现方法是在voidMenuItemCB(void)中加入以下代码:

    HINSTANCEsave_hInstance=AfxGetResourceHandle();//获取当前的资源并保存

    HINSTANCEhDll;

    hDll=AfxLoadLibrary(_T("MyBom.dll"));//

    加载新的资源

    if(hDll==NULL)

  AfxMessageBox(_T("Can′tLoadthelibrary"));

    else

  AfxSetResourceHandle(hDll);//设置新的资源

    CMyBomDlg3pdlg=newCMyBomDlg();//新建对话框

    pdlg->Create(IDD_DIALOG1,NULL);

    pdlg->ShowWindow(SW_SHOW);

    AfxSetResourceHandle(save_hInstance);//还原先前保存的资源

    return;

    3、读取BOM信息转换成XML格式并保存

    为了使程序模块化,这里将读取数据、转换数据、保存数据3个功能合成1个方法,然后在对话框相应的按钮中添加响应函数,在该函数中调用此方法。

    A、读取BOM信息

    在SolidWorksAPICOM编程中,DrawingDoc对象的指针可通过接口查询函数QueryInterface得到:

    LPDRAWINGDOCm_pDrawingDoc=NULL;

    res=m_pModelDoc->QueryInterface(IID_IDrawingDoc,(LPVOID3)&m_pDrawingDoc);

    通过m_pDrawingDoc可以调用与SolidWorks工程图相关的函数,例如:

    m_pDrawingDoc->IGetCurrentSheet(&m_pSheet);//指向工程图

    m_pSheet->IGetBomTable(&m_pBomTable);

    //指向BOM

    与获取BOM数据信息有关的函数:

    m_pBomTable->GetColumnCount(&retval);

    //获取BOM的总列数

    m_pBomTable->GetRowCount(&retval);//

    获取BOM的总行数

    m_pBomTable->GetHeaderText(i,&retval);

    //获取所有列的标题

    m_pBomTable->GetEntryText(i,j,&retval);

    //获取任意一个单元格的内容

    ⋯⋯

    在调用BOM的操作函数之前必须用m_pBomTable先调用Attach函数关联BOM,完成操作之后调用Detach函数释放:

    m_pBomTable->Attach();

    ⋯⋯

    m_pBomTable->Detach();

    B、新建XML表写入数据并保存

    DOM(DocumentObjectModel文档对象模型)是对XML文档进行应用开发、编程的应用程序接口。作为W3C公布的一种跨平台、与语言无关的接口规范,DOM提供了在不同环境和应用中的标准程序接口,可以用任何语言实现。利用DOM,可以动态地创建XML文档,遍历结构,添加、修改、删除内容等。因此,DOMAPIs成为应用程序和XML文档之间互通的桥梁。

    (1)在stdafx.h中导入MSXML头文件和库:

    #import<msxml4.dll>

    usingnamespaceMSXML2;

    (2)在上一小节的方法中添加创建XML表的代码:

    MSXML2∶IXMLDOMDocumentPtrpDoc=NULL;

    //初始化COM对象

    CoInitialize(NULL);

    //创建DOMDocument对象

    HRESULThr=pDoc.CreateInstance(__uuidof

    (MSXML2∶DOMDocument40));

    ⋯⋯

    (3)将获取到的BOM信息写入XML,步骤如下:

    遍历BOM

    //按照每一个单元格数据所处位置逐列顺序添加到XML表在相应的元素节点中

    {

    获取BOM的行数和列数

   在每一列中

      {

    获取列名称;

  创建新元素节点;

  获取每一行的数据;

  转换数据为XML格式并添

  加到该元素节点中;

  添加该元素节点为上一级子节点;

      }

    }

    XML数据写入数据并保存的函数示例:

    pDoc->createElement(bstrName,pElement);

    pElement->put_text(bstrText);

    pNodeChild->appendChild(pElement);

    pDoc->save(VARIANTdestination);

四、结论

    阀门零件BOM中包含了产品设计的重要信息,通过二次开发技术,将这些信息转换为数据传输通用的XML格式,为产品的网络化制造系统提供了的信息来源。提高了运行效率,在实际生产中将得到广泛的应用。