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

📄 encbrowser.cpp

📁 开源的电子海图程序
💻 CPP
字号:
/* GHelm - Nautical Navigation Software * Copyright (C) 2004 Jon Michaelchuck * * This application is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. * * This software 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 details. * * You should have received a copy of the GNU General Public * License along with this software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA. */#include "iso8211lib/iso8211.h"#include "encbrowser.h"#include "util.h"/** * Constructor */ENCBrowser::ENCBrowser(){}/** * Destructor */ENCBrowser::~ENCBrowser(){}/** * Initialize browser. * @param configuration Configuration to use * @return -1 on failure, 0 on success. */int ENCBrowser::Init(Configuration &configuration){    set_default_size(700, 400);    catalog_path = configuration.catalog;    DDFModule ddf;  // ddf returns 0 on fail    if (ddf.Open(catalog_path.string().c_str()) == 0) {        std::cerr << "(): Failed loading catalog file "                  << catalog_path.string() << std::endl;        ddf.Close();        return -1;    }    list_store = Gtk::ListStore::create(model_columns);    tree_view.set_model(list_store);    tree_view.append_column("Description", model_columns.description);    tree_view.append_column("Filename", model_columns.filename);    DDFRecord *record;    while ((record = ddf.ReadRecord()) != NULL) {        signal_progress.emit();        int field_count = record->GetFieldCount();        if (field_count != 2) {            std::cerr << "ENCBrowser::Run(): Bad field count" << std::endl;            ddf.Close();            return -1;        }        DDFField *field = record->GetField(1);        if (!field) {            std::cerr << "ENCBrowser::Run(): Error getting field" << std::endl;            ddf.Close();            return -1;        }        int bytes_remaining;        int bytes_consumed;        const char *field_data;        const char *field_name;        DDFFieldDefn *field_defn;        DDFSubfieldDefn *subfield_defn;        field_defn = field->GetFieldDefn();        field_name = field_defn->GetName();        field_data = field->GetData();        bytes_remaining = field->GetDataSize();        if (strncmp(field_name, "CATD", 4) != 0) {            std::cerr << "ENCBrowser::Run(): Bad field name" << std::endl;            ddf.Close();            return -1;        }        if (field_defn->GetSubfieldCount() != 12) {            std::cerr << "ENCBrowser::Run(): Bad subfield count" << std::endl;            ddf.Close();            return -1;        }        // skip rcnm        subfield_defn = field_defn->GetSubfield(0);        subfield_defn->ExtractStringData(field_data, bytes_remaining,                                            &bytes_consumed);        bytes_remaining -= bytes_consumed;        field_data += bytes_consumed;        // skip rcid        subfield_defn = field_defn->GetSubfield(1);        subfield_defn->ExtractIntData(field_data, bytes_remaining,                                            &bytes_consumed);        bytes_remaining -= bytes_consumed;        field_data += bytes_consumed;        // filename        std::string filename;         subfield_defn = field_defn->GetSubfield(2);        filename = subfield_defn->ExtractStringData(field_data, bytes_remaining,                                            &bytes_consumed);        bytes_remaining -= bytes_consumed;        field_data += bytes_consumed;        boost::filesystem::path filepath = decompose_win32_path(filename);        std::string extension = boost::filesystem::extension(filepath);        if ((extension !=  ".TXT") && (filepath.string().size() > 0)) {            boost::filesystem::path fullpath =                                catalog_path.branch_path() / filepath;            if (is_chart(fullpath.string().c_str())) {                // description                std::string description;                subfield_defn = field_defn->GetSubfield(3);                description = subfield_defn->ExtractStringData(field_data,                        bytes_remaining, &bytes_consumed);                bytes_remaining -= bytes_consumed;                field_data += bytes_consumed;                // skip stuff to get to long/lat range                for (int i = 4; i < 6; i++) {                    subfield_defn = field_defn->GetSubfield(i);                    subfield_defn->ExtractStringData(field_data,                            bytes_remaining, &bytes_consumed);                    bytes_remaining -= bytes_consumed;                    field_data += bytes_consumed;                }                float slat, wlon, nlat, elon;                subfield_defn = field_defn->GetSubfield(6);                slat = subfield_defn->ExtractFloatData(field_data,                        bytes_remaining, &bytes_consumed);                bytes_remaining -= bytes_consumed;                field_data += bytes_consumed;                subfield_defn = field_defn->GetSubfield(7);                wlon = subfield_defn->ExtractFloatData(field_data,                        bytes_remaining, &bytes_consumed);                bytes_remaining -= bytes_consumed;                field_data += bytes_consumed;                subfield_defn = field_defn->GetSubfield(8);                nlat = subfield_defn->ExtractFloatData(field_data,                        bytes_remaining, &bytes_consumed);                bytes_remaining -= bytes_consumed;                field_data += bytes_consumed;                subfield_defn = field_defn->GetSubfield(9);                elon = subfield_defn->ExtractFloatData(field_data,                        bytes_remaining, &bytes_consumed);                bytes_remaining -= bytes_consumed;                Gtk::TreeModel::Row row = *(list_store->append());                filename = filepath.string();                        row[model_columns.filename] = filename;                row[model_columns.description] = description;                row[model_columns.slat] = slat * 60;                row[model_columns.wlon] = wlon * 60;                row[model_columns.nlat] = nlat * 60;                row[model_columns.elon] = elon * 60;            }        }    }    ddf.Close();        Gtk::ScrolledWindow *scrolled_window = manage(new Gtk::ScrolledWindow());    scrolled_window->add(tree_view);    scrolled_window->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);    get_vbox()->add(*scrolled_window);    add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);    add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK);    set_title("Please choose a chart");    return 0;}/** * Get the filename of the selected row * @return filename */boost::filesystem::path ENCBrowser::GetSelectedFilepath(){    Glib::RefPtr<Gtk::TreeView::Selection> selection =                                            tree_view.get_selection();    Gtk::TreeModel::const_iterator it = selection->get_selected();    if (it) {        Gtk::TreeModel::Row row = *it;        Glib::ustring filename = row[model_columns.filename];        boost::filesystem::path filepath = catalog_path.branch_path();        filepath = filepath / filename.c_str();        return filepath;    } else {        std::cerr << "ENCBrowser::GetSelectedFilepath(): Nothing selected"                  << std::endl;        return boost::filesystem::path("");    }}/** * Get description of the selected row * @return description string */Glib::ustring ENCBrowser::GetSelectedDescription(){    Glib::RefPtr<Gtk::TreeView::Selection> selection =                                            tree_view.get_selection();    Gtk::TreeModel::iterator it = selection->get_selected();    if (it) {        Gtk::TreeModel::Row row = *it;        return row[model_columns.description];    } else {        std::cerr << "ENCBrowser::GetSelectedDescription(): Nothing selected"                  << std::endl;        return "";    }}/** * Get dimension of selected row * @param which which dimension to get (SLAT, WLON, NLAT or ELON) * @return dimension */float ENCBrowser::GetSelectedDimension(int which){    Glib::RefPtr<Gtk::TreeView::Selection> selection =                                            tree_view.get_selection();    Gtk::TreeModel::iterator it = selection->get_selected();    if (it) {        Gtk::TreeModel::Row row = *it;        switch (which)        {            case SLAT:                return row[model_columns.slat];                break;            case WLON:                return row[model_columns.wlon];                break;            case NLAT:                return row[model_columns.nlat];                break;            case ELON:                return row[model_columns.elon];                break;            default:                break;        }    } else {        std::cerr << "ENCBrowser::GetSelectedDimensions(): Nothing selected"                  << std::endl;    }    return 0;}

⌨️ 快捷键说明

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