1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-21 10:13:43 +03:00
occt/samples/ios/UIKitSample/UIKitSample/GLViewController.mm
kgv b2a63f9b6f 0032013: Samples - iOS sample compilation errors
Added missing includes.
Fixed usage of obsolete Standard_Failure interface.
Fixed file headers.
2020-12-23 19:45:33 +03:00

290 lines
11 KiB
Plaintext

// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of the examples of the Open CASCADE Technology software library.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
#import <Foundation/Foundation.h>
#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