以下のスクリプトを実行するのが困難です。 私はグラフビルダーを使ってカスタムプロットを作成しようとしています。 解析するデータ量に応じて新しいプロットを作成し、各データセット "wafer2"の周りに作成したカスタムマップをプロットします(これを実行しようとしている変数は "Dmaps"と呼ばれます)。また、ユーザーが選択した分析レシピに基づいてスケールバーを調整する必要があります(スクリプトのこの部分は「Dscale」参照を無視しても問題なく機能します)。 私が苦労しているのは、forループで生成した文字列を正しい構文にするか、またはその文字列をグラフビルダースクリプトと正しく統合することです。 誰もが私が欠けているものを私に言うことができます
ありがとう、
names default to here(1);
UniqueSlots = Associative Array( :Slot ) << get keys;
For( i = 1, i <= N Items( uniqueslots ), i++,
If( i == 1,
Dmaps = Eval("Dispatch( {}, \!"Graph Builder\!",FrameBox(" || Char( uniqueslots[i] ) || "),
{Background Map( Boundaries( \!"Wafer2\!" ) ), Marker Size( 3 ), Grid Line Order( 2 ),
Reference Line Order( 3 )})"
)
);
If( i < N Items( uniqueslots ),
Dmaps = Char( Dmaps ) || Eval(", Dispatch({}, \!"Graph Builder\!",FrameBox(" || Char( uniqueslots[i] ) || "),
{Background Map( Boundaries( \!"Wafer2\!" ) ), Marker Size( 3 ), Grid Line Order( 2 ),
Reference Line Order( 3 )})"
)
);
If( i == N Items( uniqueslots ),
Dmaps = Char( dmaps ) || Eval("Dispatch({}, \!"Graph Builder\!",FrameBox(" || Char( uniqueslots[i] ) || "),
{Background Map( Boundaries( \!"Wafer2\!" ) ), Marker Size( 3 ), Grid Line Order( 2 ),
Reference Line Order( 3 )})"
)
);
);
Show( dmaps );
Dscale = If( Contains( :SetupID[1], "0.026-0.2190um" ) > 0,
Parse( "[0.026 0.219]" ),
If( Contains( :SetupID[1], "0.026-0.2190umDSA" ) > 0,
Parse( "[0.026 0.219]" ),
If( Contains( :SetupID[1], "0.045-0.1421um" ) > 0,
Parse( "[0.045 0.1421]" ),
If( Contains( :SetupID[1], "0.046-0.1215um" ) > 0,
Parse( "[0.046 0.1215]" ),
If( Contains( :SetupID[1], "Post" ) > 0,
Parse( "[0.019 0.1297]" ),
If( Contains( :SetupID[1], "31-56.9nm" ) > 0,
Parse( "[0.031 0.0569]" )
)
)
)
)
)
);
Show( dscale );
script4 = Eval(
Parse(
"Graph Builder(
Size(
If( N Items( Associative Array( :Slot ) << get keys ) <= 16,
585,
1170
),
If( N Items( Associative Array( :Slot ) << get keys ) > 4,
50 * N Items( Associative Array( :Slot ) << get keys ) + Abs( 4 - Modulo( N Items( Associative Array( :Slot ) << get keys ), 4 ) ) /
4,
220
)
),
Show Control Panel( 0 ),
Show Footer( 0 ),
Continuous Color Theme( \!"Spectral\!" ),
Categorical Color Theme( \!"JMP Default\!" ),
Lock Scales( 1 ),
Title Fill Color( {221, 215, 204} ),
Title Frame Color( {221, 215, 204} ),
Level Fill Color( {233, 230, 226} ),
Level Frame Color( {221, 215, 204} ),
Variables(
X( :X ),
Y( :Y ),
Wrap(
:Slot,
Levels( N Items( Associative Array( :Slot ) << get keys ) ),
Levels per Row( If( N Items( Associative Array( :Slot ) << get keys ) <= 16, 4, 8 ) )
),
Overlay( :TIME ),
Color( :DSIZE )
),
Elements( Points( X, Y, Legend( 3 ) ) ),
SendToReport(
Dispatch(
{},
\!"X\!",
ScaleBox,
{Scale( \!"Geodesic\!" ), Min( -0.16 ), Max( 0.16 ), Inc( 0.05 ), Minor Ticks( 0 ), Label Row(
{Show Major Labels( 0 ), Show Major Ticks( 0 ), Show Minor Ticks( 0 )}
)}
),
Dispatch(
{},
\!"Y\!",
ScaleBox,
{Scale( \!"Geodesic\!" ), Format( \!"Best\!", 12 ), Min( -0.16 ), Max( 0.16 ), Inc( 0.05 ), Minor Ticks( 0 ),
Label Row( {Show Major Labels( 0 ), Show Major Ticks( 0 ), Show Minor Ticks( 0 )} )}
),
Dispatch(
{},
\!"400\!",
ScaleBox,
{Legend Model(
3,
Properties(
0,
{gradient(
{Color Theme( \!"Green Yellow Red\!" ), Scale Values(
"|| char(DScale) ||"
), Label Format( \!"Fixed Dec\!", 15, 3 ), N Labels( 5 )}
)}
)
)}
),
Dispatch( {}, \!"graph title\!", TextEditBox, {Set Text( :lot[1] )} ),
Dispatch( {}, \!"400\!", LegendBox, {Set Title( \!"\!" )} ),
"|| char(parse(Dmaps)) ||"));"
)
);
ありがとう、そのコードはずっときれいに見えます。
カスタムマップファイルと一緒にsampelデータを添付しています(C:¥Program Files¥SAS¥JMP¥13¥Mapsに貼り付ける必要があります)。 スクリプトを編集すると、マップなしのグラフと次のエラーが表示されます。
予期しない "、"。おそらく欠けている ";"があります。または「、」。
行3列32:...行の順序(3)})、ディスパッチ({}、"グラフ・ビュ...
無視された残りのテキストは
、Dispatch({} "、"グラフビルダー、FrameBox(12)、{背景地図(境界線)( "Wafer2))、
マーカーサイズ(3)、グリッド線の順序(2)、参照線の順序(3)})、ディスパッチ({} "、"
グラフビルダー、FrameBox(13)、{背景マップ(境界 "(" Wafer2))、マーカーサイズ(3)、
グリッド線の順序(2)、参照線の順序(3)})ディスパッチ({} "、"グラフビルダー、フレームボックス(
14)、{背景地図(境界 "(" Wafer2))、マーカーサイズ(3)、グリッド線の順番(2)、
基準線の順序(3)})
{}にFrameBox ["Graph Builder"]が見つかりません
グラフビルダー[]
私はあなたの脚本を調べました、そして、遊ぶためのいくつかのサンプルデータを持っていないで、それは私が持っているより遠くに行くように言われています。
論理エラーが1つ見つかりました。Dmapsの値は、i == 1の比較用に設定した値になることはありません。 それは、それに続くIf節がi == 1のときにも実行され、iが1のときにもN Items(uniqueslots)よりも小さいからです。
私はそのコードを再構築するために次のコードを提案します:
If(
i == 1,
Dmaps = Eval(
"Dispatch( {}, \!"Graph Builder\!",FrameBox(" || Char( uniqueslots[i] ) ||
"),
{Background Map( Boundaries( \!"Wafer2\!" ) ), Marker Size( 3 ), Grid Line Order( 2 ),
Reference Line Order( 3 )})"
),
i < N Items( uniqueslots ),
Dmaps = Char( Dmaps ) || Eval(
", Dispatch({}, \!"Graph Builder\!",FrameBox(" || Char( uniqueslots[i] ) ||
"),
{Background Map( Boundaries( \!"Wafer2\!" ) ), Marker Size( 3 ), Grid Line Order( 2 ),
Reference Line Order( 3 )})"
),
i == N Items( uniqueslots ),
Dmaps = Char( dmaps ) || Eval(
"Dispatch({}, \!"Graph Builder\!",FrameBox(" || Char( uniqueslots[i] ) ||
"),
{Background Map( Boundaries( \!"Wafer2\!" ) ), Marker Size( 3 ), Grid Line Order( 2 ),
Reference Line Order( 3 )})"
)
);
/*);
If( i < N Items( uniqueslots ),
Dmaps = Char( Dmaps ) || Eval(", Dispatch({}, \!"Graph Builder\!",FrameBox(" || Char( uniqueslots[i] ) || "),
{Background Map( Boundaries( \!"Wafer2\!" ) ), Marker Size( 3 ), Grid Line Order( 2 ),
Reference Line Order( 3 )})"
)
);
If( i == N Items( uniqueslots ),
Dmaps = Char( dmaps ) || Eval("Dispatch({}, \!"Graph Builder\!",FrameBox(" || Char( uniqueslots[i] ) || "),
{Background Map( Boundaries( \!"Wafer2\!" ) ), Marker Size( 3 ), Grid Line Order( 2 ),
Reference Line Order( 3 )})"
)
);*/
);
同様に、次のようにして2番目のIf構造内のネストされたIFをすべて削除できます。
Dscale = If(
Contains( :SetupID[1], "BareSiPre0.026-0.2190um" ) > 0, Parse( "[0.026 0.219]" ),
Contains( :SetupID[1], "BareSiPst0.026-0.2190umDSA" ) > 0, Parse( "[0.026 0.219]" ),
Contains( :SetupID[1], "LTALDOX300A0.045-0.1421umDSA" ) > 0, Parse( "[0.045 0.1421]" ),
Contains( :SetupID[1], "ALDOX2500A0.046-0.1215umDSA" ) > 0, Parse( "[0.046 0.1215]" ),
Contains( :SetupID[1], "BKM_BareSi_19nmPost_OHS" ) > 0, Parse( "[0.019 0.1297]" ),
Contains( :SetupID[1], "LTALDOx180A31-56.9nm" ) > 0,
Parse( "[0.031 0.0569]" )
/*If( Contains( :SetupID[1], "BareSiPst0.026-0.2190umDSA" ) > 0,
Parse( "[0.026 0.219]" ),
If( Contains( :SetupID[1], "LTALDOX300A0.045-0.1421umDSA" ) > 0,
Parse( "[0.045 0.1421]" ),
If( Contains( :SetupID[1], "ALDOX2500A0.046-0.1215umDSA" ) > 0,
Parse( "[0.046 0.1215]" ),
If( Contains( :SetupID[1], "BKM_BareSi_19nmPost_OHS" ) > 0,
Parse( "[0.019 0.1297]" ),
If( Contains( :SetupID[1], "LTALDOx180A31-56.9nm" ) > 0,
Parse( "[0.031 0.0569]" )
)
)
)
)
)*/
);