Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

立体グリッドとスナップ

3D ビューには、通り芯と階から導いた立体グリッドを下敷きとして描けます。 格子点へスナップして部材を引けるため、節点を 1 つずつ作らなくても架構を組み立てられます。

通り芯は識別のためのデータで構造計算には用いませんが(通り芯)、 柱・大梁を置く位置は通りと階の交点に限られるため、モデリングの下敷きとしては有用です。 計算に使わないデータであっても 3D ビューへ描くのは、この理由によります。

本節では、何を描くのか、格子点がどう決まるのか、スナップがどう働くのかを紹介します。

実装参照:格子の導出は sepika_core::frame_gen::space_grid(crates/sepika-core/src/frame_gen.rs)が、描画とスナップは sepika_app::viewer::space_grid(crates/sepika-app/src/viewer/space_grid.rs)が担います。

表示の切り替え

3D ビューの上にある「通り芯グリッド」で表示を切り替えます。既定は ON です。

このトグルは、通り芯と階の両方があるモデルにだけ表示します。どちらかが欠けると格子点が 定まらず、描く格子がないためです。構面の基準線と二重になって読みづらくなるため、構面表示 (軸組図・伏図)中も描きません(構面の表示)。

スナップの対象は、格子を描いているときだけです。構面表示中は格子を描かないため、スナップも 既存節点だけになります。正射影では別の構面の格子点が画面上で重なるため、対象にすると見ていない 構面へ節点と部材ができてしまいます。

実装参照:トグルの状態は sepika_app::app::UiViewState::show_space_grid(crates/sepika-app/src/app/mod.rs)が持ち、表示 UI は sepika_app::viewer::controls::view_controls(crates/sepika-app/src/viewer/controls.rs)が提供し、格子の有無は sepika_app::viewer::space_grid::has_grid が判定します。

何を描くか

各レベルの平面格子だけを描き、鉛直線は描きません。鉛直線は柱と重なる位置に引かれるため、 柱のある架構では情報が増えず線だけが増えてしまいます。

通り名は最下レベルの端にだけ添えます。全レベルに繰り返すと画面が文字だらけになり、かえって 架構が読みづらくなるためです。

格子線は部材より淡い色で描きます。架構と同じ濃さで線が重なると、どれが実在する部材なのか 判断できなくなるため、色の濃さで下敷きだと分かるようにしています。

実装参照:描画は sepika_app::viewer::space_grid::draw(crates/sepika-app/src/viewer/space_grid.rs)が担います。

格子点の決まり方

平面の格子線は、離れを測る向きがグローバル軸に沿う平行芯グループから取ります。 方向角 270° のグループが X 方向、方向角 0° のグループが Y 方向の格子線になります。

斜めの平行芯グループと平行芯以外のグループ(円弧芯・放射芯・作図芯)は、直交する格子として 表せないため対象にしません。これらのグループしか持たないモデルでは格子が空になるため、 トグル自体が現れません。

離れはグループの原点・方向角で測った符号付きの値なので、グローバル座標へ直してから昇順に 並べます。同じ位置に通りが複数あるモデル(取り込みで重複した通り)では、許容差 1 mm 以内の 格子線を 1 本にまとめ、通り名は先に現れたものを採ります。

鉛直方向のレベルは、基部と各階の標高です。基部はモデルの最下レベルで、格子上では GL と 呼びます。階は標高の昇順に並ぶ不変条件を持つためそのまま格子面として使えますが、基部と同じ 標高の階だけはレベルが重なってしまうため飛ばします。

格子点はこの平面の格子線と鉛直のレベルの交点すべてで、3 通り × 2 通り × 4 レベルの架構で あれば 24 個になります。

実装参照:格子線・レベルの導出(軸沿いの平行芯の採用、1 mm の重複統合、基部 GL の追加)は sepika_core::frame_gen::space_grid(crates/sepika-core/src/frame_gen.rs)が担います。

格子点へのスナップ

梁作成モードでは、クリック位置を既存節点または格子点へスナップします。どちらも許容差 10 px(画面上の距離)で判定し、許容差の内に既存節点があればそれを優先します。 同じ位置に節点を重ねて作ると、見た目では気づけない二重節点ができ、部材がつながっていない モデルになってしまうためです。

