mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-08 18:40:55 +03:00
Sample that uses UIKit has been added. - Import of STEP files is provided - Zoom, Rotate, Pan actions are provided - Selection of solids is supported
282 lines
10 KiB
Plaintext
282 lines
10 KiB
Plaintext
// 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 <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
|