import os, datetime, math
import numpy as np
import customtkinter as ctk
from skyfield.api import Loader, wgs84
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
class Menu9App(ctk.CTk):
def __init__(self):
super().__init__()
self.title("Ephemeris Raw Data (Modul 9)")
self.geometry("900x600")
ctk.set_appearance_mode("Dark")
# --- PERBAIKAN SKYFIELD LOADER DI SINI ---
self.load_obj = Loader(BASE_DIR)
self.eph = self.load_obj('de421.bsp')
self.ts = self.load_obj.timescale()
# -----------------------------------------
self.setup_ui()
def setup_ui(self):
self.sidebar = ctk.CTkFrame(self, width=250)
self.sidebar.pack(side="left", fill="y", padx=10, pady=10)
self.combo_obj = ctk.CTkOptionMenu(self.sidebar, values=["Sun", "Moon"])
self.combo_obj.pack(pady=10)
self.entry_y = ctk.CTkEntry(self.sidebar); self.entry_y.insert(0, "2026"); self.entry_y.pack(pady=5)
self.entry_m = ctk.CTkEntry(self.sidebar); self.entry_m.insert(0, "3"); self.entry_m.pack(pady=5)
self.entry_d = ctk.CTkEntry(self.sidebar); self.entry_d.insert(0, "17"); self.entry_d.pack(pady=5)
ctk.CTkButton(self.sidebar, text="▶ EKSTRAK DATA (24 Jam)", command=self.hitung).pack(pady=20)
self.textbox = ctk.CTkTextbox(self, font=("Consolas", 12), wrap="none")
self.textbox.pack(side="right", fill="both", expand=True, padx=10, pady=10)
def hitung(self):
self.textbox.delete("1.0", "end")
obj_target = self.combo_obj.get()
target = self.eph['sun'] if obj_target == "Sun" else self.eph['moon']
y, m, d = int(self.entry_y.get()), int(self.entry_m.get()), int(self.entry_d.get())
tz = 7.0
loc = wgs84.latlon(-7.0667, 110.4100) # Default Toposentrik
t0 = self.ts.utc(y, m, d, -int(tz))
t1 = self.ts.utc(y, m, d, 24-int(tz))
tt_array = np.linspace(t0.tt, t1.tt, 25) # 24 data point (tiap jam)
self.textbox.insert("end", f"EPHEMERIS {obj_target.upper()} (Toposentrik)\n{'='*80}\n")
self.textbox.insert("end", f"{'Jam':<10}{'R.A (Hours)':<15}{'Declination':<15}{'Altitude':<15}{'Distance (km)'}\n{'-'*80}\n")
for tt in tt_array:
t = self.ts.tt_jd(tt)
app = (self.eph['earth'] + loc).at(t).observe(target).apparent()
ra, dec, dist = app.radec()
alt, az, _ = app.altaz()
dt_lokal = t.utc_datetime() + datetime.timedelta(hours=tz)
jam_str = dt_lokal.strftime("%H:%M")
ra_val = ra.hours.item() if hasattr(ra.hours, 'item') else ra.hours
dec_val = dec.degrees.item() if hasattr(dec.degrees, 'item') else dec.degrees
self.textbox.insert("end", f"{jam_str:<10}{ra_val:<15.4f}{dec_val:<15.4f}{alt.degrees:<15.4f}{dist.km:,.1f}\n")
if __name__ == "__main__":
app = Menu9App()
app.mainloop()