星盘对象
Astrolabe 的字段、定位方法,以及三方四正与夹宫。
Astrolabe 是排盘的产物,也是一切查询的入口。它持有十二宫的全部数据,
以及四柱、命主身主、五行局这些盘级信息。
let chart = by_solar("2000-8-16", 2, Gender::Female, true, Language::ZhCN, Config::default())?;本页示例统一用 Language::ZhCN 排盘,因此输出里的展示值都是中文。
换成别的语言只改这些展示串,*_key 标识与所有判断方法的结果不变。
字段
palace
用途 按索引、宫名、身宫或来因宫取一宫。
斗数含义 十二宫是斗数的骨架。命宫定下后,其余十一宫按固定顺序逆时针排开。 「身宫」是十二宫之一同时被标记的那一宫,代表后天着力处; 「来因宫」是宫干与生年干相同的那一宫,代表事情的起因。
签名
pub fn palace(&self, target: impl Into<PalaceTarget>) -> Option<PalaceRef<'_>>参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
target | impl Into<PalaceTarget> | 是 | — | 四种写法见下表 |
PalaceTarget 的四个变体都有 From 实现,调用时直接写值即可:
| 写法 | 例子 | 含义 |
|---|---|---|
| 索引 | chart.palace(0) | 宫位索引 0–11,0 为寅宫 |
| 宫名 | chart.palace(Palace::Soul) | 十二宫名之一 |
| 身宫 | chart.palace(PalaceTarget::Body) | 带身宫标记的那一宫 |
| 来因宫 | chart.palace(PalaceTarget::Original) | 宫干与生年干相同的那一宫 |
返回值 Option<PalaceRef<'_>>。索引越界返回 None;宫名、身宫、来因宫三种写法在任何一张盘上都能定位到,不会是 None。
示例
let zh = Language::ZhCN;
let soul = chart.palace(Palace::Soul).unwrap();
println!("{} {}{}", translate_palace(soul.name, zh),
translate_heavenly_stem(soul.heavenly_stem, zh),
translate_earthly_branch(soul.earthly_branch, zh));
let body = chart.palace(PalaceTarget::Body).unwrap();
println!("身宫落在 {}", translate_palace(body.name, zh));
let original = chart.palace(PalaceTarget::Original).unwrap();
println!("来因宫是 {}", translate_palace(original.name, zh));
println!("寅宫是 {}", translate_palace(chart.palace(0).unwrap().name, zh));PalaceData::name 的类型是 Palace 枚举而非字符串,不能直接用 {} 打印——
枚举是语言无关标识,展示时经 translate_palace 转成当前语言的文本。
heavenly_stem、earthly_branch、five_elements_class 等字段同理。
输出
命宫 壬午
身宫落在 官禄
来因宫是 夫妻
寅宫是 财帛边界与陷阱
star
用途 按标识找到一颗星,得到能回溯所在宫的视图。
签名
pub fn star(&self, key: StarKey) -> Option<StarRef<'_>>参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
key | StarKey | 是 | — | 星耀标识,如 StarKey::ZiweiMaj |
返回值 Option<StarRef<'_>>。该星不在这张盘上时返回 None。
示例
let zh = Language::ZhCN;
let ziwei = chart.star(StarKey::ZiweiMaj).unwrap();
println!("{} 在 {}", ziwei.name, translate_palace(ziwei.palace().name, zh));
println!("对宫是 {}", translate_palace(ziwei.opposite_palace().name, zh));
println!("亮度 {:?} 四化 {:?}", ziwei.brightness, ziwei.mutagen);Star::name 是 String(排盘时已按语言翻译好),可以直接打印;
宫名 PalaceData::name 是枚举,要经 translate_palace。
输出
紫微 在 命宫
对宫是 迁移
亮度 Some(Miao) 四化 None边界与陷阱
只在主星、辅星、杂耀三组里查找。长生十二神、博士十二神、岁前与将前十二神
是每宫一个的标记而非星耀列表,用 palace.changsheng12 一类字段直接取。
surrounded_palaces
用途 取目标宫的三方四正。
斗数含义 三方四正是斗数最常用的取象范围:本宫、对宫(本宫 +6)、 官禄位(本宫 +4)、财帛位(本宫 +8)。四个宫合起来看,而不只看本宫, 是因为对宫与三合宫的星耀同样作用于本宫的事。
签名
pub fn surrounded_palaces(&self, target: impl Into<PalaceTarget>) -> Option<SurroundedPalaces<'_>>参数 同 palace,四种定位写法都支持。
返回值 Option<SurroundedPalaces<'_>>,含 target / opposite / wealth / career
四个 &PalaceData(不是 PalaceRef,字段可直接读,但没有对宫、飞星那些需要星盘上下文的方法)。
判断方法见三方四正。
示例
let zh = Language::ZhCN;
let sp = chart.surrounded_palaces(Palace::Soul).unwrap();
println!("{} / {} / {} / {}",
translate_palace(sp.target.name, zh), translate_palace(sp.opposite.name, zh),
translate_palace(sp.wealth.name, zh), translate_palace(sp.career.name, zh));
println!("三方四正见紫微: {}", sp.have(&[StarKey::ZiweiMaj]));输出
命宫 / 迁移 / 财帛 / 官禄
三方四正见紫微: trueis_surrounded / is_surrounded_one_of / not_surrounded
用途 直接在星盘上判断某宫的三方四正里有没有指定星耀,省去先取三方四正的一步。
签名
pub fn is_surrounded(&self, target: impl Into<PalaceTarget>, stars: &[StarKey]) -> bool
pub fn is_surrounded_one_of(&self, target: impl Into<PalaceTarget>, stars: &[StarKey]) -> bool
pub fn not_surrounded(&self, target: impl Into<PalaceTarget>, stars: &[StarKey]) -> bool参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
target | impl Into<PalaceTarget> | 是 | — | 定位方式同 palace |
stars | &[StarKey] | 是 | — | 星耀标识列表 |
返回值
| 方法 | 语义 |
|---|---|
is_surrounded | 列表中每一颗都在三方四正里 |
is_surrounded_one_of | 列表中至少一颗在三方四正里 |
not_surrounded | 列表中一颗都不在三方四正里 |
示例
use x_iztro::StarKey::*;
println!("{}", chart.is_surrounded(Palace::Soul, &[ZiweiMaj, TianxiangMaj]));
println!("{}", chart.is_surrounded_one_of(Palace::Soul, &[QishaMaj, PojunMaj]));
println!("{}", chart.not_surrounded(Palace::Soul, &[HuoxingMin]));输出
true
false
true命宫只坐紫微,天相在三方之一的财帛宫,因此第一行为 true;
七杀与破军都不在这四宫内,第二行为 false。
边界与陷阱
空列表的返回值
stars 传空切片时,is_surrounded 与 not_surrounded 返回 true
(「所有元素都满足」与「没有元素不满足」对空集都成立),
is_surrounded_one_of 返回 false。调用前先确认列表非空。
flanking_palaces
用途 取目标宫的夹宫:盘上紧邻它前后的两宫。
斗数含义 「羊陀夹忌」「日月夹命」这类说法看的就是夹宫。 夹宫与三方四正是两条不重叠的线索:三方四正问的是同一组能量彼此呼应, 夹宫问的是这一宫左右两侧的处境。
签名
pub fn flanking_palaces(&self, target: impl Into<PalaceTarget>) -> Option<FlankingPalaces<'_>>参数 同 palace,四种定位写法都支持。
返回值 Option<FlankingPalaces<'_>>,两个字段:
| 字段 | 相对目标宫 | 类型 | 说明 |
|---|---|---|---|
previous | -1 | &PalaceData | 前一宫 |
next | +1 | &PalaceData | 后一宫 |
十二宫首尾相连,索引对 12 回绕:第 0 宫的前一宫是第 11 宫。
另有 astrolabe() 取回两宫所属的星盘。
五个判断方法与三方四正同名同义,只是作用范围换成这两宫:
| 方法 | 语义 |
|---|---|
have(&[StarKey]) -> bool | 两宫合起来含列表中每一颗 |
not_have(&[StarKey]) -> bool | 两宫一颗都不含 |
have_one_of(&[StarKey]) -> bool | 两宫合起来至少含一颗 |
have_mutagen(Mutagen) -> bool | 两宫中有任一宫带该生年四化 |
not_have_mutagen(Mutagen) -> bool | 两宫都不带 |
示例
let zh = Language::ZhCN;
let f = chart.flanking_palaces(Palace::Soul).unwrap();
println!("{} / {}", translate_palace(f.previous.name, zh), translate_palace(f.next.name, zh));
println!("{}", f.have(&[StarKey::TianjiMaj, StarKey::TuoluoMin]));
println!("{}", f.have_one_of(&[StarKey::HuoxingMin]));
let w = chart.flanking_palaces(Palace::Wealth).unwrap();
println!("{} / {}", translate_palace(w.previous.name, zh), translate_palace(w.next.name, zh));
println!("{} {}", w.have_mutagen(Mutagen::Lu), w.have_mutagen(Mutagen::Ji));输出
兄弟 / 父母
true
false
疾厄 / 子女
true true命宫在午,夹它的是兄弟(巳)与父母(未)。天机坐兄弟、陀罗坐父母,分处两宫,
have 仍然成立;火星坐夫妻,不在这两宫之内,因此 have_one_of 为 false。
财帛在寅,夹它的疾厄坐天同、子女坐太阳,这张盘生年干庚使太阳化禄、天同化忌,
于是禄与忌两问都为 true。
边界与陷阱
horoscope / horoscope_now
用途 以本盘为起点计算目标日期的运限。
签名
pub fn horoscope(&self, target_date: &str, target_time_index: u8) -> Result<HoroscopeRef<'_>, IztroError>
pub fn horoscope_now(&self) -> Result<HoroscopeRef<'_>, IztroError>参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
target_date | &str | 是 | — | 目标公历日期,格式 YYYY-M-D |
target_time_index | u8 | 是 | — | 目标时辰索引 0–12,决定流时 |
horoscope_now 取本地时钟的当前日期与当前时辰,无参数。
返回值 HoroscopeRef<'_>——持有本盘的运限视图,六个层级的宫位查询不必再传星盘。
详见运限对象。
示例
let zh = Language::ZhCN;
let h = chart.horoscope("2025-6-1", 0)?;
println!("大限 {}{}",
translate_heavenly_stem(h.decadal.heavenly_stem, zh),
translate_earthly_branch(h.decadal.earthly_branch, zh));
println!("流年 {}{}",
translate_heavenly_stem(h.yearly.heavenly_stem, zh),
translate_earthly_branch(h.yearly.earthly_branch, zh));decadal / monthly / daily / hourly 是 HoroscopeItem,干支直接读;
yearly 与 age 各自多带一项自己的数据(通用字段收在 base 里),
但两者都实现了 Deref,h.yearly.heavenly_stem 同样直接可读。
输出
大限 庚辰
流年 乙巳to_text
用途 星盘的语义化文本:面向语言模型与人的完整描述,Markdown 子集。
签名
pub fn to_text(&self) -> String按排盘语言输出;要指定语言用自由函数 text::astrolabe_to_text(astrolabe, lang)——
lang 可以与排盘语言不同,全部字段按标识以目标语言重翻。
单宫与三方四正见 PalaceRef::to_text() / SurroundedPalaces::to_text()。
完整格式见语义化文本。
示例
for line in chart.to_text().lines().take(5) {
println!("{line}");
}输出
# 命盘 2000-8-16 寅时 女
## 基本信息
- 阳历: 2000-8-16 · 农历: 二〇〇〇年七月十七 · 时辰: 寅时 (03:00~05:00)
- 四柱: 庚辰 甲申 丙午 庚寅 · 生肖: 龙 · 星座: 狮子座to_text_with
用途 to_text 的同一份文本,按 TextOptions 附释义:
格局列表之后紧跟格局释义,每宫事实之后紧跟该宫星耀释义(同宫主星组合在前),
文末附 ## 四化释义。事实部分与 to_text 逐行相同。
签名
pub fn to_text_with(&self, opts: &TextOptions) -> String参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
opts | &TextOptions | 是 | — | 输出选项;TextOptions::new().knowledge(pack) 带释义,TextOptions::default() 与 to_text 等价 |
按排盘语言输出;要指定语言用自由函数 text::astrolabe_to_text_with(astrolabe, opts, lang)。
条目标题按 lang 翻译,正文是包里的原文。取材规则与
KnowledgePack::for_astrolabe 相同,
插入位置见带释义的文本。
示例
let pack = KnowledgePack::builtin(Language::ZhCN).unwrap();
let text = chart.to_text_with(&TextOptions::new().knowledge(pack));
println!("{} {}", chart.to_text().chars().count(), text.chars().count());
println!("{}", text.lines().filter(|l| l.starts_with("## ")).collect::<Vec<_>>().join(" "));输出
3389 20767
## 基本信息 ## 十二宫总览 ## 格局 ## 十二宫 ## 四化释义to_dto
用途 把星盘转成与 JS iztro 字段契约一致的序列化结构。
签名
pub fn to_dto(&self) -> AstrolabeDto返回值 x_iztro::dto::AstrolabeDto——camelCase 键、值按排盘语言翻译,
另带 *Key 语言无关标识与排盘上下文(genderKey / timeIndex / fixLeap / language / config)。
字段清单见数据结构。
示例
let dto = chart.to_dto();
let json = serde_json::to_string(&dto)?;
let v: serde_json::Value = serde_json::from_str(&json)?;
println!("{} {}", v["solarDate"], v["palaces"][4]["nameKey"]);
println!("{}", v["config"]["yearDivide"]);输出
"2000-8-16" "soulPalace"
"normal"边界与陷阱
DTO 是给跨语言绑定与前端用的。Rust 侧做分析请直接用 Astrolabe——
它有全部查询方法,DTO 只有数据。想一步拿到 JSON 字符串用
by_solar_json。
Config 的 overrides(自定义四化与亮度表)不进 DTO:它是排盘输入而非结果,
回显会破坏与 JS iztro 的字段契约。