Skip to main content

Model

Struct Model 

Source
pub struct Model {
Show 36 fields pub nodes: Vec<Node>, pub elements: Vec<ElementData>, pub sections: Vec<Section>, pub materials: Vec<Material>, pub stories: Vec<Story>, pub axes: Vec<AxisGroup>, pub floor_regions: Vec<FloorRegion>, pub constraints: Vec<Constraint>, pub load_cases: Vec<LoadCase>, pub combinations: Vec<LoadCombination>, pub vibration_cases: Vec<VibrationCase>, pub lumped_vibration_cases: Vec<LumpedVibrationCase>, pub generated_masters: Vec<NodeId>, pub mass_method: MassMethod, pub slab_thickness: f64, pub load_cfg: Option<LoadCfg>, pub wall_attrs: Vec<WallAttr>, pub multi_opening_mode: MultiOpeningMode, pub stress_cfg: StressAnalysisCfg, pub steel_design_attrs: Vec<SteelDesignAttr>, pub brb_attrs: Vec<BrbAttr>, pub pca_attrs: Vec<PcaBeamAttr>, pub isolator_attrs: Vec<IsolatorAttr>, pub member_hysteresis_attrs: Vec<MemberHysteresisAttr>, pub damper_attrs: Vec<DamperAttr>, pub member_detail_attrs: Vec<MemberDetailAttr>, pub unassigned_joists: Vec<SecondaryMember>, pub unassigned_posts: Vec<SecondaryMember>, pub beam_groups: Vec<Vec<ElemId>>, pub damper_defs: Vec<DamperDef>, pub beam_torsion: BeamTorsionMode, pub panel_zone: PanelZoneMode, pub wall_regions: Vec<WallRegion>, pub slabs: Vec<Slab>, pub wall_plates: Vec<WallPlate>, pub dof_map: DofMap,
}

Fields§

§nodes: Vec<Node>§elements: Vec<ElementData>§sections: Vec<Section>§materials: Vec<Material>§stories: Vec<Story>§axes: Vec<AxisGroup>

通り芯(各通りを識別するための呼称。AxisGroup)。構造計算には 用いない表示・識別専用のデータで、解析結果・設計結果には影響しない。

§floor_regions: Vec<FloorRegion>§constraints: Vec<Constraint>§load_cases: Vec<LoadCase>§combinations: Vec<LoadCombination>§vibration_cases: Vec<VibrationCase>

立体時刻歴応答解析の振動ケース(実行時に upsert。静的荷重ケースとは別)。

§lumped_vibration_cases: Vec<LumpedVibrationCase>

質点系時刻歴応答解析の振動ケース。

§generated_masters: Vec<NodeId>

階の自動生成が作る剛床代表節点(慣性力重心に置く仮想節点)の ID。 構造節点と区別するために保持し、再生成時に再利用する。

§mass_method: MassMethod

動的解析の質量モデルの方式(MassMethod)。階の自動生成が剛床マスターへ 与える質点質量の算定と、質量行列組立での部材密度質量の要否を規定する。 旧スキーマは補正質点方式(従来の密度質量+節点質量と同じ組立)扱い。

§slab_thickness: f64

剛性計算用の床スラブ厚 [mm](建物全体で一律。スラブ協力幅による梁剛性 増大の算定に用いる。RC 規準)。0 以下でスラブ協力幅による梁剛性増大を無効化(既定)。

§load_cfg: Option<LoadCfg>

自重算定の付加設定(鉄骨重量割増率・部材付加線重量)。None は既定値。

§wall_attrs: Vec<WallAttr>

壁要素の付帯属性(開口・柱際スリット)。

§multi_opening_mode: MultiOpeningMode

複数開口の取り扱い(建物一律。耐震壁の開口。RC 規準)。 剛性の開口低減・耐震壁判定・検定への開口供給に適用する (自重控除は常に生の開口面積和)。既定は「等価開口とする」。

§stress_cfg: StressAnalysisCfg

応力解析の計算条件(令82条の応力解析。長期軸力を負担させない部材の指定)。

§steel_design_attrs: Vec<SteelDesignAttr>

S 造部材の断面検定用属性(継手部・スカラップ欠損、横座屈長さ指定。 鋼構造設計規準)。

§brb_attrs: Vec<BrbAttr>

座屈補剛ブレース(BRB)の断面検定用属性(メーカー許容値。 各メーカーの製品技術資料)。

§pca_attrs: Vec<PcaBeamAttr>

PCa(プレキャスト)梁の水平接合面検定用属性(水平接合面のせん断摩擦検定)。

§isolator_attrs: Vec<IsolatorAttr>

