File size: 7,157 Bytes
bac55b4
6810bed
bac55b4
 
 
 
 
 
 
 
 
 
 
5d3564f
bac55b4
 
 
 
 
 
 
 
 
 
 
 
 
6810bed
bac55b4
 
 
 
 
 
 
 
 
0ab59c6
bac55b4
 
6810bed
bac55b4
6810bed
bac55b4
 
 
 
 
6810bed
bac55b4
 
 
 
6810bed
bac55b4
6810bed
bac55b4
 
 
6810bed
bac55b4
 
 
 
 
 
 
5d3564f
 
 
 
 
 
 
 
 
bac55b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b8a5709
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5d3564f
 
 
 
 
 
 
 
 
bac55b4
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import gradio as gr
from PIL import Image as PIL_Image # Renaming to avoid conflict with Image from gltflib
from io import BytesIO
import json
import os

import src.constants as constants

from src.front_card_image import create_card_image
from src.front_card_image_historic_site import create_historic_site_card_image
from src.picture_box_model import create_picture_box_model
from src.extracted_objects_model import create_extracted_objects_model
from src.card_model import create_card_model
from src.manhole_model import create_manhole_model

language = os.environ.get('LANGUAGE', 'en')
print(f'LANGUAGE: {language}')

with open(f'src/display_message_{language}.json', 'r', encoding='utf-8') as f:
    display_message_dict = json.load(f)
    model_type_dict = display_message_dict['model_type_dict']
    color_dict = display_message_dict['color_dict']

def create_3dmodel(model_no, title, color, mark, historic_site_type, difficulty, description, is_thick, image):

    img_bytearray = BytesIO()
    image['background'].save(img_bytearray, "JPEG", quality=95)
    img_bytearray.seek(0) # Seek to the beginning of the image, otherwise it results in empty data.

    option_dict = {
        'タイトル': title,
        '色': color,
        'マーク': mark,
        '史跡種類': historic_site_type,
        '訪問難度': difficulty,
        '説明文': description,
        '厚み': '有' if is_thick else '無',
        'language': language
    }

    # Consider implementing model_no categorization rules or creating a factory class
    if model_no not in ['A', 'B']:
        # Create the card image (front side)
        if model_no == '1':
            front_img_bytearray = create_historic_site_card_image(img_bytearray, option_dict)
        else:
            front_img_bytearray = create_card_image(model_no, img_bytearray, option_dict)

        # Retrieve the card image (back side)
        back_path = constants.back_card_img_dict[model_no]
        back_img = PIL_Image.open(back_path)
        back_img_bytearray = BytesIO()
        back_img.convert('RGB').save(back_img_bytearray, "JPEG", quality=95)
        back_img_bytearray.seek(0) # Seek to the beginning of the image, otherwise it results in empty data

        # Create a 3D model of the card (return value is the path of the created model)
        model_path = create_card_model(front_img_bytearray, back_img_bytearray, option_dict)
        
    else:
        # Create a 3D model of the card (return value is the path of the created model)
        if model_no == 'A':
            model_path = create_picture_box_model(img_bytearray)
        if model_no == 'B':
            model_path = create_extracted_objects_model(img_bytearray)
    
    return model_path

def create_manhole(image):
    img_bytearray = BytesIO()
    image['background'].save(img_bytearray, "JPEG", quality=95)
    img_bytearray.seek(0) # Seek to the beginning of the image, otherwise it results in empty data.
    
    model_path = create_manhole_model(img_bytearray)
    
    return model_path

with gr.Blocks() as demo:

    gr.Markdown(display_message_dict['header'])
    
    with gr.Tab(display_message_dict['tab_label_card_general']):
        with gr.Row():
            with gr.Column():
                title = gr.Textbox(label=display_message_dict['label_title'], placeholder=display_message_dict['placeholder_title'])
                model_type = gr.Radio([(model_type_dict[key], key) for key in model_type_dict], value='2', label=display_message_dict['label_card_type'])
            with gr.Column():
                description = gr.Textbox(lines=2, label=display_message_dict['label_description'], placeholder=display_message_dict['placeholder_description'])
                is_thick = gr.Checkbox(label=display_message_dict['label_is_thick'], value=False, info=display_message_dict['info_is_thick'])
                image = gr.ImageEditor(image_mode='RGB', sources="upload", type="pil", crop_size="1:1", label=display_message_dict['label_image'])

        button = gr.Button(display_message_dict['label_button'])
        button.click(
                fn=lambda model_type, title, description, is_thick, image:
                    create_3dmodel(model_type, title, None, None, None, None, description, is_thick, image),
            inputs=[model_type, title, description, is_thick, image],
            outputs=[gr.Model3D(camera_position=(90, 90, 5))]
        )
    
    with gr.Tab(display_message_dict['tab_label_historic_site_card']):
        with gr.Row():
            with gr.Column():
                title = gr.Textbox(label=display_message_dict['label_title'], placeholder=display_message_dict['placeholder_title'])
                color = gr.Radio([(color_dict[key], key) for key in color_dict], value=list(color_dict)[0], label=display_message_dict['label_color'])
                
                # Mark(Designation Type) is only visible for Japanese(Because there are no Designation Type Images for other languages).
                # In other languages, mark is only 'No Designation'(No Designation Type Image).
                is_mark_visible = True if language == 'ja' else False
                mark = gr.Radio(display_message_dict['mark_list'], visible=is_mark_visible,
                    value=list(display_message_dict['mark_list'])[len(display_message_dict['mark_list'])-1], label=display_message_dict['label_mark'])
                
                historic_site_type = gr.Textbox(label=display_message_dict["label_historic_site_type"], placeholder=display_message_dict["placeholder_historic_site_type"])
            with gr.Column():
                difficulty = gr.Slider(1, 5, 3, step=1, label=display_message_dict['label_difficulty'])
                description = gr.Textbox(lines=2, label=display_message_dict['label_description'], placeholder=display_message_dict['placeholder_description'])
                is_thick = gr.Checkbox(label=display_message_dict['label_is_thick'], value=False, info=display_message_dict['info_is_thick'])
                image = gr.ImageEditor(image_mode='RGB', sources="upload", type="pil", crop_size="1:1", label=display_message_dict['label_image'])

        button = gr.Button(display_message_dict['label_button'])
        button.click(
                fn=lambda title, color, mark, historic_site_type, difficulty, description, is_thick, image:
                    create_3dmodel('1', title, color, mark, historic_site_type, difficulty, description, is_thick, image),
            inputs=[title, color, mark, historic_site_type, difficulty, description, is_thick, image],
            outputs=[gr.Model3D(camera_position=(90, 90, 5))]
        )

        gr.Markdown(display_message_dict['footer_historic_site_card'])
        
    with gr.Tab(display_message_dict["tab_label_manhole"]):
        image = gr.ImageEditor(image_mode='RGB', sources="upload", type="pil", label=display_message_dict['label_image'])
        button = gr.Button(display_message_dict['label_button'])
        button.click(
            create_manhole,
            inputs=[image],
            outputs=[gr.Model3D(camera_position=(90, 90, 5))]
        )

demo.launch()