From b492eabc2312d846125dd58e5dd5c43c72c9522b Mon Sep 17 00:00:00 2001 From: Vladislav Khazov Date: Sun, 23 Dec 2012 22:07:02 +0400 Subject: [PATCH 1/5] iDNA by Khazov ver1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Модель, интерфейс. --- iDNA/iDNA.xcodeproj/project.pbxproj | 329 ++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 17585 bytes .../xcschemes/iDNA.xcscheme | 86 + .../xcschemes/xcschememanagement.plist | 22 + iDNA/iDNA/HVSCellDna.h | 29 + iDNA/iDNA/HVSCellDna.m | 110 + iDNA/iDNA/HVSDocument.h | 37 + iDNA/iDNA/HVSDocument.m | 59 + iDNA/iDNA/HVSPopulationOfDna.h | 22 + iDNA/iDNA/HVSPopulationOfDna.m | 24 + iDNA/iDNA/en.lproj/Credits.rtf | 29 + iDNA/iDNA/en.lproj/HVSDocument.xib | 2372 +++++++++ iDNA/iDNA/en.lproj/InfoPlist.strings | 2 + iDNA/iDNA/en.lproj/MainMenu.xib | 4562 +++++++++++++++++ iDNA/iDNA/iDNA-Info.plist | 55 + iDNA/iDNA/iDNA-Prefix.pch | 7 + iDNA/iDNA/main.m | 14 + 18 files changed, 7766 insertions(+) create mode 100644 iDNA/iDNA.xcodeproj/project.pbxproj create mode 100644 iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/hadush.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcschemes/iDNA.xcscheme create mode 100644 iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 iDNA/iDNA/HVSCellDna.h create mode 100644 iDNA/iDNA/HVSCellDna.m create mode 100644 iDNA/iDNA/HVSDocument.h create mode 100644 iDNA/iDNA/HVSDocument.m create mode 100644 iDNA/iDNA/HVSPopulationOfDna.h create mode 100644 iDNA/iDNA/HVSPopulationOfDna.m create mode 100644 iDNA/iDNA/en.lproj/Credits.rtf create mode 100644 iDNA/iDNA/en.lproj/HVSDocument.xib create mode 100644 iDNA/iDNA/en.lproj/InfoPlist.strings create mode 100644 iDNA/iDNA/en.lproj/MainMenu.xib create mode 100644 iDNA/iDNA/iDNA-Info.plist create mode 100644 iDNA/iDNA/iDNA-Prefix.pch create mode 100644 iDNA/iDNA/main.m diff --git a/iDNA/iDNA.xcodeproj/project.pbxproj b/iDNA/iDNA.xcodeproj/project.pbxproj new file mode 100644 index 0000000..e7ef17d --- /dev/null +++ b/iDNA/iDNA.xcodeproj/project.pbxproj @@ -0,0 +1,329 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 2EEBA40516875CA5004EC063 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2EEBA40416875CA5004EC063 /* Cocoa.framework */; }; + 2EEBA40F16875CA5004EC063 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2EEBA40D16875CA5004EC063 /* InfoPlist.strings */; }; + 2EEBA41116875CA5004EC063 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EEBA41016875CA5004EC063 /* main.m */; }; + 2EEBA41516875CA5004EC063 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 2EEBA41316875CA5004EC063 /* Credits.rtf */; }; + 2EEBA41816875CA5004EC063 /* HVSDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EEBA41716875CA5004EC063 /* HVSDocument.m */; }; + 2EEBA41B16875CA5004EC063 /* HVSDocument.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2EEBA41916875CA5004EC063 /* HVSDocument.xib */; }; + 2EEBA41E16875CA6004EC063 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2EEBA41C16875CA6004EC063 /* MainMenu.xib */; }; + 2EEBA42616875D19004EC063 /* HVSCellDna.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EEBA42516875D19004EC063 /* HVSCellDna.m */; }; + 2EEBA42D168774BE004EC063 /* HVSPopulationOfDna.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EEBA42C168774BE004EC063 /* HVSPopulationOfDna.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2EEBA40016875CA5004EC063 /* iDNA.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iDNA.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 2EEBA40416875CA5004EC063 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 2EEBA40716875CA5004EC063 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 2EEBA40816875CA5004EC063 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 2EEBA40916875CA5004EC063 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 2EEBA40C16875CA5004EC063 /* iDNA-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iDNA-Info.plist"; sourceTree = ""; }; + 2EEBA40E16875CA5004EC063 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 2EEBA41016875CA5004EC063 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 2EEBA41216875CA5004EC063 /* iDNA-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iDNA-Prefix.pch"; sourceTree = ""; }; + 2EEBA41416875CA5004EC063 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + 2EEBA41616875CA5004EC063 /* HVSDocument.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HVSDocument.h; sourceTree = ""; }; + 2EEBA41716875CA5004EC063 /* HVSDocument.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HVSDocument.m; sourceTree = ""; }; + 2EEBA41A16875CA5004EC063 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/HVSDocument.xib; sourceTree = ""; }; + 2EEBA41D16875CA6004EC063 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; + 2EEBA42416875D19004EC063 /* HVSCellDna.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HVSCellDna.h; sourceTree = ""; }; + 2EEBA42516875D19004EC063 /* HVSCellDna.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HVSCellDna.m; sourceTree = ""; }; + 2EEBA42B168774BE004EC063 /* HVSPopulationOfDna.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HVSPopulationOfDna.h; sourceTree = ""; }; + 2EEBA42C168774BE004EC063 /* HVSPopulationOfDna.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HVSPopulationOfDna.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2EEBA3FD16875CA5004EC063 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2EEBA40516875CA5004EC063 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2EEBA3F516875CA5004EC063 = { + isa = PBXGroup; + children = ( + 2EEBA40A16875CA5004EC063 /* iDNA */, + 2EEBA40316875CA5004EC063 /* Frameworks */, + 2EEBA40116875CA5004EC063 /* Products */, + ); + sourceTree = ""; + }; + 2EEBA40116875CA5004EC063 /* Products */ = { + isa = PBXGroup; + children = ( + 2EEBA40016875CA5004EC063 /* iDNA.app */, + ); + name = Products; + sourceTree = ""; + }; + 2EEBA40316875CA5004EC063 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 2EEBA40416875CA5004EC063 /* Cocoa.framework */, + 2EEBA40616875CA5004EC063 /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + 2EEBA40616875CA5004EC063 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 2EEBA40716875CA5004EC063 /* AppKit.framework */, + 2EEBA40816875CA5004EC063 /* CoreData.framework */, + 2EEBA40916875CA5004EC063 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 2EEBA40A16875CA5004EC063 /* iDNA */ = { + isa = PBXGroup; + children = ( + 2EEBA42416875D19004EC063 /* HVSCellDna.h */, + 2EEBA42516875D19004EC063 /* HVSCellDna.m */, + 2EEBA42B168774BE004EC063 /* HVSPopulationOfDna.h */, + 2EEBA42C168774BE004EC063 /* HVSPopulationOfDna.m */, + 2EEBA41616875CA5004EC063 /* HVSDocument.h */, + 2EEBA41716875CA5004EC063 /* HVSDocument.m */, + 2EEBA41916875CA5004EC063 /* HVSDocument.xib */, + 2EEBA41C16875CA6004EC063 /* MainMenu.xib */, + 2EEBA40B16875CA5004EC063 /* Supporting Files */, + ); + path = iDNA; + sourceTree = ""; + }; + 2EEBA40B16875CA5004EC063 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 2EEBA40C16875CA5004EC063 /* iDNA-Info.plist */, + 2EEBA40D16875CA5004EC063 /* InfoPlist.strings */, + 2EEBA41016875CA5004EC063 /* main.m */, + 2EEBA41216875CA5004EC063 /* iDNA-Prefix.pch */, + 2EEBA41316875CA5004EC063 /* Credits.rtf */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 2EEBA3FF16875CA5004EC063 /* iDNA */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2EEBA42116875CA6004EC063 /* Build configuration list for PBXNativeTarget "iDNA" */; + buildPhases = ( + 2EEBA3FC16875CA5004EC063 /* Sources */, + 2EEBA3FD16875CA5004EC063 /* Frameworks */, + 2EEBA3FE16875CA5004EC063 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = iDNA; + productName = iDNA; + productReference = 2EEBA40016875CA5004EC063 /* iDNA.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2EEBA3F716875CA5004EC063 /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = HVS; + LastUpgradeCheck = 0450; + ORGANIZATIONNAME = "VladIslav Khazov"; + }; + buildConfigurationList = 2EEBA3FA16875CA5004EC063 /* Build configuration list for PBXProject "iDNA" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 2EEBA3F516875CA5004EC063; + productRefGroup = 2EEBA40116875CA5004EC063 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 2EEBA3FF16875CA5004EC063 /* iDNA */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 2EEBA3FE16875CA5004EC063 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2EEBA40F16875CA5004EC063 /* InfoPlist.strings in Resources */, + 2EEBA41516875CA5004EC063 /* Credits.rtf in Resources */, + 2EEBA41B16875CA5004EC063 /* HVSDocument.xib in Resources */, + 2EEBA41E16875CA6004EC063 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 2EEBA3FC16875CA5004EC063 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2EEBA41116875CA5004EC063 /* main.m in Sources */, + 2EEBA41816875CA5004EC063 /* HVSDocument.m in Sources */, + 2EEBA42616875D19004EC063 /* HVSCellDna.m in Sources */, + 2EEBA42D168774BE004EC063 /* HVSPopulationOfDna.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 2EEBA40D16875CA5004EC063 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 2EEBA40E16875CA5004EC063 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 2EEBA41316875CA5004EC063 /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + 2EEBA41416875CA5004EC063 /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + 2EEBA41916875CA5004EC063 /* HVSDocument.xib */ = { + isa = PBXVariantGroup; + children = ( + 2EEBA41A16875CA5004EC063 /* en */, + ); + name = HVSDocument.xib; + sourceTree = ""; + }; + 2EEBA41C16875CA6004EC063 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 2EEBA41D16875CA6004EC063 /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 2EEBA41F16875CA6004EC063 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 2EEBA42016875CA6004EC063 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + SDKROOT = macosx; + }; + name = Release; + }; + 2EEBA42216875CA6004EC063 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "iDNA/iDNA-Prefix.pch"; + INFOPLIST_FILE = "iDNA/iDNA-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 2EEBA42316875CA6004EC063 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "iDNA/iDNA-Prefix.pch"; + INFOPLIST_FILE = "iDNA/iDNA-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2EEBA3FA16875CA5004EC063 /* Build configuration list for PBXProject "iDNA" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2EEBA41F16875CA6004EC063 /* Debug */, + 2EEBA42016875CA6004EC063 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2EEBA42116875CA6004EC063 /* Build configuration list for PBXNativeTarget "iDNA" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2EEBA42216875CA6004EC063 /* Debug */, + 2EEBA42316875CA6004EC063 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2EEBA3F716875CA5004EC063 /* Project object */; +} diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..2d38afe --- /dev/null +++ b/iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/hadush.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/hadush.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..2ff8a744a5fa6ce6e5b32e9367a46ac1e149a2c5 GIT binary patch literal 17585 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcschemes/xcschememanagement.plist b/iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..d767edb --- /dev/null +++ b/iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + iDNA.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 2EEBA3FF16875CA5004EC063 + + primary + + + + + diff --git a/iDNA/iDNA/HVSCellDna.h b/iDNA/iDNA/HVSCellDna.h new file mode 100644 index 0000000..f45117d --- /dev/null +++ b/iDNA/iDNA/HVSCellDna.h @@ -0,0 +1,29 @@ +// +// HVSCellDna.h +// iDNA +// +// Created by VladIslav Khazov on 23.12.12. +// Copyright (c) 2012 VladIslav Khazov. All rights reserved. +// + +#import + +//размерность ДНК (Значение по умолчанию) +#define sizeDNA 100 // НЕ задавать меньше 1 ! + +@interface HVSCellDna : NSObject + +// Основной массив, создаем свойство с методами +@property NSMutableArray *DNA; +//Данное свойство будет хранить размер данной ДНК. (Можно было брать его из популяции, но мне кажется так будет доп. проверка передаваемых значений) +@property int lengthDna; + +//Определяем функцию сравнения, входной параметр объект класса HVSСellDna +-(int) hammingDistance: (HVSCellDna *) otherCell; +//Мутация входящий параметр - % +-(void) mutate:(int) i; +//метод init +-(id)init; +//Свой метод init с указанной размерностью ДНК. +-(id)initWithLengthDna:(int) length; +@end diff --git a/iDNA/iDNA/HVSCellDna.m b/iDNA/iDNA/HVSCellDna.m new file mode 100644 index 0000000..eaad77b --- /dev/null +++ b/iDNA/iDNA/HVSCellDna.m @@ -0,0 +1,110 @@ +// +// HVSCellDna.m +// iDNA +// +// Created by VladIslav Khazov on 23.12.12. +// Copyright (c) 2012 VladIslav Khazov. All rights reserved. +// + +#import "HVSCellDna.h" + +@implementation HVSCellDna + +//Изменяем стандартный метод init +- (id) init { + if (sizeDNA<1) { + NSAlert *myAlert = [NSAlert alertWithMessageText:@"ДНК не может быть меньше 1. Вы убили ее!!!" defaultButton:@"Exit" alternateButton:nil otherButton:nil informativeTextWithFormat:nil]; + [myAlert runModal]; + exit(0); + } + //вызов родительского метода + self = [super init]; + if (self) { + //Создаем временный массив + NSArray *arrayCode = [NSArray arrayWithObjects:@"A", @"T", @"G", @"C", nil]; + //Определяем размерность нашего массива + _DNA = [[NSMutableArray alloc] initWithCapacity:sizeDNA]; + //Заполняем массив + for (int i=0; i<=sizeDNA-1; i++) { + //Добавляем объект в массив DNA, используя случайное число от 0 до 3, как индекс для массива arrayCode + [_DNA addObject:[arrayCode objectAtIndex:arc4random_uniform(4)]]; + } + } + // Устанавливаем размерность данного ДНК. + [self setLengthDna:(int)sizeDNA]; + return self; +} + +-(id)initWithLengthDna:(int)length { + if (length<1 || length>100) { + NSAlert *myAlert = [NSAlert alertWithMessageText:@"ДНК не может быть меньше 1 и больше 100. Вы убили ее!!!" defaultButton:@"Exit" alternateButton:nil otherButton:nil informativeTextWithFormat:nil]; + [myAlert runModal]; + exit(0); + } + //вызов родительского метода + self = [super init]; + if (self) { + //Создаем временный массив + NSArray *arrayCode = [NSArray arrayWithObjects:@"A", @"T", @"G", @"C", nil]; + //Определяем размерность нашего массива + _DNA = [[NSMutableArray alloc] initWithCapacity:length]; + //Заполняем массив + for (int i=0; i<=length-1; i++) { + //Добавляем объект в массив DNA, используя случайное число от 0 до 3, как индекс для массива arrayCode + [_DNA addObject:[arrayCode objectAtIndex:arc4random_uniform(4)]]; + } + } + // Устанавливаем размерность данного ДНК. + [self setLengthDna:(int)length]; + return self; +} + +-(int) hammingDistance: (HVSCellDna *) otherCell{ + //Счетчик совпадений + int count = 0; + //Проверка размерности + if (_lengthDna != [otherCell lengthDna]) { + NSAlert *myAlert = [NSAlert alertWithMessageText:@"ДНК имеют разную размерность!" defaultButton:@"Ok" alternateButton:nil otherButton:nil informativeTextWithFormat:nil]; + [myAlert runModal]; + return 0; + } + // [otherCell DNA] возвращает свойство второго HVSCellDna, Обращаемся к нему как к NSMutableArray + for(int i=0;i<=_lengthDna-1;i++){ + //Проверяем на совпадение + if ([[otherCell DNA] objectAtIndex:i]!=[_DNA objectAtIndex:i]) { + count++; + } + } + return count; +} + +-(void) mutate:(int) i{ + if (i<1 || i>100) { + NSAlert *myAlert = [NSAlert alertWithMessageText:@"Указан не верный параметр 'Процента мутации'. Обе ДНК остались без изменений " defaultButton:@"Ok" alternateButton:nil otherButton:nil informativeTextWithFormat:nil]; + [myAlert runModal]; + return; + } + // Количество элементов которые необходимо изменить в ДНК + int countMutator = _lengthDna*i/100; + //Создадим массив для хранения еще не мутировавших + NSMutableArray *arrayCheck = [[NSMutableArray alloc] initWithCapacity:_lengthDna]; + for (int k=0; k<_lengthDna; k++) { + [arrayCheck addObject:[NSNumber numberWithInt:k]]; + } + //Создаем временный массив видов ДНК + NSArray *arrayCode = [NSArray arrayWithObjects:@"A", @"T", @"G", @"C", nil]; + // Переменная для случайного номера ДНК + int dnaIndex = 0; + + //Цикл по нужному количество изменяемых элементов + for (int j=1; j<=countMutator; j++) { + //Генерим случайное число от 0 до количества еще не мутировавших элементов + dnaIndex = arc4random_uniform(_lengthDna-j+1); + //Меняем + [[self DNA] replaceObjectAtIndex:[[arrayCheck objectAtIndex:dnaIndex] intValue] withObject:[arrayCode objectAtIndex:arc4random_uniform(4)]]; + // Удаляем мутировавший элемент из архива + [arrayCheck removeObjectAtIndex:dnaIndex]; + } +} + +@end diff --git a/iDNA/iDNA/HVSDocument.h b/iDNA/iDNA/HVSDocument.h new file mode 100644 index 0000000..902abfb --- /dev/null +++ b/iDNA/iDNA/HVSDocument.h @@ -0,0 +1,37 @@ +// +// HVSDocument.h +// iDNA +// +// Created by VladIslav Khazov on 23.12.12. +// Copyright (c) 2012 VladIslav Khazov. All rights reserved. +// + +#import +#import "HVSPopulationOfDna.h" + +@interface HVSDocument : NSDocument { + //Определяем нашу популяцию + HVSPopulationOfDna *myPopulation; +} +//Свойста для работы с объектами на форме +//Текстовые поля +@property (weak) IBOutlet NSTextField *popTextSize; +@property (weak) IBOutlet NSTextField *popTextLength; +@property (weak) IBOutlet NSTextField *popTextRate; +@property (weak) IBOutlet NSTextField *popTextGoalDna; +//Слайдеры +@property (weak) IBOutlet NSSlider *popSliderSize; +@property (weak) IBOutlet NSSlider *popSliderLength; +@property (weak) IBOutlet NSSlider *popSliderRate; +//Лэйблы +@property (weak) IBOutlet NSTextField *popLabelGeneration; +@property (weak) IBOutlet NSTextField *popLabelMatch; +//Индикатор +@property (weak) IBOutlet NSLevelIndicator *popLevelMatch; +//Кнопки +@property (weak) IBOutlet NSButton *popButtonStart; +@property (weak) IBOutlet NSButton *popButtonPause; +@property (weak) IBOutlet NSButton *popButtonLoad; + + +@end diff --git a/iDNA/iDNA/HVSDocument.m b/iDNA/iDNA/HVSDocument.m new file mode 100644 index 0000000..a7e9bdd --- /dev/null +++ b/iDNA/iDNA/HVSDocument.m @@ -0,0 +1,59 @@ +// +// HVSDocument.m +// iDNA +// +// Created by VladIslav Khazov on 23.12.12. +// Copyright (c) 2012 VladIslav Khazov. All rights reserved. +// + +#import "HVSDocument.h" + +@implementation HVSDocument + +- (id)init +{ + self = [super init]; + if (self) { + myPopulation = [[HVSPopulationOfDna alloc]init]; + } + return self; +} + +- (NSString *)windowNibName +{ + // Override returning the nib file name of the document + // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead. + return @"HVSDocument"; +} + +- (void)windowControllerDidLoadNib:(NSWindowController *)aController +{ + [super windowControllerDidLoadNib:aController]; + // Add any code here that needs to be executed once the windowController has loaded the document's window. +} + ++ (BOOL)autosavesInPlace +{ + return YES; +} + +- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError +{ + // Insert code here to write your document to data of the specified type. If outError != NULL, ensure that you create and set an appropriate error when returning nil. + // You can also choose to override -fileWrapperOfType:error:, -writeToURL:ofType:error:, or -writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead. + NSException *exception = [NSException exceptionWithName:@"UnimplementedMethod" reason:[NSString stringWithFormat:@"%@ is unimplemented", NSStringFromSelector(_cmd)] userInfo:nil]; + @throw exception; + return nil; +} + +- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError +{ + // Insert code here to read your document from the given data of the specified type. If outError != NULL, ensure that you create and set an appropriate error when returning NO. + // You can also choose to override -readFromFileWrapper:ofType:error: or -readFromURL:ofType:error: instead. + // If you override either of these, you should also override -isEntireFileLoaded to return NO if the contents are lazily loaded. + NSException *exception = [NSException exceptionWithName:@"UnimplementedMethod" reason:[NSString stringWithFormat:@"%@ is unimplemented", NSStringFromSelector(_cmd)] userInfo:nil]; + @throw exception; + return YES; +} + +@end diff --git a/iDNA/iDNA/HVSPopulationOfDna.h b/iDNA/iDNA/HVSPopulationOfDna.h new file mode 100644 index 0000000..c0e8b91 --- /dev/null +++ b/iDNA/iDNA/HVSPopulationOfDna.h @@ -0,0 +1,22 @@ +// +// HVSPopulationOfDna.h +// iDNA +// +// Created by VladIslav Khazov on 23.12.12. +// Copyright (c) 2012 VladIslav Khazov. All rights reserved. +// Популяция ДНК + +#import + +@interface HVSPopulationOfDna : NSObject + +//Свойства популяции ДНК, определяющие размер популяции, размер 1-ой ДНК и процент мутации. +@property NSInteger populationSize; +@property NSInteger populationLengthDna; +@property NSInteger populationRate; +// Массив который хранит объекты типа ДНК (HVSCellDna) +@property NSMutableArray *populationDNA; + +-(id) init; + +@end diff --git a/iDNA/iDNA/HVSPopulationOfDna.m b/iDNA/iDNA/HVSPopulationOfDna.m new file mode 100644 index 0000000..419a584 --- /dev/null +++ b/iDNA/iDNA/HVSPopulationOfDna.m @@ -0,0 +1,24 @@ +// +// HVSPopulationOfDna.m +// iDNA +// +// Created by VladIslav Khazov on 23.12.12. +// Copyright (c) 2012 VladIslav Khazov. All rights reserved. +// + +#import "HVSPopulationOfDna.h" + +@implementation HVSPopulationOfDna + +-(id)init { + self = [super init]; + if (self) { + [self setPopulationLengthDna:100]; + [self setPopulationRate:30]; + [self setPopulationSize:5000]; + + } + return self; +} + +@end diff --git a/iDNA/iDNA/en.lproj/Credits.rtf b/iDNA/iDNA/en.lproj/Credits.rtf new file mode 100644 index 0000000..46576ef --- /dev/null +++ b/iDNA/iDNA/en.lproj/Credits.rtf @@ -0,0 +1,29 @@ +{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw9840\paperh8400 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\b0 \ + Some people\ +\ + +\b Human Interface Design: +\b0 \ + Some other people\ +\ + +\b Testing: +\b0 \ + Hopefully not nobody\ +\ + +\b Documentation: +\b0 \ + Whoever\ +\ + +\b With special thanks to: +\b0 \ + Mom\ +} diff --git a/iDNA/iDNA/en.lproj/HVSDocument.xib b/iDNA/iDNA/en.lproj/HVSDocument.xib new file mode 100644 index 0000000..f8cdb48 --- /dev/null +++ b/iDNA/iDNA/en.lproj/HVSDocument.xib @@ -0,0 +1,2372 @@ + + + + 1080 + 12C60 + 2844 + 1187.34 + 625.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 2844 + + + IBNSLayoutConstraint + NSButton + NSButtonCell + NSCustomObject + NSLevelIndicator + NSLevelIndicatorCell + NSNumberFormatter + NSSlider + NSSliderCell + NSTextField + NSTextFieldCell + NSUserDefaultsController + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + HVSDocument + + + FirstResponder + + + 15 + 2 + {{133, 235}, {507, 413}} + 1886912512 + iDNA + NSWindow + View + + {94, 86} + + + 256 + + + + 268 + {{17, 376}, {106, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Population size + + LucidaGrande + 13 + 1044 + + _NS:1535 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + + + + 268 + {{17, 351}, {106, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + DNA length + + _NS:1535 + + + + + NO + + + + 268 + {{17, 326}, {106, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Mutation rate % + + _NS:1535 + + + + + NO + + + + 268 + {{197, 374}, {292, 21}} + + + + _NS:9 + YES + + -2080374784 + 0 + + _NS:9 + + 10000 + 1 + 5000 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{197, 349}, {292, 21}} + + + + _NS:9 + YES + + -2080374784 + 0 + + _NS:9 + + 100 + 1 + 50 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{197, 324}, {292, 21}} + + + + _NS:9 + YES + + -2080374784 + 0 + + _NS:9 + + 100 + 1 + 50 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{128, 371}, {63, 22}} + + + + _NS:9 + YES + + -1804599231 + -1874852864 + + + + + + + + + + + + -∞ + + + +∞ + + #,##0.### + #,##0.### + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + YES + NO + YES + + _NS:9 + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + NO + + + + 268 + {{128, 346}, {63, 22}} + + + + _NS:9 + YES + + -1804599231 + -1874852864 + + + + + + + + + + -∞ + + + +∞ + + #,##0.### + #,##0.### + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + YES + NO + YES + + _NS:9 + + YES + + + + NO + + + + 268 + {{128, 321}, {63, 22}} + + + + _NS:9 + YES + + -1804599231 + -1874852864 + + + + + + + + + + -∞ + + + +∞ + + #,##0.### + #,##0.### + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + YES + NO + YES + + _NS:9 + + YES + + + + NO + + + + 268 + {{20, 290}, {470, 17}} + + + + _NS:1535 + YES + + 68157504 + 138413056 + Generation: 0% + + LucidaGrande + 16 + 16 + + _NS:1535 + + + + + NO + + + + 268 + {{23, 265}, {467, 17}} + + + + _NS:1535 + YES + + 68157504 + 138413056 + Best individual match - % + + _NS:1535 + + + + + NO + + + + 268 + {{20, 241}, {467, 16}} + + + + _NS:9 + YES + + 0 + 0 + _NS:9 + + 100 + 100 + 2 + 2 + 1 + + NO + + + + 268 + {{20, 49}, {467, 184}} + + + + _NS:9 + YES + + -1804599231 + 272630784 + + + _NS:9 + + YES + + + + NO + + + + 268 + {{14, 13}, {132, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Start evolution + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{146, 13}, {77, 32}} + + + + _NS:9 + YES + + 603979776 + 134217728 + Pause + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{359, 13}, {134, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Load goal DNA + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + {507, 413} + + + + + {{0, 0}, {1920, 1058}} + {94, 108} + {10000000000000, 10000000000000} + YES + + + NSApplication + + + YES + + + + + + + window + + + + 18 + + + + popTextLength + + + + 100163 + + + + popTextSize + + + + 100164 + + + + popTextRate + + + + 100165 + + + + popTextGoalDna + + + + 100194 + + + + popSliderSize + + + + 100195 + + + + popSliderLength + + + + 100196 + + + + popSliderRate + + + + 100197 + + + + popLabelGeneration + + + + 100198 + + + + popLabelMatch + + + + 100199 + + + + popLevelMatch + + + + 100200 + + + + popButtonStart + + + + 100201 + + + + popButtonPause + + + + 100202 + + + + popButtonLoad + + + + 100203 + + + + delegate + + + + 17 + + + + value: self.myPopulation.populationSize + + + + + + value: self.myPopulation.populationSize + value + self.myPopulation.populationSize + 2 + + + 100178 + + + + value: self.myPopulation.populationLengthDna + + + + + + value: self.myPopulation.populationLengthDna + value + self.myPopulation.populationLengthDna + 2 + + + 100181 + + + + value: self.myPopulation.populationRate + + + + + + value: self.myPopulation.populationRate + value + self.myPopulation.populationRate + 2 + + + 100184 + + + + value: self.myPopulation.populationSize + + + + + + value: self.myPopulation.populationSize + value + self.myPopulation.populationSize + 2 + + + 100187 + + + + value: self.myPopulation.populationLengthDna + + + + + + value: self.myPopulation.populationLengthDna + value + self.myPopulation.populationLengthDna + 2 + + + 100190 + + + + value: self.myPopulation.populationRate + + + + + + value: self.myPopulation.populationRate + value + self.myPopulation.populationRate + 2 + + + 100193 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + 5 + + + + + + Window + + + 6 + + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 6 + 1 + + 12 + + 1000 + + 6 + 24 + 3 + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + + + + + + + + + + + + + + + + + + + -3 + + + Application + + + 100027 + + + + + + 7 + 0 + + 0 + 1 + + 100 + + 1000 + + 3 + 9 + 1 + + + + + + 100028 + + + + + 100031 + + + + + 100032 + + + + + 100033 + + + + + 100034 + + + + + + + + 100036 + + + + + 100039 + + + + + 100040 + + + + + 100042 + + + + + + + + 100043 + + + + + 100047 + + + + + 100049 + + + + + 100050 + + + + + + + + 100051 + + + + + 100052 + + + + + 100055 + + + + + 100056 + + + + + + + + 100057 + + + + + 100061 + + + + + 100063 + + + + + 100065 + + + + + + + + 100066 + + + + + 100070 + + + + + 100072 + + + + + 100079 + + + + + + 7 + 0 + + 0 + 1 + + 63 + + 1000 + + 3 + 9 + 1 + + + + + + 100080 + + + + + + + + 100085 + + + + + 100086 + + + + + 100091 + + + + + 100093 + + + + + 100094 + + + + + 100095 + + + + + 100096 + + + + + + + + 100098 + + + + + + + + 100101 + + + + + 100102 + + + + + 100103 + + + + + 100104 + + + + + 100105 + + + + + + + + 100106 + + + + + + + + 100110 + + + + + 100111 + + + + + 100112 + + + + + 100113 + + + + + 100114 + + + + + + 8 + 0 + + 0 + 1 + + 17 + + 1000 + + 3 + 9 + 1 + + + + 7 + 0 + + 0 + 1 + + 464 + + 1000 + + 3 + 9 + 1 + + + + + + 100115 + + + + + 100118 + + + + + 100119 + + + + + 100120 + + + + + + 7 + 0 + + 0 + 1 + + 461 + + 1000 + + 3 + 9 + 1 + + + + + + 100121 + + + + + 100123 + + + + + 100124 + + + + + 100125 + + + + + 100126 + + + + + 100131 + + + + + + + + 100132 + + + + + 100133 + + + + + 100134 + + + + + 100136 + + + + + 100137 + + + + + + 8 + 0 + + 0 + 1 + + 184 + + 1000 + + 3 + 9 + 1 + + + + + + 100138 + + + + + 100139 + + + + + 100140 + + + + + 100142 + + + + + 100144 + + + + + + + + 100145 + + + + + 100146 + + + + + 100147 + + + + + 100148 + + + + + 100149 + + + + + 100150 + + + + + + + + 100151 + + + + + 100154 + + + + + 100155 + + + + + 100156 + + + + + + + + 100157 + + + + + 100160 + + + + + 100161 + + + + + 100166 + + + + + 100173 + + + + + 100174 + + + + + 100175 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{133, 170}, {507, 413}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 100203 + + + + + HVSDocument + NSDocument + + NSButton + NSButton + NSButton + NSTextField + NSTextField + NSLevelIndicator + NSSlider + NSSlider + NSSlider + NSTextField + NSTextField + NSTextField + NSTextField + + + + popButtonLoad + NSButton + + + popButtonPause + NSButton + + + popButtonStart + NSButton + + + popLabelGeneration + NSTextField + + + popLabelMatch + NSTextField + + + popLevelMatch + NSLevelIndicator + + + popSliderLength + NSSlider + + + popSliderRate + NSSlider + + + popSliderSize + NSSlider + + + popTextGoalDna + NSTextField + + + popTextLength + NSTextField + + + popTextRate + NSTextField + + + popTextSize + NSTextField + + + + IBProjectSource + ./Classes/HVSDocument.h + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + + 0 + IBCocoaFramework + YES + 3 + YES + + diff --git a/iDNA/iDNA/en.lproj/InfoPlist.strings b/iDNA/iDNA/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/iDNA/iDNA/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/iDNA/iDNA/en.lproj/MainMenu.xib b/iDNA/iDNA/en.lproj/MainMenu.xib new file mode 100644 index 0000000..b5a73d3 --- /dev/null +++ b/iDNA/iDNA/en.lproj/MainMenu.xib @@ -0,0 +1,4562 @@ + + + + 1080 + 11D50 + 2457 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 2457 + + + NSMenu + NSMenuItem + NSCustomObject + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + + + iDNA + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + iDNA + + + + About iDNA + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide iDNA + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit iDNA + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + File + + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + Open Recent + + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save… + s + 1048576 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + Find + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find and Replace… + f + 1572864 + 2147483647 + + + 12 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + Spelling and Grammar + + + + Show Spelling and Grammar + : + 1048576 + 2147483647 + + + + + + Check Document Now + ; + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + Correct Spelling Automatically + + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + Substitutions + + + + Show Substitutions + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Dashes + + 2147483647 + + + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + Text Replacement + + 2147483647 + + + + + + + + + Transformations + + 2147483647 + + + submenuAction: + + Transformations + + + + Make Upper Case + + 2147483647 + + + + + + Make Lower Case + + 2147483647 + + + + + + Capitalize + + 2147483647 + + + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + Speech + + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + Format + + 2147483647 + + + submenuAction: + + Format + + + + Font + + 2147483647 + + + submenuAction: + + Font + + + + Show Fonts + t + 1048576 + 2147483647 + + + + + + Bold + b + 1048576 + 2147483647 + + + 2 + + + + Italic + i + 1048576 + 2147483647 + + + 1 + + + + Underline + u + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Bigger + + + 1048576 + 2147483647 + + + 3 + + + + Smaller + - + 1048576 + 2147483647 + + + 4 + + + + YES + YES + + + 2147483647 + + + + + + Kern + + 2147483647 + + + submenuAction: + + Kern + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Tighten + + 2147483647 + + + + + + Loosen + + 2147483647 + + + + + + + + + Ligatures + + 2147483647 + + + submenuAction: + + Ligatures + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Use All + + 2147483647 + + + + + + + + + Baseline + + 2147483647 + + + submenuAction: + + Baseline + + + + Use Default + + 2147483647 + + + + + + Superscript + + 2147483647 + + + + + + Subscript + + 2147483647 + + + + + + Raise + + 2147483647 + + + + + + Lower + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Colors + C + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Copy Style + c + 1572864 + 2147483647 + + + + + + Paste Style + v + 1572864 + 2147483647 + + + + + _NSFontMenu + + + + + Text + + 2147483647 + + + submenuAction: + + Text + + + + Align Left + { + 1048576 + 2147483647 + + + + + + Center + | + 1048576 + 2147483647 + + + + + + Justify + + 2147483647 + + + + + + Align Right + } + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Writing Direction + + 2147483647 + + + submenuAction: + + Writing Direction + + + + YES + Paragraph + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + YES + Selection + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Ruler + + 2147483647 + + + + + + Copy Ruler + c + 1310720 + 2147483647 + + + + + + Paste Ruler + v + 1310720 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + Help + + + + iDNA Help + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + NSFontManager + + + + + + + terminate: + + + + 448 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + runPageLayout: + + + + 87 + + + + clearRecentDocuments: + + + + 127 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + saveDocument: + + + + 362 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + newDocument: + + + + 371 + + + + openDocument: + + + + 372 + + + + printDocument: + + + + 373 + + + + raiseBaseline: + + + + 425 + + + + lowerBaseline: + + + + 426 + + + + copyFont: + + + + 427 + + + + subscript: + + + + 428 + + + + superscript: + + + + 429 + + + + tightenKerning: + + + + 430 + + + + underline: + + + + 431 + + + + orderFrontColorPanel: + + + + 432 + + + + useAllLigatures: + + + + 433 + + + + loosenKerning: + + + + 434 + + + + pasteFont: + + + + 435 + + + + unscript: + + + + 436 + + + + useStandardKerning: + + + + 437 + + + + useStandardLigatures: + + + + 438 + + + + turnOffLigatures: + + + + 439 + + + + turnOffKerning: + + + + 440 + + + + capitalizeWord: + + + + 454 + + + + lowercaseWord: + + + + 455 + + + + uppercaseWord: + + + + 456 + + + + toggleAutomaticDashSubstitution: + + + + 460 + + + + orderFrontSubstitutionsPanel: + + + + 461 + + + + toggleAutomaticTextReplacement: + + + + 463 + + + + toggleAutomaticSpellingCorrection: + + + + 466 + + + + performFindPanelAction: + + + + 467 + + + + performFindPanelAction: + + + + 468 + + + + performFindPanelAction: + + + + 469 + + + + pasteAsPlainText: + + + + 471 + + + + showHelp: + + + + 494 + + + + alignCenter: + + + + 517 + + + + pasteRuler: + + + + 518 + + + + toggleRuler: + + + + 519 + + + + alignRight: + + + + 520 + + + + copyRuler: + + + + 521 + + + + alignJustified: + + + + 522 + + + + alignLeft: + + + + 523 + + + + makeBaseWritingDirectionNatural: + + + + 524 + + + + makeBaseWritingDirectionLeftToRight: + + + + 525 + + + + makeBaseWritingDirectionRightToLeft: + + + + 526 + + + + makeTextWritingDirectionNatural: + + + + 527 + + + + makeTextWritingDirectionLeftToRight: + + + + 528 + + + + makeTextWritingDirectionRightToLeft: + + + + 529 + + + + performFindPanelAction: + + + + 533 + + + + addFontTrait: + + + + 420 + + + + addFontTrait: + + + + 421 + + + + modifyFont: + + + + 422 + + + + orderFrontFontPanel: + + + + 423 + + + + modifyFont: + + + + 424 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + + + + 19 + + + + + + + + 56 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + + + 75 + + + + + 78 + + + + + 72 + + + + + 82 + + + + + 124 + + + + + + + + 77 + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 74 + + + + + 125 + + + + + + + + 126 + + + + + 205 + + + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + + + + + + 216 + + + + + + + + 200 + + + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + + + + + + 296 + + + + + + + + + 297 + + + + + 298 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 374 + + + + + + + + 375 + + + + + + + + + 376 + + + + + + + + 387 + + + + + + + + + + + + + + + + + + + + + + + 388 + + + + + 389 + + + + + 390 + + + + + 391 + + + + + 392 + + + + + 393 + + + + + 394 + + + + + 395 + + + + + 396 + + + + + + + + 397 + + + + + + + + 398 + + + + + + + + 399 + + + + + 400 + + + + + 401 + + + + + 402 + + + + + 403 + + + + + 404 + + + + + + + + + + + + 405 + + + + + 406 + + + + + 407 + + + + + 408 + + + + + 409 + + + + + 410 + + + + + + + + + + 411 + + + + + 412 + + + + + 413 + + + + + 414 + + + + + + + + + + + 415 + + + + + 416 + + + + + 417 + + + + + 418 + + + + + 419 + + + + + 449 + + + + + + + + 450 + + + + + + + + + + 451 + + + + + 452 + + + + + 453 + + + + + 457 + + + + + 458 + + + + + 459 + + + + + 462 + + + + + 464 + + + + + 465 + + + + + 470 + + + + + 491 + + + + + + + + 492 + + + + + + + + 493 + + + + + 495 + + + + + + + + 496 + + + + + + + + + + + + + + + + + 497 + + + + + 498 + + + + + 499 + + + + + 500 + + + + + 501 + + + + + 502 + + + + + + + + 503 + + + + + 504 + + + + + 505 + + + + + 506 + + + + + 507 + + + + + + + + + + + + + + + + 508 + + + + + 509 + + + + + 510 + + + + + 511 + + + + + 512 + + + + + 513 + + + + + 514 + + + + + 515 + + + + + 516 + + + + + 532 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 533 + + + + + ABAppCardController + NSWindowController + + id + id + id + id + id + id + id + id + + + + addCardViewField: + id + + + copy: + id + + + cut: + id + + + doDelete: + id + + + find: + id + + + paste: + id + + + saveChanges: + id + + + toggleCardEditingMode: + id + + + + ABCardView + NSButton + NSManagedObjectContext + NSSearchField + NSTextField + NSWindow + + + + mCardView + ABCardView + + + mEditButton + NSButton + + + mManagedObjectContext + NSManagedObjectContext + + + mSearchField + NSSearchField + + + mStatusTextField + NSTextField + + + mWindow + NSWindow + + + + IBProjectSource + ./Classes/ABAppCardController.h + + + + ABCardView + NSView + + id + id + + + + commitAndSave: + id + + + statusImageClicked: + id + + + + NSObjectController + NSImageView + NSView + ABNameFrameView + NSView + NSImage + ABImageView + + + + mBindingsController + NSObjectController + + + mBuddyStatusImage + NSImageView + + + mHeaderView + NSView + + + mNameView + ABNameFrameView + + + mNextKeyView + NSView + + + mUserImage + NSImage + + + mUserImageView + ABImageView + + + + IBProjectSource + ./Classes/ABCardView.h + + + + ABImageView + NSImageView + + id + id + id + id + + + + copy: + id + + + cut: + id + + + delete: + id + + + paste: + id + + + + IBProjectSource + ./Classes/ABImageView.h + + + + DVTBorderedView + DVTLayoutView_ML + + contentView + NSView + + + contentView + + contentView + NSView + + + + IBProjectSource + ./Classes/DVTBorderedView.h + + + + DVTDelayedMenuButton + NSButton + + IBProjectSource + ./Classes/DVTDelayedMenuButton.h + + + + DVTGradientImageButton + NSButton + + IBProjectSource + ./Classes/DVTGradientImageButton.h + + + + DVTImageAndTextCell + NSTextFieldCell + + IBProjectSource + ./Classes/DVTImageAndTextCell.h + + + + DVTImageAndTextColumn + NSTableColumn + + IBProjectSource + ./Classes/DVTImageAndTextColumn.h + + + + DVTLayoutView_ML + NSView + + IBProjectSource + ./Classes/DVTLayoutView_ML.h + + + + DVTOutlineView + NSOutlineView + + IBProjectSource + ./Classes/DVTOutlineView.h + + + + DVTSplitView + NSSplitView + + IBProjectSource + ./Classes/DVTSplitView.h + + + + DVTStackView_ML + DVTLayoutView_ML + + IBProjectSource + ./Classes/DVTStackView_ML.h + + + + DVTTableView + NSTableView + + IBProjectSource + ./Classes/DVTTableView.h + + + + DVTViewController + NSViewController + + IBProjectSource + ./Classes/DVTViewController.h + + + + FirstResponder + + duplicateDocument: + id + + + duplicateDocument: + + duplicateDocument: + id + + + + IBUserSource + + + + + HFController + NSObject + + selectAll: + id + + + selectAll: + + selectAll: + id + + + + IBProjectSource + ./Classes/HFController.h + + + + HFRepresenterTextView + NSView + + selectAll: + id + + + selectAll: + + selectAll: + id + + + + IBProjectSource + ./Classes/HFRepresenterTextView.h + + + + IBEditor + NSObject + + id + id + id + id + id + + + + changeFont: + id + + + performCopy: + id + + + performCut: + id + + + selectAll: + id + + + sizeSelectionToFit: + id + + + + IBProjectSource + ./Classes/IBEditor.h + + + + IDECapsuleListView + DVTStackView_ML + + dataSource + id + + + dataSource + + dataSource + id + + + + IBProjectSource + ./Classes/IDECapsuleListView.h + + + + IDEDMArrayController + NSArrayController + + IBProjectSource + ./Classes/IDEDMArrayController.h + + + + IDEDMEditor + IDEEditor + + DVTBorderedView + NSView + IDEDMEditorSourceListController + DVTSplitView + + + + bottomToolbarBorderView + DVTBorderedView + + + sourceListSplitViewPane + NSView + + + sourceListViewController + IDEDMEditorSourceListController + + + splitView + DVTSplitView + + + + IBProjectSource + ./Classes/IDEDMEditor.h + + + + IDEDMEditorController + IDEViewController + + IBProjectSource + ./Classes/IDEDMEditorController.h + + + + IDEDMEditorSourceListController + IDEDMEditorController + + DVTBorderedView + IDEDMEditor + DVTImageAndTextColumn + DVTOutlineView + NSTreeController + + + + borderedView + DVTBorderedView + + + parentEditor + IDEDMEditor + + + primaryColumn + DVTImageAndTextColumn + + + sourceListOutlineView + DVTOutlineView + + + sourceListTreeController + NSTreeController + + + + IBProjectSource + ./Classes/IDEDMEditorSourceListController.h + + + + IDEDMHighlightImageAndTextCell + DVTImageAndTextCell + + IBProjectSource + ./Classes/IDEDMHighlightImageAndTextCell.h + + + + IDEDataModelBrowserEditor + IDEDMEditorController + + IDEDataModelPropertiesTableController + IDECapsuleListView + NSArrayController + IDEDataModelPropertiesTableController + IDEDataModelEntityContentsEditor + IDEDataModelPropertiesTableController + + + + attributesTableViewController + IDEDataModelPropertiesTableController + + + capsuleView + IDECapsuleListView + + + entityArrayController + NSArrayController + + + fetchedPropertiesTableViewController + IDEDataModelPropertiesTableController + + + parentEditor + IDEDataModelEntityContentsEditor + + + relationshipsTableViewController + IDEDataModelPropertiesTableController + + + + IBProjectSource + ./Classes/IDEDataModelBrowserEditor.h + + + + IDEDataModelConfigurationEditor + IDEDMEditorController + + IDECapsuleListView + IDEDataModelEditor + IDEDataModelConfigurationTableController + + + + capsuleListView + IDECapsuleListView + + + parentEditor + IDEDataModelEditor + + + tableController + IDEDataModelConfigurationTableController + + + + IBProjectSource + ./Classes/IDEDataModelConfigurationEditor.h + + + + IDEDataModelConfigurationTableController + IDEDMEditorController + + NSArrayController + NSArrayController + IDEDataModelConfigurationEditor + XDTableView + + + + configurationsArrayController + NSArrayController + + + entitiesArrayController + NSArrayController + + + parentEditor + IDEDataModelConfigurationEditor + + + tableView + XDTableView + + + + IBProjectSource + ./Classes/IDEDataModelConfigurationTableController.h + + + + IDEDataModelDiagramEditor + IDEDMEditorController + + XDDiagramView + IDEDataModelEntityContentsEditor + + + + diagramView + XDDiagramView + + + parentEditor + IDEDataModelEntityContentsEditor + + + + IBProjectSource + ./Classes/IDEDataModelDiagramEditor.h + + + + IDEDataModelEditor + IDEDMEditor + + DVTDelayedMenuButton + DVTDelayedMenuButton + NSSegmentedControl + IDEDataModelConfigurationEditor + IDEDataModelEntityContentsEditor + IDEDataModelFetchRequestEditor + NSSegmentedControl + NSTabView + + + + addEntityButton + DVTDelayedMenuButton + + + addPropertyButton + DVTDelayedMenuButton + + + browserDiagramSegmentControl + NSSegmentedControl + + + configurationViewController + IDEDataModelConfigurationEditor + + + entityContentsViewController + IDEDataModelEntityContentsEditor + + + fetchRequestViewController + IDEDataModelFetchRequestEditor + + + hierarchySegmentControl + NSSegmentedControl + + + tabView + NSTabView + + + + IBProjectSource + ./Classes/IDEDataModelEditor.h + + + + IDEDataModelEntityContentsEditor + IDEDMEditorController + + IDEDataModelBrowserEditor + IDEDataModelDiagramEditor + IDEDataModelEditor + NSTabView + + + + browserViewController + IDEDataModelBrowserEditor + + + diagramViewController + IDEDataModelDiagramEditor + + + parentEditor + IDEDataModelEditor + + + tabView + NSTabView + + + + IBProjectSource + ./Classes/IDEDataModelEntityContentsEditor.h + + + + IDEDataModelFetchRequestEditor + IDEDMEditorController + + NSArrayController + IDEDataModelEditor + IDECapsuleListView + + + + entityController + NSArrayController + + + parentEditor + IDEDataModelEditor + + + tableView + IDECapsuleListView + + + + IBProjectSource + ./Classes/IDEDataModelFetchRequestEditor.h + + + + IDEDataModelPropertiesTableController + IDEDMEditorController + + IDEDMArrayController + NSTableColumn + NSArrayController + IDEDataModelBrowserEditor + IDEDMHighlightImageAndTextCell + XDTableView + + + + arrayController + IDEDMArrayController + + + entitiesColumn + NSTableColumn + + + entityArrayController + NSArrayController + + + parentEditor + IDEDataModelBrowserEditor + + + propertyNameAndImageCell + IDEDMHighlightImageAndTextCell + + + tableView + XDTableView + + + + IBProjectSource + ./Classes/IDEDataModelPropertiesTableController.h + + + + IDEDocDownloadsTableViewController + NSObject + + NSButtonCell + DVTTableView + IDEDocViewingPrefPaneController + + + + _downloadButtonCell + NSButtonCell + + + _tableView + DVTTableView + + + prefPaneController + IDEDocViewingPrefPaneController + + + + IBProjectSource + ./Classes/IDEDocDownloadsTableViewController.h + + + + IDEDocViewingPrefPaneController + IDEViewController + + id + id + id + id + id + id + id + id + id + id + id + + + + addSubscription: + id + + + checkForAndInstallUpdatesNow: + id + + + deleteDocSet: + id + + + downloadAction: + id + + + minimumFontSizeComboBoxAction: + id + + + minimumFontSizeEnabledAction: + id + + + showHelp: + id + + + showSubscriptionSheet: + id + + + subscriptionCancelAction: + id + + + toggleAutoCheckForAndInstallUpdates: + id + + + toggleDocSetInfo: + id + + + + DVTGradientImageButton + DVTGradientImageButton + DVTGradientImageButton + NSSplitView + NSView + NSView + DVTBorderedView + DVTBorderedView + NSButton + NSTextView + IDEDocDownloadsTableViewController + NSComboBox + NSTextField + NSButton + NSTextField + NSWindow + NSButton + + + + _addButton + DVTGradientImageButton + + + _deleteButton + DVTGradientImageButton + + + _showInfoAreaButton + DVTGradientImageButton + + + _splitView + NSSplitView + + + _splitViewDocSetInfoSubview + NSView + + + _splitViewDocSetsListSubview + NSView + + + borderedViewAroundSplitView + DVTBorderedView + + + borderedViewBelowTable + DVTBorderedView + + + checkAndInstallNowButton + NSButton + + + docSetInfoTextView + NSTextView + + + downloadsTableViewController + IDEDocDownloadsTableViewController + + + minimumFontSizeControl + NSComboBox + + + noUpdatesAvailableMessage + NSTextField + + + showInfoButton + NSButton + + + subscriptionTextField + NSTextField + + + subscriptionWindow + NSWindow + + + validateAddSubscriptionButton + NSButton + + + + IBProjectSource + ./Classes/IDEDocViewingPrefPaneController.h + + + + IDEEditor + IDEViewController + + IBProjectSource + ./Classes/IDEEditor.h + + + + IDEViewController + DVTViewController + + IBProjectSource + ./Classes/IDEViewController.h + + + + IKImageView + + id + id + id + id + + + + copy: + id + + + crop: + id + + + cut: + id + + + paste: + id + + + + IBProjectSource + ./Classes/IKImageView.h + + + + NSDocument + + id + id + id + id + id + id + + + + printDocument: + id + + + revertDocumentToSaved: + id + + + runPageLayout: + id + + + saveDocument: + id + + + saveDocumentAs: + id + + + saveDocumentTo: + id + + + + IBProjectSource + ./Classes/NSDocument.h + + + + NSDocumentController + + _openRecentDocument: + id + + + _openRecentDocument: + + _openRecentDocument: + id + + + + IBProjectSource + ./Classes/NSDocumentController.h + + + + NSResponder + + _insertFindPattern: + id + + + _insertFindPattern: + + _insertFindPattern: + id + + + + IBProjectSource + ./Classes/NSResponder.h + + + + QLPreviewBubble + NSObject + + id + id + + + + hide: + id + + + show: + id + + + + parentWindow + NSWindow + + + parentWindow + + parentWindow + NSWindow + + + + IBProjectSource + ./Classes/QLPreviewBubble.h + + + + QTMovieView + + id + id + id + id + id + + + + showAll: + id + + + showCustomButton: + id + + + toggleLoops: + id + + + zoomIn: + id + + + zoomOut: + id + + + + IBProjectSource + ./Classes/QTMovieView.h + + + + WebView + + id + id + id + id + + + + reloadFromOrigin: + id + + + resetPageZoom: + id + + + zoomPageIn: + id + + + zoomPageOut: + id + + + + IBProjectSource + ./Classes/WebView.h + + + + XDDiagramView + NSView + + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + + + + _graphLayouterMenuItemAction: + id + + + _zoomPopUpButtonAction: + id + + + alignBottomEdges: + id + + + alignCentersHorizontallyInContainer: + id + + + alignCentersVerticallyInContainer: + id + + + alignHorizontalCenters: + id + + + alignLeftEdges: + id + + + alignRightEdges: + id + + + alignTopEdges: + id + + + alignVerticalCenters: + id + + + bringToFront: + id + + + collapseAllCompartments: + id + + + copy: + id + + + cut: + id + + + delete: + id + + + deleteBackward: + id + + + deleteForward: + id + + + deselectAll: + id + + + diagramZoomIn: + id + + + diagramZoomOut: + id + + + expandAllCompartments: + id + + + flipHorizontally: + id + + + flipVertically: + id + + + layoutGraphicsConcentrically: + id + + + layoutGraphicsHierarchically: + id + + + lock: + id + + + makeSameHeight: + id + + + makeSameWidth: + id + + + moveDown: + id + + + moveDownAndModifySelection: + id + + + moveLeft: + id + + + moveLeftAndModifySelection: + id + + + moveRight: + id + + + moveRightAndModifySelection: + id + + + moveUp: + id + + + moveUpAndModifySelection: + id + + + paste: + id + + + rollDownAllCompartments: + id + + + rollUpAllCompartments: + id + + + selectAll: + id + + + sendToBack: + id + + + sizeToFit: + id + + + toggleGridShown: + id + + + toggleHiddenGraphicsShown: + id + + + togglePageBreaksShown: + id + + + toggleRuler: + id + + + toggleSnapsToGrid: + id + + + unlock: + id + + + + _diagramController + IDEDataModelDiagramEditor + + + _diagramController + + _diagramController + IDEDataModelDiagramEditor + + + + IBProjectSource + ./Classes/XDDiagramView.h + + + + XDTableView + NSTableView + + showAllTableColumns: + id + + + showAllTableColumns: + + showAllTableColumns: + id + + + + IBProjectSource + ./Classes/XDTableView.h + + + + + 0 + IBCocoaFramework + YES + 3 + + {11, 11} + {10, 3} + + YES + + diff --git a/iDNA/iDNA/iDNA-Info.plist b/iDNA/iDNA/iDNA-Info.plist new file mode 100644 index 0000000..09845a5 --- /dev/null +++ b/iDNA/iDNA/iDNA-Info.plist @@ -0,0 +1,55 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + idna + + CFBundleTypeIconFile + + CFBundleTypeName + DocumentType + CFBundleTypeOSTypes + + ???? + + CFBundleTypeRole + Editor + NSDocumentClass + HVSDocument + + + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + Pride.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright © 2012 VladIslav Khazov. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/iDNA/iDNA/iDNA-Prefix.pch b/iDNA/iDNA/iDNA-Prefix.pch new file mode 100644 index 0000000..24593cd --- /dev/null +++ b/iDNA/iDNA/iDNA-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'iDNA' target in the 'iDNA' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/iDNA/iDNA/main.m b/iDNA/iDNA/main.m new file mode 100644 index 0000000..a052ecb --- /dev/null +++ b/iDNA/iDNA/main.m @@ -0,0 +1,14 @@ +// +// main.m +// iDNA +// +// Created by VladIslav Khazov on 23.12.12. +// Copyright (c) 2012 VladIslav Khazov. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} From a97f55dfacd8d73725c23e4e1b750261c8be5279 Mon Sep 17 00:00:00 2001 From: Vladislav Khazov Date: Tue, 25 Dec 2012 00:43:49 +0400 Subject: [PATCH 2/5] IDNA by Khazov ver2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проект почти закончен. Осталось доделать только Load goal DNA. --- .../UserInterfaceState.xcuserstate | Bin 17585 -> 20276 bytes .../xcdebugger/Breakpoints.xcbkptlist | 46 ++ iDNA/iDNA/HVSCellDna.m | 8 +- iDNA/iDNA/HVSDocument.h | 8 + iDNA/iDNA/HVSDocument.m | 99 +++ iDNA/iDNA/HVSPopulationOfDna.h | 14 + iDNA/iDNA/HVSPopulationOfDna.m | 123 +++- iDNA/iDNA/en.lproj/HVSDocument.xib | 652 +++++++++++++++--- 8 files changed, 830 insertions(+), 120 deletions(-) create mode 100644 iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/hadush.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/hadush.xcuserdatad/UserInterfaceState.xcuserstate index 2ff8a744a5fa6ce6e5b32e9367a46ac1e149a2c5..638f78224356e97967ee2e52fd8ea1f304bf7cc5 100644 GIT binary patch delta 12018 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 MTk~)2@2pe*2R^7{VgLXD diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 0000000..da8ae9f --- /dev/null +++ b/iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,46 @@ + + + + + + + + + + + diff --git a/iDNA/iDNA/HVSCellDna.m b/iDNA/iDNA/HVSCellDna.m index eaad77b..1736e1c 100644 --- a/iDNA/iDNA/HVSCellDna.m +++ b/iDNA/iDNA/HVSCellDna.m @@ -13,7 +13,7 @@ @implementation HVSCellDna //Изменяем стандартный метод init - (id) init { if (sizeDNA<1) { - NSAlert *myAlert = [NSAlert alertWithMessageText:@"ДНК не может быть меньше 1. Вы убили ее!!!" defaultButton:@"Exit" alternateButton:nil otherButton:nil informativeTextWithFormat:nil]; + NSAlert *myAlert = [NSAlert alertWithMessageText:@"ДНК не может быть меньше 1. Вы убили ее!!!" defaultButton:@"Exit" alternateButton:nil otherButton:nil informativeTextWithFormat:@" "]; [myAlert runModal]; exit(0); } @@ -37,7 +37,7 @@ - (id) init { -(id)initWithLengthDna:(int)length { if (length<1 || length>100) { - NSAlert *myAlert = [NSAlert alertWithMessageText:@"ДНК не может быть меньше 1 и больше 100. Вы убили ее!!!" defaultButton:@"Exit" alternateButton:nil otherButton:nil informativeTextWithFormat:nil]; + NSAlert *myAlert = [NSAlert alertWithMessageText:@"ДНК не может быть меньше 1 и больше 100. Вы убили ее!!!" defaultButton:@"Exit" alternateButton:nil otherButton:nil informativeTextWithFormat:@" "]; [myAlert runModal]; exit(0); } @@ -64,7 +64,7 @@ -(int) hammingDistance: (HVSCellDna *) otherCell{ int count = 0; //Проверка размерности if (_lengthDna != [otherCell lengthDna]) { - NSAlert *myAlert = [NSAlert alertWithMessageText:@"ДНК имеют разную размерность!" defaultButton:@"Ok" alternateButton:nil otherButton:nil informativeTextWithFormat:nil]; + NSAlert *myAlert = [NSAlert alertWithMessageText:@"ДНК имеют разную размерность!" defaultButton:@"Ok" alternateButton:nil otherButton:nil informativeTextWithFormat:@" "]; [myAlert runModal]; return 0; } @@ -80,7 +80,7 @@ -(int) hammingDistance: (HVSCellDna *) otherCell{ -(void) mutate:(int) i{ if (i<1 || i>100) { - NSAlert *myAlert = [NSAlert alertWithMessageText:@"Указан не верный параметр 'Процента мутации'. Обе ДНК остались без изменений " defaultButton:@"Ok" alternateButton:nil otherButton:nil informativeTextWithFormat:nil]; + NSAlert *myAlert = [NSAlert alertWithMessageText:@"Указан не верный параметр 'Процента мутации'. Обе ДНК остались без изменений " defaultButton:@"Ok" alternateButton:nil otherButton:nil informativeTextWithFormat:@" "]; [myAlert runModal]; return; } diff --git a/iDNA/iDNA/HVSDocument.h b/iDNA/iDNA/HVSDocument.h index 902abfb..807b5e5 100644 --- a/iDNA/iDNA/HVSDocument.h +++ b/iDNA/iDNA/HVSDocument.h @@ -12,6 +12,8 @@ @interface HVSDocument : NSDocument { //Определяем нашу популяцию HVSPopulationOfDna *myPopulation; + //Флаг Паузы + BOOL flagPause; } //Свойста для работы с объектами на форме //Текстовые поля @@ -34,4 +36,10 @@ @property (weak) IBOutlet NSButton *popButtonLoad; +//Действия +- (IBAction)buttonStart:(id)sender; +- (IBAction)buttonPause:(id)sender; +- (IBAction)buttonLoad:(id)sender; +//Фоновый поток +-(void)startBackgroundEvolution; @end diff --git a/iDNA/iDNA/HVSDocument.m b/iDNA/iDNA/HVSDocument.m index a7e9bdd..49b4d74 100644 --- a/iDNA/iDNA/HVSDocument.m +++ b/iDNA/iDNA/HVSDocument.m @@ -14,11 +14,101 @@ - (id)init { self = [super init]; if (self) { + //Создаем популяцию с начальными параметрами. myPopulation = [[HVSPopulationOfDna alloc]init]; + //Добавляем свойство lengthDNA в наблюдение нашему контроллеру. + [myPopulation addObserver:self forKeyPath:@"populationLengthDna" options:NSKeyValueObservingOptionOld context:@"changePopulationLengthDNA"]; + flagPause=NO; } return self; } +-(void)dealloc { + //Убираем свойство lengthDNA из наблюдения. + [myPopulation removeObserver:self forKeyPath:@"populationLengthDna"]; +} + +//Метод запускается когда изменяется переменная populationLengthDna объекта myPopulation +-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + //Проверка, какая переменная была изменена. + if (context==@"changePopulationLengthDNA") { + //Получаем текущие значение переменной + int length = (int)[myPopulation populationLengthDna]; + //Генерим нового Альфа самца + [myPopulation setGoalDNA:[[HVSCellDna alloc]initWithLengthDna:length]]; + // Выводим Goal DNA нашей поппуляции в текстовом поле. + //Берем GOAL DNA + NSMutableArray *myArrayDNA = [[myPopulation goalDNA] DNA]; + NSMutableString *result = [[NSMutableString alloc]init]; + //Цикл перевода массива в строку. + for (int i=0; i<=[myArrayDNA count]-1 ; i++) { + [result appendString:[myArrayDNA objectAtIndex:i]]; + } + [_popTextGoalDna setStringValue:result]; + } +} + +//Действия +-(void)startBackgroundEvolution { + //Эволюция + while ([myPopulation flag]==NO && flagPause==NO) { + [_popLevelMatch setIntegerValue:myPopulation.maxHamming]; + [_popLabelMatch setIntegerValue:myPopulation.maxHamming]; + [_popLabelGeneration setIntegerValue:myPopulation.countEvolution]; + [myPopulation evolution]; + } + //Меняем интерфейс + [_popTextSize setEnabled:YES]; + [_popTextLength setEnabled:YES]; + [_popTextRate setEnabled:YES]; + + [_popSliderSize setEnabled:YES]; + [_popSliderLength setEnabled:YES]; + [_popSliderRate setEnabled:YES]; + + [_popButtonStart setEnabled:YES]; + [_popButtonLoad setEnabled:YES]; + [_popButtonPause setEnabled:NO]; +} + + +//Нажата кнопка Старт +- (IBAction)buttonStart:(id)sender { + //Меняем интерфейс + [_popTextSize setEnabled:NO]; + [_popTextLength setEnabled:NO]; + [_popTextRate setEnabled:NO]; + + [_popSliderSize setEnabled:NO]; + [_popSliderLength setEnabled:NO]; + [_popSliderRate setEnabled:NO]; + + [_popButtonStart setEnabled:NO]; + [_popButtonLoad setEnabled:NO]; + [_popButtonPause setEnabled:YES]; + + //Создаем случайную популяцию ДНК с заданными параметрами. + [myPopulation setPopulation]; + // Устанавливаем флаг совпадений в NO + [myPopulation setFlag:NO]; + //Совпадение с Альфа + [myPopulation setMaxHamming:0]; + //Количество эволюций + [myPopulation setCountEvolution:0]; + + //Эволюция - запускаем фоном + flagPause=NO; + [self performSelectorInBackground:@selector(startBackgroundEvolution) withObject:nil]; +} +- (IBAction)buttonPause:(id)sender { + flagPause=YES; + +} +- (IBAction)buttonLoad:(id)sender { + +} + + - (NSString *)windowNibName { // Override returning the nib file name of the document @@ -30,6 +120,15 @@ - (void)windowControllerDidLoadNib:(NSWindowController *)aController { [super windowControllerDidLoadNib:aController]; // Add any code here that needs to be executed once the windowController has loaded the document's window. + // Выводим Goal DNA нашей поппуляции. + //Берем GOAL DNA + NSMutableArray *myArrayDNA = [[myPopulation goalDNA] DNA]; + NSMutableString *result = [[NSMutableString alloc]init]; + //Цикл перевода массива в строку. + for (int i=0; i<=[myArrayDNA count]-1 ; i++) { + [result appendString:[myArrayDNA objectAtIndex:i]]; + } + [_popTextGoalDna setStringValue:result]; } + (BOOL)autosavesInPlace diff --git a/iDNA/iDNA/HVSPopulationOfDna.h b/iDNA/iDNA/HVSPopulationOfDna.h index c0e8b91..ad30591 100644 --- a/iDNA/iDNA/HVSPopulationOfDna.h +++ b/iDNA/iDNA/HVSPopulationOfDna.h @@ -7,6 +7,7 @@ // Популяция ДНК #import +#import "HVSCellDna.h" @interface HVSPopulationOfDna : NSObject @@ -16,7 +17,20 @@ @property NSInteger populationRate; // Массив который хранит объекты типа ДНК (HVSCellDna) @property NSMutableArray *populationDNA; +// Goal DNA +@property HVSCellDna *goalDNA; +//Флаг указывающий на совпадение одного из ДНК с Альфа самцом +@property BOOL flag; +//Максимальное совпадение в % +@property NSInteger maxHamming; +//Количество проходов +@property NSInteger countEvolution; -(id) init; +//метод заполнения популяции +-(void)setPopulation; +//метод эволюции +- (void)evolution; + @end diff --git a/iDNA/iDNA/HVSPopulationOfDna.m b/iDNA/iDNA/HVSPopulationOfDna.m index 419a584..7ba9e4b 100644 --- a/iDNA/iDNA/HVSPopulationOfDna.m +++ b/iDNA/iDNA/HVSPopulationOfDna.m @@ -13,12 +13,127 @@ @implementation HVSPopulationOfDna -(id)init { self = [super init]; if (self) { - [self setPopulationLengthDna:100]; - [self setPopulationRate:30]; - [self setPopulationSize:5000]; - + [self setPopulationLengthDna:30]; + [self setPopulationRate:5]; + [self setPopulationSize:1000]; + [self setGoalDNA:[[HVSCellDna alloc]initWithLengthDna:30]]; + [self setFlag:NO]; + [self setMaxHamming:0]; + [self setCountEvolution:0]; } return self; } +//метод заполнения популяции c заданными параметрами +-(void)setPopulation { +// [self setPopulationDNA:[[NSMutableArray alloc]initWithCapacity:[self populationSize]]]; + _populationDNA = [[NSMutableArray alloc] initWithCapacity:_populationSize]; + //Заполняем популяцию + for (int i=0; i<=_populationSize-1; i++) { + //Длина каждой днк + int length = (int)_populationLengthDna; + //Добавляем объект в массив. +// [[self populationDNA] addObject:[[HVSCellDna alloc]initWithLengthDna:length]]; + [_populationDNA addObject:[[HVSCellDna alloc] initWithLengthDna:length]]; + } +} + + +//Эволюция 1 проход +-(void)evolution { + //Сортировка + //Создаем временный массив. + NSMutableArray *sortPopulationDNA = [[NSMutableArray alloc] initWithCapacity:_populationSize]; + //Смысл сортировки: Ищем и добавляем в массив сначала все элементы которые совпадают полностью, затем на 1 меньше и так далее. Пока не добавим все элементы в сортированный массив. + for (int lenDNA=(int)_populationLengthDna; lenDNA>=1; lenDNA--) { + for (int i=0; i<=_populationSize-1 ; i++) { + int tempHamming =[[_populationDNA objectAtIndex:i] hammingDistance:_goalDNA]; + if (tempHamming==lenDNA) { + [sortPopulationDNA addObject:[_populationDNA objectAtIndex:i]]; + //Проверка на полное совпадение + if (tempHamming==(int)_populationLengthDna) { + _flag=YES; + } + //Максимальное совпадение + if (tempHamming*100/_populationLengthDna>_maxHamming) { + _maxHamming = tempHamming*100/_populationLengthDna; + } + } + } + } + //Присваиваем отсортированный массив нашему. + _populationDNA=sortPopulationDNA; + //Временная ДНК для скрещивания. + NSMutableArray *tempDNA = [[NSMutableArray alloc] initWithCapacity:_populationLengthDna]; + // временные индексы топ ДНК + int tempDNA1,tempDNA2; + //Если нет совпадений делаем эволюцию + if (_flag==NO) { + //Увеличиваем счетчик + _countEvolution++; + //Цикл по второй половине популяция, для их замены. + for (int i=(int)_populationSize/2; i<=_populationSize-1; i++) { + //Случайный выбор метода. + int random = arc4random_uniform(3); + switch (random) { + case 0: + tempDNA1 = arc4random_uniform((int)_populationSize/2); + tempDNA2 = arc4random_uniform((int)_populationSize/2); + //создаем новый ДНК 50/50 + for (int j=0; j<=(int)_populationLengthDna-1; j++) { + if (j<=(int)_populationLengthDna/2) { + //Добавляем значение случайной ДНК 1, по индексу j. + [tempDNA addObject:[[[_populationDNA objectAtIndex:tempDNA1] DNA] objectAtIndex:j]]; + } else { + //Добавляем значение случайной ДНК 2, по индексу j. + [tempDNA addObject:[[[_populationDNA objectAtIndex:tempDNA2] DNA] objectAtIndex:j]]; + } + } + //Записываем результат + [[_populationDNA objectAtIndex:i] setDNA:tempDNA]; + break; + case 1: + tempDNA1 = arc4random_uniform((int)_populationSize/2); + tempDNA2 = arc4random_uniform((int)_populationSize/2); + //создаем новый ДНК через 1 1/1/1/1/1 + for (int j=0; j<=(int)_populationLengthDna-1; j++) { + if (j%2==0) { + //Добавляем значение случайной ДНК 1, по индексу j. + [tempDNA addObject:[[[_populationDNA objectAtIndex:tempDNA1] DNA] objectAtIndex:j]]; + } else { + //Добавляем значение случайной ДНК 2, по индексу j. + [tempDNA addObject:[[[_populationDNA objectAtIndex:tempDNA2] DNA] objectAtIndex:j]]; + } + } + //Записываем результат + [[_populationDNA objectAtIndex:i] setDNA:tempDNA]; + break; + case 2: + tempDNA1 = arc4random_uniform((int)_populationSize/2); + tempDNA2 = arc4random_uniform((int)_populationSize/2); + //создаем новый ДНК 20/60/20 + for (int j=0; j<=(int)_populationLengthDna-1; j++) { + if (j*100/((int)_populationLengthDna-1)<=20 || j*100/((int)_populationLengthDna-1)>60) { + //Добавляем значение случайной ДНК 1, по индексу j. + [tempDNA addObject:[[[_populationDNA objectAtIndex:tempDNA1] DNA] objectAtIndex:j]]; + } else { + //Добавляем значение случайной ДНК 2, по индексу j. + [tempDNA addObject:[[[_populationDNA objectAtIndex:tempDNA2] DNA] objectAtIndex:j]]; + } + } + //Записываем результат + [[_populationDNA objectAtIndex:i] setDNA:tempDNA]; + break; + default: + break; + } + + } + //Мутация популяции + for (HVSCellDna *dna in _populationDNA) { + [dna mutate:(int)_populationRate]; + } + } +} + @end diff --git a/iDNA/iDNA/en.lproj/HVSDocument.xib b/iDNA/iDNA/en.lproj/HVSDocument.xib index f8cdb48..251fdcd 100644 --- a/iDNA/iDNA/en.lproj/HVSDocument.xib +++ b/iDNA/iDNA/en.lproj/HVSDocument.xib @@ -413,17 +413,17 @@ 268 - {{20, 290}, {470, 17}} + {{20, 290}, {295, 19}} - + _NS:1535 YES 68157504 - 138413056 - Generation: 0% - + 71304192 + Generation: + LucidaGrande 16 16 @@ -438,16 +438,16 @@ 268 - {{23, 265}, {467, 17}} + {{23, 265}, {315, 17}} - + _NS:1535 YES 68157504 - 138413056 - Best individual match - % + 71304192 + Best individual match % - _NS:1535 @@ -488,10 +488,14 @@ _NS:9 YES - -1804599231 - 272630784 + -1805647871 + 205520896 - + + LucidaGrande + 30 + 16 + _NS:9 YES @@ -575,6 +579,125 @@ NO + + + 268 + {{343, 265}, {147, 17}} + + + + _NS:1535 + YES + + 68157504 + -1874852864 + 0 + + + + + + + -∞ + + +∞ + + # + # + + + + + + + + NaN + + + + 0 + 0 + YES + NO + 1 + AAAAAAAAAAAAAAAAAAAAAA + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + _NS:1535 + + + + + NO + + + + 268 + {{317, 292}, {173, 17}} + + + + _NS:1535 + YES + + 68157504 + -1874852864 + 0 + + + + + + + -∞ + + +∞ + + # + # + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + _NS:1535 + + + + + NO + {507, 413} @@ -659,22 +782,6 @@ 100197 - - - popLabelGeneration - - - - 100198 - - - - popLabelMatch - - - - 100199 - popLevelMatch @@ -707,6 +814,46 @@ 100203 + + + buttonStart: + + + + 100204 + + + + buttonPause: + + + + 100205 + + + + buttonLoad: + + + + 100206 + + + + popLabelGeneration + + + + 100274 + + + + popLabelMatch + + + + 100277 + delegate @@ -811,6 +958,70 @@ 100193 + + + value: self.myPopulation.maxHamming + + + + + + value: self.myPopulation.maxHamming + value + self.myPopulation.maxHamming + 2 + + + 100271 + + + + value: self.myPopulation.maxHamming + + + + + + value: self.myPopulation.maxHamming + value + self.myPopulation.maxHamming + 2 + + + 100248 + + + + value: self.myPopulation.countEvolution + + + + + + value: self.myPopulation.countEvolution + value + self.myPopulation.countEvolution + 2 + + + 100268 + + + + value: self.myPopulation.maxHamming + + + + + + value: self.myPopulation.maxHamming + value + self.myPopulation.maxHamming + 2 + + + 100254 + @@ -957,6 +1168,86 @@ 29 3 + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + 5 @@ -1325,20 +1616,20 @@ 24 3 - - - 6 + + + 5 0 - - 6 + + 5 1 - - 20 + + 26 1000 - 8 - 29 + 3 + 9 3 @@ -1389,22 +1680,6 @@ 29 3 - - - 6 - 0 - - 6 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - 5 @@ -1513,10 +1788,12 @@ - + + + @@ -1824,23 +2101,7 @@ - - - 8 - 0 - - 0 - 1 - - 17 - - 1000 - - 3 - 9 - 1 - - + 7 0 @@ -1848,7 +2109,7 @@ 0 1 - 464 + 289 1000 @@ -1864,22 +2125,12 @@ - - 100118 - - - - - 100119 - - - 100120 - + 7 0 @@ -1887,7 +2138,7 @@ 0 1 - 461 + 309 1000 @@ -1908,21 +2159,6 @@ - - 100124 - - - - - 100125 - - - - - 100126 - - - 100131 @@ -2094,6 +2330,151 @@ + + 100208 + + + + + 100211 + + + + + 100212 + + + + + 100223 + + + + + + 7 + 0 + + 0 + 1 + + 141 + + 1000 + + 3 + 9 + 1 + + + + + + 100224 + + + + + + + + 100225 + + + + + 100245 + + + + + 100250 + + + + + 7 + 0 + + 0 + 1 + + 167 + + 1000 + + 3 + 9 + 1 + + + + 8 + 0 + + 0 + 1 + + 17 + + 1000 + + 3 + 9 + 1 + + + + + + + 100252 + + + + + + + + 100253 + + + + + 100261 + + + + + 100263 + + + + + 100264 + + + + + 100272 + + + + + 100273 + + + + + 100275 + + + + + 100276 + + + @@ -2160,25 +2541,19 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - - - + + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - + + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -2221,6 +2596,36 @@ com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{133, 170}, {507, 413}} @@ -2230,11 +2635,10 @@ - - + @@ -2258,6 +2662,11 @@ + + + + + @@ -2272,13 +2681,32 @@ - 100203 + 100277 HVSDocument NSDocument + + id + id + id + + + + buttonLoad: + id + + + buttonPause: + id + + + buttonStart: + id + + NSButton NSButton From dc9c7a4b00a04ffdc8d468968d1a2e9b0ddba9b4 Mon Sep 17 00:00:00 2001 From: Vladislav Khazov Date: Tue, 25 Dec 2012 21:40:05 +0400 Subject: [PATCH 3/5] iDNA by Khazov MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавил Load Goal DNA --- .DS_Store | Bin 0 -> 6148 bytes iDNA/.DS_Store | Bin 0 -> 6148 bytes .../UserInterfaceState.xcuserstate | Bin 20276 -> 22163 bytes .../xcdebugger/Breakpoints.xcbkptlist | 6 +- iDNA/iDNA/.DS_Store | Bin 0 -> 6148 bytes iDNA/iDNA/HVSDocument.m | 96 ++++++++++++++---- iDNA/mygoaldna.txt | 1 + 7 files changed, 81 insertions(+), 22 deletions(-) create mode 100644 .DS_Store create mode 100644 iDNA/.DS_Store create mode 100644 iDNA/iDNA/.DS_Store create mode 100644 iDNA/mygoaldna.txt diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..81cd932745ee12793b7b0736609b361115aba58e GIT binary patch literal 6148 zcmeHK%}T>S5Z-O0MpVc}(A(m{{ z^Sk!_b-;HwSj^h&lAV2h|8S7Rd12chyjC~X);CO$?Or!dqipPDqcqB|{eCv~{~w#Ify$Xq~jmhL|)R$7zV;BfBg& zL991(_u%mKq7#(U=juff$$@7nI~r&33d+2WD8Ela*b<#{_W%68Y_h=opIfKaJ}=adEs(*SYOC+#$AOp69dG+A_Lg_f>?O} zpTj4!w8@ttG!X;Dz<*_c8*RVsL3R3W{Z=R5wF1T+3>1v3Pyqpb;U@qd@EqBbPURP< aL!7IzQi!XdU8V!lkANhECSu?h82AL$4NGVM literal 0 HcmV?d00001 diff --git a/iDNA/.DS_Store b/iDNA/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f3b738cccf5a8a86cc0b5efdad1f3a00c1117a1a GIT binary patch literal 6148 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 diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist index da8ae9f..45628fe 100644 --- a/iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ b/iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -34,11 +34,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/HVSDocument.m" - timestampString = "378074089.823734" + timestampString = "378076391.482158" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "78" - endingLineNumber = "78" + startingLineNumber = "85" + endingLineNumber = "85" landmarkName = "-buttonStart:" landmarkType = "5"> diff --git a/iDNA/iDNA/.DS_Store b/iDNA/iDNA/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Thu, 27 Dec 2012 22:55:53 +0400 Subject: [PATCH 4/5] iDNA by Khazov ver 4 undo/redo save/load population --- .../UserInterfaceState.xcuserstate | Bin 22163 -> 21975 bytes .../xcdebugger/Breakpoints.xcbkptlist | 6 +- iDNA/iDNA/HVSDocument.m | 98 +++++++++++++++--- 3 files changed, 89 insertions(+), 15 deletions(-) diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/hadush.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/hadush.xcuserdatad/UserInterfaceState.xcuserstate index 77218965be59d05501bc120d8f807a9418aa0013..aa405122c6ce26f698b4c2ae7d2c1f03ff813eb3 100644 GIT binary patch delta 11207 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 delta 11250 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 diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist index 45628fe..17d5572 100644 --- a/iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ b/iDNA/iDNA.xcodeproj/xcuserdata/hadush.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -34,11 +34,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/HVSDocument.m" - timestampString = "378076391.482158" + timestampString = "378327175.577462" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "85" - endingLineNumber = "85" + startingLineNumber = "120" + endingLineNumber = "120" landmarkName = "-buttonStart:" landmarkType = "5"> diff --git a/iDNA/iDNA/HVSDocument.m b/iDNA/iDNA/HVSDocument.m index c2226d1..7156378 100644 --- a/iDNA/iDNA/HVSDocument.m +++ b/iDNA/iDNA/HVSDocument.m @@ -7,6 +7,8 @@ // #import "HVSDocument.h" +#import "HVSCellDna.h" +#import "HVSPopulationOfDna.h" @implementation HVSDocument @@ -18,6 +20,8 @@ - (id)init myPopulation = [[HVSPopulationOfDna alloc]init]; //Добавляем свойство lengthDNA в наблюдение нашему контроллеру. [myPopulation addObserver:self forKeyPath:@"populationLengthDna" options:NSKeyValueObservingOptionOld context:@"changePopulationLengthDNA"]; + [myPopulation addObserver:self forKeyPath:@"populationSize" options:NSKeyValueObservingOptionOld context:@"changePopulationSize"]; + [myPopulation addObserver:self forKeyPath:@"populationRate" options:NSKeyValueObservingOptionOld context:@"changePopulationRate"]; flagPause=NO; } return self; @@ -27,11 +31,26 @@ -(void)dealloc { //Убираем свойство lengthDNA из наблюдения. [myPopulation removeObserver:self forKeyPath:@"populationLengthDna"]; } - -//Метод запускается когда изменяется переменная populationLengthDna объекта myPopulation +//Доп метод +-(void) changeKeyPath:(NSString *) keyPath + ofObject:(id) obj + toValue:(id) value { + [obj setValue:value forKeyPath:keyPath]; +} +//Метод запускается когда изменяется переменная populationLengthDna объекта myPopulation, а также всех остальных наблюдаемых объектов -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + + NSUndoManager *myManager = [self undoManager]; //Проверка, какая переменная была изменена. if (context==@"changePopulationLengthDNA") { + //UNDO + id oldValue = [change objectForKey:NSKeyValueChangeOldKey]; + if (oldValue == [NSNull null]) { + oldValue = nil; + } + [[myManager prepareWithInvocationTarget:self] changeKeyPath:@"populationLengthDNA" ofObject:myPopulation toValue:oldValue]; + [myManager setActionName:@"Change Length DNA"]; + //Получаем текущие значение переменной int length = (int)[myPopulation populationLengthDna]; //Генерим нового Альфа самца @@ -46,6 +65,22 @@ -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N } [_popTextGoalDna setStringValue:result]; } + if (context==@"changePopulationSize") { + id oldValue = [change objectForKey:NSKeyValueChangeOldKey]; + if (oldValue == [NSNull null]) { + oldValue = nil; + } + [[myManager prepareWithInvocationTarget:self] changeKeyPath:@"populationSize" ofObject:myPopulation toValue:oldValue]; + [myManager setActionName:@"Change Size"]; + } + if (context==@"changePopulationRate") { + id oldValue = [change objectForKey:NSKeyValueChangeOldKey]; + if (oldValue == [NSNull null]) { + oldValue = nil; + } + [[myManager prepareWithInvocationTarget:self] changeKeyPath:@"populationRate" ofObject:myPopulation toValue:oldValue]; + [myManager setActionName:@"Change Rate"]; + } } //Действия @@ -194,22 +229,61 @@ + (BOOL)autosavesInPlace return YES; } +//Сохранение документа - (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError { - // Insert code here to write your document to data of the specified type. If outError != NULL, ensure that you create and set an appropriate error when returning nil. - // You can also choose to override -fileWrapperOfType:error:, -writeToURL:ofType:error:, or -writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead. - NSException *exception = [NSException exceptionWithName:@"UnimplementedMethod" reason:[NSString stringWithFormat:@"%@ is unimplemented", NSStringFromSelector(_cmd)] userInfo:nil]; - @throw exception; - return nil; + NSMutableData *saveData = [[NSMutableData alloc]init]; + NSKeyedArchiver *myKeyArchiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:saveData]; + [myKeyArchiver encodeInteger:[myPopulation populationSize] forKey:@"populationSize"]; + [myKeyArchiver encodeInteger:[myPopulation populationLengthDna] forKey:@"populationLengthDna"]; + [myKeyArchiver encodeInteger:[myPopulation populationRate] forKey:@"populationRate"]; + [myKeyArchiver encodeObject:[myPopulation populationDNA] forKey:@"populationDNA"]; + [myKeyArchiver encodeInt:[[myPopulation goalDNA] lengthDna] forKey:@"lengthDna"]; + [myKeyArchiver encodeObject:[[myPopulation goalDNA] DNA] forKey:@"DNA"]; + [myKeyArchiver encodeBool:[myPopulation flag] forKey:@"flag"]; + [myKeyArchiver encodeInteger:[myPopulation maxHamming] forKey:@"maxHamming"]; + [myKeyArchiver encodeInteger:[myPopulation countEvolution] forKey:@"countEvolution"]; + + [myKeyArchiver finishEncoding]; + + +// NSData *saveData = [NSKeyedArchiver archivedDataWithRootObject:[self popButtonLoad]]; + return saveData; } - (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError { - // Insert code here to read your document from the given data of the specified type. If outError != NULL, ensure that you create and set an appropriate error when returning NO. - // You can also choose to override -readFromFileWrapper:ofType:error: or -readFromURL:ofType:error: instead. - // If you override either of these, you should also override -isEntireFileLoaded to return NO if the contents are lazily loaded. - NSException *exception = [NSException exceptionWithName:@"UnimplementedMethod" reason:[NSString stringWithFormat:@"%@ is unimplemented", NSStringFromSelector(_cmd)] userInfo:nil]; - @throw exception; + + NSKeyedUnarchiver *myKeyArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; + HVSPopulationOfDna *newMyPopulation = nil; + @try { + newMyPopulation = [[HVSPopulationOfDna alloc] init]; + [newMyPopulation setPopulationSize:[myKeyArchiver decodeIntegerForKey:@"populationSize"]]; + [newMyPopulation setPopulationLengthDna:[myKeyArchiver decodeIntegerForKey:@"populationLengthDna"]]; + [newMyPopulation setPopulationRate:[myKeyArchiver decodeIntegerForKey:@"populationRate"]]; + [newMyPopulation setPopulationDNA:[myKeyArchiver decodeObjectForKey:@"populationDNA"]]; + //Подготовка + [newMyPopulation setGoalDNA:[[HVSCellDna alloc] initWithLengthDna:(int)[myKeyArchiver decodeIntegerForKey:@"lengthDna"]]]; +// [myKeyArchiver decodeIntForKey:@"lengthDna"]; +// [myKeyArchiver decodeObjectForKey:@"DNA"]; + [[newMyPopulation goalDNA] setDNA:[myKeyArchiver decodeObjectForKey:@"DNA"]]; + + [newMyPopulation setFlag:[myKeyArchiver decodeBoolForKey:@"flag"]]; + [newMyPopulation setMaxHamming:[myKeyArchiver decodeIntegerForKey:@"maxHamming"]]; + [newMyPopulation setCountEvolution:[myKeyArchiver decodeIntegerForKey:@"countEvolution"]]; + } + @catch (NSException *exception) { + if (outError) { + NSDictionary *d = [NSDictionary dictionaryWithObject:@"The file is invalid!" forKey:NSLocalizedFailureReasonErrorKey]; + *outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:d]; + return NO; + } + } + myPopulation = newMyPopulation; + //Не понятно, потому что в инит стоит addObsrving, но он при почему то не работает при вызове... + [myPopulation addObserver:self forKeyPath:@"populationLengthDna" options:NSKeyValueObservingOptionOld context:@"changePopulationLengthDNA"]; + [myPopulation addObserver:self forKeyPath:@"populationSize" options:NSKeyValueObservingOptionOld context:@"changePopulationSize"]; + [myPopulation addObserver:self forKeyPath:@"populationRate" options:NSKeyValueObservingOptionOld context:@"changePopulationRate"]; return YES; } From 7342bc5ec4e0ce580758fde95845db53318e5532 Mon Sep 17 00:00:00 2001 From: Vladislav Khazov Date: Fri, 4 Jan 2013 13:17:31 +0400 Subject: [PATCH 5/5] iDNA by Khazov ver 5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправлены ошибки, добавлена проверка символов, при загрузке ДНК из файл. --- .DS_Store | Bin 6148 -> 6148 bytes iDNA/.DS_Store | Bin 6148 -> 6148 bytes .../UserInterfaceState.xcuserstate | Bin 21975 -> 21373 bytes .../xcdebugger/Breakpoints.xcbkptlist | 19 +++++++++-- iDNA/iDNA/HVSDocument.m | 31 ++++++++++++++---- iDNA/mygoaldna.txt | 2 +- 6 files changed, 42 insertions(+), 10 deletions(-) diff --git a/.DS_Store b/.DS_Store index 81cd932745ee12793b7b0736609b361115aba58e..59df8f44df6e656baf914a463711687e2313e64f 100644 GIT binary patch delta 14 VcmZoMXffFEf{~GN^Gil)F#srq1kwNi delta 14 VcmZoMXffFEf{~G7^Gil)F#srk1knHh diff --git a/iDNA/.DS_Store b/iDNA/.DS_Store index f3b738cccf5a8a86cc0b5efdad1f3a00c1117a1a..159eeb299abc500075a1529004e8dff72c4bc459 100644 GIT binary patch delta 302 zcmZoMXfc=|#>B)qu~2NHo}wrx0|Nsi1A_nqLoh=LLq0SRQPnX9 z!PK$*|IffMnTJt922I5cm81jI$9?&}#=&oRj1L*}~ n#{d6;o^)l|%+A5j0SpZw=R5Ocei2I!U|;|d1HB`mu~2NHo}wrV0|Nsi1A_nqgC0W#Lo!1?LkdIc#KPr_ER*|~6eho7 sTDUu6EyJegm_k^`t2q?>7TfXEhR0K~}^8~^|S diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/hadush.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/hadush.xcuserdatad/UserInterfaceState.xcuserstate index aa405122c6ce26f698b4c2ae7d2c1f03ff813eb3..1c52a4bb2b951205edd74dc4bd9fb181d300caca 100644 GIT binary patch delta 11073 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 delta 11408 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 + + diff --git a/iDNA/iDNA/HVSDocument.m b/iDNA/iDNA/HVSDocument.m index 7156378..16463d9 100644 --- a/iDNA/iDNA/HVSDocument.m +++ b/iDNA/iDNA/HVSDocument.m @@ -28,8 +28,10 @@ - (id)init } -(void)dealloc { - //Убираем свойство lengthDNA из наблюдения. + //Убираем свойства из наблюдения. [myPopulation removeObserver:self forKeyPath:@"populationLengthDna"]; + [myPopulation removeObserver:self forKeyPath:@"populationSize"]; + [myPopulation removeObserver:self forKeyPath:@"populationRate"]; } //Доп метод -(void) changeKeyPath:(NSString *) keyPath @@ -48,7 +50,7 @@ -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N if (oldValue == [NSNull null]) { oldValue = nil; } - [[myManager prepareWithInvocationTarget:self] changeKeyPath:@"populationLengthDNA" ofObject:myPopulation toValue:oldValue]; + [[myManager prepareWithInvocationTarget:self] changeKeyPath:@"populationLengthDna" ofObject:myPopulation toValue:oldValue]; [myManager setActionName:@"Change Length DNA"]; //Получаем текущие значение переменной @@ -180,19 +182,36 @@ - (IBAction)buttonLoad:(id)sender { NSString * fileContents = [NSString stringWithContentsOfFile:fileName encoding:NSUTF8StringEncoding error:nil]; // Записываем его есои он устраивает нашим параметрам if ([fileContents length]==[myPopulation populationLengthDna] && [fileContents length]<=100) { - //Устанавливаем текстовое поле - [_popTextGoalDna setStringValue:fileContents]; + //Проверка символов в файле + for (int t=0; t<=[fileContents length]-1; t++) { + switch ([fileContents characterAtIndex:t]) { + case (unichar)'A': + break; + case (unichar)'T': + break; + case (unichar)'G': + break; + case (unichar)'C': + break; + default: + symbol=YES; + break; + } + } + if (symbol==NO) { + //Устанавливаем текстовое поле + [_popTextGoalDna setStringValue:fileContents]; //создаем нового альфа самца размерностью файла [[myPopulation goalDNA] setDNA:[[NSMutableArray alloc]initWithContentsOfFile:fileContents]]; } else { - NSAlert *myAlert = [NSAlert alertWithMessageText:@"Похоже файл содержит символ не относящийся к ДНК!!!" defaultButton:@"Okey" alternateButton:nil otherButton:nil informativeTextWithFormat:@" "]; + NSAlert *myAlert = [NSAlert alertWithMessageText:@"Похоже файл содержит символ не относящийся к ДНК или в нем есть управляющие символы (Пр. перевод каретки)" defaultButton:@"Okey" alternateButton:nil otherButton:nil informativeTextWithFormat:@" "]; [myAlert runModal]; } } else { NSString *str=[[NSMutableString alloc]initWithFormat:@"Данный файл имеет длину %ld",[fileContents length]]; - NSAlert *myAlert = [NSAlert alertWithMessageText:@"Файл содердит ДНК другой размерностью или его размер больше 100 единиц!!! " defaultButton:@"Okey" alternateButton:nil otherButton:nil informativeTextWithFormat:str]; + NSAlert *myAlert = [NSAlert alertWithMessageText:@"Файл содержит ДНК другой размерностью или его размер больше 100 единиц!!! " defaultButton:@"Okey" alternateButton:nil otherButton:nil informativeTextWithFormat:str]; [myAlert runModal]; } diff --git a/iDNA/mygoaldna.txt b/iDNA/mygoaldna.txt index fb27d5a..eba4e0e 100644 --- a/iDNA/mygoaldna.txt +++ b/iDNA/mygoaldna.txt @@ -1 +1 @@ -CCCCTTTTTTTAAACCCGAGGGGGGCTC \ No newline at end of file +CCCCTTTTTTTAAACCCGAGGGGGGCTC \ No newline at end of file