iCAx开思网

标题: 宏-按顺序特征重命名 [打印本页]

作者: pyczt    时间: 2018-6-8 09:18
标题: 宏-按顺序特征重命名
以前搞过一个宏是英文名改中文的,有网友问能不能按顺序特征重命名.正好下载了一个,供大家分享.其中的语名值得学习
  1. 'PYCZT2018/5/26下载于https://www.codestack.net
  2. 'This macro renames all the features in active model in the order, preserving the base names.
  3. '该宏按顺序重命名活动模型中的所有特征名,保留原基本名称。
  4. 'Only indices are renamed and the base name is preserved. For example Sketch21 will be renamed to Sketch1 for
  5. 'the first appearance of the sketch feature.
  6. '只有索引被重命名,基本名称被保留。例如,对于草图特性的第一次出现,Sketch 21将被重命名为Sketch 1.


  7. 'Notes注意事项:
  8. '1.Only features with number at the end will be renamed (e.g. Front Plane will not be renamed to Front Plane1 and My1Feature will not be renamed)
  9. '只在结尾处有编号的特征将被重命名(例如,Front Plane不会被重命名为Front Plane1,以及My1Feature也不会被重命名)
  10. '2.Case is ignored (case insensitive search)
  11. '大小写是忽略的
  12. '3.Only modelling features are renamed (the ones created after the Origin feature)
  13. '只重命名建模用的特征名(在原点特征之后的)

  14. '*****************************************************************

  15. Dim swApp As SldWorks.SldWorks
  16. Dim swModel As SldWorks.ModelDoc2

  17. Sub main()

  18.     Set swApp = Application.SldWorks
  19.    
  20.     Set swModel = swApp.ActiveDoc
  21.    
  22.     Dim passedOrigin As Boolean
  23.     passedOrigin = False
  24.    
  25.     If Not swModel Is Nothing Then
  26.    
  27.         Dim featNamesTable As Object
  28.         Dim processedFeats As Collection
  29.         
  30.         Set featNamesTable = CreateObject("Scripting.Dictionary")
  31.         Set processedFeats = New Collection
  32.         
  33.         featNamesTable.CompareMode = vbTextCompare 'case insensitive
  34.         
  35.         Dim swFeat As SldWorks.Feature
  36.         Set swFeat = swModel.FirstFeature
  37.         
  38.         While Not swFeat Is Nothing
  39.             
  40.             If passedOrigin Then
  41.             
  42.                 If Not Contains(processedFeats, swFeat) Then
  43.                     processedFeats.Add swFeat
  44.                     RenameFeature swFeat, featNamesTable
  45.                 End If
  46.                
  47.                 Dim swSubFeat As SldWorks.Feature
  48.                 Set swSubFeat = swFeat.GetFirstSubFeature
  49.                
  50.                 While Not swSubFeat Is Nothing
  51.                     
  52.                     If Not Contains(processedFeats, swSubFeat) Then
  53.                         processedFeats.Add swSubFeat
  54.                         RenameFeature swSubFeat, featNamesTable
  55.                     End If
  56.                     
  57.                     Set swSubFeat = swSubFeat.GetNextSubFeature
  58.                     
  59.                 Wend
  60.             
  61.             End If
  62.             
  63.             If swFeat.GetTypeName2() = "OriginProfileFeature" Then
  64.                 passedOrigin = True
  65.             End If
  66.             
  67.             Set swFeat = swFeat.GetNextFeature
  68.         Wend
  69.         
  70.     Else
  71.         MsgBox "Please open model"
  72.     End If

  73. End Sub

  74. Sub RenameFeature(feat As SldWorks.Feature, featNamesTable As Object)

  75.     Dim regEx As Object
  76.     Set regEx = CreateObject("VBScript.RegExp")
  77.    
  78.     regEx.Global = True
  79.     regEx.IgnoreCase = True
  80.     regEx.Pattern = "(.+?)(\d+)$"
  81.    
  82.     Dim regExMatches As Object
  83.     Set regExMatches = regEx.Execute(feat.Name)
  84.    
  85.     If regExMatches.Count = 1 Then
  86.         
  87.         If regExMatches(0).SubMatches.Count = 2 Then
  88.             
  89.             Dim baseFeatName As String
  90.             baseFeatName = regExMatches(0).SubMatches(0)
  91.             
  92.             Dim nextIndex As Integer
  93.             
  94.             If featNamesTable.Exists(baseFeatName) Then
  95.                 nextIndex = featNamesTable.item(baseFeatName) + 1
  96.                 featNamesTable.item(baseFeatName) = nextIndex
  97.             Else
  98.                 nextIndex = 1
  99.                 featNamesTable.Add baseFeatName, nextIndex
  100.             End If
  101.             feat.Name = baseFeatName & nextIndex
  102.         End If
  103.     End If

  104. End Sub

  105. Function Contains(coll As Collection, item As Object) As Boolean
  106.    
  107.     Dim i As Integer
  108.    
  109.     For i = 1 To coll.Count
  110.         If coll.item(i) Is item Then
  111.             Contains = True
  112.             Exit Function
  113.         End If
  114.     Next
  115.    
  116.     Contains = False
  117.    
  118. End Function
