明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2631|回复: 6

AutoCAD图标提取

[复制链接]
发表于 2011-6-16 13:43 | 显示全部楼层 |阅读模式
本帖最后由 efan2000 于 2011-6-22 10:58 编辑

需要引用AcCui.dll文件。
  1. Imports Autodesk.AutoCAD.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】


该贴已经同步到 efan2000的微博

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2011-6-17 17:53 | 显示全部楼层
先收藏了,后续再来研究
发表于 2011-6-18 15:59 | 显示全部楼层
很好,很实用。
1.有些图标名不含"16"或"32",导出时会缺失。
2.有的图标不在CUI文件中,SmallImageBitmap属性无效,SmallImage属性有效,能不能增加这种情况的导出?
 楼主| 发表于 2011-6-22 10:33 | 显示全部楼层
河伯 发表于 2011-6-18 15:59
很好,很实用。
1.有些图标名不含"16"或"32",导出时会缺失。
2.有的图标不在CUI文件中,SmallImageBitma ...

对于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+ 中发生一般性错误。”,那么应该先复制一份到内存,然后再保存。
发表于 2011-6-26 17:55 | 显示全部楼层
前面说的情况,例如C3D的图标,即不是单独图像文件,也不在CUI文件里,好像另有资源文件,如何导出?
发表于 2011-6-26 21:41 | 显示全部楼层
不错 感谢分享 祝你快乐
发表于 2024-2-24 18:25 | 显示全部楼层
提取的目的是干嘛的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-8 21:40 , Processed in 0.216191 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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