免震支承材の非線形特性(ElementKind::Isolator 要素、各免震部材指針)。

§member_hysteresis_attrs: Vec<MemberHysteresisAttr>

部材の履歴則の個別指定(各履歴則の原典)。 未指定の部材は構造種別ごとの既定(default_member_hysteresis)に従う。

§damper_attrs: Vec<DamperAttr>

制振ダンパー要素(ElementKind::Damper)の特性(各制振部材の力学モデル)。

§member_detail_attrs: Vec<MemberDetailAttr>

部材の付帯情報(端部ハンチ・継手位置)。剛性・応力解析には影響しない (設計書 §6.2。剛性は基準断面のまま)。断面算定の検定位置の追加 (ハンチ端・継手位置、§6.2.3)と数量拾いに用いる。

§unassigned_joists: Vec<SecondaryMember>

所属未割当の小梁(rebuild_floor_regions でどの床領域にも入らなかったもの)。

§unassigned_posts: Vec<SecondaryMember>

所属未割当の間柱(rebuild_wall_regions でどの壁領域にも入らなかったもの)。

§beam_groups: Vec<Vec<ElemId>>

一本部材の指定(断面検定の採用応力。一本部材指定時の採用応力の扱い)。 各エントリは軸方向に連続する梁要素の ID を並び順で持ち、 断面検定の採用応力(端部・中央モーメント、部材長、内法長、せん断スパン比 代表値)をグループ 1 本の部材として評価する。要素の解析(剛性・内力)は 分割部材のまま行い、検定の文脈だけを合成する。

§damper_defs: Vec<DamperDef>

名前付き制振ダンパー定義(プリセットライブラリ)。ElemId への参照を 持たないため、要素の追加・削除に伴う ID 繰上げ/繰下げ(shift_elem_attr_refstake_elem_attrsrestore_elem_attrs)の対象外。部材への割当は DamperDef::props の値コピー(Model::damper_attrs へ追加)で行う。

msgpack(.scz)は位置ベース配列で直列化されるため、新しいフィールドは 必ずこの構造体の末尾(dof_map の手前)へ追加すること。中間に挿入すると 旧バージョンで保存された .scz の後続フィールドの値がずれて読み込まれ、 #[serde(default)] があっても救済されない(default 補完は末尾欠損のみ有効)。

§beam_torsion: BeamTorsionMode

梁(水平材)のねじり剛性の扱い(建物一律。既定は i 端ねじれ解放)。 旧スキーマ(フィールド無し)は既定=ReleaseIEnd で補完される。

§panel_zone: PanelZoneMode

仕口パネル(柱梁接合部パネル)のモデル化(建物一律。既定はモデル化する)。 旧スキーマ(フィールド無し)は既定=Model で補完されるため、旧ファイルも パネルをモデル化した状態で開く。

§wall_regions: Vec<WallRegion>

壁領域(壁版と付属間柱のグループ)。旧スキーマは空として補完。

§slabs: Vec<Slab>

床板(版)。大梁または小梁で囲まれた版、または主架構に取り付く版 (片持ち・バルコニー・出隅)ごとに 1 つ。floor_regions が「大梁の1スパン区画」 であるのに対し、こちらが版の仕様(厚さ・材料・仕上げ荷重・室用途)を持つ (Slab)。取り付く床板はどの FloorRegion からも参照されないことがある。 旧スキーマ(フィールド無し)は空として補完。

§wall_plates: Vec<WallPlate>

壁版(版仕様。断面・開口。WallPlate)。柱・梁が囲む鉛直構面内の版、 または主架構・床領域に取り付く版(パラペット・腰壁・垂れ壁・自立壁)ごとに 1 つ。 wall_regions が「柱・梁が囲む鉛直構面内の閉領域」であるのに対し、こちらが 版の仕様を持つ(床の floor_regions/slabs と同じ関係)。取り付く壁版は どの WallRegion からも参照されないことがある。旧スキーマは空として補完。

§dof_map: DofMap

Implementations§

Source§

impl Model

Source

pub fn validate(&self) -> Result<(), CoreError>

Source

pub fn node(&self, id: NodeId) -> Option<&Node>

節点 ID から節点を引く。存在しなければ None

nodes[i].id == NodeId(i)(節点の削除・挿入で squid-n-edit が維持する 不変条件)を利用して添字で引くため O(1)。不変条件が崩れたモデルでも 正しく引けるよう、添字の ID が一致しない場合のみ線形探索へ落とす。

ID から実体を引くところは常にこのメソッドを使う(各所での線形探索は、 不変条件が成り立つのに O(n) を払ううえ、探索規則が散らばる)。

Source

