03.05.2013 Views

Slides - Ocean - Schlumberger

Slides - Ocean - Schlumberger

Slides - Ocean - Schlumberger

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

18: User Interface - Interaction<br />

User Interface - Interaction<br />

<strong>Ocean</strong> for Petrel 2012.1<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

1


18: User Interface - Interaction<br />

Objectives<br />

<strong>Ocean</strong> Petrel UI interaction concepts and customization<br />

Petrel native window modes<br />

picking interfaces<br />

custom window modes<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

2


18: User Interface - Interaction<br />

Interactions in Petrel windows<br />

Users interact with domain objects displayed in Petrel windows<br />

native Petrel windows are always in given window mode<br />

available from Petrel UI process toolbar<br />

mode defines interpretation of interactive events<br />

viewing<br />

measure distance<br />

manipulate plane<br />

magnify<br />

picking<br />

drag plane<br />

Petrel window modes<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

3


18: User Interface - Interaction<br />

Native Petrel window modes<br />

WellKnownWindowModes exposes native window modes<br />

standard<br />

modes for<br />

all windows<br />

public static class WellKnownWindowModes<br />

{ ...<br />

static WindowMode Viewing;<br />

static WindowMode Magnify;<br />

static WindowMode MeasureDistance;<br />

static WindowMode PickSelect;<br />

static WindowMode ManipulatePlane;<br />

}<br />

static IEnumerable All { get; }<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

4


18: User Interface - Interaction<br />

Native Petrel window modes, continued<br />

Some window modes are specific to 3D windows<br />

3D window<br />

specific modes<br />

public static class WellKnownWindowModes<br />

{ ...<br />

static WindowMode BoundingBoxSelect;<br />

static WindowMode AddNewPillarBy1Point;<br />

static WindowMode AddNewPillarBy2Points;<br />

static WindowMode SelectEditLine;<br />

static WindowMode Eraser;<br />

...<br />

}<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

5


18: User Interface - Interaction<br />

Process - WindowMode association<br />

Window modes available to end user are defined by Process<br />

override WindowModesCore to define window modes<br />

class MyProcess : Process<br />

{ ...<br />

private IList myWinModes;<br />

public MyProcess() : base("MyProcess")<br />

{ myWinModes = new List();<br />

myWinModes.Add(WellKnownWindowModes.Viewing);<br />

myWinModes.Add(WellKnownWindowModes.Magnify);<br />

myWinModes.Add(WellKnownWindowModes.SelectPick);<br />

myWinModes.Add(...);<br />

}<br />

// return list of allowed window modes<br />

protected override IEnumerable WindowModesCore<br />

{ get { return myWinModes; } }<br />

}<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

6


18: User Interface - Interaction<br />

Using process-window combination<br />

Window modes controlled by active process/window combination<br />

active<br />

process<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

active<br />

window<br />

window<br />

modes<br />

7


18: User Interface - Interaction<br />

Active process-window example<br />

Check active window in WindowModesCore<br />

called<br />

when<br />

process<br />

is active<br />

is map<br />

window<br />

active<br />

class MyProcess : Process<br />

{<br />

MyWindowMode sel = ...<br />

...<br />

protected override IEnumerable WindowModesCore<br />

{<br />

get<br />

{<br />

IToggleWindows wm = PetrelProject.ToggleWindows;<br />

bool SelInModes = myWinModes.Contains(sel);<br />

if (wm.Active is MapWindow)<br />

{<br />

if (!SelInModes)<br />

myWinModes.Add(sel);<br />

}<br />

else if (SelInModes)<br />

myWinModes.Remove(sel);<br />

return myWinModes;<br />

}<br />

}<br />

}<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

8


18: User Interface - Interaction<br />

Window mode class<br />

WindowMode represents interactive mode in Petrel<br />

configure tool, cursor, visibility, activation<br />

decide visibility based on active window/object/process<br />

– disable if window mode cannot be used<br />

public abstract class WindowMode<br />

