53712


IJCAD 2018 MechanicalでC#を使用してAutoCADのソースを移植する作業を行っております。  
機能の１つに「配置選択」というボタンがフォームにあり、それを押下すると  
対象のDWGを4方向から見たイメージがボタンに貼り付けられ、ユーザーが選択したボタンの  
配置が設定されるという機能があるのですが  
今回のAUTOCADからIJCADへの移植に伴い、DWGのバージョンがAC1015からAC1027へと上がりました。  
なので事前にDWGをAUTOCADの2013形式で保存してもらっているのですが  
以前まで正常に動いていたイメージの抜き出しを行うロジックが動作しなくなってしまいました。  
しかし、どのようにプログラムを変更すればイメージが抜き出せるかがわかりません。  
プログラムは下記のようなプログラムになります。

[code]

    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();
    }
    
[/code]

どのようにすれば、IJCAD 2018 MechanicalでDWGのイメージを抜き出せるのでしょうか？


CC BY-SA 4.0
2019-03-25T06:05:42.577
53706
2019-03-25T07:57:33.037
2019-03-25T06:13:45.130
3060
30311
question
c# .net ijcad
IJCAD 2018 MechanicalでDWGからBMPを抜き出す


図面のサムネイルを取得するのであれば、Database.ThumbnailBitmap
プロパティを使用することで、図面が保存された時点でのサムネイルを取得することができます。


CC BY-SA 4.0
2019-03-25T07:57:33.037
53712
2019-03-25T07:57:33.037
53706
answer