pub fn element(&self, id: ElemId) -> Option<&ElementData>

要素 ID から要素を引く。存在しなければ None。 引き方は Model::node と同じ(elements[i].id == ElemId(i))。

Source

pub fn section(&self, id: SectionId) -> Option<&Section>

断面 ID から断面を引く。存在しなければ None。 引き方は Model::node と同じ(sections[i].id == SectionId(i))。

この不変条件は Model::validate が要素・二次部材からの参照ごとに 検証しており(sections[sid.index()].id != sid をダングリング参照として弾く)、 Model::element_section も添字で引いている。ID から断面を引くところは 常にこのメソッドを使う。

Source

pub fn node_in_use(&self, id: NodeId) -> bool

指定した節点が部材・節点荷重・階・床・拘束のいずれかから参照されているかを判定する。 参照中の節点を削除すると参照が壊れる(ダングリング)ため、削除前にこれで確認する。

Source

pub fn node_in_use_excluding_elem(&self, id: NodeId, excl: ElemId) -> bool

Model::node_in_use と同様だが、要素からの参照は excl を除いて判定する (支点免震要素の接地節点が「この要素以外から孤立しているか」の判定に使う。 excl 要素自身が id を参照していても、それだけでは「使用中」とみなさない)。

Source

pub fn support_isolator_ends(&self, elem: ElemId) -> Option<(NodeId, NodeId)>

要素が「支点免震要素」(squid-n-edit の PlaceSupportIsolator が生成する配置形。 対象節点と同一座標の接地節点との間に設置する零長 Isolator 要素)であるかを判定する。 該当すれば (上部節点, 接地節点) を返す(上部節点=支点として振る舞う対象節点、 接地節点=自動生成された restraint=FIXED の孤立節点)。

条件: ElementKind::Isolator の2節点要素で、両端が同一座標(零長)かつ、 一方の節点が restraint=FIXED でこの要素以外から参照されていない(孤立)こと。 通常の(支点ではない)免震要素はこの条件を満たさず None を返す。

Source

pub fn eq_ignoring_dofmap(&self, other: &Self) -> bool

Source

pub fn damper_props(&self, elem: ElemId) -> Option<DamperProps>

ダンパー要素の特性を返す(Model::damper_attrs から要素 ID で検索)。

Source

pub fn set_damper_props( &mut self, elem: ElemId, props: Option<DamperProps>, ) -> Option<DamperProps>

ダンパー要素の特性を設定/解除する。None を渡すと指定を解除する。 戻り値は変更前の指定(undo 用)。

Source

pub fn visit_node_ids(&mut self, f: impl FnMut(&mut NodeId))

モデル内の全ての NodeId 参照(節点自身の ID を含む)へ f を適用する。 節点の削除・挿入に伴う ID 繰り上げ/繰り下げ(squid-n-edit)で用いる。

NodeId を持つフィールドを Model へ追加したら必ずここへ追随することvalidateeq_ignoring_dofmap と同様)。かつては走査が編集側に散在して おり、secondary_members の追随漏れが「節点削除後に二次部材が別の節点へ 張り付く」ダングリング参照を生んでいた。フィールド定義と同じクレートに 走査を置くことで、追加時の抜けを構造的に防ぐ。

Source

pub fn visit_story_ids(&mut self, f: impl FnMut(&mut StoryId))

モデル内の全ての StoryId 参照(階自身の ID を含む)へ f を適用する (Model::visit_node_ids と同じ規約)。

階の追加・削除では「ID=配列位置」の不変条件を保つために ID の繰り上げが 必要になる。参照箇所を呼び出し側へ散らさないよう、走査はここに集約する。

Source

pub fn visit_section_ids(&mut self, f: impl FnMut(&mut SectionId))

モデル内の全ての SectionId 参照(断面自身の ID を含む)へ f を適用する (Model::visit_node_ids と同じ規約)。

Source

pub fn visit_material_ids(&mut self, f: impl FnMut(&mut MaterialId))

モデル内の全ての MaterialId 参照(材料自身の ID を含む)へ f を適用する (Model::visit_node_ids と同じ規約)。

Source

pub fn visit_elem_ids(&mut self, f: impl FnMut(&mut ElemId))

モデル内の全ての ElemId 参照(要素自身の ID・部材荷重・側テーブル属性・ 一本部材指定)へ f を適用する(Model::visit_node_ids と同じ規約)。

Source

pub fn shift_elem_attr_refs(&mut self, f: impl FnMut(&mut ElemId))

