//--------------------------------------------------------- void CWKSP_PointCloud::_Draw_Points(CWKSP_Map_DC &dc_Map) { m_Aggregation = m_Parameters("COLORS_AGGREGATE")->asInt(); if( m_Aggregation != 1 ) { m_Z.Create(SG_DATATYPE_Double, dc_Map.m_rDC.GetWidth(), dc_Map.m_rDC.GetHeight()); m_N.Create(SG_DATATYPE_Int , dc_Map.m_rDC.GetWidth(), dc_Map.m_rDC.GetHeight()); } //----------------------------------------------------- for(int i=0; i<m_pPointCloud->Get_Count(); i++) { TSG_Point_Z Point = m_pPointCloud->Get_Point(i); if( dc_Map.m_rWorld.Contains(Point.x, Point.y) ) { int Color; int x = (int)dc_Map.xWorld2DC(Point.x); int y = (int)dc_Map.yWorld2DC(Point.y); m_pClassify->Get_Class_Color_byValue(m_pPointCloud->Get_Value(i, m_Color_Field), Color); _Draw_Point(dc_Map, x, y, Point.z, Color, m_PointSize); } } }
//--------------------------------------------------------- void CWKSP_TIN::_Draw_Triangles(CWKSP_Map_DC &dc_Map) { if( m_Parameters("DISPLAY_TRIANGES")->asBool() && dc_Map.IMG_Draw_Begin(m_Parameters("DISPLAY_TRANSPARENCY")->asDouble() / 100.0) ) { for(int iTriangle=0; iTriangle<asTIN()->Get_Triangle_Count(); iTriangle++) { CSG_TIN_Triangle *pTriangle = asTIN()->Get_Triangle(iTriangle); if( dc_Map.m_rWorld.Intersects(pTriangle->Get_Extent()) != INTERSECTION_None ) { TPoint p[3]; for(int iNode=0; iNode<3; iNode++) { CSG_TIN_Node *pNode = pTriangle->Get_Node(iNode); TSG_Point_Int Point = dc_Map.World2DC(pNode->Get_Point()); p[iNode].x = Point.x; p[iNode].y = Point.y; p[iNode].z = pNode->asDouble(m_fValue); } _Draw_Triangle(dc_Map, p); } } dc_Map.IMG_Draw_End(); } }
//--------------------------------------------------------- void CWKSP_PointCloud::On_Draw(CWKSP_Map_DC &dc_Map, bool bEdit) { if( Get_Extent().Intersects(dc_Map.m_rWorld) != INTERSECTION_None && dc_Map.IMG_Draw_Begin(m_Parameters("DISPLAY_TRANSPARENCY")->asDouble() / 100.0) ) { _Draw_Points (dc_Map); dc_Map.IMG_Draw_End(); } }
//--------------------------------------------------------- void CWKSP_Shapes_Points::_Draw_Shape(CWKSP_Map_DC &dc_Map, CSG_Shape *pShape, bool bSelection) { if( (m_iSize >= 0 && pShape->is_NoData(m_iSize)) || (m_iColor >= 0 && pShape->is_NoData(m_iColor)) ) return; //----------------------------------------------------- int Size; if( CWKSP_Shapes_Point::_Draw_Initialize(dc_Map, Size, pShape, bSelection) ) { for(int iPart=0; iPart<pShape->Get_Part_Count(); iPart++) { for(int iPoint=0; iPoint<pShape->Get_Point_Count(iPart); iPoint++) { TSG_Point_Int p = dc_Map.World2DC(pShape->Get_Point(iPoint, iPart)); Draw_Symbol(dc_Map.dc, p.x, p.y, Size); } } //------------------------------------------------- if( bSelection ) { CWKSP_Shapes_Point::_Draw_Initialize(dc_Map); } } }
//--------------------------------------------------------- void CWKSP_Shapes_Point::Draw_Label(CWKSP_Map_DC &dc_Map, CSG_Shape *pShape, const wxString &Label) { TSG_Point_Int p(dc_Map.World2DC(pShape->Get_Point(0))); double Angle = m_iLabel_Angle < 0 ? m_Label_Angle : pShape->asDouble(m_iLabel_Angle); Draw_Text(dc_Map.dc, m_Label_Align, p.x, p.y, Angle, Label, m_Label_Eff, m_Label_Eff_Color); }
//--------------------------------------------------------- void CWKSP_TIN::_Draw_Points(CWKSP_Map_DC &dc_Map) { for(int i=0; i<asTIN()->Get_Node_Count(); i++) { TSG_Point_Int Point = dc_Map.World2DC(asTIN()->Get_Node(i)->Get_Point()); dc_Map.dc.DrawCircle(Point.x, Point.y, 5); } }
//--------------------------------------------------------- void CWKSP_TIN::_Draw_Edges(CWKSP_Map_DC &dc_Map) { for(int i=0; i<asTIN()->Get_Edge_Count(); i++) { TSG_Point_Int Point[2]; CSG_TIN_Edge *pEdge = asTIN()->Get_Edge(i); Point[0] = dc_Map.World2DC(pEdge->Get_Node(0)->Get_Point()); Point[1] = dc_Map.World2DC(pEdge->Get_Node(1)->Get_Point()); dc_Map.dc.DrawLine(Point[0].x, Point[0].y, Point[1].x, Point[1].y); } }
//--------------------------------------------------------- void CWKSP_Shapes::Edit_Shape_Draw(CWKSP_Map_DC &dc_Map) { int iPart, iPoint; if( m_Edit_pShape ) { for(iPart=0; iPart<m_Edit_pShape->Get_Part_Count(); iPart++) { for(iPoint=0; iPoint<m_Edit_pShape->Get_Point_Count(iPart); iPoint++) { _Edit_Shape_Draw_Point(dc_Map.dc, dc_Map.World2DC(m_Edit_pShape->Get_Point(iPoint, iPart)), false); } } if( m_Edit_iPart >= 0 && m_Edit_iPoint >= 0 ) { _Edit_Shape_Draw_Point(dc_Map.dc, dc_Map.World2DC(m_Edit_pShape->Get_Point(m_Edit_iPoint, m_Edit_iPart)), true); } if( m_Parameters("EDIT_SNAP_LIST")->asShapesList()->Get_Count() > 0 ) { iPoint = m_Parameters("EDIT_SNAP_DIST")->asInt(); dc_Map.dc.SetBrush(wxNullBrush); dc_Map.dc.SetPen (*wxWHITE); dc_Map.dc.DrawCircle(1 + iPoint, 1 + iPoint, iPoint - 1); dc_Map.dc.DrawCircle(1 + iPoint, 1 + iPoint, iPoint + 1); dc_Map.dc.SetPen (*wxBLACK); dc_Map.dc.DrawCircle(1 + iPoint, 1 + iPoint, iPoint); dc_Map.dc.SetBrush(*wxBLACK); dc_Map.dc.SetPen (*wxBLACK); dc_Map.dc.DrawCircle(1 + iPoint, 1 + iPoint, 1); } } }
//--------------------------------------------------------- inline void CWKSP_PointCloud::_Draw_Point(CWKSP_Map_DC &dc_Map, int x, int y, double z, int Color) { if( m_Aggregation == 1 ) // last value { dc_Map.IMG_Set_Pixel(x, y, Color); } else if( m_Z.is_InGrid(x, y) ) { switch( m_Aggregation ) { case 0: // first value if( m_N.asInt(x, y) == 0 ) { dc_Map.IMG_Set_Pixel(x, y, Color); } break; case 2: // lowest z if( m_N.asInt(x, y) == 0 || z < m_Z.asDouble(x, y) ) { dc_Map.IMG_Set_Pixel(x, y, Color); m_Z.Set_Value(x, y, z); } break; case 3: // highest z if( m_N.asInt(x, y) == 0 || z > m_Z.asDouble(x, y) ) { dc_Map.IMG_Set_Pixel(x, y, Color); m_Z.Set_Value(x, y, z); } break; } m_N.Add_Value(x, y, 1); } }
//--------------------------------------------------------- void CWKSP_Shapes_Point::Draw_Shape(CWKSP_Map_DC &dc_Map, CSG_Shape *pShape, int Selection) { if( m_iSize >= 0 && pShape->is_NoData(m_iSize) ) { return; } //----------------------------------------------------- int Size; if( Draw_Initialize(dc_Map, Size, pShape, Selection) ) { TSG_Point_Int p(dc_Map.World2DC(pShape->Get_Point(0))); Draw_Symbol(dc_Map.dc, p.x, p.y, Size); //------------------------------------------------- if( Selection ) { Draw_Initialize(dc_Map); } } }
//--------------------------------------------------------- bool CWKSP_Map_Graticule::Draw(CWKSP_Map_DC &dc_Map) { if( !Get_Graticule(dc_Map.m_rWorld) || m_Graticule.Get_Count() <= 0 ) { return( false ); } if( !m_Parameters("SHOW_ALWAYS")->asBool() ) { CSG_Parameter_Range *pRange = m_Parameters("SHOW_RANGE")->asRange(); double dRange = dc_Map.m_rWorld.Get_XRange() > dc_Map.m_rWorld.Get_YRange() ? dc_Map.m_rWorld.Get_XRange() : dc_Map.m_rWorld.Get_YRange(); if( dRange < pRange->Get_LoVal() || pRange->Get_HiVal() < dRange ) { return( false ); } } //----------------------------------------------------- CWKSP_Map_DC *pDC = m_Parameters("TRANSPARENCY")->asDouble() > 0.0 ? new CWKSP_Map_DC(dc_Map.m_rWorld, dc_Map.m_rDC, dc_Map.m_Scale, SG_GET_RGB(255, 255, 255)) : NULL; CWKSP_Map_DC &dc = pDC ? *pDC : dc_Map; //----------------------------------------------------- wxPen Pen(m_Parameters("COLOR")->asColor(), m_Parameters("SIZE")->asInt()); switch( m_Parameters("LINE_STYLE")->asInt() ) { default: case 0: Pen.SetStyle(wxPENSTYLE_SOLID ); break; // Solid style. case 1: Pen.SetStyle(wxPENSTYLE_DOT ); break; // Dotted style. case 2: Pen.SetStyle(wxPENSTYLE_LONG_DASH ); break; // Long dashed style. case 3: Pen.SetStyle(wxPENSTYLE_SHORT_DASH ); break; // Short dashed style. case 4: Pen.SetStyle(wxPENSTYLE_DOT_DASH ); break; // Dot and dash style. case 5: Pen.SetStyle(wxPENSTYLE_BDIAGONAL_HATCH ); break; // Backward diagonal hatch. case 6: Pen.SetStyle(wxPENSTYLE_CROSSDIAG_HATCH ); break; // Cross-diagonal hatch. case 7: Pen.SetStyle(wxPENSTYLE_FDIAGONAL_HATCH ); break; // Forward diagonal hatch. case 8: Pen.SetStyle(wxPENSTYLE_CROSS_HATCH ); break; // Cross hatch. case 9: Pen.SetStyle(wxPENSTYLE_HORIZONTAL_HATCH); break; // Horizontal hatch. case 10: Pen.SetStyle(wxPENSTYLE_VERTICAL_HATCH ); break; // Vertical hatch. // case 11: Pen.SetStyle(wxPENSTYLE_STIPPLE ); break; // Use the stipple bitmap. // case 12: Pen.SetStyle(wxPENSTYLE_USER_DASH ); break; // Use the user dashes: see wxPen::SetDashes. // case 13: Pen.SetStyle(wxPENSTYLE_TRANSPARENT ); break; // No pen is used. } dc.dc.SetPen(Pen); //----------------------------------------------------- for(int iLine=0; iLine<m_Graticule.Get_Count(); iLine++) { CSG_Shape *pLine = m_Graticule.Get_Shape(iLine); for(int iPart=0; iPart<pLine->Get_Part_Count(); iPart++) { if( pLine->Get_Point_Count(iPart) > 1 ) { TSG_Point_Int B, A = dc.World2DC(pLine->Get_Point(0, iPart)); for(int iPoint=1; iPoint<pLine->Get_Point_Count(iPart); iPoint++) { B = A; A = dc.World2DC(pLine->Get_Point(iPoint, iPart)); dc.dc.DrawLine(A.x, A.y, B.x, B.y); } } } } //----------------------------------------------------- if( m_Parameters("LABEL")->asBool() ) { int Size = (int)(0.5 + 0.01 * m_Parameters("LABEL_SIZE")->asDouble() * ( dc.m_rDC.GetWidth() < dc.m_rDC.GetHeight() ? dc.m_rDC.GetWidth() : dc.m_rDC.GetHeight() ) ); if( Size > 2 ) { int Effect; wxColour Effect_Color = Get_Color_asWX(m_Parameters("LABEL_EFFCOL")->asInt()); wxFont Font = Get_Font(m_Parameters("LABEL_FONT")); Font.SetPointSize(Size); dc.dc.SetFont(Font); dc.dc.SetTextForeground(m_Parameters("LABEL_FONT")->asColor()); switch( m_Parameters("LABEL_EFFECT")->asInt() ) { default: Effect = TEXTEFFECT_NONE; break; case 1: Effect = TEXTEFFECT_FRAME; break; case 2: Effect = TEXTEFFECT_TOP; break; case 3: Effect = TEXTEFFECT_TOPLEFT; break; case 4: Effect = TEXTEFFECT_LEFT; break; case 5: Effect = TEXTEFFECT_BOTTOMLEFT; break; case 6: Effect = TEXTEFFECT_BOTTOM; break; case 7: Effect = TEXTEFFECT_BOTTOMRIGHT; break; case 8: Effect = TEXTEFFECT_RIGHT; break; case 9: Effect = TEXTEFFECT_TOPRIGHT; break; } for(int iPoint=0; iPoint<m_Coordinates.Get_Count(); iPoint++) { CSG_Shape *pPoint = m_Coordinates.Get_Shape(iPoint); TSG_Point_Int p(dc.World2DC(pPoint->Get_Point(0))); wxString Type(pPoint->asString(0)); int Align = !Type.Cmp("LAT_MIN") ? TEXTALIGN_CENTERLEFT : !Type.Cmp("LAT_MAX") ? TEXTALIGN_CENTERRIGHT : !Type.Cmp("LON_MIN") ? TEXTALIGN_BOTTOMCENTER : !Type.Cmp("LON_MAX") ? TEXTALIGN_TOPCENTER : TEXTALIGN_CENTER; Draw_Text(dc.dc, Align, p.x, p.y, 0.0, pPoint->asString(1), Effect, Effect_Color); } } } //----------------------------------------------------- if( pDC ) { dc_Map.Draw_DC(dc, m_Parameters("TRANSPARENCY")->asDouble() / 100.0); delete(pDC); } return( true ); }
//--------------------------------------------------------- void CWKSP_Shapes_Points::_Draw_Label(CWKSP_Map_DC &dc_Map, CSG_Shape *pShape) { TSG_Point_Int p(dc_Map.World2DC(pShape->Get_Extent().Get_Center())); dc_Map.dc.DrawText(pShape->asString(m_iLabel, -2), p.x, p.y); }