[C++] 99 FLTK : カラーコードからGUI内ボタン位置検索

[M1 Mac, Big Sur 11.6.7, clang 13.0.0, NO IDE]

カラーコードからGUI内ボタン位置を検索できるようにしました。カラー名からの検索は前回記事で書いたようにappファイルでひらがなの抽出ができずに難航しているため、一旦これで仮完成とします。

ひらがな抽出はPythonモジュールでもうまくいかないので、C++で再挑戦してみます。

// CEクラスとfindIndex関数は自製

void searchLocation(Fl_Widget*, void*){
    string name_alpha, name_hira;
    string location;
    int column,row;

    input_name = name_input->value();
    input_code = code_input->value();

	onoff_name = name_rbtn->value();
    onoff_code = code_rbtn->value();

    if (onoff_name == 1){
        cout << "Name検索" << endl;

        name_hira = CE.extract(input_name, HIRAGANA);
        name_alpha = CE.extract(input_name, ALPHABET);
        
        cout << "Alphabet " << name_alpha << endl;
        cout << "ひらがな " << name_hira << endl;

        if (name_alpha != ""){
            cout << "140色検索" << endl;

            auto index = findIndex(colorList_name, name_alpha);
            if (index != -1){
                column = index/28 + 1;
                row = index%28 + 1;
                
                location = "140色 " + to_string(column) + "列 " + to_string(row) + "行";
                roma_input->value("");
                code_input->value("");
                location_input->value("");
                location_input->insert(location.c_str());
            } else{
                location_input->value("");
                location_input->insert("該当なし");
            }
            
        } else if (name_hira !=""){
            cout << "和色検索" << endl;

            int process = 0; // 検索状態 0:検索中, 1:検索終了
            int tab_num = 1;
            for (vector<string> list:colorList2_name){
                auto index = findIndex(list, name_hira);
                if (index != -1){
                    column = index/30 + 1;
                    row = index%30 + 1;
                    
                    location = tab_names[tab_num] + " " + to_string(column) + "列 " + to_string(row) + "行";
                    roma_input->value("");
                    code_input->value("");
                    location_input->value("");
                    location_input->insert(location.c_str());
                    process = 1;
                    break;
                }
                tab_num += 1;
            }
            if (process==0){
                location_input->value("");
                location_input->insert("該当なし");
            }
            
        } else {
            cout << "検索文字列なし" << endl;
        }

    } else {
        cout << "Code検索" << endl;
        int process = 0;
        // input_codeを0xへ変換
        code_zero = ToZeroConvert2();

        cout << "code 140色検索" << endl;

        auto index = findIndex(colorList_code, code_zero);
        if (index != -1){
            column = index/28 + 1;
            row = index%28 + 1;
            
            string result_name = colorList_name[index];
            location = "140色 " + to_string(column) + "列 " + to_string(row) + "行 " + result_name;
            string name = colorList_name[index];
            name_input->value("");
            roma_input->value("");
            location_input->value("");
            location_input->insert(location.c_str());
            process = 1;
        }

        cout << "code 和色検索" << endl;

        if (process == 0){
            int tab_num = 1;
            for (vector<string> list:colorList2_code){
                auto index = findIndex(list, code_zero);
                if (index != -1){
                    column = index/30 + 1;
                    row = index%30 + 1;
                    
                    string result_name = colorList2_name[tab_num -1][index];
                    location = tab_names[tab_num] + " " + to_string(column) + "列 " + to_string(row) + "行 " + result_name;
                    name_input->value("");
                    roma_input->value("");
                    location_input->value("");
                    location_input->insert(location.c_str());
                    process = 1;
                    break;
                }
                tab_num += 1;
            }
            if (process==0){
                location_input->value("");
                location_input->insert("該当なし");
            }
        }
    }

[Python]337 文字列から各文字種を取り出すre.findall

[M1 Mac, Big Sur 11.6.7, Python 3.10.4]

[C++]98の記事で作成した関数がappファイルではうまく動いてくれないため、急遽Python版を作成しました。なおアプリの実行ファイルではC++版は正常に動作します。

C++版作成には結構苦労していて正直これ以上いじりたくないので、製作中のFLTKアプリにはこの20行のPython版をモジュール化して導入するつもりです。

C++で日本語を扱うのはなかなか難しいですから、いざとなればPythonの力を借りることにします。

import re
from enum import Enum

class CharType(Enum):
    NUMBER = 1
    ALPHABET = 2
    HIRAGANA = 3
    KATAKANA = 4
    KANJI = 5
 
def CharExtractPy(str, type):
    if type == CharType.NUMBER:
        ch = re.findall('[0-9]+', str)
    elif type == CharType.ALPHABET:
        ch = re.findall('[a-zA-Z]+', str)
    elif type == CharType.HIRAGANA:
        ch = re.findall('[ぁ-ゟ]+', str)
    elif type == CharType.KATAKANA:
        ch = re.findall('[\ァ-ヿ]+', str)
    elif type == CharType.KANJI:
        ch = re.findall('[\u2E80-\u2FDF\u3005-\u3007\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF\U00020000-\U0002EBEF]+', str)
    
    return ch
   
if __name__ == '__main__':
    
    str = "日本語ハローわぁるどHelloはろぅ[123]"
    
    # 数字
    ch1 = CharExtractPy(str,CharType.NUMBER)
    print("数字")
    print(ch1)
    
    # 英字
    ch2 = CharExtractPy(str,CharType.ALPHABET)
    print("英字")
    print(ch2)
    
    # ひらがな
    ch3 = CharExtractPy(str,CharType.HIRAGANA)
    print("ひらがな")
    print(ch3)
    
    # カタカナ
    ch4 = CharExtractPy(str,CharType.KATAKANA)
    print("カタカナ")
    print(ch4)
    
    # 漢字
    ch5 = CharExtractPy(str,CharType.KANJI)
    print("漢字")
    print(ch5)
--------------------------------------------------
出力
--------------------------------------------------
数字
['123']
英字
['Hello']
ひらがな
['わぁるど', 'はろぅ']
カタカナ
['ハロー']
漢字
['日本語']