IJCAD 2018 MechanicalでDWGからBMPを抜き出す
IJCAD 2018 MechanicalでC#を使用してAutoCADのソースを移植する作業を行っております。
機能の1つに「配置選択」というボタンがフォームにあり、それを押下すると
対象のDWGを4方向から見たイメージがボタンに貼り付けられ、ユーザーが選択したボタンの
配置が設定されるという機能があるのですが
今回のAUTOCADからIJCADへの移植に伴い、DWGのバージョンがAC1015からAC1027へと上がりました。
なので事前にDWGをAUTOCADの2013形式で保存してもらっているのですが
以前まで正常に動いていたイメージの抜き出しを行うロジックが動作しなくなってしまいました。
しかし、どのようにプログラムを変更すればイメージが抜き出せるかがわかりません。
プログラムは下記のようなプログラムになります。
FileStream DwgF = null; // ファイルストリーム
int PosSentinel; // ファイル記述ブロック
BinaryReader br = null; // バイナリファイルを読む
int TypePreview; // サムネイルフォーマット
int PosBMP; // サムネイル位置
int LenBMP; // サムネイルのサイズ
short biBitCount; // サムネイルビット深度
BITMAPHEADER BiH; // BITMAPファイルヘッダー, DWGファイルにはファイルヘッダーが含まれていない
byte[] BMPInfo; // BMPファイルのDWGファイルに含まれています
MemoryStream BMPF = new MemoryStream(); // ビットマップファイルストリームを保存する
BinaryWriter BMPR = new BinaryWriter(BMPF); // バイナリファイルを書く
System.Drawing.Image MyImg = null;
try
{
DwgF = new FileStream(filePath, FileMode.Open, FileAccess.Read); // ファイルストリーム
br = new BinaryReader(DwgF);
DwgF.Seek(13, SeekOrigin.Begin); // 13番目の先頭からバイトを読み込む
PosSentinel = br.ReadInt32(); // = 13?17バイト命令のサムネイル説明ブロックの位置
DwgF.Seek(PosSentinel + 30, SeekOrigin.Begin); // poInt32erから31バイト目のサムネイル記述ブロック
TypePreview = br.ReadByte(); // = サムネイルフォーマット情報用の31バイト、2 BMPフォーマット、WMFフォーマット3
if (TypePreview == 1)
{
}
else if (TypePreview == 2 || TypePreview == 3)
{
PosBMP = br.ReadInt32(); // DWGファイルの場所が保存されます。
LenBMP = br.ReadInt32(); // ビットマップサイズ
DwgF.Seek(PosBMP + 14, SeekOrigin.Begin); // 正しい位置にあるpoInt32erブロック
biBitCount = br.ReadInt16(); // 読み取りビット深度
DwgF.Seek(PosBMP, SeekOrigin.Begin); // ビットマップの内容のバックアップ
BMPInfo = br.ReadBytes(LenBMP); // ヘッダビットマップ情報を含まない
br.Close();
DwgF.Close();
BiH.bfType = 19778; // ビットマップファイルのヘッダを設定する
if (biBitCount < 9)
{
BiH.bfSize = 54 + 4 * (Int32)(Math.Pow(2, biBitCount)) + LenBMP;
}
else
{
BiH.bfSize = 54 + LenBMP;
}
BiH.bfReserved1 = 0; // バイトを保つ
BiH.bfReserved2 = 0; // バイトを保つ
BiH.bfOffBits = 14 + 40 + 1024; // 画像データの移行後、ビットマップファイルヘッダの書き込みを開始します。
BMPR.Write(BiH.bfType); // ファイルの種類
BMPR.Write(BiH.bfSize); // ファイルサイズ
BMPR.Write(BiH.bfReserved1); // 0
BMPR.Write(BiH.bfReserved2); // 0
BMPR.Write(BiH.bfOffBits); // 画像データの移行
BMPR.Write(BMPInfo); // ビットマップを書き込む
BMPF.Seek(0, SeekOrigin.Begin); // 先頭のファイルへのpoInt32er
MyImg = System.Drawing.Image.FromStream(BMPF); // ビットマップファイルオブジェクトを作成する
BMPR.Close();
BMPF.Close();
}
img = MyImg;
}
catch (EndOfStreamException)
{
throw new EndOfStreamException("file is not the standard DWG format file, can not be a preview! ");
}
catch (IOException ex)
{
if (ex.Message == "trying to file poInt32er to the beginning of the file before. /r/n ")
{
throw new IOException("file is not the standard DWG format file, can not be a preview! ");
}
else if (ex.Message == "file" + "+ FileName +" + "is in use by another process, so the process cannot access the file. ")
{
// copy files, to preview
//File.Copy (filePath, Application.StartupPath + @ /linshi.dwg, true);
//Image Image = GetDwgImage (Application.StartupPath + @ "/linshi.dwg");
//File.Delete (Application.StartupPath + @ /linshi.dwg);
//Image return;
}
else
{
throw new System.Exception(ex.Message);
}
}
catch (System.Exception ex)
{
throw new System.Exception(ex.Message);
}
finally
{
if (DwgF != null)
{
DwgF.Close();
}
if (br != null)
{
br.Close();
}
BMPR.Close();
BMPF.Close();
}
どのようにすれば、IJCAD 2018 MechanicalでDWGのイメージを抜き出せるのでしょうか?