// Copyright (c) 2017 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // // This library is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License version 2.1 as published // by the Free Software Foundation, with special exception defined in the file // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT // distribution for complete text of the license and disclaimer of any warranty. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. #import #import "GLViewController.h" #import "GLView.h" @implementation GLViewController // ======================================================================= // function : init // purpose : // ======================================================================= - (id) init { self = [super init]; if (self) { myOcctViewer = new OcctViewer(); } return self; } // ======================================================================= // function : Draw // purpose : // ======================================================================= - (void) Draw { } // ======================================================================= // function : Setup // purpose : // ======================================================================= - (void) Setup { if (!myOcctViewer->InitViewer(self.view)) { NSLog(@"Failed to init viewer"); } else { [self importScrew:nullptr]; } } // ======================================================================= // function : loadView // purpose : // ======================================================================= - (void) loadView { GLView* aGLView = [[GLView alloc] init]; aGLView->myController = self; self.view = aGLView; } // ======================================================================= // function : touchesBegan // purpose : // ======================================================================= - (void)touchesBegan:(NSSet *)theTouches withEvent:(UIEvent *)theEvent { [super touchesBegan:theTouches withEvent:theEvent]; UITouch *aTouch = [theTouches anyObject]; if (aTouch != NULL) { CGPoint aTouchPoint = [aTouch locationInView:self.view]; myOcctViewer->StartRotation((int)aTouchPoint.x, (int)aTouchPoint.y); } } // ======================================================================= // function : touchesMoved // purpose : // ======================================================================= - (void)touchesMoved:(NSSet *)theTouches withEvent:(UIEvent *)theEvent { [super touchesMoved:theTouches withEvent:theEvent]; UITouch *aTouch = [theTouches anyObject]; if (aTouch != NULL) { CGPoint aTouchPoint = [aTouch locationInView:self.view]; myOcctViewer->Rotation((int)aTouchPoint.x, (int)aTouchPoint.y); } return; } // ======================================================================= // function : viewDidLoad // purpose : // ======================================================================= -(void)viewDidLoad { // add zoom recognizer UIPinchGestureRecognizer *aZoomRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(zoomHandler:)]; [[self view] addGestureRecognizer:aZoomRecognizer]; // add pan recognizer UIPanGestureRecognizer *aPanRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panHandler:)]; aPanRecognizer.maximumNumberOfTouches = 2; aPanRecognizer.minimumNumberOfTouches = 2; [[self view] addGestureRecognizer:aPanRecognizer]; UITapGestureRecognizer *aTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapHandler:)]; [[self view] addGestureRecognizer:aTapRecognizer]; // add import buttons UIBarButtonItem *importScrewBtn = [[UIBarButtonItem alloc] initWithTitle:@"Sample 1" style:UIBarButtonItemStylePlain target:self action:@selector(importScrew:)]; UIBarButtonItem *importLinkrodsBtn = [[UIBarButtonItem alloc] initWithTitle:@"Sample 2" style:UIBarButtonItemStylePlain target:self action:@selector(importLinkrods:)]; UIBarButtonItem *displayAboutDlgBtn = [[UIBarButtonItem alloc] initWithTitle:@"About" style:UIBarButtonItemStylePlain target:self action:@selector(displayAboutDlg:)]; [self.navigationItem setLeftBarButtonItems:[NSArray arrayWithObjects:importScrewBtn, importLinkrodsBtn, nil]]; [self.navigationItem setRightBarButtonItem: displayAboutDlgBtn]; } // ======================================================================= // function : zoomHandler // purpose : // ======================================================================= - (void)zoomHandler:(UIPinchGestureRecognizer *)pinchRecognizer { if ([pinchRecognizer numberOfTouches] > 1) { UIGestureRecognizerState aState = [pinchRecognizer state]; if (aState == UIGestureRecognizerStateBegan) { myFirstTouch[0] = [pinchRecognizer locationOfTouch:0 inView:self.view]; myFirstTouch[1] = [pinchRecognizer locationOfTouch:1 inView:self.view]; } else if (aState == UIGestureRecognizerStateChanged) { CGPoint aLastTouch[2] = { [pinchRecognizer locationOfTouch:0 inView:self.view], [pinchRecognizer locationOfTouch:1 inView:self.view] }; double aPinchCenterXStart = ( myFirstTouch[0].x + myFirstTouch[1].x ) / 2.0; double aPinchCenterYStart = ( myFirstTouch[0].y + myFirstTouch[1].y ) / 2.0; double aStartDist = Sqrt( ( myFirstTouch[0].x - myFirstTouch[1].x ) * ( myFirstTouch[0].x - myFirstTouch[1].x ) + ( myFirstTouch[0].y - myFirstTouch[1].y ) * ( myFirstTouch[0].y - myFirstTouch[1].y ) ); double anEndDist = Sqrt( ( aLastTouch[0].x - aLastTouch[1].x ) * ( aLastTouch[0].x - aLastTouch[1].x ) + ( aLastTouch[0].y - aLastTouch[1].y ) * ( aLastTouch[0].y - aLastTouch[1].y ) ); double aDeltaDist = anEndDist - aStartDist; myOcctViewer->Zoom(aPinchCenterXStart, aPinchCenterYStart, aDeltaDist); myFirstTouch[0] = aLastTouch[0]; myFirstTouch[1] = aLastTouch[1]; } } } // ======================================================================= // function : panHandler // purpose : // ======================================================================= - (void)panHandler:(UIPanGestureRecognizer *)panRecognizer { if ([panRecognizer numberOfTouches] > 1) { UIGestureRecognizerState aState = [panRecognizer state]; if (aState == UIGestureRecognizerStateBegan) { myFirstTouch[0] = [panRecognizer locationOfTouch:0 inView:self.view]; myFirstTouch[1] = [panRecognizer locationOfTouch:1 inView:self.view]; } else if (aState == UIGestureRecognizerStateChanged) { CGPoint aLastTouch[2] = { [panRecognizer locationOfTouch:0 inView:self.view], [panRecognizer locationOfTouch:1 inView:self.view] }; double aPinchCenterXStart = ( myFirstTouch[0].x + myFirstTouch[1].x ) / 2.0; double aPinchCenterYStart = ( myFirstTouch[0].y + myFirstTouch[1].y ) / 2.0; double aPinchCenterXEnd = ( aLastTouch[0].x + aLastTouch[1].x ) / 2.0; double aPinchCenterYEnd = ( aLastTouch[0].y + aLastTouch[1].y ) / 2.0; double aPinchCenterXDev = aPinchCenterXEnd - aPinchCenterXStart; double aPinchCenterYDev = aPinchCenterYEnd - aPinchCenterYStart; myOcctViewer->Pan((int)aPinchCenterXDev, (int)-aPinchCenterYDev); } } } // ======================================================================= // function : tapHandler // purpose : // ======================================================================= - (void)tapHandler:(UITapGestureRecognizer *)tapRecognizer { CGPoint aTapPoint = [tapRecognizer locationInView:self.view]; myOcctViewer->Select(aTapPoint.x, aTapPoint.y); } // ======================================================================= // function : importScrew // purpose : // ======================================================================= - (void)importScrew:(UIBarButtonItem *)theSender { NSString* aNsPath = [[NSBundle mainBundle] pathForResource:@"screw" ofType:@"step"]; std::string aPath = std::string([aNsPath UTF8String]); myOcctViewer->ImportSTEP(aPath); myOcctViewer->FitAll(); } // ======================================================================= // function : importLinkrods // purpose : // ======================================================================= - (void)importLinkrods:(UIBarButtonItem *)theSender { NSString* aNsPath = [[NSBundle mainBundle] pathForResource:@"linkrods" ofType:@"step"]; std::string aPath = std::string([aNsPath UTF8String]); myOcctViewer->ImportSTEP(aPath); myOcctViewer->FitAll(); } // ======================================================================= // function : displayAboutDlg // purpose : // ======================================================================= - (void)displayAboutDlg:(UIBarButtonItem *)theSender { UIAlertController* anAbout = [UIAlertController alertControllerWithTitle:@"About" message:@"UIKit based application for tutorial to Open CASCADE Technology.\n\n" @"Copyright (c) 2017 OPEN CASCADE SAS" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* aDefaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {}]; [anAbout addAction:aDefaultAction]; [self presentViewController:anAbout animated:YES completion:nil]; } @end