要素に紐づく全ての側テーブル属性(壁・鉄骨・BRB・PCa・免震・履歴則・ダンパー)と 一本部材指定(beam_groups)の elem 参照に f を適用する。 要素の追加・削除に伴う ID 繰上げ/繰下げで、参照整合を保つために用いる (要素自身の ID・部材荷重も含めた全参照は Model::visit_elem_ids)。

Source

pub fn take_elem_attrs(&mut self, elem: ElemId) -> ElemAttrs

指定要素に紐づく全ての側テーブル属性を取り外して返す(要素削除時の退避用)。

Source

pub fn restore_elem_attrs(&mut self, elem: ElemId, attrs: ElemAttrs)

取り外した側テーブル属性を、指定要素 ID へ紐づけ直して復元する (要素削除の undo 用)。各属性の elemelem へ上書きする。

Source

pub fn member_detail(&self, elem: ElemId) -> Option<&MemberDetailAttr>

部材の付帯情報(ハンチ・継手位置)を返す(未指定は None)。

Source

pub fn member_hysteresis(&self, elem: ElemId) -> Option<HysteresisModel>

部材に指定された履歴則(増分解析用)を返す(未指定は None=既定に従う)。

Source

pub fn member_hysteresis_th(&self, elem: ElemId) -> Option<HysteresisModel>

部材に指定された履歴則(時刻歴応答解析用)を返す。 時刻歴用スロットが未指定(None)の部材は増分用の指定に従う。 どちらも未指定は None=既定に従う。

Source

pub fn member_hysteresis_th_raw(&self, elem: ElemId) -> Option<HysteresisModel>

部材に指定された時刻歴用スロットの生値を返す(None=増分用と同じ)。 UI の「増分と同じ」表示の判定に用いる(Self::member_hysteresis_th は 増分用へフォールバックした解決後の値を返す)。

Source

pub fn set_member_hysteresis( &mut self, elem: ElemId, rule: HysteresisModel, ) -> Option<HysteresisModel>

部材の履歴則(増分解析用)を設定する。HysteresisModel::Auto を指定した 場合は増分用の指定を解除(既定に従う)。時刻歴用スロットは変更しない。 戻り値は変更前の指定(undo 用)。

Source

pub fn set_member_hysteresis_th( &mut self, elem: ElemId, rule_th: Option<HysteresisModel>, ) -> Option<HysteresisModel>

部材の履歴則(時刻歴応答解析用スロット)を設定する。None は 「増分用と同じ」に戻す。増分用の指定は変更しない。 戻り値は変更前のスロット生値(undo 用)。

Source

pub fn with_default_load_cases() -> Self

標準荷重ケース一式(DL・LL(架構用)・LL(地震用)・EX・EY)と標準荷重組合せ (長期 DL+LL、短期地震 DL+LL±EX・DL+LL±EY)を持つ空モデルを作る (新規作成の既定。default_load_casesdefault_combinations 参照)。

Source

pub fn validate_secondary_member( sm: &SecondaryMember, label: &str, nodes: &[Node], sections: &[Section], ) -> Result<(), CoreError>

二次部材 1 件の節点・断面参照が実在することを検証する(D6)。

Source

pub fn joists(&self) -> impl Iterator<Item = &SecondaryMember>

全小梁(床領域内 + 未割当)を走査する。

Source

pub fn posts(&self) -> impl Iterator<Item = &SecondaryMember>

全間柱(壁領域内 + 未割当)を走査する。

Source

pub fn visit_slab_ids(&mut self, f: impl FnMut(&mut SlabId))

モデル内の全ての SlabId 参照(床板自身の ID・床領域の slab_ids)へ f を適用する(Model::visit_node_ids と同じ規約)。

SlabId を持つフィールドを Model へ追加したら必ずここへ追随すること

Source

pub fn visit_wall_plate_ids(&mut self, f: impl FnMut(&mut WallPlateId))

モデル内の全ての WallPlateId 参照(壁版自身の ID・壁領域の wall_plate_ids)へ f を適用する(Model::visit_slab_ids と同じ規約の壁側版)。

WallPlateId を持つフィールドを Model へ追加したら必ずここへ追随すること

Source

pub fn retain_slabs(&mut self, keep: impl FnMut(&Slab) -> bool)

keepfalse を返す床板を取り除き、id == index の不変条件を 復元したうえで、FloorRegion.slab_ids の参照を新しい ID へ張り替える (取り除かれた床板への参照は削除する)。

床板をまとめて間引く処理は必ずこれを通すこと。

Source

pub fn migrate_legacy_auto_load_cases(&mut self)

