GetHasseDiagramの論理を見直し

岩崎彌次郎系列を選択して部分図に切り替えようとして,SIMPLEGRAPH:GetHasseDiagramで停止した.この関数を呼び出すときの引数seedが空になっている.⇒SIMPLENODE::AddOyakoEdaで枝が生成されていない.⇒「系列分解図の場合は始系列のみ処理する@20171125」となっている.これはかなりまずい.クラスタ図は婚姻と親子関係だけで構成されるので,「系列」は無関係のはずだ.

いや,そういう訳にもゆかない.確定世代番号を得ることがクラスタ図の目的だが,系列間の結婚によってそれが歪められてしまう.かなり厄介な話になってきた.系列分解図の場合は重婚クラスタ検定はパスするというのが現実的であるような気がするが,この問題は棚上げして,部分図の場合はつねに系列分解図オフとすることで逃げることにしよう.

渋沢一族が5つのブロックに分解している事情を解明する手がかりとして,岡部長景の傍系親族図と渋沢栄一の傍系親族図の接点となっている尾高豊作@22の傍系親族図を取ってみた.246人を収容するかなり大きな親族図だ.尾高豊作は尾高 惇忠(藍香)の子どもの尾高次郎と大内ふみの間の子で,尾高家は渋沢一族の中でも渋沢家に次ぐ大きな氏族だ.尾高豊作の配偶者の岡部豊子は岡部長景とは異母兄弟に当たる.

尾高豊作の娘尾高泰子からすると,岡部長発は直系血族,岡部長景は傍系血族に当たるから現行アルゴリズムでもトレース可能なはずなのだが… クラスタ図の枝は親子関係だが,婚姻関係は1個の節点(クラスタ)として集約されているので,尾高豊作→ 岡部長景のパスが検出できないということは考え辛い.SIMPLEGRAPH::GetHasseDiagramの論理を見直してみよう.

確かに,現行では到達できないパスが発生するのは避けられないように思われる.現行アルゴリズムは以下のようなフローになっている.

  1. 起点から上流/下流検定を実施する
  2. すべての先祖ノードから下流検定を実施する
  3. すべての末裔ノードから上流検定を実施する

この論理では傍系に到達できない可能性がある.書き直してみよう.先祖ノードからの下流検定と末裔ノードからの上流検定を一体化して,下流検定→ 上流検定→ 下流検定を反復する必要がある.⇒解決した.

MARGBOX::CheckMargBoxChangedで@20渋沢市郎右衛門の先祖リンク不良が反復発生するのはなぜか?⇒該当する結婚枠が複数存在するためだ.⇒ダンプを抑制した.

現行では重婚クラスタ検定の入口で多重カードをカウントし,多重カードゼロの場合は重婚クラスタ図を生成しないようになっているが,つねに生成するようにすべきではないか?⇒多重カードゼロのサンプルは比較的単純なものが多いのでクラスタ検定を実施してもそれほど負荷が掛かる訳ではないのでやった方がよいと思う.やらなくても弊害はほとんどないとは思われるが,やっておいた方が安全だ.

画面サイズオーバーの問題が出ているので調べておこう.

系列分解図で栄一の系列を選択→新規部分図で部分図に切り替えようとして,TREEVIEW:CheckDispSizeOverのエラーになった.系列分解図でズーム倍率46%のとき,尾高磯五郎系列のカードを拡張選択して部分図:新規部分図で「現在の選択範囲を部分図に設定」した後,「部分図モードに切り替えますか?」→「はい」を押して,TREEVIEW:Zoom→ SetOuterFrameでエラーが発生する.OuterFrameには系図外枠が入っているが,幅が上限の32000を超えている.

しかし,選択された部分図の領域はそれほど大きなものではないので,全体図の領域と間違えているものと思われる.「部分図に設定」しただけでは描画領域は確保されず,部分図モードに切り替えて系統並び替えが実行されて初めて部分図の領域が確定するので,ZoomSetが掛かるタイミングが早過ぎる.ズーム倍率は描画に先立って切り替えておく必要があるが,適用される領域が間違っている(まだ計算されていない).

