SAGA API Version 9.14
Loading...
Searching...
No Matches
map_shapes_line.cpp
Go to the documentation of this file.
1
3// //
4// SAGA //
5// //
6// System for Automated Geoscientific Analyses //
7// //
8// Application Programming Interface //
9// //
10// Library: SAGA_API //
11// //
12//-------------------------------------------------------//
13// //
14// map_shapes_line.cpp //
15// //
16// Copyright (C) 2026 by //
17// Olaf Conrad //
18// //
19//-------------------------------------------------------//
20// //
21// This file is part of 'SAGA - System for Automated //
22// Geoscientific Analyses'. SAGA is free software; you //
23// can redistribute it and/or modify it under the terms //
24// of the GNU General Public License as published by the //
25// Free Software Foundation, either version 2 of the //
26// License, or (at your option) any later version. //
27// //
28// SAGA is distributed in the hope that it will be //
29// useful, but WITHOUT ANY WARRANTY; without even the //
30// implied warranty of MERCHANTABILITY or FITNESS FOR A //
31// PARTICULAR PURPOSE. See the GNU General Public //
32// License for more details. //
33// //
34// You should have received a copy of the GNU General //
35// Public License along with this program; if not, see //
36// <http://www.gnu.org/licenses/>. //
37// //
38//-------------------------------------------------------//
39// //
40// e-mail: oconrad@saga-gis.org //
41// //
42// contact: Olaf Conrad //
43// Institute of Geography //
44// University of Hamburg //
45// Germany //
46// //
48
49//---------------------------------------------------------
50#include "../dc_helper.h"
51
52#include "map_symbology.h"
53
54#include "map_layer.h"
55
56
58// //
59// //
60// //
62
63//---------------------------------------------------------
73
74
76// //
78
79//---------------------------------------------------------
81{
83
84 //-----------------------------------------------------
85 // Display...
86
87 PenList_Add(Parameters, "NODE_DISPLAY" , "LINE_STYLE" , _TL("Line Style" ), _TL(""));
88
89 Parameters.Add_Choice("NODE_DISPLAY" , "BOUNDARY_EFFECT", _TL("Boundary Effect"), _TL(""), CSG_String::Format("%s|%s|%s|%s|%s|%s|%s|%s|%s|%s",
90 _TL("none" ),
91 _TL("all sides" ),
92 _TL("top" ),
93 _TL("top left" ),
94 _TL("left" ),
95 _TL("bottom left" ),
96 _TL("bottom" ),
97 _TL("bottom right"),
98 _TL("right" ),
99 _TL("top right" )), 0
100 );
101 Parameters.Add_Color ("BOUNDARY_EFFECT", "BOUNDARY_COLOR", _TL("Color" ), _TL(""), SG_GET_RGB(255, 255, 255));
102
103 Parameters.Add_Choice("NODE_DISPLAY" , "DISPLAY_POINTS", _TL("Show Vertices" ), _TL(""), CSG_String::Format("%s|%s|%s", _TL("no"), _TL("yes"), _TL("with label")), 0);
104
105 //-----------------------------------------------------
106 // Size...
107
108 Parameters.Add_Choice("NODE_SIZE" , "SIZE_FIELD" , _TL("Field" ), _TL(""), CSG_String::Format("<%s>", _TL("not set")));
109 Parameters.Add_Range ("SIZE_FIELD", "SIZE_RANGE" , _TL("Size Range" ), _TL(""), 0, 10, 0, true);
110 Parameters.Add_Int ("SIZE_FIELD", "SIZE_DEFAULT", _TL("Default Size" ), _TL(""), 1, 1, true );
111 Parameters.Add_Choice("NODE_SIZE" , "SIZE_TYPE" , _TL("Size relates to..."), _TL(""), CSG_String::Format("%s|%s", _TL("Screen"), _TL("Map Units")), 0);
112
113 //-----------------------------------------------------
114 // Labeling...
115
116 Parameters.Add_Choice("LABEL_FIELD", "LABEL_STYLE", _TL("Style"), _TL(""), CSG_String::Format("%s|%s|%s|%s",
117 _TL("one label at the polyline centroid"),
118 _TL("one label at the central vertex of each part"),
119 _TL("one aligned label at the central vertex of each part"),
120 _TL("along line labeling")), 3
121 );
122
123 Parameters.Add_Choice("LABEL_STYLE", "LABEL_ALIGN" , _TL("Align" ), _TL(""), CSG_String::Format("%s|%s|%s", _TL("top"), _TL("center"), _TL("bottom")), 1);
124 Parameters.Add_Choice("LABEL_STYLE", "LABEL_ORIENT" , _TL("Orientation" ), _TL(""), CSG_String::Format("%s|%s", _TL("left"), _TL("right")), 1);
125 Parameters.Add_Double("LABEL_STYLE", "LABEL_FREQUENCY", _TL("Along Line Frequency"), _TL("The distance between labels specified as multiples of the label's text width."), 10., 0., true);
126
127 //-----------------------------------------------------
128 return( true );
129}
130
131
133// //
135
136//---------------------------------------------------------
138{
139 if( Flags & PARAMETER_CHECK_ENABLE )
140 {
141 if( Parameter.Cmp_Identifier("SIZE_FIELD") )
142 {
143 int Value = Get_Fields_Choice(Parameter);
144
145 Parameters.Set_Enabled("SIZE_RANGE" , Value >= 0);
146 Parameters.Set_Enabled("SIZE_DEFAULT" , Value < 0);
147 }
148
149 if( Parameter.Cmp_Identifier("LABEL_STYLE") )
150 {
151 Parameters.Set_Enabled("LABEL_ALIGN" , Parameter.asInt() == 2 || Parameter.asInt() == 3);
152 Parameters.Set_Enabled("LABEL_ORIENT" , Parameter.asInt() == 2 || Parameter.asInt() == 3);
153 Parameters.Set_Enabled("LABEL_FREQUENCY", Parameter.asInt() == 3);
154 }
155
156 if( Parameter.Cmp_Identifier("BOUNDARY_EFFECT") )
157 {
158 Parameters.Set_Enabled("BOUNDARY_COLOR", Parameter.asInt() != 0);
159 }
160 }
161
162 return( CSG_Map_Shapes::Parameter_Changed(Parameters, Parameter, Flags) );
163}
164
165
167// //
169
170//---------------------------------------------------------
172{
174
175 //-----------------------------------------------------
176 Set_Fields_Choice(m_Parameters["SIZE_FIELD"], true, true, true);
177
178 //-----------------------------------------------------
179 return( true );
180}
181
182//---------------------------------------------------------
184{
186
187 //-----------------------------------------------------
188 m_Size_Type = m_Parameters["SIZE_TYPE"].asInt();
189
190 if( (m_iSize = Get_Fields_Choice(m_Parameters["SIZE_FIELD"])) < 0
191 || (m_dSize = m_pObject->asShapes()->Get_Maximum(m_iSize) - (m_Size_Min = m_pObject->asShapes()->Get_Minimum(m_iSize))) <= 0. )
192 {
193 m_iSize = -1;
194 m_Size = m_Parameters["SIZE_DEFAULT"].asInt();
195 }
196 else
197 {
198 m_Size = (int)m_Parameters["SIZE_RANGE.MIN"].asDouble();
199 m_dSize = (m_Parameters["SIZE_RANGE.MAX"].asDouble() - m_Size) / m_dSize;
200 }
201
202 //-----------------------------------------------------
203 m_Pen = wxPen(m_pSymbology->Get_Single_Color(), (int)m_Size, (wxPenStyle)m_Line_Style);
204
205 m_bVertices = m_Parameters["DISPLAY_POINTS"].asInt();
206
207 //-----------------------------------------------------
208 m_Effect_Color = m_Parameters["BOUNDARY_COLOR"].asColor();
209
210 switch( m_Parameters["BOUNDARY_EFFECT"].asInt() )
211 {
212 default: m_Effect = SG_DC_TEXTEFFECT_NONE ; break;
213 case 1: m_Effect = SG_DC_TEXTEFFECT_FRAME ; break;
214 case 2: m_Effect = SG_DC_TEXTEFFECT_TOP ; break;
215 case 3: m_Effect = SG_DC_TEXTEFFECT_TOPLEFT ; break;
216 case 4: m_Effect = SG_DC_TEXTEFFECT_LEFT ; break;
217 case 5: m_Effect = SG_DC_TEXTEFFECT_BOTTOMLEFT ; break;
218 case 6: m_Effect = SG_DC_TEXTEFFECT_BOTTOM ; break;
219 case 7: m_Effect = SG_DC_TEXTEFFECT_BOTTOMRIGHT; break;
220 case 8: m_Effect = SG_DC_TEXTEFFECT_RIGHT ; break;
221 case 9: m_Effect = SG_DC_TEXTEFFECT_TOPRIGHT ; break;
222 }
223
224 //-----------------------------------------------------
225 return( true );
226}
227
228
230// //
232
233//---------------------------------------------------------
234bool CSG_Map_Shapes_Line::Get_Style_Size(int &min_Size, int &max_Size, double &min_Value, double &dValue, wxString *pName)
235{
236 if( m_iSize >= 0 )
237 {
238 min_Size = (int)(m_Size);
239 max_Size = (int)(m_Size + ((m_pObject->asShapes()->Get_Maximum(m_iSize) - m_Size_Min) * m_dSize));
240 min_Value = m_Size_Min;
241 dValue = m_dSize;
242
243 if( pName )
244 {
245 pName->Printf(m_pObject->asShapes()->Get_Field_Name(m_iSize));
246 }
247
248 return( true );
249 }
250
251 return( false );
252}
253
254
256// //
258
259//---------------------------------------------------------
261{
262 m_Label_Style = m_Parameters["LABEL_STYLE" ].asInt();
263 m_Label_Freq = m_Parameters["LABEL_FREQUENCY"].asInt();
264 m_Label_Orient = m_Parameters["LABEL_ORIENT" ].asInt();
265
266 switch( m_Parameters["LABEL_ALIGN"].asInt() )
267 {
268 default: m_Label_Align = SG_DC_TEXTALIGN_TOPLEFT ; break;
271 }
272
273 m_Pen.SetStyle((wxPenStyle)(m_Line_Style = PenList_Get_Style("LINE_STYLE")));
274
275 dc_Map.SetPen(m_Pen);
276}
277
278//---------------------------------------------------------
279void CSG_Map_Shapes_Line::Draw_Shape(CSG_Map_DC &dc_Map, CSG_Shape *pShape, int Flags)
280{
281 if( (Flags & LAYER_DRAW_FLAG_SELECTION) != 0 )
282 {
283 _Draw_Shape(dc_Map, pShape);
284
285 return;
286 }
287
288 //-----------------------------------------------------
289 wxPen Pen(m_Pen); int Color; double Size = m_Size;
290
291 if( !Get_Class_Color(pShape, Color) && !m_bNoData )
292 {
293 return;
294 }
295
296 Pen.SetColour(SG_GET_R(Color), SG_GET_G(Color), SG_GET_B(Color));
297
298 //-----------------------------------------------------
299 if( m_iSize >= 0 )
300 {
301 if( pShape->is_NoData(m_iSize) )
302 {
303 if( !m_bNoData )
304 {
305 return;
306 }
307 }
308 else
309 {
310 Size += m_dSize * (pShape->asDouble(m_iSize) - m_Size_Min);
311 }
312 }
313
314 switch( m_Size_Type )
315 {
316 default: Size *= dc_Map.Scale() ; break;
317 case 1: Size *= dc_Map.World2DC(); break;
318 }
319
320 Pen.SetWidth(Size < 0 ? 0 : (int)(0.5 + Size));
321
322 //-----------------------------------------------------
323 if( m_Effect )
324 {
325 wxColour Color = Pen.GetColour(); Pen.SetColour(m_Effect_Color); dc_Map.SetPen(Pen);
326
327 if( m_Effect & SG_DC_TEXTEFFECT_TOP ) _Draw_Shape(dc_Map, pShape, 0, -1);
328 if( m_Effect & SG_DC_TEXTEFFECT_TOPLEFT ) _Draw_Shape(dc_Map, pShape, -1, -1);
329 if( m_Effect & SG_DC_TEXTEFFECT_LEFT ) _Draw_Shape(dc_Map, pShape, -1, 0);
330 if( m_Effect & SG_DC_TEXTEFFECT_BOTTOMLEFT ) _Draw_Shape(dc_Map, pShape, -1, 1);
331 if( m_Effect & SG_DC_TEXTEFFECT_BOTTOM ) _Draw_Shape(dc_Map, pShape, 0, 1);
332 if( m_Effect & SG_DC_TEXTEFFECT_BOTTOMRIGHT ) _Draw_Shape(dc_Map, pShape, 1, 1);
333 if( m_Effect & SG_DC_TEXTEFFECT_RIGHT ) _Draw_Shape(dc_Map, pShape, 1, 0);
334 if( m_Effect & SG_DC_TEXTEFFECT_TOPRIGHT ) _Draw_Shape(dc_Map, pShape, 1, -1);
335
336 Pen.SetColour(Color);
337 }
338
339 //-----------------------------------------------------
340 dc_Map.SetPen(Pen);
341
342 _Draw_Shape(dc_Map, pShape);
343
344 dc_Map.SetPen(m_Pen);
345}
346
347//---------------------------------------------------------
348void CSG_Map_Shapes_Line::_Draw_Shape(CSG_Map_DC &dc_Map, CSG_Shape *pShape, int xOffset, int yOffset)
349{
350 for(int iPart=0; iPart<pShape->Get_Part_Count(); iPart++)
351 {
352 if( pShape->Get_Point_Count(iPart) > 1 )
353 {
354 TSG_Point_Int A = dc_Map.World2DC(pShape->Get_Point(0, iPart)); A.x += xOffset; A.y += yOffset;
355
356 for(int iPoint=1; iPoint<pShape->Get_Point_Count(iPart); iPoint++)
357 {
358 TSG_Point_Int B = A; A = dc_Map.World2DC(pShape->Get_Point(iPoint, iPart)); A.x += xOffset; A.y += yOffset;
359
360 dc_Map.DrawLine(A.x, A.y, B.x, B.y);
361 }
362 }
363 }
364}
365
366//---------------------------------------------------------
367#define GET_ANGLE(a, b) M_RAD_TO_DEG * (b.x != a.x ? M_PI_180 - atan2((double)(b.y - a.y), (double)(b.x - a.x)) : (b.y > a.y ? M_PI_270 : (b.y < a.y ? M_PI_090 : 0.0)))
368
369//---------------------------------------------------------
370void CSG_Map_Shapes_Line::Draw_Label(CSG_Map_DC &dc_Map, CSG_Shape *pShape, const wxString &Label)
371{
372 CSG_Shape_Line *pLine = (CSG_Shape_Line *)pShape;
373
374 switch( m_Label_Style )
375 {
376 //-----------------------------------------------------
377 case 0: // one label at the polyline centroid
378 {
379 TSG_Point_Int C = dc_Map.World2DC(pLine->Get_Centroid());
380
381 dc_Map.DrawText(SG_DC_TEXTALIGN_CENTER, C.x, C.y, Label, m_Label.Effect, m_Label.Effect_Color, m_Label.Effect_Size);
382 }
383 break;
384
385 //-----------------------------------------------------
386 case 1: // one label at the central vertex of each part
387 case 2: // one aligned label at the central vertex of each part
388 {
389 for(int iPart=0; iPart<pLine->Get_Part_Count(); iPart++)
390 {
391 double d = 0., c = 0.5 * pLine->Get_Length(iPart);
392
393 for(int i=1, j=0; d<c && i<pLine->Get_Point_Count(iPart); i++, j++)
394 {
395 d += SG_Get_Distance(pLine->Get_Point(i, iPart), pLine->Get_Point(j, iPart));
396
397 if( d >= c )
398 {
399 if( m_Label_Style == 1 )
400 {
401 TSG_Point A = pLine->Get_Point(i, iPart);
402 TSG_Point B = pLine->Get_Point(j, iPart);
403
404 A.x += 0.5 * (B.x - A.x);
405 A.y += 0.5 * (B.y - A.y);
406
407 TSG_Point_Int C = dc_Map.World2DC(A);
408
409 dc_Map.DrawText(SG_DC_TEXTALIGN_CENTER, C.x, C.y, Label, m_Label.Effect, m_Label.Effect_Color, m_Label.Effect_Size);
410 }
411 else
412 {
413 TSG_Point_Int A = dc_Map.World2DC(pLine->Get_Point(i, iPart));
414 TSG_Point_Int B = dc_Map.World2DC(pLine->Get_Point(j, iPart));
415
416 if( m_Label_Orient == 0 )
417 {
418 dc_Map.DrawText(m_Label_Align, A.x, A.y, GET_ANGLE(B, A), Label, m_Label.Effect, m_Label.Effect_Color, m_Label.Effect_Size);
419 }
420 else
421 {
422 dc_Map.DrawText(m_Label_Align, B.x, B.y, GET_ANGLE(A, B), Label, m_Label.Effect, m_Label.Effect_Color, m_Label.Effect_Size);
423 }
424 }
425 }
426 }
427 }
428 }
429 break;
430
431 //-----------------------------------------------------
432 case 3: // along line labeling
433 {
434 wxCoord Width, Height; dc_Map.Get_DC().GetTextExtent(Label, &Width, &Height);
435
436 for(int iPart=0; iPart<pLine->Get_Part_Count(); iPart++)
437 {
438 if( pLine->Get_Point_Count(iPart) < 2 || Width > dc_Map.World2DC() * pLine->Get_Length(iPart) )
439 {
440 continue;
441 }
442
443 bool bLabel = false; double d = 0.; TSG_Point_Int B, A = dc_Map.World2DC(pLine->Get_Point(0, iPart));
444
445 for(int iPoint=1; iPoint<pLine->Get_Point_Count(iPart); iPoint++)
446 {
447 //-------------------------------------
448 if( !bLabel )
449 {
450 B = A; A = dc_Map.World2DC(pLine->Get_Point(iPoint, iPart));
451
452 if( (d += SG_Get_Distance(A.x, A.y, B.x, B.y)) > m_Label_Freq * Width )
453 {
454 B = A; bLabel = true;
455 }
456 }
457
458 //-------------------------------------
459 else
460 {
461 A = dc_Map.World2DC(pLine->Get_Point(iPoint, iPart));
462
463 if( SG_Get_Distance(A.x, A.y, B.x, B.y) > Width )
464 {
465 d = 0.; bLabel = false;
466
467 if( m_Label_Orient == 0 )
468 {
469 dc_Map.DrawText(m_Label_Align, A.x, A.y, GET_ANGLE(B, A), Label, m_Label.Effect, m_Label.Effect_Color, m_Label.Effect_Size);
470 }
471 else
472 {
473 dc_Map.DrawText(m_Label_Align, B.x, B.y, GET_ANGLE(A, B), Label, m_Label.Effect, m_Label.Effect_Color, m_Label.Effect_Size);
474 }
475 }
476 }
477 }
478 }
479 }
480 break;
481 }
482}
483
484
486// //
487// //
488// //
490
491//---------------------------------------------------------
#define SG_GET_B(rgb)
Definition api_core.h:1350
#define SG_GET_G(rgb)
Definition api_core.h:1349
#define SG_GET_R(rgb)
Definition api_core.h:1348
#define SG_GET_RGB(r, g, b)
Definition api_core.h:1345
#define _TL(s)
Definition api_core.h:1619
void SetPen(const wxPen &Pen)
Definition map_dc.cpp:482
void DrawLine(int x1, int y1, int x2, int y2)
Definition map_dc.cpp:524
wxMemoryDC & Get_DC(void)
Definition map_dc.h:96
const double & Scale(void) const
Definition map_dc.h:122
const double & World2DC(void) const
Definition map_dc.h:131
void DrawText(int Align, int x, int y, const wxString &Text)
Definition map_dc.cpp:616
bool Set_Fields_Choice(CSG_Parameter &Choice, bool bNumeric, bool bAddNone, bool bSelectNone=false)
static int Get_Fields_Choice(CSG_Parameter &Choice)
CSG_Data_Object * m_pObject
Definition map_layer.h:151
bool Set_Object(CSG_Data_Object *pObject)
CSG_Parameters m_Parameters
Definition map_layer.h:149
class CSG_Map_Symbology * m_pSymbology
Definition map_layer.h:153
bool Get_Style_Size(int &min_Size, int &max_Size, double &min_Value, double &dValue, wxString *pName)
virtual void Draw_Label(CSG_Map_DC &dc_Map, CSG_Shape *pShape, const wxString &Label)
virtual bool Parameters_Changed(void)
virtual bool Parameter_Changed(CSG_Parameters &Parameters, CSG_Parameter &Parameter, int Flags)
virtual void Draw_Initialize(CSG_Map_DC &dc_Map, int Flags)
virtual void Draw_Shape(CSG_Map_DC &dc_Map, CSG_Shape *pShape, int Flags=0)
virtual bool DataObject_Changed(void)
virtual bool Add_Parameters(CSG_Parameters &Parameters)
CSG_Map_Shapes_Line(CSG_Shapes *pShapes=NULL)
wxColour m_Effect_Color
Definition map_layer.h:846
virtual bool Add_Parameters(CSG_Parameters &Parameters)
virtual bool Parameter_Changed(CSG_Parameters &Parameters, CSG_Parameter &Parameter, int Flags)
bool Get_Class_Color(CSG_Shape *pShape, int &Color)
class CSG_Map_Shapes::CLabel m_Label
int PenList_Get_Style(const CSG_String &Identifier)
CSG_Parameter * PenList_Add(CSG_Parameters &Parameters, const CSG_String &ParentID, const CSG_String &Identifier, const CSG_String &Name, const CSG_String &Description) const
virtual bool Parameters_Changed(void)
virtual bool DataObject_Changed(void)
bool Cmp_Identifier(const CSG_String &Identifier) const
int asInt(void) const
Definition parameters.h:287
CSG_Parameter * Add_Choice(const CSG_String &ParentID, const CSG_String &ID, const CSG_String &Name, const CSG_String &Description, const CSG_String &Items, int Default=0)
void Set_Enabled(bool bEnabled=true)
CSG_Parameter * Add_Double(const CSG_String &ParentID, const CSG_String &ID, const CSG_String &Name, const CSG_String &Description, double Value=0.0, double Minimum=0.0, bool bMinimum=false, double Maximum=0.0, bool bMaximum=false)
CSG_Parameter * Add_Int(const CSG_String &ParentID, const CSG_String &ID, const CSG_String &Name, const CSG_String &Description, int Value=0, int Minimum=0, bool bMinimum=false, int Maximum=0, bool bMaximum=false)
CSG_Parameter * Add_Color(const CSG_String &ParentID, const CSG_String &ID, const CSG_String &Name, const CSG_String &Description, int Value=0)
CSG_Parameter * Add_Range(const CSG_String &ParentID, const CSG_String &ID, const CSG_String &Name, const CSG_String &Description, double Range_Min=0.0, double Range_Max=0.0, double Minimum=0.0, bool bMinimum=false, double Maximum=0.0, bool bMaximum=false)
virtual TSG_Point Get_Centroid(void)
double Get_Length(void)
virtual TSG_Point Get_Point(int iPoint=0) const
virtual int Get_Part_Count(void) const
Definition shapes.h:503
virtual int Get_Point_Count(void) const
Definition shapes.h:501
virtual int Get_Point_Count(void) const =0
virtual int Get_Part_Count(void) const =0
virtual TSG_Point Get_Point(int iPoint=0) const =0
virtual TSG_Shape_Type Get_Type(void) const
Definition shapes.h:814
static CSG_String Format(const char *Format,...)
bool is_NoData(int Field) const
double asDouble(int Field) const
#define SG_DC_TEXTEFFECT_TOPRIGHT
Definition dc_helper.h:149
#define SG_DC_TEXTEFFECT_LEFT
Definition dc_helper.h:144
#define SG_DC_TEXTALIGN_CENTER
Definition dc_helper.h:135
#define SG_DC_TEXTALIGN_BOTTOMLEFT
Definition dc_helper.h:137
#define SG_DC_TEXTEFFECT_BOTTOM
Definition dc_helper.h:146
#define SG_DC_TEXTEFFECT_NONE
Definition dc_helper.h:141
#define SG_DC_TEXTEFFECT_BOTTOMRIGHT
Definition dc_helper.h:147
#define SG_DC_TEXTEFFECT_TOPLEFT
Definition dc_helper.h:143
#define SG_DC_TEXTEFFECT_BOTTOMLEFT
Definition dc_helper.h:145
#define SG_DC_TEXTALIGN_TOPLEFT
Definition dc_helper.h:131
#define SG_DC_TEXTEFFECT_RIGHT
Definition dc_helper.h:148
#define SG_DC_TEXTEFFECT_TOP
Definition dc_helper.h:142
#define SG_DC_TEXTEFFECT_FRAME
Definition dc_helper.h:150
#define SG_DC_TEXTALIGN_CENTERLEFT
Definition dc_helper.h:134
#define B
double SG_Get_Distance(double ax, double ay, double bx, double by, bool bPolar)
#define A
#define C
struct SSG_Point TSG_Point
struct SSG_Point_Int TSG_Point_Int
#define LAYER_DRAW_FLAG_SELECTION
Definition map_layer.h:75
#define GET_ANGLE(a, b)
#define asDouble(i)
#define PARAMETER_CHECK_ENABLE
Definition parameters.h:191
CSG_String SG_Get_ShapeType_Name(TSG_Shape_Type Type)
Definition shapes.cpp:65
@ SHAPE_TYPE_Line
Definition shapes.h:104