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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

好品数字
好品数字
查看: 3884|回复: 21
打印 上一主题 下一主题

求助:vba 获取镜像件的原始组件名称

  [复制链接]

6

主题

71

帖子

258

金币

堂主

Rank: 4

积分
721

最佳新人活跃会员热心会员宣传达人

跳转到指定楼层
楼主
 楼主| 发表于 2023-12-18 13:13:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的:获取solidworks镜像件的原始组件名称,最终实现将零部件数量写入到工程图中
下面的代码是我截取的一段,判断是否是镜像件,但没有获取原始组件名称的代码
通过截取特征名称(列:零件1镜像)可以获取原始组件,但这种方式不知道有没有漏洞,暂时排除这种方法,最好是直接获取原始组件名称的代码

Dim swApp As SldWorks.SldWorks
Sub main()
Set swApp = Application.SldWorks
Set childmodel = swApp.ActiveDoc
Set thisFeat = childmodel.FirstFeature           '定义第一个识别特征
Y = 1                       '遍历设计树加速参数
Mir = 0
Do While Not thisFeat Is Nothing       '在软件中遍历设计树循环开始    -------Do While 1
   If Y < 7 Then GoTo line1             '忽略前面6个特征,从第七个开始遍历
   If thisFeat.GetTypeName2 = "MirrorStock" Then
     Mir = 1
     MsgBox thisFeat.Name   '获取特征的名称
     Set mirrorComp = thisFeat.GetDefinition  '获取特征内所有参数
     '获取镜像件的原始名称代码


    End If
line1:
  Set thisFeat = thisFeat.GetNextFeature            '定义下一个识别特征
  Y = Y + 1
Loop
End Sub


------------------------------------------------------------------------------------------------------------------------------------------------------------------


百度AI给出的答案,但实际测试无法使用
Dim swApp As SldWorks.SldWorks
Dim swModel As ModelDoc2
Dim swComp As Component2
Dim mirrorComp As MirrorFeatureData
Dim originalCompName As String

Sub GetOriginalComponentName()
    Set swApp = Application.SldWorks

    '打开模型文件
    Set swModel = swApp.OpenDoc("C:\Path\To\Your\File.sldprt", swDocumentTypes_e.swDocPART)

    If Not swModel Is Nothing Then
        '选择要查询的镜像特性
        Set swComp = swModel.SelectionManager.GetSelectedObject6(1, -1)

        If TypeOf swComp Is Feature And swComp.GetTypeName2 = "MIRROR" Then
            '将镜像特性转换为MirrorFeatureData对象
            Set mirrorComp = swComp.GetDefinition

            '获取原始组件名称
            originalCompName = mirrorComp.GetMirrorComponent().GetNameForDisplay

            MsgBox "原始组件名称:" & originalCompName
        Else
            MsgBox "未选择有效的镜像特性!"
        End If

        '关闭模型文件
        swModel.CloseDoc
    Else
        MsgBox "无法打开指定的模型文件!"
    End If
End Sub





补充内容 (2023-12-19 08:08):
还有原始文件的全路径,是否可以输出

补充内容 (2023-12-27 11:13):
更新后的代码在16楼,但仍缺少从镜像零件中直接获取原始零件对象(model)的代码,期盼大神指点,谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 转播转播 分享教程|习题|模型|技巧 点赞点赞 拍砖拍砖
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复

使用道具 举报

6

主题

71

帖子

258

金币

堂主

Rank: 4

积分
721

最佳新人活跃会员热心会员宣传达人

推荐
 楼主| 发表于 2023-12-27 11:10:15 | 只看该作者
代码已更新,有两点目前没想到怎么处理的细节如下:1. 最大的缺点还是镜像零件不能直接获取原始零件的对象,只能用合成组合“镜像零件的路径+截取的名字+.SLDPRT"来匹配原始组件,从而获得对象,这就会出现bug,第一种情况镜像零件与原始零件不在同一文件夹下,第二种镜像零件的特征名称被手动修改,这两种情况就会匹配不到;2. 原始零件被多次镜像且文件名不同;

----------------------------------------------------------------------------------------------------
代码思路:
以上两点虽说不常见但总归会碰到的,目前代码是利用字典,

第一步 遍历装配体,获取数据

······
获取每个零件的数量写入字典,判断镜像件写入字典
字典1:所有不重复的零部件(字典的键是零件的全路径)
字典1A:与字典1一样(用处下面会讲)
字典2:所有的镜像零件(字典的键是零件的全路径)
还有其余字典,比如字典2A的值放零件对象,这些就不说了,自己看代码理解

······

第二步 将各个字典的数据进行处理,编辑零件自定义特性