旧スキーマの自動生成荷重ケース名を標準ケース名へ移行する(読込時の後方互換)。

  • 「床荷重(自動)」→「DL」、「床積載(自動)」→「LL(架構用)」、 「床地震用積載(自動)」→「LL(地震用)」に改名する (移行先の名前が既に使われている場合は改名しない)。
  • 「自重(自動)」は DL へ統合する(自重は DL の同期内容に含まれるように なったため)。DL ケースが存在する場合は「自重(自動)」を削除し、 荷重組合せの参照は DL へ付け替える(同一組合せが既に DL を参照して いる場合は項を除去して二重計上を防ぐ)。DL がない場合は 「自重(自動)」自体を「DL」へ改名する。

ケースの内容は改名/削除のみで書き換えない(自動生成ケースの内容は 解析実行前の同期アクションが毎回再計算して全置換する)。 削除時は LoadCaseId の「id == 添字」規約を保つよう後続ケースの ID と 組合せの参照を詰め直す。

Source§

impl Model

Source

pub fn member_length(&self, elem: &ElementData) -> f64

通り芯に属する要素(すべての材端節点がその通りに属する要素)の ID を、 要素 ID 昇順で返す。

通り芯自身は所属節点しか持たないため、「その通りで構成される構面の要素」は 常にこのヘルパーで求める。柱・梁・ブレースのような線材のほか、4 節点すべてが その通りに属する壁・シェルも該当する。 材端 2 節点の距離 [mm](材長)。

部材荷重の載荷位置は i 端からの mm で持つため、その妥当性を判定するところと 階への複製が材長を必要とする。判定の情報源を 1 つに保つため、材長が要る ところは常にこのメソッドを使う。2 節点に満たない要素・節点参照が範囲外の 要素は 0 を返す。

Source

pub fn member_story(&self, elem: &ElementData) -> Option<StoryId>

部材の所属階(材端節点のうち最も高い節点の所属階)。

階 \(i\) の階高区間にある柱は上端が階 \(i\) に属し、階 \(i\) のレベルにある梁も 階 \(i\) に属する、という数え方であり、階の主要構造種別の判定 (準備計算の階生成)と同じ規則である。判定の情報源を 1 つに保つため、 部材の所属階が要るところは常にこのメソッドを使う。

節点が階に割り当てられていない場合は None

Source

pub fn axis_elements(&self, axis: &Axis) -> Vec<ElemId>

Source§

impl Model

Source

pub fn floor_region_on_single_diaphragm(&self, region: &FloorRegion) -> bool

床領域の境界節点がすべて同一の剛床に属するか。

小梁の断面検定(分配 Span 検定)は、曲げ・せん断・たわみだけを見て軸力を 見ない。これは「その小梁が載る床面が 1 枚の剛体で、面内力を剛床が処理して いる」ことを暗黙の前提にしている。剛床でない床の小梁は面内力を負担する ため、この前提が成り立たず検定できない(検定側は「未」にする)。

判定は節点の集合で行う。 剛床のスレーブ集合に境界節点がすべて含まれる ことを求める。将来、節点ごとに剛床の対象を変えられるようにしても、この 判定はそのまま使える。

複数の剛床にまたがる床領域(段差床の階は 1 階に複数の剛床を持つ)は偽と する。境界で相対変位が生じうるため、面内力が小梁へ回る可能性が残る。

Source

pub fn floor_region_of_joist(&self, nodes: [NodeId; 2]) -> Option<&FloorRegion>

二次部材(端点対で識別)が属する床領域。どこにも属さなければ None

Source§

impl Model

Source

pub fn element_section(&self, elem: &ElementData) -> Option<&Section>

要素の断面。

Source

pub fn element_material(&self, elem: &ElementData) -> Option<&Material>

要素の主材料(弾性剛性 E・ν と自重の密度を決める材料)。

材料は断面が持つSection::material)ため、要素からは断面を経由して 引く。材料が要る箇所は常にこのヘルパーを情報源とし、断面と材料の対応を 呼び出し側へ散らさない。断面が未割当、または断面が材料を持たない場合は None

Source

pub fn secondary_material(&self, sm: &SecondaryMember) -> Option<&Material>

二次部材(小梁・間柱)の主材料(自重算定に用いる)。 規約は Model::element_material と同じ。

Source

pub fn element_rebar_material(&self, elem: &ElementData) -> Option<&Material>

要素の主筋材料(RC・SRC 断面のみ)。

Source

pub fn element_shear_rebar_material( &self, elem: &ElementData, ) -> Option<&Material>

要素のせん断補強筋材料(RC・SRC 断面のみ)。

Source

pub fn element_steel_material(&self, elem: &ElementData) -> Option<&Material>

要素の内蔵鉄骨材料(SRC 断面のみ)。

Source§

impl Model

Source

pub fn slab(&self, id: SlabId) -> Option<&Slab>