复制代码



作者: ryouss    时间: 2018-6-8 10:39
謝謝分享,學習了!

作者: qxzch    时间: 2018-6-8 19:14
学习一下,谢谢楼主分享!
作者: gdzsh    时间: 2018-6-9 08:07
是啥意思呢?看不懂,能说明下功能嘛?
作者: gdzsh    时间: 2018-6-9 08:13
下载来试验了一下,运行该宏既不报错,也不改名,没任何反应。
作者: pyczt    时间: 2018-6-9 09:56
本帖最后由 pyczt 于 2018-6-9 09:58 编辑

https://www.codestack.net/solidworks-api/document/features-manager/rename-features-sequentially这是来源网页
试验一下,对中文特征名是改名不理想.理想改名如下


作者: ryouss    时间: 2018-6-9 16:39
2012版測試正常,謝謝 pyczt大大.

[attach]1258424[/attach]



作者: ryouss    时间: 2018-6-10 10:14
如圖所示,請教pyczt大大是用什麼樣的簡体字型,用簡繁轉譯有些字型還是沒轉成!

[attach]1258438[/attach]
作者: a8012024    时间: 2018-6-11 06:32
感谢分享  
作者: pyczt    时间: 2018-6-11 15:00
gdzsh 发表于 2018-6-9 08:13
下载来试验了一下,运行该宏既不报错,也不改名,没任何反应。

