📄 wksp_shapes_line.cpp
字号:
}
double dSize = m_iSize < 0 ? m_Size
: m_Size + (pShape->Get_Record()->asDouble(m_iSize) - m_Size_Min) * m_dSize;
switch( m_Size_Type )
{
default:
case 0: dSize *= dc_Map.m_Scale; break;
case 1: dSize *= dc_Map.m_World2DC; break;
}
if( dSize >= 0 )
{
Pen.SetWidth((int)(0.5 + dSize));
}
dc_Map.dc.SetPen(Pen);
}
//-----------------------------------------------------
int iPart, iPoint;
TSG_Point_Int A, B;
for(iPart=0; iPart<pShape->Get_Part_Count(); iPart++)
{
if( pShape->Get_Point_Count(iPart) > 1 )
{
A = dc_Map.World2DC(pShape->Get_Point(0, iPart));
for(iPoint=1; iPoint<pShape->Get_Point_Count(iPart); iPoint++)
{
B = A;
A = dc_Map.World2DC(pShape->Get_Point(iPoint, iPart));
dc_Map.dc.DrawLine(A.x, A.y, B.x, B.y);
}
}
}
if( m_bPoints )
{
dc_Map.dc.SetPen(*wxBLACK_PEN);
dc_Map.dc.SetBrush(*wxWHITE_BRUSH);
for(iPart=0; iPart<pShape->Get_Part_Count(); iPart++)
{
for(iPoint=0; iPoint<pShape->Get_Point_Count(iPart); iPoint++)
{
A = dc_Map.World2DC(pShape->Get_Point(iPoint, iPart));
dc_Map.dc.DrawCircle(A.x, A.y, 2);
}
}
}
//-----------------------------------------------------
if( bSelection )
{
dc_Map.dc.SetPen(m_Pen);
}
}
//---------------------------------------------------------
void CWKSP_Shapes_Line::_Draw_Label(CWKSP_Map_DC &dc_Map, CSG_Shape *pShape)
{
const int m_Label_Freq = 10,
m_Label_Prec = 2;
bool bLabel;
int iPart, iPoint;
double d;
TSG_Point_Int A, B;
wxCoord sx, sy;
wxString s(pShape->Get_Record()->asString(m_iLabel, m_Label_Prec));
dc_Map.dc.GetTextExtent(s, &sx, &sy);
//-----------------------------------------------------
for(iPart=0; iPart<pShape->Get_Part_Count(); iPart++)
{
if( dc_Map.m_World2DC * ((CSG_Shape_Line *)pShape)->Get_Length(iPart) > (2 * m_Label_Freq) * sx )
{
A = dc_Map.World2DC(pShape->Get_Point(0, iPart));
for(iPoint=1, d=0.0, bLabel=false; iPoint<pShape->Get_Point_Count(iPart); iPoint++)
{
//-----------------------------------------
if( !bLabel )
{
B = A;
A = dc_Map.World2DC(pShape->Get_Point(iPoint, iPart));
if( (d += SG_Get_Distance(A.x, A.y, B.x, B.y)) > m_Label_Freq * sx )
{
bLabel = true;
B = A;
}
}
//-----------------------------------------
else
{
A = dc_Map.World2DC(pShape->Get_Point(iPoint, iPart));
if( SG_Get_Distance(A.x, A.y, B.x, B.y) > sx )
{
bLabel = false;
d = 0.0;
dc_Map.dc.DrawRotatedText(s, B.x, B.y,
M_RAD_TO_DEG * SG_Get_Angle_Of_Direction(B.x - A.x, A.y - B.y)
);
// dc_Map.dc.DrawCircle(A.x, A.y, 3); dc_Map.dc.DrawCircle(B.x, B.y, 3);
}
}
}
}
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#define DRAW_MOVELINE(i) { ptWorld = m_Edit_pShape->Get_Point(i, m_Edit_iPart);\
dc.DrawLine(Point.x, Point.y,\
(int)((ptWorld.x - rWorld.Get_XMin()) / ClientToWorld),\
(int)((rWorld.Get_YMax() - ptWorld.y) / ClientToWorld)); }
//---------------------------------------------------------
void CWKSP_Shapes_Line::_Edit_Shape_Draw_Move(wxDC &dc, CSG_Rect rWorld, double ClientToWorld, wxPoint Point)
{
int nPoints;
TSG_Point ptWorld;
if( m_Edit_pShape && m_Edit_iPart >= 0 )
{
nPoints = m_Edit_pShape->Get_Point_Count(m_Edit_iPart);
if( m_Edit_iPoint < 0 )
{
if( nPoints > 0 )
{
DRAW_MOVELINE(nPoints - 1);
}
}
else
{
if( nPoints > 1 )
{
if( m_Edit_iPoint > 0 )
DRAW_MOVELINE(m_Edit_iPoint - 1);
if( m_Edit_iPoint < nPoints - 1 )
DRAW_MOVELINE(m_Edit_iPoint + 1);
}
CWKSP_Shapes::_Edit_Shape_Draw_Move(dc, rWorld, ClientToWorld, Point);
}
}
}
//---------------------------------------------------------
void CWKSP_Shapes_Line::_Edit_Shape_Draw(CWKSP_Map_DC &dc_Map)
{
int iPart, iPoint;
TSG_Point_Int ptA, ptB;
if( m_Edit_pShape )
{
dc_Map.dc.SetPen(*wxBLACK_PEN);
for(iPart=0; iPart<m_Edit_pShape->Get_Part_Count(); iPart++)
{
if( m_Edit_pShape->Get_Point_Count(iPart) > 1 )
{
ptA = dc_Map.World2DC(m_Edit_pShape->Get_Point(0, iPart));
for(iPoint=1; iPoint<m_Edit_pShape->Get_Point_Count(iPart); iPoint++)
{
ptB = ptA;
ptA = dc_Map.World2DC(m_Edit_pShape->Get_Point(iPoint, iPart));
dc_Map.dc.DrawLine(ptA.x, ptA.y, ptB.x, ptB.y);
}
}
}
CWKSP_Shapes::_Edit_Shape_Draw(dc_Map);
}
}
//---------------------------------------------------------
int CWKSP_Shapes_Line::_Edit_Shape_HitTest(CSG_Point pos_Point, double max_Dist, int &pos_iPart, int &pos_iPoint)
{
int Result, iPart, iPoint;
double d;
TSG_Point A, B, Point, hit_Point;
Result = CWKSP_Shapes::_Edit_Shape_HitTest(pos_Point, max_Dist, pos_iPart, pos_iPoint);
if( Result == 0 && m_Edit_pShape )
{
for(iPart=0; iPart<m_Edit_pShape->Get_Part_Count(); iPart++)
{
B = m_Edit_pShape->Get_Point(0, iPart);
for(iPoint=1; iPoint<m_Edit_pShape->Get_Point_Count(iPart); iPoint++)
{
A = m_Edit_pShape->Get_Point(iPoint, iPart);
d = SG_Get_Nearest_Point_On_Line(pos_Point, A, B, Point, true);
B = A;
if( d >= 0.0 && (0.0 > max_Dist || d < max_Dist) )
{
Result = 2;
max_Dist = d;
pos_iPoint = iPoint;
pos_iPart = iPart;
hit_Point = Point;
}
}
}
if( Result )
{
pos_Point = hit_Point;
}
}
return( Result );
}
//---------------------------------------------------------
void CWKSP_Shapes_Line::_Edit_Snap_Point_ToLine(CSG_Point pos_Point, CSG_Point &snap_Point, double &snap_Dist, CSG_Shape *pShape)
{
int iPart, iPoint;
double d;
TSG_Point A, B, Point;
for(iPart=0; iPart<pShape->Get_Part_Count(); iPart++)
{
B = pShape->Get_Point(0, iPart);
for(iPoint=1; iPoint<pShape->Get_Point_Count(iPart); iPoint++)
{
A = pShape->Get_Point(iPoint, iPart);
d = SG_Get_Nearest_Point_On_Line(pos_Point, A, B, Point, true);
B = A;
if( d >= 0.0 && d < snap_Dist )
{
snap_Dist = d;
snap_Point = Point;
}
}
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -