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

标题: 宏提取文件名字符为何不成功 [打印本页]

作者: xlh0    时间: 2013-6-22 08:47
标题: 宏提取文件名字符为何不成功
按下面帖子学习做了一下,我的2011版本不成功,操作N变了,
现请教大家,谢谢参与~~
下面原贴标题和地址
SolidWorks中方程式的应用技巧
SolidWorks机械工程师论坛
原贴方程式:dummy=part.Extension.CustomPropertyManager("").Set("partno",Left(part.GetTitle,9))
方程式目的是从文件名中从左到右取9个字符

作者: benzlxb    时间: 2013-6-22 08:48
如下VBA的編程[2012版測試]
' **************************************************
'  macro recorded on 06/24/13 by lsc
' **************************************************
Dim swApp As Object
Dim Part As Object
Sub main()
Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc
Set swModel = swApp.GetFirstDocument
path_name = swModel.GetPathName '取出目前檔案的路徑及名稱
name_ = swModel.GetTitle '取出目前檔案的名稱
name_9 = Left(name_, 9) '取出目前檔案名稱前9位文字
End Sub
作者: Doreen    时间: 2013-6-22 08:48
下面是我在其它论坛 得到的 某位前辈的,你看看
图号名称分离宏.rar (9.83 KB, 下载次数: 27)
作者: yaya89757    时间: 2013-6-22 08:48
十分感谢梁老师提供代码学习~~
提示进来学习的坛友!
通过在自定义属性里嵌入代码,问题已解决。
下面代码在2011版本中均已测试成功。
15楼代码,可以取左边字符
19楼代码,可以取最后一个下划线后面的字符。
下面这段代码,可以取第一个下划线前面的字符。
1
dim yfd
yfd=part.Extension.CustomPropertyManager("").Set("partno",Left(part.GetTitle,InStr(1,part.GetTitle,"_")-1))
作者: army22    时间: 2013-6-22 08:49
感谢杀苏提供文件分享,学习
作者: 蛤蟆老鼠    时间: 2013-6-22 08:49

蛋大的教程可能有幫助
作者: 7o05juk516    时间: 2013-6-22 08:49
非常感谢大师指引
作者: ㊣kicker    时间: 2013-6-22 08:50
楼主添加成功了吗?为何显示无效语句?

作者: aiwang123w    时间: 2013-6-22 08:51
没有成功
作者: 最爱-钢笔字    时间: 2013-6-22 08:51
2009版本以後,的嵌合方法已經改變,具體請參附件(2012版本)。

123456789-qiminger.rar (16.24 KB, 下载次数: 44)
作者: animarui    时间: 2013-6-22 08:51
看一下十楼方法,有源文件2012版本的,源文件我打不开。你如果研究明白了,说说方法再截两个图。
作者: 虚拟的笑    时间: 2013-6-22 08:53
不好意思,再麻烦大侠老师,我的是2011版本。
我按图在自定义属性里加代码,重建模型,保存关闭文件,重新打开也没成功。
是不是还要添加方程式呢?

作者: fengbao44    时间: 2013-6-22 08:53
試下這個
123456789-qiminger2009或以上版本.rar (11.35 KB, 下载次数: 22)
作者: qoro    时间: 2013-6-22 08:53
谢谢~我试了你给我的,重命名之后重建,属性可以更新,好使的。
我新建之后做出的,做很多次,还是不好使,我感觉过程不应该有问题了。
也许是学习版本的问题