原宏有缺陷,修改过的应该OK了,增加注释,供大家一起学习
  1. 'PYCZT2018/5/26下载于https://www.codestack.net,2018/6/11修改
  2. 'This macro renames all the features in active model in the order, preserving the base names.
  3. '该宏按顺序重命名活动模型中的所有特征名,保留原基本名称。
  4. 'Only indices are renamed and the base name is preserved. For example Sketch21 will be renamed to Sketch1 for
  5. 'the first appearance of the sketch feature.
  6. '只有索引被重命名,基本名称被保留。例如,对于第一次出现的草图特性Sketch21将被重命名为Sketch1.


  7. 'Notes注意事项:
  8. '1.Only features with number at the end will be renamed (e.g. Front Plane will not be renamed to Front Plane1 and My1Feature will not be renamed)
  9. '只在结尾处有编号的特征将被重命名(例如,Front Plane不会被重命名为Front Plane1,以及My1Feature也不会被重命名)---因为正则表达式为开始(任意字符)(任意数字)结束
  10. '2.Case is ignored (case insensitive search)
  11. '大小写是忽略的
  12. '3.Only modelling features are renamed (the ones created after the Origin feature)
  13. '只重命名建模用的特征名(在原点特征之后的)

  14. '*****************************************************************

  15. Dim swApp As SldWorks.SldWorks
  16. Dim swModel As SldWorks.ModelDoc2

  17. Sub main()

  18.     Set swApp = Application.SldWorks
  19.    
  20.     Set swModel = swApp.ActiveDoc
  21.    
  22.     Dim passedOrigin As Boolean    '定义一个过原点的逻辑变量
  23.     passedOrigin = False
  24.    
  25.     If Not swModel Is Nothing Then
  26.    
  27.         Dim featNamesTable As Object
  28.         Dim processedFeats As Collection    ' 定义为记录集合类(Collection)。
  29.         
  30.         Set featNamesTable = CreateObject("Scripting.Dictionary")   '变量为字典Dictionary对象
  31.         Set processedFeats = New Collection
  32.         
  33.         featNamesTable.CompareMode = vbTextCompare '比较模式为字符串(不分大小写)
  34.         
  35.         Dim swFeat As SldWorks.Feature
  36.         Set swFeat = swModel.FirstFeature
  37.         
  38.         While Not swFeat Is Nothing
  39.             
  40.             If passedOrigin Then
  41.             
  42.             Debug.Print swFeat.Name
  43.                
  44.                 If Not Contains(processedFeats, swFeat) Then '比对特征记录集合与特征
  45.                     processedFeats.Add swFeat   '将特征增加到记录集合中
  46.                     RenameFeature swFeat, featNamesTable   '改名子程序
  47.                 End If
  48.                
  49.                 Dim swSubFeat As SldWorks.Feature
  50.                 Set swSubFeat = swFeat.GetFirstSubFeature   '子特征
  51.                
  52.                 While Not swSubFeat Is Nothing
  53.                     
  54.                     If Not Contains(processedFeats, swSubFeat) Then
  55.                         processedFeats.Add swSubFeat
  56.                         RenameFeature swSubFeat, featNamesTable
  57.                     End If
  58.                     
  59.                     Set swSubFeat = swSubFeat.GetNextSubFeature
  60.                     
  61.                 Wend
  62.             
  63.             End If
  64.             
  65.             If swFeat.GetTypeName2() = "OriginProfileFeature" Then
  66.                 OriginName = swFeat.Name   '预留原点特征名,以后使用
  67.                 passedOrigin = True
  68.             End If
  69.             
  70.             Set swFeat = swFeat.GetNextFeature
  71.         Wend
  72.         
  73.     '以下语名为已顺序的特征名去除后缀$
  74.     Set swFeat = swModel.FeatureByName(OriginName)
  75.     While Not swFeat Is Nothing
  76.     Set swFeat = swFeat.GetNextFeature
  77.     If Not swFeat Is Nothing Then
  78.     If Right(swFeat.Name, 1) = "$" Then swFeat.Name = Left(swFeat.Name, Len(swFeat.Name) - 1)   '去除后缀$
  79.     End If
  80.     Wend
  81.       
  82.         
  83.     Else
  84.         MsgBox "Please open model请打开模型文件"
  85.     End If

  86. End Sub

  87. Sub RenameFeature(feat As SldWorks.Feature, featNamesTable As Object)

  88.     Dim regEx As Object
  89.     Set regEx = CreateObject("VBScript.RegExp")   '创建正则表达式(RegEx)对象
  90.    
  91.     regEx.Global = True       '设置全程匹配
  92.     regEx.IgnoreCase = True   '设置忽略区分大小写
  93.     regEx.Pattern = "(.+?)(\d+)$"    '设置正则表达式:开始(任意字符)(任意数字)结束
  94.    
  95.     Dim regExMatches As Object
  96.     Set regExMatches = regEx.Execute(feat.Name)   '用于对指定正则表达式进行匹配检测,其值返回一个Matches集合,其中
  97.                                    '包含了所有检测到匹配的Match对象。如果没有检测到任何匹配则返回一个空的Matches集合
  98.    
  99.     If regExMatches.Count = 1 Then
  100.    
  101.     Debug.Print regExMatches(0)
  102.         
  103.         If regExMatches(0).SubMatches.Count = 2 Then    'SubMatches数量为2,说明符合正则表达式
  104.         ' SubMatches 集合包含了单个的子匹配字符串,只能用 RegExp 对象的 Execute 方法创建。
  105.          'SubMatches 集合的属性是只读的。运行一个正则表达式时,当圆括号中捕捉到子表达式时可以有零个或多个子匹配。
  106.          'SubMatches 集合中的每一项是由正则表达式找到并捕获的的字符串。
  107.             
  108.             Dim baseFeatName As String
  109.             baseFeatName = regExMatches(0).SubMatches(0)  '取正则表达式的第一个子匹配字符串,也就是基本特征名
  110.             'Debug.Print baseFeatName
  111.             Dim nextIndex As Integer
  112.             
  113.             If featNamesTable.Exists(baseFeatName) Then    '如果指定的键(基本特征名)存在,返回True,否则返回False,
  114.                 nextIndex = featNamesTable.item(baseFeatName) + 1    'Items() 返回该键的条目数,增1
  115.                 featNamesTable.item(baseFeatName) = nextIndex   '将条目数赋值,即特征顺序号
  116.             Else
  117.                 nextIndex = 1
  118.                 featNamesTable.Add baseFeatName, nextIndex     '增加键到字典Dictionary,条目数为1
  119.             End If
  120.             feat.Name = baseFeatName & nextIndex & "$"    '原宏没有增加$后缀,可能造成改名失败
  121.             Debug.Print "已改名为:" & feat.Name
  122.         End If
  123.     End If

  124. End Sub

  125. Function Contains(coll As Collection, item As Object) As Boolean   '(比对processedFeats特征记录集合与swFeat是否相同,以免子特征改名重复)
  126.    
  127.     Dim i As Integer
  128.     Debug.Print "特征记录集合数量为" & coll.Count  '记录集合数量
  129.     For i = 1 To coll.Count
  130.         Debug.Print "比对" & item.Name & "   " & i
  131.         Debug.Print
  132.         If coll.item(i) Is item Then '记录中特征相同
  133.             Contains = True
  134.             Exit Function
  135.         End If
  136.         
  137.     Next
  138.    
  139.     Contains = False
  140.    
  141. End Function
