Jw_cadのデータ形式

ここでは、Jw_cadバージョン5.00aのデータ形式を解説する。データ形式は、将来予告なく変更されることがあるので注意してほしい。
なお、ソースコードは、データ形式を説明するために、出力に相当する部分を抜き出して記述したものである。
バージョンによって異なる部分は原則として解説の部分に記載し、一部を除いてソースコード内には記述していない。

◆ JWWのデータファイルの宣言
ar.Write("JwwData.", 8);

◆ バージョンNo.
ar << (DWORD)JW_DATA_VERSION;   //Ver.5.0 の内部バージョンは 420

◆ ファイルメモ
ar << (CString)m_strMemo;

◆ 図面サイズ
● 0〜4 ：A0〜A4
● 8    ：2 A
● 9    ：3 A
● 10   ：4 A
● 11   ：5 A
● 12   ：10m
● 13   ：50m
● 14   ：100m

ar << (DWORD)m_nZumen;

◆ レイヤグループ・レイヤ状態
● 書込レイヤグループ
● レイヤグループ状態(0：非表示、1：表示のみ、2：編集可能、3：書込)
● レイヤグループの書込レイヤ
● レイヤグループの縮尺(の分母)
● レイヤグループのプロテクト指定
　(0：無指定、1：表示状態変更可能プロテクト指定、2：表示状態固定プロテクト指定)
● レイヤ状態(0：非表示、1：表示のみ、2：編集可能、3：書込)
● レイヤのプロテクト指定
　(0：無指定、1：表示状態変更可能プロテクト指定、2：表示状態固定プロテクト指定)

ar << (DWORD)m_nWriteGLay;
for(nGLay=0;nGLay<16;nGLay++){
    ar << (DWORD )m_anGLay[nGLay];
    ar << (DWORD )m_anWriteLay[nGLay];
    ar << (double)m_adScale[nGLay];
    ar << (DWORD )m_anGLayProtect[nGLay];
    for(nLay=0;nLay<16;nLay++){
        ar << (DWORD)m_aanLay[nGLay][nLay];
        ar << (DWORD)m_aanLayProtect[nGLay][nLay];
    }
}

◆ ダミー
for(i=0;i<14;i++){ ar << (DWORD)dummy; }

◆ 寸法関係の設定
環境設定ファイルの「S_COMM_8」の③寸法設定が「10」または「11」になっていて、
ファイルへの保存ができる場合に有効になり、
それ以外は「m_lnSunpou1」〜「m_lnSunpou5」は「0」になる。
ar << (DWORD)m_lnSunpou1;
ar << (DWORD)m_lnSunpou2;
ar << (DWORD)m_lnSunpou3;
ar << (DWORD)m_lnSunpou4;
ar << (DWORD)m_lnSunpou5;

・m_lnSunpou1
一位：寸法線色（1〜9）
十位：引出線色（1〜9）
百位：寸法点色（1〜9）
千位：寸法値の少数点以下の桁数（0〜3）
万位：寸法単位（0:mm 、1:ｍ）
十万位：寸法線端部（0:点 、1:矢印 、2:逆矢印）
百万位：寸法文字種（1〜10）

・m_lnSunpou2
一位〜千位：寸法値の寸法線との離れ
　　　　　　離れ（0〜99.9）×１０、マイナスの場合は1000をプラスして整数化する
万位〜千万位：寸法線の突出長さ
　　　　　　長さ（0〜99.9）×１０、マイナスの場合は1000をプラスして整数化し、更に10000倍する。

・m_lnSunpou3
一位〜百位：矢印長さ
　　　　　　長さ（0〜99.9）×１０として整数化する
千位〜十万位：矢印角度
　　　　　　角度（0.1〜80.0）×１０として整数化し、1000倍する
百万位〜億位：逆矢印の出寸法
　　　　　　寸法（0〜99.9）×１０として整数化すし、1000000倍する

