1 /**********************************************************
2  * Version $Id$
3  *********************************************************/
4 
5 ///////////////////////////////////////////////////////////
6 //                                                       //
7 //                         SAGA                          //
8 //                                                       //
9 //      System for Automated Geoscientific Analyses      //
10 //                                                       //
11 //                    User Interface                     //
12 //                                                       //
13 //                    Program: SAGA                      //
14 //                                                       //
15 //-------------------------------------------------------//
16 //                                                       //
17 //                   VIEW_Map_3D.cpp                     //
18 //                                                       //
19 //          Copyright (C) 2005 by Olaf Conrad            //
20 //                                                       //
21 //-------------------------------------------------------//
22 //                                                       //
23 // This file is part of 'SAGA - System for Automated     //
24 // Geoscientific Analyses'. SAGA is free software; you   //
25 // can redistribute it and/or modify it under the terms  //
26 // of the GNU General Public License as published by the //
27 // Free Software Foundation, either version 2 of the     //
28 // License, or (at your option) any later version.       //
29 //                                                       //
30 // SAGA is distributed in the hope that it will be       //
31 // useful, but WITHOUT ANY WARRANTY; without even the    //
32 // implied warranty of MERCHANTABILITY or FITNESS FOR A  //
33 // PARTICULAR PURPOSE. See the GNU General Public        //
34 // License for more details.                             //
35 //                                                       //
36 // You should have received a copy of the GNU General    //
37 // Public License along with this program; if not, see   //
38 // <http://www.gnu.org/licenses/>.                       //
39 //                                                       //
40 //-------------------------------------------------------//
41 //                                                       //
42 //    contact:    Olaf Conrad                            //
43 //                Institute of Geography                 //
44 //                University of Goettingen               //
45 //                Goldschmidtstr. 5                      //
46 //                37077 Goettingen                       //
47 //                Germany                                //
48 //                                                       //
49 //    e-mail:     oconrad@saga-gis.org                   //
50 //                                                       //
51 ///////////////////////////////////////////////////////////
52 
53 //---------------------------------------------------------
54 
55 
56 ///////////////////////////////////////////////////////////
57 //														 //
58 //														 //
59 //														 //
60 ///////////////////////////////////////////////////////////
61 
62 //---------------------------------------------------------
63 #include "res_commands.h"
64 #include "res_controls.h"
65 #include "res_dialogs.h"
66 #include "res_images.h"
67 
68 #include "helper.h"
69 
70 #include "wksp_data_manager.h"
71 #include "wksp_map.h"
72 
73 #include "view_map_3d.h"
74 #include "view_map_3d_panel.h"
75 
76 
77 ///////////////////////////////////////////////////////////
78 //														 //
79 //														 //
80 //														 //
81 ///////////////////////////////////////////////////////////
82 
83 //---------------------------------------------------------
84 enum
85 {
86 	MAP3D_STATUSBAR_ROTATE_X	= 0,
87 	MAP3D_STATUSBAR_ROTATE_Y,
88 	MAP3D_STATUSBAR_ROTATE_Z,
89 	MAP3D_STATUSBAR_SHIFT_X,
90 	MAP3D_STATUSBAR_SHIFT_Y,
91 	MAP3D_STATUSBAR_SHIFT_Z,
92 	MAP3D_STATUSBAR_EXAGGERATION,
93 	MAP3D_STATUSBAR_COUNT
94 };
95 
96 
97 ///////////////////////////////////////////////////////////
98 //														 //
99 //														 //
100 //														 //
101 ///////////////////////////////////////////////////////////
102 
103 //---------------------------------------------------------
104 IMPLEMENT_CLASS(CVIEW_Map_3D, CVIEW_Base);
105 
106 //---------------------------------------------------------
BEGIN_EVENT_TABLE(CVIEW_Map_3D,CVIEW_Base)107 BEGIN_EVENT_TABLE(CVIEW_Map_3D, CVIEW_Base)
108 	EVT_SIZE			(CVIEW_Map_3D::On_Size)
109 	EVT_MENU_RANGE		(ID_CMD_MAP3D_FIRST, ID_CMD_MAP3D_LAST, CVIEW_Map_3D::On_Command)
110 	EVT_UPDATE_UI_RANGE	(ID_CMD_MAP3D_FIRST, ID_CMD_MAP3D_LAST, CVIEW_Map_3D::On_Command_UI)
111 END_EVENT_TABLE()
112 
113 
114 ///////////////////////////////////////////////////////////
115 //														 //
116 //														 //
117 //														 //
118 ///////////////////////////////////////////////////////////
119 
120 //---------------------------------------------------------
121 CVIEW_Map_3D::CVIEW_Map_3D(CWKSP_Map *pMap)
122 	: CVIEW_Base(pMap, ID_VIEW_MAP_3D, _TL("3D View"), ID_IMG_WND_MAP3D, false)
123 {
124 	SetTitle(wxString::Format("%s [%s]", pMap->Get_Name().c_str(), _TL("3D View")));
125 
126 	CreateStatusBar(MAP3D_STATUSBAR_COUNT);
127 
128 	m_pPanel	= new CVIEW_Map_3DPanel(this, pMap);
129 	m_pPanel->SetSize(GetClientSize());
130 
131 	//-----------------------------------------------------
132 	Parameters_Create();
133 
134 	if( DLG_Parameters(&m_Parameters) )
135 	{
136 		Parameters_Update(false);
137 
138 		Do_Show();
139 
140 		m_pPanel->SetFocus();
141 	}
142 	else
143 	{
144 		Destroy();
145 	}
146 }
147 
148 //---------------------------------------------------------
~CVIEW_Map_3D(void)149 CVIEW_Map_3D::~CVIEW_Map_3D(void)
150 {
151 	m_pPanel->Destroy();
152 }
153 
154 
155 ///////////////////////////////////////////////////////////
156 //														 //
157 //														 //
158 //														 //
159 ///////////////////////////////////////////////////////////
160 
161 //---------------------------------------------------------
_Create_Menu(void)162 wxMenu * CVIEW_Map_3D::_Create_Menu(void)
163 {
164 	wxMenu	*pMenu	= new wxMenu, *pMenu_Sub;
165 
166 	CMD_Menu_Add_Item(pMenu    , false, ID_CMD_MAP3D_PARAMETERS);
167 
168 	pMenu->Append(ID_CMD_MAP3D_FIRST, _TL("Rotation"), pMenu_Sub = new wxMenu());
169 	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_ROTATE_X_LESS);
170 	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_ROTATE_X_MORE);
171 //	pMenu_Sub->AppendSeparator();
172 //	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_ROTATE_Y_LESS);
173 //	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_ROTATE_Y_MORE);
174 	pMenu_Sub->AppendSeparator();
175 	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_ROTATE_Z_LESS);
176 	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_ROTATE_Z_MORE);
177 
178 	pMenu->Append(ID_CMD_MAP3D_FIRST, _TL("Shift"), pMenu_Sub = new wxMenu());
179 	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_SHIFT_X_LESS);
180 	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_SHIFT_X_MORE);
181 	pMenu_Sub->AppendSeparator();
182 	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_SHIFT_Y_LESS);
183 	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_SHIFT_Y_MORE);
184 	pMenu_Sub->AppendSeparator();
185 	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_SHIFT_Z_LESS);
186 	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_SHIFT_Z_MORE);
187 
188 	pMenu->Append(ID_CMD_MAP3D_FIRST, _TL("Sequencer"), pMenu_Sub = new wxMenu());
189 	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_SEQ_POS_ADD);
190 	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_SEQ_POS_DEL);
191 	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_SEQ_POS_DEL_ALL);
192 	CMD_Menu_Add_Item(pMenu_Sub, false, ID_CMD_MAP3D_SEQ_POS_EDIT);
193 	pMenu_Sub->AppendSeparator();
194 	CMD_Menu_Add_Item(pMenu_Sub,  true, ID_CMD_MAP3D_SEQ_PLAY);
195 	CMD_Menu_Add_Item(pMenu_Sub,  true, ID_CMD_MAP3D_SEQ_PLAY_LOOP);
196 	CMD_Menu_Add_Item(pMenu_Sub,  true, ID_CMD_MAP3D_SEQ_SAVE);
197 
198 	CMD_Menu_Add_Item(pMenu    , false, ID_CMD_MAP3D_EXAGGERATE_LESS);
199 	CMD_Menu_Add_Item(pMenu    , false, ID_CMD_MAP3D_EXAGGERATE_MORE);
200 	pMenu->AppendSeparator();
201 	CMD_Menu_Add_Item(pMenu    ,  true, ID_CMD_MAP3D_CENTRAL);
202 	CMD_Menu_Add_Item(pMenu    , false, ID_CMD_MAP3D_CENTRAL_LESS);
203 	CMD_Menu_Add_Item(pMenu    , false, ID_CMD_MAP3D_CENTRAL_MORE);
204 	pMenu->AppendSeparator();
205 	CMD_Menu_Add_Item(pMenu    ,  true, ID_CMD_MAP3D_STEREO);
206 	CMD_Menu_Add_Item(pMenu    , false, ID_CMD_MAP3D_STEREO_LESS);
207 	CMD_Menu_Add_Item(pMenu    , false, ID_CMD_MAP3D_STEREO_MORE);
208 	pMenu->AppendSeparator();
209 	CMD_Menu_Add_Item(pMenu    ,  true, ID_CMD_MAP3D_INTERPOLATED);
210 	CMD_Menu_Add_Item(pMenu    , false, ID_CMD_MAP3D_SAVE);
211 
212 	return( pMenu );
213 }
214 
215 //---------------------------------------------------------
_Create_ToolBar(void)216 wxToolBarBase * CVIEW_Map_3D::_Create_ToolBar(void)
217 {
218 	wxToolBarBase	*pToolBar	= CMD_ToolBar_Create(ID_TB_VIEW_MAP_3D);
219 
220 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_PARAMETERS);
221 	CMD_ToolBar_Add_Separator(pToolBar);
222 	CMD_ToolBar_Add_Item(pToolBar,  true, ID_CMD_MAP3D_STEREO);
223 	CMD_ToolBar_Add_Item(pToolBar,  true, ID_CMD_MAP3D_INTERPOLATED);
224 	CMD_ToolBar_Add_Separator(pToolBar);
225 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_ROTATE_X_LESS);
226 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_ROTATE_X_MORE);
227 //	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_ROTATE_Y_LESS);
228 //	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_ROTATE_Y_MORE);
229 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_ROTATE_Z_LESS);
230 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_ROTATE_Z_MORE);
231 	CMD_ToolBar_Add_Separator(pToolBar);
232 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_SHIFT_X_LESS);
233 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_SHIFT_X_MORE);
234 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_SHIFT_Y_LESS);
235 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_SHIFT_Y_MORE);
236 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_SHIFT_Z_LESS);
237 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_SHIFT_Z_MORE);
238 	CMD_ToolBar_Add_Separator(pToolBar);
239 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_EXAGGERATE_LESS);
240 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_EXAGGERATE_MORE);
241 	CMD_ToolBar_Add_Separator(pToolBar);
242 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_CENTRAL_LESS);
243 	CMD_ToolBar_Add_Item(pToolBar, false, ID_CMD_MAP3D_CENTRAL_MORE);
244 
245 	CMD_ToolBar_Add(pToolBar, _TL("3D-View"));
246 
247 	return( pToolBar );
248 }
249 
250 
251 ///////////////////////////////////////////////////////////
252 //														 //
253 //														 //
254 //														 //
255 ///////////////////////////////////////////////////////////
256 
257 //---------------------------------------------------------
Do_Update(void)258 void CVIEW_Map_3D::Do_Update(void)
259 {
260 	m_pPanel->Update_View(true);
261 }
262 
263 //---------------------------------------------------------
Update_StatusBar(void)264 void CVIEW_Map_3D::Update_StatusBar(void)
265 {
266 	if( m_pPanel )
267 	{
268 		SetStatusText(wxString::Format("X %+.1f", m_pPanel->Get_Projector().Get_xRotation() * M_RAD_TO_DEG), MAP3D_STATUSBAR_ROTATE_X);
269 		SetStatusText(wxString::Format("Y %+.1f", m_pPanel->Get_Projector().Get_yRotation() * M_RAD_TO_DEG), MAP3D_STATUSBAR_ROTATE_Y);
270 		SetStatusText(wxString::Format("Z %+.1f", m_pPanel->Get_Projector().Get_zRotation() * M_RAD_TO_DEG), MAP3D_STATUSBAR_ROTATE_Z);
271 
272 		SetStatusText(wxString::Format("X %+.1f"    , m_pPanel->Get_Projector().Get_xShift()), MAP3D_STATUSBAR_SHIFT_X);
273 		SetStatusText(wxString::Format("Y %+.1f"    , m_pPanel->Get_Projector().Get_yShift()), MAP3D_STATUSBAR_SHIFT_Y);
274 		SetStatusText(wxString::Format("Z %+.1f"    , m_pPanel->Get_Projector().Get_zShift()), MAP3D_STATUSBAR_SHIFT_Z);
275 
276 		SetStatusText(wxString::Format("E %.1f"     , m_pPanel->m_zScale), MAP3D_STATUSBAR_EXAGGERATION);
277 	}
278 }
279 
280 
281 ///////////////////////////////////////////////////////////
282 //														 //
283 //														 //
284 //														 //
285 ///////////////////////////////////////////////////////////
286 
287 //---------------------------------------------------------
On_Size(wxSizeEvent & event)288 void CVIEW_Map_3D::On_Size(wxSizeEvent &event)
289 {
290 	m_pPanel->SetSize(GetClientRect());
291 
292 	event.Skip();
293 }
294 
295 
296 ///////////////////////////////////////////////////////////
297 //														 //
298 //														 //
299 //														 //
300 ///////////////////////////////////////////////////////////
301 
302 //---------------------------------------------------------
On_Command(wxCommandEvent & event)303 void CVIEW_Map_3D::On_Command(wxCommandEvent &event)
304 {
305 	switch( event.GetId() )
306 	{
307 	default:	return;
308 
309 	//-----------------------------------------------------
310 	case ID_CMD_MAP3D_PARAMETERS:
311 		{
312 			Parameters_Update(true);
313 
314 			if( DLG_Parameters(&m_Parameters) )
315 			{
316 				Parameters_Update(false);
317 			}
318 		}
319 		return;
320 
321 	//-----------------------------------------------------
322 	case ID_CMD_MAP3D_SAVE:
323 		{
324 			int				FileType;
325 			wxString		FileName;
326 			CSG_Parameters	P(_TL("Image Resolution"));
327 
328 			P.Add_Int("", "NX", _TL("Width" ), _TL(""), m_pPanel->GetSize().x, 1, true);
329 			P.Add_Int("", "NY", _TL("Height"), _TL(""), m_pPanel->GetSize().y, 1, true);
330 
331 			if( DLG_Image_Save(FileName, FileType) && DLG_Parameters(&P) )
332 			{
333 				Set_Buisy_Cursor(true);
334 
335 				if( P("NX")->asInt() == m_pPanel->GetSize().x
336 				&&  P("NY")->asInt() == m_pPanel->GetSize().y )
337 				{
338 					m_pPanel->Save_asImage(&FileName);
339 				}
340 				else
341 				{
342 					wxSize	Size(m_pPanel->GetSize());
343 
344 					Freeze();
345 					m_pPanel->SetSize(P("NX")->asInt(), P("NY")->asInt());
346 					m_pPanel->Save_asImage(&FileName);
347 					m_pPanel->SetSize(Size);
348 					Thaw();
349 				}
350 
351 				Set_Buisy_Cursor(false);
352 			}
353 		}
354 		return;
355 
356 	//-----------------------------------------------------
357 	case ID_CMD_MAP3D_SEQ_POS_EDIT:
358 		{
359 			DLG_Table(_TL("Edit 3D-View Sequencer Positions"), m_pPanel->m_Parameters("PLAY")->asTable());
360 		}
361 		return;
362 
363 	//-----------------------------------------------------
364 	case ID_CMD_MAP3D_SEQ_POS_ADD    :	m_pPanel->Play_Pos_Add();	return;
365 	case ID_CMD_MAP3D_SEQ_POS_DEL    :	m_pPanel->Play_Pos_Del();	return;
366 	case ID_CMD_MAP3D_SEQ_POS_DEL_ALL:	m_pPanel->Play_Pos_Clr();	return;
367 	case ID_CMD_MAP3D_SEQ_PLAY       :	m_pPanel->Play_Once   ();	return;
368 	case ID_CMD_MAP3D_SEQ_PLAY_LOOP  :	m_pPanel->Play_Loop   ();	return;
369 	case ID_CMD_MAP3D_SEQ_SAVE       :
370 		{
371 			int			Type;
372 			wxString	File;
373 
374 			if( DLG_Image_Save(File, Type) )
375 			{
376 				m_pPanel->m_Parameters("PLAY_FILE")->Set_Value(File.wc_str());
377 				m_pPanel->Play_Save();
378 			}
379 		}
380 		return;
381 
382 	//-----------------------------------------------------
383 	case ID_CMD_MAP3D_ROTATE_X_LESS  :	m_pPanel->Get_Projector().Inc_xRotation( 4.0 * M_DEG_TO_RAD);	break;
384 	case ID_CMD_MAP3D_ROTATE_X_MORE  :	m_pPanel->Get_Projector().Inc_xRotation(-4.0 * M_DEG_TO_RAD);	break;
385 	case ID_CMD_MAP3D_ROTATE_Y_LESS  :	m_pPanel->Get_Projector().Inc_yRotation( 4.0 * M_DEG_TO_RAD);	break;
386 	case ID_CMD_MAP3D_ROTATE_Y_MORE  :	m_pPanel->Get_Projector().Inc_yRotation(-4.0 * M_DEG_TO_RAD);	break;
387 	case ID_CMD_MAP3D_ROTATE_Z_LESS  :	m_pPanel->Get_Projector().Inc_zRotation( 4.0 * M_DEG_TO_RAD);	break;
388 	case ID_CMD_MAP3D_ROTATE_Z_MORE  :	m_pPanel->Get_Projector().Inc_zRotation(-4.0 * M_DEG_TO_RAD);	break;
389 
390 	case ID_CMD_MAP3D_SHIFT_X_LESS   :	m_pPanel->Get_Projector().Inc_xShift(-10.0);	break;
391 	case ID_CMD_MAP3D_SHIFT_X_MORE   :	m_pPanel->Get_Projector().Inc_xShift( 10.0);	break;
392 	case ID_CMD_MAP3D_SHIFT_Y_LESS   :	m_pPanel->Get_Projector().Inc_yShift( 10.0);	break;
393 	case ID_CMD_MAP3D_SHIFT_Y_MORE   :	m_pPanel->Get_Projector().Inc_yShift(-10.0);	break;
394 	case ID_CMD_MAP3D_SHIFT_Z_LESS   :	m_pPanel->Get_Projector().Inc_zShift(-10.0);	break;
395 	case ID_CMD_MAP3D_SHIFT_Z_MORE   :	m_pPanel->Get_Projector().Inc_zShift( 10.0);	break;
396 
397 	case ID_CMD_MAP3D_EXAGGERATE_LESS:	m_pPanel->m_zScale	-= 0.5;	break;
398 	case ID_CMD_MAP3D_EXAGGERATE_MORE:	m_pPanel->m_zScale	+= 0.5;	break;
399 
400 	case ID_CMD_MAP3D_CENTRAL        :	m_pPanel->Get_Projector().do_Central(m_pPanel->Get_Projector().is_Central() == false);	break;
401 	case ID_CMD_MAP3D_CENTRAL_LESS   :	m_pPanel->Get_Projector().Inc_Central_Distance( 50);	break;
402 	case ID_CMD_MAP3D_CENTRAL_MORE   :	m_pPanel->Get_Projector().Inc_Central_Distance(-50);	break;
403 
404 //	case ID_CMD_MAP3D_DRAW_BOX       :	m_pPanel->m_Parameters("DRAW_BOX"    )->Set_Value(m_pPanel->m_Parameters("DRAW_BOX"    )->asBool() ==  true    );	break;
405 	case ID_CMD_MAP3D_STEREO         :	m_pPanel->m_Parameters("STEREO"      )->Set_Value(m_pPanel->m_Parameters("STEREO"      )->asBool() == false    );	break;
406 	case ID_CMD_MAP3D_STEREO_LESS    :	m_pPanel->m_Parameters("STEREO_DIST" )->Set_Value(m_pPanel->m_Parameters("STEREO_DIST" )->asDouble() - 2       );	break;
407 	case ID_CMD_MAP3D_STEREO_MORE    :	m_pPanel->m_Parameters("STEREO_DIST" )->Set_Value(m_pPanel->m_Parameters("STEREO_DIST" )->asDouble() + 2       );	break;
408 	case ID_CMD_MAP3D_INTERPOLATED   :	m_pPanel->m_Parameters("DRAPE_MODE"  )->Set_Value(m_pPanel->m_Parameters("DRAPE_MODE"  )->asInt() == 0 ? 1 : 0 );	break;
409 
410 //	case ID_CMD_MAP3D_SRC_RES_LESS   :	m_pPanel->;	break;
411 //	case ID_CMD_MAP3D_SRC_RES_MORE   :	m_pPanel->;	break;
412 	}
413 
414 	Parameters_Update(true);
415 	m_pPanel->Update_View();
416 }
417 
418 //---------------------------------------------------------
On_Command_UI(wxUpdateUIEvent & event)419 void CVIEW_Map_3D::On_Command_UI(wxUpdateUIEvent &event)
420 {
421 	switch( event.GetId() )
422 	{
423 	case ID_CMD_MAP3D_CENTRAL:
424 		event.Check(m_pPanel->Get_Projector().is_Central());
425 		break;
426 
427 	case ID_CMD_MAP3D_CENTRAL_LESS:
428 	case ID_CMD_MAP3D_CENTRAL_MORE:
429 		event.Enable(m_pPanel->Get_Projector().is_Central());
430 		break;
431 
432 	case ID_CMD_MAP3D_INTERPOLATED:
433 		event.Check(m_pPanel->m_Parameters("DRAPE_MODE")->asInt() != 0);
434 		break;
435 
436 	case ID_CMD_MAP3D_STEREO:
437 		event.Check(m_pPanel->m_Parameters("STEREO")->asBool());
438 		break;
439 
440 	case ID_CMD_MAP3D_SEQ_PLAY:
441 		event.Check(m_pPanel->Play_Get_State() == SG_3DVIEW_PLAY_RUN_ONCE);
442 		break;
443 
444 	case ID_CMD_MAP3D_SEQ_PLAY_LOOP:
445 		event.Check(m_pPanel->Play_Get_State() == SG_3DVIEW_PLAY_RUN_LOOP);
446 		break;
447 
448 	case ID_CMD_MAP3D_SEQ_SAVE:
449 		event.Check(m_pPanel->Play_Get_State() == SG_3DVIEW_PLAY_RUN_SAVE);
450 		break;
451 	}
452 }
453 
454 
455 ///////////////////////////////////////////////////////////
456 //														 //
457 //														 //
458 //														 //
459 ///////////////////////////////////////////////////////////
460 
461 
462 ///////////////////////////////////////////////////////////
463 //														 //
464 ///////////////////////////////////////////////////////////
465 
466 //---------------------------------------------------------
Parameters_Update(bool bFromPanel)467 void CVIEW_Map_3D::Parameters_Update(bool bFromPanel)
468 {
469 	if( bFromPanel )
470 	{
471 		m_Parameters("ROTATION_X"  )->Set_Value(m_pPanel->Get_Projector().Get_xRotation() * M_RAD_TO_DEG);
472 		m_Parameters("ROTATION_Y"  )->Set_Value(m_pPanel->Get_Projector().Get_yRotation() * M_RAD_TO_DEG);
473 		m_Parameters("ROTATION_Z"  )->Set_Value(m_pPanel->Get_Projector().Get_zRotation() * M_RAD_TO_DEG);
474 
475 		m_Parameters("SHIFT_X"     )->Set_Value(m_pPanel->Get_Projector().Get_xShift());
476 		m_Parameters("SHIFT_Y"     )->Set_Value(m_pPanel->Get_Projector().Get_yShift());
477 		m_Parameters("SHIFT_Z"     )->Set_Value(m_pPanel->Get_Projector().Get_zShift());
478 
479 		m_Parameters("CENTRAL"     )->Set_Value(m_pPanel->Get_Projector().is_Central() ? 1 : 0);
480 		m_Parameters("CENTRAL_DIST")->Set_Value(m_pPanel->Get_Projector().Get_Central_Distance());
481 
482 		m_Parameters("BGCOLOR"     )->Set_Value(m_pPanel->m_Parameters("BGCOLOR"    ));
483 		m_Parameters("STEREO"      )->Set_Value(m_pPanel->m_Parameters("STEREO"     ));
484 		m_Parameters("STEREO_DIST" )->Set_Value(m_pPanel->m_Parameters("STEREO_DIST"));
485 		m_Parameters("DRAW_BOX"    )->Set_Value(m_pPanel->m_Parameters("DRAW_BOX"   ));
486 
487 		m_Parameters("Z_SCALE"     )->Set_Value(m_pPanel->m_zScale);
488 		m_Parameters("DEM_RES"     )->Set_Value(m_pPanel->Get_DEM_Res());
489 		m_Parameters("MAP_RES"     )->Set_Value(m_pPanel->Get_Map_Res());
490 	}
491 
492 	//-----------------------------------------------------
493 	else
494 	{
495 		m_pPanel->Get_Projector().Set_Rotation(
496 			m_Parameters("ROTATION_X")->asDouble() * M_DEG_TO_RAD,
497 			m_Parameters("ROTATION_Y")->asDouble() * M_DEG_TO_RAD,
498 			m_Parameters("ROTATION_Z")->asDouble() * M_DEG_TO_RAD
499 		);
500 
501 		m_pPanel->Get_Projector().Set_Shift(
502 			m_Parameters("SHIFT_X"   )->asDouble(),
503 			m_Parameters("SHIFT_Y"   )->asDouble(),
504 			m_Parameters("SHIFT_Z"   )->asDouble()
505 		);
506 
507 		m_pPanel->Get_Projector().do_Central          (m_Parameters("CENTRAL"     )->asBool  ());
508 		m_pPanel->Get_Projector().Set_Central_Distance(m_Parameters("CENTRAL_DIST")->asDouble());
509 
510 		m_pPanel->m_Parameters("BGCOLOR"    )->Set_Value(m_Parameters("BGCOLOR"    ));
511 		m_pPanel->m_Parameters("STEREO"     )->Set_Value(m_Parameters("STEREO"     ));
512 		m_pPanel->m_Parameters("STEREO_DIST")->Set_Value(m_Parameters("STEREO_DIST"));
513 		m_pPanel->m_Parameters("DRAPE_MODE" )->Set_Value(m_Parameters("DRAPE_MODE" ));
514 		m_pPanel->m_Parameters("DRAW_BOX"   )->Set_Value(m_Parameters("DRAW_BOX"   ));
515 
516 		m_pPanel->m_zScale	= m_Parameters("Z_SCALE")->asDouble();
517 
518 		//-------------------------------------------------
519 		CSG_Grid	*pDEM	= m_Parameters("DEM")->asGrid();
520 
521 		if( !m_pPanel->Set_Options(
522 			SG_Get_Data_Manager().Exists(pDEM) ? pDEM : NULL,
523 			m_Parameters("DEM_RES")->asInt(),
524 			m_Parameters("MAP_RES")->asInt()) )
525 		{
526 			m_pPanel->Update_View();
527 		}
528 	}
529 
530 	Update_StatusBar();
531 }
532 
533 //---------------------------------------------------------
Parameters_Create(void)534 void CVIEW_Map_3D::Parameters_Create(void)
535 {
536 	m_Parameters.Create(_TL("3D-View"));
537 
538 	m_Parameters.Add_Grid  (""   , "DEM"     , _TL("Elevation"   ), _TL(""), PARAMETER_INPUT);
539 	m_Parameters.Add_Int   ("DEM", "DEM_RES" , _TL("Resolution"  ), _TL(""), 100, 2, true);
540 	m_Parameters.Add_Double("DEM", "Z_SCALE" , _TL("Exaggeration"), _TL(""), 1.0);
541 	m_Parameters.Add_Bool  ("DEM", "DRAW_BOX", _TL("Bounding Box"), _TL(""), false);
542 
543 	m_Parameters.Add_Node  (""   , "MAP"       , _TL("Map"                      ), _TL(""));
544 	m_Parameters.Add_Int   ("MAP", "MAP_RES"   , _TL("Resolution"               ), _TL(""), 1000, 2, true);
545 	m_Parameters.Add_Choice("MAP", "DRAPE_MODE", _TL("Map Draping Interpolation"), _TL(""),
546 		CSG_String::Format("%s|%s|%s|%s|%s",
547 			_TL("None"),
548 			_TL("Bilinear"),
549 			_TL("Inverse Distance"),
550 			_TL("Bicubic Spline"),
551 			_TL("B-Spline")
552 		), 0
553 	);
554 
555 	m_Parameters.Add_Node  (""        , "ROTATION"  , _TL("Rotation"  ), _TL(""));
556 	m_Parameters.Add_Double("ROTATION", "ROTATION_X", _TL("X"         ), _TL(""),  55.0, -360.0, true, 360.0, true);
557 	m_Parameters.Add_Double("ROTATION", "ROTATION_Y", _TL("Y"         ), _TL(""),   0.0, -360.0, true, 360.0, true);
558 	m_Parameters.Add_Double("ROTATION", "ROTATION_Z", _TL("Z"         ), _TL(""), -45.0, -360.0, true, 360.0, true);
559 
560 	m_Parameters.Add_Node  (""        , "SHIFT"     , _TL("Shift"     ), _TL(""));
561 	m_Parameters.Add_Double("SHIFT"   , "SHIFT_X"   , _TL("Left/Right"), _TL(""),    0.0);
562 	m_Parameters.Add_Double("SHIFT"   , "SHIFT_Y"   , _TL("Up/Down"   ), _TL(""),    0.0);
563 	m_Parameters.Add_Double("SHIFT"   , "SHIFT_Z"   , _TL("In/Out"    ), _TL(""), 1500.0);
564 
565 	m_Parameters.Add_Choice(""        , "CENTRAL"     , _TL("Projection"           ), _TL(""), CSG_String::Format("%s|%s|", _TL("parallel"), _TL("central")), 1);
566 	m_Parameters.Add_Double("CENTRAL" , "CENTRAL_DIST", _TL("Perspectivic Distance"), _TL(""), 1500, 1, true);
567 
568 	m_Parameters.Add_Bool  (""        , "STEREO"     , _TL("Anaglyph"             ), _TL(""), false);
569 	m_Parameters.Add_Double("STEREO"  , "STEREO_DIST", _TL("Eye Distance [Degree]"), _TL(""), 2.0, 0, true, 180, true);
570 
571 	m_Parameters.Add_Color("", "BGCOLOR", _TL("Background Color"), _TL(""), SG_GET_RGB(255, 255, 255));
572 }
573 
574 
575 ///////////////////////////////////////////////////////////
576 //														 //
577 //														 //
578 //														 //
579 ///////////////////////////////////////////////////////////
580 
581 //---------------------------------------------------------
582