复制代码





作者: pyczt    时间: 2018-6-11 15:18
ryouss 发表于 2018-6-10 10:14
如圖所示,請教pyczt大大是用什麼樣的簡体字型,用簡繁轉譯有些字型還是沒轉成!

以下代码我在简体系统下,控制面板中修改了语言区域导出,看能不能转换正常。
  1. 'PYCZT2018/5/26下载于https://www.codestack.net,2018/6/11修改
  2. 'This macro renames all the features in active model in the order, preserving the base names.
  3. '该宏按顺序重命名活动模型中的所有特征名,保留原基本名称。
  4. 'Only indices are renamed and the base name is preserved. For example Sketch21 will be renamed to Sketch1 for
  5. 'the first appearance of the sketch feature.
  6. '只有索引被重命名,基本名称被保留。例如,对于第一次出现的草图特性Sketch21将被重命名为Sketch1.


  7. 'Notes注意事项:
  8. '1.Only features with number at the end will be renamed (e.g. Front Plane will not be renamed to Front Plane1 and My1Feature will not be renamed)
  9. '只在结尾处有编号的特征将被重命名(例如,Front Plane不会被重命名为Front Plane1,以及My1Feature也不会被重命名)---因为正则表达式为开始(任意字符)(任意数字)结束
  10. '2.Case is ignored (case insensitive search)
  11. '大小写是忽略的
  12. '3.Only modelling features are renamed (the ones created after the Origin feature)
  13. '只重命名建模用的特征名(在原点特征之后的)

  14. '*****************************************************************

  15. Dim swApp As SldWorks.SldWorks
  16. Dim swModel As SldWorks.ModelDoc2

  17. Sub main()

  18.     Set swApp = Application.SldWorks
  19.    
  20.     Set swModel = swApp.ActiveDoc
  21.    
  22.     Dim passedOrigin As Boolean    '定义一个过原点的逻辑变量
  23.     passedOrigin = False
  24.    
  25.     If Not swModel Is Nothing Then
  26.    
  27.         Dim featNamesTable As Object
  28.         Dim processedFeats As Collection    ' 定义为记录集合类(Collection)。
  29.         
  30.         Set featNamesTable = CreateObject("Scripting.Dictionary")   '变量为字典Dictionary对象
  31.         Set processedFeats = New Collection
  32.         
  33.         featNamesTable.CompareMode = vbTextCompare '比较模式为字符串(不分大小写)
  34.         
  35.         Dim swFeat As SldWorks.Feature
  36.         Set swFeat = swModel.FirstFeature
  37.         
  38.         While Not swFeat Is Nothing
  39.             
  40.             If passedOrigin Then
  41.             
  42.             Debug.Print swFeat.Name
  43.                
  44.                 If Not Contains(processedFeats, swFeat) Then '比对特征记录集合与特征
  45.                     processedFeats.Add swFeat   '将特征增加到记录集合中
  46.                     RenameFeature swFeat, featNamesTable   '改名子程序
  47.                 End If
  48.                
  49.                 Dim swSubFeat As SldWorks.Feature
  50.                 Set swSubFeat = swFeat.GetFirstSubFeature   '子特征
  51.                
  52.                 While Not swSubFeat Is Nothing
  53.                     
  54.                     If Not Contains(processedFeats, swSubFeat) Then
  55.                         processedFeats.Add swSubFeat
  56.                         RenameFeature swSubFeat, featNamesTable
  57.                     End If
  58.                     
  59.                     Set swSubFeat = swSubFeat.GetNextSubFeature
  60.                     
  61.                 Wend
  62.             
  63.             End If
  64.             
  65.             If swFeat.GetTypeName2() = "OriginProfileFeature" Then
  66.                 OriginName = swFeat.Name   '预留原点特征名,以后使用
  67.                 passedOrigin = True
  68.             End If
  69.             
  70.             Set swFeat = swFeat.GetNextFeature
  71.         Wend
  72.         
  73.     '以下语名为已顺序的特征名去除后缀$
  74.     Set swFeat = swModel.FeatureByName(OriginName)
  75.     While Not swFeat Is Nothing
  76.     Set swFeat = swFeat.GetNextFeature
  77.     If Not swFeat Is Nothing Then
  78.     If Right(swFeat.Name, 1) = "[        DISCUZ_CODE_0        ]quot; Then swFeat.Name = Left(swFeat.Name, Len(swFeat.Name) - 1)   '去除后缀$
  79.     End If
  80.     Wend
  81.       
  82.         
  83.     Else
  84.         MsgBox "Please open model请打开模型文件"
  85.     End If

  86. End Sub

  87. Sub RenameFeature(feat As SldWorks.Feature, featNamesTable As Object)

  88.     Dim regEx As Object
  89.     Set regEx = CreateObject("VBScript.RegExp")   '创建正则表达式(RegEx)对象
  90.    
  91.     regEx.Global = True       '设置全程匹配
  92.     regEx.IgnoreCase = True   '设置忽略区分大小写
  93.     regEx.Pattern = "(.+?)(\d+)[        DISCUZ_CODE_0        ]quot;    '设置正则表达式:开始(任意字符)(任意数字)结束
  94.    
  95.     Dim regExMatches As Object
  96.     Set regExMatches = regEx.Execute(feat.Name)   '用于对指定正则表达式进行匹配检测,其值返回一个Matches集合,其中
  97.                                    '包含了所有检测到匹配的Match对象。如果没有检测到任何匹配则返回一个空的Matches集合
  98.    
  99.     If regExMatches.Count = 1 Then
  100.    
  101.     Debug.Print regExMatches(0)
  102.         
  103.         If regExMatches(0).SubMatches.Count = 2 Then    'SubMatches数量为2,说明符合正则表达式
  104.         ' SubMatches 集合包含了单个的子匹配字符串,只能用 RegExp 对象的 Execute 方法创建。
  105.          'SubMatches 集合的属性是只读的。运行一个正则表达式时,当圆括号中捕捉到子表达式时可以有零个或多个子匹配。
  106.          'SubMatches 集合中的每一项是由正则表达式找到并捕获的的字符串。
  107.             
  108.             Dim baseFeatName As String
  109.             baseFeatName = regExMatches(0).SubMatches(0)  '取正则表达式的第一个子匹配字符串,也就是基本特征名
  110.             'Debug.Print baseFeatName
  111.             Dim nextIndex As Integer
  112.             
  113.             If featNamesTable.Exists(baseFeatName) Then    '如果指定的键(基本特征名)存在,返回True,否则返回False,
  114.                 nextIndex = featNamesTable.item(baseFeatName) + 1    'Items() 返回该键的条目数,增1
  115.                 featNamesTable.item(baseFeatName) = nextIndex   '将条目数赋值,即特征顺序号
  116.             Else
  117.                 nextIndex = 1
  118.                 featNamesTable.Add baseFeatName, nextIndex     '增加键到字典Dictionary,条目数为1
  119.             End If
  120.             feat.Name = baseFeatName & nextIndex & "[        DISCUZ_CODE_0        ]quot;    '原宏没有增加$后缀,可能造成改名失败
  121.             Debug.Print "已改名为:" & feat.Name
  122.         End If
  123.     End If

  124. End Sub

  125. Function Contains(coll As Collection, item As Object) As Boolean   '(比对processedFeats特征记录集合与swFeat是否相同,以免子特征改名重复)
  126.    
  127.     Dim i As Integer
  128.     Debug.Print "特征记录集合数量为" & coll.Count  '记录集合数量
  129.     For i = 1 To coll.Count
  130.         Debug.Print "比对" & item.Name & "   " & i
  131.         Debug.Print
  132.         If coll.item(i) Is item Then '记录中特征相同
  133.             Contains = True
  134.             Exit Function
  135.         End If
  136.         
  137.     Next
  138.    
  139.     Contains = False
  140.    
  141. End Function
