0
0

More than 3 years have passed since last update.

Autodesk Inventor API Hacking (RibbonにIconを登録したい~IPictureDisp~)

Last updated at Posted at 2019-05-26

0. はじめに

Freeradicalの中の人、yamarahです。
RibbonにIcon画像を表示するには、

ButtonDefinition Inventor.Application.CommandManager.ControlDefinitions.AddButtonDefinition(
    string DisplayName,
    string InternalName,
    CommandTypesEnum Classification,
    object ClientId,
    string DescriptionText = "",
    string ToolTipText = "",
    object StandardIcon = null,
    object LargeIcon = null,
    ButtonDisplayEnum ButtonDisplay = ButtonDisplayEnum.kDisplayTextInLearningMode
    );

StandardIconLargeIconに画像を指定するわけですが、その形式で戸惑うかもしれません。
これらには、Picture (IPictureDisp)形式のオブジェクトで、それをどう用意すれば良いのかが、なかなかと難しいのです。
ここでは、IPictureDisp形式の画像を作成する方法を2つ紹介します。

1. AxHostを使う方法

VB.netだと簡単な方法があるらしいですが、C#だと次の方法をとります。

using stdole;
using System.Drawing;
using System.Windows.Forms;

class AxHostConverter : AxHost
{
    private AxHostConverter() : base("") { }

    static public IPictureDisp ImageToPictureDisp(Image image)
    {
        return (IPictureDisp)GetIPictureDispFromPicture(image);
    }
    static public Image PictureDispToImage(IPictureDisp pictureDisp)
    {
        return GetPictureFromIPicture(pictureDisp);
    }
}

System.Windows.Forms.AxHostには、ImageとIPictureDispを相互変換するstaticな関数GetIPictureDispFromPictureGetPictureFromIPictureが用意されているので、単にそれを呼べば済みそうなものです。
しかし、残念ながらこれらの関数はprotectedが指定されているので、AxHostを継承してpublicなwrapper関数を持ったclassを作る必要があるわけです。

2. OleCreatePictureIndirectを使う方法

WPFに移行してFormsフリーにしたい場合は、AxHostを利用せずOleAut32.dllのOleCreatePictureIndirectを使って変換する方法もあります。
下記リンクにあるコードは、私の環境では問題なく動作しました。
How to convert Icon/Bitmap to IPictureDisp without VisualBasic.Compatibility.VB6.Support.IconToIPicture?
Formsへの依存は無くなりますが、その代わりにOleAut32.dllが必須となります。

99. 親の記事に戻る

Autodesk Inventor API Hacking (概略)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0