・m_lnSunpou4
一位：寸法値方向を補正しない（0：補正有 、1：補正無）
十位：寸法値を全角にする（0：半角 、1：全角）
百位：寸法値のカンマをスペースにする（0：カンマ 、1：スペース）
千位：寸法値のカンマを全角にする（0：半角 、1：全角）
万位：寸法値の少数点を全角にする（0：半角 、1：全角）
十万位：寸法値に単位を表示する（0：表示無 、1：表示有）
百万位：半径値に「R」を表示する（0：表示無 、1：前付表示有 、2：後付表示有）
千万位：半径値にカンマを表示する（0：表示無 、1：表示有）
億位：半径値に少数点の「0」を表示する（0：表示無 、1：表示有）

・m_lnSunpou5
一位　：寸法値を斜め文字にする（0：通常文字 、1：斜め文字）
十位　：寸法値を太文字にする（0：通常文字 、1：太文字）
百位　：角度単位（0：度単位 、1：度分秒単位 、2：度単位で「゜」の表示なし）
千位　：角度単位の少数点以下の桁数（0〜6）
万位　：寸法図形にする（0：寸法図形にしない 、1：寸法図形にする）
十万位：範囲選択のとき寸法図形を線色・種の属性で選択（0：選択しない 、1：選択する）
百万位：表示小数点以下の処理（0:四捨五入　1:切捨　2:切上）(Ver.4.02以降）

◆ ダミー
ar << (DWORD)dummy;

◆ 線描画の最大幅
「線幅を1/100mm単位とする」が設定されているときは「-101」
ar<< (DWORD)m_nMaxDrawWid;

◆ プリンタ出力範囲の原点(X,Y)
ar << (double)m_DPPrtGenten.x;
ar << (double)m_DPPrtGenten.y;

◆ プリンタ出力倍率
ar << (double)m_dPrtBairitsu;

◆ プリンタ90°回転出力、プリンタ出力基準点位置
●一位：プリンタ90°回転出力
●十位：プリンタ出力基準点位置の指定（0:無指定）（Ver.3.00以降）
 　  7:左上   8:中上  9:右上
  　 4:左中   5:中中  6:右中
   　1:左下   2:中下  3:右下
ar << (DWORD)m_nPrtSet;

◆ 目盛設定モード
● 一位(0：無指定、1：目盛表示)
● 十位(0：図面寸法指定、1：実寸指定)
● −値の時、目盛読取り不可
ar << (DWORD)m_nMemoriMode;

◆ 目盛表示最小間隔ドット
ar << (double)m_dMemoriHyoujiMin;

◆ 目盛表示間隔(X,Y)
ar << (double)m_dMemoriX;
ar << (double)m_dMemoriY;

◆ 目盛基準点(X,Y)
ar << (double)m_DpMemoriKijunTen.x;
ar << (double)m_DpMemoriKijunTen.y;

◆ レイヤ名
for(n=0; n<=15; n++){
    for(k=0; k<=15; k++){
        ar << (CString)m_aStrLayName[n][k];
    }
}

◆ レイヤグループ名
for(n=0; n<=15; n++){
    ar << (CString)m_aStrGLayName[n];
}

◆ 日影計算の条件
● 測定面高さ
● 緯度
● 9〜15の測定の指定
● 壁面日影測定面高さ
ar << (double)m_dKageLevel;     
ar << (double)m_dKageIdo;       
ar << (DWORD )m_nKage9_15JiFlg; 
ar << (double)m_dKabeKageLevel;

◆ 天空図の条件（Ver.3.00以降)
● 測定面高さ
● 天空図の半径＊２
ar<< (double)(m_dTenkuuZuLevel    );
ar<< (double)(m_dTenkuuZuEnkoR * 2);

◆ 2.5Dの計算単位(0以外はmm単位で計算)
ar << (DWORD)m_nMMTani3D;

◆ 保存時の画面倍率(読込むと前画面倍率になる)
ar << (double)m_dBairitsu ;
ar << (double)m_DPGenten.x;
ar << (double)m_DPGenten.y;