床板 ID から床板を引く。存在しなければ None

Source

pub fn slab_section(&self, slab: &Slab) -> Option<&Section>

床板の版へ割り当てた断面。未割当・ダングリングは None

Source

pub fn slab_plate_thickness(&self, slab: &Slab) -> Option<f64>

版の板厚 [mm]。断面の Section::thickness をそのまま返す。

断面が未割当、または断面が板厚を持たない(板状でない形状を割り当てた)場合は None建物一律の Model::slab_thickness へは退かない。あちらは「剛性計算に見込む スラブ厚」であり、既定の 0 は「スラブ協力幅による梁剛性増大を見込まない」を意味する 別概念のためである。

Source

pub fn slab_self_weight_intensity(&self, slab: &Slab) -> Option<f64>

版の自重の面荷重強度 [N/mm²](板厚 × 断面の主材料の単位体積重量)。

断面または断面の主材料が未割当のときは None。自重を面荷重として焼き込まず 毎回算定するのは、板厚や材料を変えたときに自重が追随しないという食い違いを 作らないためである。

Source

pub fn slab_dead_intensity(&self, slab: &Slab) -> f64

固定荷重(DL)の面荷重強度 [N/mm²](版の自重 + 仕上げ等)。

自重が算定できない版(断面・主材料が未割当)は仕上げ分だけを返す。 解析前チェックがこの状態を止めるため、ここでは既定厚で補わない。

Source

pub fn slab_intensity(&self, slab: &Slab, purpose: LoadPurpose) -> f64

用途に応じた合成面荷重強度 [N/mm²](固定 DL + 積載 LL(purpose))。 長期骨組解析は Frame、地震用重量は Seismic、床・小梁設計は Floor

Source§

impl Model

Source

pub fn layers(&self) -> Vec<Layer>

層(Layer)の一覧を下から順に返す。層を数える処理の唯一の入口

階が床レベル列であるという不変条件(モジュールドキュメント参照)から、 層は隣り合う階の対そのものであり、層数は stories.len() - 1 である。 階が 1 つ以下のモデルでは空を返す。

Source

pub fn layer_count(&self) -> usize

層の数(stories.len() - 1、階が 1 つ以下なら 0)。

Self::layers を組み立てずに個数だけ要るときに使う。

Source

pub fn base_elevation(&self) -> f64

建物の基部レベル [mm](elevation の基準 0)。幾何としての基部

全構造節点(generated_masters =階生成が作る剛床代表節点を除く)の最小 Z 座標を基部とする。剛床代表節点は慣性力重心に置かれる仮想節点であり、実際の 構造高さには寄与しないため除外する。節点がない場合は 0 を返す。

不変条件が成立していれば stories[0].elevation と一致する。にもかかわらず 節点から求めるのは、階生成が不変条件を成立させる側だからである。階生成は まだ床基準になっていない階列(あるいは階が 1 つもないモデル)から床レベル列を 組み立てるため、そのブートストラップには階に依らない基部が要る。 帰属区間(Self::story_spans)は不変条件を前提とするのでこれを呼ばない。

Source

pub fn story_spans(&self) -> Vec<(f64, f64)>

各階への帰属区間 (下端, 上端] [mm](Self::stories と同順・同長)。

下端は直下階のレベル、上端は当該階のレベルである。下端は含まず上端を含む ため、床レベルちょうどの節点はその階に属し、中間高さの節点は直上の階に属する。

最下階(基部の床)だけは下端を含む点区間 [基部, 基部] とする。 不変条件により最下階の標高は基部レベルそのものであり、(下端, 上端] の規則を そのまま当てはめると空区間になって柱脚・基礎梁の節点がどの階にも属さなくなる ためである。

区間の算出はここに集約する。

最下階の下端は stories[0].elevationSelf::base_elevation小さい方 とする。不変条件が成立していれば両者は一致するので通常は前者そのものだが、 不変条件がまだ成立していないモデル(階生成を通していない旧形式のファイル、 基部の階を持たない取り込みデータ)では基部側が下端になり、基部〜最下階の 節点が最下階へ収まる。これがないと、そうしたモデルで最下階の伏図が空になり、 節点が丸ごとどの階にも属さなくなる。

Source

pub fn story_at(&self, spans: &[(f64, f64)], z: f64) -> Option<StoryId>

レベル z [mm] が属する階を、Self::story_spans の区間列から引く。

階への帰属は区間である。中間高さの節点や段差床の節点も、区間に入れば 当該階に属する。剛床への帰属とは規則が異なる(Self::on_diaphragm_level)。 どの区間にも入らない場合は None(基部レベル未満、または最上階より上)。

