source: VectorObject/UVectorObject.pas

Last change on this file was 31, checked in by george, 14 years ago
  • Opravy a rozšíření funkčností některých tříd
File size: 7.0 KB
Line 
1unit UVectorObject;
2
3{$mode delphi}
4
5interface
6
7uses
8 Classes, SysUtils, Graphics, Contnrs;
9
10type
11 TVectorGroup = class;
12
13 { TVectorObject }
14
15 TVectorObject = class
16 private
17 FScale: Double;
18 procedure SetScale(const AValue: Double); virtual;
19 public
20 Parent: TVectorGroup;
21 Position: TPoint;
22 property Scale: Double read FScale write SetScale;
23 function TransformX(Value: Double): Integer;
24 function TransformY(Value: Double): Integer;
25 procedure Draw; virtual;
26 constructor Create(Owner: TVectorGroup = nil);
27 end;
28
29 { TVectorDot }
30
31 TVectorDot = class(TVectorObject)
32 procedure Draw; override;
33 end;
34
35 { TVectorMultiLine }
36
37 TVectorLine = class(TVectorObject)
38 Points: TObjectList; // of TVectorDot
39 procedure Add(Position: TPoint);
40 procedure Draw; override;
41 constructor Create(Owner: TVectorGroup = nil);
42 destructor Destroy; override;
43 end;
44
45 { TVectorRectangle }
46
47 TVectorRectangle = class(TVectorObject)
48 Size: TPoint;
49 Brush: TBrush;
50 procedure Draw; override;
51 constructor Create(Owner: TVectorGroup = nil);
52 destructor Destroy; override;
53 end;
54
55 { TVectorBitmap }
56
57 TVectorBitmap = class(TVectorObject)
58 Bitmap: TBitmap;
59 procedure Draw; override;
60 end;
61
62 { TVectorText }
63
64 TVectorText = class(TVectorObject)
65 Font: TFont;
66 Text: string;
67 Brush: TBrush;
68 procedure Draw; override;
69 constructor Create(Owner: TVectorGroup = nil);
70 destructor Destroy; override;
71 end;
72
73 { TVectorCanvas }
74
75 { TVectorGroup }
76
77 TVectorGroup = class(TVectorObject)
78 private
79 procedure SetScale(const AValue: Double); override;
80 public
81 Brush: TBrush;
82 Objects: TObjectList; // of TVectorObject
83 BitmapCanvas: TCanvas;
84 Pen: TPen;
85 Font: TFont;
86 constructor Create(Owner: TVectorGroup = nil);
87 destructor Destroy; override;
88 procedure Draw; override;
89 procedure Ellipse(x1, y1, x2, y2: Integer);
90 procedure MoveTo(X, Y: Integer);
91 procedure LineTo(X, Y: Integer);
92 procedure Rectangle(x1, y1, x2, y2: Integer);
93 procedure TextOut(X, Y: Integer; Text: string);
94 end;
95
96implementation
97
98{ TVectorObject }
99
100procedure TVectorObject.SetScale(const AValue: Double);
101begin
102 if FScale = AValue then exit;
103 FScale := AValue;
104end;
105
106function TVectorObject.TransformX(Value: Double): Integer;
107begin
108 Result := Round((Value + Position.X) * Scale);
109end;
110
111function TVectorObject.TransformY(Value: Double): Integer;
112begin
113 Result := Round((Value + Position.Y) * Scale);
114end;
115
116procedure TVectorObject.Draw;
117begin
118
119end;
120
121constructor TVectorObject.Create(Owner: TVectorGroup = nil);
122begin
123 Position := Point(0, 0);
124 Scale := 1;
125 Parent := Owner;
126 if Assigned(Owner) then
127 Owner.Objects.Add(Self);
128end;
129
130{ TVectorLine }
131
132procedure TVectorLine.Add(Position: TPoint);
133var
134 NewPoint: TVectorDot;
135begin
136 NewPoint := TVectorDot.Create;
137 NewPoint.Position := Position;
138 Points.Add(NewPoint);
139end;
140
141procedure TVectorLine.Draw;
142var
143 I: Integer;
144begin
145 inherited Draw;
146 for I := 0 to Points.Count - 1 do
147 begin
148 if I = 0 then Parent.MoveTo(TransformX(TVectorObject(Points[I]).Position.X),
149 TransformY(TVectorObject(Points[I]).Position.Y))
150 else Parent.LineTo(TransformX(TVectorObject(Points[I]).Position.X),
151 TransformY(TVectorObject(Points[I]).Position.Y));
152 end;
153end;
154
155constructor TVectorLine.Create(Owner: TVectorGroup);
156begin
157 inherited;
158 Points := TObjectList.Create;
159end;
160
161destructor TVectorLine.Destroy;
162begin
163 Points.Destroy;
164 inherited Destroy;
165end;
166
167{ TVectorDot }
168
169procedure TVectorDot.Draw;
170begin
171 inherited Draw;
172 Parent.Ellipse(Round(Position.X - Scale / 2), Round(Position.Y - Scale / 2),
173 Round(Position.X + Scale / 2), Round(Position.Y + Scale / 2));
174end;
175
176{ TVectorRectangle }
177
178procedure TVectorRectangle.Draw;
179begin
180 inherited Draw;
181 Parent.Brush.Assign(Brush);
182 Parent.Rectangle(TransformX(-Size.X / 2), TransformY(-Size.Y / 2),
183 TransformX(Size.X / 2), TransformY(Size.Y / 2));
184end;
185
186constructor TVectorRectangle.Create;
187begin
188 inherited;
189 Brush := TBrush.Create;
190 Size := Point(1, 1);
191end;
192
193destructor TVectorRectangle.Destroy;
194begin
195 Brush.Destroy;
196 inherited;
197end;
198
199{ TVectorGroup }
200
201procedure TVectorGroup.SetScale(const AValue:Double);
202begin
203 inherited SetScale(AValue);
204end;
205
206constructor TVectorGroup.Create(Owner: TVectorGroup = nil);
207begin
208 inherited;
209 Objects := TObjectList.Create;
210 Brush := TBrush.Create;
211 Pen := TPen.Create;
212 Font := TFont.Create;
213end;
214
215destructor TVectorGroup.Destroy;
216var
217 I: Integer;
218begin
219 Font.Destroy;
220 Pen.Destroy;
221 Brush.Destroy;
222 Objects.Destroy;
223 inherited Destroy;
224end;
225
226procedure TVectorGroup.Draw;
227var
228 I: Integer;
229begin
230 for I := 0 to Objects.Count - 1 do
231 TVectorObject(Objects[I]).Draw;
232end;
233
234procedure TVectorGroup.Ellipse(x1,y1,x2,y2:Integer);
235begin
236 if Assigned(Parent) then Parent.Ellipse(TransformX(X1), TransformY(Y1),
237 TransformX(X2), TransformY(Y2))
238 else BitmapCanvas.Ellipse(TransformX(X1), TransformY(Y1),
239 TransformX(X2), TransformY(Y2));
240end;
241
242procedure TVectorGroup.MoveTo(X, Y: Integer);
243begin
244 if Assigned(Parent) then Parent.MoveTo(TransformX(X), TransformY(Y))
245 else BitmapCanvas.MoveTo(TransformX(X), TransformY(Y));
246end;
247
248procedure TVectorGroup.LineTo(X, Y: Integer);
249begin
250 if Assigned(Parent) then Parent.LineTo(TransformX(X), TransformY(Y))
251 else BitmapCanvas.LineTo(TransformX(X), TransformY(Y));
252end;
253
254procedure TVectorGroup.Rectangle(x1,y1,x2,y2:Integer);
255begin
256 if Assigned(Parent) then begin
257 Parent.Brush.Assign(Brush);
258 Parent.Rectangle(TransformX(X1), TransformY(Y1),
259 TransformX(X2), TransformY(Y2));
260 end else begin
261 BitmapCanvas.Brush.Assign(Brush);
262 BitmapCanvas.Rectangle(TransformX(X1), TransformY(Y1),
263 TransformX(X2), TransformY(Y2));
264 end;
265end;
266
267procedure TVectorGroup.TextOut(X,Y:Integer;Text:string);
268begin
269 if Assigned(Parent) then begin
270 Parent.Font.Assign(Font);
271 Parent.Font.Size := Round(Font.Size * Scale);
272 Parent.TextOut(TransformX(X), TransformY(Y), Text)
273 end else begin
274 BitmapCanvas.Font.Assign(Font);
275 BitmapCanvas.Font.Size := Round(Font.Size * Scale);
276 BitmapCanvas.TextOut(TransformX(X - BitmapCanvas.TextWidth(Text) / 2),
277 TransformY(Y - BitmapCanvas.TextHeight(Text) / 2), Text);
278 end;
279end;
280
281{ TVectorText }
282
283procedure TVectorText.Draw;
284begin
285 inherited Draw;
286 Parent.Brush.Assign(Brush);
287 Parent.Font.Assign(Font);
288 Parent.Font.Size := Round(Font.Size * Scale);
289 Parent.TextOut(TransformX(0), TransformY(0), Text);
290end;
291
292constructor TVectorText.Create(Owner:TVectorGroup);
293begin
294 inherited;
295 Brush := TBrush.Create;
296 Font := TFont.Create;
297end;
298
299destructor TVectorText.Destroy;
300begin
301 Font.Destroy;
302 Brush.Destroy;
303 inherited Destroy;
304end;
305
306{ TVectorBitmap }
307
308procedure TVectorBitmap.Draw;
309begin
310 inherited Draw;
311end;
312
313end.
314
Note: See TracBrowser for help on using the repository browser.