在圖形框中創建多個交互式句柄嗨,
從一個有兩列定義X和Y坐標的表中,我正在嘗試為表中定義的每個點創建一個帶有交互式句柄的圖形框。 逐個添加句柄(參見下面的nw1)可以很好地工作,但是當我嘗試使用ForEachRow或For循環(參見nw2和nw3)自動化過程時,我得到一個帶有點的圖形框,但它們不能是以交互方式移動。 什麼是自動創建句柄的正確方法?
謝謝,Étienne
dt = newtable的 ( “數據點” ,AddRows( 3 )
NewColumn ( “XVAR” ,數字, “連續” ,SetValues([ 1 , 2 , 3 ])),
NewColumn ( “yVar” ,數字, “連續” ,SetValues([ 1 , 2 , 3 ]))
);
CurrentDataTable (DT);
nw1 = 新窗戶 ( “示例1” ,
gr1 = GraphBox (
框架尺寸( 400 , 400 ) 的XScale ( 0 ,五 ) YScale ( 0 ,五 )
處理 (:XVAR [ 1 ],:yVar [ 1 ],:xVar [ 1 ] = x; :yVar [ 1 ] = y;);
處理 (:XVAR [ 2 ],:yVar [ 2 ],:xVar [ 2 ] = x; :yVar [ 2 ] = y;);
處理 (:XVAR [ 3 ],:yVar [ 3 ],:xVar [ 3 ] = x; :yVar [ 3 ] = y;);
);
);
nw2 = 新窗戶 ( “例2” ,
gr2 = GraphBox (
框架尺寸( 400 , 400 ) 的XScale ( 0 ,五 ) YScale ( 0 ,五 )
ForEachRow (
處理 (:xVar,:yVar,:xVar = x;:yVar = y;);
);
);
);
nw3 = 新窗戶 ( “例3” ,
gr3 = GraphBox (
框架尺寸( 400 , 400 ) 的XScale ( 0 ,五 ) YScale ( 0 ,五 )
對於 (I = 1 ,我<= NROWS (dt),i ++,
處理 (:xVar [i] ,: yVar [i] ,: xVar [i] = x;:yVar [i] = y;);
);
);
);
Re:在圖形框中創建多個交互式句柄謝謝 @cwillden 。 您的解決方案完美無缺,並且可擴展。 它讓我想起SAS宏代碼,這本質上就是我在這裡嘗試做的,即寫出for循環然後執行它。
Re:在圖形框中創建多個交互式句柄你好 @rassart ,
這種情況下,您需要在添加句柄時對錶中的行值進行硬編碼。 當您從窗口中獲取剛剛從圖形框中創建的圖形腳本時,原因就變得很明顯了。 例如,示例3中的圖形腳本後面看起來像這樣:
gr3 << Get Graphics Script;
/*:
{For( i = 1, i <= N Rows( dt ), i++,
Handle(
:xVar[i],
:yVar[i],
:xVar[i] = x;
:yVar[i] = y;
)
)}變量'i'的最終值將在您的示例中設置為4,因此沒有任何句柄可以正常工作,因為'i'的值未被硬編碼。 如果沒有硬編碼,圖形腳本將始終依賴於'i'的當前值。
在這裡,您可以使用for循環對這些值進行硬編碼:
nw4 = New Window( "Example 4", gr4 = Graph Box( FrameSize( 400, 400 ), X Scale( 0, 5 ), Y Scale( 0, 5 ), ) );
For( i = 1, i <= N Rows( dt ), i++,
Eval( Parse( Eval Insert( "gr4[framebox(1)] << Add Graphics Script(Handle(:xVar[^i^], :yVar[^i^], :xVar[^i^] = x; :yVar[^i^] = y;));" ) ) )
);
Re:在圖形框中創建多個交互式句柄顯然,Handle()函數無法在exectution時處理解析。 以下腳本將對此進行補償
Current Data Table( dt );
nw1 = New Window( "Example 1",
gr1 = Graph Box(
FrameSize( 400, 400 ),
X Scale( 0, 5 ),
Y Scale( 0, 5 ),
Handle(
:xVar[1],
:yVar[1],
:xVar[1] = x;
:yVar[1] = y;
);
Handle(
:xVar[2],
:yVar[2],
:xVar[2] = x;
:yVar[2] = y;
);
Handle(
:xVar[3],
:yVar[3],
:xVar[3] = x;
:yVar[3] = y;
);
)
);