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