bySolar function

FunctionalAstrolabe bySolar(
  1. String solarDateStr,
  2. int timeIndex,
  3. GenderName gender, [
  4. bool fixLeap = true,
])

通过阳历获取星盘信息

@param solarDateStr 阳历日期【YYYY-M-D】 @param timeIndex 出生时辰序号【0~12】 @param gender 性别【男|女】 @param fixLeap 是否调整闰月情况【默认 true】,假入调整闰月,则闰月的前半个月算上个月,后半个月算下个月 @param language 输出语言 @returns 星盘信息

Implementation

FunctionalAstrolabe bySolar(
  String solarDateStr,
  int timeIndex,
  GenderName gender, [
  bool fixLeap = true,
]) {
  List<IFunctionalPalace> palaces = [];
  var heavenlyEarthlyBranch = getHeavenlyStemAndEarthlyBranchSolarDate(
    solarDateStr,
    timeIndex,
    getConfig().yearDivide,
  );
  var earthlyBranchOfYear = getMyEarthlyBranchNameFrom(
    heavenlyEarthlyBranch.yearly[1],
  );
  var heavenlyStemOfYear = getMyHeavenlyStemNameFrom(
    heavenlyEarthlyBranch.yearly[0],
  );
  var soulAndBody = getSoulAndBody(solarDateStr, timeIndex, fixLeap);
  final palaceNames = getPalaceNames(soulAndBody.soulIndex);
  final majorStars = getMajorStar(solarDateStr, timeIndex, fixLeap);
  final minorStars = getMinorStar(solarDateStr, timeIndex, fixLeap);
  final adjectiveStars = getAdjectiveStar(solarDateStr, timeIndex, fixLeap);
  final changSheng12 = getChangSheng12(
    solarDateStr,
    timeIndex,
    gender,
    fixLeap,
  );
  final boshi12 = getBoShi12(solarDateStr, gender);
  final yearly12Maps = getYearly12(
    solarDateStr,
  ); // {"jiangqian12": jiangqian12, "suiqian12": suiqian12};
  final jiangqian12 = yearly12Maps["jiangqian12"] ?? [];
  final suiqian12 = yearly12Maps["suiqian12"] ?? [];
  final horoscope = getHoroscope(solarDateStr, timeIndex, gender, fixLeap);
  final decadals = horoscope?["decades"];
  final ages = horoscope?["ages"];
  List<YearlyStemsBranches> yearlyStemsBranches = horoscope?["yearlies"];
  for (int i = 0; i < 12; i++) {
    final heavenlyStemOfPalace =
        heavenlyStems[fixIndex(
          heavenlyStems.indexOf(soulAndBody.heavenlyStenName.key) -
              soulAndBody.soulIndex +
              i,
          max: 10,
        )];
    final earthlyBranchOfPalace = earthlyBranches[fixIndex(2 + i)];
    bool isOriginalPalace =
        !["ziEarthly", "chouEarthly"].contains(earthlyBranchOfPalace) &&
        heavenlyStemOfPalace == heavenlyStemOfYear.key;
    final filerMajorStars =
        majorStars[i] +
        minorStars[i]
            .where((e) => ['luCun', 'tianMa'].contains(e.type.key))
            .toList();
    final yealyAges =
        yearlyStemsBranches
            .firstWhere((e) => e.earthlyBranchName.key == earthlyBranchOfPalace)
            .ages;
    palaces.add(
      FunctionalPalace(
        Palace(
          index: i,
          name: palaceNames[i],
          isBodyPalace: soulAndBody.bodyIndex == i,
          isOriginalPalace: isOriginalPalace,
          heavenlySten: getMyHeavenlyStemNameFrom(heavenlyStemOfPalace),
          earthlyBranch: getMyEarthlyBranchNameFrom(earthlyBranchOfPalace),
          majorStars: filerMajorStars,
          minorStars:
              minorStars[i]
                  .where((star) => !['luCun', 'tianMa'].contains(star.type.key))
                  .toList(),
          adjectiveStars: adjectiveStars[i],
          changShen12: changSheng12[i],
          boShi12: boshi12[i],
          jiangQian12: jiangqian12[i],
          suiQian12: suiqian12[i],
          decadal: decadals[i],
          ages: ages[i],
          yearlies: yealyAges,
        ),
      ),
    );
  }

  // 宫位从寅宫开始,而寅宫的索引位2,所以需要加2
  final earthlyBranchOfSoulPalace =
      earthlyBranches[fixIndex(soulAndBody.soulIndex + 2)];
  final earthlyBranchOfBoudyPalace =
      earthlyBranches[fixIndex(soulAndBody.bodyIndex + 2)];
  var soulStar = getStarNameFrom(
    earthlyBranchesMap[earthlyBranchOfSoulPalace]?["soul"],
  );
  final chineseDate = getHeavenlyStemAndEarthlyBranchSolarDate(
    solarDateStr,
    timeIndex,
    getConfig().yearDivide,
  );
  final lunarDate = solar2Lunar(solarDateStr);
  final result = FunctionalAstrolabe(
    Astrolabe(
      gender: gender.title,
      solarDate: solarDateStr,
      lunarDate: lunarDate.toChString(true),
      chineseDate: chineseDate.toString(),
      rawDates: LunarDateObj(lunarDate: lunarDate, chineseDate: chineseDate),
      time: chineseTimes[timeIndex].tr,
      timeRage: timeRanges[timeIndex],
      sign: getSignBySolarDate(solarDateStr),
      zodiac: getZodiacBySolarDate(solarDateStr).tr,
      earthlyBranchOfSoulPalace: getMyEarthlyBranchNameFrom(
        earthlyBranchOfSoulPalace,
      ),
      earthlyBranchOfBodyPalace: getMyEarthlyBranchNameFrom(
        earthlyBranchOfBoudyPalace,
      ),
      soul: getStarNameFrom(
        earthlyBranchesMap[earthlyBranchOfSoulPalace]?["soul"],
      ),
      body: getStarNameFrom(
        earthlyBranchesMap[earthlyBranchOfYear.key]?["body"],
      ),
      fiveElementClass: getFiveElementClass(
        soulAndBody.heavenlyStenName,
        soulAndBody.earthlyBranchName,
      ),
      palaces: palaces,
      copyright: "copyright @2024",
    ),
  );

  return result;
}