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

📄 gsegyseismicaccessor.c

📁 segy 显示程序!希望能给正在做这部分朋友提供一部分资料
💻 C
📖 第 1 页 / 共 2 页
字号:
    GArray *traces_indices = g_array_sized_new (FALSE, FALSE, sizeof (guint32), number_of_traces);

    for (i = second_level_start; i < second_level_end; i++)
        g_array_append_val (traces_indices, g_array_index (private->second_sort_level, guint32, i));

    g_segy_format_wizard_get_labels_for_sorting_field (g_segy_file_accessor_get_format_wizard (private->file_accessor),
                                                       second_level_id, traces_indices,
                                                       g_segy_file_accessor_get_sorting_contents (private->file_accessor),
                                                       chunk, labels);
    g_array_free (traces_indices, TRUE);
}

void g_segy_seismic_accessor_get_labels_for_trace_header (GSEGYSeismicAccessor *self,
                                                          guint32 first_level_index, guint32 second_level_index,
                                                          GStringChunk **chunk, GPtrArray **labels) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (self);

    if (NULL == private->trace_header_buffer)
        private->trace_header_buffer = (guint8*)g_malloc (g_segy_format_wizard_get_trace_header_size (g_segy_file_accessor_get_format_wizard (private->file_accessor)));

    guint8* decoded_trace_header = g_segy_file_accessor_get_trace_header (private->file_accessor,
                                                                          g_array_index (private->second_sort_level, guint32,
                                                                                         g_array_index (private->first_sort_level, guint32, first_level_index) +
                                                                                         second_level_index),
                                                                          private->trace_header_buffer,
                                                                          g_segy_format_wizard_get_trace_header_size (g_segy_file_accessor_get_format_wizard (private->file_accessor)));

    if (NULL == decoded_trace_header)
        return;

    g_segy_format_wizard_get_labels_for_trace_header (g_segy_file_accessor_get_format_wizard (private->file_accessor),
                                                      decoded_trace_header, chunk, labels);
}

gfloat* g_segy_seismic_accessor_get_data (GSEGYSeismicAccessor *self, guint32 first_level_index,
                                          guint32 *slow_num, guint32 *fast_num, gboolean double_buffer,
                                          GSEGYFileError *file_error) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (self);

    if (slow_num)
        *slow_num = 0;
    if (fast_num)
        *fast_num = 0;

    if (first_level_index >= private->first_sort_level->len)
        return NULL;

    guint32 second_level_start = g_array_index (private->first_sort_level, guint32, first_level_index);
    guint32 second_level_end = first_level_index == (private->first_sort_level->len - 1)
                                     ? private->second_sort_level->len
                                     : g_array_index (private->first_sort_level, guint32, first_level_index + 1);

    return g_segy_file_accessor_get_data (private->file_accessor,
                                          &(g_array_index (private->second_sort_level, guint32, second_level_start)),
                                          second_level_end - second_level_start, slow_num, fast_num,
                                          double_buffer, file_error);
}

gint16 g_segy_seismic_accessor_get_first_level_sort_id (GSEGYSeismicAccessor *self) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (self);

    return private->first_sort_level_id;
}

gint16 g_segy_seismic_accessor_get_second_level_sort_id (GSEGYSeismicAccessor *self) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (self);

    return private->second_sort_level_id;
}

GPtrArray* g_segy_seismic_accessor_get_trace_header_fields_desc (GSEGYSeismicAccessor *self) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (self);

    return g_segy_format_wizard_get_trace_header_fields_desc (g_segy_file_accessor_get_format_wizard (private->file_accessor));
}

GPtrArray* g_segy_seismic_accessor_get_trace_header_fields_names (GSEGYSeismicAccessor *self) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (self);

    return g_segy_format_wizard_get_trace_header_fields_names (g_segy_file_accessor_get_format_wizard (private->file_accessor));
}

GPtrArray* g_segy_seismic_accessor_get_sorting_fields_names (GSEGYSeismicAccessor *self) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (self);

    return g_segy_format_wizard_get_sorting_fields_names (g_segy_file_accessor_get_format_wizard (private->file_accessor));
}

guint32 g_segy_seismic_accessor_get_number_of_traces_for_first_level (GSEGYSeismicAccessor *self) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (self);

    return g_segy_file_accessor_get_number_of_traces (private->file_accessor);
}

