C# Solidworks二次开发:三种获取SW设计结构树的方法-第三讲

2023-12-15 17:35:42

今天要讲的文章接着上一篇讲,第三种获取SW设计结构树的方法。

这个方法的逻辑是通过先获取第一个特征,然后通过循环不断的寻找下一个特征来完成获取所有节点。

1、获取第一个特征的API如下所示:FirstFeature Method (IModelDoc2)

这个API的方法解释为:获取文档中的第一个特性。

返回值的类型为Feature。

使用的例子如下所示:

?           ModelDoc2?swModel?=?default(ModelDoc2);
????????????ModelView?swModelView?=?default(ModelView);
????????????PartDoc?swPart?=?default(PartDoc);
????????????AssemblyDoc?swAssy?=?default(AssemblyDoc);
????????????FeatureManager?swFeatMgr?=?default(FeatureManager);
????????????Feature?swFeat?=?default(Feature);
????????????object[]?featFace?=?null;
????????????Face2?swFace?=?default(Face2);
????????????object?rect?=?null;
????????????string?featureName?=?null;
????????????ArrayList?featName?=?new?ArrayList();
????????????string?nameString;
????????????int?docType?=?0;
????????????int?i?=?0;
????????????int?j?=?0;
????????????bool?status?=?false;
 
????????????swModel?=?(ModelDoc2)swApp.ActiveDoc;
????????????swModelView?=?(ModelView)swModel.ActiveView;
????????????rect?=?null;
????????????swFeatMgr?=?(FeatureManager)swModel.FeatureManager;
 
????????????swFeat?=?(Feature)swModel.FirstFeature();
????????????docType?=?swModel.GetType();
????????????switch?(docType)
????????????{
????????????????case?(int)swDocumentTypes_e.swDocPART:
????????????????????swPart?=?(PartDoc)swModel;
????????????????????break;
????????????????case?(int)swDocumentTypes_e.swDocASSEMBLY:
????????????????????swAssy?=?(AssemblyDoc)swModel;
????????????????????break;
????????????????default:
????????????????????Debug.Print("Open?a?part?or?assembly?document,?then?rerun?this?macro.");
????????????????????break;
????????????}
 
 
 
????????????while?((swFeat?!=?null))
????????????{
????????????????featureName?=?swFeat.Name;
????????????????featName.Add(featureName);
????????????????swFeat?=?(Feature)swFeat.GetNextFeature();
????????????}

2、获取下一个特征的API为:GetNextFeature Method (IFeature)

这个API的解释为:获取部件中的下一个特性。

使用的例子如下所示:

?   public?void?TraverseFeatureFeatures(Feature?swFeat,?long?nLevel)
????????{
????????????Feature?swSubFeat;
????????????Feature?swSubSubFeat;
????????????Feature?swSubSubSubFeat;
????????????string?sPadStr?=?"?";
????????????long?i?=?0;
 
????????????for?(i?=?0;?i?<=?nLevel;?i++)
????????????{
????????????????sPadStr?=?sPadStr?+?"?";
????????????}
????????????while?((swFeat?!=?null))
????????????{
????????????????Debug.Print(sPadStr?+?swFeat.Name?+?"?["?+?swFeat.GetTypeName2()?+?"]");
????????????????swSubFeat?=?(Feature)swFeat.GetFirstSubFeature();
 
????????????????while?((swSubFeat?!=?null))
????????????????{
????????????????????Debug.Print(sPadStr?+?"??"?+?swSubFeat.Name?+?"?["?+?swSubFeat.GetTypeName()?+?"]");
????????????????????swSubSubFeat?=?(Feature)swSubFeat.GetFirstSubFeature();
 
????????????????????while?((swSubSubFeat?!=?null))
????????????????????{
????????????????????????Debug.Print(sPadStr?+?"????"?+?swSubSubFeat.Name?+?"?["?+?swSubSubFeat.GetTypeName()?+?"]");
????????????????????????swSubSubSubFeat?=?(Feature)swSubSubFeat.GetFirstSubFeature();
 
????????????????????????while?((swSubSubSubFeat?!=?null))
????????????????????????{
????????????????????????????Debug.Print(sPadStr?+?"??????"?+?swSubSubSubFeat.Name?+?"?["?+?swSubSubSubFeat.GetTypeName()?+?"]");
????????????????????????????swSubSubSubFeat?=?(Feature)swSubSubSubFeat.GetNextSubFeature();
 
????????????????????????}
 
????????????????????????swSubSubFeat?=?(Feature)swSubSubFeat.GetNextSubFeature();
 
????????????????????}
 
????????????????????swSubFeat?=?(Feature)swSubFeat.GetNextSubFeature();
 
????????????????}
 
????????????????swFeat?=?(Feature)swFeat.GetNextFeature();
 
????????????}
 
????????}

上面的这两个例子只是说怎么用,具体这两个API的配合使用逻辑是要结合? while (feature != null)循环一起使用,才可以获取到所有的节点。

今天这篇文章就介绍这么多,我们下篇文章再见。

文章来源:https://blog.csdn.net/m0_53104033/article/details/134885133
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。