efan2000 发表于 2011-6-16 13:43:17

AutoCAD图标提取

本帖最后由 efan2000 于 2011-6-22 10:58 编辑

需要引用AcCui.dll文件。

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Customization
Imports Autodesk.AutoCAD.Runtime

Public Class Class1

CommandMethod("Test")> _
    Public Sub Test()
      ' 16×16图标路径
      If IO.Directory.Exists(My.Application.Info.DirectoryPath + "\16") = False Then
            IO.Directory.CreateDirectory(My.Application.Info.DirectoryPath + "\16")
      End If
      ' 32×32图标路径
      If IO.Directory.Exists(My.Application.Info.DirectoryPath + "\32") = False Then
            IO.Directory.CreateDirectory(My.Application.Info.DirectoryPath + "\32")
      End If
       ' 通过系统变量获得菜单文件名称
      Dim s As String = Application.GetSystemVariable("MENUNAME")
      ' 获得该菜单文件的自定义节
      Dim cs As CustomizationSection = New CustomizationSection(s)
      ' 获得菜单组
      Dim mg As MenuGroup = cs.MenuGroup
      ' 遍历宏组
      For i As Integer = 0 To mg.MacroGroups.Count - 1
            ProcessMacroGroup(mg.MacroGroups(i))
      Next
    End Sub

    'Public Sub ProcessMacroGroup(ByVal mg As MacroGroup)
    '    ' 遍历菜单宏
    '    For i As Integer = 0 To mg.MenuMacros.Count - 1
    '      Dim mm As MenuMacro = mg.MenuMacros(i)
    '      ' 获得宏
    '      Dim m As Macro = mm.macro
    '      ' 判断大图像是否存在
    '      If m.LargeImageBitmap IsNot Nothing Then
    '            ' 判断大图像是否正确,如果包含16说明大图像是采用小图像
    '            If m.LargeImage.Contains("32") = True Then
    '                m.LargeImageBitmap.Save(My.Application.Info.DirectoryPath + "\32\" + m.LargeImage + ".png", System.Drawing.Imaging.ImageFormat.Png)
    '            End If
    '      End If
    '      ' 判断小图像是否存在
    '      If m.SmallImageBitmap IsNot Nothing Then
    '            ' 判断小图像是否正确,如果包含32说明小图像是采用大图像
    '            If m.SmallImage.Contains("16") = True Then
    '                m.SmallImageBitmap.Save(My.Application.Info.DirectoryPath + "\16\" + m.SmallImage + ".png", System.Drawing.Imaging.ImageFormat.Png)
    '            End If
    '      End If
    '    Next
    'End Sub

    Public Sub ProcessMacroGroup(ByVal mg As MacroGroup)
      ' 遍历菜单宏
      For i As Integer = 0 To mg.MenuMacros.Count - 1
            Dim mm As MenuMacro = mg.MenuMacros(i)
            ' 获得宏
            Dim m As Macro = mm.macro
            ' 判断大图像是否存在
            If m.LargeImageBitmap IsNot Nothing Then
                ' 判断大图像是否正确,如果尺寸包含16说明大图像是采用小图像
                If m.LargeImageBitmap.Width = 32 And m.LargeImageBitmap.Height = 32 Then
                  ' 判断图像是否文件名称,如果是复制到内存再保存
                  If m.LargeImage.Contains(".bmp") = True Then
                        Dim ti As System.Drawing.Image = New System.Drawing.Bitmap(m.LargeImageBitmap)
                        ti.Save(My.Application.Info.DirectoryPath + "\32\" + m.LargeImage, System.Drawing.Imaging.ImageFormat.Bmp)
                        ti.Dispose()
                  Else
                        m.LargeImageBitmap.Save(My.Application.Info.DirectoryPath + "\32\" + m.LargeImage + ".png", System.Drawing.Imaging.ImageFormat.Png)
                  End If
                End If
            End If
            ' 判断小图像是否存在
            If m.SmallImageBitmap IsNot Nothing Then
                ' 判断小图像是否正确,如果尺寸包含32说明小图像是采用大图像
                If m.SmallImageBitmap.Width = 16 And m.SmallImageBitmap.Height = 16 Then
                  ' 判断图像是否文件名称,如果是复制到内存再保存
                  If m.LargeImage.Contains(".bmp") = True Then
                        Dim ti As System.Drawing.Image = New System.Drawing.Bitmap(m.SmallImageBitmap)
                        ti.Save(My.Application.Info.DirectoryPath + "\16\" + m.SmallImage, System.Drawing.Imaging.ImageFormat.Bmp)
                        ti.Dispose()
                  Else
                        m.SmallImageBitmap.Save(My.Application.Info.DirectoryPath + "\16\" + m.SmallImage + ".png", System.Drawing.Imaging.ImageFormat.Png)
                  End If
                End If
            End If
      Next
    End Sub

End Class

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


http://bbs.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 efan2000的微博

chpmould 发表于 2011-6-17 17:53:55

先收藏了,后续再来研究

河伯 发表于 2011-6-18 15:59:33

很好,很实用。
1.有些图标名不含"16"或"32",导出时会缺失。
2.有的图标不在CUI文件中,SmallImageBitmap属性无效,SmallImage属性有效,能不能增加这种情况的导出?

efan2000 发表于 2011-6-22 10:33:56

河伯 发表于 2011-6-18 15:59 static/image/common/back.gif
很好,很实用。
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:04

前面说的情况,例如C3D的图标,即不是单独图像文件,也不在CUI文件里,好像另有资源文件,如何导出?

cumtjh 发表于 2011-6-26 21:41:50

不错 感谢分享 祝你快乐

atone 发表于 2024-2-24 18:25:44

提取的目的是干嘛的
页: [1]
查看完整版本: AutoCAD图标提取