◆ 範囲記憶倍率と基準点(X,Y)
ar << (double)m_dHanniBairitsu;
ar << (double)m_DPHanniGenten.x;
ar << (double)m_DPHanniGenten.y;

◆ マークジャンプ倍率、基準点(X,Y)およびレイヤグループ
if( nOldVersionSave >= 300 ){   //Ver.3.00以降
    for( n=1; n<=8; n++){
        ar << (double)m_dZoomJumpBairitsu[n];
        ar << (double)m_DPZoomJumpGenten[ n].x;
        ar << (double)m_DPZoomJumpGenten[ n].y;
        ar << (DWORD )m_nZoomJumpGLay[    n];
    }
}else{
    for( n=1; n<=4; n++){
        ar << (double)m_dZoomJumpBairitsu[n];
        ar << (double)m_DPZoomJumpGenten[ n].x;
        ar << (double)m_DPZoomJumpGenten[ n].y;
    }
}

◆ 文字の描画状態(Ver.4.05以降）
if( nOldVersionSave >= 300 ){   //Ver.3.00以降
    ar<< (double)(dDm11);   //ダミー
    ar<< (double)(dDm12);   //ダミー
    ar<< (double)(dDm13);   //ダミー
    ar<< (DWORD )(lnDm1);   //ダミー
    ar<< (double)(dDm21);   //ダミー
    ar<< (double)(dDm22);   //ダミー
    ar<< (double)(m_dMojiBG);//(Ver.4.04以前はダミー）
                             //文字列範囲を背景色で描画するときの範囲増寸法

    ar<< (DWORD )(m_nMojiBG);//(Ver.4.04以前はダミー）   
                             //十位:文字（寸法図形、ブロック図形）を最後に描画
                               一位:1 :輪郭・範囲を背景色で描画しない
                                    2 :文字の輪郭を背景色で描画する
                                    3 :文字列範囲を背景色で描画する
}



◆ 複線間隔
for( n=0; n<=9; n++){
    ar << (double)m_adFukusenSuuchi[n];
}

◆ 両側複線の留線出の寸法
ar << (double)m_dRyoygawaFukusenTomeDe;

◆ 色番号ごとの画面表示色、線幅
● 画面表示色(0：背景色、1〜8：線色、9：グレー色)
● 線幅(1〜16)
for( n=0; n<=9; n++){
    ar  << (DWORD)m_aPenColor[n];
    ar  << (DWORD)m_anPenWidth[n];
}

◆ 色番号ごとのプリンタ出力色、線幅、実点半径
● プリンタ出力色(0：背景色、1〜8：線色、9：グレー色)
● 線幅(1〜500)
● 実点半径(0.1〜10)
for( n=0; n<=9; n++){
    ar  << (DWORD )m_aPrtPenColor[n];
    ar  << (DWORD )m_anPrtPenWidth[n];
    ar  << (double)m_adPrtTenHankei[n];
}

◆ 線種番号2から9までのパターン、1ユニットのドット数、ピッチ、プリンタ出力ピッチ
for( n=2; n<=9; n++){
    ar  << (DWORD)m_alLType[n];
    ar  << (DWORD)m_anTokushuSenUintDot[n];
    ar  << (DWORD)m_anTokushuSenPich[n];
    ar  << (DWORD)m_anPrtTokushuSenPich[n];
}

◆ ランダム線1から5までのパターン、画面表示振幅・ピッチ、プリンタ出力振幅・ピッチ
for( n=11; n<=15; n++){
    ar  << (DWORD)m_alLType[n];
    ar  << (DWORD)m_anRandSenWide[n];
    ar  << (DWORD)m_anTokushuSenPich[n];
    ar  << (DWORD)m_anPrtRandSenWide[n];
    ar  << (DWORD)m_anPrtTokushuSenPich[n];
}

◆ 倍長線種番号6から9までのパターン、1ユニットのドット数、ピッチ、プリンタ出力ピッチ
for( n=16; n<=19; n++){
    ar  << (DWORD)m_alLType[n];
    ar  << (DWORD)m_anTokushuSenUintDot[n];
    ar  << (DWORD)m_anTokushuSenPich[n];
    ar  << (DWORD)m_anPrtTokushuSenPich[n];
}

◆ 実点を画面描画時の指定半径で描画
ar << (DWORD)m_nDrawGamenTen;

◆ 実点をプリンタ出力時、指定半径で書く
ar << (DWORD)m_nDrawPrtTen ;

◆ BitMap・ソリッドを最初に描画する
ar << (DWORD)m_nBitMapFirstDraw;    //十位：ソリッド描画順
                                        //0:レイヤ順        (+1):色順
                                        //3:レイヤ逆順      (+2):色逆順
                                        //6:印刷出力設定順
                                    //一位：
                                        //0:BitMap・ソリッドを最初に描画しない
                                        //1:BitMap・ソリッドを最初に描画
                                        //2:ソリッドを最初に描画
◆ 逆描画
ar << (DWORD)m_nGyakuDraw;

◆ 逆サーチ
ar << (DWORD)m_nGyakuSearch;

◆ カラー印刷
ar << (DWORD)m_nColorPrint;

◆ レイヤ順の印刷
ar << (DWORD)m_nLayJunPrint;

◆ 色番号順の印刷
ar << (DWORD)m_nColJunPrint;

◆ レイヤグループまたはレイヤごとのプリンタ連続出力指定
ar << (DWORD)m_nPrtRenzoku;

◆ プリンタ共通レイヤ(表示のみレイヤ)のグレー出力指定
ar << (DWORD)m_nPrtKyoutsuuGray;

◆ プリンタ出力時に表示のみレイヤは出力しない
ar << (DWORD)m_nPrtDispOnlyNonDraw;

◆ 作図時間（Ver.2.23以降）
ar << (DWORD)m_lnDrawTime;

◆ 2.5Dの始点位置が設定されている時のフラグ（Ver.2.23以降）
● 一位：透視図の視点位置設定済みフラグ
● 十位：鳥瞰図の視点位置設定済みフラグ
● 百位：アイソメ図の視点位置設定済みフラグ
ar << (DWORD)nEyeInit;

◆ 2.5Dの透視図・鳥瞰図・アイソメ図の視点水平角（Ver.2.23以降）
ar << (DWORD)(m_dEye_H_Ichi_1 * 100);
ar << (DWORD)(m_dEye_H_Ichi_2 * 100);
ar << (DWORD)(m_dEye_H_Ichi_3 * 100);

◆ 2.5Dの透視図の視点高さ・視点離れ（Ver.2.23以降）
ar << (double)m_dEye_Z_Ichi_1;
ar << (double)m_dEye_Y_Ichi_1;

◆ 2.5Dの鳥瞰図の視点高さ・視点離れ（Ver.2.23以降）
ar << (double)m_dEye_Z_Ichi_2;
ar << (double)m_dEye_Y_Ichi_2;

◆ 2.5Dのアイソメ図の視点垂直角（Ver.2.23以降）
ar << (double)m_dEye_V_Ichi_3;

◆ 線の長さ指定の最終値（Ver.2.25以降）
ar << (double)m_dSenNagasaSnpou;

◆ 矩形寸法横寸法・縦寸法指定の最終値（Ver.2.25以降）
ar << (double)m_dBoxSunpouX;
ar << (double)m_dBoxSunpouY;

◆ 円の半径指定の最終値（Ver.2.25以降）
ar << (double)m_dEnHankeiSnpou ;

◆ ソリッドを任意色で書くフラグ、ソリッドの任意色の既定値（Ver.2.30以降）
ar << (DWORD)pGamen->m_nSolidNinniColor; 
ar << (DWORD)pGamen->m_SolidColor;   //RGB

◆ SXF対応拡張線色定義（Ver.4.20以降）
● 画面表示色
● 画面表示線幅
● 線色名
● プリンタ出力色
● プリンタ出力線幅
● 点半径
for( n=0; n<=256; n++){ //////   画面表示色
    n1 = n+SXCOL_EXT;   //色番号のオフセット = +100
    ar  << (DWORD)m_aPenColor[n1]
        << (DWORD)m_anPenWidth[n1];
}
for( n=0; n<=256; n++){ //////   プリンタ出力色
    ar  << (CString)m_astrUDColorName[n];
    n1 = n+SXCOL_EXT;   //色番号のオフセット = +100
    ar  << (DWORD  )m_aPrtPenColor[n1]
        << (DWORD  )m_anPrtPenWidth[n1]
        << (double )m_adPrtTenHankei[n1] ;
}
◆ SXF対応拡張線種定義（Ver.4.20以降）
● パターン
● 1ユニットのドット数
● ピッチ
● プリンタ出力ピッチ
● 線種名
● セグメント数
● ピッチ線分の長さ、空白長さの繰り返し
for( n=0; n<=32; n++){   //////  線種パターン
    n1 = n+SXLTP_EXT;   //線種番号のオフセット = +30
    ar  << (DWORD)m_alLType[n1]
        << (DWORD)m_anTokushuSenUintDot[n1]
        << (DWORD)m_anTokushuSenPich[n1]
        << (DWORD)m_anPrtTokushuSenPich[n1];
}           
for( n=0; n<=32; n++){   //////  線種パラメータ
    ar  << (CString)m_astrUDLTypeName[n]                
        << (DWORD  )m_anUDLTypeSegment[n];  
    for(j=1; j<=10; j++){
        ar  << (double)m_aadUDLTypePitch[n][j]; 
    }
}

◆ 文字種1から10までの文字幅、高さ、間隔、色番号
for(i=1; i<=10; i++){
    ar  << (double)m_adMojiX[i] << (double)m_adMojiY[i];
    ar  << (double)m_adMojiD[i] << (DWORD)m_anMojiCol[i];
}

◆ 書込み文字の文字幅、高さ、間隔、色番号、文字番号
ar << (double)m_dMojiSizeX << (double)m_dMojiSizeY;
ar << (double)m_dMojiKankaku;
ar << (DWORD)m_nMojiColor << (DWORD)m_nMojiShu;

◆ 文字位置整理の行間、文字数
ar << (double)m_dMojiSeiriGyouKan << (double)m_dMojiSeiriSuu;

◆ 文字基準点のずれ位置使用のフラグ
ar << (DWORD)m_nMojiKijunZureOn;

◆ 文字基準点の横方向のずれ位置左、中、右
ar << (double)m_adMojiKijunZureX[0];
ar << (double)m_adMojiKijunZureX[1];
ar << (double)m_adMojiKijunZureX[2];

◆ 文字基準点の縦方向のずれ位置下、中、上
ar << (double)m_adMojiKijunZureY[0];
ar << (double)m_adMojiKijunZureY[1];
ar << (double)m_adMojiKijunZureY[2];

◆ 図形データのリストの実体
m_DataList.Serialize(ar);

◆ ブロックデータの定義部のリスト
m_DataListList.Serialize(ar);

図形データリスト、ブロックデータ定義部リスト、ドキュメントクラスの宣言は以下のとおり。

class CMiniDoc : public CDocument
{
・
・
・
    public:

    CTypedPtrList<CObList,CData*>   m_DataList;    //図形データのリスト
    CTypedPtrList<CObList,CDataList*>m_DataListList;  //ブロックデータ定義部のリスト
・
・
・
};

ブロックデータ定義部リストのクラスの宣言は以下のとおり。

class CDataList : public CData{
・
・
・
    public:
    INT m_nNumber;      //通しNo
    BOOL m_bReffered;   //実際に参照されているか
    CTime m_time;       //作成された時刻を入れる
    CString m_strName;  //ブロックデータの名前

    CTypedPtrList<CObList,CData*>m_DataList;
・
・
・
};

その他の各種図形データクラスは、CDataから派生している。
宣言は省略する。

◆ 各種データクラスシリアライズ関数
各種データクラスのシリアライズ関数は以下のとおり。ただし、出力部分のみを示す。
● 図形データ

図形データの基底クラス
void CData::Serialize(CArchive& ar) {
    if (ar.IsStoring()) {
        ar << (DWORD)m_lGroup;      //曲線属性番号
        ar << (BYTE )m_nPenStyle;   //線種番号
        ar << (WORD )m_nPenColor;   //線色番号
        if( nOldVersionSave >= 351 ){   //Ver.3.51以降
            ar << (WORD )m_nPenWidth;//線色幅
        }
        ar << (WORD )m_nLayer;      //レイヤ番号
        ar << (WORD )m_nGLayer;     //レイヤグループ番号
        ar << (WORD )m_sFlg;        //属性フラグ
    }
}

● 線データ
　　●   曲線属性番号
　　●   線種番号
　　●   線色番号
　　●   線幅
　　●   レイヤ番号
　　●   レイヤグループ番号
　　●   属性フラグ
　　●   始点X座標、Y座標
　　●   終点X座標、Y座標

void CDataSen::Serialize(CArchive& ar)
{
    CData::Serialize(ar);
    if (ar.IsStoring()) {
        ar << (double)m_start.x << (double)m_start.x 
           << (double)m_end.x << (double)m_end.y;
    }
}

● 円弧データ
　　●   曲線属性番号
　　●   線種番号
　　●   線色番号
　　●   線幅
　　●   レイヤ番号
　　●   レイヤグループ番号
　　●   属性フラグ
　　●   中心点X座標、Y座標
　　●   半径
　　●   開始角
　　●   円弧角
　　●   傾き角
　　●   扁平率
　　●   全円フラグ

void CDataEnko::Serialize(CArchive& ar)
{
    CData::Serialize(ar);
    if (ar.IsStoring()) {
        double startX = m_start.x;
        double startY = m_start.y;
        ar << (double)m_start.x<< (double)m_start.y
        << (double)m_dHankei
        << (double)m_radKaishiKaku
        << (double)m_radEnkoKaku
        << (double)m_radKatamukiKaku
        << (double)m_dHenpeiRitsu
        << (DWORD )m_bZenEnFlg;
    }
}

● 点データ
　　●   曲線属性番号
　　●   ダミー
　　●   点色番号
　　●   線幅
　　●   レイヤ番号
　　●   レイヤグループ番号
　　●   属性フラグ
　　●   点X座標、Y座標
　　●   仮点フラグ
　　●   m_nPenStyleが「100」のとき点コード（矢印・ポイントマーカー）、表示角、表示倍率

void CDataTen::Serialize(CArchive& ar)
{
    if (ar.IsStoring()) {
        m_nPenStyle = 1;
        if( nOldVersionSave >= 252 ){   //Ver.2.52以降
            if( 0 != m_nCode ){ m_nPenStyle = 100; }
        }
    }
    CData::Serialize(ar);
    if (ar.IsStoring()) {
        ar << (double)m_start.x << (double)m_start.y;
        ar << (DWORD)m_bKariten;
        if( 100 == m_nPenStyle ){
            ar << (DWORD )m_nCode;
            ar << (double)m_radKaitenKaku;
            ar << (double)m_dBairitsu;
        }
    }
}

● 文字データ
　　●   曲線属性番号
　　●   基点位置
　　●   文字色番号
　　●   寸法値設定のフラグ
　　●   レイヤ番号
　　●   レイヤグループ番号
　　●   属性フラグ
　　●   始点X座標、Y座標
　　●   終点X座標、Y座標
　　●   文字種(斜体文字は20000、ボールド体は10000を加えた数値)
　　●   文字サイズ横、縦、文字間隔
　　●   角度
　　●   フォント名
　　●   文字列

void CDataMoji::Serialize(CArchive& ar)
{
    if (ar.IsStoring()) {
        m_nPenWidth = m_nSunpouFlg; //  (寸法値設定のフラグ)
        CData::Serialize(ar);
        m_nPenWidth = 1;            //文字枠幅を1
        if( m_sMojiFlg & 0x0001 ){ m_nMojiShu += 10000; }  //斜体文字
        if( m_sMojiFlg & 0x0010 ){ m_nMojiShu += 20000; }  //ボールド
        ar << (double)m_start.x << (double)m_start.y 
           << (double)m_end.x << (double)m_end.y
           << (DWORD)m_nMojiShu
           << (double)m_dSizeX << (double)m_dSizeY
           << (double)m_dKankaku
           << (double)m_degKakudo
           << (CString)m_strFontName
           << (CString)m_string ;
        m_nMojiShu = (m_nMojiShu % 10000);
    }
}

「寸法値設定のフラグ」は次のようになる
---------------------------------------------
    0x0002  寸法の文字設定有のフラグ
    0x0008  全角文字
    0x0010  寸法単位
    0x0020  寸法単位追加
    0x0040  ３桁毎のカンマ表示
    0x0080  少数点以下の０表示
    0x0100  少数桁以下  切捨（切捨、切上指定以外は四捨五入）
    0x0200  少数桁以下  切上
    0x0400  "φ" 、"R"  前付
    0x0800  "φ" 、"R"  後付
    0x1000  少数点以下の桁数 1
    0x2000  少数点以下の桁数 2
    0x3000  少数点以下の桁数 3
---------------------------------------------
　　　　　　　
● 寸法データ
　　●   ダミー
　　●   ダミー
　　●   ダミー
　　●   ダミー
　　●   レイヤ番号
　　●   レイヤグループ番号
　　●   属性フラグ
　　●   線メンバ
　　●   文字メンバ
　　●   SXFのモード
　　●   補助線1,2、矢印（点)1,2、基準点1,2