{ ...<br />

virtual Bitmap BitmapCore { get; }<br />

virtual string ToolTipCore { get; }<br />

virtual Cursor GetCursorCore { get; }<br />

}<br />

virtual bool CanBeVisibleCore { get; }<br />

virtual bool CanBeActivatedCore { get; }<br />

virtual void OnActivateCore( WindowModeContext context);<br />

virtual void OnDeactivateCore(WindowModeContext context);<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

9


18: User Interface - Interaction<br />

Window mode class and interaction<br />

Interactive events in window channeled to active window mode<br />

mouse events used to manipulate domain object or record info<br />

each event provides event information<br />

public abstract class WindowMode<br />

{ ...<br />

virtual void OnDragCore (PickedPoint args);<br />

virtual void OnDragFinishCore(PickedPoint args);<br />

virtual void OnDragStartCore (PickedPoint args);<br />

virtual void OnMouseClickCore(PickedPoint args);<br />

virtual void OnKeyDownCore (PickedPoint args);<br />

virtual void OnKeyUpCore (PickedPoint args);<br />

}<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

10


18: User Interface - Interaction<br />

PickedPoint class<br />

Describes interactive event at world position in any Petrel window<br />

subclass for each extensible renderer<br />

mouse buttons,<br />

keys state<br />

vertical domain<br />

active process<br />

world position<br />

window mode<br />

gets description<br />

of current pick<br />

public class PickedPoint<br />

{ ...<br />

MouseButtons Button { get; }<br />

bool ControlIsPressed { get; }<br />

bool ShiftIsPressed { get; }<br />

Keys KeyData { get; }<br />

object DomainObject { get; }<br />

Domain DomainZ { get; }<br />

Process Process { get; }<br />

IToggleWindow Window { get; }<br />

virtual Point3 World { get; set; }<br />

IEnumerable PickString { get; set; }<br />

}<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

11


18: User Interface - Interaction<br />

Interaction and custom domain objects<br />

Window mode uses picked point information in mouse events<br />

system can not set picked point info for custom domain objects<br />

you supply picked point information via picking interfaces<br />

– for 3D, map, interpretation/intersection window where interaction<br />

needed<br />

I*Picking adds<br />

more information if<br />

custom object hit<br />

*PickedPoint<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

*WindowMode<br />

uses picked point<br />

info to manipulate<br />

domain object or<br />

record information<br />

12


18: User Interface - Interaction<br />

Picking interfaces<br />

Implement picking interface to give hit/pick information<br />

for interaction with custom domain objects<br />

on same class that implements renderer interface<br />

IMapRenderer<br />

implements<br />

IIntersectionRenderer<br />

implements<br />

IWindow3DRenderer<br />

implements<br />

IMapPicking<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

IIntersectionPicking<br />

IWindow3DPicking<br />

13


18: User Interface - Interaction<br />

IMapPicking<br />

IMapPicking gives map hit/pick info<br />

check geometry of custom domain object<br />

set IsHit to true when custom domain object is hit<br />

public interface IMapPicking<br />

{<br />

void GetPickInfo(object o, MapPickedPoint pt,<br />

MapRendererContext cxt);<br />

}<br />

set explicitly<br />

get location<br />

if null, set it<br />

public class MapPickedPoint : PickedPoint<br />

{ ...<br />

bool IsHit { get; set; }<br />

Ray3 Ray { get; }<br />

Point3 World { get; set; }<br />

}<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

14


18: User Interface - Interaction<br />

IIntersectionPicking<br />

IIntersectionPicking gives intersection hit/pick info<br />

pick string is displayed if user moves mouse over domain<br />

object<br />

public interface IIntersectionPicking<br />

{<br />

void GetPickInfo(object o, IntersectionPickedPoint pt,<br />

IntersectionRendererContext cxt);<br />

}<br />

horizontal position<br />

on-plane world coordinate<br />

may be null<br />

will always be defined<br />

public class IntersectionPickedPoint : PickedPoint<br />