guint32 g_segy_seismic_accessor_get_number_of_traces_for_second_level (GSEGYSeismicAccessor *self,
                                                                       guint32 first_level_index) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (self);

    if (first_level_index >= private->first_sort_level->len)
        return 0;

    guint32 second_level_start = g_array_index (private->first_sort_level, guint32, first_level_index);
    guint32 second_level_end = first_level_index == (private->first_sort_level->len - 1)
                                     ? private->second_sort_level->len
                                     : g_array_index (private->first_sort_level, guint32, first_level_index + 1);
    return (second_level_end - second_level_start);
}

guint16 g_segy_seismic_accessor_get_sample_interval (GSEGYSeismicAccessor *self) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (self);

    return g_segy_file_accessor_get_sample_interval (private->file_accessor);
}

guint16 g_segy_seismic_accessor_get_number_of_samples (GSEGYSeismicAccessor *self) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (self);

    return g_segy_file_accessor_get_number_of_samples (private->file_accessor);
}

static void g_segy_seismic_accessor_init (GSEGYSeismicAccessor *self) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (self);

    private->first_sort_level_id = 0;
    private->second_sort_level_id = 0;

    private->first_sort_level = NULL;
    private->second_sort_level = NULL;
    private->first_level_ascending = TRUE;
    private->second_level_ascending = TRUE;

    private->trace_header_buffer = NULL;
    private->file_accessor = NULL;

#ifdef DEBUG
    g_print ("<GSEGYSeismicAccessor is inited>\n");
#endif
}

static void g_segy_seismic_accessor_finalize (GObject *object) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (G_SEGY_SEISMIC_ACCESSOR (object));

    if (private->first_sort_level)
        g_array_free (private->first_sort_level, TRUE);
    if (private->second_sort_level)
        g_array_free (private->second_sort_level, TRUE);

    if (private->trace_header_buffer)
        g_free (private->trace_header_buffer);

    if (private->file_accessor)
        g_object_unref (G_OBJECT (private->file_accessor));

#ifdef DEBUG
    g_print ("<GSEGYSeismicAccessor is finalized>\n");
#endif
    if (G_OBJECT_CLASS (g_segy_seismic_accessor_parent_class)->finalize)
        G_OBJECT_CLASS (g_segy_seismic_accessor_parent_class)->finalize (object);
}

enum {
    PROP_0,
    PROP_FILE_ACCESSOR
};

static void g_segy_seismic_accessor_set_property (GObject *object, guint prop_id,
                                                  const GValue *value, GParamSpec *pspec) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (G_SEGY_SEISMIC_ACCESSOR (object));

    switch (prop_id) {
        case PROP_FILE_ACCESSOR: {
            GSEGYFileAccessor *file_accessor = G_SEGY_FILE_ACCESSOR (g_value_get_object (value));
            private->file_accessor = file_accessor;
            g_object_ref (G_OBJECT (private->file_accessor));
            g_object_notify (object, "file_accessor");
            }
            break;
        default:
            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
            break;
    }
}

static void g_segy_seismic_accessor_get_property (GObject *object, guint prop_id,
                                                  GValue *value, GParamSpec *pspec) {
    GSEGYSeismicAccessorPrivate *private = G_SEGY_SEISMIC_ACCESSOR_GET_PRIVATE (G_SEGY_SEISMIC_ACCESSOR (object));

    switch (prop_id) {
        case PROP_FILE_ACCESSOR:
            g_value_set_object (value, private->file_accessor);
            break;
        default:
            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
            break;
    }
}

static void g_segy_seismic_accessor_class_init (GSEGYSeismicAccessorClass *klass) {
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);

    g_type_class_add_private (klass, sizeof (GSEGYSeismicAccessorPrivate));
    gobject_class->finalize = (GObjectFinalizeFunc) g_segy_seismic_accessor_finalize;
    gobject_class->set_property = g_segy_seismic_accessor_set_property;
    gobject_class->get_property = g_segy_seismic_accessor_get_property;

    g_object_class_install_property (gobject_class,
                                     PROP_FILE_ACCESSOR,
                                     g_param_spec_object ("file_accessor", "FileAccessor",
                                     "Object responsible for an opened seismic file access",
                                     G_SEGY_TYPE_FILE_ACCESSOR,
                                     G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));

#ifdef DEBUG
    g_print ("<GSEGYSeismicAccessor class is inited>\n");
#endif
}

⌨️ 快捷键说明

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