Slides - Ocean - Schlumberger
Slides - Ocean - Schlumberger
Slides - Ocean - Schlumberger
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