{ ...<br />

double HorizontalHit { get; }<br />

Point3 IntersectionHit { get; }<br />

bool IsHit { get; set; }<br />

Ray3 Ray { get; }<br />

Point3 World { get; set; }<br />

double ZHit { get; }<br />

}<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

15


18: User Interface - Interaction<br />

IWindow3DPicking<br />

IWindow3DPicking gives 2D/3D pick info<br />

no IsHit property to set, <strong>Ocean</strong> detects hit on its own<br />

public interface IWindow3DPicking<br />

{<br />

void GetPickInfo(object o, Window3DPickedPoint p,<br />

Window3DRendererContext cxt);<br />

}<br />

local pixel coordinate<br />

null if object not hit<br />

path from root till hit node<br />

public class Window3DPickedPoint : PickedPoint<br />

{ ...<br />

Point Pixel { get; }<br />

Ray3 Ray { get; }<br />

Point3 World { get; set; }<br />

Point3 WorldHit { get; }<br />

SoPickedPoint PickDetail { get; }<br />

SoPath PickPath { get; }<br />

}<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

16


18: User Interface - Interaction<br />

Custom window mode interaction scenario<br />

Scenario: end user interacting with custom domain object<br />

move/drag circle in Map window, updating its location<br />

1. end user<br />

displays<br />

object<br />

2. end user<br />

activates process<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

3. end user<br />

activates<br />

custom Move<br />

window mode<br />

4. end user<br />

moves object<br />

17


18: User Interface - Interaction<br />

Custom window mode steps<br />

Steps to enable interaction with custom object in Map window:<br />

1. implement custom WindowMode class<br />

a. appearance: override icon, tooltip and cursor<br />

b. interactions: override mouse events<br />

2. add custom window mode(s) to Process class<br />

3. implement picking interface in renderer for custom objects<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

18


18: User Interface - Interaction<br />

Custom window mode example [step 1]<br />

Derive from abstract class to implement custom MoveXYZ mode<br />

appearance: override icon, tooltip and cursor<br />

interactions: override mouse events<br />

public abstract class WindowMode<br />

{ ...<br />

virtual Bitmap BitmapCore { get; }<br />

virtual string ToolTipCore { get; }<br />

virtual Cursor GetCursorCore { get; }<br />

}<br />

virtual void OnDragStartCore (PickedPoint args);<br />

virtual void OnDragCore (PickedPoint args);<br />

class MoveXYZWindowMode : WindowMode<br />

{ ... }<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

19


18: User Interface - Interaction<br />

Custom window mode appearance [step 1a]<br />

Provide overrides for icon, tooltip and cursor<br />

icon and tooltip are required for tool button<br />

mouse cursor can be customized<br />

class MoveXYZWindowMode : WindowMode<br />

{ ...<br />

protected override Bitmap BitmapCore<br />

{ get { return PetrelImages.Wand; } }<br />

protected override string ToolTipCore<br />

{ get { return "Move XYZ"; } }<br />

protected override Cursor GetCursorCore(PickedPoint args)<br />

{<br />

if (args.DomainObject is XYZObject) return Cursors.Cross;<br />

else return Cursors.Default;<br />

}<br />

}<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

20


18: User Interface - Interaction<br />

Custom window mode – start drag [step 1b]<br />

OnDragStartCore called when dragging starts<br />

get window, domain object, current location from picked point<br />

class MoveXYZWindowMode : WindowMode<br />

{ ...<br />

private Point2 m_offset;<br />

private XYZObject m_xyz;<br />

protected override void OnDragStartCore(PickedPoint args)<br />

{<br />

MapWindow w = args.Window as MapWindow;<br />

if (w == null) return;<br />

MapPickedPoint mapArgs = args as MapPickedPoint;<br />

m_xyz = mapArgs.DomainObject as XYZObject;<br />

if (m_xyz == null || mapArgs.World == null) return;<br />

// save offset from clicked point to circle center<br />

// used to give smooth movement of circle when dragging<br />

m_offset = new Point2((double)m_xyz.X – (double)mapArgs.World.X,<br />

(double)m_xyz.Y – (double)mapArgs.World.Y);<br />

} }<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

