#include <stdio.h>
#include <Xm/Xm.h>
#include <Xm/RowColumn.h>
#include <Xm/Form.h>
#include <Xm/Separator.h>
#include <Xm/Label.h>
#include <Xm/PushBG.h>
#include <Xm/ScrolledW.h>
#include <Xint/Segy.h>
#include <Xint/Picking.h>
#define k_num_controls 1
#define k_num_zoom_controls 1
#define k_exit 0
#define k_zoom_OK 0
/* Declare subroutines */
void BuildUI();
/* Declare callbacks */
static void ControlsProc(Widget, int, XtPointer);
static void ZoomProc(Widget, XtPointer,
XintSeismicAreaSelectionCallbackStruct *);
static void ZoomControlsProc(Widget, int, XtPointer);
/* Declare global variables */
Widget toplevel_widget;
int i, j, n;
Arg arg[20];
static XtTranslations pick_translations_parsed;
static XintPickingRecord *picking_record;
static char pick_translations[] = "Ctrl<Btn1Down>:HorizonCreate() \n\
Ctrl<Btn3Down>: HorizonDelete() \n\
Shift<Btn1Down>: InitAreaSelection() \n\
<Btn1Motion>: ExtendAreaSelection() \n\
<Btn1Up>: EndAreaSelection() \n\
<Btn1Down>: PointInsert(i) \n\
<Btn2Down>: PointStartMove() \n\
<Btn2Motion>: PointMove() \n\
<Btn2Up>: PointEndMove() \n\
<Btn3Down>: PointDelete()";
main(argc, argv)
int argc;
char *argv[];
{
XtAppContext app_context;
toplevel_widget = XtAppInitialize (&app_context, "Example", NULL, 0,
&argc, argv, NULL,NULL, 0);
BuildUI ();
XtRealizeWidget(toplevel_widget);
XtAppMainLoop(app_context);
}
/***
*** BuildUI
***/
void BuildUI ()
{
Widget main_form;
Widget scrolled_window;
Widget segy_widget;
Widget sep;
Widget controls_box;
Widget controls_pb[k_num_controls];
static char *controls_pb_names[] = {"Exit"};
XintHorizon *horizon;
/* Create form to contain all other widgets */
n = 0;
XtSetArg(arg[n], XmNwidth, 500); n++;
XtSetArg(arg[n], XmNheight, 550); n++;
main_form = XtCreateManagedWidget("main_form", xmFormWidgetClass,
toplevel_widget, arg, n);
/* create separator */
n = 0;
XtSetArg(arg[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNbottomOffset, 50); n++;
sep = XtCreateManagedWidget("sep", xmSeparatorWidgetClass,
main_form, arg, n);
/* create a ScrolledWindow widget */
n = 0;
XtSetArg(arg[n], XmNtopAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNtopOffset, 0); n++;
XtSetArg(arg[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNleftOffset, 0); n++;
XtSetArg(arg[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNrightOffset, 0); n++;
XtSetArg(arg[n], XmNbottomAttachment, XmATTACH_WIDGET); n++;
XtSetArg(arg[n], XmNbottomWidget, sep); n++;
XtSetArg(arg[n], XmNbottomOffset, 10); n++;
XtSetArg(arg[n], XmNscrollingPolicy, XmAUTOMATIC); n++;
scrolled_window = XtCreateManagedWidget("scrolled_window",
xmScrolledWindowWidgetClass,
main_form, arg, n);
/* create the segy widget */
n = 0;
XtSetArg(arg[n], XmNplotTitle, "Picking1 Example "); n++;
XtSetArg(arg[n], XmNsegyFilename, "segy2.dat"); n++;
segy_widget = XtCreateManagedWidget("segy_widget", xintSegyWidgetClass,
scrolled_window, arg, n);
/* add callback procedure for the zoom operation */
XtAddCallback(segy_widget, XmNareaSelectionCallback, ZoomProc, NULL);
/* parse pick translations */
pick_translations_parsed = XtParseTranslationTable(pick_translations);
/* create the picking record and install tranlations */
picking_record = XintPickingRecordCreate(segy_widget,
pick_translations_parsed,
XintOVERRIDE_TRANSLATIONS);
/* create the first horizon and make it the current horizon */
horizon = XintHorizonCreate(picking_record, "horizon1", "red", 2, True);
/* create controls box */
n = 0;
XtSetArg(arg[n], XmNspacing, 15); n++;
XtSetArg(arg[n], XmNorientation, XmHORIZONTAL); n++;
XtSetArg(arg[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNrightOffset, 20); n++;
XtSetArg(arg[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNleftOffset, 20); n++;
XtSetArg(arg[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
XtSetArg(arg[n], XmNtopWidget, sep); n++;
XtSetArg(arg[n], XmNtopOffset, 10); n++;
XtSetArg(arg[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNbottomOffset, 10); n++;
controls_box = XtCreateManagedWidget("controls_box",
xmRowColumnWidgetClass,
main_form, arg, n);
/* create control pushbuttons */
n = 0;
XtSetArg(arg[n], XmNpushButtonEnabled, True); n++;
XtSetArg(arg[n], XmNmarginWidth, 4); n++;
XtSetArg(arg[n], XmNmarginHeight, 4); n++;
for (i=0; i < k_num_controls; i++) {
j = n;
XtSetArg(arg[j], XmNlabelString,
XmStringCreateLtoR(controls_pb_names[i],
XmSTRING_DEFAULT_CHARSET));
j++;
controls_pb[i] = XtCreateManagedWidget("control_buttons",
xmPushButtonGadgetClass,
controls_box, arg, j);
XtAddCallback(controls_pb[i], XmNactivateCallback, ControlsProc,
(XtPointer)i);
}
}
/***
*** ZoomProc
***/
static void ZoomProc(Widget widget, XtPointer client_data,
XintSeismicAreaSelectionCallbackStruct *call_data)
{
Widget zoom_dialog;
Widget zoom_scrolled_window;
Widget zoom_segy_widget;
Widget zoom_sep;
Widget zoom_controls_box;
Widget zoom_controls_pb[k_num_controls];
static char *zoom_pb_names[] = {"OK"};
/* Create form dialog to contain the zoomed area */
n = 0;
XtSetArg(arg[n], XmNwidth, 450); n++;
XtSetArg(arg[n], XmNheight, 330); n++;
zoom_dialog = XmCreateFormDialog(toplevel_widget, "zoom_dialog",
arg, n);
/* create separator */
n = 0;
XtSetArg(arg[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNbottomOffset, 50); n++;
zoom_sep = XtCreateManagedWidget("zoom_sep", xmSeparatorWidgetClass,
zoom_dialog, arg, n);
/* create a ScrolledWindow widget */
n = 0;
XtSetArg(arg[n], XmNtopAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNtopOffset, 0); n++;
XtSetArg(arg[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNleftOffset, 0); n++;
XtSetArg(arg[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNrightOffset, 0); n++;
XtSetArg(arg[n], XmNbottomAttachment, XmATTACH_WIDGET); n++;
XtSetArg(arg[n], XmNbottomWidget, zoom_sep); n++;
XtSetArg(arg[n], XmNbottomOffset, 10); n++;
XtSetArg(arg[n], XmNscrollingPolicy, XmAUTOMATIC); n++;
zoom_scrolled_window = XtCreateManagedWidget("zoom_scrolled_window",
xmScrolledWindowWidgetClass,
zoom_dialog, arg, n);
/* create Seismic Zoom widget */
zoom_segy_widget = XintSeismicZoom(widget, zoom_scrolled_window,
call_data, 2.5, 2.5);
/* connect picking record to zoom_segy_widget */
XintPickingRecordConnectWidget(picking_record, zoom_segy_widget);
/* create controls box */
n = 0;
XtSetArg(arg[n], XmNspacing, 15); n++;
XtSetArg(arg[n], XmNorientation, XmHORIZONTAL); n++;
XtSetArg(arg[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNrightOffset, 20); n++;
XtSetArg(arg[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNleftOffset, 20); n++;
XtSetArg(arg[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
XtSetArg(arg[n], XmNtopWidget, zoom_sep); n++;
XtSetArg(arg[n], XmNtopOffset, 10); n++;
XtSetArg(arg[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg(arg[n], XmNbottomOffset, 10); n++;
zoom_controls_box = XtCreateManagedWidget("zoom_controls_box",
xmRowColumnWidgetClass,
zoom_dialog, arg, n);
/* create zoom control pushbuttons */
n = 0;
XtSetArg(arg[n], XmNpushButtonEnabled, True); n++;
XtSetArg(arg[n], XmNmarginWidth, 4); n++;
XtSetArg(arg[n], XmNmarginHeight, 4); n++;
for (i=0; i < k_num_zoom_controls; i++) {
j = n;
XtSetArg(arg[j], XmNlabelString,
XmStringCreateLtoR(zoom_pb_names[i],
XmSTRING_DEFAULT_CHARSET)); j++;
zoom_controls_pb[i] = XtCreateManagedWidget("zoom_control_buttons",
xmPushButtonGadgetClass,
zoom_controls_box,
arg, j);
XtAddCallback(zoom_controls_pb[i], XmNactivateCallback,
ZoomControlsProc, (XtPointer)i);
}
/* Manage the zoom_dialog */
XtManageChild(zoom_dialog);
}
/***
*** ZoomControlsProc
***/
static void ZoomControlsProc(Widget widget, int client_data,
XtPointer call_data)
{
if (client_data == k_zoom_OK) XtDestroyWidget(IntGetShell(widget));
}
/***
*** ControlsProc
***/
static void ControlsProc(Widget widget, int client_data,
XtPointer call_data)
{
if (client_data == k_exit) exit (0);
}
The output produced by example pickinglib_1.c is shown below:

Figure 18: Output Produced by Example pickinglib_1.c.
You should use actions and Picking Library functions to create, manipulate and get information about these data structures. The Picking Library function, XintPickingRecordCreate is used to create an instance of the XintPickingRecord structure. A Picking Record can be associated with more than one Seismic widget. This can be done at Picking Record creation time by specifying the widget ID in the argument list of the function XintPickingRecordCreate. After widget creation time a Picking Record can be associated with a Seismic widget using the function XintPickingRecordConnectWidget. When the end-user or application adds a new horizon or a new point, the Picking Library creates the necessary supporting data structures and manages those appropriately. You use Picking Library functions to modify the contents of the data structures or to get information about their contents. Most of the callbacks associated with a Picking Record return a pointer to a horizon or point structure. That pointer can be used with Picking Library functions to obtain further information about the horizon or point of interest.