区間列は標高の昇順で連続しているため二分探索で引く(伏図の描画が毎フレーム 全節点に対して呼ぶため、線形探索では階数に比例して重くなる)。

Source

pub fn node_stories(&self) -> Vec<Option<StoryId>>

各節点の所属階(Self::nodes と同順・同長)。

階への帰属規則(区間)の単一情報源。準備計算の階生成も UI の表示も これを用いる。

Source

pub fn on_diaphragm_level(&self, story: StoryId, z: f64) -> bool

レベル z [mm] が階 story の床面上にあるか(剛床のスレーブ判定)。

判定は階のレベルからの差が DIAPHRAGM_LEVEL_TOL_MM 以内かどうかで、 階への帰属(区間)とは規則が異なる。

Source

pub fn diaphragms_of( &self, story: StoryId, ) -> impl Iterator<Item = DiaphragmRef<'_>>

story に属する剛床(Constraint::RigidDiaphragm)を定義順に返す。

剛床は階の一部ではなく拘束として保持されるため、「この階の剛床」が要る ところは常にこのヘルパーを情報源とする。

Source

pub fn node_on_rigid_diaphragm(&self, id: NodeId) -> bool

節点 id がいずれかの剛床のマスターまたはスレーブか。

Source§

impl Model

Source

pub fn upsert_vibration_case( &mut self, wave_name: String, dir: VibrationThDir, nonlinear: bool, ) -> VibrationCaseId

同名の立体振動ケースがあれば ID を維持して属性を更新し、なければ追加する。

Source

pub fn upsert_lumped_vibration_case( &mut self, wave_name: String, dir: LumpedVibrationDir, nonlinear: bool, dim: LumpedVibrationDim, ) -> LumpedVibrationCaseId

同名の質点系振動ケースがあれば ID を維持して属性を更新し、なければ追加する。

Source§

impl Model

Source

pub fn wall_plate(&self, id: WallPlateId) -> Option<&WallPlate>

壁版 ID から壁版を引く。存在しなければ None

Source

pub fn wall_plate_covers_region(&self, plate: &WallPlate) -> bool

壁版が壁領域全体を覆う 4 節点の壁版か。

壁エレメント(squid_n_load::wall_expand)を生成できるのはこの形の壁版だけ である。壁エレメントは下辺 2 節点・上辺 2 節点を両端ピンの剛梁で結ぶ 4 節点 24 自由度モデルなので、

  • 壁領域の境界が 5 節点以上(上下の大梁が中間節点で分割されている等)なら、 剛梁が四隅しか結ばず、中間節点が壁にめり込む向きへ動けてしまう。
  • 壁領域が間柱で複数の壁版へ分割されているなら、壁版ごとに要素を作ると 1 本の長い壁柱が複数の細い壁柱に割れる。

いずれも定式化の前提が崩れるため、覆っていない壁版は要素にしない (=荷重だけを持つ壁版になる。異常ではない)。

判定はここ 1 か所に置く。 要素生成(wall_expand)・自重の分配 (squid_n_load::wall_plate_load)・フレーム内雑壁の剛性算入 (squid_n_element)が同じ答えを見る必要があるためである。

Source

pub fn wall_plate_becomes_element(&self, plate: &WallPlate) -> bool

壁版から壁エレメント(ElementKind::Wall)が生成されるか。

壁領域全体を覆う 4 節点であること(Model::wall_plate_covers_region)に 加えて、断面が割り当たっていることを要する。断面が無い壁版は板厚・材料が 引けず要素を組み立てられないためである(squid_n_load::wall_expandskipped_no_section として数える)。

covers_region との違いはこの 1 点だけだが、両者を取り違えると 「断面未割当の壁版が、要素でもなく荷重だけの壁版でもない」という どこからも扱われない状態が生まれる。要素が生成されるかを問うときは 必ず本メソッドを使うこと。

生成の可否を決めるのはここ 1 か所である。 wall_expand の生成ゲート・ 3D ビューの壁版描画(要素として描かれる壁版を除くため)・ モデルタブ「壁版」の「解析要素」列が同じ答えを見る。

Source

pub fn wall_plate_section(&self, plate: &WallPlate) -> Option<&Section>

壁版へ割り当てた断面。未割当・ダングリングは None

Source

pub fn wall_plate_thickness(&self, plate: &WallPlate) -> Option<f64>

壁版の板厚 [mm](断面の Section::thicknessModel::slab_plate_thickness と同じ規約)。断面未割当、または断面が板厚を持たない場合は None

Source

pub fn wall_plate_material(&self, plate: &WallPlate) -> Option<&Material>

壁版の主材料。断面未割当・材料未割当は None

