tradecatlabs's picture
deploy FateCat HF Space free web workbench
acb2cec verified
Raw
History Blame Contribute Delete
13.8 kB
# -*- 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()