2011版本
987654321-qiminger.rar (17.86 KB, 下载次数: 10)
作者: soonew    时间: 2013-6-22 08:53
謝謝qiminger兄回帖討論。
方程式的寫法正確,出現的驚嘆號代表呼叫的屬性值不是數值。
問題在內碼嵌合到“數值/文字表達”不對。
把以下內碼copy&paste到“數值/文字表達”欄位再試一下吧。
作者: Jason.Pop    时间: 2013-6-22 08:53
大侠,请教一下。我这样格式的文件名如何提取
例如:300_222_33_固定销压板,我只想提取最后一个下划线“_”后面的字符,如本例的固定销压板,但是最后一个下划线的后面的字符个数还不固定。
作者: dhs1998    时间: 2013-6-22 08:53
成功了~~
直接从你给我的源文件属性栏里复制,再回来粘帖,终于可以了,
真神奇,我英文不好理解困难,再次感谢了~~~
作者: jshjjt    时间: 2013-6-22 08:54
重新命名后,好像就不更新了啊
弄个批量的
作者: 1728078718    时间: 2013-6-22 08:54
把以上內碼copy&paste到“數值/文字表達”欄位試一下吧。
注意!必定要使用複製粘貼的方法,才可嵌合內碼到欄位。
作者: hpjin    时间: 2013-6-22 08:54
估計又是『脖子掛餅終餓死』的慘案一宗。
作者: dfgfhfdh    时间: 2013-6-22 08:54
我平时不用那种加文字的文件名,感觉用这种图号和名称分离的挺好的,有批量改的话,那就太好了
老兄搞下吧
作者: 0byh    时间: 2013-6-22 08:54
对不起大侠,我看明白了
想起我未说清楚,最后一个“_”前的字符也不固定
有没有直接可以从末位数的,到“_”停止的
作者: vklb50333f    时间: 2013-6-22 08:55
那段就是奇哥的要求
作者: heerochen    时间: 2013-6-22 08:55
我是13版,也许我做的不对,粘贴后只显示“1”,partno无数值显示。
请问partno是不是可以改成任意名字,如“工程图名称”
再请出手相助

作者: nhljersey3    时间: 2013-6-22 08:55
在“自定義”的設定應該對了,可能還欠缺方程式執行,下載以上所提供的檔案仔細研究一下執行方法。
partno只是一個代號,怎麼字符都可以的,中文也可,只要對應內字符就可以。
作者: woshishei    时间: 2013-6-22 08:55
看看是你说的意思吧  
456_123_789_阿帕奇 .rar (32.54 KB, 下载次数: 39)


