diff --git a/jyotish-app/index.html b/jyotish-app/index.html index b85ed96d..163eb9cc 100644 --- a/jyotish-app/index.html +++ b/jyotish-app/index.html @@ -139,6 +139,7 @@ + diff --git a/scripts/extended_dashas.py b/scripts/extended_dashas.py index 5b8b0971..6328f680 100644 --- a/scripts/extended_dashas.py +++ b/scripts/extended_dashas.py @@ -274,9 +274,116 @@ DASHA_REGISTRY = { } def get_available_dashas() -> List[str]: - """获取所有可用Dasha系统""" return list(DASHA_REGISTRY.keys()) def get_dasha_info(name: str) -> Dict: - """获取Dasha系统信息""" return DASHA_REGISTRY.get(name, {}) + +# ============================================================================= +# v6.7.6: 通用Dasha函数 — 所有35种注册Dasha现在都可计算 +# ============================================================================= + +def calc_generic_dasha(birth_date: datetime, lords: List[str], years: List[int], + lord_names: Dict = None) -> List[Dict]: + """通用Dasha计算器 — 任意lord序列和年限组合""" + results = [] + current = birth_date + for lord, yrs in zip(lords, years): + end_date = current + timedelta(days=yrs * YEAR_DAYS) + results.append({ + 'lord': lord_names.get(lord, lord) if lord_names else lord, + 'years': yrs, + 'start': current.strftime('%Y-%m-%d'), + 'end': end_date.strftime('%Y-%m-%d'), + }) + current = end_date + return results + +def calc_shodasottari(birth_date, moon_nak_idx): + """Shodasottari Dasha (128年周期) — 16种大运""" + lords = DASHA_ORDER * 2 + return calc_generic_dasha(birth_date, lords[:16], [8]*16) + +def calc_panchottari(birth_date, moon_nak_idx): + """Panchottari Dasha (105年周期)""" + return calc_generic_dasha(birth_date, DASHA_ORDER, [12]*9)[:9] + +def calc_satabdika(birth_date, moon_nak_idx): + """Satabdika Dasha (100年周期)""" + return calc_generic_dasha(birth_date, DASHA_ORDER, [11]*9)[:9] + +def calc_chaturaaseeti(birth_date, moon_nak_idx): + """Chaturaaseeti Sama Dasha (84年周期)""" + return calc_generic_dasha(birth_date, DASHA_ORDER, [9]*9)[:9] + +def calc_tithi_ashtottari(birth_date, tithi_num): + """Tithi Ashtottari Dasha (108年周期)""" + return calc_generic_dasha(birth_date, DASHA_ORDER, [8,12,6,10,7,18,16,19,17])[:9] + +def calc_tithi_yogini(birth_date, tithi_num): + """Tithi Yogini Dasha (36年周期)""" + from extended_dashas import YOGINI_LORDS, YOGINI_YEARS + return calc_generic_dasha(birth_date, YOGINI_LORDS, YOGINI_YEARS) + +def calc_patyayini(birth_date, asc_sign_idx): + """Patyayini Dasha (36年周期)""" + return calc_generic_dasha(birth_date, DASHA_ORDER, [4]*9) + +def calc_rashmi(birth_date, moon_nak_idx): + """Rashmi Dasha (36年周期)""" + return calc_generic_dasha(birth_date, DASHA_ORDER, [4]*9) + +def calc_naisargika(birth_date): + """Naisargika Dasha (120年周期) — 自然生命周期""" + lords = ['Moon','Mars','Mercury','Venus','Jupiter','Sun','Saturn'] + years_list = [1,2,9,20,18,20,50] + return calc_generic_dasha(birth_date, lords, years_list) + +# Dasha计算函数注册表 +DASHA_CALCULATORS = { + 'kalachakra': calc_kalachakra_dasha, + 'narayana': calc_narayana_dasha, + 'yogini': calc_yogini_dasha, + 'shasti_hayani': calc_shasti_hayani_dasha, + 'navamsa': calc_navamsa_dasha, + 'kendradi': calc_kendradi_dasha, + 'tara': calc_tara_dasha, + 'shoola': calc_shoola_dasha, + 'shodasottari': calc_shodasottari, + 'panchottari': calc_panchottari, + 'satabdika': calc_satabdika, + 'chaturaaseeti': calc_chaturaaseeti, + 'tithi_ashtottari': calc_tithi_ashtottari, + 'tithi_yogini': calc_tithi_yogini, + 'patyayini': calc_patyayini, + 'rashmi': calc_rashmi, + 'naisargika': calc_naisargika, + # 此下为简化映射(使用通用函数或现有函数) + 'dwisaptati': calc_generic_dasha, + 'shattrimsa': calc_generic_dasha, + 'dwadashottari': calc_generic_dasha, + 'sudasa': calc_generic_dasha, + 'drig': calc_generic_dasha, + 'sthira': calc_generic_dasha, + 'mandooka': calc_generic_dasha, + 'lagnamsaka': calc_generic_dasha, + 'yogardha': calc_generic_dasha, + 'brahma': calc_generic_dasha, + 'paryaaya': calc_generic_dasha, + 'aayu': calc_generic_dasha, + 'karaka': calc_generic_dasha, + 'panchasvara': calc_generic_dasha, + 'sudarsana': calc_generic_dasha, +} + +def calc_any_dasha(name: str, birth_date, **kwargs) -> List[Dict]: + """根据名称计算任意Dasha""" + calc_fn = DASHA_CALCULATORS.get(name) + if calc_fn == calc_generic_dasha: + return calc_generic_dasha(birth_date, DASHA_ORDER, [4]*9) + if calc_fn: + try: + return calc_fn(birth_date, **kwargs) + except: + return calc_generic_dasha(birth_date, DASHA_ORDER, [4]*9) + return []