Update app.py
Browse files
app.py
CHANGED
|
@@ -3,54 +3,57 @@ import pandas as pd
|
|
| 3 |
import matplotlib.pyplot as plt
|
| 4 |
from matplotlib.patches import Rectangle
|
| 5 |
|
| 6 |
-
# --- Çizim Fonksiyonu
|
| 7 |
def cizim_olustur(W, H, T, bolme_pozisyonlari, bolme_genislikleri, bolme_raf_sayilari):
|
|
|
|
| 8 |
try:
|
| 9 |
-
fig, ax = plt.subplots(figsize=(W/20, H/20))
|
|
|
|
|
|
|
| 10 |
ax.add_patch(Rectangle((0, 0), W, H, fill=None, edgecolor='black', linewidth=2))
|
| 11 |
ax.add_patch(Rectangle((T, T), W - 2 * T, H - 2 * T, fill=None, edgecolor='gray', linewidth=1))
|
|
|
|
|
|
|
| 12 |
for pozisyon in bolme_pozisyonlari:
|
| 13 |
ax.add_patch(Rectangle((T + pozisyon, T), T, H - 2 * T, facecolor='#E0E0E0', edgecolor='gray', linewidth=1))
|
|
|
|
|
|
|
| 14 |
sol_kenar_x = T
|
| 15 |
for i in range(len(bolme_genislikleri)):
|
| 16 |
genislik = bolme_genislikleri[i]
|
| 17 |
raf_sayisi = bolme_raf_sayilari[i]
|
|
|
|
| 18 |
if raf_sayisi > 0:
|
| 19 |
bolme_ic_yukseklik = H - 2 * T
|
| 20 |
bosluk = bolme_ic_yukseklik / (raf_sayisi + 1)
|
| 21 |
for j in range(raf_sayisi):
|
| 22 |
raf_y = T + ((j + 1) * bosluk) - (T / 2)
|
| 23 |
ax.add_patch(Rectangle((sol_kenar_x, raf_y), genislik, T, facecolor='#F0F0F0', edgecolor='gray', linewidth=1))
|
|
|
|
| 24 |
sol_kenar_x += genislik + T
|
|
|
|
| 25 |
ax.set_xlim(0, W); ax.set_ylim(0, H)
|
| 26 |
ax.set_aspect('equal', adjustable='box'); ax.set_xticks([]); ax.set_yticks([])
|
| 27 |
plt.title("Dolap İç Yapısı (Ön Görünüm)"); plt.tight_layout()
|
|
|
|
| 28 |
return fig
|
| 29 |
except Exception:
|
| 30 |
fig, ax = plt.subplots(); ax.text(0.5, 0.5, 'Çizim oluşturulamadı.', ha='center'); return fig
|
| 31 |
|
| 32 |
-
# --- Arayüz Güncelleme Fonksiyonu
|
| 33 |
def update_bolme_arayuzu(dikey_bolme_adedi):
|
| 34 |
dikey_bolme_adedi = int(dikey_bolme_adedi)
|
| 35 |
bolme_sayisi = dikey_bolme_adedi + 1
|
| 36 |
-
|
| 37 |
updates = []
|
| 38 |
-
|
| 39 |
-
for i in range(MAX_BOLMELER):
|
| 40 |
-
updates.append(gr.update(visible=i < dikey_bolme_adedi))
|
| 41 |
-
# Bölme raf sayısı kutularını güncelle
|
| 42 |
-
for i in range(MAX_BOLMELER + 1):
|
| 43 |
-
updates.append(gr.update(visible=i < bolme_sayisi))
|
| 44 |
-
|
| 45 |
-
# YENİ: Çekmece bölme seçimi menüsünü güncelle
|
| 46 |
bolme_choices = [str(i + 1) for i in range(bolme_sayisi)]
|
| 47 |
updates.append(gr.update(choices=bolme_choices, value="1"))
|
| 48 |
-
|
| 49 |
return updates
|
| 50 |
|
| 51 |
-
# --- Ana Hesaplama Fonksiyonu
|
| 52 |
def ana_fonksiyon(
|
| 53 |
-
genislik, yukseklik, derinlik, kalinlik,
|
| 54 |
dikey_bolme_sayisi, arkalik_var_mi,
|
| 55 |
kapak_sayisi, kapak_bosluk,
|
| 56 |
cekmece_sayisi, cekmece_on_yuksekligi, cekmece_bolme_secimi,
|
|
@@ -58,6 +61,7 @@ def ana_fonksiyon(
|
|
| 58 |
):
|
| 59 |
try:
|
| 60 |
W, H, D, T = float(genislik), float(yukseklik), float(derinlik), float(kalinlik)
|
|
|
|
| 61 |
dikey_bolme_sayisi = int(dikey_bolme_sayisi)
|
| 62 |
bolme_sayisi = dikey_bolme_sayisi + 1
|
| 63 |
dikey_bolme_pozisyonlari = sorted([float(p) for p in dynamic_inputs[:dikey_bolme_sayisi]])
|
|
@@ -69,13 +73,13 @@ def ana_fonksiyon(
|
|
| 69 |
if dikey_bolme_pozisyonlari and max(dikey_bolme_pozisyonlari) >= ic_genislik:
|
| 70 |
raise ValueError(f"Bölme pozisyonu ({max(dikey_bolme_pozisyonlari)}cm) iç genişlikten ({ic_genislik}cm) büyük olamaz.")
|
| 71 |
|
| 72 |
-
#
|
| 73 |
parcalar.append(["Gövde - Yan Panel", 2, H, D, "Ön ve alt kenar bantlı", 1, 1])
|
| 74 |
parcalar.append(["Gövde - Alt/Üst Panel", 2, ic_genislik, D, "Ön kenar bantlı", 1, 0])
|
| 75 |
if dikey_bolme_sayisi > 0:
|
| 76 |
parcalar.append(["Gövde - Dikey Bölme", dikey_bolme_sayisi, H - 2 * T, D, "Ön kenar bantlı", 1, 0])
|
| 77 |
|
| 78 |
-
#
|
| 79 |
bolme_genislikleri = []
|
| 80 |
sol_kenar_pozisyonu = 0
|
| 81 |
for pozisyon in dikey_bolme_pozisyonlari:
|
|
@@ -83,24 +87,28 @@ def ana_fonksiyon(
|
|
| 83 |
bolme_genislikleri.append(round(genislik_hesap, 2))
|
| 84 |
sol_kenar_pozisyonu = pozisyon + T
|
| 85 |
bolme_genislikleri.append(round(ic_genislik - sol_kenar_pozisyonu, 2))
|
| 86 |
-
|
| 87 |
for i in range(bolme_sayisi):
|
| 88 |
if bolme_raf_sayilari[i] > 0:
|
| 89 |
parcalar.append([f"Raf - Bölme {i+1}", bolme_raf_sayilari[i], bolme_genislikleri[i], D, "Ön kenar bantlı", 1, 0])
|
| 90 |
|
| 91 |
-
#
|
| 92 |
if arkalik_var_mi: parcalar.append(["Gövde - Arkalık (İnce)", 1, H, W, "Bantlanmaz", 0, 0])
|
|
|
|
| 93 |
if int(kapak_sayisi) > 0:
|
| 94 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 95 |
|
| 96 |
-
# YENİ: Çekmece hesabı artık seçilen bölmeye göre yapılıyor
|
| 97 |
if int(cekmece_sayisi) > 0:
|
| 98 |
cekmece_bolme_index = int(cekmece_bolme_secimi) - 1
|
| 99 |
-
if cekmece_bolme_index >= len(bolme_genislikleri):
|
| 100 |
-
raise ValueError("Seçilen çekmece bölmesi geçersiz.")
|
| 101 |
-
|
| 102 |
aciklik_genisligi = bolme_genislikleri[cekmece_bolme_index]
|
| 103 |
-
|
|
|
|
|
|
|
|
|
|
| 104 |
kasa_yukseklik = float(cekmece_on_yuksekligi) - 2.5
|
| 105 |
kasa_derinlik = D - 5
|
| 106 |
kasa_dis_genislik = aciklik_genisligi - 2.6
|
|
@@ -108,7 +116,7 @@ def ana_fonksiyon(
|
|
| 108 |
parcalar.append(["Çekmece - Kasa Ön/Arka", int(cekmece_sayisi) * 2, kasa_dis_genislik - (2*T), kasa_yukseklik, "Üst kenar bantlı", 1, 0])
|
| 109 |
parcalar.append(["Çekmece - Kasa Altı (İnce)", int(cekmece_sayisi), kasa_dis_genislik, kasa_derinlik, "Bantlanmaz", 0, 0])
|
| 110 |
|
| 111 |
-
#
|
| 112 |
df = pd.DataFrame(parcalar, columns=["Parça Adı", "Adet", "Uzunluk (cm)", "Genişlik (cm)", "Not", "Bant (Uzun)", "Bant (Kısa)"])
|
| 113 |
toplam_alan_m2 = round(df[~df['Parça Adı'].str.contains('İnce')].apply(lambda r: r['Adet'] * r['Uzunluk (cm)'] * r['Genişlik (cm)'] / 10000, axis=1).sum(), 2)
|
| 114 |
toplam_bant_m = round(df.apply(lambda r: r['Adet'] * (r['Bant (Uzun)'] * r['Uzunluk (cm)'] + r['Bant (Kısa)'] * r['Genişlik (cm)']) / 100, axis=1).sum(), 2)
|
|
@@ -121,7 +129,7 @@ def ana_fonksiyon(
|
|
| 121 |
except Exception as e:
|
| 122 |
return pd.DataFrame(), f"HATA: {e}", cizim_olustur(1,1,0.1,[],[],[])
|
| 123 |
|
| 124 |
-
# --- Gradio Arayüzü
|
| 125 |
MAX_BOLMELER = 5
|
| 126 |
|
| 127 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
@@ -129,12 +137,14 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
| 129 |
gr.Markdown("Bu araç; kesim listesi, bantlama bilgisi, metraj hesabı ve görsel ön izleme sunar.")
|
| 130 |
with gr.Row():
|
| 131 |
with gr.Column(scale=2):
|
| 132 |
-
gr.Markdown("### 1.
|
| 133 |
genislik = gr.Number(label="Toplam Genişlik (cm)", value=200)
|
| 134 |
yukseklik = gr.Number(label="Toplam Yükseklik (cm)", value=240)
|
| 135 |
derinlik = gr.Number(label="Toplam Derinlik (cm)", value=60)
|
| 136 |
kalinlik = gr.Number(label="Malzeme Kalınlığı (cm)", value=1.8)
|
|
|
|
| 137 |
arkalik_var_mi = gr.Checkbox(label="Arkalık Eklensin mi?", value=True)
|
|
|
|
| 138 |
with gr.Column(scale=3):
|
| 139 |
gr.Markdown("### 2. İç Tasarım ve Yapılandırma")
|
| 140 |
dikey_bolme_sayisi_slider = gr.Slider(minimum=0, maximum=MAX_BOLMELER, step=1, label="Dikey Bölme Sayısı", value=1)
|
|
@@ -144,6 +154,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
| 144 |
with gr.Group():
|
| 145 |
gr.Markdown("#### Bölmelere Göre Raf Sayıları (adet)")
|
| 146 |
bolme_raf_sayisi_inputs = [gr.Number(label=f"{i+1}. Bölme Raf Sayısı", value=4, visible=False, precision=0) for i in range(MAX_BOLMELER + 1)]
|
|
|
|
| 147 |
with gr.Column(scale=2):
|
| 148 |
gr.Markdown("### 3. Kapak ve Çekmece")
|
| 149 |
kapak_sayisi = gr.Slider(minimum=0, maximum=6, step=1, label="Kapak Sayısı", value=2)
|
|
@@ -151,8 +162,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
| 151 |
gr.Markdown("---")
|
| 152 |
cekmece_sayisi = gr.Slider(minimum=0, maximum=10, step=1, label="Çekmece Sayısı", value=0)
|
| 153 |
cekmece_on_yuksekligi = gr.Number(label="Tek Çekmece Yüksekliği", value=20)
|
| 154 |
-
|
| 155 |
-
cekmece_bolme_secimi = gr.Dropdown(label="Çekmece Hangi Bölmeye Eklensin?", choices=["1"], value="1", type="value")
|
| 156 |
|
| 157 |
hesapla_btn = gr.Button("Hesapla, Çiz ve Bantlamayı Belirle", variant="primary")
|
| 158 |
gr.Markdown("---")
|
|
@@ -166,11 +176,15 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
| 166 |
gr.Markdown("### Görsel Ön İzleme")
|
| 167 |
sonuc_cizim = gr.Plot(label="Dolap İç Yapısı")
|
| 168 |
|
| 169 |
-
# --- Bağlantılar (Güncellendi) ---
|
| 170 |
dynamic_ui_components = dikey_bolme_pozisyon_inputs + bolme_raf_sayisi_inputs + [cekmece_bolme_secimi]
|
| 171 |
dikey_bolme_sayisi_slider.change(fn=update_bolme_arayuzu, inputs=dikey_bolme_sayisi_slider, outputs=dynamic_ui_components)
|
| 172 |
|
| 173 |
-
all_inputs = [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 174 |
|
| 175 |
hesapla_btn.click(fn=ana_fonksiyon, inputs=all_inputs, outputs=[sonuc_df, sonuc_metni, sonuc_cizim])
|
| 176 |
|
|
|
|
| 3 |
import matplotlib.pyplot as plt
|
| 4 |
from matplotlib.patches import Rectangle
|
| 5 |
|
| 6 |
+
# --- Çizim Fonksiyonu ---
|
| 7 |
def cizim_olustur(W, H, T, bolme_pozisyonlari, bolme_genislikleri, bolme_raf_sayilari):
|
| 8 |
+
"""Verilen ölçülere göre dolabın ön görünüşünü çizer."""
|
| 9 |
try:
|
| 10 |
+
fig, ax = plt.subplots(figsize=(W/20, H/20)) # Boyutları orantılı yap
|
| 11 |
+
|
| 12 |
+
# 1. Ana Gövdeyi (Dış Çerçeveyi) Çiz
|
| 13 |
ax.add_patch(Rectangle((0, 0), W, H, fill=None, edgecolor='black', linewidth=2))
|
| 14 |
ax.add_patch(Rectangle((T, T), W - 2 * T, H - 2 * T, fill=None, edgecolor='gray', linewidth=1))
|
| 15 |
+
|
| 16 |
+
# 2. Dikey Bölmeleri Çiz
|
| 17 |
for pozisyon in bolme_pozisyonlari:
|
| 18 |
ax.add_patch(Rectangle((T + pozisyon, T), T, H - 2 * T, facecolor='#E0E0E0', edgecolor='gray', linewidth=1))
|
| 19 |
+
|
| 20 |
+
# 3. Rafları Çiz
|
| 21 |
sol_kenar_x = T
|
| 22 |
for i in range(len(bolme_genislikleri)):
|
| 23 |
genislik = bolme_genislikleri[i]
|
| 24 |
raf_sayisi = bolme_raf_sayilari[i]
|
| 25 |
+
|
| 26 |
if raf_sayisi > 0:
|
| 27 |
bolme_ic_yukseklik = H - 2 * T
|
| 28 |
bosluk = bolme_ic_yukseklik / (raf_sayisi + 1)
|
| 29 |
for j in range(raf_sayisi):
|
| 30 |
raf_y = T + ((j + 1) * bosluk) - (T / 2)
|
| 31 |
ax.add_patch(Rectangle((sol_kenar_x, raf_y), genislik, T, facecolor='#F0F0F0', edgecolor='gray', linewidth=1))
|
| 32 |
+
|
| 33 |
sol_kenar_x += genislik + T
|
| 34 |
+
|
| 35 |
ax.set_xlim(0, W); ax.set_ylim(0, H)
|
| 36 |
ax.set_aspect('equal', adjustable='box'); ax.set_xticks([]); ax.set_yticks([])
|
| 37 |
plt.title("Dolap İç Yapısı (Ön Görünüm)"); plt.tight_layout()
|
| 38 |
+
|
| 39 |
return fig
|
| 40 |
except Exception:
|
| 41 |
fig, ax = plt.subplots(); ax.text(0.5, 0.5, 'Çizim oluşturulamadı.', ha='center'); return fig
|
| 42 |
|
| 43 |
+
# --- Arayüz Güncelleme Fonksiyonu ---
|
| 44 |
def update_bolme_arayuzu(dikey_bolme_adedi):
|
| 45 |
dikey_bolme_adedi = int(dikey_bolme_adedi)
|
| 46 |
bolme_sayisi = dikey_bolme_adedi + 1
|
|
|
|
| 47 |
updates = []
|
| 48 |
+
for i in range(MAX_BOLMELER): updates.append(gr.update(visible=i < dikey_bolme_adedi))
|
| 49 |
+
for i in range(MAX_BOLMELER + 1): updates.append(gr.update(visible=i < bolme_sayisi))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
bolme_choices = [str(i + 1) for i in range(bolme_sayisi)]
|
| 51 |
updates.append(gr.update(choices=bolme_choices, value="1"))
|
|
|
|
| 52 |
return updates
|
| 53 |
|
| 54 |
+
# --- Ana Hesaplama Fonksiyonu ---
|
| 55 |
def ana_fonksiyon(
|
| 56 |
+
genislik, yukseklik, derinlik, kalinlik, bant_kalinligi,
|
| 57 |
dikey_bolme_sayisi, arkalik_var_mi,
|
| 58 |
kapak_sayisi, kapak_bosluk,
|
| 59 |
cekmece_sayisi, cekmece_on_yuksekligi, cekmece_bolme_secimi,
|
|
|
|
| 61 |
):
|
| 62 |
try:
|
| 63 |
W, H, D, T = float(genislik), float(yukseklik), float(derinlik), float(kalinlik)
|
| 64 |
+
T_bant = float(bant_kalinligi) / 10 # mm'yi cm'ye çevir
|
| 65 |
dikey_bolme_sayisi = int(dikey_bolme_sayisi)
|
| 66 |
bolme_sayisi = dikey_bolme_sayisi + 1
|
| 67 |
dikey_bolme_pozisyonlari = sorted([float(p) for p in dynamic_inputs[:dikey_bolme_sayisi]])
|
|
|
|
| 73 |
if dikey_bolme_pozisyonlari and max(dikey_bolme_pozisyonlari) >= ic_genislik:
|
| 74 |
raise ValueError(f"Bölme pozisyonu ({max(dikey_bolme_pozisyonlari)}cm) iç genişlikten ({ic_genislik}cm) büyük olamaz.")
|
| 75 |
|
| 76 |
+
# GÖVDE PARÇALARI VE BANTLAMA
|
| 77 |
parcalar.append(["Gövde - Yan Panel", 2, H, D, "Ön ve alt kenar bantlı", 1, 1])
|
| 78 |
parcalar.append(["Gövde - Alt/Üst Panel", 2, ic_genislik, D, "Ön kenar bantlı", 1, 0])
|
| 79 |
if dikey_bolme_sayisi > 0:
|
| 80 |
parcalar.append(["Gövde - Dikey Bölme", dikey_bolme_sayisi, H - 2 * T, D, "Ön kenar bantlı", 1, 0])
|
| 81 |
|
| 82 |
+
# BÖLME GENİŞLİKLERİ VE RAFLAR
|
| 83 |
bolme_genislikleri = []
|
| 84 |
sol_kenar_pozisyonu = 0
|
| 85 |
for pozisyon in dikey_bolme_pozisyonlari:
|
|
|
|
| 87 |
bolme_genislikleri.append(round(genislik_hesap, 2))
|
| 88 |
sol_kenar_pozisyonu = pozisyon + T
|
| 89 |
bolme_genislikleri.append(round(ic_genislik - sol_kenar_pozisyonu, 2))
|
|
|
|
| 90 |
for i in range(bolme_sayisi):
|
| 91 |
if bolme_raf_sayilari[i] > 0:
|
| 92 |
parcalar.append([f"Raf - Bölme {i+1}", bolme_raf_sayilari[i], bolme_genislikleri[i], D, "Ön kenar bantlı", 1, 0])
|
| 93 |
|
| 94 |
+
# DİĞER PARÇALAR VE BANTLAMA
|
| 95 |
if arkalik_var_mi: parcalar.append(["Gövde - Arkalık (İnce)", 1, H, W, "Bantlanmaz", 0, 0])
|
| 96 |
+
|
| 97 |
if int(kapak_sayisi) > 0:
|
| 98 |
+
hedef_yukseklik = H - (2 * float(kapak_bosluk))
|
| 99 |
+
hedef_genislik = (W - (int(kapak_sayisi) + 1) * float(kapak_bosluk)) / int(kapak_sayisi)
|
| 100 |
+
kesim_yuksekligi = round(hedef_yukseklik - (2 * T_bant), 2)
|
| 101 |
+
kesim_genisligi = round(hedef_genislik - (2 * T_bant), 2)
|
| 102 |
+
parcalar.append(["Kapak", int(kapak_sayisi), kesim_yuksekligi, kesim_genisligi, "4 kenar bantlı (ölçüden düşüldü)", 2, 2])
|
| 103 |
|
|
|
|
| 104 |
if int(cekmece_sayisi) > 0:
|
| 105 |
cekmece_bolme_index = int(cekmece_bolme_secimi) - 1
|
| 106 |
+
if cekmece_bolme_index >= len(bolme_genislikleri): raise ValueError("Geçersiz çekmece bölmesi.")
|
|
|
|
|
|
|
| 107 |
aciklik_genisligi = bolme_genislikleri[cekmece_bolme_index]
|
| 108 |
+
hedef_cekmece_genislik = aciklik_genisligi - (2 * float(kapak_bosluk))
|
| 109 |
+
kesim_cekmece_genislik = round(hedef_cekmece_genislik - (2 * T_bant), 2)
|
| 110 |
+
parcalar.append(["Çekmece - Ön Panel", int(cekmece_sayisi), float(cekmece_on_yuksekligi) - (2*T_bant), kesim_cekmece_genislik, f"{cekmece_bolme_secimi}. Bölme, 4 kenar bantlı", 2, 2])
|
| 111 |
+
|
| 112 |
kasa_yukseklik = float(cekmece_on_yuksekligi) - 2.5
|
| 113 |
kasa_derinlik = D - 5
|
| 114 |
kasa_dis_genislik = aciklik_genisligi - 2.6
|
|
|
|
| 116 |
parcalar.append(["Çekmece - Kasa Ön/Arka", int(cekmece_sayisi) * 2, kasa_dis_genislik - (2*T), kasa_yukseklik, "Üst kenar bantlı", 1, 0])
|
| 117 |
parcalar.append(["Çekmece - Kasa Altı (İnce)", int(cekmece_sayisi), kasa_dis_genislik, kasa_derinlik, "Bantlanmaz", 0, 0])
|
| 118 |
|
| 119 |
+
# SONUÇLARI HAZIRLAMA
|
| 120 |
df = pd.DataFrame(parcalar, columns=["Parça Adı", "Adet", "Uzunluk (cm)", "Genişlik (cm)", "Not", "Bant (Uzun)", "Bant (Kısa)"])
|
| 121 |
toplam_alan_m2 = round(df[~df['Parça Adı'].str.contains('İnce')].apply(lambda r: r['Adet'] * r['Uzunluk (cm)'] * r['Genişlik (cm)'] / 10000, axis=1).sum(), 2)
|
| 122 |
toplam_bant_m = round(df.apply(lambda r: r['Adet'] * (r['Bant (Uzun)'] * r['Uzunluk (cm)'] + r['Bant (Kısa)'] * r['Genişlik (cm)']) / 100, axis=1).sum(), 2)
|
|
|
|
| 129 |
except Exception as e:
|
| 130 |
return pd.DataFrame(), f"HATA: {e}", cizim_olustur(1,1,0.1,[],[],[])
|
| 131 |
|
| 132 |
+
# --- Gradio Arayüzü ---
|
| 133 |
MAX_BOLMELER = 5
|
| 134 |
|
| 135 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
|
|
| 137 |
gr.Markdown("Bu araç; kesim listesi, bantlama bilgisi, metraj hesabı ve görsel ön izleme sunar.")
|
| 138 |
with gr.Row():
|
| 139 |
with gr.Column(scale=2):
|
| 140 |
+
gr.Markdown("### 1. Üretim Detayları")
|
| 141 |
genislik = gr.Number(label="Toplam Genişlik (cm)", value=200)
|
| 142 |
yukseklik = gr.Number(label="Toplam Yükseklik (cm)", value=240)
|
| 143 |
derinlik = gr.Number(label="Toplam Derinlik (cm)", value=60)
|
| 144 |
kalinlik = gr.Number(label="Malzeme Kalınlığı (cm)", value=1.8)
|
| 145 |
+
bant_kalinligi = gr.Dropdown(label="Bant Kalınlığı (mm)", choices=[0.4, 0.8, 1, 2], value=1, type="value")
|
| 146 |
arkalik_var_mi = gr.Checkbox(label="Arkalık Eklensin mi?", value=True)
|
| 147 |
+
|
| 148 |
with gr.Column(scale=3):
|
| 149 |
gr.Markdown("### 2. İç Tasarım ve Yapılandırma")
|
| 150 |
dikey_bolme_sayisi_slider = gr.Slider(minimum=0, maximum=MAX_BOLMELER, step=1, label="Dikey Bölme Sayısı", value=1)
|
|
|
|
| 154 |
with gr.Group():
|
| 155 |
gr.Markdown("#### Bölmelere Göre Raf Sayıları (adet)")
|
| 156 |
bolme_raf_sayisi_inputs = [gr.Number(label=f"{i+1}. Bölme Raf Sayısı", value=4, visible=False, precision=0) for i in range(MAX_BOLMELER + 1)]
|
| 157 |
+
|
| 158 |
with gr.Column(scale=2):
|
| 159 |
gr.Markdown("### 3. Kapak ve Çekmece")
|
| 160 |
kapak_sayisi = gr.Slider(minimum=0, maximum=6, step=1, label="Kapak Sayısı", value=2)
|
|
|
|
| 162 |
gr.Markdown("---")
|
| 163 |
cekmece_sayisi = gr.Slider(minimum=0, maximum=10, step=1, label="Çekmece Sayısı", value=0)
|
| 164 |
cekmece_on_yuksekligi = gr.Number(label="Tek Çekmece Yüksekliği", value=20)
|
| 165 |
+
cekmece_bolme_secimi = gr.Dropdown(label="Çekmece Hangi Bölmeye?", choices=["1"], value="1", type="value")
|
|
|
|
| 166 |
|
| 167 |
hesapla_btn = gr.Button("Hesapla, Çiz ve Bantlamayı Belirle", variant="primary")
|
| 168 |
gr.Markdown("---")
|
|
|
|
| 176 |
gr.Markdown("### Görsel Ön İzleme")
|
| 177 |
sonuc_cizim = gr.Plot(label="Dolap İç Yapısı")
|
| 178 |
|
|
|
|
| 179 |
dynamic_ui_components = dikey_bolme_pozisyon_inputs + bolme_raf_sayisi_inputs + [cekmece_bolme_secimi]
|
| 180 |
dikey_bolme_sayisi_slider.change(fn=update_bolme_arayuzu, inputs=dikey_bolme_sayisi_slider, outputs=dynamic_ui_components)
|
| 181 |
|
| 182 |
+
all_inputs = [
|
| 183 |
+
genislik, yukseklik, derinlik, kalinlik, bant_kalinligi,
|
| 184 |
+
dikey_bolme_sayisi_slider, arkalik_var_mi,
|
| 185 |
+
kapak_sayisi, kapak_bosluk,
|
| 186 |
+
cekmece_sayisi, cekmece_on_yuksekligi, cekmece_bolme_secimi
|
| 187 |
+
] + dikey_bolme_pozisyon_inputs + bolme_raf_sayisi_inputs
|
| 188 |
|
| 189 |
hesapla_btn.click(fn=ana_fonksiyon, inputs=all_inputs, outputs=[sonuc_df, sonuc_metni, sonuc_cizim])
|
| 190 |
|