1// 2// PRCCustTraceEdges.m 3// PRICE 4// 5// Created by Riccardo Mottola on Thu Mar 18 2004. 6// Copyright (c) 2004-2010 Carduus. All rights reserved. 7// 8// This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 9// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 10 11#import "PRCCustTraceEdges.h" 12#import "PRCustTraceEdges.h" 13#import "MyDocument.h" 14#import "PRMedian.h" 15 16 17@implementation PRCCustTraceEdges 18 19- (id)init 20{ 21 if ((self = [super init])) 22 { 23 filter = [[PRCustTraceEdges alloc] init]; 24 } 25 return self; 26} 27 28- (IBAction)showFilter:(id)sender 29{ 30 [super showFilter:sender]; 31 32 if (!edgeWindow) 33 [NSBundle loadNibNamed:@"CustTraceEdges" owner:self]; 34 [edgeWindow makeKeyAndOrderFront:nil]; 35 36 /* edge tracer NIB defaults setting */ 37 [thresholdSlider setEnabled:YES]; 38 [thresholdField setEnabled:YES]; 39 if ([[filterType selectedItem] tag] >= 7) 40 [zeroCrossCheck setEnabled:YES]; 41 thresholdLevel = [thresholdField floatValue]; 42 43 /* median image panes enables from NIB */ 44 if ([enableCheck1 state] == NSOffState) 45 [self toggleStatePane1:NO]; 46 if ([enableCheck2 state] == NSOffState) 47 [self toggleStatePane2:NO]; 48 if ([enableCheck3 state] == NSOffState) 49 [self toggleStatePane3:NO]; 50 51 [self parametersChanged:self]; 52} 53 54- (NSArray *)encodeParameters 55{ 56 BOOL enable1, enable2, enable3; 57 enum medianForms theForm1, theForm2, theForm3; 58 BOOL isSeparable1, isSeparable2, isSeparable3; 59 int theSize1, theSize2, theSize3; 60 BOOL zeroCrossOn; 61 NSArray *parameters; 62 63 theForm1 = theForm2 = theForm3 = 0; 64 isSeparable1 = isSeparable2 = isSeparable3 = 0; 65 theSize1 = theSize2 = theSize3 = 0; 66 67 if ([enableCheck1 state] == NSOnState) 68 { 69 enable1 = YES; 70 if ([separableCheck1 state] == NSOnState) 71 isSeparable1 = YES; 72 else 73 isSeparable1 = NO; 74 switch ([[formSelect1 selectedItem] tag]) 75 { 76 case 1: theForm1 = HORIZONTAL_F; 77 break; 78 case 2: theForm1 = VERTICAL_F; 79 break; 80 case 3: theForm1 = CROSS_F; 81 break; 82 case 4: theForm1 = BOX_F; 83 break; 84 default: NSLog(@"Unrecognized form selected"); 85 theForm1 = BOX_F; 86 } 87 theSize1 = [sizeSlider1 intValue]; 88 } else 89 enable1 = NO; 90 91 if ([enableCheck2 state] == NSOnState) 92 { 93 enable2 = YES; 94 if ([separableCheck2 state] == NSOnState) 95 isSeparable2 = YES; 96 else 97 isSeparable2 = NO; 98 switch ([[formSelect2 selectedItem] tag]) 99 { 100 case 1: theForm2 = HORIZONTAL_F; 101 break; 102 case 2: theForm2 = VERTICAL_F; 103 break; 104 case 3: theForm2 = CROSS_F; 105 break; 106 case 4: theForm2 = BOX_F; 107 break; 108 default: NSLog(@"Unrecognized form selected"); 109 theForm2 = BOX_F; 110 } 111 theSize2 = [sizeSlider2 intValue]; 112 } else 113 enable2 = NO; 114 115 if ([enableCheck3 state] == NSOnState) 116 { 117 enable3 = YES; 118 if ([separableCheck3 state] == NSOnState) 119 isSeparable3 = YES; 120 else 121 isSeparable3 = NO; 122 switch ([[formSelect3 selectedItem] tag]) 123 { 124 case 1: theForm3 = HORIZONTAL_F; 125 break; 126 case 2: theForm3 = VERTICAL_F; 127 break; 128 case 3: theForm3 = CROSS_F; 129 break; 130 case 4: theForm3 = BOX_F; 131 break; 132 default: NSLog(@"Unrecognized form selected"); 133 theForm3 = BOX_F; 134 } 135 theSize3 = [sizeSlider3 intValue]; 136 } else 137 enable3 = NO; 138 139 if ([zeroCrossCheck state] == NSOnState) 140 zeroCrossOn = YES; 141 else 142 zeroCrossOn = NO; 143 144 /* set automatically zero cross */ 145 if ([[filterType selectedItem] tag] < 7) 146 { 147 [zeroCrossCheck setState:NO]; 148 zeroCrossOn = NO; 149 } 150 151 parameters = [NSArray arrayWithObjects: 152 [NSNumber numberWithInt: [[filterType selectedItem] tag]], 153 [NSNumber numberWithFloat: thresholdLevel], 154 [NSNumber numberWithBool: zeroCrossOn], 155 [NSNumber numberWithBool: enable1], 156 [NSNumber numberWithInt: theForm1], 157 [NSNumber numberWithInt: theSize1], 158 [NSNumber numberWithBool: isSeparable1], 159 [NSNumber numberWithBool: enable2], 160 [NSNumber numberWithInt: theForm2], 161 [NSNumber numberWithInt: theSize2], 162 [NSNumber numberWithBool: isSeparable2], 163 [NSNumber numberWithBool: enable3], 164 [NSNumber numberWithInt: theForm3], 165 [NSNumber numberWithInt: theSize3], 166 [NSNumber numberWithBool: isSeparable3], 167 nil]; 168 169 170 return parameters; 171} 172 173- (void)closeFilterPanel 174{ 175 [edgeWindow performClose:nil]; 176} 177 178- (IBAction)changeSize1:(id)sender 179{ 180 [sizeField1 setIntValue :[sizeSlider1 intValue] * 2 + 1]; 181 [self parametersChanged:sender]; 182} 183 184- (IBAction)changeSize2:(id)sender 185{ 186 [sizeField2 setIntValue :[sizeSlider2 intValue] * 2 + 1]; 187 [self parametersChanged:sender]; 188} 189 190- (IBAction)changeSize3:(id)sender 191{ 192 [sizeField3 setIntValue :[sizeSlider3 intValue] * 2 + 1]; 193 [self parametersChanged:sender]; 194} 195 196- (IBAction)enablePane1:(id)sender 197{ 198 if ([enableCheck1 state] == NSOnState) 199 [self toggleStatePane1:YES]; 200 else 201 [self toggleStatePane1:NO]; 202 [self parametersChanged:sender]; 203 204} 205 206- (IBAction)enablePane2:(id)sender 207{ 208 if ([enableCheck2 state] == NSOnState) 209 [self toggleStatePane2:YES]; 210 else 211 [self toggleStatePane2:NO]; 212 [self parametersChanged:sender]; 213} 214 215- (IBAction)enablePane3:(id)sender 216{ 217 if ([enableCheck3 state] == NSOnState) 218 [self toggleStatePane3:YES]; 219 else 220 [self toggleStatePane3:NO]; 221 [self parametersChanged:sender]; 222} 223 224 225- (IBAction)toggleStatePane1:(BOOL) state 226{ 227 if (state == NSOnState) 228 { 229 [separableCheck1 setEnabled:YES]; 230 [formSelect1 setEnabled:YES]; 231 [sizeSlider1 setEnabled:YES]; 232 } else 233 { 234 [separableCheck1 setEnabled:NO]; 235 [formSelect1 setEnabled:NO]; 236 [sizeSlider1 setEnabled:NO]; 237 } 238} 239 240- (IBAction)toggleStatePane2:(BOOL) state 241{ 242 if (state == NSOnState) 243 { 244 [separableCheck2 setEnabled:YES]; 245 [formSelect2 setEnabled:YES]; 246 [sizeSlider2 setEnabled:YES]; 247 } else 248 { 249 [separableCheck2 setEnabled:NO]; 250 [formSelect2 setEnabled:NO]; 251 [sizeSlider2 setEnabled:NO]; 252 } 253} 254 255- (IBAction)toggleStatePane3:(BOOL) state 256{ 257 if (state == NSOnState) 258 { 259 [separableCheck3 setEnabled:YES]; 260 [formSelect3 setEnabled:YES]; 261 [sizeSlider3 setEnabled:YES]; 262 } else 263 { 264 [separableCheck3 setEnabled:NO]; 265 [formSelect3 setEnabled:NO]; 266 [sizeSlider3 setEnabled:NO]; 267 } 268} 269 270 271- (IBAction)changeThreshold:(id)sender 272{ 273 thresholdLevel = [sender floatValue]; 274 [thresholdField setFloatValue:thresholdLevel]; 275 [self parametersChanged:sender]; 276} 277 278@end 279