Spaces:
Running
Running
| class ShenShaUtils: | |
| """ | |
| 纳音与神煞计算工具类 | |
| 参考《三命通会》、《渊海子平》 | |
| """ | |
| # 60甲子纳音映射 | |
| NAYIN_MAP = { | |
| "甲子": "海中金", "乙丑": "海中金", "丙寅": "炉中火", "丁卯": "炉中火", "戊辰": "大林木", "己巳": "大林木", | |
| "庚午": "路旁土", "辛未": "路旁土", "壬申": "剑锋金", "癸酉": "剑锋金", "甲戌": "山头火", "乙亥": "山头火", | |
| "丙子": "涧下水", "丁丑": "涧下水", "戊寅": "城头土", "己卯": "城头土", "庚辰": "白蜡金", "辛巳": "白蜡金", | |
| "壬午": "杨柳木", "癸未": "杨柳木", "甲申": "泉中水", "乙酉": "泉中水", "丙戌": "屋上土", "丁亥": "屋上土", | |
| "戊子": "霹雳火", "己丑": "霹雳火", "庚寅": "松柏木", "辛卯": "松柏木", "壬辰": "长流水", "癸巳": "长流水", | |
| "甲午": "沙中金", "乙未": "沙中金", "丙申": "山下火", "丁酉": "山下火", "戊戌": "平地木", "己亥": "平地木", | |
| "庚子": "壁上土", "辛丑": "壁上土", "壬寅": "金箔金", "癸卯": "金箔金", "甲辰": "佛灯火", "乙巳": "佛灯火", | |
| "丙午": "天河水", "丁未": "天河水", "戊申": "大驿土", "己酉": "大驿土", "庚戌": "钗钏金", "辛亥": "钗钏金", | |
| "壬子": "桑柘木", "癸丑": "桑柘木", "甲寅": "大溪水", "乙卯": "大溪水", "丙辰": "沙中土", "丁巳": "沙中土", | |
| "戊午": "天上火", "己未": "天上火", "庚申": "石榴木", "辛酉": "石榴木", "壬戌": "大海水", "癸亥": "大海水" | |
| } | |
| # 神煞规则定义 | |
| def get_nayin(pillar): | |
| return ShenShaUtils.NAYIN_MAP.get(pillar, "未知") | |
| def get_all_shensha(pillars): | |
| """ | |
| 计算四柱中的所有神煞 | |
| :param pillars: ['年柱', '月柱', '日柱', '时柱'] 每柱为 "干支" 字符串 | |
| :return: list of dicts {pillar_idx, name} | |
| """ | |
| year_gz, month_gz, day_gz, hour_gz = pillars | |
| day_master = day_gz[0] | |
| year_branch = year_gz[1] | |
| day_branch = day_gz[1] | |
| results = [[], [], [], []] # 对应年、月、日、时 | |
| # 1. 天乙贵人 (甲戊庚牛羊, 乙己鼠猴乡, 丙丁猪鸡位, 壬癸兔蛇藏, 六辛逢马虎) | |
| tian_yi_map = { | |
| '甲': ['丑', '未'], '戊': ['丑', '未'], '庚': ['丑', '未'], | |
| '乙': ['子', '申'], '己': ['子', '申'], | |
| '丙': ['亥', '酉'], '丁': ['亥', '酉'], | |
| '壬': ['卯', '巳'], '癸': ['卯', '巳'], | |
| '辛': ['午', '寅'] | |
| } | |
| gui_ren_branches = tian_yi_map.get(day_master, []) | |
| for i, p in enumerate(pillars): | |
| if p[1] in gui_ren_branches: | |
| results[i].append("天乙贵人") | |
| # 2. 禄神 (甲禄在寅, 乙禄在卯...) | |
| lu_map = {'甲': '寅', '乙': '卯', '丙': '巳', '丁': '午', '戊': '巳', '己': '午', '庚': '申', '辛': '酉', '壬': '亥', '癸': '子'} | |
| lu_branch = lu_map.get(day_master) | |
| for i, p in enumerate(pillars): | |
| if p[1] == lu_branch: | |
| results[i].append("禄神") | |
| # 3. 羊刃 (甲见卯, 乙见辰(其实乙见寅/辰有争议,通常取帝旺下一位)... 简单实现主气) | |
| yang_ren_map = {'甲': '卯', '丙': '午', '戊': '午', '庚': '酉', '壬': '子'} | |
| yr_branch = yang_ren_map.get(day_master) | |
| if yr_branch: | |
| for i, p in enumerate(pillars): | |
| if p[1] == yr_branch: | |
| results[i].append("羊刃") | |
| # 4. 驿马 (申子辰马在寅, 寅午戌马在申, 巳酉丑马在亥, 亥卯未马在巳) | |
| yima_rules = { | |
| ('申', '子', '辰'): '寅', | |
| ('寅', '午', '戌'): '申', | |
| ('巳', '酉', '丑'): '亥', | |
| ('亥', '卯', '未'): '巳' | |
| } | |
| def get_yima(branch): | |
| for k, v in yima_rules.items(): | |
| if branch in k: return v | |
| return None | |
| # 以年支或日支查 | |
| target_yimas = [get_yima(year_branch), get_yima(day_branch)] | |
| for i, p in enumerate(pillars): | |
| if p[1] in target_yimas: | |
| results[i].append("驿马") | |
| # 5. 桃花 (咸池) (申子辰在酉, 寅午戌在卯, 巳酉丑在午, 亥卯未在子) | |
| taohua_rules = { | |
| ('申', '子', '辰'): '酉', | |
| ('寅', '午', '戌'): '卯', | |
| ('巳', '酉', '丑'): '午', | |
| ('亥', '卯', '未'): '子' | |
| } | |
| def get_taohua(branch): | |
| for k, v in taohua_rules.items(): | |
| if branch in k: return v | |
| return None | |
| target_taohuas = [get_taohua(year_branch), get_taohua(day_branch)] | |
| for i, p in enumerate(pillars): | |
| if p[1] in target_taohuas: | |
| results[i].append("桃花") | |
| # 6. 将星 (申子辰在子, 寅午戌在午, 巳酉丑在酉, 亥卯未在卯) | |
| # 7. 华盖 (申子辰在辰, 寅午戌在戌, 巳酉丑在丑, 亥卯未在未) | |
| # 8. 空亡 (六甲旬空) | |
| branches = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'] | |
| stems = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'] | |
| def get_kong_wang(gz): | |
| s_idx = stems.index(gz[0]) | |
| b_idx = branches.index(gz[1]) | |
| kw_start_idx = (b_idx - s_idx) % 12 | |
| return [branches[(kw_start_idx - 2) % 12], branches[(kw_start_idx - 1) % 12]] | |
| day_kw = get_kong_wang(day_gz) | |
| for i, p in enumerate(pillars): | |
| if p[1] in day_kw: | |
| results[i].append("空亡") | |
| return results | |