3dmodelmaker / app.py
2Nike2
add manhole model creation
5d3564f
raw
history blame
No virus
7.16 kB
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()