"Fossies" - the Fresh Open Source Software Archive

Member "saga-9.0.2/saga-gis/src/tools/visualization/vis_3d_viewer/3d_viewer_tin.cpp" (25 May 2023, 22942 Bytes) of package /linux/misc/saga-9.0.2.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 
    2 ///////////////////////////////////////////////////////////
    3 //                                                       //
    4 //                         SAGA                          //
    5 //                                                       //
    6 //      System for Automated Geoscientific Analyses      //
    7 //                                                       //
    8 //                     Tool Library                      //
    9 //                       3d_viewer                       //
   10 //                                                       //
   11 //-------------------------------------------------------//
   12 //                                                       //
   13 //                   3d_viewer_tin.cpp                   //
   14 //                                                       //
   15 //                 Copyright (C) 2014 by                 //
   16 //                      Olaf Conrad                      //
   17 //                                                       //
   18 //-------------------------------------------------------//
   19 //                                                       //
   20 // This file is part of 'SAGA - System for Automated     //
   21 // Geoscientific Analyses'. SAGA is free software; you   //
   22 // can redistribute it and/or modify it under the terms  //
   23 // of the GNU General Public License as published by the //
   24 // Free Software Foundation, either version 2 of the     //
   25 // License, or (at your option) any later version.       //
   26 //                                                       //
   27 // SAGA is distributed in the hope that it will be       //
   28 // useful, but WITHOUT ANY WARRANTY; without even the    //
   29 // implied warranty of MERCHANTABILITY or FITNESS FOR A  //
   30 // PARTICULAR PURPOSE. See the GNU General Public        //
   31 // License for more details.                             //
   32 //                                                       //
   33 // You should have received a copy of the GNU General    //
   34 // Public License along with this program; if not, see   //
   35 // <http://www.gnu.org/licenses/>.                       //
   36 //                                                       //
   37 //-------------------------------------------------------//
   38 //                                                       //
   39 //    e-mail:     oconrad@saga-gis.org                   //
   40 //                                                       //
   41 //    contact:    Olaf Conrad                            //
   42 //                Institute of Geography                 //
   43 //                University of Hamburg                  //
   44 //                Germany                                //
   45 //                                                       //
   46 ///////////////////////////////////////////////////////////
   47 
   48 //---------------------------------------------------------
   49 #include <wx/menu.h>
   50 
   51 #include "3d_viewer_tin.h"
   52 
   53 
   54 ///////////////////////////////////////////////////////////
   55 //                                                       //
   56 //                                                       //
   57 //                                                       //
   58 ///////////////////////////////////////////////////////////
   59 
   60 //---------------------------------------------------------
   61 class C3D_Viewer_TIN_Panel : public CSG_3DView_Panel
   62 {
   63 public:
   64     C3D_Viewer_TIN_Panel(wxWindow *pParent, CSG_TIN *pTIN, int Field_Z, int Field_Color, CSG_Grid *pDrape);
   65 
   66     static CSG_String           Get_Usage               (void);
   67 
   68 
   69 protected:
   70 
   71     virtual int                 On_Parameters_Enable    (CSG_Parameters *pParameters, CSG_Parameter *pParameter);
   72 
   73     virtual void                Update_Statistics       (void);
   74 
   75     virtual void                On_Key_Down             (wxKeyEvent   &event);
   76 
   77     virtual bool                On_Draw                 (void);
   78 
   79     virtual int                 Get_Color               (double Value);
   80 
   81 
   82 private:
   83 
   84     bool                        m_Color_bGrad;
   85 
   86     double                      m_Color_Min, m_Color_Scale;
   87 
   88     CSG_Colors                  m_Colors;
   89 
   90     CSG_TIN                     *m_pTIN;
   91 
   92 
   93     //-----------------------------------------------------
   94     DECLARE_EVENT_TABLE()
   95 
   96 };
   97 
   98 
   99 ///////////////////////////////////////////////////////////
  100 //                                                       //
  101 ///////////////////////////////////////////////////////////
  102 
  103 //---------------------------------------------------------
  104 BEGIN_EVENT_TABLE(C3D_Viewer_TIN_Panel, CSG_3DView_Panel)
  105     EVT_KEY_DOWN    (C3D_Viewer_TIN_Panel::On_Key_Down)
  106 END_EVENT_TABLE()
  107 
  108 
  109 ///////////////////////////////////////////////////////////
  110 //                                                       //
  111 ///////////////////////////////////////////////////////////
  112 
  113 //---------------------------------------------------------
  114 C3D_Viewer_TIN_Panel::C3D_Viewer_TIN_Panel(wxWindow *pParent, CSG_TIN *pTIN, int zField, int cField, CSG_Grid *pDrape)
  115     : CSG_3DView_Panel(pParent, pDrape)
  116 {
  117     m_pTIN = pTIN;
  118 
  119     //-----------------------------------------------------
  120     CSG_String Attributes;
  121 
  122     for(int i=0; i<pTIN->Get_Field_Count(); i++)
  123     {
  124         Attributes += pTIN->Get_Field_Name(i); Attributes += "|";
  125     }
  126 
  127     m_Parameters.Add_Choice("GENERAL"       , "Z_ATTR"        , _TL("Z Attribute"     ), _TL(""), Attributes, zField);
  128 
  129     m_Parameters.Add_Bool  ("GENERAL"       , "DRAW_FACES"    , _TL("Draw Faces"      ), _TL(""), true);
  130 
  131     m_Parameters.Add_Choice("DRAW_FACES"    , "COLORS_ATTR"   , _TL("Colour Attribute"), _TL(""), Attributes, cField);
  132     m_Parameters.Add_Colors("COLORS_ATTR"   , "COLORS"        , _TL("Colours"         ), _TL(""));
  133     m_Parameters.Add_Bool  ("COLORS_ATTR"   , "COLORS_GRAD"   , _TL("Graduated"       ), _TL(""), true);
  134     m_Parameters.Add_Range ("COLORS_ATTR"   , "COLORS_RANGE"  , _TL("Value Range"     ), _TL(""));
  135 
  136     m_Parameters.Add_Choice("DRAW_FACES"    , "SHADING"       , _TL("Light Source"    ), _TL(""), CSG_String::Format("%s|%s", _TL("no"), _TL("yes")), 1);
  137     m_Parameters.Add_Double("SHADING"       , "SHADE_DEC"     , _TL("Height"          ), _TL(""), 45., -180., true, 180., true);
  138     m_Parameters.Add_Double("SHADING"       , "SHADE_AZI"     , _TL("Direction"       ), _TL(""), 90., -180., true, 180., true);
  139 
  140     m_Parameters.Add_Bool  ("GENERAL"       , "DRAW_EDGES"    , _TL("Draw Wire"       ), _TL(""), false);
  141     m_Parameters.Add_Bool  ("DRAW_EDGES"    , "EDGE_COLOR_UNI", _TL("Single Color"    ), _TL(""), false);
  142     m_Parameters.Add_Color ("EDGE_COLOR_UNI", "EDGE_COLOR"    , _TL("Color"           ), _TL(""), SG_GET_RGB(150, 150, 150));
  143 
  144     m_Parameters.Add_Bool  ("GENERAL"       , "DRAW_NODES"    , _TL("Draw Nodes"      ), _TL(""), false);
  145     m_Parameters.Add_Color ("DRAW_NODES"    , "NODE_COLOR"    , _TL("Color"           ), _TL(""), SG_COLOR_BLACK);
  146     m_Parameters.Add_Int   ("DRAW_NODES"    , "NODE_SIZE"     , _TL("Size"            ), _TL(""), 2, 1, true);
  147     m_Parameters.Add_Double("DRAW_NODES"    , "NODE_SCALE"    , _TL("Size Scaling"    ), _TL(""), 250., 1., true);
  148 
  149     //-----------------------------------------------------
  150     Update_Statistics();
  151 }
  152 
  153 
  154 ///////////////////////////////////////////////////////////
  155 //                                                       //
  156 ///////////////////////////////////////////////////////////
  157 
  158 //---------------------------------------------------------
  159 int C3D_Viewer_TIN_Panel::On_Parameters_Enable(CSG_Parameters *pParameters, CSG_Parameter *pParameter)
  160 {
  161     if( pParameter->Cmp_Identifier("DRAW_FACES") )
  162     {
  163         CSG_Parameter *pDrape = pParameters->Get_Parameter("MAP_DRAPE");
  164 
  165         pParameters->Set_Enabled("COLORS_ATTR"   , pParameter->asBool() && (!pDrape || !pDrape->asBool()));
  166         pParameters->Set_Enabled("SHADING"       , pParameter->asBool());
  167     }
  168 
  169     if( pParameter->Cmp_Identifier("MAP_DRAPE") )
  170     {
  171         CSG_Parameter *pFaces = pParameters->Get_Parameter("DRAW_FACES");
  172 
  173         pParameters->Set_Enabled("COLORS_ATTR"   , pParameter->asBool() == false && pFaces->asBool() == true);
  174     }
  175 
  176     if( pParameter->Cmp_Identifier("SHADING") )
  177     {
  178         pParameter->Set_Children_Enabled(pParameter->asInt() > 0);
  179     }
  180 
  181     if( pParameter->Cmp_Identifier("DRAW_EDGES") )
  182     {
  183         pParameters->Set_Enabled("EDGE_COLOR_UNI", pParameter->asBool());
  184     }
  185 
  186     if( pParameter->Cmp_Identifier("EDGE_COLOR_UNI") )
  187     {
  188         pParameters->Set_Enabled("EDGE_COLOR"   , pParameter->asBool());
  189     }
  190 
  191     if( pParameter->Cmp_Identifier("DRAW_NODES") )
  192     {
  193         pParameters->Set_Enabled("NODE_COLOR"   , pParameter->asBool());
  194         pParameters->Set_Enabled("NODE_SIZE"    , pParameter->asBool());
  195         pParameters->Set_Enabled("NODE_SCALE"   , pParameter->asBool());
  196     }
  197 
  198     return( CSG_3DView_Panel::On_Parameters_Enable(pParameters, pParameter) );
  199 }
  200 
  201 
  202 ///////////////////////////////////////////////////////////
  203 //                                                       //
  204 ///////////////////////////////////////////////////////////
  205 
  206 //---------------------------------------------------------
  207 void C3D_Viewer_TIN_Panel::Update_Statistics(void)
  208 {
  209     int Field = m_Parameters("COLORS_ATTR")->asInt();
  210 
  211     m_Parameters("COLORS_RANGE")->asRange()->Set_Range(
  212         m_pTIN->Get_Mean(Field) - 1.5 * m_pTIN->Get_StdDev(Field),
  213         m_pTIN->Get_Mean(Field) + 1.5 * m_pTIN->Get_StdDev(Field)
  214     );
  215 
  216     m_Data_Min.x = m_pTIN->Get_Extent().Get_XMin();
  217     m_Data_Max.x = m_pTIN->Get_Extent().Get_XMax();
  218 
  219     m_Data_Min.y = m_pTIN->Get_Extent().Get_YMin();
  220     m_Data_Max.y = m_pTIN->Get_Extent().Get_YMax();
  221 
  222     m_Data_Min.z = m_pTIN->Get_Minimum(m_Parameters("Z_ATTR")->asInt());
  223     m_Data_Max.z = m_pTIN->Get_Maximum(m_Parameters("Z_ATTR")->asInt());
  224 
  225     Update_View();
  226 }
  227 
  228 
  229 ///////////////////////////////////////////////////////////
  230 //                                                       //
  231 ///////////////////////////////////////////////////////////
  232 
  233 //---------------------------------------------------------
  234 CSG_String C3D_Viewer_TIN_Panel::Get_Usage(void)
  235 {
  236     CSG_Table Shortcuts(CSG_3DView_Panel::Get_Shortcuts());
  237 
  238     #define ADD_SHORTCUT(KEY, CMD) { CSG_Table_Record &r = *Shortcuts.Add_Record(); r.Set_Value(0, KEY); r.Set_Value(1, CMD); }
  239 
  240     ADD_SHORTCUT("F3", _TL("Decrease Size"        ));
  241     ADD_SHORTCUT("F4", _TL("Increase Size"        ));
  242 
  243     ADD_SHORTCUT("F5", _TL("Decrease Size Scaling"));
  244     ADD_SHORTCUT("F6", _TL("Increase Size Scaling"));
  245 
  246     return( CSG_3DView_Panel::Get_Usage(Shortcuts) );
  247 }
  248 
  249 //---------------------------------------------------------
  250 void C3D_Viewer_TIN_Panel::On_Key_Down(wxKeyEvent &event)
  251 {
  252     switch( event.GetKeyCode() )
  253     {
  254     default: CSG_3DView_Panel::On_Key_Down(event); return;
  255 
  256     case WXK_F3: Parameter_Value_Add("NODE_SIZE" ,  -1.); break;
  257     case WXK_F4: Parameter_Value_Add("NODE_SIZE" ,   1.); break;
  258 
  259     case WXK_F5: Parameter_Value_Add("NODE_SCALE", -10.); break;
  260     case WXK_F6: Parameter_Value_Add("NODE_SCALE",  10.); break;
  261     }
  262 }
  263 
  264 
  265 ///////////////////////////////////////////////////////////
  266 //                                                       //
  267 ///////////////////////////////////////////////////////////
  268 
  269 //---------------------------------------------------------
  270 int C3D_Viewer_TIN_Panel::Get_Color(double Value)
  271 {
  272     if( m_Color_Scale <= 0. )
  273     {
  274         return( (int)Value );
  275     }
  276 
  277     double c = m_Color_Scale * (Value - m_Color_Min);
  278 
  279     return( m_Color_bGrad ? m_Colors.Get_Interpolated(c) : m_Colors[(int)c] );
  280 }
  281 
  282 
  283 ///////////////////////////////////////////////////////////
  284 //                                                       //
  285 ///////////////////////////////////////////////////////////
  286 
  287 //---------------------------------------------------------
  288 bool C3D_Viewer_TIN_Panel::On_Draw(void)
  289 {
  290     int zField = m_Parameters("Z_ATTR"     )->asInt();
  291     int cField = m_Parameters("COLORS_ATTR")->asInt();
  292 
  293     if( m_Parameters("COLORS_RANGE")->asRange()->Get_Min()
  294     >=  m_Parameters("COLORS_RANGE")->asRange()->Get_Max() )
  295     {
  296         m_Parameters("COLORS_RANGE")->asRange()->Set_Range(
  297             m_pTIN->Get_Mean(cField) - 1.5 * m_pTIN->Get_StdDev(cField),
  298             m_pTIN->Get_Mean(cField) + 1.5 * m_pTIN->Get_StdDev(cField)
  299         );
  300     }
  301 
  302     m_Colors      = *m_Parameters("COLORS")->asColors();
  303     m_Color_bGrad = m_Parameters("COLORS_GRAD")->asBool();
  304     m_Color_Min   = m_Parameters("COLORS_RANGE")->asRange()->Get_Min();
  305     m_Color_Scale = m_Colors.Get_Count() / (m_Parameters("COLORS_RANGE")->asRange()->Get_Max() - m_Color_Min);
  306 
  307     //-----------------------------------------------------
  308     if( m_Parameters("DRAW_FACES")->asBool() )  // Face
  309     {
  310         bool bDrape = m_Parameters("MAP_DRAPE") && m_Parameters("MAP_DRAPE")->asBool();
  311 
  312         CSG_Vector LightSource;
  313 
  314         if( m_Parameters("SHADING")->asInt() && LightSource.Create(3) )
  315         {
  316             double decline = m_Parameters("SHADE_DEC")->asDouble() * -M_DEG_TO_RAD;
  317             double azimuth = m_Parameters("SHADE_AZI")->asDouble() *  M_DEG_TO_RAD;
  318 
  319             LightSource[0] = sin(decline) * cos(azimuth);
  320             LightSource[1] = sin(decline) * sin(azimuth);
  321             LightSource[2] = cos(decline);
  322         }
  323 
  324         #pragma omp parallel for
  325         for(sLong iTriangle=0; iTriangle<m_pTIN->Get_Triangle_Count(); iTriangle++)
  326         {
  327             CSG_TIN_Triangle *pTriangle = m_pTIN->Get_Triangle(iTriangle); TSG_Triangle_Node p[3];
  328 
  329             for(int i=0; i<3; i++)
  330             {
  331                 CSG_TIN_Node *pNode = pTriangle->Get_Node(i);
  332 
  333                 p[i].x = pNode->Get_Point().x;
  334                 p[i].y = pNode->Get_Point().y;
  335                 p[i].z = pNode->asDouble(zField);
  336 
  337                 if( bDrape )
  338                 {
  339                     p[i].c = pNode->Get_Point().x;
  340                     p[i].d = pNode->Get_Point().y;
  341                 }
  342                 else
  343                 {
  344                     p[i].c = pNode->asDouble(cField);
  345                 }
  346 
  347                 m_Projector.Get_Projection(p[i].x, p[i].y, p[i].z);
  348             }
  349 
  350             //---------------------------------------------
  351             if( LightSource.Get_Size() )
  352                 Draw_Triangle(p, false, LightSource);
  353             else
  354                 Draw_Triangle(p, false);
  355         }
  356     }
  357 
  358     //-----------------------------------------------------
  359     if( m_Parameters("DRAW_EDGES")->asBool() )  // Edges
  360     {
  361         bool bColor = m_Parameters("EDGE_COLOR_UNI")->asBool();
  362         int  Color  = m_Parameters("EDGE_COLOR"    )->asColor();
  363 
  364         #pragma omp parallel for
  365         for(sLong iEdge=0; iEdge<m_pTIN->Get_Edge_Count(); iEdge++)
  366         {
  367             CSG_TIN_Edge *pEdge = m_pTIN->Get_Edge(iEdge); TSG_Triangle_Node p[2];
  368 
  369             for(int i=0; i<2; i++)
  370             {
  371                 CSG_TIN_Node *pNode = pEdge->Get_Node(i);
  372 
  373                 p[i].x = pNode->Get_Point().x;
  374                 p[i].y = pNode->Get_Point().y;
  375                 p[i].z = pNode->asDouble(zField);
  376                 p[i].c = Get_Color(pNode->asDouble(cField));
  377 
  378                 m_Projector.Get_Projection(p[i].x, p[i].y, p[i].z);
  379             }
  380 
  381             //---------------------------------------------
  382             if( bColor )
  383             {
  384                 Draw_Line(p[0].x, p[0].y, p[0].z, p[1].x, p[1].y, p[1].z, Color);
  385             }
  386             else
  387             {
  388                 Draw_Line(p[0].x, p[0].y, p[0].z, p[1].x, p[1].y, p[1].z, p[0].c, p[1].c);
  389             }
  390         }
  391     }
  392 
  393     //-------------------------------------------------
  394     if( m_Parameters("DRAW_NODES")->asBool() )  // Nodes
  395     {
  396         int Color = m_Parameters("NODE_COLOR")->asColor ();
  397         int Size  = m_Parameters("NODE_SIZE" )->asInt   ();
  398 
  399         #pragma omp parallel for
  400         for(sLong iNode=0; iNode<m_pTIN->Get_Node_Count(); iNode++)
  401         {
  402             CSG_TIN_Node *pNode = m_pTIN->Get_Node(iNode); TSG_Point_3D p;
  403 
  404             p.x = pNode->Get_Point().x;
  405             p.y = pNode->Get_Point().y;
  406             p.z = pNode->asDouble(zField);
  407 
  408             m_Projector.Get_Projection(p.x, p.y, p.z);
  409 
  410             Draw_Point(p.x, p.y, p.z, Color, Size);
  411         }
  412     }
  413 
  414     //-----------------------------------------------------
  415     return( true );
  416 }
  417 
  418 
  419 ///////////////////////////////////////////////////////////
  420 //                                                       //
  421 //                                                       //
  422 //                                                       //
  423 ///////////////////////////////////////////////////////////
  424 
  425 //---------------------------------------------------------
  426 class C3D_Viewer_TIN_Dialog : public CSG_3DView_Dialog
  427 {
  428 public:
  429     C3D_Viewer_TIN_Dialog(CSG_TIN *pTIN, int Field_Z, int Field_Color, CSG_Grid *pDrape);
  430 
  431     virtual void                Update_Controls         (void);
  432 
  433 
  434 protected:
  435 
  436 //  wxCheckBox                  *m_pFaces, *m_pEdges, *m_pNodes;
  437 
  438     wxChoice                    *m_pField_Z, *m_pField_C;
  439 
  440     CSGDI_Slider                *m_pShade[2];
  441 
  442 
  443     virtual void                On_Update_Choices       (wxCommandEvent &event);
  444     virtual void                On_Update_Control       (wxCommandEvent &event);
  445 
  446     virtual void                Set_Menu                (wxMenu &Menu);
  447     virtual void                On_Menu                 (wxCommandEvent &event);
  448     virtual void                On_Menu_UI              (wxUpdateUIEvent &event);
  449 
  450 
  451     //-----------------------------------------------------
  452     DECLARE_EVENT_TABLE()
  453 };
  454 
  455 //---------------------------------------------------------
  456 BEGIN_EVENT_TABLE(C3D_Viewer_TIN_Dialog, CSG_3DView_Dialog)
  457     EVT_CHOICE         (wxID_ANY, C3D_Viewer_TIN_Dialog::On_Update_Choices)
  458 //  EVT_CHECKBOX       (wxID_ANY, C3D_Viewer_TIN_Dialog::On_Update_Control)
  459     EVT_MENU_RANGE     (MENU_USER_FIRST, MENU_USER_LAST, C3D_Viewer_TIN_Dialog::On_Menu)
  460     EVT_UPDATE_UI_RANGE(MENU_USER_FIRST, MENU_USER_LAST, C3D_Viewer_TIN_Dialog::On_Menu_UI)
  461 END_EVENT_TABLE()
  462 
  463 //---------------------------------------------------------
  464 C3D_Viewer_TIN_Dialog::C3D_Viewer_TIN_Dialog(CSG_TIN *pTIN, int Field_Z, int Field_Color, CSG_Grid *pDrape)
  465     : CSG_3DView_Dialog(_TL("TIN Viewer"))
  466 {
  467     Create(new C3D_Viewer_TIN_Panel(this, pTIN, Field_Z, Field_Color, pDrape));
  468 
  469     wxArrayString Attributes;
  470 
  471     for(int i=0; i<pTIN->Get_Field_Count(); i++)
  472     {
  473         Attributes.Add(pTIN->Get_Field_Name(i));
  474     }
  475 
  476     Add_Spacer();
  477     m_pField_Z  = Add_Choice  (_TL("Elevation"), Attributes, Field_Z    );
  478     m_pField_C  = Add_Choice  (_TL("Colour"   ), Attributes, Field_Color);
  479 
  480     Add_Spacer();
  481     m_pShade[0] = Add_Slider  (_TL("Light Source Height"   ), m_pPanel->m_Parameters("SHADE_DEC")->asDouble(), -180., 180.);
  482     m_pShade[1] = Add_Slider  (_TL("Light Source Direction"), m_pPanel->m_Parameters("SHADE_AZI")->asDouble(), -180., 180.);
  483 
  484 //  Add_Spacer();
  485 //  m_pFaces    = Add_CheckBox(_TL("Faces"), m_pPanel->m_Parameters("DRAW_FACES")->asBool());
  486 //  m_pEdges    = Add_CheckBox(_TL("Edges"), m_pPanel->m_Parameters("DRAW_EDGES")->asBool());
  487 //  m_pNodes    = Add_CheckBox(_TL("Nodes"), m_pPanel->m_Parameters("DRAW_NODES")->asBool());
  488 }
  489 
  490 //---------------------------------------------------------
  491 void C3D_Viewer_TIN_Dialog::On_Update_Choices(wxCommandEvent &event)
  492 {
  493     if( event.GetEventObject() == m_pField_Z )
  494     {
  495         m_pPanel->m_Parameters("Z_ATTR")->Set_Value(m_pField_Z->GetSelection()); m_pPanel->Update_View(true);
  496     }
  497 
  498     if( event.GetEventObject() == m_pField_C )
  499     {
  500         m_pPanel->m_Parameters("COLORS_ATTR")->Set_Value(m_pField_C->GetSelection()); m_pPanel->Update_View(true);
  501     }
  502 
  503     CSG_3DView_Dialog::On_Update_Choices(event);
  504 }
  505 
  506 //---------------------------------------------------------
  507 void C3D_Viewer_TIN_Dialog::On_Update_Control(wxCommandEvent &event)
  508 {
  509     if( event.GetEventObject() == m_pShade[0] ) { m_pPanel->m_Parameters.Set_Parameter("SHADE_DEC", m_pShade[0]->Get_Value()); m_pPanel->Update_View(); }
  510     if( event.GetEventObject() == m_pShade[1] ) { m_pPanel->m_Parameters.Set_Parameter("SHADE_AZI", m_pShade[1]->Get_Value()); m_pPanel->Update_View(); }
  511 
  512 //  CHECKBOX_UPDATE(m_pFaces, "DRAW_FACES");
  513 //  CHECKBOX_UPDATE(m_pEdges, "DRAW_EDGES");
  514 //  CHECKBOX_UPDATE(m_pNodes, "DRAW_NODES");
  515 
  516     CSG_3DView_Dialog::On_Update_Control(event);
  517 }
  518 
  519 //---------------------------------------------------------
  520 void C3D_Viewer_TIN_Dialog::Update_Controls(void)
  521 {
  522     m_pField_Z->SetSelection(m_pPanel->m_Parameters("Z_ATTR"     )->asInt   ());
  523     m_pField_C->SetSelection(m_pPanel->m_Parameters("COLORS_ATTR")->asInt   ());
  524 
  525     m_pShade[0]->Set_Value  (m_pPanel->m_Parameters("SHADE_DEC"  )->asDouble());
  526     m_pShade[1]->Set_Value  (m_pPanel->m_Parameters("SHADE_AZI"  )->asDouble());
  527 
  528 //  m_pFaces->SetValue(m_pPanel->m_Parameters("DRAW_FACES")->asBool());
  529 //  m_pEdges->SetValue(m_pPanel->m_Parameters("DRAW_EDGES")->asBool());
  530 //  m_pNodes->SetValue(m_pPanel->m_Parameters("DRAW_NODES")->asBool());
  531 
  532     CSG_3DView_Dialog::Update_Controls();
  533 }
  534 
  535 //---------------------------------------------------------
  536 enum
  537 {
  538     MENU_SCALE_Z_DEC = MENU_USER_FIRST,
  539     MENU_SCALE_Z_INC,
  540     MENU_COLORS_GRAD,
  541     MENU_SHADING,
  542     MENU_FACES,
  543     MENU_EDGES,
  544     MENU_NODES
  545 };
  546 
  547 //---------------------------------------------------------
  548 void C3D_Viewer_TIN_Dialog::Set_Menu(wxMenu &Menu)
  549 {
  550     wxMenu  *pMenu  = Menu.FindChildItem(Menu.FindItem(_TL("Display")))->GetSubMenu();
  551 
  552     pMenu->AppendSeparator();
  553     pMenu->Append(MENU_SCALE_Z_DEC, _TL("Decrease Exaggeration [F1]"));
  554     pMenu->Append(MENU_SCALE_Z_INC, _TL("Increase Exaggeration [F2]"));
  555 
  556     pMenu->AppendSeparator();
  557     pMenu->AppendCheckItem(MENU_COLORS_GRAD, _TL("Graduated Colours"));
  558 
  559     Menu.AppendSeparator();
  560     Menu.AppendCheckItem(MENU_SHADING, _TL("Shading"));
  561 
  562     Menu.AppendSeparator();
  563     Menu.AppendCheckItem(MENU_FACES, _TL("Faces"));
  564     Menu.AppendCheckItem(MENU_EDGES, _TL("Edges"));
  565     Menu.AppendCheckItem(MENU_NODES, _TL("Nodes"));
  566 }
  567 
  568 //---------------------------------------------------------
  569 void C3D_Viewer_TIN_Dialog::On_Menu(wxCommandEvent &event)
  570 {
  571     switch( event.GetId() )
  572     {
  573     default: CSG_3DView_Dialog::On_Menu(event); break;
  574 
  575     case MENU_USAGE      : SG_UI_Dlg_Info(C3D_Viewer_TIN_Panel::Get_Usage(), _TL("Usage")); return;
  576 
  577     case MENU_SCALE_Z_DEC: m_pPanel->Parameter_Value_Add("Z_SCALE",  -0.5); break;
  578     case MENU_SCALE_Z_INC: m_pPanel->Parameter_Value_Add("Z_SCALE",   0.5); break;
  579 
  580     case MENU_COLORS_GRAD: m_pPanel->Parameter_Value_Toggle("COLORS_GRAD"); break;
  581 
  582     case MENU_SHADING    : m_pPanel->Parameter_Value_Toggle("SHADING"    ); break;
  583 
  584     case MENU_FACES      : m_pPanel->Parameter_Value_Toggle("DRAW_FACES" ); break;
  585     case MENU_EDGES      : m_pPanel->Parameter_Value_Toggle("DRAW_EDGES" ); break;
  586     case MENU_NODES      : m_pPanel->Parameter_Value_Toggle("DRAW_NODES" ); break;
  587     }
  588 }
  589 
  590 //---------------------------------------------------------
  591 void C3D_Viewer_TIN_Dialog::On_Menu_UI(wxUpdateUIEvent &event)
  592 {
  593     switch( event.GetId() )
  594     {
  595     default: 
  596         CSG_3DView_Dialog::On_Menu_UI(event);
  597         break;
  598 
  599     case MENU_COLORS_GRAD: event.Check(m_pPanel->m_Parameters("COLORS_GRAD")->asBool()); break;
  600 
  601     case MENU_SHADING    : event.Check(m_pPanel->m_Parameters("SHADING"    )->asBool()); break;
  602 
  603     case MENU_FACES      : event.Check(m_pPanel->m_Parameters("DRAW_FACES" )->asBool()); break;
  604     case MENU_EDGES      : event.Check(m_pPanel->m_Parameters("DRAW_EDGES" )->asBool()); break;
  605     case MENU_NODES      : event.Check(m_pPanel->m_Parameters("DRAW_NODES" )->asBool()); break;
  606     }
  607 }
  608 
  609 
  610 ///////////////////////////////////////////////////////////
  611 //                                                       //
  612 //                                                       //
  613 //                                                       //
  614 ///////////////////////////////////////////////////////////
  615 
  616 //---------------------------------------------------------
  617 C3D_Viewer_TIN::C3D_Viewer_TIN(void)
  618 {
  619     Set_Name        (_TL("TIN Viewer"));
  620 
  621     Set_Author      ("O.Conrad (c) 2014");
  622 
  623     Set_Description (_TW(
  624         "3D viewer for TIN."
  625     ));
  626 
  627     Set_Description(Get_Description() + C3D_Viewer_TIN_Panel::Get_Usage());
  628 
  629     //-----------------------------------------------------
  630     Parameters.Add_TIN("",
  631         "TIN"       , _TL("TIN"),
  632         _TL(""),
  633         PARAMETER_INPUT
  634     );
  635 
  636     Parameters.Add_Table_Field("TIN",
  637         "HEIGHT"    , _TL("Elevation"),
  638         _TL("")
  639     );
  640 
  641     Parameters.Add_Table_Field("TIN",
  642         "COLOR"     , _TL("Color"),
  643         _TL("")
  644     );
  645 
  646     Parameters.Add_Grid("",
  647         "DRAPE"     , _TL("Map"),
  648         _TL("rgb coded raster map to be draped"),
  649         PARAMETER_INPUT_OPTIONAL
  650     );
  651 }
  652 
  653 
  654 ///////////////////////////////////////////////////////////
  655 //                                                       //
  656 ///////////////////////////////////////////////////////////
  657 
  658 //---------------------------------------------------------
  659 bool C3D_Viewer_TIN::On_Execute(void)
  660 {
  661     CSG_TIN *pTIN = Parameters("TIN")->asTIN();
  662 
  663     if( !pTIN->is_Valid() )
  664     {
  665         Error_Set(_TL("invalid input data"));
  666 
  667         return( false );
  668     }
  669 
  670     C3D_Viewer_TIN_Dialog dlg(pTIN,
  671         Parameters("HEIGHT")->asInt(),
  672         Parameters("COLOR" )->asInt(),
  673         Parameters("DRAPE" )->asGrid()
  674     );
  675 
  676     dlg.ShowModal();
  677 
  678     return( true );
  679 }
  680 
  681 
  682 ///////////////////////////////////////////////////////////
  683 //                                                       //
  684 //                                                       //
  685 //                                                       //
  686 ///////////////////////////////////////////////////////////
  687 
  688 //---------------------------------------------------------