乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 67|回复: 5

AutoCAD图标提取

[复制链接]

26

主题

589

帖子

10

银币

中流砥柱

Rank: 25

铜币
693
发表于 2011-6-16 13:43:00 | 显示全部楼层 |阅读模式
需要引用AcCui.dll文件。
  1. Imports Autodesk..ApplicationServices
  2. Imports Autodesk.AutoCAD.Customization
  3. Imports Autodesk.AutoCAD.Runtime
  4. Public Class Class1
  5. CommandMethod("Test")> _
  6.     Public Sub Test()
  7.         ' 16×16图标路径
  8.         If IO.Directory.Exists(My.Application.Info.DirectoryPath + "\16") = False Then
  9.             IO.Directory.CreateDirectory(My.Application.Info.DirectoryPath + "\16")
  10.         End If
  11.         ' 32×32图标路径
  12.         If IO.Directory.Exists(My.Application.Info.DirectoryPath + "\32") = False Then
  13.             IO.Directory.CreateDirectory(My.Application.Info.DirectoryPath + "\32")
  14.         End If
  15.        ' 通过系统变量获得菜单文件名称
  16.         Dim s As String = Application.GetSystemVariable("MENUNAME")
  17.         ' 获得该菜单文件的自定义节
  18.         Dim cs As CustomizationSection = New CustomizationSection(s)
  19.         ' 获得菜单组
  20.         Dim mg As MenuGroup = cs.MenuGroup
  21.         ' 遍历宏组
  22.         For i As Integer = 0 To mg.MacroGroups.Count - 1
  23.             ProcessMacroGroup(mg.MacroGroups(i))
  24.         Next
  25.     End Sub
  26.     'Public Sub ProcessMacroGroup(ByVal mg As MacroGroup)
  27.     '    ' 遍历菜单宏
  28.     '    For i As Integer = 0 To mg.MenuMacros.Count - 1
  29.     '        Dim mm As MenuMacro = mg.MenuMacros(i)
  30.     '        ' 获得宏
  31.     '        Dim m As Macro = mm.macro
  32.     '        ' 判断大图像是否存在
  33.     '        If m.LargeImageBitmap IsNot Nothing Then
  34.     '            ' 判断大图像是否正确,如果包含16说明大图像是采用小图像
  35.     '            If m.LargeImage.Contains("32") = True Then
  36.     '                m.LargeImageBitmap.Save(My.Application.Info.DirectoryPath + "\32" + m.LargeImage + ".png", System.Drawing.Imaging.ImageFormat.Png)
  37.     '            End If
  38.     '        End If
  39.     '        ' 判断小图像是否存在
  40.     '        If m.SmallImageBitmap IsNot Nothing Then
  41.     '            ' 判断小图像是否正确,如果包含32说明小图像是采用大图像
  42.     '            If m.SmallImage.Contains("16") = True Then
  43.     '                m.SmallImageBitmap.Save(My.Application.Info.DirectoryPath + "\16" + m.SmallImage + ".png", System.Drawing.Imaging.ImageFormat.Png)
  44.     '            End If
  45.     '        End If
  46.     '    Next
  47.     'End Sub
  48.     Public Sub ProcessMacroGroup(ByVal mg As MacroGroup)
  49.         ' 遍历菜单宏
  50.         For i As Integer = 0 To mg.MenuMacros.Count - 1
  51.             Dim mm As MenuMacro = mg.MenuMacros(i)
  52.             ' 获得宏
  53.             Dim m As Macro = mm.macro
  54.             ' 判断大图像是否存在
  55.             If m.LargeImageBitmap IsNot Nothing Then
  56.                 ' 判断大图像是否正确,如果尺寸包含16说明大图像是采用小图像
  57.                 If m.LargeImageBitmap.Width = 32 And m.LargeImageBitmap.Height = 32 Then
  58.                     ' 判断图像是否文件名称,如果是复制到内存再保存
  59.                     If m.LargeImage.Contains(".bmp") = True Then
  60.                         Dim ti As System.Drawing.Image = New System.Drawing.Bitmap(m.LargeImageBitmap)
  61.                         ti.Save(My.Application.Info.DirectoryPath + "\32" + m.LargeImage, System.Drawing.Imaging.ImageFormat.Bmp)
  62.                         ti.Dispose()
  63.                     Else
  64.                         m.LargeImageBitmap.Save(My.Application.Info.DirectoryPath + "\32" + m.LargeImage + ".png", System.Drawing.Imaging.ImageFormat.Png)
  65.                     End If
  66.                 End If
  67.             End If
  68.             ' 判断小图像是否存在
  69.             If m.SmallImageBitmap IsNot Nothing Then
  70.                 ' 判断小图像是否正确,如果尺寸包含32说明小图像是采用大图像
  71.                 If m.SmallImageBitmap.Width = 16 And m.SmallImageBitmap.Height = 16 Then
  72.                     ' 判断图像是否文件名称,如果是复制到内存再保存
  73.                     If m.LargeImage.Contains(".bmp") = True Then
  74.                         Dim ti As System.Drawing.Image = New System.Drawing.Bitmap(m.SmallImageBitmap)
  75.                         ti.Save(My.Application.Info.DirectoryPath + "\16" + m.SmallImage, System.Drawing.Imaging.ImageFormat.Bmp)
  76.                         ti.Dispose()
  77.                     Else
  78.                         m.SmallImageBitmap.Save(My.Application.Info.DirectoryPath + "\16" + m.SmallImage + ".png", System.Drawing.Imaging.ImageFormat.Png)
  79.                     End If
  80.                 End If
  81.             End If
  82.         Next
  83.     End Sub
  84. End Class

图标完的压缩文件。
[attach]59475[/attach】

srsmti0i3az.png

srsmti0i3az.png

该贴已经同步到

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2011-6-17 17:53:00 | 显示全部楼层
先收藏了,后续再来研究
回复

使用道具 举报

13

主题

84

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2011-6-18 15:59:00 | 显示全部楼层
很好,很实用。
1.有些图标名不含"16"或"32",导出时会缺失。
2.有的图标不在CUI文件中,SmallImageBitmap属性无效,SmallImage属性有效,能不能增加这种情况的导出?
回复

使用道具 举报

26

主题

589

帖子

10

银币

中流砥柱

Rank: 25

铜币
693
发表于 2011-6-22 10:33:00 | 显示全部楼层

对于AutoCAD自带的图标,都是以RCDATA_16或者RCDATA_32开头,这种方法适应,当然也有可能存在特例,比如Ribbon的图标,目前没有对其深入研究。
对于第三方的图标,那么命名就多种多样了,不过可以通过图标的尺寸来判断。以上If m.LargeImage.Contains("32") = True Then要修改为If m.LargeImageBitmap.Width = 32 And m.LargeImageBitmap.Height = 32 Then,If m.SmallImage.Contains("16") = True Then要修改为If m.SmallImageBitmap.Width = 16 And m.SmallImageBitmap.Height = 16 Then。
对于外部文件方式存在的图标,直接保存会引起“GDI+ 中发生一般性错误。”,那么应该先复制一份到内存,然后再保存。
回复

使用道具 举报

13

主题

84

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2011-6-26 17:55:00 | 显示全部楼层
前面说的情况,例如C3D的图标,即不是单独图像文件,也不在CUI文件里,好像另有资源文件,如何导出?
回复

使用道具 举报

7

主题

59

帖子

9

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
87
发表于 2011-6-26 21:41:00 | 显示全部楼层
不错 感谢分享 祝你快乐
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-15 16:21 , Processed in 0.394088 second(s), 69 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表