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

标题: 求助:vba 获取镜像件的原始组件名称 [打印本页]

作者: pujing    时间: 2023-12-18 13:13
标题: 求助:vba 获取镜像件的原始组件名称
目的:获取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)的代码,期盼大神指点,谢谢!
作者: 沉默的人    时间: 2023-12-18 17:30
顶一下,坐等高手!
作者: z460515477    时间: 2023-12-19 00:05
顶一下,坐等高手!
作者: pujing    时间: 2023-12-19 11:33
顶起来,千万别沉,麻烦各位大佬帮帮忙!
附带已写完勉强能用的宏,打开总装配体,运行宏,自动写入零件数量(统一路径下),镜像件写入原始零件中,属性名“镜像数量”
有需要的朋友自己取走 属性增加数量_当前装配体.rar (24.46 KB, 下载次数: 62)

作者: 海上的兵    时间: 2023-12-19 12:46
感谢楼主分享,很不错!
作者: Allate    时间: 2023-12-20 08:57
提供一个简洁的宏,交流一下(看了一下时间,真凑巧,刚刚好是三年前写的)

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


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

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

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

第2点是没有考虑到,因为只是用来交流一下,不是为了你这个来写的。
至于第1点,你确定你的宏运行时间比我这个要短?不要盲目自信,请自行测试一下。
作者: sunsu168    时间: 2023-12-20 14:57
pujing 发表于 2023-12-20 10:18
前辈的这个宏不管编写还是理解都简单明了,但可能不太适合我的工作环境
1. 运行时间较长,先是遍历所有 ...

出图习惯是 对称件 在标题栏数量显示2, 然后再技术要求里写左右对称 ?
作者: jinxim    时间: 2023-12-21 09:00
SW机械工程师网,找到组织了!
作者: seaport04    时间: 2023-12-21 18:11
宏这东西是有必要学习一下,提高工作效率
作者: seaport04    时间: 2023-12-21 18:12
花点时间学习一下这个
作者: pujing    时间: 2023-12-26 09:13
Allate 发表于 2023-12-20 13:26
第2点是没有考虑到,因为只是用来交流一下,不是为了你这个来写的。
至于第1点,你确定你的宏运行时间比 ...

多谢前辈指点,发帖后就发现这个问题了,直接装配图通过遍历Components的方式是最快的,通过路径打开模型反而慢了,再研究研究看能不能在镜像体中通过字典方式匹配获取原始零件的Component(在python里的字典能保存Component,vba就不知道了,试试)
作者: sunsu168    时间: 2023-12-26 15:28
pujing 发表于 2023-12-26 09:13
多谢前辈指点,发帖后就发现这个问题了,直接装配图通过遍历Components的方式是最快的,通过路径打开模型 ...

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

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

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

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

······

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

循环 字典1的键
     编辑零件数量
     判断 字典2中若存在此键
                      获取原始零件的全路径(通过字典,在第一步中已对应写入)
                      判断 字典1A中若存在原始全路径
                               获取原始对象(通过字典,在第一步中已对应写入)
                               将镜像信息写入原始对象中
                               移除字典2中的键(镜像件全路径,循环完成后多余的键就是没有写入的零件)
                               移除字典1A中的键(原始件全路径,这样就能防止多个镜像件写入相同的原始零件)
循环结束后检查字典2,若存在键,则说明有镜像零件未能写入原始零件中,按此即可输出文本(镜像件全路径,镜像件数量)   
属性增加数量_当前装配体_v1.2.rar (27.81 KB, 下载次数: 119, 售价: 1 金币)

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

谢谢 ,已下载 。
作者: 懒懒的高贵    时间: 2023-12-27 13:55
很不错,顶一下!
作者: pujing    时间: 2023-12-28 15:19
sunsu168 发表于 2023-12-20 14:57
出图习惯是 对称件 在标题栏数量显示2, 然后再技术要求里写左右对称 ?

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




欢迎光临 SolidWorks机械工程师网——最大的SolidWorks学习平台 (https://www.swbbsc.com/) Powered by Discuz! X3.2