找回密码 注册 QQ登录
一站式解决方案

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 7259|回复: 10
打印 上一主题 下一主题

[求助] solidworks设计树特征遍历

[复制链接]
跳转到指定楼层
1
发表于 2016-10-6 08:17:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
各位大侠:
由于没用PDM所以想用系列化配置特征功能做零部件的版本管理,思考了好久觉得这是一种可行的办法。由于不确定工件改动量有多大,所以想的是给零件升级的话先吧上一个版本的设计特征都重新执行一遍,然后再在此特征中修改,所以想的是有个宏能把之前的设计树特征遍历出来重新执行一遍,然后把之前的特征放到设计树的一个旧的版本的文件夹中效果如图
,所以需要一个可以遍历设计树特征的宏。。结合冻结栏的使用可完美管理零部件版本,并且图纸可直接出在一张工程图。
之前
xiaoxifeng 童鞋写了如下的特征遍历,但是只实现了名称的遍历





Option Explicit

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeature As SldWorks.Feature
Dim FeatName As String
Dim FeatType As String


Sub main()
    Set swApp = Application.SldWorks
    If Not swApp Is Nothing Then
        Set swModel = swApp.ActiveDoc
        If Not swModel Is Nothing Then
            Set swFeature = swModel.FirstFeature
            While Not swFeature Is Nothing
                FeatName = swFeature.Name
                FeatType = swFeature.GetTypeName
                MsgBox "Feature screen name = " & FeatName & vbCrLf & _
                        "Feature type name = " & FeatType
                Set swFeature = swFeature.GetNextFeature
            Wend
                End If
        Set swModel = Nothing
    End If
    Set swApp = Nothing
End Sub



所以还的请大虾们帮助一下小虾。
先@闷大,@pyczt @gt.adan @iCAx开思网 @xiaoxifeng
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 赞一下!赞一下!
2
发表于 2016-10-6 08:19:13 | 只看该作者
补充图片。。不知道为什么图片没上传成功

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
3
发表于 2016-10-7 09:20:27 | 只看该作者
在API 帮助文件中有个宏,应该可能参考
  1. ' Preconditions: Part or assembly is open 条件:开启零件或装配体.
  2. ' Postconditions: None 结果:无----实现自动退回到每个特征,并作延迟
  3. ' NOTES: The delay between steps is set to 1 second.注意:每步延迟设置一钞
  4. '---------------------------------
  5. Option Explicit
  6. Public Enum swDocumentTypes_e    '文件类型常数
  7.     swDocNONE = 0
  8.     swDocPART = 1
  9.     swDocASSEMBLY = 2
  10.     swDocDRAWING = 3
  11. End Enum
  12. Public Enum swMoveRollbackBarTo_e    '退回到目标常数
  13.     swMoveRollbackBarToEnd = 1
  14.     swMoveRollbackBarToPreviousPosition = 2
  15.     swMoveRollbackBarToBeforeFeature = 3
  16.     swMoveRollbackBarToAfterFeature = 4
  17. End Enum
  18. Sub main()
  19.     ' Delay in seconds   延迟时间秒
  20.     Const DELAY                     As Single = 1#
  21.    
  22.     Dim swApp                       As SldWorks.SldWorks
  23.     Dim swModel                     As SldWorks.ModelDoc2
  24.     Dim swPart                      As SldWorks.PartDoc
  25.     Dim swAssy                      As SldWorks.AssemblyDoc
  26.     Dim swFeatMgr                   As SldWorks.FeatureManager
  27.     Dim swSelMgr                    As SldWorks.SelectionMgr
  28.     Dim swFeat                      As SldWorks.Feature
  29.     Dim vFeatFace                   As Variant
  30.     Dim swFace                      As SldWorks.Face2
  31.     Dim sFeatName()                 As String
  32.     Dim sNow                        As Single
  33.     Dim nDocType                    As Long
  34.     Dim i                           As Long
  35.     Dim j                           As Long
  36.     Dim bRet                        As Boolean
  37.    
  38.    
  39.     Set swApp = Application.SldWorks
  40.     Set swModel = swApp.ActiveDoc
  41.     Set swFeatMgr = swModel.FeatureManager
  42.     Set swFeat = swModel.FirstFeature
  43.    
  44.     nDocType = swModel.GetType
  45.     Select Case nDocType
  46.         Case swDocPART
  47.             Set swPart = swModel
  48.    
  49.         Case swDocASSEMBLY
  50.             Set swAssy = swModel
  51.     End Select
  52.    
  53.     '以下获取特征名称
  54.     ReDim sFeatName(0)
  55.        Do While Not swFeat Is Nothing
  56.         sFeatName(UBound(sFeatName)) = swFeat.Name
  57.           ReDim Preserve sFeatName(UBound(sFeatName) + 1)
  58.          Set swFeat = swFeat.GetNextFeature
  59.        Loop
  60.    
  61.     ' Loop over-allocates array by 1, so remove last (empty) entry循环数超出数组数为1,所以删除最后(空)项
  62.     ReDim Preserve sFeatName(UBound(sFeatName) - 1)
  63.    
  64.    
  65.     ' Playback each feature in the FeatureManager design tree 在设计特征树中退回每一步
  66.     For i = 0 To UBound(sFeatName)
  67.         Debug.Print sFeatName(i)
  68.         
  69.         bRet = swFeatMgr.EditRollback(swMoveRollbackBarToAfterFeature, sFeatName(i))  '退回命令
  70.         
  71.         ' Do not assert because you may be trying to roll back or roll forward
  72.         ' to a feature that cannot be rolled back or forward to; for example,
  73.         ' the Lighting or Annotations folder  灯光或注释文件夹
  74.         'Debug.Assert bRet
  75.         
  76.         ' Remove any previous highlights  去除原来的高亮
  77.         swModel.GraphicsRedraw2
  78.         
  79.         
  80.         ' Highlight feature if it has any geometry   高亮相关的几何体
  81.         Select Case nDocType
  82.             Case swDocPART
  83.                 Set swFeat = swPart.FeatureByName(sFeatName(i))
  84.         
  85.             Case swDocASSEMBLY
  86.                 Set swFeat = swAssy.FeatureByName(sFeatName(i))
  87.         End Select
  88.         
  89.         vFeatFace = swFeat.GetFaces    '获取特征相关面
  90.         If Not IsEmpty(vFeatFace) Then
  91.             For j = 0 To UBound(vFeatFace)
  92.                 Set swFace = vFeatFace(j)
  93.                
  94.                 swFace.Highlight True   '高亮相关面
  95.             Next j
  96.         End If
  97.         
  98.         ' Only pause if rollback is successful    '在退回成功时延迟暂停
  99.         If bRet Then
  100.             sNow = Timer
  101.             While sNow + DELAY > Timer
  102.                 ' Allow SolidWorks to refresh screen  允计刷屏
  103.                 DoEvents
  104.             Wend
  105.         End If
  106.     Next i
  107.         
  108.     ' Remove highlight from last feature  为下个特征去除高亮
  109.     swModel.GraphicsRedraw2
  110. End Sub