void CDataSunpou::Serialize(CArchive& ar)
{
    CData::Serialize(ar);
    if (ar.IsStoring()) {
        m_Sen .Serialize(ar);
        m_Moji.Serialize(ar);
        if( theApp.m_nOldVersionSave >= 420 ){  //Ver.4.20以降
            ar << (WORD )m_bSxfMode;
            m_SenHo1 .Serialize(ar);
            m_SenHo2 .Serialize(ar);
            m_Ten1   .Serialize(ar);
            m_Ten2   .Serialize(ar);
            m_TenHo1 .Serialize(ar);
            m_TenHo2 .Serialize(ar);
        }
    }
}

● ソリッドデータ
　　●   ダミー
　　●   ダミー
　　●   ダミー
　　●   色番号
　　●   レイヤ番号
　　●   レイヤグループ番号
　　●   属性フラグ
　　●   第1点X座標、Y座標
　　●   第4点4座標、Y座標
　　●   第2点X座標、Y座標
　　●   第3点X座標、Y座標
　　●   塗潰し色のRGB値(任意色の場合のみ)

void CDataSolid::Serialize(CArchive& ar)
{
    CData::Serialize(ar);
    if (ar.IsStoring()) {
        ar << (double)m_start.x << (double)m_start.y 
           << (double)m_end.x << (double)m_end.y
           << (double)m_DPoint2.x << (double)m_DPoint2.y
           << (double)m_DPoint3.x << (double)m_DPoint3.y;
        if( 10 == m_nPenColor ){
           ar << (DWORD)m_Color;//RGB
        }
    }
}

