一括表示

[No.4221] Re: M01挿入 投稿者:管理人 投稿日:2013/12/06(Fri) 10:18:21

にあるスクリプト[AddM01.PAS]を参考に

M01を行の末尾に追加するのではなく
次の行に追加するスクリプトを作りたいのですが、最後の2行がうまくいきません。

for i:=1 to leng do
の i と leng の値を +1できなかったので
while i < leng do に変更して
i と leng の値を +1しています。
この方法はよくないのでしょうか。

どうすればよいのかわからないので教えてもらえないでしょうか。

Program NcReplaceTest;
var
i, leng : integer;
s : string;

begin // エディタにNCデータを準備しておいて下さい。

leng := EditorLength(); // エディタの行数を取得する
i:=0;
while i < leng do
begin
inc(i);
s := EditorRead(i);
if Length(s) < 1 then continue;

if Pos('G73', s) < 1 then continue;

EditorInsert(i+1, 'M01');
inc(i);
inc(leng);
end;

End.

2014/10/27(Mon) 21:08:21  [No.4626]


> M01を行の末尾に追加するのではなく
> 次の行に追加するスクリプトを作りたいのですが、最後の2行がうまくいきません。

Program AddM01B;
var
i : integer;
s : string;
add : boolean;

Begin // エディタにNCデータを準備しておいて下さい。
i := 1;
while i<EditorLength() do
Begin
add := false;
s := EditorRead(i);
if Pos('G43', s) > 0 then add := true; // G43がターゲット
if add then
Begin
inc(i);
EditorInsert(i, 'M01');
End;
inc(i);
End;
End.

これでいかがでしょうか?(インデントがおかしいので、AddM01B.zipを添付しておきます)
※通常Forループのカウンタ変数には代入出来ません。

[ 4627.zip (0kB) ]
2014/10/28(Tue) 09:52:50  [No.4627]


Re: EditorInsertが思い通りに動作しない (画像サイズ: 629×525 96kB)

説明不足がありました。

スクリプトの動作確認のため
CUTやMILLで作成したNCプログラムではなく
内蔵テキストエディタに直接ダミーデータを入力して
動作確認をしたところ
最後の2行にM01が追加されません。

AddM01B.PASを実行しても同じ結果です。

テスト方法に問題があるのでしょうか。
EditorInsertの不具合でしょうか。
確認をお願いします。

2014/10/28(Tue) 17:36:17  [No.4628]


> テスト方法に問題があるのでしょうか。
> EditorInsertの不具合でしょうか。
> 確認をお願いします。

EditorInsert()は指定行の前に挿入するため、何もない最終行指定では実行されません。
最終行に足したい場合はWriteln()をお使い下さい。

そもそもが全行に挿入したいのですか?

2014/10/28(Tue) 17:56:58  [No.4629]


> そもそもが全行に挿入したいのですか?

EditorInsert()の動作確認を行いたかったので(特に1行目と最終行の動作確認をしたく)
あえて全行追加するテストデータにしました。
ただ2行前も追加されないのは想定外のため、今回問い合わせを行いました。
お手数をかけました。

2014/10/29(Wed) 12:12:46  [No.4630]


  StringListを使ってみて下さい 投稿者:管理人  

こういった場合はStringListに格納した方が解りやすく出来ます。

// NCコードに行の挿入例 2014/10/29 NabeTech
// エディタにNCデータを準備しておいて下さい。

Program WorkPositionEdit;
var
i, leng : integer;
s : string;
sl : stringlist;

begin
sl := stringlist.Create; // StringListの利用例
sl.Clear;

leng := EditorLength(); // エディタの行数を取得する
for i:=1 to leng do // StringListに全行を格納する
sl.Add(EditorRead(i));

EditorCrear(); // エディタの消去

for i:=1 to leng do
Begin
s := sl.GetItem(i-1); // 注:インデックスと違う
Writeln(s);
if Length(s) < 1 then continue;
if Pos('%', s) > 0 then continue;
Writeln('M01');
End;

sl.Free; // 解放を忘れずに
End.

[ 4631.zip (0kB) ]
2014/10/29(Wed) 14:08:34  [No.4631]


> こういった場合はStringListに格納した方が解りやすく出来ます。

確認しました。
StringListの方が解りやすいです。
ありがとうございました。

2014/10/31(Fri) 15:16:49  [No.4632]