复制代码


4
发表于 2016-10-7 21:33:52 | 只看该作者
pyczt 发表于 2016-10-7 09:20
在API 帮助文件中有个宏,应该可能参考

宏王。。大家都在这么称呼。。那我也这么称呼了。首先谢谢宏王。
我试了下你的宏,可以实现特征的退回和前进(此功能的实现为之后的操作奠定了基础)。。但是不知道是我solidworks版本的原因还是我引用的不对。。试的时候会报错(在面特征操作那里,我不清楚是什么原因试着改了几下也没成功,后来我就直接加了on error resume next)
这里我重新阐述一下我的想法。。
首先,这个想法产生于实际的应用中,由于没有solidworks PDM 所以零件的版本管理主要靠copy旧版本零件,然后给图号加一些升级符号来区别零件的版本,这样做有个明显的劣势,就是随着版本的升级,零件的数量会越来越多,查询旧版本的时候也不是很方便,比如移动了文件零件,对应的图纸很难找到原来在哪个文件夹,之前在学习solidworks自带的系列化配置的时候觉得可以用此功能管理零件的版本,结合本论坛中的配置选着宏和配置删除宏,可以高效的管理零件版本。。图纸也可以在一个文件里出(结合闷大的图纸内名称修改,解决了闷大的宏存在的一个小问题,大家要是有兴趣可以对比一下两个宏的区别)可以很方便的区分零件图纸的版本。之后我把我修改了的宏贴到5楼。供大家参考接着,问题来了,由于零件升级后可能变化很大,如果直接修改设计树中的特征很可能随着版本的升级特征弄得乱七八糟的,不容易维护,也不容易升级新版本,想了很久想出个解决方法,那就是将上一个版本的特征重新执行一遍,然后把上一个版本的特征放到设计树的文件夹中,如二楼图片中的旧版A,通过冻结栏将旧版冻结掉,新版特征修改就不会影响到原来旧版的特征,这样就可以完美解决特征混乱的问题。
最后,由于个人能力有限,API帮助不知道从何下手,所以目前没法独立完成实现上述宏的编写。。
希望大虾能出手相助。。不胜感激。。



5
发表于 2016-10-7 22:03:57 | 只看该作者
本帖最后由 knowbaby 于 2016-10-7 22:28 编辑

首先,原贴地址https://www.icax.org/thread-925975-2-1.html

闷大的宏中存在的问题见下

