SolidWorks机械工程师网——最大的SolidWorks学习平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1326|回复: 3
打印 上一主题 下一主题

求大神答疑-关于从装配体中遍历零件的特征(C++)

  [复制链接]

5

主题

19

帖子

63

金币

天使

Rank: 2Rank: 2

积分
175

最佳新人宣传达人

跳转到指定楼层
楼主
发表于 2017-4-6 11:06:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

   经典图书
    各位大神好。笔者最近在做关于sw二次开发的项目,遇到不少困难,望各位大神能给予解决。
    以下代码是根据API手册里Traverse Assembly at Component and Feature Levels Using Recursion Example (C#)改写的,其实就是将C#换成c++,最终达成的目的是从装配体中遍历零件的特征。具体代码如下:
  1. void Firstdialog::TraverseFeatureFeatures(CComPtr<IFeature> swFeat, long nLevel, CString* MyString)
  2. {
  3.     CComPtr<IFeature> swSubFeat = NULL;
  4.     CComPtr<IFeature> swSubSubFeat = NULL;
  5.     CComPtr<IFeature>swSubSubSubFeat =NULL;
  6.     CComPtr<IFeature> pNextFeature = NULL;//定义特征对象
  7.     CString sPadStr = _T(" ") ;
  8.     BSTR   B_FeatName;//定义组件的名称
  9.     BSTR   B_FeatTypeName;
  10.     BSTR   B_SubFeatName;//定义组件的名称
  11.     BSTR   B_SubFeatTypeName;
  12.     BSTR   B_SubSubFeatName;//定义组件的名称
  13.     BSTR   B_SubSubFeatTypeName;
  14.     BSTR   B_SubSubSubFeatName;//定义组件的名称
  15.     BSTR   B_SubSubSubFeatTypeName;
  16.     long i = 0;
  17.     for (i = 0; i <= nLevel; i++)
  18.     {
  19.         sPadStr += " ";
  20.     }
  21.     while ((swFeat != NULL))
  22.     {
  23.         swFeat->get_Name(&B_FeatName);
  24.         swFeat->GetTypeName2(&B_FeatTypeName);
  25.         *MyString = *MyString + sPadStr + B_FeatName + _T(" [") + B_FeatTypeName + _T("]")+_T(":\n");
  26.         swFeat->IGetFirstSubFeature(&swSubFeat);
  27.         while ((swSubFeat != NULL))
  28.         {
  29.             swSubFeat->get_Name(&B_SubFeatName);
  30.             swSubFeat->GetTypeName2(&B_SubFeatTypeName);
  31.             *MyString = *MyString + sPadStr + B_SubFeatName + _T(" [") + B_SubFeatTypeName + _T("]")+_T(":\n");
  32.             swSubFeat->IGetFirstSubFeature(&swSubSubFeat);
  33.             while ((swSubSubFeat != NULL))
  34.             {
  35.                 swSubSubFeat->get_Name(&B_SubSubFeatName);
  36.                 swSubSubFeat->GetTypeName2(&B_SubSubFeatTypeName);
  37.                 *MyString = *MyString + sPadStr + B_SubSubFeatName + _T(" [") + B_SubSubFeatTypeName + _T("]")+_T(":\n");
  38.                 swSubSubFeat->IGetFirstSubFeature(&swSubSubSubFeat);
  39.                 while ((swSubSubSubFeat != NULL))
  40.                 {
  41.                     swSubSubSubFeat->get_Name(&B_SubSubSubFeatName);
  42.                     swSubSubSubFeat->GetTypeName2(&B_SubSubSubFeatTypeName);
  43.                     *MyString = *MyString + sPadStr + B_SubSubSubFeatName + _T(" [") + B_SubSubSubFeatTypeName + _T("]")+_T(":\n");
  44.                     
  45.                     pNextFeature = NULL;
  46.                     swSubSubSubFeat->IGetNextSubFeature(&pNextFeature);
  47.                     swSubSubSubFeat = NULL;
  48.                     swSubSubSubFeat = pNextFeature;
  49.                     pNextFeature = NULL;
  50.                 }
  51.                  pNextFeature = NULL;
  52.                   swSubSubFeat->IGetNextSubFeature(&pNextFeature);
  53.                  swSubSubFeat = NULL;
  54.                   swSubSubFeat = pNextFeature;
  55.                  pNextFeature = NULL;
  56.             }   
  57.              pNextFeature = NULL;
  58.              swSubFeat->IGetNextSubFeature(&pNextFeature);
  59.              swSubFeat = NULL;
  60.              swSubFeat = pNextFeature;
  61.              pNextFeature = NULL;
  62.         }
  63.          pNextFeature = NULL;
  64.          swFeat->IGetNextFeature(&pNextFeature);
  65.          swFeat = NULL;
  66.          swFeat = pNextFeature;
  67.          pNextFeature = NULL;
  68.     }
  69. }
  70. void Firstdialog::TraverseComponentFeatures(CComPtr<IComponent2> swComp, long nLevel, CString* MyString)
  71. {
  72.         CComPtr<IFeature> swFeat;
  73.         swComp->FirstFeature(&swFeat);
  74.         TraverseFeatureFeatures(swFeat, nLevel, MyString);
  75. }
  76. void Firstdialog::TraverseComponent(CComPtr<IComponent2> swComp, long nLevel, CString* MyString)
  77. {
  78.         /*CComPtr<IComponent2> *swChildComp;*/
  79.         CString sPadStr = _T(" ") ;
  80.         int i = 0;
  81.         int   nChildren;///定义子零件个数
  82.         HRESULT  hres ;
  83.         BSTR   Name;//定义组件的名称
  84.         CComPtr<IComponent2> pComponent;
  85.         for (i = 0; i <= nLevel - 1; i++)
  86.         {
  87.                 sPadStr = sPadStr + _T(" ");
  88.         }
  89.         swComp->IGetChildrenCount(&nChildren);// 获得组件下子零件个数
  90.         if ( nChildren > 0 )
  91.         {
  92.                 CComPtr<IComponent2> *swChildComp = new CComPtr<IComponent2>[nChildren]; ///初始化字符串数组
  93.                 hres = swComp->IGetChildren((IComponent2 **)&swChildComp);//// 获得子零件
  94.                 if(S_OK == hres)
  95.                 {
  96.                         for (i=0; i<nChildren; i++ )
  97.                         {
  98.                                 <font color="Red">CComPtr<IComponent2> swChildCompOut = swChildComp[i];
  99.                                 swChildCompOut->get_Name2(&Name);</font>
  100.                                 *MyString = *MyString + sPadStr + Name +_T(":\n");
  101.                        
  102.                                 TraverseComponentFeatures(swChildComp[i], nLevel, MyString);
  103.                                 TraverseComponent(swChildComp[i], nLevel + 1,MyString);
  104.                                         swChildComp[i]=NULL;  ////////释放子零件对象
  105.                         }
  106.                 }
  107.                 swChildComp = NULL;
  108.                 delete [] swChildComp;        
  109.         }
  110. }
  111. <div class="blockcode"><blockquote>void Firstdialog::OnBnClickedButton4()
  112. {CComPtr<IModelDoc2> iSwModel;
  113.         CString MyString;
  114.         CComPtr<IConfiguration> swConf;
  115.         CComPtr<IComponent2> swRootComp;
  116.         long docType = -1;
  117.         m_iSldWorks_dlg->get_IActiveDoc2(&iSwModel);
  118.         iSwModel->IGetActiveConfiguration(&swConf);
  119.         swConf->IGetRootComponent2(&swRootComp);
  120.         TraverseModelFeatures(iSwModel, 1, &MyString);
  121.        
  122.         iSwModel->GetType(&docType);
  123.                 if (docType == swDocASSEMBLY)
  124.                 {
  125.                         <font color="Red">TraverseComponent(swRootComp, 1, &MyString);</font>
  126.                 }
  127.                 iSwModel=NULL;
  128.                 AfxMessageBox(MyString);
  129. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享教程|习题|模型|技巧 点赞点赞 拍砖拍砖
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复

使用道具 举报

5

主题

19

帖子

63

金币

天使

Rank: 2Rank: 2

积分
175

最佳新人宣传达人

沙发
 楼主| 发表于 2017-4-6 11:09:44 | 只看该作者
C:\Users\Administrator\Desktop
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复 支持 反对

使用道具 举报

2

主题

19

帖子

243

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
352
QQ
板凳
发表于 2017-4-7 10:04:39 | 只看该作者

   经典图书
楼主,遇到什么问题都没有说
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

5

主题

19

帖子

63

金币

天使

Rank: 2Rank: 2

积分
175

最佳新人宣传达人

地板
 楼主| 发表于 2017-4-7 15:01:06 | 只看该作者
pndcdlg 发表于 2017-4-7 10:04
楼主,遇到什么问题都没有说
这个帖子之前发错了,我在另外一个帖子重新发了。麻烦大神看一下另外一个帖子
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

SOLIDWORKS 2023 机械设计从入门到精通

手机版|小黑屋| GMT+8, 2025-6-1 21:06 , Processed in 0.153283 second(s), 22 queries , Memcache On.

SolidWorks机械工程师网 ( 鲁ICP备14025122号-2 ) 鲁公网安备 37028502190335号

声明:本网言论纯属发表者个人意见,与本网立场无关。
如涉版权,可发邮件: admin@swbbsc.com

快速回复 返回顶部 返回列表