99 lines
3.7 KiB
Python
99 lines
3.7 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
Narayana Dasha 子命令
|
||
Jyotish Vedic Astrology Skill — v6.0.20
|
||
"""
|
||
|
||
import json
|
||
|
||
|
||
def cmd_narayana_dasha(args, chart_data):
|
||
"""
|
||
narayana-dasha 子命令:计算并报告 Narayana Dasha(Rishi Dasha)。
|
||
|
||
用法:
|
||
python jyotish_engine.py narayana-dasha --year REDACTED_YEAR --month 4 --day 17 \\
|
||
--hour 14 --minute 45 --lat 36.47 --lon 114.2 --tz 8 --age 33
|
||
"""
|
||
if chart_data is None:
|
||
return "\n".join([
|
||
"╔══════════════════════════════════════════╗",
|
||
"║ Narayana Dasha(Rishi Dasha) ║",
|
||
"╚══════════════════════════════════════════╝",
|
||
"",
|
||
"错误:图表数据未生成(swisseph 可能未安装)。",
|
||
"Narayana Dasha 需要完整的行星经度数据。",
|
||
])
|
||
|
||
from narayana_dasha import narayana_dasha_full_report
|
||
|
||
planet_lons = {}
|
||
for pn, pd in chart_data.get('planets', {}).items():
|
||
if isinstance(pd, dict) and 'degree' in pd:
|
||
planet_lons[pn] = pd['degree']
|
||
|
||
asc_idx = chart_data.get('ascendant_index')
|
||
if asc_idx is None:
|
||
asc_info = chart_data.get('ascendant', {}) if isinstance(chart_data, dict) else {}
|
||
asc_idx = asc_info.get('sign_idx', 0)
|
||
if asc_idx == 0 and isinstance(asc_info, dict):
|
||
# compute_chart_data 输出 ascendant.sign,但不一定输出 sign_idx;兼容旧结构
|
||
sign_name = asc_info.get('sign')
|
||
signs = ['Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo',
|
||
'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces']
|
||
if sign_name in signs:
|
||
asc_idx = signs.index(sign_name)
|
||
if isinstance(asc_idx, str):
|
||
asc_idx = int(asc_idx)
|
||
|
||
current_age = float(getattr(args, 'age', 0) or 0)
|
||
birth_year = getattr(args, 'year', 0) or 0
|
||
|
||
result = narayana_dasha_full_report(
|
||
lagna_sign_idx=asc_idx,
|
||
planet_lons=planet_lons,
|
||
current_age=current_age,
|
||
birth_year=birth_year,
|
||
)
|
||
|
||
# 格式化输出
|
||
lines = [
|
||
"╔══════════════════════════════════════════╗",
|
||
"║ Narayana Dasha(Rishi Dasha) ║",
|
||
"╚══════════════════════════════════════════╝",
|
||
"",
|
||
f"Lagna: {result['lagna_sign']}({result['lagna_sign_idx']})",
|
||
f"总周期: {result['total_cycle_years']} 年",
|
||
"",
|
||
"── 大运序列 ──",
|
||
]
|
||
|
||
for p in result['mahadasha_sequence']:
|
||
lines.append(
|
||
f" {p['sign']:>12s} ({p['lord']:>7s} in {p['lord_in_sign']:>12s}): "
|
||
f"{p['years']:2d}年 [{p['start_age']:5.1f}→{p['end_age']:5.1f}]"
|
||
)
|
||
|
||
curr = result.get('current_dasha', {})
|
||
md = curr.get('md')
|
||
if md:
|
||
lines.append("")
|
||
lines.append(f"── 当前大运(age={current_age:.1f})──")
|
||
lines.append(f" Mahadasha: {md['sign']}({md['lord']}){md['years']}年")
|
||
lines.append(f" 剩余: {curr.get('remaining_years', 0):.1f}年")
|
||
|
||
ad = curr.get('ad')
|
||
if ad:
|
||
lines.append(f" Antardasha: {ad['sign']}({ad['lord']}){ad['years']}年")
|
||
|
||
pd = curr.get('pd')
|
||
if pd:
|
||
lines.append(f" Pratyantardasha: {pd['sign']}({pd['lord']}){pd['years']}年")
|
||
|
||
lines.append("")
|
||
for line in result.get('interpretation', []):
|
||
lines.append(f" {line}")
|
||
|
||
return "\n".join(lines)
|