import streamlit as st import travelling_salesman import geocoder import pandas as pd from st_aggrid import AgGrid, GridOptionsBuilder import pandas as pd from enum import Enum class Language(Enum): English = 1 Japanese = 2 if 'language' not in st.session_state: st.session_state['language'] = Language.English _, col2 = st.columns([5,1]) with col2: print(st.session_state['language']) language = st.selectbox("Language" if st.session_state['language'] == Language.English else "言語", ("English", "日本語")) st.session_state['language'] = Language.English if language == "English" else Language.Japanese if 'count' not in st.session_state: st.session_state.count = 2 def increment_counter(): st.session_state.count += 1 def decrement_counter(): st.session_state.count -= 1 source = ["鶴舞公園", "中村公園", "荒子川公園", "久屋大通公園", "愛知公園", "大高緑地", "天白公園", "荒越公園", "池田公園" , "大須公園"] st.title("Path planning" if st.session_state['language'] == Language.English else "経路検索") st.write(""" Given target location(s) and vehicle(s), calculates optimum path from depot using OR-tools """ if st.session_state['language'] == Language.English else """ ターゲットの場所と車両を指定して、OR ツールを使用してデポからの最適なパスを計算 """) col1, col2, col3 = st.columns([1,1,1]) with col1: arrival = st.text_input("Depot" if st.session_state['language'] == Language.English else "デポ", value="大須観音駅") with col2: numberOfCars = st.number_input("Vehicle(s)" if st.session_state['language'] == Language.English else "台車数", value=1, min_value=1, max_value=5) with col3: timeLimit = st.number_input("Calculation Time Limit" if st.session_state['language'] == Language.English else "計算時間", min_value=1, max_value=1000, value=5, step=1) col3, col4, _ = st.columns([1,1,4]) with col3: st.button("Decrement" if st.session_state['language'] == Language.English else "加", on_click=decrement_counter) with col4: st.button("Increment" if st.session_state['language'] == Language.English else "減", on_click=increment_counter) col1, col2 = st.columns([1,2]) with col1: destinations = source[:st.session_state.count] df = pd.DataFrame( { "Target": destinations, } ) gb = GridOptionsBuilder.from_dataframe(df) gb.configure_default_column(editable=True) aggrid = AgGrid(df, # height=400, gridOptions=gb.build(), fit_columns_on_grid_load=True, allow_unsafe_jscode=True, ) with col2: with st.spinner(text="Generating map..." if st.session_state['language'] == Language.English else "マップ作成中"): fig = travelling_salesman.visualize_point(tuple(aggrid.data["Target"].to_list())) if fig is not None: st.plotly_chart(fig, use_container_width=True) else: st.write("No figure" if st.session_state['language'] == Language.English else "無") search = st.button('Search Route' if st.session_state['language'] == Language.English else "経路検索") if search: if geocoder.osm(arrival, timeout=5.0).latlng is None: st.warning("Depot invalid" if st.session_state['language'] == Language.English else "デポ不明") elif any( [ geocoder.osm(arr, timeout=5.0).latlng is None for arr in df["Target"] ] ): st.warning("Destination(s) invalid" if st.session_state['language'] == Language.English else "目的地不明") elif numberOfCars > len( df["Target"]): st.warning("Vehicle is less than destination!" if st.session_state['language'] == Language.English else "車台数が目的地より多い!") else: with st.spinner('Calculating'): fig = travelling_salesman.create_route( arrival, df["Target"], numberOfCars, timeLimit=timeLimit ) if fig is not None: st.plotly_chart(fig, use_container_width=True) else: st.write("No figure" if st.session_state['language'] == Language.English else "無")