Conference Room SAD
[thread display] [new arrival display] [word search] [past log] [管理用]

Subject Re: 「グラフの大きさをウインドウの大きさに追従させる」機能の不全について
Date: 2010/02/18(Thu) 21:38:45
ContributorAC

> 下記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}]]);


- 関連一覧ツリー (Click ▼ to display all articles in a thread.)