Subject | : Re: 「グラフの大きさをウインドウの大きさに追従させる」機能の不全について |
Date | : 2010/02/18(Thu) 21:38:45 |
Contributor | : AC |
> 下記URLで説明されている「グラフの大きさをウインドウの大きさに追従させる」方法が正しく機能しないので、 > 心当たりのある方からの情報と積極的調査をお願いします。 > http://www-kekb.kek.jp/Documentation/SAD/index.php?FFS%20Level%2F%CE%E3%C2%EA > > 具体的症例は、URL掲載の例題通り以下のコマンドで描いたグラフは、ウィンドウを拡大しても、中に描かれた図が期待に反して追従しません。環境は、 SAD Ver.1.0.10.4.2a06、Tk$Version= {8,5} です。 > FFS; > $DisplayFunction = CanvasDrawer; > w = Window[]; > c1 = Canvas[w, Height -> 100, Width -> 150, > Side -> "left", > Expand -> True, Fill -> "both"]; > c2 = Canvas[w, Height -> 100, Width -> 150, > Side -> "left", > Expand -> True, Fill -> "both"]; > pl:=( > Canvas$Widget = c1; > Plot[Sin[x],{x,-Pi,Pi}]; > Canvas$Widget = c2; > Plot[Cos[x],{x,-Pi,Pi}]); > pl; > Bind[w, "<Configure>", pl]; > TkWait[]; > Packages/Canvas.n内部で、Canvas Widgetの Geometryをキャッシュしているためです。 このキャッシュが実装されたのは、Packages/Canvas.n Revision 1.461(2008-10-07 05:44:27 JST)です キャッシュを無効化すれば、CanvasDrawerによる描画に Canvas Widgetの Geometry変化が反映されますが、 Canvas Drawerの描画の結果に依存してWidgetのパッキング状態が変化するので、収束させるには 1. Canvas Drawerによる再描画(Show[]) 2. X Serverへの描画結果の反映/Frameの再パッキング(Update[]) を何度か繰り返す必要があります(典型的には、2-3回) キャッシュを無効化するパッチは以下の通り Index: Packages/Canvas.n =================================================================== --- Packages/Canvas.n (revision 2958) +++ Packages/Canvas.n (working copy) @@ -138,7 +138,7 @@ Min[GoldenRatio*CanvasAspectRatio/$DefaultCanvasAspectRatio, GoldenRatio+CanvasAspectRatio-$DefaultCanvasAspectRatio]); - CanvGeo[]:=(CanvGeo[]=Module[{{w,h}=WidgetInfo[CanvasWidget,{Width,Height}]}, + CanvGeo[]:=(Module[{{w,h}=WidgetInfo[CanvasWidget,{Width,Height}]}, If[w<4, CanvasWidget[CGet[Width,Height]], {w,h}]]);