テキスト中の数値に対して計算No.05529
W.Hiroshi さん 07/05/03 11:51
 
皆さんこんにちは
秀丸マクロで、テキスト中の数字に対して計算をして本文を書き換えるという事が出
来ないかと考えています。

WindowsXP
秀丸6.07

NC制御工作機械のプログラムを編集しています。

X-9.5Y-29.0
X-10.0Y-42.0
X-9.5Y-55.0
X-58.0Y-14.3
X-65.0Y-16.0

の様に、図形のXYZのそれぞれの座標値を表す部分があるのですが、その座標値の部
分に対して、有る数値を加算して書き換える事が出来ないかと考えています。
(入力した数字の分だけ図形を移動させたい。)


具体的なマクロの動作想定としては、

書き換えたい部分を範囲選択した状態で、マクロを起動すると、
X,Y,Zそれぞれに加算する数値を入力するダイアログを表示

それぞれの項目に加算したい数値を入力して、「OK」を押すと、本文中のそれぞれの
数値に対して、入力した数値を加算して本文を書き直す。
(数値の入力がない項目は、何もしない。)
と言う事をしたいのです。

例えば、ダイアログで、X「10.0」と入力したら、範囲選択した本文中の全てのXの
数値を10.0増やした数字に書き換えたい。
また、X「-10.0」とマイナス符号を付けて入力したら、範囲選択した本文中の全て
のXの数値を10.0減らした数字に書き換えたい。

本文中の数値の条件
本文中は全て半角大文字で、アルファベットと数字の組み合わせ。
今回処理したいのはそのうち、「X」「Y」「Z」に続く数字(それ以外のアルファベ
ットは無視)
マイナス符号が付く場合有り(プラスの場合は何も付けない)
数字は、小数点以上4桁以下、小数点以下3桁以下の数字(桁数は不定)
但し、「0.0」の場合は、小数点を付けずに単に「0」と表記している場合有り。
数字の後は、他のアルファベットか改行

範囲選択の最初から、
「X」「Y」「Z」を検索して、ヒットしたらその後に続く数字を取り出し、先に入力
した数値を加算して、同じ場所に書き戻す。
範囲選択の最後まで繰り返す。
と言うような事を考えています。

説明が下手なのですいません、分かって頂けたでしょうか。

何となく出来るんじゃないかなと思うだけで、具体的なマクロ文が思い付きません。
部分的にでもかまいませんのでアドバイスお願いします。

よろしくお願いします。

[ ]
RE:05529 テキスト中の数値に対して計算No.05530
アルビレオ さん 07/05/03 12:38
 
ユーザーのアルビレオです。

がんばれば秀丸単体でもできなくはない気はしますが、NCの制御プログラムとな
ると処理量も大きなものになりそうで、秀丸では荷が重いかもしれません。
また例にあるようにZが省略されている場合の処理とかを考慮するとさらに複雑
になりそうです。

こういう処理にはperlなどの力を借りた方が簡単にできると思います。
行の内容をレコードに分解するのが簡単で、変数をたくさん持てるし、処理も高
速なので。
さらに変数に「なし」(nil)を値として持てるのも、Zが省略された場合の処理な
どを楽にできるので有利です。

その場合の大まかな流れとしては、
1.選択範囲の開始位置と終了位置を記録(行番号だけでいい)
2.ダイアログを出して数値を入力させる
3.変換対象のファイル名と変換開始/終了位置、変換数値をコマンドラインとし
てperlに渡す。
4.perlの実行終了を待って、変換結果を再読み込み
といったマクロを書けばいけるんじゃないかと思います。
もちろんそれとは別に、変換用のperlスクリプトも作っておかなきゃいけません
が。

私自身はperlについては多少かじった程度でしかないので、実際のスクリプトは
もっと詳しい人が現れることを期待します(他力本願) (^^;

>皆さんこんにちは
>秀丸マクロで、テキスト中の数字に対して計算をして本文を書き換えるという事が出
>来ないかと考えています。
>
>WindowsXP
>秀丸6.07
>
>NC制御工作機械のプログラムを編集しています。
>
>X-9.5Y-29.0
>X-10.0Y-42.0
>X-9.5Y-55.0
>X-58.0Y-14.3
>X-65.0Y-16.0
>
>の様に、図形のXYZのそれぞれの座標値を表す部分があるのですが、その座標値の部
>分に対して、有る数値を加算して書き換える事が出来ないかと考えています。
>(入力した数字の分だけ図形を移動させたい。)
>
>
>具体的なマクロの動作想定としては、
>
>書き換えたい部分を範囲選択した状態で、マクロを起動すると、
>X,Y,Zそれぞれに加算する数値を入力するダイアログを表示
>
>それぞれの項目に加算したい数値を入力して、「OK」を押すと、本文中のそれぞれの
>数値に対して、入力した数値を加算して本文を書き直す。
>(数値の入力がない項目は、何もしない。)
>と言う事をしたいのです。
>
>例えば、ダイアログで、X「10.0」と入力したら、範囲選択した本文中の全てのXの
>数値を10.0増やした数字に書き換えたい。
>また、X「-10.0」とマイナス符号を付けて入力したら、範囲選択した本文中の全て
>のXの数値を10.0減らした数字に書き換えたい。
>
>本文中の数値の条件
>本文中は全て半角大文字で、アルファベットと数字の組み合わせ。
>今回処理したいのはそのうち、「X」「Y」「Z」に続く数字(それ以外のアルファベ
>ットは無視)
>マイナス符号が付く場合有り(プラスの場合は何も付けない)
>数字は、小数点以上4桁以下、小数点以下3桁以下の数字(桁数は不定)
>但し、「0.0」の場合は、小数点を付けずに単に「0」と表記している場合有り。
>数字の後は、他のアルファベットか改行
>
>範囲選択の最初から、
>「X」「Y」「Z」を検索して、ヒットしたらその後に続く数字を取り出し、先に入力
>した数値を加算して、同じ場所に書き戻す。
>範囲選択の最後まで繰り返す。
>と言うような事を考えています。
>
>説明が下手なのですいません、分かって頂けたでしょうか。
>
>何となく出来るんじゃないかなと思うだけで、具体的なマクロ文が思い付きません。
>部分的にでもかまいませんのでアドバイスお願いします。
>
>よろしくお願いします。

[ ]
RE:05529 テキスト中の数値に対して計算No.05531
山紫水明 さん 07/05/03 17:13
 
 W.Hiroshiさん,

>NC制御工作機械のプログラムを編集しています。

 前にもNC制禦のことが話題にあったような。
 アルビレオさんが,折角perl をお勧めなのにしゃしゃり出るのも気が引けま
すが,秀丸エディタでやるとしたら,こうなるのかなと,とりあえず作ってみま
した。実用的かどうかは別として。
 このマクロは浮動小数点(統合版)が必要です。実は私自身,これまで通常版
しか使ったことがなかったのですが,統合版ができたのを機会に今回初めて使用
してみました。
秀丸エディタ Ver.7.0 β2 で試してみました。
//-----------------------------------------------------//
$x = input("X の加算値");
$y = input("Y の加算値");
$z = input("Z の加算値");

if( selecting ) rangeeditin;// 部分編集
setfloatmode 1;
setcompatiblemode 0x020c;
disabledraw;
call Sub "X", $x;
call Sub "Y", $y;
call Sub "Z", $z;
if( rangeeditmode ) rangeeditout;// 部分編集解除
endmacro;

Sub:
gofiletop;
while( 1 ) {
    searchdown2 "(?<=" + $$1 + ")[0-9.-]+", regular;
    if( !result )  break;
    $s = gettext( foundtopx, foundtopy, foundendx, foundendy, 1 );
    $a = str( val($s) + val($$2) );
    insert $a;
    right;
}
return;
//-----------------------------------------------------//

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

[ ]
RE:05530 テキスト中の数値に対して計算No.05532
W.Hiroshi さん 07/05/03 19:48
 
>がんばれば秀丸単体でもできなくはない気はしますが、NCの制御プログラムとな
>ると処理量も大きなものになりそうで、秀丸では荷が重いかもしれません。
>また例にあるようにZが省略されている場合の処理とかを考慮するとさらに複雑
>になりそうです。

やはり難しいですかね。
自分には知識がないので難しいけれど、マクロの知識のある人なら簡単に出来てしま
うかも、などという甘い考えがあったのですが(^^ゞ

確かに、実際のプログラムには、Xだけの行Yだけの行Zだけの行、それぞれが組み
合わさった行があります。
もちろんXYZ以外の文字が含まれている事もあります。
また、実際の処理としては、プログラムの中のXにだけ加算、あるいはYにだけ、Z
にだけ加算、またはXに100.0Yに50.0加算(Zはそのまま)などというよ
うな使い方になると思います。

ただ、処理対象は、プログラム全体ではなく、その一部に対してだけを想定していま
すので、(そのために、選択範囲のみを処理対象とするようにしたい)
数百文字程度から多くても数万文字程度と考えています。


>こういう処理にはperlなどの力を借りた方が簡単にできると思います。

「perl」というのはよく聞くのですが、どのような物か、どのようにすれば使えるの
か全く分かりません。
何か購入する必要があるのでしょうか。
素人が簡単に導入出来る物なのでしょうか。
もっとも、秀丸マクロもよく理解出来てない現状で、また他の処理言語を一から覚え
るというのは、かなり気が重いですが。

[ ]
RE:05531 テキスト中の数値に対して計算No.05533
W.Hiroshi さん 07/05/03 20:26
 
山紫水明さんこんにちは

> 前にもNC制禦のことが話題にあったような。

はい、以前にもNCプログラムの編集関連でたびたびお世話になっています。(いつ
もお世話になりっぱなしですが)

> アルビレオさんが,折角perl をお勧めなのにしゃしゃり出るのも気が引けま
>すが,秀丸エディタでやるとしたら,こうなるのかなと,とりあえず作ってみま
>した。実用的かどうかは別として。
> このマクロは浮動小数点(統合版)が必要です。

有り難うございます、早速、秀丸エディタ Ver.7.0 β2を導入して試してみました。
まだ、短いデータしか試してないですけど、ほぼ想定通りの動作でした。
ただ、一つだけ問題が、
小数点以下が「0」の場合、小数点も含めて「.0」の文字が消えてしまいます。(小
数点以下に数字がある場合は問題ないようですが。)

うちにある工作機械の場合、小数点のない数値は最小制御単位(通常は0.001ミ
リ)の単位の数値として扱われてしまいますので、ちょっと具合が悪いです。
小数点以下が「0」の場合でも、小数点が消えないようにするにはどうしたらよいの
でしょう。


[ ]
RE:05533 テキスト中の数値に対して計算No.05534
山紫水明 さん 07/05/03 21:25
 
 W.Hiroshiさん,

>うちにある工作機械の場合、小数点のない数値は最小制御単位(通常は0.0
>01ミリ)の単位の数値として扱われてしまいますので、ちょっと具合が悪い
>です。
>小数点以下が「0」の場合でも、小数点が消えないようにするにはどうしたらよ
>いのでしょう。

 そういう問題があるだろうとは思っていました。
 具体的には,例えば
12 は 12.0,12.00,12.000
あるいは
3.5 の場合,3.5,3.50,3.500
と3種の表しかたがありますが,どれがよいのでしょう。

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

[ ]
RE:05534 テキスト中の数値に対して計算No.05535
W.Hiroshi さん 07/05/03 22:19
 
山紫水明さんこんばんは

> 具体的には,例えば
>12 は 12.0,12.00,12.000
>あるいは
>3.5 の場合,3.5,3.50,3.500
>と3種の表しかたがありますが,どれがよいのでしょう。

小数点以下に数字がある「3.5」の場合、それを表現出来る最小文字数と言う事で、
「3.5」でよいです。
(その数字より右側に数字がない場合右側の「0」は必要ないです)

小数点以下に数字がない「12」の場合、機械側は小数点まで有れば用は足すのですが、
人間が読む時の見栄えを考えて「12.0」としたいです。
(「12.」だと小数点が有るのか無いのか見えにくいため)
以上、よろしくお願いします。

[ ]
RE:05535 テキスト中の数値に対して計算No.05536
山紫水明 さん 07/05/03 23:03
 
 W.Hiroshiさん,

 それでは下から5行目
$a = dllfuncstr( "Format", "%.3lf", val($s) + val($$2) );
の次に
if( strstr( $a, "." ) < 0) $a = $a + ".0";
の1行を追加してみてください。

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

[ ]
RE:05536 テキスト中の数値に対して計算No.05538
W.Hiroshi さん 07/05/04 21:34
 
山紫水明さんこんにちは

> それでは下から5行目
>$a = dllfuncstr( "Format", "%.3lf", val($s) + val($$2) );
>の次に
>if( strstr( $a, "." ) < 0) $a = $a + ".0";
>の1行を追加してみてください。

前回紹介して頂いたマクロに、一行追加して見ました。
想定通りの動作になりました。
これ使わせて頂いてもよろしいでしょうか。

ところで、前回紹介頂いたマクロでは、下から5行目は、

$a = str( val($s) + val($$2) );

となっていましたが、

$a = dllfuncstr( "Format", "%.3lf", val($s) + val($$2) );

とした方がよいのでしょうか。
この違いは何でしょう。(全く内容を理解出来てない)
ちなみに、この行を書き換えてみたら、dllが呼び出されていないというようなエ
ラーが出てしまいました。

[ ]
RE:05538 テキスト中の数値に対して計算No.05539
山紫水明 さん 07/05/04 22:25
 
 W.Hiroshiさん,

>これ使わせて頂いてもよろしいでしょうか。

 問題なければそれで使ってください。

>$a = dllfuncstr( "Format", "%.3lf", val($s) + val($$2) );

 これは,小数点以下を3桁に固定するために書いた,こちらの作業用の1行で
した。無視してください。

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

[ ]
RE:05539 テキスト中の数値に対して計算No.05540
W.Hiroshi さん 07/05/05 09:56
 
山紫水明さんこんにちは。

> 問題なければそれで使ってください。

有り難うございます。

今のところ、目立つような不具合は見つかりません。
秀丸マクロでは、難しい処理になってしまうのかなと諦めか掛けていましたが、
これぐらいに出来れば、十二分です。
感謝感謝です。

マクロが使いこなせると、かなり便利になりますね。
分かってはいるんですがなかなか覚えられないです。


> これは,小数点以下を3桁に固定するために書いた,こちらの作業用の1行で
>した。無視してください。
了解しました。

実は、NCプログラム関連で、秀丸マクロで出来ないかなと思っている事が他にもあ
るんですが、こちらはそのうち別に投稿したいと思います。

[ ]