Jw_cadのデータ形式 ここではJw_cad Version 7.02のデータ形式を解説する。データ形式は、将来予告なく変更されることがあるので注意してほしい。 なお、ソースコードは、データ形式を説明するために、出力に相当する部分を抜き出して記述したものである。 バージョンによって異なる部分は原則として解説の部分に記載し、一部を除いてソースコード内には記述していない。 ◆ JWWのデータファイルの宣言 ar.Write("JwwData.", 8); ◆ バージョンNo. ar << (DWORD)JW_DATA_VERSION; 7.02の内部データ値は700 ◆ ファイルメモ 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」のB寸法設定が「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:m) 十万位:寸法線端部(0:点 、1:矢印 、2:逆矢印) 百万位:寸法文字種(1〜10) ・m_lnSunpou2 一位〜千位:寸法値の寸法線との離れ       離れ(0〜99.9)×10、マイナスの場合は1000をプラスして整数化する 万位〜千万位:寸法線の突出長さ       長さ(0〜99.9)×10、マイナスの場合は1000をプラスして整数化し、更に10000倍する。 ・m_lnSunpou3 一位〜百位:矢印長さ       長さ(0〜99.9)×10として整数化する 千位〜十万位:矢印角度       角度(0.1〜80.0)×10として整数化し、1000倍する 百万位〜億位:逆矢印の出寸法       寸法(0〜99.9)×10として整数化すし、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」、Ver.6.00以降は線幅を1/100mm単位にする前の線描画の最大幅を含め「-201」〜「-300」、「-401」〜「-500」。 int nWid = m_nMaxDrawWid; if( m_bSenHaba100 ){ nWid = -101; if( nOldVersionSave >= 600 ){ //Ver.6.00以降 int kk = m_nMaxDrawWidBak; if( kk > 0 ){ nWid = -( ABS(kk) + 200 ); } else { nWid = -( ABS(kk) + 400 ); } } } ar<< (DWORD)nWid; ◆ プリンタ出力範囲の原点(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以降) ● 測定面高さ ● 天空図の半径×2 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; ◆ プリンタ出力時に表示のみレイヤは出力しない Ver.6.00以降は印刷時における既定線色の線幅の基準値の「dpi」。 int n1 = m_nPrtDispOnlyNonDraw; if( nOldVersionSave >= 600 ){ //Ver.6.00以降 if( 300 == m_nDpi300 ){ n1 += 10; }//300dpi else { n1 += 20; }//600dpi } ar << (DWORD)n1 ◆ 作図時間(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); ◆ 同梱画像ファイルの個数(Ver.7.00以降) ar << ndx; //同梱画像ファイルの個数 ◆ 同梱画像ファイルのファイル名、サイズ、実体(Ver.7.00以降) for(i=0 ;i m_DataList; //図形データのリスト CTypedPtrListm_DataListList; //ブロックデータ定義部のリスト ・ ・ ・ }; ブロックデータ定義部リストのクラスの宣言は以下のとおり。 class CDataList : public CData{ ・ ・ ・ public: INT m_nNumber; //通しNo BOOL m_bReffered; //実際に参照されているか CTime m_time; //作成された時刻を入れる CString m_strName; //ブロックデータの名前 CTypedPtrListm_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 3桁毎のカンマ表示 0x0080 少数点以下の0表示 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 <