● 円のソリッド
CDataSolidを流用し、m_nPenStyleが「101」以上のものを円のソリッドとして扱う。変数の対応は以下のとおり。

m_start     = pEnko->m_start;           //中心
m_end.x     = pEnko->GetHankei();       //半径
m_end.y     = pEnko->GetHenpeiRitsu();  //扁平率
m_DPoint2.x = pEnko->GetKatamukiKaku(); //傾き角
m_DPoint2.y = pEnko->GetKaishiKaku();   //開始角
m_DPoint3.x = pEnko->GetEnkoKaku();     //円弧角
m_DPoint3.y = 0;                        //扇形、全円等の指定

・円ソリッド
m_nPenStyle = (101)    --------円ソリッドの指定
m_DPoint3.y = ( -1)    --------外側円弧ソリッド
m_DPoint3.y = (  0)    --------扇形ソリッド
m_DPoint3.y = (  5)    --------弓形ソリッド
m_DPoint3.y = (100)    --------全円ソリッド
（外側円弧ソリッドの円弧角は「PAI/2」以下）
・円環ソリッド
m_nPenStyle = (105)    --------円環ソリッド「1」の指定
m_nPenStyle = (106)    --------円環ソリッド「2」の指定
m_DPoint3.y = (内側の円半径)
（円弧 と 全円 の違いのフラグ無し、円弧角のみでの違い）
（円環ソリッド「2」は楕円のとき、外円と内円の差が長軸と短軸で同じになる）
・円周ソリッド
m_nPenStyle = (111)    --------円周ソリッドの指定
m_DPoint3.y = (  0)    --------円弧
m_DPoint3.y = (100)    --------全円


