This is Inspect3D.m in view mode; [Download] [Up]
/* Inspect3D.m by Mike Gravina July 1992 * Controls 3d perspective plots * * Copyright (C) 1991 The Board of Trustees of * The Leland Stanford Junior University. All Rights Reserved. */ #import "HGraphicView.h" #import "Inspect3D.h" const char Inspect3D_h_rcsid[] = INSPECT3D_H_ID; const char Inspect3D_m_rcsid[] = "$Id: Inspect3D.m,v 2.22 1993/03/23 22:49:00 rensing Exp $"; #import "FineSlider.h" #import "NewInspector.h" #import "Plot.h" #import "h3D.h" #define PI 3.1415926536 #define RAD_TO_DEG 180.0/PI @implementation Inspect3D - initInspFor:aDraw { NXBundle *bundle; char buffer[MAXPATHLEN+1]; [super initInspFor:aDraw]; bundle = [NXBundle bundleForClass:[self class]]; if ( [bundle getPath:buffer forResource:"Inspect3D" ofType:"nib"] ) { [NXApp loadNibFile:buffer owner:self withNames:NO fromZone:[self zone]]; } [theInspector addView:[contentBox contentView] withName:"3D Options" withSupervisor:self]; return self; } - showError:(char *)errorMessage { NXRunAlertPanel("Error", errorMessage, "OK", NULL, NULL); return self; } - updateView { threeD_t *threeD; graphtype_t type; if (firstPlot) { disp = [firstPlot histDisplay]; type = h_getDispType( disp ); if ( type == LEGOPLOT || type == THREEDSCATTER ) { [distanceSlider setEnabled:YES]; [phiSlider setEnabled:YES]; [thetaSlider setEnabled:YES]; [distText setEnabled:YES]; [phiText setEnabled:YES]; [thetaText setEnabled:YES]; [cubeSwitch setEnabled:YES]; [grayMatrix setEnabled:YES]; if (disp->threeDWorkArea == NULL) return self; threeD = disp->threeDWorkArea; [thetaSlider setFloatValue:disp->theta]; [thetaText setFloatValue:RAD_TO_DEG*disp->theta]; [phiSlider setFloatValue:-disp->phi]; [phiText setFloatValue:-RAD_TO_DEG*disp->phi]; [distanceSlider setFloatValue:-1/disp->dist]; [distText setFloatValue:disp->dist]; [cubeSwitch setState:(int)threeD->doCube]; [wireFrameSwitch setState:(int)threeD->doWireFrame]; [fillSwitch setState:(int)threeD->doFill]; [meshSwitch setState:(int)threeD->doMesh]; if (disp->graphtype == LEGOPLOT) { [wireFrameSwitch setEnabled:YES]; [fillSwitch setEnabled:YES]; [meshSwitch setEnabled:YES]; } else if (disp->graphtype == THREEDSCATTER) { [wireFrameSwitch setEnabled:NO]; [fillSwitch setEnabled:NO]; [meshSwitch setEnabled:NO]; } } else { [distanceSlider setEnabled:NO]; [phiSlider setEnabled:NO]; [thetaSlider setEnabled:NO]; [distText setEnabled:NO]; [phiText setEnabled:NO]; [thetaText setEnabled:NO]; [cubeSwitch setEnabled:NO]; [wireFrameSwitch setEnabled:NO]; [fillSwitch setEnabled:NO]; [meshSwitch setEnabled:NO]; [grayMatrix setEnabled:NO]; } } return self; } - reset:sender { [graphicView graphicsPerform:@selector(reset3D) andDraw:YES]; [[graphicView window] flushWindow]; return self; } - newGray:sender { id thisSlider; struct { int faceNo; float value; } grayValue; thisSlider = [sender selectedCell]; grayValue.faceNo = [thisSlider tag]; grayValue.value = [thisSlider floatValue]; [graphicView graphicsPerform:@selector(newGray3D:) with :(id)&grayValue andDraw:YES]; [[graphicView window] flushWindow]; return self; } - newTheta:sender { float angle; angle = [sender floatValue]; [thetaText setFloatValue:RAD_TO_DEG * angle]; [graphicView graphicsPerform:@selector(newTheta3D:) with :(float *)&angle andDraw:YES]; [[[graphicView window] flushWindow] makeKeyWindow]; return self; } - newPhi:sender { float angle; angle = [sender floatValue]; [phiText setFloatValue:RAD_TO_DEG * angle]; [graphicView graphicsPerform:@selector(newPhi3D:) with :(float *)&angle andDraw:YES]; [[[graphicView window] flushWindow] makeKeyWindow]; return self; } - newDist:sender { float distance; distance = [sender floatValue]; if (distance < 1.8) { [self showError:"Distance must be greater than 1.8"]; return self; } [distanceSlider setFloatValue:-1./ distance]; [distText setFloatValue:distance]; [graphicView graphicsPerform:@selector(newDist3D:) with :(float *)&distance andDraw:YES]; [[[graphicView window] flushWindow] makeKeyWindow]; return self; } - newInvDist:sender { float invDist, distance; invDist = -[sender floatValue]; if (invDist == 0.) distance = HUGE; else distance = 1./ invDist; [distText setFloatValue:distance]; [graphicView graphicsPerform:@selector(newDist3D:) with :(float *)&distance andDraw:YES]; [[[graphicView window] flushWindow] makeKeyWindow]; return self; } - newTheta_degrees:sender { float angle; angle = [sender floatValue] / RAD_TO_DEG; [thetaSlider setFloatValue:angle]; [thetaText setFloatValue:angle]; [graphicView graphicsPerform:@selector(newTheta3D:) with :(float *)&angle andDraw:YES]; [[[graphicView window] flushWindow] makeKeyWindow]; return self; } - newPhi_degrees:sender { float angle; angle = [sender floatValue] / RAD_TO_DEG; [phiSlider setFloatValue:angle]; [phiText setFloatValue:angle]; [graphicView graphicsPerform:@selector(newPhi3D:) with :(float *)&angle andDraw:YES]; [[[graphicView window] flushWindow] makeKeyWindow]; return self; } - toggleCube:sender { BOOL state; state = (BOOL)[sender state]; [graphicView graphicsPerform:@selector(toggleCube3D:) with :(BOOL *)&state andDraw:YES]; [[graphicView window] flushWindow]; return self; } - toggleWireFrame:sender; { BOOL state; state = (BOOL)[sender state]; [graphicView graphicsPerform:@selector(toggleWireFrame3D:) with :(BOOL *)&state andDraw:YES]; [[graphicView window] flushWindow]; return self; } - toggleFill:sender { BOOL state; state = (BOOL)[sender state]; [graphicView graphicsPerform:@selector( toggleFill3D:) with :(BOOL *)&state andDraw:YES]; [[graphicView window] flushWindow]; return self; } - toggleMesh:sender { BOOL state; state = (BOOL)[sender state]; [graphicView graphicsPerform:@selector(toggleMesh3D:) with :(BOOL *)&state andDraw:YES]; [[graphicView window] flushWindow]; return self; } - mouseMoved:(const NXPoint *)offset in:sender withKey:(int)flag { threeD_t *threeD; float theta,phi; disp = ([sender histDisplay]); threeD = disp->threeDWorkArea; if (flag & NX_COMMANDMASK) { /*command key was held down */ theta = disp->theta + ((offset->x)*3.14/180); if (theta > 3.14) theta = theta - 6.28; /* pi * 2 */ if (theta < -3.14) theta = 6.28 + theta; [sender newTheta3D:&theta]; phi = -disp->phi + ((offset->y)*3.14/180); if (phi > 1.57) phi = -3.14 + phi; if (phi < -1.57) phi = 3.14 + phi; [sender newPhi3D:&phi]; } if (flag & NX_CONTROLMASK) { float diff,dist; diff = [distanceSlider mmaxValue] - [distanceSlider mminValue]; dist = disp->dist + ((offset->y)*diff/100); if (dist > -1./[distanceSlider mmaxValue]) dist = -1./[distanceSlider mmaxValue]; if (dist < -1./[distanceSlider mminValue]) dist = -1./[distanceSlider mminValue]; [sender newDist3D:&dist]; } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.