This is SplineView.m in view mode; [Download] [Up]
#import <Foundation/Foundation.h> #import "SplineView.h" #import "Spline.h" #import "BezierORShape.h" @implementation SplineView - initWithFrame:(NSRect)frameRect { [super initWithFrame:frameRect]; spline = nil; drawFlags = DRAW_ALL; return self; } - (void)dealloc { if(spline) [spline release]; return [super dealloc]; } - (void)drawRect:(NSRect)r { PSsetgray(NSWhite); NSRectFill([self bounds]); if(spline){ if([[NSDPSContext currentContext] isDrawingToScreen]) [spline drawWithFlags:drawFlags]; else [spline drawSpecial]; } } - (void)mouseDown:(NSEvent *)event { [self lockFocus]; if(([event modifierFlags] & NSControlKeyMask) == NSControlKeyMask) [self createSpline:event]; else [self changeSpline:event]; [self drawRect:[self bounds]]; [[self window] flushWindow]; PSWait(); [self unlockFocus]; } - (void)createSpline:(NSEvent *)event { NSPoint p; BOOL finished = NO; if(spline) [spline empty]; else spline = [[Spline alloc] init]; [spline setParametrisationType:[parametrisationMatrix selectedTag]]; [spline setEndPointAType:[endPointAMatrix selectedTag]]; [spline setEndPointBType:[endPointBMatrix selectedTag]]; do { event = [[self window] nextEventMatchingMask:NSLeftMouseUpMask|NSLeftMouseDownMask|NSLeftMouseDraggedMask]; if([event type] == NSLeftMouseUp && [event clickCount] >= 2) finished = YES; else { p = [event locationInWindow]; p = [self convertPoint:p fromView:nil]; PSsetgray(NSWhite); NSRectFill([self bounds]); [spline drawWithPoint:p :drawFlags]; [[self window] flushWindow]; PSWait(); if([event type] == NSLeftMouseUp) [spline addPoint:p]; } } while(!finished); } - (void)changeSpline:(NSEvent *)event { NSPoint p; int pointNr; BOOL finished = NO; if(!spline) return; p = [event locationInWindow]; p = [self convertPoint:p fromView:nil]; pointNr = [spline hitWithPoint:p]; if(pointNr == -1) return; do { event = [[self window] nextEventMatchingMask:NSLeftMouseUpMask|NSLeftMouseDraggedMask]; p = [event locationInWindow]; p = [self convertPoint:p fromView:nil]; PSsetgray(NSWhite); NSRectFill([self bounds]); [spline changePointNr:pointNr to:p]; [spline drawWithFlags:drawFlags]; [[self window] flushWindow]; PSWait(); if([event type] == NSLeftMouseUp) finished = YES; } while(!finished); } - (void)changeParametrisation:(id)sender { if(!spline) return; [spline setParametrisationType:[parametrisationMatrix selectedTag]]; [self display]; } - (void)changeEndPointA:(id)sender { if(!spline) return; [spline setEndPointAType:[endPointAMatrix selectedTag]]; [self display]; } - (void)changeEndPointB:(id)sender { if(!spline) return; [spline setEndPointBType:[endPointBMatrix selectedTag]]; [self display]; } - (void)changeDrawFlags:(id)sender { drawFlags = DRAW_NONE; if([[sender cellAtRow:0 column:0] state]) drawFlags = drawFlags | DRAW_LINE; if([[sender cellAtRow:1 column:0] state]) drawFlags = drawFlags | DRAW_CURVE; if([[sender cellAtRow:2 column:0] state]) drawFlags = drawFlags | DRAW_BEZIER; [self display]; } - (void)saveAsEve:(id)sender { NSSavePanel *savepanel = [NSSavePanel savePanel]; NSString *file, *directory, *nibfile; int runResult; NSBundle *bundle = [NSBundle mainBundle]; NSMutableData *eveData; NSFileManager *fm = [NSFileManager defaultManager]; BOOL isDir; if(!spline) return; [savepanel setRequiredFileType:@"wwModel"]; runResult = [savepanel runModalForDirectory:NSHomeDirectory() file:@""]; if(runResult == NSOKButton){ if(!(file = [bundle pathForResource:@"model" ofType:@"eve"])){ NSLog(@"Could not find model.eve file"); NSBeep(); return; } if(!(nibfile = [bundle pathForResource:@"controls" ofType:@"nib"])){ NSLog(@"Could not find controls.nib file"); NSBeep(); return; } directory = [savepanel filename]; if([fm fileExistsAtPath:directory isDirectory:&isDir]){ if(![fm removeFileAtPath:directory handler:nil]){ NSLog(@"Could not remove old directory %@",directory); NSBeep(); return; } } if(![fm createDirectoryAtPath:directory attributes:nil]){ NSLog(@"Could not create directory %@",directory); NSBeep(); return; } if(![fm copyPath:nibfile toPath:[NSString stringWithFormat:@"%@/controls.nib",directory] handler:nil]){ NSLog(@"Could not copy file %@ to directory %@",nibfile,directory); NSBeep(); return; } eveData = [NSMutableData dataWithContentsOfFile:file]; [eveData appendData:[[spline rot3DShape] eveData]]; file = [NSString stringWithFormat:@"%@/model.eve",directory]; if(![eveData writeToFile:file atomically:YES]){ NSLog(@"Could not write file %@ into directory %@",file,directory); NSBeep(); return; } } } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.