● ブロックデータ
　　●   ダミー
　　●   ダミー
　　●   ダミー
　　●   ダミー
　　●   レイヤ番号
　　●   レイヤグループ番号
　　●   属性フラグ
　　●   基準点X座標、Y座標
　　●   X方向の倍率
　　●   Y方向の倍率
　　●   回転角
　　●   ブロック定義データの通し番号

void CDataBlock::Serialize(CArchive& ar)
{
    CData::Serialize(ar);
    if (ar.IsStoring()) {
        ar <<(double)m_DPKijunTen.x <<(double)m_DPKijunTen.y
           <<(double)m_dBairitsuX
           <<(double)m_dBairitsuY
           <<(double)m_radKaitenKaku
           <<(DWORD)m_pDataList->m_nNumber;//ポインタでなく通し番号を保存する
    }
}

● ブロック定義データ
　　●   ダミー
　　●   ダミー
　　●   ダミー
　　●   ダミー
　　●   レイヤ番号
　　●   レイヤグループ番号
　　●   属性フラグ
　　●   定義データの通し番号
　　●   参照されているかのフラグ
　　●   定義された時間
　　●   定義データの名前
　　●   定義データの実体のリスト

void CDataList::Serialize(CArchive& ar)
{
    CData::Serialize(ar);
    if (ar.IsStoring()) {
        ar <<(DWORD)m_nNumber
           <<(DWORD)m_bReffered
           <<m_time;
        ar <<m_strName; //Ver.4.10 以降、名前の後ろに
                        //"@@SfigorgFlag@@"に続けて、複合図形種別フラグを付加
                        //1:部分図(数学座標系)、2: 部分図(測地座標系)、
                        //3:作図グループ、4:作図部品
        }
    m_DataList.Serialize(ar);
}


●属性フラグは各ビットごとに次の意味を持つ

データ    線      円      実点    文字          ブロック    寸法     ソリッド
ビット          
(0x0010)          図形    図形    寸法値
(0x0020)ハッチ    ハッチ  ハッチ  縦字                               ハッチ
(0x0040)          寸法    寸法    真北
(0x0080)          建具    建具    日影
(0x0100)                          半径寸法値
(0x0200)                          直径寸法値
(0x0400)                          角度寸法値
(0x0800)図形                      図形属性選択   図形 
(0x1000)建具                      累計寸法値     建具 
(0x2000)寸法                      建具           寸法      寸法
(0x4000)                          寸法
(0x8000)包絡処理対象外の建具      2.5D