Source

pub fn wall_plate_extent(&self, plate: &WallPlate) -> Option<[f64; 2]>

取り付く壁版の立ち上がり高さ [d_i, d_j] [mm]。

extentSome ならその値をそのまま返す。None(=階高いっぱい)は、 壁の下端から直上の階レベルまでの高さへ解決する (WallPlateShape::Attached のドキュメント参照)。

次のいずれかでは高さが決まらないため None を返し、解析前チェックが止める。 0 を返すと壁が面積 0 になり、自重が黙って消える。

  • 取り付く壁版でない
  • extentNone なのに取付き先が線(RegionAnchor::FloorRegion 以外)。 Model::validate が弾く組み合わせである
  • 下端の節点が引けない
  • 下端より上に階レベルが無い(最上階の壁)。パラペットのように最上階で上へ 伸ばす壁は、上端を決める階が無いので絶対寸法で指定する
Source

pub fn story_height_above(&self, z: f64) -> Option<f64>

レベル z [mm] から直上の階レベルまでの高さ [mm]。

階レベルは床レベル列(Story::elevation)なので、z より上にある最も低い 階レベルとの差がその位置の階高になる。z と同じレベルの階は、床そのもので あって「上」ではないため対象にしない(crate::model::DIAPHRAGM_LEVEL_TOL_MM の許容差で同一とみなす)。直上に階が無ければ None

Source

pub fn wall_plate_self_weight( &self, plate: &WallPlate, model_for_area: &Model, ) -> Option<f64>

壁版の自重 [N]。躯体(開口控除後の正味面積 × 板厚 × 主材料の密度 × 重力加速度)+ 仕上げ・増打ち(正味面積 × WallPlate::finish_intensity) + 開口部(サッシ等)の重量。

仕上げ・増打ちを躯体と同じ正味面積に乗じるのは、開口部にはコンクリートも 仕上げも無いためである。開口周りの見込み・額縁の重さは opening_weight (開口部の重量)で見る場所が別にあり、面積側で二重に見ない。

断面または主材料が未割当のとき、躯体分は 0 とする(既定厚で補わない。 解析前チェックが止める)。仕上げ・増打ちは断面に依らないので、この場合も そのまま計上する。壁版の高さが決まらないときだけ None を返す (Model::wall_plate_extent)。開口面積が壁の面積を超える場合は正味面積を 0 とする。

Source

pub fn self_standing_wall_coverage( &self, plate: &WallPlate, ) -> Option<SelfStandingWallCoverage>

自立壁(RegionAnchor::FloorRegion の取り付く壁版)が、どの床領域の上に どれだけ載っているかを求める(D17 の分配先の解決)。

床領域は主架構から作り直される派生的な入力(D10)で FloorRegionId が 面走査順に振り直されるため、分配先は保存せず常にここで解決するRegionAnchor::FloorRegion のドキュメント参照)。

§解決の規則

壁の下端線分(nodes の 2 点)を XY 平面へ落とし、荷重を流せる床領域 (壁と同じレベルにあり、床板の XY 投影面積が正である床領域)の多角形で 厳密にクリップして区間へ分ける。床領域は L 形など非凸になりうるため、 全交点を求めて区間へ分け、各区間の中点がどの床領域に内包されるかで 帰属を決める(面走査が返す最小面は重ならないため、内包する床領域は高々 1 つ)。

各区間の重量比は、その区間の ∫|立ち上がり高さ|extent は始端から終端へ 線形。符号が反転するときは高さ 0 で折れる)が全体に占める割合とする。 端点の絶対値を結んだ台形にすると、符号反転時に分母が過大になり重量比の 合計が 1 を下回る(危険側)。開口は総重量のスケールにだけ効き、開口位置は 見ない(§5.25 の既知の近似と同じ)。

§戻り値

自立壁でない、または節点が引けない場合は None。それ以外は SelfStandingWallCoverage を返す。どの床領域にも載らない区間uncovered に集計する(荷重の行き先が無いモデルの不備。解析前チェックが エラーにする)。

Source§

impl Model

Source

pub fn wall_region(&self, id: WallRegionId) -> Option<&WallRegion>

壁領域 ID から壁領域を引く。存在しなければ None

Trait Implementations§

Source§

impl Clone for Model

Source§

fn clone(&self) -> Model

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Model

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Model

Source§

fn default() -> Model

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for Model

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Serialize for Model

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl Freeze for Model

§

impl RefUnwindSafe for Model

§

impl Send for Model

§

impl Sync for Model

§

impl Unpin for Model

§

impl UnsafeUnpin for Model

§

impl UnwindSafe for Model

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.