从报告日期所在月起列出 36 个月的九星表。报告口径和 KP 岁差口径各一张,另有五级大运月采样。黄经仍走本系统恒星计算。

Co-Authored-By: Grok (agent loop)
This commit is contained in:
jesse-ux
2026-10-23 10:17:29 +08:00
co-authored by Grok (agent loop)
parent 4c405d2a51
commit 355946cd1a
5 changed files with 352 additions and 7 deletions
+100 -7
View File
@@ -57,6 +57,13 @@ LABELS: dict[str, tuple[str, str]] = {
"neutral": ("Natural neutral", "天然中性"),
"temporary_friends": ("Temporary friends", "临时友"),
"temporary_enemies": ("Temporary enemies", "临时敌"),
"year": ("Year", "年份"),
"month": ("Month", "月份"),
"mahadasha": ("Mahadasha", "大运"),
"antardasha": ("Antardasha", "小运"),
"pratyantardasha": ("Pratyantardasha", "次小运"),
"sookshma": ("Sookshma", "细运"),
"prana": ("Prana", "微运"),
"house": ("House", "宫位"),
"item": ("Item", "项目"),
"karaka": ("Karaka", "卡拉卡"),
@@ -172,6 +179,7 @@ SECTIONS: tuple[tuple[str, str], ...] = (
("Tripataki Chakra Detail", "Tripataki 轮盘明细"),
("Annual Tajika Strength", "年度 Tajika 力量"),
("Annual Saham Formula Trace", "年度特殊点公式轨迹"),
("Annual Chart Numeric Data", "年度图盘数值数据"),
("Shadbala Subcomponent", "六维力量分项"),
("Shadbala Result", "六维力量结果"),
("House Components and Physical Coordinates", "宫位分量与坐标"),
@@ -219,6 +227,7 @@ SECTIONS: tuple[tuple[str, str], ...] = (
("Multi-Reference Transit", "多参考点行运"),
("Double Transit PAC", "木土双重行运 PAC"),
("Lagna / 7th Lord Transit", "上升主与七宫主行运"),
("Three-Year Predictive Ephemeris", "三年逐月星历"),
("Natal Calculation Conventions", "本命计算口径"),
("KP Calculation Conventions", "KP 计算口径"),
("D9 Dignity", "D9 尊贵"),
@@ -229,11 +238,9 @@ SECTIONS: tuple[tuple[str, str], ...] = (
)
FORBIDDEN_TITLES = (
"Annual Chart Numeric Data",
"Bhava Bala Relative Score Components",
"Score Extremes",
"独立年度方法参考",
"三年逐月星历",
"D81",
"D108",
"D144",
@@ -933,6 +940,48 @@ def _trace_table(traces: Any, language: str) -> str:
return _rows_from(rows, language, [("name", "text"), ("rule", "text"), ("phase", "text"), ("longitude", "text")])
def _annual_numeric(packet: dict, language: str) -> str:
rows = []
seen = set()
packs = []
primary = _first(packet, ("timing_and_predictive_systems", "annual_tajika_pack")) or {}
if isinstance(primary, dict):
packs.append(primary)
series = _first(packet, ("timing_and_predictive_systems", "annual_tajika_series")) or {}
years = series.get("years") if isinstance(series, dict) else None
if isinstance(years, dict):
for year in sorted(years, key=str):
pack = years.get(year)
if isinstance(pack, dict):
packs.append(pack)
for pack in packs:
pages = pack.get("annual_year_pages") if isinstance(pack.get("annual_year_pages"), list) else []
if not pages:
chart = pack.get("annual_chart") if isinstance(pack.get("annual_chart"), dict) else {}
data = chart.get("data") if isinstance(chart.get("data"), dict) else chart
longitudes = data.get("planet_longitudes") if isinstance(data.get("planet_longitudes"), dict) else {}
profile = pack.get("profile") if isinstance(pack.get("profile"), dict) else {}
pages = [{"target_year": profile.get("target_year"), "planet_longitudes": longitudes}] if longitudes else []
for page in pages:
if not isinstance(page, dict):
continue
longitudes = page.get("planet_longitudes") if isinstance(page.get("planet_longitudes"), dict) else {}
for planet, longitude in longitudes.items():
if not isinstance(longitude, (int, float)) or isinstance(longitude, bool):
continue
key = (page.get("target_year"), planet)
if key in seen:
continue
seen.add(key)
rows.append({
"year": page.get("target_year"),
"planet": planet,
"sign": SIGNS[int(float(longitude) // 30) % 12],
"longitude": round(float(longitude), 6),
})
return _rows_from(rows, language, [("year", "text"), ("planet", "planet"), ("sign", "sign"), ("longitude", "text")])
def _annual_saham_trace(packet: dict, language: str) -> str:
pack = _first(packet, ("timing_and_predictive_systems", "annual_tajika_pack")) or {}
sahams = _pack_data(pack.get("sahams") if isinstance(pack, dict) else None)
@@ -2500,18 +2549,61 @@ _BUILDERS = {
"Tripataki Chakra Detail": _tripataki,
"Annual Tajika Strength": _tajika_strength,
"Annual Saham Formula Trace": _annual_saham_trace,
"Annual Chart Numeric Data": _annual_numeric,
}
def _ephemeris(packet: dict, language: str) -> str:
pack = _first(packet, ("timing_and_predictive_systems", "report_month_ephemeris")) or {}
if not isinstance(pack, dict) or not pack.get("report_rows"):
return _blank(language, ["month", "planet", "sign", "longitude"])
columns = [("month", "text"), ("planet", "planet"), ("sign", "sign"), ("longitude", "text")]
report_rows = pack.get("report_rows") or []
kp_rows = pack.get("kp_rows") or []
if language == "zh":
report_note = f"报告口径,{len(report_rows)} 行。首月是报告日期所在月。"
kp_note = f"KP 岁差口径,{len(kp_rows)} 行。黄经仍走本系统恒星计算,不用视位置。"
else:
report_note = f"Report frame, {len(report_rows)} rows. The first month is the report month."
kp_note = f"KP ayanamsa frame, {len(kp_rows)} rows. Longitudes still use this system's sidereal calculation, not apparent position."
parts = [
report_note,
_rows_from(report_rows, language, columns),
kp_note,
_rows_from(kp_rows, language, columns),
]
levels = pack.get("vimshottari_rows") if isinstance(pack.get("vimshottari_rows"), list) else []
if levels:
parts.append(_rows_from(
levels,
language,
[
("month", "text"),
("mahadasha", "planet"),
("antardasha", "planet"),
("pratyantardasha", "planet"),
("sookshma", "planet"),
("prana", "planet"),
],
))
elif pack.get("vimshottari_reason"):
parts.append(
"五级大运月采样没有算出。"
if language == "zh"
else "The five-level monthly sample was not calculated."
)
return "\n\n".join(part for part in parts if part)
def _chapter_sections() -> list[list[str]]:
order = [title for title, _zh in SECTIONS]
groups = [
order[:14],
order[14:20],
order[20:35],
order[35:46],
order[46:63],
order[63:],
order[14:21],
order[21:36],
order[36:47],
order[47:65],
order[65:],
]
return groups
@@ -2568,6 +2660,7 @@ def _render_named(packet: dict, language: str, title: str) -> str:
"Multi-Reference Transit": lambda: _multi_transit(packet, language),
"Double Transit PAC": lambda: _double_transit(packet, language),
"Lagna / 7th Lord Transit": lambda: _lord_transit(packet, language),
"Three-Year Predictive Ephemeris": lambda: _ephemeris(packet, language),
"Natal Calculation Conventions": lambda: _settings(packet, language),
"KP Calculation Conventions": lambda: _kp(packet, language),
"D9 Dignity": lambda: _d9(packet, language),