循环 字典1的键
     编辑零件数量
     判断 字典2中若存在此键
                      获取原始零件的全路径(通过字典,在第一步中已对应写入)
                      判断 字典1A中若存在原始全路径
                               获取原始对象(通过字典,在第一步中已对应写入)
                               将镜像信息写入原始对象中
                               移除字典2中的键(镜像件全路径,循环完成后多余的键就是没有写入的零件)
                               移除字典1A中的键(原始件全路径,这样就能防止多个镜像件写入相同的原始零件)
循环结束后检查字典2,若存在键,则说明有镜像零件未能写入原始零件中,按此即可输出文本(镜像件全路径,镜像件数量)   
属性增加数量_当前装配体_v1.2.rar (27.81 KB, 下载次数: 119, 售价: 1 金币)
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复 支持 1 反对 0

使用道具 举报

3

主题

1119

帖子

230

金币

传奇

Rank: 8Rank: 8

积分
3758

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

板凳
发表于 2023-12-18 17:30:42 | 只看该作者
顶一下,坐等高手!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

16

主题

236

帖子

625

金币

传奇

Rank: 8Rank: 8

积分
3231

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

地板
发表于 2023-12-19 00:05:18 | 只看该作者
顶一下,坐等高手!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

6

主题

71

帖子

258

金币

堂主

Rank: 4

积分
721

最佳新人活跃会员热心会员宣传达人

5#
 楼主| 发表于 2023-12-19 11:33:42 | 只看该作者

   经典案例图书
顶起来,千万别沉,麻烦各位大佬帮帮忙!
附带已写完勉强能用的宏,打开总装配体,运行宏,自动写入零件数量(统一路径下),镜像件写入原始零件中,属性名“镜像数量”
有需要的朋友自己取走 属性增加数量_当前装配体.rar (24.46 KB, 下载次数: 62)
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

205

帖子

974

金币

传奇

Rank: 8Rank: 8

积分
5069

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

6#
发表于 2023-12-19 12:46:38 | 只看该作者
感谢楼主分享,很不错!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

37

主题

990

帖子

1万

金币

版主

Rank: 7Rank: 7Rank: 7Rank: 7

积分
19514

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

7#
发表于 2023-12-20 08:57:32 | 只看该作者

   经典案例图书
提供一个简洁的宏,交流一下(看了一下时间,真凑巧,刚刚好是三年前写的)

统计零件数量_2020-12-20.zip (8.55 KB, 下载次数: 37, 售价: 1 金币)

SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

6

主题

71

帖子

258

金币

堂主

Rank: 4

积分
721

最佳新人活跃会员热心会员宣传达人

8#
 楼主| 发表于 2023-12-20 10:18:35 | 只看该作者
Allate 发表于 2023-12-20 08:57
提供一个简洁的宏,交流一下(看了一下时间,真凑巧,刚刚好是三年前写的)

前辈的这个宏不管编写还是理解都简单明了,但可能不太适合我的工作环境
1. 运行时间较长,先是遍历所有零件数量清零,然后再遍历所有零件自增,相同零件重复打开-编辑-保存
2.应我司厂情,工程图上需要能直接看到数量:X件/台(车间不看BOM表,怕出错),对称制作的零件是不出工程图的,数量也要体现在原始零件的工程图上,所以才有了这个求助贴例如下面的技术要求,3处加粗下划线的地方就要做成链接和零件的属性进行绑定:
技术要求:
1.单台用量:2件;
2.零件2按本图对称制作3件。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

37

主题

990

帖子

1万

金币

版主

Rank: 7Rank: 7Rank: 7Rank: 7

积分
19514

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

9#
发表于 2023-12-20 13:26:10 | 只看该作者
pujing 发表于 2023-12-20 10:18
前辈的这个宏不管编写还是理解都简单明了,但可能不太适合我的工作环境
1. 运行时间较长,先是遍历所有 ...

第2点是没有考虑到,因为只是用来交流一下,不是为了你这个来写的。
至于第1点,你确定你的宏运行时间比我这个要短?不要盲目自信,请自行测试一下。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

5

主题

233

帖子

861

金币

长老

Rank: 6Rank: 6Rank: 6

积分
2916

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

10#
发表于 2023-12-20 14:57:01 | 只看该作者
pujing 发表于 2023-12-20 10:18
前辈的这个宏不管编写还是理解都简单明了,但可能不太适合我的工作环境
1. 运行时间较长,先是遍历所有 ...

出图习惯是 对称件 在标题栏数量显示2, 然后再技术要求里写左右对称 ?
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

30

帖子

37

金币

天使

Rank: 2Rank: 2

积分
120
QQ
11#
发表于 2023-12-21 09:00:09 | 只看该作者
SW机械工程师网,找到组织了!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

1

主题

26

帖子

7

金币

天使

Rank: 2Rank: 2

积分
75

最佳新人活跃会员

12#
发表于 2023-12-21 18:11:27 | 只看该作者
宏这东西是有必要学习一下,提高工作效率
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

1

主题

26

帖子

7

金币

天使

Rank: 2Rank: 2

积分
75

最佳新人活跃会员

