This is Controller.m in view mode; [Download] [Up]
/*============================= Controller.m ================================*/ /* Class controls a demo panel. The panel shows one geographic coordinate in World Coordinates and various local UTM grid systems. It allows up to 10 such points to be selected and edited. HISTORY 7-Feb-93 Dale Amon at GPL Created */ #import "Controller.h" #import <misckit/miscgiskit.h> #define MAXPOINTS 10 @implementation Controller /*===========================================================================*/ /* Internal methods */ /*===========================================================================*/ - initTheInputMatrix: aTextMatrix { id east, north; east = [aTextMatrix findCellWithTag: EASTING]; north = [aTextMatrix findCellWithTag: NORTHING]; [east setEntryType:NX_DOUBLETYPE]; [east setFloatingPointFormat: NO left: METERS_DIGITS right: METER_FRACTION_DIGITS]; [north setEntryType:NX_DOUBLETYPE]; [north setFloatingPointFormat: NO left: METERS_DIGITS right: METER_FRACTION_DIGITS]; return self; } - outputWorldCoord: aWorldCoord inMatrix: aTextMatrix { double deg1,min1,sec1; double deg2,min2,sec2; /* Load latitude as deg:min:sec. If value is negative, ie South, display negative only on degrees field. */ [MiscCoord fromDegreesOnly: [aWorldCoord latitudeDegrees] degrees: °1 minutes: &min1 seconds: &sec1]; if (sec1 < 0.0) sec1 = -sec1; if (min1 < 0.0) min1 = -min1; if (sec1 < .00001) sec1 = 0.0; [[aTextMatrix findCellWithTag:LATITUDE_DEGREES] setDoubleValue: deg1]; [[aTextMatrix findCellWithTag:LATITUDE_MINUTES] setDoubleValue: min1]; [[aTextMatrix findCellWithTag:LATITUDE_SECONDS] setDoubleValue: sec1]; /* Load longitude as deg:min:sec If value is negative, ie East, display negative only on degrees field. */ [MiscCoord fromDegreesOnly: [aWorldCoord longitudeDegrees] degrees: °2 minutes: &min2 seconds: &sec2]; if (sec2 < 0.0) sec2 = -sec2; if (min2 < 0.0) min2 = -min2; if (sec2 < .00001) sec2 = 0.0; [[aTextMatrix findCellWithTag:LONGITUDE_DEGREES] setDoubleValue: deg2]; [[aTextMatrix findCellWithTag:LONGITUDE_MINUTES] setDoubleValue: min2]; [[aTextMatrix findCellWithTag:LONGITUDE_SECONDS] setDoubleValue: sec2]; return self; } - inputWorldCoord: aWorldCoord inMatrix: aTextMatrix { double deg,min,sec; double latitude,longitude; /* Only allow a minus sign in the degree field. A minus there makes this an South Latitude */ deg = [[aTextMatrix findCellWithTag:LATITUDE_DEGREES] doubleValue]; min = [[aTextMatrix findCellWithTag:LATITUDE_MINUTES] doubleValue]; sec = [[aTextMatrix findCellWithTag:LATITUDE_SECONDS] doubleValue]; if (sec <0.0) sec = -sec; if (min <0.0) min = -min; if (deg <0.0) {min = -min; sec = -sec;} latitude = [MiscCoord toDegreesOnlyDegrees: deg minutes: min seconds: sec]; /* Only allow a minus sign in the degree field. A minus there makes this a West Longitude */ deg = [[aTextMatrix findCellWithTag:LONGITUDE_DEGREES] doubleValue]; min = [[aTextMatrix findCellWithTag:LONGITUDE_MINUTES] doubleValue]; sec = [[aTextMatrix findCellWithTag:LONGITUDE_SECONDS] doubleValue]; if (sec <0.0) sec = -sec; if (min <0.0) min = -min; if (deg <0.0) {min = -min; sec = -sec;} longitude = [MiscCoord toDegreesOnlyDegrees: deg minutes: min seconds: sec]; [aWorldCoord setCoordLatitudeDegrees: latitude longitudeDegrees: longitude altitude: 0.0]; return self; } - outputGridCoord: aGridCoord inMatrix: aTextMatrix { [[aTextMatrix findCellWithTag:EASTING] setDoubleValue: [aGridCoord easting]]; [[aTextMatrix findCellWithTag:NORTHING] setDoubleValue: [aGridCoord northing]]; return self; } - inputGridCoord: aUTMCoord inMatrix: aTextMatrix { double easting, northing; easting = [[aTextMatrix findCellWithTag:EASTING ] doubleValue]; northing = [[aTextMatrix findCellWithTag:NORTHING] doubleValue]; [aUTMCoord setCoordEastingMeters: easting northingMeters: northing elevationMeters: 0.0]; return self; } - recalcGridCoord: aCoord toMatrix: aMatrix { [worldCoord convert: aCoord]; [self outputGridCoord: aCoord inMatrix: aMatrix]; return self; } - selectGridPnt: (unsigned int) n coord: aCoord toMatrix: aMatrix { [aCoord selectExistingPoints: n blockSize:1]; [self outputGridCoord: aCoord inMatrix: aMatrix]; return self; } /*===========================================================================*/ /* When the Application starts, we are notified and carry out the required initialization. */ - appDidInit:sender { autoLaunch = NXGetDefaultValue([NXApp appName], "NXAutoLaunch"); [self initTheInputMatrix: ukngInput]; [self initTheInputMatrix: ukz30Input]; [self initTheInputMatrix: ukz31Input]; [self initTheInputMatrix: igInput]; [self initTheInputMatrix: igOldInput]; [index setEntryType: NX_POSINTTYPE]; [index setIntValue: 1]; /* UK Grid origin */ ukngCoord = [[MiscUKUTMCoord alloc] initDescription: "A UK point"]; [ukngCoord selectAndSetMinPoints: 0 blockSize: MAXPOINTS]; /* UK Zone 30 Grid origin */ ukz30Coord = [[MiscZoneUTMCoord alloc] initDescription: "A UK Zone 30 point" zone: 30]; [ukz30Coord selectAndSetMinPoints: 0 blockSize: MAXPOINTS]; /* UK Zone 31 Grid origin */ ukz31Coord = [[MiscZoneUTMCoord alloc] initDescription: "A UK Zone 31 point" zone: 31]; [ukz31Coord selectAndSetMinPoints: 0 blockSize: MAXPOINTS]; /* Irish Grid origin */ igCoord = [[MiscIrelandUTMCoord alloc] initDescription: "An Irish Grid point"]; [igCoord selectAndSetMinPoints: 0 blockSize: MAXPOINTS]; /* Old Irish Grid */ igOldCoord = [[MiscIrelandOldUTMCoord alloc] initDescription: "An Old Irish Grid point"]; [igOldCoord selectAndSetMinPoints: 0 blockSize: MAXPOINTS]; /* init test point to Greenwich */ worldCoord = [[MiscWorldCoord alloc] initDescription: "A World Coord Point" constants: nil]; [worldCoord selectAndSetMinPoints: 0 blockSize: MAXPOINTS]; /* Set the world coord and then make all the grid cells update to match the initial value */ [worldCoord setCoordLatitudeDegrees: 49.0 longitudeDegrees: -2.0 altitude: 0.0]; /* Set all the points to the same block size so the convert method will succeed. */ [self indexChanged: self]; /* Then update them */ [self outputWorldCoord: worldCoord inMatrix: worldInput]; [self worldChanged: self]; return self; } - indexChanged: sender { unsigned int n; n = (unsigned int) [index intValue] - 1; if (![worldCoord selectExistingPoints: n blockSize:1]) {[index setIntValue: (int) [worldCoord curIndex] + 1]; return self; } [self outputWorldCoord: worldCoord inMatrix: worldInput]; [self selectGridPnt: n coord: ukngCoord toMatrix: ukngInput]; [self selectGridPnt: n coord: ukz30Coord toMatrix: ukz30Input]; [self selectGridPnt: n coord: ukz31Coord toMatrix: ukz31Input]; [self selectGridPnt: n coord: igCoord toMatrix: igInput]; [self selectGridPnt: n coord: igOldCoord toMatrix: igOldInput]; return self; } - worldChanged:sender { /* read the new value */ [self inputWorldCoord: worldCoord inMatrix: worldInput]; /* Make sure the input fields are always in a standard format */ [self outputWorldCoord: worldCoord inMatrix: worldInput]; /* update all the grid displays to match the new world Coord */ [self recalcGridCoord: ukngCoord toMatrix: ukngInput]; [self recalcGridCoord: ukz30Coord toMatrix: ukz30Input]; [self recalcGridCoord: ukz31Coord toMatrix: ukz31Input]; [self recalcGridCoord: igCoord toMatrix: igInput]; [self recalcGridCoord: igOldCoord toMatrix: igOldInput]; return self; } - ukngChanged:sender { /* read the new value */ [self inputGridCoord: ukngCoord inMatrix: ukngInput]; [ukngCoord convert: worldCoord]; [self outputWorldCoord: worldCoord inMatrix: worldInput]; /* update all the grid displays to match the new world Coord */ [self recalcGridCoord: ukz30Coord toMatrix: ukz30Input]; [self recalcGridCoord: ukz31Coord toMatrix: ukz31Input]; [self recalcGridCoord: igCoord toMatrix: igInput]; [self recalcGridCoord: igOldCoord toMatrix: igOldInput]; return self; } - ukz30Changed:sender { /* read the new value */ [self inputGridCoord: ukz30Coord inMatrix: ukz30Input]; [ukz30Coord convert: worldCoord]; [self outputWorldCoord: worldCoord inMatrix: worldInput]; /* update all the grid displays to match the new world Coord */ [self recalcGridCoord: ukngCoord toMatrix: ukngInput]; [self recalcGridCoord: ukz31Coord toMatrix: ukz31Input]; [self recalcGridCoord: igCoord toMatrix: igInput]; [self recalcGridCoord: igOldCoord toMatrix: igOldInput]; return self; } - ukz31Changed:sender { /* read the new value */ [self inputGridCoord: ukz31Coord inMatrix: ukz31Input]; [ukz31Coord convert: worldCoord]; [self outputWorldCoord: worldCoord inMatrix: worldInput]; /* update all the grid displays to match the new world Coord */ [self recalcGridCoord: ukngCoord toMatrix: ukngInput]; [self recalcGridCoord: ukz30Coord toMatrix: ukz30Input]; [self recalcGridCoord: igCoord toMatrix: igInput]; [self recalcGridCoord: igOldCoord toMatrix: igOldInput]; return self; } - igChanged:sender { /* read the new value */ [self inputGridCoord: igCoord inMatrix: igInput]; [igCoord convert: worldCoord]; [self outputWorldCoord: worldCoord inMatrix: worldInput]; /* update all the grid displays to match the new world Coord */ [self recalcGridCoord: ukngCoord toMatrix: ukngInput]; [self recalcGridCoord: ukz30Coord toMatrix: ukz30Input]; [self recalcGridCoord: ukz31Coord toMatrix: ukz31Input]; [self recalcGridCoord: igOldCoord toMatrix: igOldInput]; return self; } - igOldChanged:sender { /* read the new value */ [self inputGridCoord: igOldCoord inMatrix: igOldInput]; [igOldCoord convert: worldCoord]; [self outputWorldCoord: worldCoord inMatrix: worldInput]; /* update all the grid displays to match the new world Coord */ [self recalcGridCoord: ukngCoord toMatrix: ukngInput]; [self recalcGridCoord: ukz30Coord toMatrix: ukz30Input]; [self recalcGridCoord: ukz31Coord toMatrix: ukz31Input]; [self recalcGridCoord: igCoord toMatrix: igInput]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.