21


18: User Interface - Interaction<br />

Custom window mode – update position [step 1b]<br />

OnDragCore updates object position with new coordinates<br />

get current mouse coordinate from MapPickedPoint<br />

class MoveXYZWindowMode : WindowMode<br />

{ ...<br />

protected override void OnDragCore(PickedPoint args)<br />

{<br />

MapWindow w = args.Window as MapWindow;<br />

if (w == null) return;<br />

MapPickedPoint mapArgs = args as MapPickedPoint;<br />

m_xyz = mapArgs.DomainObject as XYZObject;<br />

if (m_xyz == null || mapArgs.World == null) return;<br />

// new position is current mouse coord + offset<br />

m_xyz.X = (float)mapArgs.World.X + (float)m_offset.X;<br />

m_xyz.Y = (float)mapArgs.World.Y + (float)m_offset.Y;<br />

}<br />

}<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

22


18: User Interface - Interaction<br />

Add custom window mode to process [step 2]<br />

Check active window and if custom window mode in mode list<br />

class InteractionProcess : Process<br />

{ ...<br />

MoveXYZWindowMode moveXYZMode; List myWinModes;<br />

public InteractionProcess() : base("InteractionProcess")<br />

{<br />

moveXYZMode = new MoveXYZWindowMode();<br />

myWinModes = new List();<br />

myWinModes.Add(WellKnownWindowModes.Viewing);<br />

myWinModes.Add(WellKnownWindowModes.PickSelect);<br />

}<br />

protected override IEnumerable WindowModesCore<br />

{<br />

get { bool inModes = myWinModes.Contains(moveXYZMode);<br />

if (PetrelProject.ToggleWindows.Active is MapWindow)<br />

{ if (!inModes) myWinModes.Add(moveXYZMode); }<br />

else if (inModes)<br />

myWinModes.Remove(moveXYZMode);<br />

return myWinModes;<br />

}<br />

}<br />

}<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

23


18: User Interface - Interaction<br />

Implement IMapPicking [step 3]<br />

Implement IMapPicking on same class as renderer<br />

if hit is in custom domain object geometry, set IsHit<br />

set object’s Z value if required<br />

class XYZMapView : IMapRenderer, IMapPicking<br />

{<br />

public void GetPickInfo(object o, MapPickedPoint pt, MapRendererContext c)<br />

{<br />

if (o is XYZObject)<br />

{<br />

XYZObject xyz = o as XYZObject;<br />

// is picked point in xyz’s geometry? get distance and compare to radius<br />

Point2 xyzCtr = new Point2(xyz.X, xyz.Y);<br />

Point2 pickPt = new Point2(pt.Ray.Origin.X, pt.Ray.Origin.Y);<br />

Segment2 seg = new Segment2(xyzCtr, pickPt);<br />

if (seg.Length


18: User Interface - Interaction<br />

Interaction in well section window<br />

Different pattern for well section window interaction<br />

picked point data populated by framework, no picking interface<br />

override PickCore in derived well section visual class<br />

window mode uses VisualPick enumerable<br />

horizontal value<br />

corresponds to a point<br />

along trajectory<br />

world Z value<br />

public class WellSectionPickedPoint : PickedPoint<br />

{ ...<br />

Borehole Borehole { get; }<br />

Domain DomainZ { get; }<br />

double TrackValue { get; }<br />

Point3 World { get; set; }<br />

double MD { get; }<br />

double Z { get; }<br />

cgPoint WindowPoint { get; }<br />

cgTransformation WindowTransformation { get; }<br />

IEnumerable PickedObjects { get; }<br />

}<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

25


18: User Interface - Interaction<br />

Summary<br />

Interaction customization<br />

can re-use Petrel native window modes<br />

can create custom window modes<br />

© 2012 <strong>Schlumberger</strong>. All rights reserved. www.ocean.slb.com/developers<br />

26

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!