13#
发表于 2023-12-21 18:12:37 | 只看该作者
花点时间学习一下这个
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

6

主题

71

帖子

258

金币

堂主

Rank: 4

积分
721

最佳新人活跃会员热心会员宣传达人

14#
 楼主| 发表于 2023-12-26 09:13:08 | 只看该作者
Allate 发表于 2023-12-20 13:26
第2点是没有考虑到,因为只是用来交流一下,不是为了你这个来写的。
至于第1点,你确定你的宏运行时间比 ...

多谢前辈指点,发帖后就发现这个问题了,直接装配图通过遍历Components的方式是最快的,通过路径打开模型反而慢了,再研究研究看能不能在镜像体中通过字典方式匹配获取原始零件的Component(在python里的字典能保存Component,vba就不知道了,试试)
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

5

主题

233

帖子

861

金币

长老

Rank: 6Rank: 6Rank: 6

积分
2916

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

15#
发表于 2023-12-26 15:28:59 | 只看该作者
加入QQ群
参与讨论和学习

SolidWorks技术交流群

或扫描二维码加入

pujing 发表于 2023-12-26 09:13
多谢前辈指点,发帖后就发现这个问题了,直接装配图通过遍历Components的方式是最快的,通过路径打开模型 ...

期待新版  
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

6

主题

479

帖子

526

金币

长老

Rank: 6Rank: 6Rank: 6

积分
2559

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

16#
发表于 2023-12-26 16:11:48 | 只看该作者

   经典案例图书
楼主很专业,写得很好!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

5

主题

233

帖子

861

金币

长老

Rank: 6Rank: 6Rank: 6

积分
2916

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

17#
发表于 2023-12-27 13:12:08 | 只看该作者
加入QQ群
参与讨论和学习

SolidWorks技术交流群

或扫描二维码加入

pujing 发表于 2023-12-27 11:10
代码已更新,有两点目前没想到怎么处理的细节如下:1. 最大的缺点还是镜像零件不能直接获取原始零件的对象 ...

谢谢 ,已下载 。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

6

主题

479

帖子

526

金币

长老

Rank: 6Rank: 6Rank: 6

积分
2559

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

18#
发表于 2023-12-27 13:55:23 | 只看该作者

   经典案例图书
很不错,顶一下!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

6

主题

71

帖子

258

金币

堂主

Rank: 4

积分
721

最佳新人活跃会员热心会员宣传达人

19#
 楼主| 发表于 2023-12-28 15:19:15 | 只看该作者
sunsu168 发表于 2023-12-20 14:57
出图习惯是 对称件 在标题栏数量显示2, 然后再技术要求里写左右对称 ?

习惯是数量都写在技术要求的第一点和第二点(对称件),第三四五就是具体零件的要求了
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

42

帖子

292

金币

堂主

Rank: 4

积分
766

最佳新人活跃会员宣传达人

20#
发表于 2024-1-8 22:53:48 | 只看该作者
A大神你好,有个问题不知道怎么弄,想请教一下您。内容有点长啊,不忙的话麻烦耐心看看。也可以加一下我QQ260891067,沟通方便点。
我们公司用的是SOLIDWORKS2021的。我们一个系列的机器都是放在同一个装配体里面的,然后通过配置来做不同的产品。打个比方,这台机器是做给1000ml牛奶包的,就在装配体里面做1000ml的配置。然后过一段时间后,客户又新增了500ml牛奶包,那又会在装配体里面新增一个500ml的配置。但500ml和1000ml的机架是不通用的,两者大小不一样。我现在的做法是在新配置里面把旧机架压缩掉,然后插入一个新机架。但这样有个弊端,我除了机架不通用以外,其余的很多装在机架上面的组件、或者零件、螺丝这些又是通用的,把旧机架压缩插入新机架后,这些配合要全部重新配合,这机架有几百个小零件,这样装配起来过于耗时间和且枯燥了。我就想着,如果新配置的机架不能共用了,能不能建立类似使之独立的功能,在新配置的旧机架右键独立一个新的机架出来,但和使之独立不一样的是,旧配置还是旧机架,新配置里面只是独立一个新机架出来,然后旧机架压缩,且新机架可以继承旧机架的配合关系。最后我在新机架的基本上面去修改尺寸即可。
我也想过在零件上面去做配置,然后再在装配体上面选对应的配置,这样也可以继承配合,但目前公司是不同意这个做法,说出图容易搞错机型。意思是不给用这种做法。
我自己对VBA懂点皮毛(能看得懂一些代码,比如图号分离这种也会写,高难度的不会),知道用VBA应该是可以实现这个功能的,但超出能力范围了,无从下手,想着大神你有没有好的方法,帮帮忙,或者指点一下。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭 卷起
关闭 卷起

手机版|小黑屋| GMT+8, 2024-4-29 06:09 , Processed in 0.238744 second(s), 40 queries .

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

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

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