作者: 职业八婆    时间: 2013-6-22 08:56
在你的文件里可以
我的意思是“数值/方程式”那一栏里也要粘贴
作者: booksxu    时间: 2013-6-22 08:56
现现丑
下面的代码应该可以实现你的要求。
str2提取零件号,如你的例子中取到:300_222_33
str3提取零件名称,如你的例子中取到:固定销压板
2013
Dim str1
Dim str2
Dim str3
Dim L1
str1 = Part.GetTitle
L1 = InStrRev(str1, "_", , 0)
str2 = Part.Extension.CustomPropertyManager("&quot.Set("mycode", Left(str1, L1 - 1))
str3 = Part.Extension.CustomPropertyManager("&quot.Set("mypartname", Mid(str1, L1 + 1))
作者: zmt1980    时间: 2013-6-22 08:56
感谢你啊,我这些天都没在试这个东西了
作者: youxiangtiandi    时间: 2013-6-22 08:56
感谢分享~~~~~~~~~~
作者: 苏摩    时间: 2013-6-22 08:57
大师请受小弟一拜
作者: kaison    时间: 2013-6-22 08:57
阿版,昨天測試了一下,發現您少了一步,就是工程师說的方程執行。
以我自身為例,全域變數是"result",屬性名稱是"marco"
所以方程就是:"result"="marco"
然而這種語法在2013是不被接受的,我用2012則是成功。
我也不懂,所以2013失敗的原因,可能還要再請教工程师了~
作者: netbooy    时间: 2013-6-22 08:59
希望大侠能出手
作者: wqm    时间: 2013-6-22 08:59
如 300_222_33_固定销压板,假設 300_222_33_ 之位數不變,只有第三個" _ "之後的位數會變動的話,
公式如圖1,在 2012 SP4版  測試結果如 圖2,圖3,但如 圖4 方程式表的"執行"成"紅色標記",這就不能理解了.
(以上是借用工程师公式做修改)
圖1

圖2

圖3

圖4

圖5

300_222_36_固定销.rar (18.03 KB, 下载次数: 16) [2012]
作者: eric991    时间: 2013-6-22 08:59
很多隱含功能(沒從官方渠道發放的功能),到了某個版本就會被消滅,常有發生。
估計這樣嵌入VB代碼的方式,到了2013版本被禁止了。
方法總是有的。例如:
1. 一般(屬於半自動,須手動執行
2. 特徵
3. 利用窗體或類模塊,常駐VB代碼在Solidworks程序中,當發生特定“事件”執行
作者: AnEgg    时间: 2013-6-22 09:00
第一個常用,但是自己不會編寫巨集…
第二個只看過工程师使用,自己要研究一下…
第三個離我太遙遠…只能看工程师表演了…
謝謝工程师指導。
作者: kanghq    时间: 2013-6-22 09:01
謝謝工程师指導,工程师簡單幾句提示又有得費腦力了
作者: gum    时间: 2013-6-22 09:02
大神,运行没有反应啊.能不能把程序打包一下。谢谢!
作者: realmadrider    时间: 2013-6-22 09:03
請說清楚一些,什麼是"程序打包一下"
作者: jingkr    时间: 2013-6-22 09:03
阿版,我这两天正需要研究这个东西了,但之前根本没接触过这用提取文件名中的某一部分生成自定义属性的问题,请问你研究得怎样啦?有所成没?是否可以向你请教请教?因为这个估计不是一句两句话能说得清楚,可能需要耗费你一些时间,不知道是否方便
作者: dhxmeidou    时间: 2013-6-22 09:04
練習6#的悶招
用到 ""-"方程式"-"連接屬性",應是較深級的應用,但對管控圖紙的尺寸統一性一致性,是很好的一種選擇方式.

作者: yikangli    时间: 2013-6-22 09:04
唉,看这些高深的应用,像看天书一样呀。这段时间要研究这个,要好好看看了
作者: yang_1598    时间: 2013-6-22 09:04
不用研究了,請細看35#樓悶人怎麼回覆吧。
作者: 太子    时间: 2013-6-22 09:05
呵呵,你的2013版不能用这个了吗?
作者: xuwenqing    时间: 2013-6-22 09:05
不知道!悶人沒有2013版本。
有情細心閱讀各人的每一帖子。
作者: fuzhan    时间: 2013-6-22 09:06
没试过不下结论。
作者: 王子龙    时间: 2013-6-22 09:06
請再細心看帖,沒人下結論。
作者: byscp    时间: 2013-6-22 09:06
哦哦,这样的呀。
作者: tianjinliwei    时间: 2013-6-22 09:07
大神,你好!根据你的提示我自己做了一些修改,主要是提取代号_名称这样组合的文件,我在我电脑win8.1运行很好,发给win7的时候说找不到工程或库。能帮我看下吗?

' **************************************************
'提取代号_名称命名的零件,程序以_进行分界
' **************************************************
Sub main()
Dim swApp       As SldWorks.SldWorks
Dim swModel     As SldWorks.ModelDoc2
Dim retval      As String
Set swApp = Application.SldWorks
Set swModel = swApp.GetFirstDocument
path_name = swModel.GetPathName '取出当前文档的路径及名称
name_ = swModel.GetTitle '取出当前文档的名称
L1 = InStrRev(name_, "_", , 0) '取出当前文档“_”之前代号的长度
L2 = InStrRev(name_, ".", , 0) '取出“.”之前的长度
name_front = Left(name_, L1 - 1) '取出当前文档“_”之前的文本
name_back = Mid(name_, L1 + 1, L2 - L1 - 1) '取出当前文档“_”和“.”之间的的文本
retval = swModel.DeleteCustomInfo("代号&quot '删除之前的代号
retval = swModel.AddCustomInfo3("", "代号", swCustomInfoText, name_front) '将代号值写入自定义属性
retval = swModel.DeleteCustomInfo("名称&quot '删除之前的名称
retval = swModel.AddCustomInfo3("", "名称", swCustomInfoText, name_back) '将名称值写入自定义属性
End Sub
作者: 小仓鼠    时间: 2013-6-22 09:07
自己给自己顶一个……
作者: colour    时间: 2013-6-22 09:09
試試如下:win7 64位元
編碼原則為   代號_名稱.solidworks副檔名(如 123456_軸承.SLDPRT)
功能:應用抓出零件編碼的"代號"及"名稱",放置到屬性欄.
' 2013/12/17 2012-sp4版 test
'   data
' ---> 屬性
Dim swApp As Object
Sub main()
Dim retval                  As Boolean
Dim name_front         As String
Dim swModel              As SldWorks.ModelDoc2
Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc
Set swModel = swApp.GetFirstDocument
path_name = swModel.GetPathName
name_ = swModel.GetTitle
L1 = InStrRev(name_, "_", , 0)
L2 = InStrRev(name_, ".", , 0)
name_front = Left(name_, L1 - 1)
name_back = Mid(name_, L1 + 1, L2 - L1 - 1)
retval = swModel.DeleteCustomInfo("代號")
retval = swModel.AddCustomInfo3("", "代號", swCustomInfoText, name_front)
retval = swModel.DeleteCustomInfo("名稱")
retval = swModel.AddCustomInfo3("", "名稱", swCustomInfoText, name_back)
End Sub
test121217.rar (6.95 KB, 下载次数: 173)
作者: luoweike    时间: 2013-6-22 09:11
嗯,谢谢大神。已解决,赞一个
作者: dongjun    时间: 2013-6-22 09:11
大侠,我在更改以前的零件属性时,插入方程式的步骤比较多,想一键完成,遇到如下问题,要怎么解决哦
Dim swEquationMgr As Object
Dim Part As Object
Sub main()
Set swApp =  Application.SldWorks
Set Part = swApp.ActiveDoc
Set swEquationMgr = Part.GetEquationMgr()
swEquationMgr.Add -1, "执行" & Chr(34) & "=" & """嵌合"""   '这里出了问题,“嵌合”这位置只能是数字,字母汉字都无法插入,求解
End Sub
作者: szm    时间: 2013-6-22 09:11
建議使用“回复”及“添加代码文字”。
試下改為:
复制代码
作者: wangli182003    时间: 2013-6-22 09:11

多谢大侠,成功了!用方程式关联后,不用担心改名后代号和名称失去关联了,一键重写完美实现
作者: 3_D    时间: 2013-6-22 09:12
大侠大师,我能在论坛了看到将solidworks的图号、名称分离并与零件属性关链的技法很是荣幸,感谢大师。我现在用的是2010版的,32位XP系统,非常想实现这一功能,希望能得到您的指导。我的qq:1494515986。
作者: woshianzi    时间: 2013-6-22 09:13
试了一下 2012可以  可是升级了一下2014 怎么不行了呢?
作者: mzq11    时间: 2013-6-22 09:13
今天我试了下,我是在2010版时把这些什么的东西都添加到了模板文件里了,今天升级到了2013,用2010版的已经添加了和方程表达式的模板新建了文件,最终试验结果是这些代码还是能用的,只不过在“方程式”的列表里的表达式,总面会一直显示一个X号,就像26楼的第二张图片一样。
作者: mesen    时间: 2013-6-22 09:13
在零件中可实现提取,但是在装配体中不行,是否语法上有不同?
作者: fhswjj    时间: 2013-6-22 09:14
麻煩多了 ,最主要是要抓取組件上全部的零件名稱.
另執行組件有組件的通關密語.
參考 SolidWorks机械工程师论坛
有工程师及吉大精彩文章

' ******************************************************************************
'  macro recorded on 03/27/14 by lsc
'
'  組合件之零件自訂屬性 [ 編號_名稱 ],編號名稱是以" _ "符號分隔.
'
' ******************************************************************************
Dim TopDocPathOnly As String
Dim swModel As SldWorks.ModelDoc2
Dim swApp As SldWorks.SldWorks
Sub main()
Set swApp = Application.SldWorks
Set TopDoc = swApp.ActiveDoc '總裝對象
If TopDoc.GetType <> 2 Then Exit Sub '不是裝配=退出
TopDocPathSplit = Split(TopDoc.GetPathName, &quot;&quot '分割
TopDocName = TopDocPathSplit(UBound(TopDocPathSplit)) '總裝文件名稱
TopDocName = Left(TopDocName, Len(TopDocName) - 7) '總裝文件名稱(排除.SLDASM)
TopDocPathOnly = TopDocPathSplit(UBound(TopDocPathSplit) - 1) '總裝目錄名稱
TopConfString = TopDoc.GetActiveConfiguration.Name '總裝配置名稱
SubAsm TopDoc, TopConfString '遍歷
End Sub
Function SubAsm(AsmDoc, ConfString)
Set swModel = swApp.ActiveDoc
Set Configuration = AsmDoc.GetConfigurationByName(ConfString)
Set RootComponent = Configuration.GetRootComponent
Components = RootComponent.GetChildren
For Each Child In Components '總裝抓全部零件名稱
    Set ChildModel = Child.GetModelDoc
    ChildPathSplit = Split(Child.GetPathName, &quot;&quot '分割
    ChildName = ChildPathSplit(UBound(ChildPathSplit)) '零件文件名稱
    L1 = InStrRev(ChildName, &quot;_&quot;, , 0)
    L2 = InStrRev(ChildName, &quot;.&quot;, , 0)
    code_ = Left(ChildName, L1 - 1) ' 編號
    name_ = Mid(ChildName, L1 + 1, L2 - L1 - 1) '名稱
    swModel.DeleteCustomInfo2 &quot;&quot;, code_
    swModel.AddCustomInfo2 code_, swCustomInfoText, name_
Next
End Function
組件零件之編號名稱屬性.rar (120.59 KB, 下载次数: 25) [2012版 練習用組件,零件,]
作者: cxlgh    时间: 2013-6-22 09:15
不好意思,可能我回复的意思有误,我意思是用嵌入的方式在零件中可以提取名称和零件号,但是同样的方法用在装配体中却提取不到装配体的名称和图号。(例如:123-123-123_装配.slldasm,要提取“_”前的图号和“_”后的名称。请指教。
作者: rabbit    时间: 2013-6-22 09:15
感谢....................................
作者: wzengyuli    时间: 2013-6-22 09:15
一样的.也是提取文件名后再解析你需要的特定字符
-------------------------------------------------------------------------------------------
不过这贴子.我看了半天,也没看懂巨集的概念..更没搞清楚怎么内嵌的..
事实上感觉很繁琐.很久以前就见过这个东东.就是没清晰点的描述,导致没继续看下去.
今天又来,还好有人提到这里了...
还是这里讲的比较清楚,至于VBA代码,略懂一些.想必有用的着的时候,呵呵.
作者: axz6    时间: 2013-6-22 09:16
这个必须顶,完全有效果,已经弄到模板里,正在试用,看还有没其他的不良反应
作者: 大海龟    时间: 2013-6-22 09:16
大侠~按照你的方法在零件模板中完全实现可用,但是在装配体模板中失效。求大师帮帮忙~谢谢
我用的下面的代码
1
Dim Txt
Txt = Part.GetPathName
Txt = Mid(Txt, InStrRev(Txt, &quot;_&quot;, -1) + 1)
Txt = Left(Txt, Len(Txt) - 7)
Part.Extension.CustomPropertyManager(&quot;&quot;).Set &quot;mingcheng&quot;, Txt
版本是2010
作者: zhouwd    时间: 2013-6-22 09:16
他全家的妹附件无法提取
作者: 白云飞雨    时间: 2016-4-11 16:27
按三楼的,好像每次都要运行一次,保存为模版后也是如此,请问有没有保存模版后就不再运行、一劳永逸的方法?

作者: 白云飞雨    时间: 2016-4-11 16:52
请问55楼是如何操作的?
作者: 白云飞雨    时间: 2016-4-11 16:54
请问64楼是如何操作的?
作者: 白云飞雨    时间: 2016-4-11 17:05
如何将这个做成按钮的形式放在工具栏上,这样就方便了
作者: lcj2018    时间: 2018-6-23 09:06
最爱-钢笔字 发表于 2013-6-22 08:51
2009版本以後,的嵌合方法已經改變,具體請參附件(2012版本)。

支持一下,谢谢分享!
作者: 小豆芽疯回路转    时间: 2021-8-5 08:14
感谢各位的分享,很不错!




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