# -*- coding: utf-8 -*- from .util import LunarUtil class EightChar: """ 八字 """ MONTH_ZHI = ("", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥", "子", "丑") CHANG_SHENG = ("长生", "沐浴", "冠带", "临官", "帝旺", "衰", "病", "死", "墓", "绝", "胎", "养") __CHANG_SHENG_OFFSET = { "甲": 1, "丙": 10, "戊": 10, "庚": 7, "壬": 4, "乙": 6, "丁": 9, "己": 9, "辛": 0, "癸": 3 } def __init__(self, lunar): self.__sect = 2 self.__lunar = lunar @staticmethod def fromLunar(lunar): return EightChar(lunar) def toString(self): return self.getYear() + " " + self.getMonth() + " " + self.getDay() + " " + self.getTime() def __str__(self): return self.toString() def getSect(self): return self.__sect def setSect(self, sect): self.__sect = sect def getYear(self): """ 获取年柱 :return: 年柱 """ return self.__lunar.getYearInGanZhiExact() def getYearGan(self): """ 获取年干 :return: 天干 """ return self.__lunar.getYearGanExact() def getYearZhi(self): """ 获取年支 :return: 地支 """ return self.__lunar.getYearZhiExact() def getYearHideGan(self): """ 获取年柱地支藏干,由于藏干分主气、余气、杂气,所以返回结果可能为1到3个元素 :return: 天干 """ return LunarUtil.ZHI_HIDE_GAN.get(self.getYearZhi()) def getYearWuXing(self): """ 获取年柱五行 :return: 五行 """ return LunarUtil.WU_XING_GAN.get(self.getYearGan()) + LunarUtil.WU_XING_ZHI.get(self.getYearZhi()) def getYearNaYin(self): """ 获取年柱纳音 :return: 纳音 """ return LunarUtil.NAYIN.get(self.getYear()) def getYearShiShenGan(self): """ 获取年柱天干十神 :return: 十神 """ return LunarUtil.SHI_SHEN.get(self.getDayGan() + self.getYearGan()) def __getShiShenZhi(self, zhi): hide_gan = LunarUtil.ZHI_HIDE_GAN.get(zhi) arr = [] for gan in hide_gan: arr.append(LunarUtil.SHI_SHEN.get(self.getDayGan() + gan)) return arr def getYearShiShenZhi(self): """ 获取年柱地支十神,由于藏干分主气、余气、杂气,所以返回结果可能为1到3个元素 :return: 十神 """ return self.__getShiShenZhi(self.getYearZhi()) def getDayGanIndex(self): return self.__lunar.getDayGanIndexExact2() if 2 == self.__sect else self.__lunar.getDayGanIndexExact() def getDayZhiIndex(self): return self.__lunar.getDayZhiIndexExact2() if 2 == self.__sect else self.__lunar.getDayZhiIndexExact() def __getDiShi(self, zhi_index): index = self.__CHANG_SHENG_OFFSET.get(self.getDayGan()) + (zhi_index if self.getDayGanIndex() % 2 == 0 else -zhi_index) if index >= 12: index -= 12 if index < 0: index += 12 return EightChar.CHANG_SHENG[index] def getYearDiShi(self): """ 获取年柱地势(长生十二神) :return: 地势 """ return self.__getDiShi(self.__lunar.getYearZhiIndexExact()) def getMonth(self): """ 获取月柱 :return: 月柱 """ return self.__lunar.getMonthInGanZhiExact() def getMonthGan(self): """ 获取月干 :return: 天干 """ return self.__lunar.getMonthGanExact() def getMonthZhi(self): """ 获取月支 :return: 地支 """ return self.__lunar.getMonthZhiExact() def getMonthHideGan(self): """ 获取月柱地支藏干,由于藏干分主气、余气、杂气,所以返回结果可能为1到3个元素 :return: 天干 """ return LunarUtil.ZHI_HIDE_GAN.get(self.getMonthZhi()) def getMonthWuXing(self): """ 获取月柱五行 :return: 五行 """ return LunarUtil.WU_XING_GAN.get(self.getMonthGan()) + LunarUtil.WU_XING_ZHI.get(self.getMonthZhi()) def getMonthNaYin(self): """ 获取月柱纳音 :return: 纳音 """ return LunarUtil.NAYIN.get(self.getMonth()) def getMonthShiShenGan(self): """ 获取月柱天干十神 :return: 十神 """ return LunarUtil.SHI_SHEN.get(self.getDayGan() + self.getMonthGan()) def getMonthShiShenZhi(self): """ 获取月柱地支十神,由于藏干分主气、余气、杂气,所以返回结果可能为1到3个元素 :return: 十神 """ return self.__getShiShenZhi(self.getMonthZhi()) def getMonthDiShi(self): """ 获取月柱地势(长生十二神) :return: 地势 """ return self.__getDiShi(self.__lunar.getMonthZhiIndexExact()) def getDay(self): """ 获取日柱 :return: 日柱 """ return self.__lunar.getDayInGanZhiExact2() if 2 == self.__sect else self.__lunar.getDayInGanZhiExact() def getDayGan(self): """ 获取日干 :return: 天干 """ return self.__lunar.getDayGanExact2() if 2 == self.__sect else self.__lunar.getDayGanExact() def getDayZhi(self): """ 获取日支 :return: 地支 """ return self.__lunar.getDayZhiExact2() if 2 == self.__sect else self.__lunar.getDayZhiExact() def getDayHideGan(self): """ 获取日柱地支藏干,由于藏干分主气、余气、杂气,所以返回结果可能为1到3个元素 :return: 天干 """ return LunarUtil.ZHI_HIDE_GAN.get(self.getDayZhi()) def getDayWuXing(self): """ 获取日柱五行 :return: 五行 """ return LunarUtil.WU_XING_GAN.get(self.getDayGan()) + LunarUtil.WU_XING_ZHI.get(self.getDayZhi()) def getDayNaYin(self): """ 获取日柱纳音 :return: 纳音 """ return LunarUtil.NAYIN.get(self.getDay()) def getDayShiShenGan(self): """ 获取日柱天干十神,也称日元、日干 :return: 十神 """ return "日主" def getDayShiShenZhi(self): """ 获取日柱地支十神,由于藏干分主气、余气、杂气,所以返回结果可能为1到3个元素 :return: 十神 """ return self.__getShiShenZhi(self.getDayZhi()) def getDayDiShi(self): """ 获取日柱地势(长生十二神) :return: 地势 """ return self.__getDiShi(self.getDayZhiIndex()) def getTime(self): """ 获取时柱 :return: 时柱 """ return self.__lunar.getTimeInGanZhi() def getTimeGan(self): """ 获取时干 :return: 天干 """ return self.__lunar.getTimeGan() def getTimeZhi(self): """ 获取时支 :return: 地支 """ return self.__lunar.getTimeZhi() def getTimeHideGan(self): """ 获取时柱地支藏干,由于藏干分主气、余气、杂气,所以返回结果可能为1到3个元素 :return: 天干 """ return LunarUtil.ZHI_HIDE_GAN.get(self.getTimeZhi()) def getTimeWuXing(self): """ 获取时柱五行 :return: 五行 """ return LunarUtil.WU_XING_GAN.get(self.getTimeGan()) + LunarUtil.WU_XING_ZHI.get(self.getTimeZhi()) def getTimeNaYin(self): """ 获取时柱纳音 :return: 纳音 """ return LunarUtil.NAYIN.get(self.getTime()) def getTimeShiShenGan(self): """ 获取时柱天干十神 :return: 十神 """ return LunarUtil.SHI_SHEN.get(self.getDayGan() + self.getTimeGan()) def getTimeShiShenZhi(self): """ 获取时柱地支十神,由于藏干分主气、余气、杂气,所以返回结果可能为1到3个元素 :return: 十神 """ return self.__getShiShenZhi(self.getTimeZhi()) def getTimeDiShi(self): """ 获取时柱地势(长生十二神) :return: 地势 """ return self.__getDiShi(self.__lunar.getTimeZhiIndex()) def getTaiYuan(self): """ 获取胎元 :return: 胎元 """ gan_index = self.__lunar.getMonthGanIndexExact() + 1 if gan_index >= 10: gan_index -= 10 zhi_index = self.__lunar.getMonthZhiIndexExact() + 3 if zhi_index >= 12: zhi_index -= 12 return LunarUtil.GAN[gan_index + 1] + LunarUtil.ZHI[zhi_index + 1] def getTaiYuanNaYin(self): """ 获取胎元纳音 :return: 纳音 """ return LunarUtil.NAYIN.get(self.getTaiYuan()) def getTaiXi(self): """ 获取胎息 :return: 胎息 """ gan_index = self.__lunar.getDayGanIndexExact2() if 2 == self.__sect else self.__lunar.getDayGanIndexExact() zhi_index = self.__lunar.getDayZhiIndexExact2() if 2 == self.__sect else self.__lunar.getDayZhiIndexExact() return LunarUtil.HE_GAN_5[gan_index] + LunarUtil.HE_ZHI_6[zhi_index] def getTaiXiNaYin(self): """ 获取胎息纳音 :return: 纳音 """ return LunarUtil.NAYIN.get(self.getTaiXi()) def getMingGong(self): """ 获取命宫 :return: 命宫 """ month_zhi_index = 0 time_zhi_index = 0 month_zhi = self.getMonthZhi() time_zhi = self.getTimeZhi() for i in range(0, len(EightChar.MONTH_ZHI)): zhi = EightChar.MONTH_ZHI[i] if month_zhi == zhi: month_zhi_index = i break for i in range(0, len(EightChar.MONTH_ZHI)): zhi = EightChar.MONTH_ZHI[i] if time_zhi == zhi: time_zhi_index = i break offset = month_zhi_index + time_zhi_index if offset >= 14: offset = 26 - offset else: offset = 14 - offset gan_index = (self.__lunar.getYearGanIndexExact() + 1) * 2 + offset while gan_index > 10: gan_index -= 10 return LunarUtil.GAN[gan_index] + EightChar.MONTH_ZHI[offset] def getMingGongNaYin(self): """ 获取命宫纳音 :return: 纳音 """ return LunarUtil.NAYIN.get(self.getMingGong()) def getShenGong(self): """ 获取身宫 :return: 身宫 """ month_zhi_index = 0 time_zhi_index = 0 month_zhi = self.getMonthZhi() time_zhi = self.getTimeZhi() for i in range(0, len(EightChar.MONTH_ZHI)): zhi = EightChar.MONTH_ZHI[i] if month_zhi == zhi: month_zhi_index = i break for i in range(0, len(LunarUtil.ZHI)): zhi = LunarUtil.ZHI[i] if time_zhi == zhi: time_zhi_index = i break offset = month_zhi_index + time_zhi_index if offset > 12: offset -= 12 gan_index = (self.__lunar.getYearGanIndexExact() + 1) * 2 + offset while gan_index > 10: gan_index -= 10 return LunarUtil.GAN[gan_index] + EightChar.MONTH_ZHI[offset] def getShenGongNaYin(self): """ 获取身宫纳音 :return: 纳音 """ return LunarUtil.NAYIN.get(self.getShenGong()) def getLunar(self): return self.__lunar def getYun(self, gender, sect=1): """ 获取运 :param gender: 性别:1男,0女 :param sect 流派:1按天数和时辰数计算,3天1年,1天4个月,1时辰10天;2按分钟数计算 :return: 运 """ from .eightchar import Yun return Yun(self, gender, sect) def getYearXun(self): """ 获取年柱所在旬 :return: 旬 """ return self.__lunar.getYearXunExact() def getYearXunKong(self): """ 获取年柱旬空(空亡) :return: 旬空(空亡) """ return self.__lunar.getYearXunKongExact() def getMonthXun(self): """ 获取月柱所在旬 :return: 旬 """ return self.__lunar.getMonthXunExact() def getMonthXunKong(self): """ 获取月柱旬空(空亡) :return: 旬空(空亡) """ return self.__lunar.getMonthXunKongExact() def getDayXun(self): """ 获取日柱所在旬 :return: 旬 """ return self.__lunar.getDayXunExact2() if 2 == self.__sect else self.__lunar.getDayXunExact() def getDayXunKong(self): """ 获取日柱旬空(空亡) :return: 旬空(空亡) """ return self.__lunar.getDayXunKongExact2() if 2 == self.__sect else self.__lunar.getDayXunKongExact() def getTimeXun(self): """ 获取时柱所在旬 :return: 旬 """ return self.__lunar.getTimeXun() def getTimeXunKong(self): """ 获取时柱旬空(空亡) :return: 旬空(空亡) """ return self.__lunar.getTimeXunKong()