TREEVIEW::CheckDispSizeOverはGetTitlePositionから呼び出されているが,GetTitlePositionの呼び元は2つある.①CallGetTitlePositionと②SetOuterFrameだ.前者はという外部関数から呼び出されているが,後者はLButtonUp, SetDispParm, SetTitleBox, UpdateDiagram, Zoomなどいろいろなところから呼び出されている.

TREEVIEW::ZoomSetにはapplyという引数があって,Zoomを実行するか否かを選択できるようになっている.これをオフにして呼び出せばよいのではないか?TREEVIEW::ZoomSetは,CtrlZoomSet, MakeLeastWindow, ZoomIn, ZoomOutから呼び出されている.今の場合は,CtrlZoomSetからの呼び出しだが,この関数ではモードがZOOM_RESETとZOOM_KINDREDの場合にのみ,ZoomSetを呼び出している.ZOOM_KINDREDは今の場合のような「図面種別の切り替えに伴うズーム倍率の変更」だからapplyオフでよい.ZOOM_RESETはVBのSetZoomRateで呼び出されるケースだが,これもオフでよいのではないかと思う.⇒これでこの問題は一応片付いたのではないかと思う.

しかし,今度はTRIBELIST::ShiftDirectAbsoluteでエラーが出るようになってしまった.先祖ノードのシフトを実行して,確定世代番号と人名枠の物理世代番号の不一致が起きている.下図は尾高磯五郎系列の「一部」を部分図としたもので,4系統に分離している.

image

関係の一部がカットされたために系列がバラバラになるのはやむを得ないというより,当然だが,出力がかなりおかしい.それぞれ独立系統なので先祖ノードが物理世代ゼロに配置されるのは当然だが,下流系との間にギャップが出来てしまっている.各カードに表示された確定世代番号を見ると,画面上の垂直位置と一致しているので,確定世代番号に従っていると言える.カード数は全76点だ.

GetHasseDiagramで距離数を確定世代番号に変換するところで失敗しているのだろう.系統ごとに基準点が異なるので一括して処理したのでは正しい値にならない.どうすればよいか?SIMPLEGRAPH:GetHasseDiagramの中で系統ごとに処理が閉じるようにしなくてはならないだろう.この修正は結構クリティカルなので,一度バックアップを取って最近の修正をフィックスしてから着手することにしよう.

  1. RetrieveGhostではCHAOTICSTATEまではノーマル処理する@20210301 1件
  2. CHAOTICSTATEまではつねにノーマル処理する@20210302 12箇所
  3. NOMULTICARDを廃止する@20210303 12箇所
  4. 仮修正 1箇所,暫定 2箇所,#if 0 4箇所

SIMPLENODEにはすでに使われなくなったdownwardとupwardという2つの変数があるのでこれらを廃止して,代わりにstrain(系統)という変数を導入することにする.⇒実装した.動作している.

image

渋沢一族の系列分解図は横幅が上限を超えてしまうため,「92.2%以上には拡大できない」が,その動作があまりよくない.ズーム倍率リストで100%以上を指定しても拡大されないが,警告も出ない上,画面が崩れる場合がある.倍率表示は100%,200%などになっている.ズームトグルボタンで100%に戻そうとすると初めてメッセージが出て92%に自動調整されるが,画面は左端に移動してしまう.ズームインボタンで拡大しようとしたときの動作はトグルボタンの場合と同じだ.⇒ズームリストツールを操作したときのコマンドが,ZOOM_RESETだ.

しかし,ズームトグルの場合のように自動調整は実行されず,メッセージも出ない.ざっと見た限りではトグルとリストツールで動作には差異がないように見える.どちらもTREEVIEW::Zoomを呼び出しているだけだ.VB側の動作もZView.Zelkova1.ZoomSetを実行した後,UpdateZoomRateしているだけだ.どこかで書き戻されているようだ.⇒これは結構難しい.ズーム倍率リストのSelectedIndexChangedイベントの中でテキストを書き換えても上書きされてしまう.ComboBoxではe.Cancelのような方法が使えない.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA