-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patht_TSS.pas
195 lines (167 loc) · 5.37 KB
/
t_TSS.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
unit t_TSS;
interface
uses
Windows,
SysUtils,
t_ETS_Tiles,
i_ZoomList,
u_ZoomList,
u_TileArea;
type
TTSS_Definition = record
// ETS_INTERNAL_TSS_DEST
DestSource: String;
// ETS_INTERNAL_TSS_AREA
AreaSource: String;
// ETS_INTERNAL_TSS_ZOOM
ZoomSource: String;
// ETS_INTERNAL_TSS_FULL
FullSource: String;
// ETS_INTERNAL_TSS_MODE
ModeSource: String;
// ETS_INTERNAL_TSS_CODE
CodeSource: String;
end;
TTSSMode = (tssm_Off, tssm_On, tssm_Inversion);
PTSS_Info = ^TTSS_Info;
TTSS_Info = record
// ETS_INTERNAL_TSS_DEST
DestValue: String;
// ETS_INTERNAL_TSS_AREA
// ETS_INTERNAL_TSS_ZOOM
AreaValue: ITileArea;
// ETS_INTERNAL_TSS_FULL
FullValue: IZoomList;
// ETS_INTERNAL_TSS_MODE
ModeValue: TTSSMode;
// ETS_INTERNAL_TSS_CODE
CodeValue: LongInt;
public
procedure Clear;
function ApplyDefinition(const ADefinition: TTSS_Definition): Boolean;
function TileInSection(
const AZoom: Byte;
const AXYPtr: PPoint
): Boolean;
end;
// îáùèé àëãîðèòì ñåêöèîíèðîâàíèÿ
TTSS_Algorithm = (tssal_None, tssal_Linked, tssal_Manual);
// íàñòðîéêà èñïîëüçîâàíèÿ êîíêðåòíîé ñåêöèè
// çäåñü ïî óìîë÷àíèþ ñàìûì ïåðâûì äîëæíî áûòü Primary
TTSS_Link_Type = (tsslt_Primary, tsslt_Secondary, tsslt_Destination);
PTSS_Link_Type = ^TTSS_Link_Type;
PTSS_Primary_Params = ^TTSS_Primary_Params;
TTSS_Primary_Params = record
// îáøèé òèï ñåêöèîíèðîâàíèÿ
Algorithm: TTSS_Algorithm;
// ñåêöèÿ äëÿ ñïðàâî÷íèêîâ
Guides_Link: TTSS_Link_Type;
// ñåêöèÿ äëÿ òàéëîâûõ òàáëèö, êîòîðûå íå ïîïàëè íè â îäíó èç ñåêöèé
Undefined_Link: TTSS_Link_Type;
// ñåêöèÿ äëÿ èñïîëíåíèÿ ïðîöåäóðû ïðè ñîçäàíèè íîâîé òàáëèöû
NewTileTable_Link: TTSS_Link_Type;
NewTileTable_Proc: String;
// åñòü õîòÿ áû îäíà ñåêöèÿ áåç êîäà (âñïîìîãàòåëüíîå ïîëå)
HasSectionWithoutCode: Boolean;
public
// Åñëè TRUE - èñïîëüçóåòñÿ òîëüêî îäíà ñåêöèÿ
function UseSingleConn(const AAllowNewObjects: Boolean): Boolean;
// óñòàíàâëèâàåò çíà÷åíèå àëãîðèòìà
procedure ApplyAlgorithmValue(const AParamValue: String);
// óñòàíàâëèâàåò çíà÷åíèå íàñòðîéêè ñåêöèè
procedure ApplyLinkValue(const AParamValue: String; const AValuePtr: PTSS_Link_Type);
end;
const
c_TSSMode_Default = tssm_On;
implementation
{ TTSS_Info }
function TTSS_Info.ApplyDefinition(const ADefinition: TTSS_Definition): Boolean;
var VPos: Integer;
begin
// ETS_INTERNAL_TSS_DEST
DestValue := ADefinition.DestSource;
// ETS_INTERNAL_TSS_AREA
// ETS_INTERNAL_TSS_ZOOM
AreaValue := TTileArea.Create(ADefinition.AreaSource, ADefinition.ZoomSource);
if not AreaValue.Available then
AreaValue := nil;
// ETS_INTERNAL_TSS_FULL
FullValue := TZoomList.Create(ADefinition.FullSource);
if not FullValue.Available then
FullValue := nil;
// ETS_INTERNAL_TSS_MODE
if TryStrToInt(ADefinition.ModeSource, VPos) and (VPos >= 0) and (VPos <= Ord(High(TTSSMode))) then
ModeValue := TTSSMode(Ord(LoByte(VPos)))
else
ModeValue := c_TSSMode_Default;
// ETS_INTERNAL_TSS_CODE
if not TryStrToInt(ADefinition.CodeSource, CodeValue) then
CodeValue := 0;
// íåêèé ðåçóëüòàò (ïîïðàâèòü ÷òîáû áûë ñìûñë åãî âîçâðàùàòü)
Result := (AreaValue<>nil) or (FullValue<>nil);
end;
procedure TTSS_Info.Clear;
begin
AreaValue := nil;
FullValue := nil;
end;
function TTSS_Info.TileInSection(
const AZoom: Byte;
const AXYPtr: PPoint
): Boolean;
begin
Result := FALSE;
// ìîæåò ñåêöèÿ îòêëþ÷åíà
if (tssm_Off=ModeValue) then
Exit;
if (FullValue<>nil) then begin
// íåêîòîðûå çóìû çàëåòàþò öåëèêîì
if FullValue.ZoomInList(AZoom) then begin
// ïîäõîäèò - çíà÷èò TRUE (åñëè èíâåðñèÿ - FALSE)
Result := (tssm_Inversion<>ModeValue);
Exit;
end;
end;
if (AreaValue<>nil) then begin
// ìîæåò áûòü ïîïàëè â îáëàñòü ñåêöèè
if AreaValue.TileInArea(AZoom, AXYPtr) then begin
// ïîäõîäèò - çíà÷èò TRUE (åñëè èíâåðñèÿ - FALSE)
Result := (tssm_Inversion<>ModeValue);
Exit;
end;
end;
// íèêóäà íå ïîïàëè
Result := (tssm_Inversion=ModeValue);
end;
{ TTSS_Primary_Params }
procedure TTSS_Primary_Params.ApplyAlgorithmValue(const AParamValue: String);
begin
if SameText(AParamValue, 'Linked') then
Algorithm := tssal_Linked
else if SameText(AParamValue, 'Manual') then
Algorithm := tssal_Manual
else
Algorithm := tssal_None;
end;
procedure TTSS_Primary_Params.ApplyLinkValue(const AParamValue: String; const AValuePtr: PTSS_Link_Type);
begin
if SameText(AParamValue, 'Primary') then
AValuePtr^ := tsslt_Primary
else if SameText(AParamValue, 'Secondary') then
AValuePtr^ := tsslt_Secondary
else if (AValuePtr = @NewTileTable_Link) and SameText(AParamValue, 'Destination') then
AValuePtr^ := tsslt_Destination
else
AValuePtr^ := tsslt_Primary;
end;
function TTSS_Primary_Params.UseSingleConn(const AAllowNewObjects: Boolean): Boolean;
begin
Result :=
// ëèáî âîîáùå íå äîëæíî áûòü ñåêöèîíèðîâàíèÿ
(tssal_None = Algorithm)
OR
// ëèáî ýòî òîëüêî âñòðîåííîå ñåêöèîíèðîâàíèå è íåò ñåêöèé áåç êîäîâ
// è íå ñîçäà¸ì íîâûå òàáëèöû
((tssal_Linked = Algorithm) and (not HasSectionWithoutCode) and (not AAllowNewObjects));
end;
end.