1 #ifndef JWWDOC_H 2 #define JWWDOC_H 3 4 #include "jwtype.h" 5 6 typedef struct _DPoint{ 7 jwDOUBLE x; 8 jwDOUBLE y; 9 }DPoint; 10 11 //属性要素定義 12 typedef struct _JWWLay{ 13 jwDWORD m_aanLay; 14 jwDWORD m_aanLayProtect; 15 }JWWLay; 16 17 typedef struct _JWWGLay{ 18 jwDWORD m_anGLay; 19 jwDWORD m_anWriteLay; 20 jwDOUBLE m_adScale; 21 jwDWORD m_anGLayProtect; 22 _JWWLay m_nLay[16]; 23 }JWWGLay; 24 25 typedef struct _JWWZoom{ 26 jwDOUBLE m_dZoomJumpBairitsu; 27 DPoint m_DPZoomJumpGenten; 28 jwDWORD m_nZoomJumpGLay; 29 }JWWZoom; 30 31 typedef struct _JWWPen{ 32 jwDWORD m_m_aPenColor; 33 jwDWORD m_anPenWidth; 34 }JWWPen; 35 36 typedef struct { 37 jwDWORD m_aPrtpenColor; 38 jwDWORD m_anPrtPenWidth; 39 jwDOUBLE m_adPrtTenHankei; 40 }JWWPrtPen; 41 42 typedef struct JWWLType1{ 43 jwDWORD m_alLtype; 44 jwDWORD m_anTokushusSenUnitDot; 45 jwDWORD m_anTokushuSenPich; 46 jwDWORD m_anPrtTokushuSenPich; 47 }JWWLType1; 48 49 typedef struct _JWWLType2{ 50 jwDWORD m_alLtype; 51 jwDWORD m_anRandSenWide; 52 jwDWORD m_anTokushuSenPich; 53 jwDWORD m_anPrtRandSenWide; 54 jwDWORD m_anPrtTokushuSenPich; 55 }JWWLType2; 56 57 typedef struct _JWWLType3{ 58 jwDWORD m_alLtype; 59 jwDWORD m_anTokushusSenUnitDot; 60 jwDWORD m_anTokushuSenPich; 61 jwDWORD m_anPrtTokushuSenPich; 62 }JWWLType3; 63 64 typedef struct _JWWaMoji{ 65 double m_adMojiX; 66 double m_adMojiY; 67 double m_adMojiD; 68 jwDWORD m_anMojiCol; 69 }JWWaMoji; 70 71 #define SXCOL_EXT 100 72 typedef struct _SXFCOL { 73 //画面出力色 74 jwDWORD m_aPenColor[357]; 75 jwDWORD m_anPenWidth[357]; 76 //プリンタ出力色 77 string m_astrUDColorName[257]; 78 jwDWORD m_aPrtPenColor[357]; 79 jwDWORD m_anPrtPenWidth[357]; 80 jwDOUBLE m_adPrtTenHankei[357]; 81 }SXFCOL; 82 83 #define SXLTP_EXT 30 84 typedef struct _SXFLTP { 85 jwDWORD m_alLType[63]; 86 jwDWORD m_anTokushuSenUintDot[63]; 87 jwDWORD m_anTokushuSenPich[63]; 88 jwDWORD m_anPrtTokushuSenPich[63]; 89 string m_astrUDLTypeName[33]; 90 jwDWORD m_anUDLTypeSegment[33]; 91 jwDOUBLE m_aadUDLTypePitch[33][11]; 92 }SXFLTP; 93 94 // 95 // ヘッダー部 96 // 97 class JWWHead 98 { 99 public: 100 string head; //JWWのデータファイルの宣言 101 jwDWORD JW_DATA_VERSION; //バージョンNo. 102 string m_strMemo; //ファイルメモ 103 jwDWORD m_nZumen; //図面サイズ 104 jwDWORD m_nWriteGLay; //レイヤグループ・レイヤ状態 105 JWWGLay GLay[16]; //レイヤグループ・レイヤ状態 106 jwDWORD Dummy[14]; //ダミー 107 jwDWORD m_lnSunpou1; //寸法関係の設定 108 jwDWORD m_lnSunpou2; 109 jwDWORD m_lnSunpou3; 110 jwDWORD m_lnSunpou4; 111 jwDWORD m_lnSunpou5; 112 jwDWORD Dummy1; //ダミー 113 jwDWORD m_nMaxDrawWid;//線描画の最大幅 114 DPoint m_DPPrtGenten; //プリンタ出力範囲の原点(X,Y) 115 jwDOUBLE m_dPrtBairitsu; //プリンタ出力倍率 116 jwDWORD m_nPrt90Kaiten; //プリンタ90°回転出力、プリンタ出力基準点位置 117 jwDWORD m_nMemoriMode; //目盛設定モード 118 jwDOUBLE m_dMemoriHyoujiMin; //目盛表示最小間隔ドット 119 jwDOUBLE m_dMemoriX; //目盛表示間隔X 120 jwDOUBLE m_dMemoriY; //目盛表示間隔Y 121 DPoint m_DpMemoriKijunTen; //目盛基準点(X,Y) 122 string m_aStrLayName[16][16]; //レイヤ名 123 string m_aStrGLayName[16]; //レイヤグループ名 124 jwDOUBLE m_dKageLevel; //日影計算の条件 測定面高さ 125 jwDOUBLE m_dKageIdo; //緯度 126 jwDWORD m_nKage9_15Flg; //9縲・5の測定の指定 127 jwDOUBLE m_dKabeKageLevel; //壁面日影測定面高さ 128 jwDOUBLE m_dTenkuuZuLevel; //天空図の条件(Ver.3.00以降) 測定面高さ 129 jwDOUBLE m_dTenkuuZuEnkoR; //天空図の半径*2 130 jwDWORD m_nMMTani3D; //2.5Dの計算単位(0以外はmm単位で計算) 131 jwDOUBLE m_dBairitsu; //保存時の画面倍率(読込むと前画面倍率になる) 132 DPoint m_DPGenten; 133 jwDOUBLE m_dHanniBairitsu; //範囲記憶倍率と基準点(X,Y) 134 DPoint m_DPHanniGenten; 135 JWWZoom m_dZoom[9]; //マークジャンプ倍率、基準点(X,Y)およびレイヤグループ 136 jwDOUBLE dDm11; //ダミー 137 jwDOUBLE dDm12; //ダミー 138 jwDOUBLE dDm13; //ダミー 139 jwDWORD lnDm1; //ダミー 140 jwDOUBLE dDm21; //ダミー 141 jwDOUBLE dDm22; //ダミー 142 jwDOUBLE m_dMojiBG; //(Ver.4.04以前はダミー)文字列範囲を背景色で描画するときの範囲増寸法 143 jwDWORD m_nMojiBG; 144 jwDOUBLE m_adFukusenSuuchi[10]; //複線間隔 145 jwDOUBLE m_dRyoygawaFukusenTomeDe; //両側複線の留線出の寸法 146 JWWPen m_Pen[10]; //色番号ごとの画面表示色、線幅 147 JWWPrtPen m_PrtPen[10]; //色番号ごとのプリンタ出力色、線幅、実点半径 148 JWWLType1 m_alLType1[10];//線種番号2から9までのパターン、1ユニットのドット数、ピッチ、プリンタ出力ピッチ 149 JWWLType2 m_alLType2[16]; //ランダム線1から5までのパターン、画面表示振幅・ピッチ、プリンタ出力振幅・ピッチ 150 JWWLType3 m_alLType3[20]; //倍長線種番号6から9までのパターン、1ユニットのドット数、ピッチ、プリンタ出力ピッチ 151 jwDWORD m_nDrawGamenTen; //実点を画面描画時の指定半径で描画 152 jwDWORD m_nDrawPrtTen; //実点をプリンタ出力時、指定半径で書く 153 jwDWORD m_nBitMapFirstDraw; //BitMap・ソリッドを最初に描画する 154 jwDWORD m_nGyakuDraw; //逆描画 155 jwDWORD m_nGyakuSearch; //逆サーチ 156 jwDWORD m_nColorPrint; //カラー印刷 157 jwDWORD m_nLayJunPrint; //レイヤ順の印刷 158 jwDWORD m_nColJunPrint; //色番号順の印刷 159 jwDWORD m_nPrtRenzoku; //レイヤグループまたはレイヤごとのプリンタ連続出力指定 160 jwDWORD m_nPrtKyoutuuGray; //プリンタ共通レイヤ(表示のみレイヤ)のグレー出力指定 161 jwDWORD m_nPrtDispOnlyNonDraw; //プリンタ出力時に表示のみレイヤは出力しない 162 jwDWORD m_lnDrawTime; //作図時間(Ver.2.23以降) 163 jwDWORD nEyeInit; //2.5Dの始点位置が設定されている時のフラグ(Ver.2.23以降) 164 jwDWORD m_dEye_H_Ichi_1; //2.5Dの透視図・鳥瞰図・アイソメ図の視点水平角(Ver.2.23以降) 165 jwDWORD m_dEye_H_Ichi_2; // 166 jwDWORD m_dEye_H_Ichi_3; // 167 jwDOUBLE m_dEye_Z_Ichi_1; //2.5Dの透視図の視点高さ・視点離れ(Ver.2.23以降) 168 jwDOUBLE m_dEye_Y_Ichi_1; // 169 jwDOUBLE m_dEye_Z_Ichi_2; //2.5Dの鳥瞰図の視点高さ・視点離れ(Ver.2.23以降) 170 jwDOUBLE m_dEye_Y_Ichi_2; // 171 jwDOUBLE m_dEye_V_Ichi_3; //2.5Dのアイソメ図の視点垂直角(Ver.2.23以降) 172 jwDOUBLE m_dSenNagasaSunpou; //線の長さ指定の最終値(Ver.2.25以降) 173 jwDOUBLE m_dBoxSunpouX; //矩形寸法横寸法・縦寸法指定の最終値(Ver.2.25以降) 174 jwDOUBLE m_dBoxSunpouY; 175 jwDOUBLE m_dEnHankeySunpou; //円の半径指定の最終値(Ver.2.25以降) 176 jwDWORD m_nSolidNinniColor; //ソリッドを任意色で書くフラグ、ソリッドの任意色の既定値(Ver.2.30以降) 177 jwDWORD m_SolidColor; //RGB 178 SXFCOL m_SxfCol; //SXF対応拡張線色定義(Ver.4.20以降) 179 SXFLTP m_SxfLtp; //SXF対応拡張線種定義(Ver.4.20以降) 180 JWWaMoji m_Moji[11];//文字種1から10までの文字幅、高さ、間隔、色番号 181 jwDOUBLE m_dMojiSizeX; //書込み文字の文字幅 182 jwDOUBLE m_dMojiSizeY; //書込み文字の高さ 183 jwDOUBLE m_dMojiKankaku; //間隔 184 jwDWORD m_nMojiColor; //色番号 185 jwDWORD m_nMojiShu; //文字番号 186 jwDOUBLE m_dMojiSeiriGyouKan; //文字位置整理の行間 187 jwDOUBLE m_dMojiSeiriSuu; //文字数 188 jwDWORD m_nMojiKijunZureOn; //文字基準点のずれ位置使用のフラグ 189 jwDOUBLE m_adMojiKijunZureX[3]; //文字基準点の横方向のずれ位置左、中、右 190 jwDOUBLE m_adMojiKijunZureY[3]; //文字基準点の縦方向のずれ位置下、中、上 191 192 }; 193 194 //図形データの基底クラス 195 class CData 196 { 197 protected: 198 jwDWORD nOldVersionSave; //バージョンNo. 199 public: 200 jwDWORD m_lGroup;//曲線属性番号 201 mutable jwBYTE m_nPenStyle;//線種番号 202 jwWORD m_nPenColor;//線色番号 203 ///////////////////////////////////////////////// 204 mutable jwWORD m_nPenWidth;//線色幅 Ver.3.51以降 205 ///////////////////////////////////////////////// 206 jwWORD m_nLayer;//レイヤ番号 207 jwWORD m_nGLayer;//レイヤグループ番号 208 jwWORD m_sFlg;//属性フラグ className()209 const char* className(){return "CData";} 210 friend inline std::ostream& operator<<(std::ostream&, const CData&); 211 friend inline std::istream& operator>>(std::istream&, CData&); SetVersion(jwDWORD ver)212 void SetVersion(jwDWORD ver){ nOldVersionSave = ver; } Serialize(std::ofstream & ofstr)213 void Serialize(std::ofstream& ofstr) const{ 214 ofstr << (jwDWORD)m_lGroup; //曲線属性番号 215 ofstr << (jwBYTE)m_nPenStyle; //線種番号 216 ofstr << (jwWORD)m_nPenColor; //線色番号 217 if( nOldVersionSave >= 351 ){ //Ver.3.51以降 218 ofstr << (jwWORD)m_nPenWidth;//線色幅 219 } 220 ofstr << (jwWORD)m_nLayer; //レイヤ番号 221 ofstr << (jwWORD)m_nGLayer; //レイヤグループ番号 222 ofstr << (jwWORD)m_sFlg; //属性フラグ 223 } Serialize(std::ifstream & ifstr)224 void Serialize(std::ifstream& ifstr) { 225 ifstr >> /*(jwDWORD)*/m_lGroup; //曲線属性番号 226 ifstr >> /*(jwBYTE)*/m_nPenStyle; //線種番号 227 ifstr >> /*(jwWORD)*/m_nPenColor; //線色番号 228 if( nOldVersionSave >= 351 ){ //Ver.3.51以降 229 ifstr >> /*(jwWORD)*/m_nPenWidth;//線色幅 230 } 231 ifstr >> /*(jwWORD)*/m_nLayer; //レイヤ番号 232 ifstr >> /*(jwWORD)*/m_nGLayer; //レイヤグループ番号 233 ifstr >> /*(jwWORD)*/m_sFlg; //属性フラグ 234 } 235 }; 236 inline std::ostream& operator<< (std::ostream& ostr, const CData& output) 237 { 238 ostr << "曲線属性番号:" << (jwDWORD)output.m_lGroup; //曲線属性番号 239 ostr << "線種番号:" << (jwBYTE)output.m_nPenStyle; //線種番号 240 ostr << "線色番号:" << (jwWORD)output.m_nPenColor; //線色番号 241 if( output.nOldVersionSave >= 351 ){ //Ver.3.51以降 242 ostr << "線色幅:" << (jwWORD)output.m_nPenWidth;//線色幅 243 } 244 ostr << "レイヤ番号:" << (jwWORD)output.m_nLayer; //レイヤ番号 245 ostr << "レイヤグループ番号:" << (jwWORD)output.m_nGLayer; //レイヤグループ番号 246 ostr << "属性フラグ:" << (jwWORD)output.m_sFlg; //属性フラグ 247 return ostr; 248 } 249 250 inline std::istream& operator>> (std::istream& istr, CData& input) 251 { 252 istr >> input.m_lGroup; //曲線属性番号 253 istr >> input.m_nPenStyle; //線種番号 254 istr >> input.m_nPenColor; //線色番号 255 if( input.nOldVersionSave >= 351 ){ //Ver.3.51以降 256 istr >> input.m_nPenWidth;//線色幅 257 } 258 istr >> input.m_nLayer; //レイヤ番号 259 istr >> input.m_nGLayer; //レイヤグループ番号 260 istr >> input.m_sFlg; //属性フラグ 261 // ifstr.read((char*)&(input.data), sizeof(int)); 262 return istr; 263 } 264 /* 265 属性フラグ(m_sFlg) 266 ------------------------------------------------------------------------------- 267 データ 線 円 実点 文字 ブロック 寸法 ソリッド 268 ------------------------------------------------------------------------------- 269 (0x0010) 図形 図形 寸法値 270 (0x0020)ハッチ ハッチ ハッチ 縦字 ハッチ 271 (0x0040) 寸法 寸法 真北 272 (0x0080) 建具 建具 日影 273 (0x0100) 半径寸法値 274 (0x0200) 直径寸法値 275 (0x0400) 角度寸法値 276 (0x0800)図形 図形属性選択 図形 277 (0x1000)建具 累計寸法値 建具 278 (0x2000)寸法 建具 寸法 寸法 279 (0x4000) 寸法 280 (0x8000)包絡処理対象外の建具 2.5D 281 ------------------------------------------------------------------------------- 282 */ 283 284 //線分データ 285 class CDataSen : public CData 286 { 287 public: 288 DPoint m_start;//始点X座標、Y座標 289 DPoint m_end;//終点X座標、Y座標 className()290 const char* className(){return "CDataSen";} 291 friend inline std::ostream& operator<<(std::ostream&, const CDataSen&); 292 friend inline std::istream& operator>>(std::istream&, CDataSen&); Serialize(std::ofstream & ofstr)293 void Serialize(std::ofstream& ofstr) const 294 { 295 CData::Serialize(ofstr); 296 ofstr << (double)m_start.x << (double)m_start.y 297 << (double)m_end.x << (double)m_end.y; 298 } 299 Serialize(std::ifstream & ifstr)300 void Serialize(std::ifstream& ifstr){ 301 CData::Serialize(ifstr); 302 ifstr >> m_start.x >> m_start.y 303 >> m_end.x >> m_end.y; 304 } 305 }; 306 inline std::ostream& operator<< (std::ostream& ostr, const CDataSen& output) 307 { 308 ostr << (double)output.m_start.x << " " << (double)output.m_start.y << endl 309 << (double)output.m_end.x << " " << (double)output.m_end.y << endl; 310 return ostr; 311 } 312 313 inline std::istream& operator>> (std::istream& istr, CDataSen& input) 314 { 315 istr >> input.m_start.x >> input.m_start.y 316 >> input.m_end.x >> input.m_end.y; 317 return istr; 318 } 319 typedef CDataSen* PCDataSen; 320 321 //円弧データ 322 class CDataEnko : public CData 323 { 324 public: 325 DPoint m_start;//中心点X座標、Y座標 326 jwDOUBLE m_dHankei;//半径 327 jwDOUBLE m_radKaishiKaku;//開始角 328 jwDOUBLE m_radEnkoKaku;//円弧角 329 jwDOUBLE m_radKatamukiKaku;//傾き角 330 jwDOUBLE m_dHenpeiRitsu;//扁平率 331 jwDWORD m_bZenEnFlg;//全円フラグ className()332 const char* className(){return "CDataEnko";} 333 friend inline std::ostream& operator<<(std::ostream&, const CDataEnko&); 334 friend inline std::istream& operator>>(std::istream&, CDataEnko&); Serialize(std::ofstream & ofstr)335 void Serialize(std::ofstream& ofstr) const 336 { 337 CData::Serialize(ofstr); 338 ofstr << (double)m_start.x << (double)m_start.y 339 << (double)m_dHankei 340 << (double)m_radKaishiKaku 341 << (double)m_radEnkoKaku 342 << (double)m_radKatamukiKaku 343 << (double)m_dHenpeiRitsu 344 << (jwDWORD )m_bZenEnFlg; 345 } 346 Serialize(std::ifstream & ifstr)347 void Serialize(std::ifstream& ifstr){ 348 CData::Serialize(ifstr); 349 ifstr >> /*(double)*/m_start.x >> /*(double)*/m_start.y 350 >> /*(double)*/m_dHankei 351 >> /*(double)*/m_radKaishiKaku 352 >> /*(double)*/m_radEnkoKaku 353 >> /*(double)*/m_radKatamukiKaku 354 >> /*(double)*/m_dHenpeiRitsu 355 >> /*(jwDWORD)*/m_bZenEnFlg; 356 } 357 }; 358 typedef CDataEnko* PCDataEnko; 359 inline std::ostream& operator<< (std::ostream& ostr, const CDataEnko& output) 360 { 361 ostr << (double)output.m_start.x << " " << (double)output.m_start.y << endl 362 << (double)output.m_dHankei << endl 363 << (double)output.m_radKaishiKaku << endl 364 << (double)output.m_radEnkoKaku << endl 365 << (double)output.m_radKatamukiKaku << endl 366 << (double)output.m_dHenpeiRitsu << endl 367 << (jwDWORD )output.m_bZenEnFlg << endl; 368 return ostr; 369 } 370 371 inline std::istream& operator>> (std::istream& istr, CDataEnko& input) 372 { 373 istr >> input.m_start.x >> input.m_start.y 374 >> input.m_dHankei 375 >> input.m_radKaishiKaku 376 >> input.m_radEnkoKaku 377 >> input.m_radKatamukiKaku 378 >> input.m_dHenpeiRitsu 379 >> input.m_bZenEnFlg; 380 return istr; 381 } 382 383 //点データ 384 class CDataTen : public CData 385 { 386 public: 387 DPoint m_start; //点X座標、Y座標 388 jwDWORD m_bKariten;//仮点フラグ 389 jwDWORD m_nCode; //m_nPenStyleが「100」のとき点コード(矢印・ポイントマーカー) 390 jwDOUBLE m_radKaitenKaku; //表示角 391 jwDOUBLE m_dBairitsu; //表示倍率 className()392 const char* className(){return "CDataTen";} 393 friend inline std::ostream& operator<<(std::ostream&, const CDataTen&); 394 friend inline std::istream& operator>>(std::istream&, CDataTen&); Serialize(std::ofstream & ofstr)395 void Serialize(std::ofstream& ofstr) const 396 { 397 m_nPenStyle = 1; 398 if( nOldVersionSave >= 252 ){ //Ver.2.52以降 399 if( 0 != m_nCode ){ m_nPenStyle = 100; } 400 } 401 CData::Serialize(ofstr); 402 403 ofstr << (double)m_start.x << (double)m_start.y; 404 ofstr << (jwDWORD)m_bKariten; 405 if( 100 == m_nPenStyle ){ 406 ofstr << (jwDWORD )m_nCode; 407 ofstr << (double)m_radKaitenKaku; 408 ofstr << (double)m_dBairitsu; 409 } 410 } 411 Serialize(std::ifstream & ifstr)412 void Serialize(std::ifstream& ifstr){ 413 CData::Serialize(ifstr); 414 ifstr >> m_start.x >> m_start.y; 415 ifstr >> m_bKariten; 416 if( 100 == m_nPenStyle ){ 417 ifstr >> m_nCode; 418 ifstr >> m_radKaitenKaku; 419 ifstr >> m_dBairitsu; 420 } 421 } 422 }; 423 typedef CDataTen* PCDataTen; 424 inline std::ostream& operator<< (std::ostream& ostr, const CDataTen& output) 425 { 426 ostr << "x:" <<(double)output.m_start.x << " y:" << (double)output.m_start.y << endl; 427 ostr << (jwDWORD)output.m_bKariten << endl; 428 if( 100 == output.m_nPenStyle ){ 429 ostr << (jwDWORD )output.m_nCode << endl; 430 ostr << (double)output.m_radKaitenKaku << endl; 431 ostr << (double)output.m_dBairitsu << endl; 432 } 433 return ostr; 434 } 435 436 inline std::istream& operator>> (std::istream& istr, CDataTen& /*input*/) 437 { 438 return istr; 439 } 440 441 //文字データ 442 class CDataMoji : public CData 443 { 444 public: 445 DPoint m_start;//始点X座標、Y座標 446 DPoint m_end;//終点X座標、Y座標 447 mutable jwDWORD m_nMojiShu;//文字種(斜体文字は20000、ボールド体は10000を加えた数値) 448 jwDOUBLE m_dSizeX;//文字サイズ横 449 jwDOUBLE m_dSizeY;//文字サイズ縦 450 jwDOUBLE m_dKankaku;//文字間隔 451 jwDOUBLE m_degKakudo;//角度 452 string m_strFontName;//フォント名 453 string m_string;//文字列 className()454 const char* className(){return "CDataEnko";} 455 friend inline std::ostream& operator<<(std::ostream&, const CDataMoji&); 456 friend inline std::istream& operator>>(std::istream&, CDataMoji&); Serialize(std::ofstream & ofstr)457 void Serialize(std::ofstream& ofstr) const 458 { 459 //////////////////////////////////////////// 460 //SKIP m_nPenWidth = m_nSunpouFlg; // (寸法値設定のフラグ)ヘッダーメンバー 461 CData::Serialize(ofstr); 462 m_nPenWidth = 1; //文字枠幅を1 463 //SKIP if( m_sMojiFlg & 0x0001 ){ m_nMojiShu += 10000; } //斜体文字 464 //SKIP if( m_sMojiFlg & 0x0010 ){ m_nMojiShu += 20000; } //ボールド 465 466 ofstr << (double)m_start.x << (double)m_start.y 467 << (double)m_end.x << (double)m_end.y 468 << (jwDWORD)m_nMojiShu 469 << (double)m_dSizeX << (double)m_dSizeY 470 << (double)m_dKankaku 471 << (double)m_degKakudo; 472 473 int len = m_strFontName.length(); 474 if( len == 0 ){ 475 ofstr << (jwBYTE)0x0; 476 }else 477 { 478 if( len >= 0xFF ){ 479 ofstr << (jwBYTE)0xFF; 480 ofstr << (jwWORD)len; 481 }else{ 482 ofstr << (jwBYTE)len; 483 } 484 ofstr.write(m_strFontName.c_str(),len); 485 } 486 len = m_string.length(); 487 if( len == 0 ){ 488 ofstr << (jwBYTE)0x0; 489 }else 490 { 491 if( len >= 0xFF ){ 492 ofstr << (jwBYTE)0xFF; 493 ofstr << (jwWORD)len; 494 }else{ 495 ofstr << (jwBYTE)len; 496 } 497 ofstr.write(m_string.c_str(),len); 498 } 499 m_nMojiShu = (m_nMojiShu % 10000); 500 } 501 Serialize(std::ifstream & ifstr)502 void Serialize(std::ifstream& ifstr) { 503 CData::Serialize(ifstr); 504 ifstr >> m_start.x >> m_start.y 505 >> m_end.x >> m_end.y 506 >> m_nMojiShu 507 >> m_dSizeX >> m_dSizeY 508 >> m_dKankaku 509 >> m_degKakudo; 510 jwBYTE bt; 511 jwWORD wd; 512 char buf[512]; 513 ifstr >> bt; 514 if( bt != 0xFF ){ 515 ifstr.read(buf,bt); 516 buf[bt] = '\0'; 517 m_strFontName = buf; 518 #ifdef DATA_DUMP 519 cout << "MojiData1:" << m_strFontName << endl; 520 #endif 521 }else 522 { 523 ifstr >> wd; 524 ifstr.read(buf,wd); 525 buf[wd] = '\0'; 526 m_strFontName = buf; 527 #ifdef DATA_DUMP 528 cout << "MojiData2:" << m_strFontName << endl; 529 #endif 530 } 531 ifstr >> bt; 532 if( bt != 0xFF ){ 533 ifstr.read(buf,bt); 534 buf[bt] = '\0'; 535 m_string = buf; 536 #ifdef DATA_DUMP 537 cout << "MojiData3:" << m_string << endl; 538 #endif 539 }else 540 { 541 ifstr >> wd; 542 ifstr.read(buf,wd); 543 buf[wd] = '\0'; 544 m_string = buf; 545 #ifdef DATA_DUMP 546 cout << "MojiData4:" << m_string << endl; 547 #endif 548 } 549 /* m_nPenWidth = 1; //文字枠幅を1 550 if( m_sMojiFlg & 0x0001 ){ m_nMojiShu += 10000; } //斜体文字 551 if( m_sMojiFlg & 0x0010 ){ m_nMojiShu += 20000; } //ボールド 552 m_nMojiShu = (m_nMojiShu % 10000); 553 m_nPenWidth = m_nSunpouFlg; // (寸法値設定のフラグ) 554 */ 555 } 556 }; 557 typedef CDataMoji* PCDataMoji; 558 inline std::ostream& operator<< (std::ostream& ostr, const CDataMoji& /*output*/) 559 { 560 return ostr; 561 } 562 563 inline std::istream& operator>> (std::istream& istr, CDataMoji& /*input*/) 564 { 565 return istr; 566 } 567 568 569 //寸法データ 570 class CDataSunpou : public CData 571 { 572 public: 573 CDataSen m_Sen; //線分メンバ 574 CDataMoji m_Moji; //文字メンバ 575 jwWORD m_bSxfMode; //SXFのモード 576 CDataSen m_SenHo1; //補助線1 577 CDataSen m_SenHo2; //補助線2 578 CDataTen m_Ten1; //矢印(点)1 579 CDataTen m_Ten2; //矢印(点)2 580 CDataTen m_TenHo1; //基準点1 581 CDataTen m_TenHo2; //基準点2 className()582 const char* className(){return "CDataSunpou";} 583 friend inline std::ostream& operator<<(std::ostream&, const CDataSunpou&); 584 friend inline std::istream& operator>>(std::istream&, CDataSunpou&); Serialize(std::ofstream & ofstr)585 void Serialize(std::ofstream& ofstr) const { 586 CData::Serialize(ofstr); 587 m_Sen .Serialize(ofstr); 588 m_Moji.Serialize(ofstr); 589 if( nOldVersionSave >= 420 ){ //Ver.4.20以降 590 ofstr << (jwWORD )m_bSxfMode; 591 m_SenHo1 .Serialize(ofstr); 592 m_SenHo2 .Serialize(ofstr); 593 m_Ten1 .Serialize(ofstr); 594 m_Ten2 .Serialize(ofstr); 595 m_TenHo1 .Serialize(ofstr); 596 m_TenHo2 .Serialize(ofstr); 597 } 598 } Serialize(std::ifstream & ifstr)599 void Serialize(std::ifstream& ifstr) { 600 CData::Serialize(ifstr); 601 m_Sen .Serialize(ifstr); 602 m_Moji.Serialize(ifstr); 603 if( nOldVersionSave >= 420 ){ //Ver.4.20以降 604 ifstr >> m_bSxfMode; 605 m_SenHo1 .Serialize(ifstr); 606 m_SenHo2 .Serialize(ifstr); 607 m_Ten1 .Serialize(ifstr); 608 m_Ten2 .Serialize(ifstr); 609 m_TenHo1 .Serialize(ifstr); 610 m_TenHo2 .Serialize(ifstr); 611 } 612 } 613 }; 614 typedef CDataSunpou* PCDataSunpou; 615 inline std::ostream& operator<< (std::ostream& ostr, const CDataSunpou& /*output*/) 616 { 617 return ostr; 618 } 619 620 inline std::istream& operator>> (std::istream& istr, CDataSunpou& /*input*/) 621 { 622 return istr; 623 } 624 /* 625 m_nPenWidth = m_nSunpouFlg; // (寸法値設定のフラグ) 626 「寸法値設定のフラグ」は次のようになる 627 --------------------------------------------- 628 0x0002 寸法の文字設定有のフラグ 629 0x0008 全角文字 630 0x0010 寸法単位 631 0x0020 寸法単位追加 632 0x0040 3桁毎のカンマ表示 633 0x0080 少数点以下の0表示 634 0x0100 少数桁以下 切捨(切捨、切上指定以外は四捨五入) 635 0x0200 少数桁以下 切上 636 0x0400 "φ" 、"R" 前付 637 0x0800 "φ" 、"R" 後付 638 0x1000 少数点以下の桁数 1 639 0x2000 少数点以下の桁数 2 640 0x3000 少数点以下の桁数 3 641 --------------------------------------------- 642 */ 643 644 //ソリッドデータ 645 class CDataSolid : public CData 646 { 647 public: 648 DPoint m_start;//第1点X座標、Y座標 649 DPoint m_end;//第4点4座標、Y座標 650 DPoint m_DPoint2;//第2点X座標、Y座標 651 DPoint m_DPoint3;//第3点X座標、Y座標 652 jwDWORD m_Color;//塗潰し色のRGB値(任意色の場合のみ) className()653 const char* className(){return "CDataSolid";} 654 friend inline std::ostream& operator<<(std::ostream&, const CDataSolid&); 655 friend inline std::istream& operator>>(std::istream&, CDataSolid&); Serialize(std::ofstream & ofstr)656 void Serialize(std::ofstream& ofstr) const 657 { 658 CData::Serialize(ofstr); 659 ofstr << (double)m_start.x << (double)m_start.y 660 << (double)m_end.x << (double)m_end.y 661 << (double)m_DPoint2.x << (double)m_DPoint2.y 662 << (double)m_DPoint3.x << (double)m_DPoint3.y; 663 if( 10 == m_nPenColor ){ 664 ofstr << (jwDWORD)m_Color;//RGB 665 } 666 } 667 Serialize(std::ifstream & ifstr)668 void Serialize(std::ifstream& ifstr) { 669 CData::Serialize(ifstr); 670 ifstr >> m_start.x >> m_start.y 671 >> m_end.x >> m_end.y 672 >> m_DPoint2.x >> m_DPoint2.y 673 >> m_DPoint3.x >> m_DPoint3.y; 674 if( 10 == m_nPenColor ){ 675 ifstr >> m_Color;//RGB 676 } 677 } 678 }; 679 typedef CDataSolid* PCDataSolid; 680 inline std::ostream& operator<< (std::ostream& ostr, const CDataSolid& /*output*/) 681 { 682 return ostr; 683 } 684 685 inline std::istream& operator>> (std::istream& istr, CDataSolid& /*input*/) 686 { 687 return istr; 688 } 689 690 //部品データ 691 class CDataBlock : public CData 692 { 693 public: 694 DPoint m_DPKijunTen;//基準点X座標、Y座標 695 jwDOUBLE m_dBairitsuX;//X方向の倍率 696 jwDOUBLE m_dBairitsuY;//Y方向の倍率 697 jwDOUBLE m_radKaitenKaku;//回転角 698 jwDWORD m_n_Number;//ブロック定義データの通し番号 className()699 const char* className(){return "CDataBlock";} 700 friend inline std::ostream& operator<<(std::ostream&, const CDataBlock&); 701 friend inline std::istream& operator>>(std::istream&, CDataBlock&); Serialize(std::ofstream & ofstr)702 void Serialize(std::ofstream& ofstr) const 703 { 704 CData::Serialize(ofstr); 705 ofstr <<(double)m_DPKijunTen.x <<(double)m_DPKijunTen.y 706 <<(double)m_dBairitsuX 707 <<(double)m_dBairitsuY 708 <<(double)m_radKaitenKaku 709 <</*(jwDWORD)m_pDataList->*/m_n_Number;//ポインタでなく通し番号を保存する 710 } 711 Serialize(std::ifstream & ifstr)712 void Serialize(std::ifstream& ifstr){ 713 CData::Serialize(ifstr); 714 ifstr >> m_DPKijunTen.x >> m_DPKijunTen.y 715 >> m_dBairitsuX 716 >> m_dBairitsuY 717 >> m_radKaitenKaku 718 >>/*(jwDWORD)m_pDataList->*/m_n_Number;//ポインタでなく通し番号を保存する 719 } 720 }; 721 typedef CDataBlock* PCDataBlock; 722 inline std::ostream& operator<< (std::ostream& ostr, const CDataBlock& /*output*/) 723 { 724 return ostr; 725 } 726 727 inline std::istream& operator>> (std::istream& istr, CDataBlock& /*input*/) 728 { 729 return istr; 730 } 731 732 //ブロック定義データ 733 class CDataList : public CData 734 { 735 public: 736 jwDWORD m_nNumber; //定義データの通し番号 737 jwDWORD m_bReffered; //参照されているかのフラグ 738 jwDWORD m_time; //定義された時間 739 string m_strName; //定義データの名前 740 //Ver.4.10 以降、名前の後ろに 741 //"@@SfigorgFlag@@"に続けて、複合図形種別フラグを付加 742 //1:部分図(数学座標系)、2: 部分図(測地座標系)、 743 //3:作図グループ、4:作図部品 744 vector<CData*> m_DataList; //定義データの実体のリスト 745 jwWORD Count; //テスト用 className()746 const char* className(){return "CDataList";} 747 friend inline std::ostream& operator<<(std::ostream&, const CDataList&); 748 friend inline std::istream& operator>>(std::istream&, CDataList&); Serialize(std::ofstream & ofstr)749 void Serialize(std::ofstream& ofstr) const{ 750 CData::Serialize(ofstr); 751 ofstr <<(jwDWORD)m_nNumber 752 <<(jwDWORD)m_bReffered 753 <<m_time; 754 //Ver.4.10 以降、名前の後ろに 755 //"@@SfigorgFlag@@"に続けて、複合図形種別フラグを付加 756 //1:部分図(数学座標系)、2: 部分図(測地座標系)、 757 //3:作図グループ、4:作図部品 758 int len = m_strName.length(); 759 if( len == 0 ){ 760 ofstr << (jwBYTE)0x0; 761 }else 762 { 763 if( len >= 0xFF ){ 764 ofstr << (jwBYTE)0xFF; 765 ofstr << (jwWORD)len; 766 }else{ 767 ofstr << (jwBYTE)len; 768 } 769 ofstr.write(m_strName.c_str(), len); 770 } 771 //SKIP m_DataList.Serialize(ofstr); 772 } Serialize(std::ifstream & ifstr)773 void Serialize(std::ifstream& ifstr) { 774 CData::Serialize(ifstr); 775 ifstr >> m_nNumber 776 >> m_bReffered 777 >> m_time; 778 //Ver.4.10 以降、名前の後ろに 779 //"@@SfigorgFlag@@"に続けて、複合図形種別フラグを付加 780 //1:部分図(数学座標系)、2: 部分図(測地座標系)、 781 //3:作図グループ、4:作図部品 782 jwBYTE bt; 783 jwWORD wd; 784 char buf[512]; 785 ifstr >> bt; 786 if( bt != 0xFF ){ 787 ifstr.read(buf,bt); 788 buf[bt] = '\0'; 789 m_strName = buf; 790 #ifdef DATA_DUMP 791 cout << "MojiData1:" << m_strName << endl; 792 #endif 793 }else 794 { 795 ifstr >> wd; 796 ifstr.read(buf,wd); 797 buf[wd] = '\0'; 798 m_strName = buf; 799 #ifdef DATA_DUMP 800 cout << "MojiData1:" << m_strName << endl; 801 #endif 802 } 803 //SKIP m_DataList.Serialize(ifstr); 804 } 805 }; 806 typedef CDataList* PCDataList; 807 inline std::ostream& operator<< (std::ostream& ostr, const CDataList& /*output*/) 808 { 809 return ostr; 810 } 811 812 inline std::istream& operator>> (std::istream& istr, CDataList& /*input*/) 813 { 814 return istr; 815 } 816 817 //図形要素 818 typedef enum{ 819 Sen, 820 Enko, 821 Ten, 822 Moji, 823 Sunpou, 824 Solid, 825 Block 826 }CDataType; 827 typedef CDataType* PCDataType; 828 829 // 830 // ブロックデータの実体のクラス 831 // DataTypeプロパティーを読んでから振り分けてDataSenなどで読み込む 832 // 833 class JWWBlockList 834 { 835 private: 836 vector<PCDataBlock> FBlockList; 837 vector<PCDataList> FDataList; 838 vector<CDataType> FDataType; 839 protected: 840 public: 841 JWWBlockList(); 842 ~JWWBlockList(); 843 CDataList GetBlockList(unsigned int i); 844 int getBlockListCount(); 845 int GetDataListCount(unsigned int i); 846 void* GetData(unsigned int i, int j ); 847 CDataType GetDataType(unsigned int i, int j ); 848 849 CDataEnko GetCDataEnko(int i, int j ); 850 CDataMoji GetCDataMoji(int i, int j ); 851 CDataSen GetCDataSen(int i, int j ); 852 CDataSolid GetCDataSolid(int i, int j ); 853 CDataSunpou GetCDataSunpou(int i, int j ); 854 CDataTen GetCDataTen(int i, int j ); 855 CDataType GetCDataType(int i, int j ); 856 CDataBlock GetCDataBlock(int i, int j ); 857 858 void AddBlockList(CDataList& CData); 859 void AddDataListSen(CDataSen& D); 860 void AddDataListEnko(CDataEnko& D); 861 void AddDataListTen(CDataTen& D); 862 void AddDataListMoji(CDataMoji& D); 863 void AddDataListSolid(CDataSolid& D); 864 void AddDataListSunpou(CDataSunpou& D); 865 void AddDataListBlock(CDataBlock& D); 866 void Init(); 867 }; 868 869 //図形番号リスト 870 typedef struct _NoList{ 871 string CDataString; 872 int No; 873 }NoList; 874 typedef NoList* PNoList; 875 876 //データ格納リスト 877 class JWWList 878 { 879 private: 880 vector<PNoList> FList; 881 882 public: 883 JWWList(); 884 ~JWWList(); 885 int GetCount(); 886 NoList& GetItem(int i); 887 NoList& GetNoByItem(int i); 888 void AddItem(int No,string& str); 889 }; 890 891 //JWWファイル入出力クラス 892 class JWWDocument 893 { 894 private: 895 string InputFName, 896 OutputFName; 897 public: JWWDocument(string & iFName,string & oFName)898 JWWDocument(string& iFName, string& oFName){ 899 InputFName = iFName; 900 if(iFName.length()>0) 901 ifs = new ifstream(iFName.c_str(),ios::binary); 902 else 903 ifs = NULL; 904 OutputFName = oFName; 905 if(oFName.length()>0) 906 ofs = new ofstream(oFName.c_str(),ios::binary|ios::trunc); 907 else 908 ofs = NULL; 909 pList = new JWWList(); 910 pBlockList = new JWWBlockList(); 911 } ~JWWDocument()912 ~JWWDocument(){ 913 delete pList; 914 delete pBlockList; 915 if(ifs){ 916 ifs->close(); 917 delete ifs; 918 } 919 if(ofs){ 920 ofs->close(); 921 delete ofs; 922 } 923 } 924 // 各図形のレコードの実体 925 JWWHead Header; 926 ifstream* ifs; 927 ofstream* ofs; 928 jwWORD objCode; 929 jwDWORD Mpoint; 930 jwDWORD PSen; 931 jwDWORD PEnko; 932 jwDWORD PTen; 933 jwDWORD PMoji; 934 jwDWORD PSunpou; 935 jwDWORD PSolid; 936 jwDWORD PBlock; 937 jwDWORD PList; 938 jwDWORD SenCount; 939 jwDWORD EnkoCount; 940 jwDWORD TenCount; 941 jwDWORD MojiCount; 942 jwDWORD SolidCount; 943 jwDWORD BlockCount; 944 jwDWORD SunpouCount; 945 jwDWORD SaveSenCount; 946 jwDWORD SaveEnkoCount; 947 jwDWORD SaveTenCount; 948 jwDWORD SaveMojiCount; 949 jwDWORD SaveSunpouCount; 950 jwDWORD SaveSolidCount; 951 jwDWORD SaveBlockCount; 952 jwDWORD SaveDataListCount; 953 954 vector<CDataSen> vSen;// 955 vector<CDataEnko> vEnko;// 956 vector<CDataTen> vTen;// 957 vector<CDataMoji> vMoji;// 958 vector<CDataSolid> vSolid;// 959 vector<CDataBlock> vBlock;// 960 vector<CDataSunpou> vSunpou;// 961 JWWList* pList;// 962 JWWBlockList* pBlockList;//ブロックデータ定義部のリスト 963 vector<CData*> m_DataList; //図形データのリスト 964 vector<CDataList*> m_DataListList; //ブロックデータ定義部のリスト 965 void WriteString(string s); 966 string ReadData(int n); 967 string ReadString(); 968 jwBOOL ReadHeader(); 969 jwBOOL WriteHeader(); 970 jwBOOL Read(); 971 jwBOOL Save(); 972 jwBOOL SaveBich16(jwDWORD id); 973 jwBOOL SaveSen(CDataSen const& DSen); 974 jwBOOL SaveEnko(CDataEnko const& DEnko); 975 jwBOOL SaveTen(CDataTen const& DTen); 976 jwBOOL SaveMoji(CDataMoji const& DMoji); 977 jwBOOL SaveSunpou(CDataSunpou const& DSunpou); 978 jwBOOL SaveSolid(CDataSolid const& DSolid); 979 jwBOOL SaveBlock(CDataBlock const& DBlock); 980 jwBOOL SaveDataList(CDataList const& DList); 981 }; 982 983 #endif //JWWDOC_H 984