[Go to BBS]
All articles in a thread
Subject「グラフの大きさをウインドウの大きさに追従させる」機能の不全について
Article No779
Date: 2010/02/18(Thu) 20:44:59
Contributor鎌田
下記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[];

SubjectRe: 「グラフの大きさをウインドウの大きさに追従させる」機能の不全について
Article No780
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}]]);

SubjectRe^2: 「グラフの大きさをウインドウの大きさに追従させる」機能の不全について
Article No781
Date: 2010/02/19(Fri) 02:21:34
Contributor鎌田
提供されたパッチが有効であることを確認しました。
どうもありがとうございます。