⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsegyformatwizard.c

📁 segy 显示程序!希望能给正在做这部分朋友提供一部分资料
💻 C
📖 第 1 页 / 共 4 页
字号:
/*  * GSEGYLIB - Library for accessing files in SEG-Y format * * Copyright (C) 2005-2006 Vladimir Bashkardin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * General Public License for more av. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author:  Vladimir Bashkardin  <vovizmus@users.sourceforge.net> */#include "gsegyformatwizard.h"G_DEFINE_TYPE (GSEGYFormatWizard, g_segy_format_wizard, G_TYPE_OBJECT)#define G_SEGY_FORMAT_WIZARD_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), G_SEGY_TYPE_FORMAT_WIZARD, GSEGYFormatWizardPrivate))typedef enum {    G_SEGY_HEADER_FIELD_UINT8               =  0,    G_SEGY_HEADER_FIELD_INT8                =  1,    G_SEGY_HEADER_FIELD_UINT16              =  2,    G_SEGY_HEADER_FIELD_INT16               =  3,    G_SEGY_HEADER_FIELD_UINT32              =  4,    G_SEGY_HEADER_FIELD_INT32               =  5,    G_SEGY_HEADER_FIELD_IEEE_FLOAT          =  6,    G_SEGY_HEADER_FIELD_IBM_FLOAT           =  7,    G_SEGY_HEADER_FIELD_GAIN_CODE           =  8,    G_SEGY_HEADER_FIELD_ARRAY_OF_UINT8      =  9,    G_SEGY_HEADER_FIELD_ARRAY_OF_INT8       = 10,    G_SEGY_HEADER_FIELD_ARRAY_OF_UINT16     = 11,    G_SEGY_HEADER_FIELD_ARRAY_OF_INT16      = 12,    G_SEGY_HEADER_FIELD_ARRAY_OF_UINT32     = 13,    G_SEGY_HEADER_FIELD_ARRAY_OF_INT32      = 14,    G_SEGY_HEADER_FIELD_ARRAY_OF_IEEE_FLOAT = 15,    G_SEGY_HEADER_FIELD_ARRAY_OF_IBM_FLOAT  = 16,    G_SEGY_HEADER_FIELD_ARRAY_OF_GAIN_CODE  = 17,    G_SEGY_HEADER_FIELD_ARRAY_OF_CHAR       = 18,    G_SEGY_HEADER_FIELD_UNASSIGNED          = 19,} GSEGYHeaderFieldType;typedef struct _GSEGYBinaryHeaderField GSEGYBinaryHeaderField;struct _GSEGYBinaryHeaderField {    const gchar         *title;    guint16              size;    guint16              offset;    GSEGYHeaderFieldType type;};typedef struct _GSEGYTraceHeaderField GSEGYTraceHeaderField;struct _GSEGYTraceHeaderField {    const gchar         *title;    const gchar         *short_title;    gboolean             useable_for_sorting;    guint16              size;    guint16              offset;    GSEGYHeaderFieldType type;};typedef struct _GSEGYSortingField GSEGYSortingField;struct _GSEGYSortingField {    GSEGYTraceHeaderField *field_desc;    guint16                offset;};typedef struct _GSEGYFormatWizardPrivate GSEGYFormatWizardPrivate;struct _GSEGYFormatWizardPrivate {    GSEGYEndianess *endianess;    const gchar    *format_name;    const gchar    *short_format_name;    const gchar    *files_name;    GPtrArray      *files_extensions;    guint16         ebcdic_header_size;    guint16         binary_header_size;    guint16         trace_header_size;    guint16         bin_sample_interval;    guint16         bin_number_of_samples;    guint16         bin_sample_format;    guint8          default_sample_id;    guint8          default_sample_size;    guint16         trc_sample_interval;    guint16         trc_number_of_samples;    guint16         trc_first_sample_value;    GPtrArray      *binary_header_desc;    GPtrArray      *trace_header_desc;    GPtrArray      *sorting_fields_names;    GPtrArray      *bin_fields_desc;    GPtrArray      *fields_names;    GPtrArray      *fields_desc;    GPtrArray      *sorting_fields_desc;    guint16         sorting_desc_size;    gboolean        free_ptr_arrays;};static GSEGYBinaryHeaderField segy_rev1_binary_header[29] = {    { "Job identification number", 4, 0, G_SEGY_HEADER_FIELD_UINT32 },    { "Line number", 4, 0, G_SEGY_HEADER_FIELD_UINT32 },    { "Reel number", 4, 0, G_SEGY_HEADER_FIELD_UINT32 },    { "Number of data traces per record", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Number of auxillary traces per record", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sample interval of this reel's data in microseconds", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sample interval of original field recording in microseconds", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Number of samples per trace for this reel's data", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Number of samples per trace in original field recording", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Data sample format code", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "CDP fold", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Trace sorting code (1 - as recorded, 2 - CDP, 3 - fold profile, 4 - hor. stacked)", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Vertical sum code", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sweep frequency at start", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sweep frequency at end", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sweep length in ms", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sweep type code (1 - linear, 2 - parabolic, 3 - exponential, 4 - other)", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Trace number of sweep channel", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sweep trace taper length at start in ms", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sweep trace taper length at end in ms", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Taper type (1 - linear, 2 - cosine squared, 3 - other)", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Corellated data traces (1 - no, 2 - yes)", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Binary gain recovered (1 - yes, 2 - no)", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Amplitude recovery method (1 - one, 2 - sph. diverg., 3 - AGC, 4 - other)", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Measurement system (1 - meters, 2 - feet)", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Impulse signal polarity", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Vibratory polarity code", 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Unassigned", 340, 0, G_SEGY_HEADER_FIELD_UNASSIGNED },    { NULL, 0, 0, G_SEGY_HEADER_FIELD_UNASSIGNED }};static GSEGYTraceHeaderField segy_rev1_trace_header[75] = {    { "Trace sequence number withing line", "TraceSeqLine", TRUE, 4, 0, G_SEGY_HEADER_FIELD_UINT32 },    { "Trace sequence number withing reel", "TraceSeqReel", TRUE, 4, 0, G_SEGY_HEADER_FIELD_UINT32 },    { "Original field record number", "FFID", TRUE, 4, 0, G_SEGY_HEADER_FIELD_UINT32 },    { "Trace sequence number withing field record", "TraceSeqFFID", TRUE, 4, 0, G_SEGY_HEADER_FIELD_UINT32 },    { "Energy source point number", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_UINT32 },    { "CDP ensemble number", "CDP", TRUE, 4, 0, G_SEGY_HEADER_FIELD_UINT32 },    { "Trace sequence number within CDP ensemble", "TraceSeqCDP", TRUE, 4, 0, G_SEGY_HEADER_FIELD_UINT32 },    { "Trace identification code", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Number of vertically summed traces", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Number of horizontally stacked traces", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Data use (1 - production, 2 - test)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Distance from source point to receiver group", "Offset", TRUE, 4, 0, G_SEGY_HEADER_FIELD_INT32 },    { "Receiver group elevation", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_INT32 },    { "Surface elevation at source", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_INT32 },    { "Surface depth below source", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_INT32 },    { "Datum elevation at reciever group", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_INT32 },    { "Datum elevation at source", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_INT32 },    { "Water depth at source", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_INT32 },    { "Water depth at reciever group", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_INT32 },    { "Scalar to for elevations and depths", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 },    { "Scalar to for coordinates", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 },    { "X source coordinate", "SourceX", TRUE, 4, 0, G_SEGY_HEADER_FIELD_INT32 },    { "Y source coordinate", "SourceY", TRUE, 4, 0, G_SEGY_HEADER_FIELD_INT32 },    { "X reciever group coordinate", "RecieverX", TRUE, 4, 0, G_SEGY_HEADER_FIELD_INT32 },    { "Y reciever group coordinate", "RecieverY", TRUE, 4, 0, G_SEGY_HEADER_FIELD_INT32 },    { "Coordinate units (1 - meters or feet 2 - arc seconds)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Weathering velocity", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Subweathering velocity", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Uphole time at source", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Uphole time at reciever group", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Source static correction", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 },    { "Reciever group static correction", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 },    { "Total static applied", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 },    { "Lag time between end of header and time break in ms", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 },    { "Lag time between time break and shot in ms", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 },    { "Lag time between shot and recording start in ms", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 },    { "Start of mute time", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "End of mute time", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Number of samples in this trace", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sample interval of this trace in microseconds", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Field instrument gain type code", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 },    { "Insrument gain constant", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 },    { "Insrument gain early gain in dB", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 },    { "Corellated (1 - no / 2 - yes)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sweep frequency at start", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sweep frequency at end", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sweep length in ms", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sweep type code (1 - linear, 2 - parabolic, 2 - exponential, 4 - ohter)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sweep trace taper length at start in ms", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Sweep trace taper length at end in ms", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Taper type code (1 - linear, 2 - cosine squared, 3 - other)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Alias filter frequency", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Alias filter slope", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Notch filter frequency", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Notch filter slope", "", FALSE, 2, G_SEGY_HEADER_FIELD_UINT16 },    { "Low cut frequency", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "High cut frequency", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Low cut slope", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "High cut slope", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Year data recorded", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Day of year", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Hour of day", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Minute of hour", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Second of minute", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Time basis code (1 - local, 2 - GMT, 3 - other)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Trace weighting factor for fixed-point format data", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 },    { "Geophone group number of roll switch position one", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Geophone group number of first trace of original field record", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Geophone group number of last trace of original field record", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Gap size (total number of groups dropped)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Overtravel associated with taper (1 - down/behind, 2 - up/ahead)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 },    { "Inline number (only for 3D data)", "Inline", TRUE, 4, 0, G_SEGY_HEADER_FIELD_INT32 },    { "Xline number (only for 3D data)", "Xline", TRUE, 4, 0, G_SEGY_HEADER_FIELD_INT32 },    { "Unassigned", "", FALSE, 52, 0, G_SEGY_HEADER_FIELD_UNASSIGNED },    { NULL, 0, 0, G_SEGY_HEADER_FIELD_UNASSIGNED }};static void g_segy_format_wizard_setup (GSEGYFormatWizard* self) {    GSEGYFormatWizardPrivate *private = G_SEGY_FORMAT_WIZARD_GET_PRIVATE (self);    GSEGYSortingField *sort_field;    guint16 i = 0;    guint16 offset = 0;    private->format_name = g_strdup ("Standard SEG-Y Revision 1 draft 6");    private->short_format_name = g_strdup ("SEG-Y rev1");    private->files_name = g_strdup ("SEG-Y files");    g_ptr_array_add (private->files_extensions, (gpointer)g_strdup ("*.sgy"));    g_ptr_array_add (private->files_extensions, (gpointer)g_strdup ("*.segy"));    g_ptr_array_add (private->files_extensions, (gpointer)g_strdup ("*.SGY"));    g_ptr_array_add (private->files_extensions, (gpointer)g_strdup ("*.SEGY"));    private->ebcdic_header_size = 3200;    private->binary_header_size = 0;    private->trace_header_size = 0;    while (segy_rev1_binary_header[i].title) {        segy_rev1_binary_header[i].offset = offset;        g_ptr_array_add (private->binary_header_desc, (gpointer)&segy_rev1_binary_header[i]);        private->binary_header_size += segy_rev1_binary_header[i].size;        offset += segy_rev1_binary_header[i].size;        if (segy_rev1_binary_header[i].type < G_SEGY_HEADER_FIELD_ARRAY_OF_UINT8)            g_ptr_array_add (private->bin_fields_desc, (gpointer)segy_rev1_binary_header[i].title);        i++;    }    g_ptr_array_add (private->bin_fields_desc, NULL);    private->bin_sample_interval = 5;    private->bin_number_of_samples = 7;    private->bin_sample_format = 9;    private->default_sample_id = G_SEGY_HEADER_FIELD_IEEE_FLOAT;    private->default_sample_size = 4;    private->sorting_desc_size = 0;    i = 0;    offset = 0;    while (segy_rev1_trace_header[i].title) {        segy_rev1_trace_header[i].offset = offset;        g_ptr_array_add (private->trace_header_desc, (gpointer)&segy_rev1_trace_header[i]);        private->trace_header_size += segy_rev1_trace_header[i].size;        offset += segy_rev1_trace_header[i].size;        if (segy_rev1_trace_header[i].useable_for_sorting) {            g_ptr_array_add (private->sorting_fields_names, (gpointer)segy_rev1_trace_header[i].short_title);            sort_field = (GSEGYSortingField*)g_malloc (sizeof (GSEGYSortingField));            sort_field->field_desc = &segy_rev1_trace_header[i];            sort_field->offset = private->sorting_desc_size;            private->sorting_desc_size += segy_rev1_trace_header[i].size;            g_ptr_array_add (private->sorting_fields_desc, (gpointer)sort_field);        }        if (segy_rev1_trace_header[i].type < G_SEGY_HEADER_FIELD_ARRAY_OF_UINT8) {            g_ptr_array_add (private->fields_desc, (gpointer)segy_rev1_trace_header[i].title);            g_ptr_array_add (private->fields_names, (gpointer)segy_rev1_trace_header[i].short_title);        }        i++;    }    g_ptr_array_add (private->fields_names, NULL);    g_ptr_array_add (private->fields_desc, NULL);    g_ptr_array_add (private->sorting_fields_names, NULL);    g_ptr_array_add (private->sorting_fields_desc, NULL);    private->trc_first_sample_value = 35;    private->trc_number_of_samples = 38;    private->trc_sample_interval = 39;    private->free_ptr_arrays = FALSE;#ifdef DEBUG    g_print ("Format wizard initialized for %s:\n", private->format_name);    g_print ("EBCDIC header size: %d\n", private->ebcdic_header_size);    g_print ("Binary header size: %d\n", private->binary_header_size);    g_print ("Trace header size: %d\n", private->trace_header_size);#endif}GSEGYFormatWizard* g_segy_format_wizard_new (GSEGYEndianess *endianess) {    return (g_object_new (G_SEGY_TYPE_FORMAT_WIZARD, "endianess", endianess, NULL));}const gchar* g_segy_format_wizard_get_name (GSEGYFormatWizard *self) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -