本文中の番号のふり直しNo.04647
W.Hiroshi さん 05/04/18 11:22
 
こんにちは、W.hiroshiと言います。

NC工作機械の加工プログラムを書いています。
一連の作業をするプログラムの名前として、プログラムの先頭にO番号があり、その
中に工具を交換するごとに目印としてN番号が振ってあります。

%
O2000(810-130.A)
M98P98
T17M06
T18

N10(..T17-8.0-RF-ED..)
G54G90G00X10.0Y5.0S3000
....
....
G40M15
N19M98P99
M01
T18M06

N20(..T18-8.0-ED..)
G54G90G00X10.0Y5.0S3500
....
....
G40M15
N29M98P99
M01
T03M06
T04
M30
%

というような感じです。....の部分は途中省略しましたが、加工のためのプログラム
がいろいろ入ります。(すべて半角大文字のアルファベットとマイナスや小数点の記
号を含む数字)
N番号は、プログラムの途中から加工を再開する時プログラムを呼び出すための目印
として使います。
カッコ()の中はコメントなので、括弧の表記そのものがないこともあります。

N10 N19などの番号がすでに振ってある物として、
ここで、ある工具の行程の順番を入れ替えた場合、N番号をもう一度ふり直したいの
ですが、どのようにすればいいでしょうか。

条件
O番号は、アルファベットの「O」に続く4桁以下の数字
N番号は、アルファベットの「N」に続く3桁以下の数字
N10から始まってその工具の加工の終わりがN19,次がN20というようなパターンの繰
り返しになるようにしたい。(数字の末尾が0のところは0に、9のところは9になるよ
うに)
一つのプログラムは、O番号で始まって、「M30」か「M99」の文字で終わり。
一つのファイルに複数のプログラムが入っているので、O番号が出てきたらN番号をク
リアしてまた、 N10 から始まるようにしたい。
他のプログラムから呼び出されるサブプログラムにもO番号はあるので、O番号だけで
そのなかにN番号がないこともある。
エンドオブファイルの記号として、ファイルの最初と最後に「%」の文字がある。

長々と書いてしまいましたが理解していただけたでしょうか。
実は、replacedownと変数を組み合わせて何か出来ないかと試行錯誤してみたのです
が私の知識では思うような動作になりませんでした。
どなたか知恵を貸してください。よろしくお願いします。


[ ]
RE:04647 本文中の番号のふり直しNo.04648
ENCODINGSHIFTJIS さん 05/04/18 17:03
 
第一案
とりあえずの、手作業
GREP を使い、番号行を 集める。
手で連番打ち直し

それを、書き戻す。複数個所置換のマクロがマクロライブラリにあったような。

行数が変化しないなら、この形でできます。

第二案
また、番号行を「行の強調表示」にしているなら
上の強調行 などで移動できます。一覧とかも。

[ ]
RE:04647 本文中の番号のふり直しNo.04649
山紫水明 さん 05/04/18 21:27
 
 W.Hiroshiさん,こんばんは。

 少し条件が複雑でなかなか呑みこむのが難しいですね。

>N10 N19などの番号がすでに振ってある物として、ここで、ある工具の行程の
>順番を入れ替えた場合、N番号をもう一度ふり直したいのですが、どのようにす
>ればいいでしょうか。

N10 以下は N10,N11,N12・・・N20 のように連番になるのですか?
0番号に挟まれるNの番号を10 から始めて順番にふり直すという単純なことでも
ないようですね。

     では, (^^)/~
                                        山紫水明(ユーザー)
                                        SANSHISUIMEI

[ ]
RE:04649 本文中の番号のふり直しNo.04650
W.Hiroshi さん 05/04/18 23:10
 

> 少し条件が複雑でなかなか呑みこむのが難しいですね。

>N10 以下は N10,N11,N12・・・N20 のように連番になるのですか?

ややこしくてすいません。
N番号の目的は、プログラムの途中から加工を再開するときに呼び出すのに使います。
一つのプログラムで何回か工具を交換しながら加工を進めますので、最初の工具の時
が N10 次の工具の時が N20 その次がN30という具合に増分10ずつ増えていき
ます。
N19というのは、N10の加工が終了した後次の工具に交換するための行程が入ります。
つまり、2番目の工具から加工を始めたいとき、その工具がすでに付いていればN20
から、まだ工具が付いていない時はN19から呼び出すとN20からの工具に交換してから
加工に入るという具合に使います。
N11からN18までの番号は特に意味を持たない上に、途中の行数も不定なので使いませ
ん。

今回マクロで行いたいのは、数字の下一桁は、そのまま残して、二桁目以上を連番に
なるように書き換えられれば目的を達します。
O番号の直後に来る下一桁目が0のN番号をN10,下一桁が9のN番号はN19,その次はN20
とN29、N30とN39という具合です。

[ ]
RE:04650 本文中の番号のふり直しNo.04651
ノノムン さん 05/04/18 23:36
 
私もNC工作機械の勉強をしています。

N番号は特に10番ずつ増えなくても良かったですね。
ただし10番ずつ増えた方が見やすいかも知れません。
また、9とかの数に意味づけをした方が覚えやすいのでしょうか?
敷いて云えば、ラベルのような物でしょうか?
> 今回マクロで行いたいのは、数字の下一桁は、そのまま残して、
> 二桁目以上を連番になるように書き換えられれば目的を達します。
昔のBASICでも10番ずつ増やしたように思います。

W.Hiroshi wrote:
>> 少し条件が複雑でなかなか呑みこむのが難しいですね。

[ ]
RE:04647 本文中の番号のふり直しNo.04652
白雲斎 さん 05/04/19 06:28
 
白雲斎と申します。ご無沙汰しております。
昨夜眠れなかったので、興味本位でマクロを作ってみました。

条件を把握している自信がないので、テスト結果が良好なら使ってみてください。

動作検証:
 ・秀丸 Ver 4.16
 ・正規表現 HMJRE.dll Ver 1.12

---- 以下マクロ文 ----

// N番号が以下の条件であることを前提(想定)にしたマクロ
// ・"Nn0", "Nn9" 以外(N18やN26など)がない( n は数字を表す)
// ・行頭に記述されている
// ・"Nnn" の上一桁(29 なら 2)のみを番号振り直し
// ・数値は、1から始まり、1づつ増幅する
// ・下一桁が 9 の時は、数値の増幅をしない
// ・O番号で増幅した数値を初期化する
// ・最初(初期化後も含む)に見つかった N番号が、"Nn9" の時は例外
// ・"Nn9" の次が "Nn9" の場合は例外

$sb = searchbuffer;
#so = searchoption;
$rb = replacebuffer;

#ncNum = 0;
#isFirst = true;
#isBefore9 = false;

disabledraw;
gofiletop;
searchdown "^(O[0-9]{1,4}|N[0-9]{2})", regular, casesense;
while(result)
{
    if(code == 'O') call ReStart;
    else call ReNumber;
    finddown;
}

gofiletop;
enabledraw;
setsearch $sb, #so;
setreplace $rb;
endmacro;

ERR:
message "予期せぬエラー";
setsearch $sb, #so;
setreplace $rb;
endmacro;

// O番号がマッチした時の処理
ReStart:
    #ncNum = 0;
    #isFirst = true;
    golineend;
return;

// N番号がマッチした時の処理
ReNumber:
    if( #ncNum > 9 ) goto ERR;
    moveto seltopx + 2, seltopy;
    // 最初のマッチが "Nn9" なら例外
    if( #isFirst )
    {
        if( code == '9' ) goto ERR;
        #isFirst = false;
    }
    // "Nn9" の連続は例外
    if( code == '9' )
    {
        if( #isBefore9 ) goto ERR;
        else #isBefore9 = true;
    }
    else
    {
        #ncNum = #ncNum + 1;
        #isBefore9 = false;
    }
    left;
    overwrite str(#ncNum);
return;


__________________________________
Do You Yahoo!?
Upgrade Your Life
http://bb.yahoo.co.jp/

[ ]
RE:04650 本文中の番号のふり直しNo.04653
三月 さん 05/04/19 07:00
 
>
>今回マクロで行いたいのは、数字の下一桁は、そのまま残して、二桁目以上を連番
>になるように書き換えられれば目的を達します。
>O番号の直後に来る下一桁目が0のN番号をN10,下一桁が9のN番号はN19,その次はN2
>0とN29、N30とN39という具合です。

N10からN19までに N20とか他の数値が入らないことを前提に
Nのあとの数値(下1桁を除いた)が変わったらカウントアップさせる
と、いうことで割と愚直に書くとこんな感じかな。
------------------ここから
#NUM=0;
gofiletop;

while(1){
  down; // 次の行
  if( !result ) endmacro; //なければ終り
  // 1文字目取得
  $cmd = gettext(0, y, 1, y);
  //message $cmd;
  if($cmd == "O"){
    // O番号
    #NUM=0;  // 連番リセット
    $ORG=""; // 置換え前数値リセット
  } else if($cmd == "N"){
    // N番号
    $num = ""; // 番号の初期化
    #n = 1;    // 2文字目から
    // Nに続く数値を取得
    while(1){
      // 1文字ずつ取得
      $s = gettext(#n, y, #n + 1, y);
      if( $s >= "0" && $s <= "9" ){
        // 数値なら連結
        $num = $num + $s;
      } else {
        // 数値以外で抜ける
        break;
      }
      // 次の文字へ
      #n = #n + 1;
    }
    //message $num;
    #l = strlen($num) -1; // 置き換える文字数
    // 下1桁を省いた数値
   
    $kami = leftstr($num, #l);
   
    moveto  1, y  ; // 数値の先頭へ移動
    // 不要な数値を削除
    while( #l > 0 ){
      delete;
      #l = #l -1;
    }
    if( $ORG != $kami ){
       // 置き換える数値が変わったら
       #NUM = #NUM + 1; // カウントアップ
       $ORG = $kami;    // 置換え前数値更新
    }
    // 置き換える数値
    $chg = str(#NUM);
    insert $chg;

  }

}
------------------ここまで

[ ]
RE:04652 本文中の番号のふり直しNo.04654
白雲斎 さん 05/04/19 10:46
 
白雲斎と申します。

先のマクロに間違いがあったので、訂正します。
訂正したのは、「ReNumber:」サブルーチンの例外判定
  if( #ncNum > 9 ) goto ERR;
部分です。(念のため全体を再投稿します)

---- 以下マクロ文 ----

$sb = searchbuffer;
#so = searchoption;
$rb = replacebuffer;

#ncNum = 0;
#isFirst = true;
#isBefore9 = false;

disabledraw;
gofiletop;
searchdown "^(O[0-9]{1,4}|N[0-9]{2})", regular, casesense;
while(result)
{
    if(code == 'O') call ReStart;
    else call ReNumber;
    finddown;
}

gofiletop;
enabledraw;
setsearch $sb, #so;
setreplace $rb;
endmacro;

ERR:
message "予期せぬエラー";
setsearch $sb, #so;
setreplace $rb;
endmacro;

// O番号がマッチした時の処理
ReStart:
    #ncNum = 0;
    #isFirst = true;
    golineend;
return;

// N番号がマッチした時の処理
ReNumber:
    moveto seltopx + 2, seltopy;
    // 最初のマッチが "Nn9" なら例外
    if( #isFirst )
    {
        if( code == '9' ) goto ERR;
        #isFirst = false;
    }
    // "Nn9" の連続は例外
    if( code == '9' )
    {
        if( #isBefore9 ) goto ERR;
        else #isBefore9 = true;
    }
    else
    {
        if( #ncNum > 8 ) goto ERR;  // 2桁への昇格は例外
        #ncNum = #ncNum + 1;
        #isBefore9 = false;
    }
    left;
    overwrite str(#ncNum);
return;


__________________________________
Do You Yahoo!?
Upgrade Your Life
http://bb.yahoo.co.jp/

[ ]
RE:04654 本文中の番号のふり直しNo.04662
W.Hiroshi さん 05/04/20 10:31
 
仕事が立て込んでしまい返事が遅くなってしまったことお詫びします。

説明が不足しているため条件が合わないのかもしれませんが、「予期せぬエラー」と
なり止まってしまいます。

マクロの知識が不足しているため、「予期せぬエラー」の原因となっている条件がつ
かめません。

N番号が3桁の時はエラーになりますか。
もしそうなら、N番号は2桁の時と3桁の時があります。(4桁も有りなんですが実
際にはほとんど使いません)

また、今、「予期せぬエラー」として処理している条件を無視して、次の処理を続け
るにはどうすればいいでしょう。
よろしくお願いします。

[ ]
RE:04653 本文中の番号のふり直しNo.04663
W.Hiroshi さん 05/04/20 13:29
 
返事が遅くなってしまい申し訳ありません。

>N10からN19までに N20とか他の数値が入らないことを前提に
>Nのあとの数値(下1桁を除いた)が変わったらカウントアップさせる

行程の順番を入れ替えたり、途中の行程を削除したりした際、N10の次にN29やN39だ
った場合(十の位の数字が同じで無い時)そこでもカウントアップしてしまいますよ
ね。

カウントアップの条件を、「数字の末尾(一の位)が0の時(0以外の数字の時はカウ
ントアップしない)」とするにはどうすればいいでしょうか。


[ ]
RE:04651 本文中の番号のふり直しNo.04664
W.Hiroshi さん 05/04/20 14:39
 
>私もNC工作機械の勉強をしています。
>
>N番号は特に10番ずつ増えなくても良かったですね。

秀丸とは関係ない話ですが、なぜこんな変わった番号を振る必要があるかの言い訳を
少し。

確かに、N番号と言うのは加工自体には何の関係もなく、機械側からすればどんな番
号でもかまわないので、連番でない、でたらめな番号でも、すべての行に1、2、3、
4と連番を振っても良いのですが、それだと加工の区切りと番号が一致するとは限ら
ないので、後から探すのが容易でないので、人間が見てわかりやすいように必要な所
にだけ番号を振るようにしています。

うちにある機械の大部分は、プログラムの途中から加工を再開するとき、N番号でそ
の場所を指定する必要があります。そこで後から再開するかもしれない所にN番号を
振っておきます。

2番目の工具の加工を指定する場合は、N2でもN20でもよいのですが、例えば一番目
の工具の加工が終了した所でいったん機械を止め、次に2番目の工具に工具を交換し
てから加工を始めたいと言う様な時のために、1番目の加工の後で2番目の加工の前
という番号が必要だったので、必然的に2番目の工具の番号をN20として、その直前
をN19とするようにしました。
つまり一の位の数字は、0の時は工程のはじめ、9は工程の終わりを意味します。
ですから一の位の数字はそのまま残して十の位以上を連番になるようにしたいのです。

これは私が勝手に決めた自社内だけのルールです。当然NCが変われば、N番号の必要
性も変わってくると思うので、番号の振り方も各社いろいろかと思います。

[ ]
RE:04662 本文中の番号のふり直しNo.04665
白雲斎 さん 05/04/20 14:55
 
白雲斎と申します。

末尾に修正版のマクロを記しました。取り合えずテストをして欲しいです。

さて、W.Hiroshiさんの投稿を何度も読み返してみましたが、私の頭では条件を
100%把握することが出来ません。

> O番号は、アルファベットの「O」に続く4桁以下の数字
> N番号は、アルファベットの「N」に続く3桁以下の数字

とあるが、
・0桁の可能性もある?
・1桁の場合9の意味づけはどうなる?
など、難しい!!

私の最初の投稿(04652)に、マクロ動作の前提文を記しましたが、
・間違っているところは何処
・不足しているところは何処
・不要なところは何処
を教えてください。

そして出来れば、出現する可能性を網羅した必要最小限の具体的な例文を、変換
前と正しい変換後の2例欲しいです。そこには、

・O番号とN番号以外の行を削除して欲しい(可能なら)
・正しい変換結果の導き方を、工具が何々とか工程が何々とか言う説明ではなく、
  ・変換の基準は何処
  ・数値の範囲(桁)は何
  ・あの数値の次はこうだが、この数値ではこうなる
  ・この数値の次に、この数値がくるのは間違い
 など、要点に的を絞った具体的な説明が欲しいです。

-----------------------------------------------------------------------

今回のマクロの実験結果:

変換前    変換後
--------------------
%       →    %
O2000   →    O2000
N300    →    N10
N309    →    N19
N20     →    N20
N100    →    N30
N109    →    N39
O3000   →    O3000
N70     →    N10
N40     →    N20
N49     →    N29
N800    →    N30
N809    →    N39
%       →    %

---- 以下マクロ文 ----

// 今回の動作前提
// O番号は、1桁から4桁まで
// N番号は、2桁から3桁まで
// N番号の一の位は編集しない

$sb = searchbuffer;
#so = searchoption;
$rb = replacebuffer;

#ncNum = 0;
#isFirst = true;
#isBefore9 = false;

disabledraw;
gofiletop;
searchdown "^(O[0-9]{1,4}|N[0-9]{1,3})", regular, casesense;
while(result)
{
    if(code == 'O') call ReStart;
    else call ReNumber;
    finddown;
}

gofiletop;

MEND:
enabledraw;
setsearch $sb, #so;
setreplace $rb;
endmacro;


// O番号がマッチした時の処理
ReStart:
    #ncNum = 0;
    #isFirst = true;
    golineend;
return;

// N番号がマッチした時の処理
ReNumber:
    moveto selendx - 1, selendy;
    // 最初のマッチが "Nn9" なら例外
    if( #isFirst )
    {
        if( code == '9' )
        {
            message "ERROR: 工程の始まりが Nn9";
            goto MEND;
        }
        #isFirst = false;
    }
    // "Nn9" の連続は例外
    if( code == '9' )
    {
        if( #isBefore9 )
        {
            message "ERROR: Nn9 の連続";
            goto MEND;
        }
        else #isBefore9 = true;
    }
    else
    {
        #ncNum = #ncNum + 1;
        #isBefore9 = false;
    }
    beginsel;
    moveto foundtopx, foundtopy;
    insert "N" + str(#ncNum);
return;


__________________________________
Do You Yahoo!?
Upgrade Your Life
http://bb.yahoo.co.jp/

[ ]
RE:04663 本文中の番号のふり直しNo.04667
三月 さん 05/04/20 21:22
 
>
>カウントアップの条件を、「数字の末尾(一の位)が0の時(0以外の数字の時はカ
>ウントアップしない)」とするにはどうすればいいでしょうか。
>
---- ↓ここの部分を -----
    if( $ORG != $kami ){
       // 置き換える数値が変わったら
       #NUM = #NUM + 1; // カウントアップ
       $ORG = $kami;    // 置換え前数値更新
    }
---- ↓このように ------
    $simo = rightstr($num, 1); // 右から1文字切り出して
    if( $simo == "0" ){
       // 下一桁が"0"のとき
       #NUM = #NUM + 1; // カウントアップ
    }
----- ここまで -----
と、カウントアップの条件をかえるだけでいけます。

[ ]
RE:04667 本文中の番号のふり直しNo.04668
ノノムン さん 05/04/20 21:54
 
ノノムンです

9の次に0がある組み合わせですから、
最初の9までは普通に10ずつカウントUPして、9の次の0はインクリメントを休
み、その次からまたカウントするのではどうなるでしょうか?

三月 wrote:
>>カウントアップの条件を、「数字の末尾(一の位)が0の時(0以外の数字の時はカ
>>ウントアップしない)」とするにはどうすればいいでしょうか。

[ ]
RE:04665 本文中の番号のふり直しNo.04669
白雲斎 さん 05/04/21 06:38
 
白雲斎と申します。

前回は、長々と失礼しました。(今回も!)
今回、マクロ動作の指針/前提を見直したものを記しました。
下記のマクロでの実験結果ともども、間違い等を補足してもらえれば、
問題解決へ向かうのではと考えています。

-----------------------------------------------------------------------
マクロ動作の指針/前提

●O番号
・Oに続く数値の範囲は1桁から4桁まで。O0 〜 O9999
・数値の初期化判定のみが目的で、編集はしない

●N番号
・Nに続く数値の範囲は1桁から3桁まで。N0 〜 N999
・下一桁(一の位)は、0 か 9 のみが存在する
・番号を振りなおすのは、下一桁より上の数値
・よって、処理対象のN番号が一桁の数値の場合、桁が昇格する
 ( N0 → N10、N9 → N19 )
・数値は、1から始まり、1づつ増幅する
・下一桁が 9 の時は、数値の増幅をしない
・「O番号」で増幅した数値を初期化する
・最初(初期化後も含む)に見つかった「N番号」の下一桁が 9 の時は例外
・下一桁が 9 の「N番号」が連続するのは例外

●共通
・両キーワードは行頭に記述されている
・両キーワードの検索で、O,N番号以外がヒットしない。要するに
  ・Onnn、Nnnn が他の目的に使用されていないこと
  ・番号の一部でない数値が番号の末尾に隣接していないこと
-----------------------------------------------------------------------

---- 以下マクロ文 ----

$sb = searchbuffer;
#so = searchoption;
$rb = replacebuffer;

#ncNum = 0;
#isFirst = true;
#isBefore9 = false;

disabledraw;
gofiletop;
searchdown "^(O[0-9]{1,4}|N[0-9]{1,3})", regular, casesense;
while(result)
{
    if(code == 'O') call ReStart;
    else call ReNumber;
    finddown;
}

gofiletop;

MEND:
enabledraw;
setsearch $sb, #so;
setreplace $rb;
endmacro;


// O番号がマッチした時の処理
ReStart:
    #ncNum = 0;
    #isFirst = true;
    golineend;
return;

// N番号がマッチした時の処理
ReNumber:
    moveto selendx - 1, selendy;
    if( #isFirst )
    {
        if( code == '9' )
        {
            message "ERROR: 工程の始まりが Nn9";
            goto MEND;
        }
        #isFirst = false;
    }
    if( code == '9' )
    {
        if( #isBefore9 )
        {
            message "ERROR: Nn9 の連続";
            goto MEND;
        }
        #isBefore9 = true;
    }
    else
    {
        #ncNum = #ncNum + 1;
        #isBefore9 = false;
    }
    beginsel;
    // 「5、6桁では折り返さない」と決め打ち
    moveto 1, y;
    insert str(#ncNum);
return;


__________________________________
Do You Yahoo!?
Upgrade Your Life
http://bb.yahoo.co.jp/

[ ]
RE:04669 本文中の番号のふり直しNo.04670
W.Hiroshi さん 05/04/21 14:07
 
こんにちはW.hiroshiです。

私の説明が下手なために、無駄に頭を悩ませ手を煩わせてしまったこと、深くお詫び
いたします。

マクロテストさせていただきましたが、今のところ不具合箇所は見つかっていません。
私が想定した通りの完璧な動作です。

私の下手な説明を読み取って、マクロを完成させていただき感謝いたします。本当に
ありがとうございました。

今回のマクロを参考にさせてもらいながら、自分でマクロを書ける様に勉強していき
たいと思います。

[ ]
RE:04667 本文中の番号のふり直しNo.04671
W.Hiroshi さん 05/04/21 14:47
 
マクロを書き変えて試してみました。
今回はうまくいきました。今のところ不具合箇所は見つかりません。

私の説明が下手なためによけいな手を煩わせてしまい申し訳ありませんでした。
今回書いていただいたマクロを参考にしながら、自分でもマクロを書ける様に少しず
つでも勉強していきたいと思います。

本当にありがとうございました。

[ ]