-
Notifications
You must be signed in to change notification settings - Fork 0
/
Symbol.m
executable file
·282 lines (211 loc) · 5.35 KB
/
Symbol.m
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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
//
// Data.m
// DrPlot
//
// Created by Peter Appel on 12/09/2007.
// Copyright __MyCompanyName__ 2007 . All rights reserved.
//
#import "Symbol.h"
@implementation Symbol
+ (void)initialize
{
// This method gets invoked for every subclass of Symbol that's instantiated. That's a good thing, in this case. In most other cases it means you have to check self to protect against redundant invocations.
// Set up use of the KVO dependency mechanism for the receiving class. The use of +keysForValuesAffectingDrawingBounds and +keysForValuesAffectingDrawingContents allows subclasses to easily customize this when they define entirely new properties that affect how they draw.
[self keyPathsForValuesAffectingValueForKey:@"drawingBounds"];
[self keyPathsForValuesAffectingValueForKey:@"drawingContents"];
}
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"drawingBounds"]) {
NSArray *affectingKeys = @[@"xLoc", @"yLoc", @"radius"];
keyPaths = [keyPaths setByAddingObjectsFromArray:affectingKeys];
}
if ([key isEqualToString:@"drawingContents"]) {
NSArray *affectingKeys = @[@"xLoc", @"yLoc", @"color", @"radius", @"pathType"];
keyPaths = [keyPaths setByAddingObjectsFromArray:affectingKeys];
}
return keyPaths;
}
+ (NSSet *)keysForValuesAffectingDrawingBounds
{
// The properties managed by Symbol that affect the drawing bounds.
static NSSet *keysForValuesAffectingDrawingBounds = nil;
if (!keysForValuesAffectingDrawingBounds)
{
keysForValuesAffectingDrawingBounds =
[[NSSet alloc] initWithObjects:
@"xLoc", @"yLoc", @"radius", nil];
}
return keysForValuesAffectingDrawingBounds;
}
+ (NSSet *)keysForValuesAffectingDrawingContents
{
// The properties managed by symbol that affect the drawing contents.
static NSSet *keysForValuesAffectingDrawingContents = nil;
if (!keysForValuesAffectingDrawingContents)
{
keysForValuesAffectingDrawingContents =
[[NSSet alloc] initWithObjects:
@"xLoc", @"yLoc", @"color", @"radius", @"pathType", nil];
}
return keysForValuesAffectingDrawingContents;
}
- (id)init
{
if (self = [super init])
{
[self setIdentificator:@"#"];
[self setaValue:1.0];
[self setbValue:1.0];
[self setcValue:4.0];
[self setRadius:2.0];
[self setColor:[NSColor redColor]];
[self setPathType:1];
[self setXLoc:15.0];
[self setYLoc:15.0];
}
return self;
}
-(void)drawInView:(NSView *)aView
{
NSPoint point = [self convertABC2XY:aValue b: bValue c:cValue];
[self setXLoc:point.x];
[self setYLoc:point.y];
NSRect symbolBounds =
NSMakeRect(xLoc-radius, yLoc-radius, radius*2, radius*2);
NSBezierPath *symbol = [NSBezierPath bezierPath];
NSLog(@"symbol drawInView %@", self);
// NSLog(@"symbol drawInView %f %f", xLoc, yLoc);
NSColor *myColor = [self color];
if (myColor == nil) { myColor = [NSColor redColor]; }
switch (pathType) {
// Circle
case 0: {
symbol = [NSBezierPath bezierPathWithOvalInRect:symbolBounds];
[myColor setStroke];
[symbol stroke];
}
break;
// Dot
case 1: {
symbol = [NSBezierPath bezierPathWithOvalInRect:symbolBounds];
[myColor set];
[symbol fill];
}
break;
// Square
case 2: {
symbol = [NSBezierPath bezierPathWithRect:symbolBounds];
[myColor setStroke];
[symbol stroke];
}
break;
// Filled Square
case 3: {
symbol = [NSBezierPath bezierPathWithRect:symbolBounds];
[myColor set];
[symbol fill];
}
break;
default:
break;
}
[symbol setLineWidth:0.5];
}
- (BOOL)hitTest:(NSPoint)point isSelected:(BOOL)isSelected
{
// ignore isSelected here for simplicity...
// don't count shadow for selection
NSRect symbolBounds =
NSMakeRect(xLoc-radius, yLoc-radius, radius*2, radius*2);
NSBezierPath *symbol;
symbol = [NSBezierPath bezierPathWithOvalInRect:symbolBounds];
return [symbol containsPoint:point];
}
-(NSPoint)convertABC2XY:(float)a b:(float)b c:(float)c
{
NSPoint point = NSMakePoint((b/(a + b + c) + c/(a + b + c) * 0.5) * 500.0, c/(a + b + c) * 0.8660254 * 500.0);
return point;
}
- (NSRect)drawingBounds
{
NSRect symbolBounds = NSMakeRect(xLoc-radius, yLoc-radius,
radius*2, radius*2);
return (symbolBounds);
}
- (float)radius
{
return radius;
}
- (void)setRadius:(float)aRadius
{
radius = aRadius;
}
- (float)aValue
{
return aValue;
}
- (float)bValue
{
return bValue;
}
- (float)cValue
{
return cValue;
}
- (void)setaValue:(float)x
{
aValue = x;
}
- (void)setbValue:(float)x
{
bValue = x;
}
- (void)setcValue:(float)x
{
cValue = x;
}
-(void)dealloc
{
[super dealloc];
}
- (void)setIdentificator:(NSString *)anIdentificator
{
anIdentificator = [anIdentificator copy];
[identificator release];
identificator = anIdentificator;
}
- (NSString *)identificator
{
return identificator;
}
- (float)xLoc
{
return xLoc;
}
- (void)setXLoc:(float)aXLoc
{
xLoc = aXLoc;
}
- (float)yLoc
{
return yLoc;
}
- (void)setYLoc:(float)aYLoc
{
yLoc = aYLoc;
}
- (NSColor *)color { return color; }
- (void)setColor:(NSColor *)aColor
{
if (color != aColor) {
[color release];
color = [aColor retain];
}
}
-(int)pathType { return pathType; }
- (void)setPathType:(int)aPathType
{
pathType = aPathType;
}
@end