我在闷大的宏的基础上重新修改了一下解决了此问题
  1. Sub main()

  2. Dim PathName As String
  3. Dim SheetName() As String
  4. Dim ConfigName As String
  5. Dim SplittedPathName() As String
  6. Dim ModelName As String

  7. On Error Resume Next

  8. Set swApp = Application.SldWorks
  9. Set drawing = swApp.ActiveDoc
  10. If drawing Is Nothing Then
  11.     MsgBox "请打开图纸"
  12.     Exit Sub
  13. End If
  14. If drawing.GetType <> 3 Then Exit Sub
  15. SheetName = drawing.GetSheetNames
  16. SheetCount = drawing.GetSheetCount
  17. 'For i = 0 To SheetCount - 1
  18. '    drawing.ActivateSheet SheetName(i)
  19. '    Set swSheet = drawing.GetCurrentSheet
  20. '    swSheet.SetName "[        DISCUZ_CODE_0        ]quot; & i
  21. 'Next
  22. SheetName = drawing.GetSheetNames
  23. For i = 0 To SheetCount - 1                 '更改图纸名称形式为 图号+配置+N个"," 方便后面重新命名
  24.     drawing.ActivateSheet SheetName(i)
  25.     Set swView = drawing.GetFirstView.GetNextView
  26.     PathName = swView.GetReferencedModelName
  27.     ConfigName = swView.ReferencedConfiguration
  28.     SplittedPathName = Split(PathName, "")
  29.     ModelName = SplittedPathName(UBound(SplittedPathName))
  30.     ModelName = Left(ModelName, Len(ModelName) - 7)
  31.     Set swSheet = drawing.GetCurrentSheet
  32.     If ConfigName = "Default" Or ConfigName = "默认" Or ConfigName = "預設" Then
  33.         thissheetname = ModelName
  34.     Else
  35.         thissheetname = ModelName & ConfigName
  36.     End If
  37.     swSheet.SetName thissheetname
  38.     CurrentSheetName = swSheet.GetName
  39.     c = 1

  40.     While CurrentSheetName <> thissheetname
  41.     thissheetname = thissheetname & ","
  42.         swSheet.SetName thissheetname
  43.         CurrentSheetName = swSheet.GetName
  44.            c = c + 1
  45.     Wend
  46.    
  47. Next

  48. SheetName = drawing.GetSheetNames

  49. For i = 0 To SheetCount - 1     '更改同配置图纸形式为 图号+配置+(第几张图纸)

  50.     drawing.ActivateSheet SheetName(i)
  51.    
  52.     Set swView = drawing.GetFirstView.GetNextView
  53.    
  54.     SheetName = drawing.GetSheetNames
  55.    
  56.     Temp = 1

  57.     If Right(SheetName(i), 1) = "," Then

  58.     While Right(SheetName(i), 1) = ","

  59.         SheetName(i) = Left(SheetName(i), Len(SheetName(i)) - 1)
  60.         
  61.         Temp = Temp + 1

  62.     Wend
  63.    
  64.     Set swSheet = drawing.GetCurrentSheet
  65.    
  66.     swSheet.SetName SheetName(i) & "(" & Temp & ")"
  67.    
  68.     Else
  69.    
  70.     Set swSheet = drawing.GetCurrentSheet
  71.    
  72.     swSheet.SetName SheetName(i) & "(" & Temp & ")"
  73.   
  74.     End If
  75.    

  76. Next

  77. SheetName = drawing.GetSheetNames

  78. drawing.ActivateSheet SheetName(0)

  79. End Sub
复制代码
其中注释掉了闷大的$$ & i
因为一般情况下不会出现此类情况,并且如果批量零件图纸操作的时候影响运行速度  @Francis

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
6
发表于 2016-10-8 08:28:47 | 只看该作者
knowbaby 发表于 2016-10-7 21:33
宏王。。大家都在这么称呼。。那我也这么称呼了。首先谢谢宏王。
我试了下你的宏,可以实现特征的退回和 ...

请直呼PYCZT就可以,我水平有限,配不上那个称呼。
用配置的方法去管理新旧版文件,我觉得不妥。我个人认为旧版文件应该锁定或断开外部参考,另存为同名带后缀名的文件保存,工程图也复制出来,工程图再转DWG和PDF保存。

7
发表于 2016-10-9 19:41:22 | 只看该作者
pyczt 发表于 2016-10-8 08:28
请直呼PYCZT就可以,我水平有限,配不上那个称呼。
用配置的方法去管理新旧版文件,我觉得不妥。我个人 ...

好的 PYCZT
  我发现可以把零件另存为其它名称。。然后插入该零件可以完美把特征都插入到设计树中。但是有个问题就是需要处理一下特征。。不过是个进步了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2025-1-10 09:57 , Processed in 0.031230 second(s), 12 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2025 www.iCAx.org

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