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的微博
先收藏了,后续再来研究 很好,很实用。
1.有些图标名不含"16"或"32",导出时会缺失。
2.有的图标不在CUI文件中,SmallImageBitmap属性无效,SmallImage属性有效,能不能增加这种情况的导出? 河伯 发表于 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+ 中发生一般性错误。”,那么应该先复制一份到内存,然后再保存。 前面说的情况,例如C3D的图标,即不是单独图像文件,也不在CUI文件里,好像另有资源文件,如何导出? 不错 感谢分享 祝你快乐 提取的目的是干嘛的
页:
[1]