From 5db08b08fc1cdb211c800a7045abae6cf1d36f1c Mon Sep 17 00:00:00 2001 From: Maxime Graulich <maxime.graulich@gmail.com> Date: Fri, 12 Jul 2013 11:52:47 +0000 Subject: [PATCH] Edit for real device (iPad) --- .../iOS/Onelab.xcodeproj/project.pbxproj | 60 ++---------------- .../mobile/iOS/Onelab/DetailViewController.mm | 8 ++- contrib/mobile/iOS/Onelab/EAGLView.h | 2 + contrib/mobile/iOS/Onelab/EAGLView.mm | 25 ++++++-- contrib/mobile/iOS/ic_launcher.png | Bin 579 -> 3687 bytes contrib/mobile/iOS/ic_launcher_retina.png | Bin 792 -> 9362 bytes 6 files changed, 31 insertions(+), 64 deletions(-) diff --git a/contrib/mobile/iOS/Onelab.xcodeproj/project.pbxproj b/contrib/mobile/iOS/Onelab.xcodeproj/project.pbxproj index 43bd42f3b0..13fe83bc84 100644 --- a/contrib/mobile/iOS/Onelab.xcodeproj/project.pbxproj +++ b/contrib/mobile/iOS/Onelab.xcodeproj/project.pbxproj @@ -25,20 +25,9 @@ 9C96089D1712C7F600E1D4A0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C96089C1712C7F600E1D4A0 /* QuartzCore.framework */; }; 9C96089F1712C8EB00E1D4A0 /* emulatorFix.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C96089E1712C8EB00E1D4A0 /* emulatorFix.c */; }; 9C9608AC1712EF0900E1D4A0 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9C9608AA1712EF0900E1D4A0 /* MainStoryboard.storyboard */; }; - 9C99753617379C440036EC24 /* BH.pro in Resources */ = {isa = PBXBuildFile; fileRef = 9C99752C17379C440036EC24 /* BH.pro */; }; - 9C99753717379C440036EC24 /* machine_magstadyn_a.pro in Resources */ = {isa = PBXBuildFile; fileRef = 9C99752D17379C440036EC24 /* machine_magstadyn_a.pro */; }; - 9C99753817379C440036EC24 /* magnet_data.pro in Resources */ = {isa = PBXBuildFile; fileRef = 9C99752E17379C440036EC24 /* magnet_data.pro */; }; - 9C99753917379C440036EC24 /* magnet.geo in Resources */ = {isa = PBXBuildFile; fileRef = 9C99752F17379C440036EC24 /* magnet.geo */; }; - 9C99753A17379C440036EC24 /* magnet.pro in Resources */ = {isa = PBXBuildFile; fileRef = 9C99753017379C440036EC24 /* magnet.pro */; }; - 9C99753B17379C440036EC24 /* Magnetostatics.pro in Resources */ = {isa = PBXBuildFile; fileRef = 9C99753117379C440036EC24 /* Magnetostatics.pro */; }; - 9C99753C17379C440036EC24 /* pmsm_data.geo in Resources */ = {isa = PBXBuildFile; fileRef = 9C99753217379C440036EC24 /* pmsm_data.geo */; }; - 9C99753D17379C440036EC24 /* pmsm_rotor.geo in Resources */ = {isa = PBXBuildFile; fileRef = 9C99753317379C440036EC24 /* pmsm_rotor.geo */; }; - 9C99753E17379C440036EC24 /* pmsm_stator.geo in Resources */ = {isa = PBXBuildFile; fileRef = 9C99753417379C440036EC24 /* pmsm_stator.geo */; }; - 9C99753F17379C440036EC24 /* pmsm.geo in Resources */ = {isa = PBXBuildFile; fileRef = 9C99753517379C440036EC24 /* pmsm.geo */; }; - 9C9975411737A4840036EC24 /* pmsm.pro in Resources */ = {isa = PBXBuildFile; fileRef = 9C9975401737A4840036EC24 /* pmsm.pro */; }; - 9C9975431737B55E0036EC24 /* pmsm_8p_circuit.pro in Resources */ = {isa = PBXBuildFile; fileRef = 9C9975421737B55E0036EC24 /* pmsm_8p_circuit.pro */; }; 9C9F8BCD174B5A1B004332C5 /* ic_launcher_retina.png in Resources */ = {isa = PBXBuildFile; fileRef = 9C9F8BCC174B5A1B004332C5 /* ic_launcher_retina.png */; }; 9C9F8BCF174B5A23004332C5 /* ic_launcher.png in Resources */ = {isa = PBXBuildFile; fileRef = 9C9F8BCE174B5A23004332C5 /* ic_launcher.png */; }; + 9CC85C021790286C00F241C4 /* files in Resources */ = {isa = PBXBuildFile; fileRef = 9CC85C011790286C00F241C4 /* files */; }; 9CE08E10178AEB1600A83B4B /* GetDP.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9CE08E0D178AEB1600A83B4B /* GetDP.framework */; }; 9CE08E11178AEB1600A83B4B /* Gmsh.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9CE08E0E178AEB1600A83B4B /* Gmsh.framework */; }; 9CE08E12178AEB1600A83B4B /* petsc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9CE08E0F178AEB1600A83B4B /* petsc.framework */; }; @@ -85,21 +74,10 @@ 9C96089C1712C7F600E1D4A0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 9C96089E1712C8EB00E1D4A0 /* emulatorFix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = emulatorFix.c; sourceTree = "<group>"; }; 9C9608AB1712EF0900E1D4A0 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard.storyboard; sourceTree = "<group>"; }; - 9C99752C17379C440036EC24 /* BH.pro */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = BH.pro; path = files/BH.pro; sourceTree = "<group>"; }; - 9C99752D17379C440036EC24 /* machine_magstadyn_a.pro */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = machine_magstadyn_a.pro; path = files/machine_magstadyn_a.pro; sourceTree = "<group>"; }; - 9C99752E17379C440036EC24 /* magnet_data.pro */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = magnet_data.pro; path = files/magnet_data.pro; sourceTree = "<group>"; }; - 9C99752F17379C440036EC24 /* magnet.geo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = magnet.geo; path = files/magnet.geo; sourceTree = "<group>"; }; - 9C99753017379C440036EC24 /* magnet.pro */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = magnet.pro; path = files/magnet.pro; sourceTree = "<group>"; }; - 9C99753117379C440036EC24 /* Magnetostatics.pro */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = Magnetostatics.pro; path = files/Magnetostatics.pro; sourceTree = "<group>"; }; - 9C99753217379C440036EC24 /* pmsm_data.geo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = pmsm_data.geo; path = files/pmsm_data.geo; sourceTree = "<group>"; }; - 9C99753317379C440036EC24 /* pmsm_rotor.geo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = pmsm_rotor.geo; path = files/pmsm_rotor.geo; sourceTree = "<group>"; }; - 9C99753417379C440036EC24 /* pmsm_stator.geo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = pmsm_stator.geo; path = files/pmsm_stator.geo; sourceTree = "<group>"; }; - 9C99753517379C440036EC24 /* pmsm.geo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = pmsm.geo; path = files/pmsm.geo; sourceTree = "<group>"; }; - 9C9975401737A4840036EC24 /* pmsm.pro */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = pmsm.pro; path = files/pmsm.pro; sourceTree = "<group>"; }; - 9C9975421737B55E0036EC24 /* pmsm_8p_circuit.pro */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = pmsm_8p_circuit.pro; path = files/pmsm_8p_circuit.pro; sourceTree = "<group>"; }; 9C99754C17390DEE0036EC24 /* iosGModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iosGModel.h; sourceTree = "<group>"; }; 9C9F8BCC174B5A1B004332C5 /* ic_launcher_retina.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_launcher_retina.png; sourceTree = "<group>"; }; 9C9F8BCE174B5A23004332C5 /* ic_launcher.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_launcher.png; sourceTree = "<group>"; }; + 9CC85C011790286C00F241C4 /* files */ = {isa = PBXFileReference; lastKnownFileType = folder; path = files; sourceTree = "<group>"; }; 9CE08E01178AE6BE00A83B4B /* drawContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = drawContext.cpp; sourceTree = "<group>"; }; 9CE08E02178AE6BE00A83B4B /* drawContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = drawContext.h; sourceTree = "<group>"; }; 9CE08E03178AE6BE00A83B4B /* movePosition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = movePosition.h; sourceTree = "<group>"; }; @@ -181,7 +159,7 @@ 9C9608401712C16300E1D4A0 /* Onelab */ = { isa = PBXGroup; children = ( - 9C9608781712C5FE00E1D4A0 /* files */, + 9CC85C011790286C00F241C4 /* files */, 9C95B7F51726C88E00C0CCE2 /* main.m */, 9C9608AA1712EF0900E1D4A0 /* MainStoryboard.storyboard */, 9C9608491712C16300E1D4A0 /* AppDelegate.h */, @@ -222,25 +200,6 @@ name = "Supporting Files"; sourceTree = "<group>"; }; - 9C9608781712C5FE00E1D4A0 /* files */ = { - isa = PBXGroup; - children = ( - 9C9975421737B55E0036EC24 /* pmsm_8p_circuit.pro */, - 9C9975401737A4840036EC24 /* pmsm.pro */, - 9C99752C17379C440036EC24 /* BH.pro */, - 9C99752D17379C440036EC24 /* machine_magstadyn_a.pro */, - 9C99752E17379C440036EC24 /* magnet_data.pro */, - 9C99752F17379C440036EC24 /* magnet.geo */, - 9C99753017379C440036EC24 /* magnet.pro */, - 9C99753117379C440036EC24 /* Magnetostatics.pro */, - 9C99753217379C440036EC24 /* pmsm_data.geo */, - 9C99753317379C440036EC24 /* pmsm_rotor.geo */, - 9C99753417379C440036EC24 /* pmsm_stator.geo */, - 9C99753517379C440036EC24 /* pmsm.geo */, - ); - name = files; - sourceTree = "<group>"; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -313,20 +272,9 @@ buildActionMask = 2147483647; files = ( 9C9608AC1712EF0900E1D4A0 /* MainStoryboard.storyboard in Resources */, - 9C99753617379C440036EC24 /* BH.pro in Resources */, - 9C99753717379C440036EC24 /* machine_magstadyn_a.pro in Resources */, - 9C99753817379C440036EC24 /* magnet_data.pro in Resources */, - 9C99753917379C440036EC24 /* magnet.geo in Resources */, - 9C99753A17379C440036EC24 /* magnet.pro in Resources */, - 9C99753B17379C440036EC24 /* Magnetostatics.pro in Resources */, - 9C99753C17379C440036EC24 /* pmsm_data.geo in Resources */, - 9C99753D17379C440036EC24 /* pmsm_rotor.geo in Resources */, - 9C99753E17379C440036EC24 /* pmsm_stator.geo in Resources */, - 9C99753F17379C440036EC24 /* pmsm.geo in Resources */, - 9C9975411737A4840036EC24 /* pmsm.pro in Resources */, - 9C9975431737B55E0036EC24 /* pmsm_8p_circuit.pro in Resources */, 9C9F8BCD174B5A1B004332C5 /* ic_launcher_retina.png in Resources */, 9C9F8BCF174B5A23004332C5 /* ic_launcher.png in Resources */, + 9CC85C021790286C00F241C4 /* files in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/contrib/mobile/iOS/Onelab/DetailViewController.mm b/contrib/mobile/iOS/Onelab/DetailViewController.mm index 5c5d85e38c..9ba0fbb9ae 100644 --- a/contrib/mobile/iOS/Onelab/DetailViewController.mm +++ b/contrib/mobile/iOS/Onelab/DetailViewController.mm @@ -55,6 +55,7 @@ - (IBAction)pinch:(UIPinchGestureRecognizer *)sender { + if([sender numberOfTouches] != 2) return; scaleFactor *= [sender scale]; scaleFactor = MAX(0.1, scaleFactor); glView->mContext->eventHandler(2,scaleFactor); @@ -332,7 +333,7 @@ void messageFromCpp (void *self, std::string level, std::string msg) //[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshParameters" object:nil]; } else if(level == "Error") - [(__bridge id)self showAlert:msg title:level]; + ;//[(__bridge id)self showAlert:msg title:level]; } #pragma mark - tableView @@ -372,8 +373,9 @@ void messageFromCpp (void *self, std::string level, std::string msg) -(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSString *modelName = [models objectAtIndex:indexPath.row]; - NSString *ressourcePath = [[NSBundle mainBundle] resourcePath]; - glView->mContext->load([[NSString stringWithFormat:@"%@%@%@%@",ressourcePath,@"/",modelName,@".geo"] UTF8String]); + //NSString *ressourcePath = [[NSBundle mainBundle] resourcePath]; + [glView loadMsh:[NSString stringWithFormat:@"%@%@%@",@"/",modelName,@".geo"]]; + //glView->mContext->load([[NSString stringWithFormat:@"%@%@%@%@",ressourcePath,@"/",modelName,@".geo"] UTF8String]); [self hideModelsList]; [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshParameters" object:nil]; return indexPath; diff --git a/contrib/mobile/iOS/Onelab/EAGLView.h b/contrib/mobile/iOS/Onelab/EAGLView.h index 51d33100b9..db9872cafc 100644 --- a/contrib/mobile/iOS/Onelab/EAGLView.h +++ b/contrib/mobile/iOS/Onelab/EAGLView.h @@ -24,6 +24,8 @@ /* OpenGL name for the depth buffer that is attached to viewFramebuffer, if it exists (0 if it does not exist) */ GLuint depthRenderbuffer; + + NSString *docPath; @public /* our GModel drawing class */ drawContext *mContext; diff --git a/contrib/mobile/iOS/Onelab/EAGLView.mm b/contrib/mobile/iOS/Onelab/EAGLView.mm index e0bd7a392e..27b1a2d2a7 100644 --- a/contrib/mobile/iOS/Onelab/EAGLView.mm +++ b/contrib/mobile/iOS/Onelab/EAGLView.mm @@ -42,8 +42,9 @@ //[self release]; return nil; } - NSString *ressourcePath = [[NSBundle mainBundle] resourcePath]; - NSString *startupModel = [ressourcePath stringByAppendingPathComponent:@"pmsm.geo"]; + [self copyRes]; + //NSString *ressourcePath = [[NSBundle mainBundle] resourcePath]; + NSString *startupModel = [docPath stringByAppendingPathComponent:@"pmsm.geo"]; mContext = new drawContext(); mContext->load(*new std::string([startupModel fileSystemRepresentation])); @@ -51,6 +52,21 @@ return self; } +- (void) copyRes +{ + NSString *resPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"files"]; + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + docPath = [paths objectAtIndex:0]; //Get the docs directory + + NSArray *resContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:resPath error:NULL]; + + for (NSString* obj in resContents){ + NSError* error; + if (![[NSFileManager defaultManager] copyItemAtPath:[resPath stringByAppendingPathComponent:obj] toPath:[docPath stringByAppendingPathComponent:obj] error:&error]) + NSLog(@"Error: %@", error);; + } +} + - (void)drawView { [EAGLContext setCurrentContext:context]; @@ -65,8 +81,7 @@ } - (void)loadMsh:(NSString*) file { - NSString *ressourcePath = [[NSBundle mainBundle] resourcePath]; - NSString *msh = [ressourcePath stringByAppendingPathComponent: file]; + NSString *msh = [docPath stringByAppendingPathComponent: file]; //mContext = new drawContext(); mContext->load(*new std::string([msh fileSystemRepresentation])); [self drawView]; @@ -84,7 +99,7 @@ mContext->eventHandler(1,position.x,position.y); } break; - case 2: + case 3: { mContext->eventHandler(3,position.x,position.y); } diff --git a/contrib/mobile/iOS/ic_launcher.png b/contrib/mobile/iOS/ic_launcher.png index 02c7b41650a9c40f1f01022e268f2fe5a0bc5304..0f700e7b64a142a517b544a6f8ead990363456bd 100644 GIT binary patch literal 3687 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 FV1k=X>&5^8 delta 565 zcmV-50?Pg89K!^V8Gi!+003e$Lv;WE0QOK!R7Kz4-~a#r0001hfPf$%Aolj{?d{v= z=g-sAyWHHk(9odB$e8^6`T6<t_xJDO;>FI+oWQ_<^YiE6;K0<>sL05W>gv_j)~v<F zio(K#`}_Cx_3Q8N-`?K5%*>eP=FQmHu+Pt)#>R~B@ZsU%!+-w%{rLFt>FLwe)vDv; z$HT*hn3#ZETtrAnFg7+M8yga^uz;ADXpoR#Y-~uDmSk5~Iv5xb5)upv2?nUBaD;?d zU|>KbBpAB7e6g{1etuLxKPsG@Xl7<aFfbq<9uy1=2(GSllape2cu-4AGA%70T3S4T zfmT97EEN?F1AhYoR8%;(w|c<S(%b+500DGTPE!Ct=GbNc0004EOGiWihy@);00009 za7bBm000th000th0n7%(UH||92XskIMF-sl5DhaN5<l0H0002SNkl<ZSi{xWi4DUb z5Cu{Hq5qzv#8QM447-3irhr$#9LK=KVvqz&L3%?h1b^v-=;161(ZM+(mVgvPECA^W zF&)w`#AHbS5N%EbF%eQ4Vt+_?5Dm^1VhW@j!~{rrh<zcIAO=G!L)1A5h=Gu75W^r@ zA$EgghwwW$5Cb6jARdS0h1dm>AHwHkAY4ukVtq)p5D!7Bhj;{13xv@LXC|p&e5-^) zqC8|oGA>#g3YJok*GOR(DAW`|4N63PpwJw>E?m!EEg}$&^5Qk`00000NkvXXu0mjf DIhXvH diff --git a/contrib/mobile/iOS/ic_launcher_retina.png b/contrib/mobile/iOS/ic_launcher_retina.png index 796d0a18cd57e4ed912822bac8b2a7645679ab6b..b4e47dddbd234d2893e89b54b51be51468d9c9e1 100644 GIT binary patch literal 9362 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 M07*qoM6N<$f;?c{IRF3v delta 780 zcmV+n1M~cnNtgzZ8Gi!+007XK5{du-0QOK!R7Kz4-~a#r0001hfPf$%Aolj{?d{v= z=g-sAyWHHk(9odB$e8^6`T6<t_xJDO;>FI+oWQ_<^YiE6;K0<>sL05W>gv_j)~v<F zio(K#`}_Cx_3Q8N-`?K5%*>eP=FQmHu+Pt)#>R~B@ZsU%!+-w%{rLFt>FLwe)vDv; z$HT*hn3#ZETtrAnFg7+M8yga^uz;ADXpoR#Y-~uDmSk5~Iv5xb5)upv2?nUBaD;?d zU|>KbBpAB7e6g{1etuLxKPsG@Xl7<aFfbq<9uy1=2(GSllape2cu-4AGA%70T3S4T zfmT97EEN?F1AhYoR8%;(w|c<S(%b+500DGTPE!Ct=GbNc0004EOGiWihy@);00009 za7bBm000th000th0n7%(UH||92XskIMF-sl5Dhd8K*>=t0004-Nkl<Zc-rmUi*3U& z5Cl=rvj3g~2Z3T6v?TtI<V^*yf_Xf=J|SZsBnQm|;(rN}gU&opkR6gS5F8*m=&R=s zBnR0C@eY!MzIYCh92EEbgXEy7=LIAO*#!{?$w3j%8)y{C7zj>4a?q#e6C?*&191h? z<{+*?+8V?ikTwQ!52TTvC`b;n0pdQW56Kt^l0e!HL@G#|fk+3*K_fxrfV2^aJdm~l zkqgo$Ab;{fa?l76C7>20V<0F5X>kzcAT14|21pL-2ciy0%Yvu{(xM>hf#jebAZmiN z9ti4!ib>W$)CXxP5G_D*P&*K9Kw1VwE07ie(GH{~K(qwOLG?kj1!;B=v<4-TtbynO z(!?P8fYj2H1(Jj6fanL(lpuP7G$Dw-AWa9NH-AVDDgr@&&?(6ph%q2d17Z|NlYkfp z((<72TV+rg=BS>i0;T{}?g<wai)vzWP}!c4TBfKCCIyw~3B{#}CIf|9-3E2A+)-VD zLc7jEeJy9GFQCw`C}<QWrg{T~fxUvpYhF<{LBUMMW@_H8egFV>L#=biR&oFU002ov KP6b4+LSTZfvsT{# -- GitLab