复制代码




作者: ryouss    时间: 2018-6-11 17:24
pyczt 发表于 2018-6-11 15:00
原宏有缺陷,修改过的应该OK了,增加注释,供大家一起学习

還是不行,如圖就可.

[attach]1258439[/attach]

作者: pyczt    时间: 2018-6-12 07:54
ryouss 发表于 2018-6-11 17:24
還是不行,如圖就可.

UTF-8格式的请试下

作者: ryouss    时间: 2018-6-12 10:42
pyczt 发表于 2018-6-12 07:54
UTF-8格式的请试下

也不行!

謝謝pyczt大大一再提供資料測試,
也知道了碰到這樣問題,可以直接copy譯成繁体再丟進VBA.

作者: 大鹿    时间: 2018-6-12 12:31
ryouss 发表于 2018-6-11 17:24
還是不行,如圖就可.

请教这是什么工具,是否这工具的问题。


作者: ryouss    时间: 2018-6-12 13:22
本帖最后由 ryouss 于 2018-6-12 13:34 编辑
大鹿 发表于 2018-6-12 12:31
请教这是什么工具,是否这工具的问题。

https://www.skycn.com/soft/appid/5797.html
[attach]1258474[/attach] 繁簡字轉譯

謝謝鹿大關心,如上參考一直以來都是用這軟件解決VBA的繁簡字亂碼.