節点のない格子点を選んだ場合は部材の生成とあわせて節点も作りますが、節点の追加と部材の追加は 1 つの操作にまとめてあるため、undo 1 回で節点ごと取り消せます。

格子点の座標が既存節点と1 mm 以内で一致する場合も、その既存節点を使い回します。 表示されていない節点(床・二次部材だけに使われる節点)も対象にするため、「床壁・二次部材」を 非表示にした状態で部材を引いても二重節点はできません。

始点と終点が同じ節点に解決される場合は、長さ 0 の部材ができて剛性行列が特異になるため、 何も作らずにクリックを捨てます。

グリッドの表示を OFF にしたときも、スナップの対象は既存節点だけになります。見えていない格子点が 選ばれると、意図しない位置に節点ができてしまうためです。

実装参照:スナップは sepika_app::viewer::space_grid::{pick, SnapPoint}(crates/sepika-app/src/viewer/space_grid.rs)が、クリック処理からの呼び出しは sepika_app::viewer::input::handle_click が担います。

作られる部材の属性

スナップで作る部材は、断面が未割当・両端固定で、架構作成ウィザードが作る柱・大梁と同じ 属性を持ちます。

局所座標系の基準ベクトルは、材軸が鉛直ならグローバル X 方向、それ以外はグローバル Z 方向に とります。上下のレベルの格子点を結べば柱を引けますが、鉛直材へ Z 方向を与えると材軸と平行に なり、基準ベクトルとして働かないためです。鉛直かどうかは、両端の水平距離が 1 mm 未満かで 判定します。

断面は作成後に割り当ててください。未割当のままでは解析前チェックが止めます。

実装参照:部材と節点の生成は sepika_app::viewer::space_grid::beam_command(crates/sepika-app/src/viewer/space_grid.rs)が 1 つの sepika_edit::CompositeCommand として組み立てます。

小梁・間柱を領域内へ配置する

梁作成モードと同じ 3D 操作で、床領域へ小梁を、壁領域へ間柱を配置できます。 左パネル「作成」の**「小梁配置モード」「間柱配置モード」**がそれです。

操作は 2 段階です。まず親領域(小梁は床領域、間柱は壁領域。壁は構面で選ぶ)を作業範囲として クリックします。選択中の領域は強調表示されます。次に、両端が取り付く支持部材を 2 点クリック します。1 点目は端 A として丸印で示し、2 点目で端 B が決まると配置します。

支持部材は、主架構の 2 節点梁と、同じ種別の既存二次部材(小梁なら小梁、間柱なら間柱)です。 クリック位置を材軸へスナップし、材軸上の位置(0〜1)を取付き位置として記録します。 両端が作業範囲の内側で支持部材の材軸へ解決できない場合は配置しません (荷重の行き先が決まらない端を自由端へ読み替えると危険側になるため、利用者が明示したときだけ 片持ちにします)。片持ちにする場合は配置フォームの「端 B を自由端にする」を使います。

配置は、安定 ID の払い出し・親領域への追加・床板/壁版割当領域の再構築・境界が変わって 参照先を失った版の除去までを 1 つの Undo 単位にまとめます。配置後、分割された割当領域は 未設定(赤)として現れるので、あらためて版を割り当ててください (床板・壁版の表示)。

同じ操作は「床」タブ・「壁版」タブの配置フォームからも行えます。親領域・両端の支持部材・ 材軸位置(または片持ちの自由端ベクトル)・断面・名前を指定して「配置」を押します。一覧では 安定 ID で表示し、支持条件の変更と削除ができます。

実装参照:作業範囲の選択は sepika_app::viewer::pick::pick_parent_region、支持部材のスナップは pick_support_anchor(crates/sepika-app/src/viewer/pick.rs)が担い、クリック処理は sepika_app::viewer::input::handle_click、強調表示は sepika_app::viewer::scene::draw_work_scope(crates/sepika-app/src/viewer/scene.rs)が行います。 配置・移動・削除は sepika_edit::{PlaceSecondaryMember, SetSecondaryMemberEnds, DeleteSecondaryMember} (crates/sepika-edit/src/secondary.rs)で、再構築と版の除去は sepika_core::model::Model::rebuild_assignment_regions_dropping_orphan_plates が行います。 テーブルの配置フォームと一覧は sepika_app::tables::secondary(crates/sepika-app/src/tables/secondary.rs) が担います。