作者: 大鹿    时间: 2018-6-12 13:41
ryouss 发表于 2018-6-12 13:22
https://www.skycn.com/soft/appid/5797.html
繁簡字轉譯

试过这工具,没有问题呀!
[attach]1258475[/attach]


作者: ryouss    时间: 2018-6-12 14:13
本帖最后由 ryouss 于 2018-6-12 14:15 编辑
大鹿 发表于 2018-6-12 13:41
试过这工具,没有问题呀!

是的COPY直接轉譯沒問題,
之前傻傻的COPY到VBA後再轉譯就不成,
但是之前也都是COPY諸大的宏到VBA後再轉譯都行(如12#),
所以才好奇想知道P大是用了什麼字型.

作者: Trouble12138    时间: 2018-6-16 14:16
如何使用?还有这是什么软件用的啊?
作者: chaomogu    时间: 2018-9-26 22:58
特来支持
作者: Trouble12138    时间: 2018-11-25 19:05
谢谢楼主
作者: 风中de沙    时间: 2018-12-26 18:14
好贴一定要支持,谢谢楼主
作者: scattie    时间: 2018-12-27 09:31
感谢楼主的分享
作者: JX小鱼    时间: 2020-1-16 10:15
谢谢楼主分享

作者: vip0537    时间: 2021-2-24 13:03
大佬 现在还关注这个宏吗/ ?   我在使用过程中发现配合里面的装配关系都给加上了  $   ,如附件图片所示
请大佬研究下,看怎么去掉这个


作者: 刘茂机械    时间: 2021-2-27 08:16
谢谢分享
作者: pyczt    时间: 2021-2-27 23:17
vip0537 发表于 2021-2-24 13:03
大佬 现在还关注这个宏吗/ ?   我在使用过程中发现配合里面的装配关系都给加上了  $   ,如附件图片所示
...

该宏在零件里运行,不要在装配体运行
作者: vip0537    时间: 2021-3-3 13:14
pyczt 发表于 2021-2-27 23:17
该宏在零件里运行,不要在装配体运行

谢谢,是的 在零件里运行没问题了

作者: cj8510    时间: 2021-10-17 23:29
强迫症福音啊
作者: dreamsboy    时间: 2021-10-19 17:37
我试了一下,运行没报错,但运行过后并没有效果。




欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3