座標値の回転 その二No.06233
W.Hiroshi さん 09/09/20 15:57
 
 いつもお世話になっております。W.Hiroshiです。

 今年の1月頃、ここで「座標の回転」と言う事で、テキスト中のXY座標値を回転変
換するためのマクロを作成して頂いたことがありました。 No.06029

 そのとき、山紫水明さんにマクロを作成して頂いたのですが、=>No.06036

例えば、
X10.0Y20.0
X20.0Y30.0
X20.0Y10.0

のようにXとYの座標値だけしか文字が無いときは問題ないので、それで満足していた
のですが、既にNCプログラムとして作成した物などXとYの数値以外の文字が入るとう
まく行かないようです。
 マクロを見ても、私のマクロの知識ではどの部分がどのような動作をしているのか
よく理解できません。
 それ程急いでいるわけではないので、手の空いたときアドバイスお願いします。


 やりたい事

 テキストの中から、XとYの数値を探し、X0Y0を中心として任意の角度回転させた数
値に変換して書き換える
 範囲選択中の場合は、その範囲内のみ
 XとYの数値以外の文字は全てそのまま
 XとYの数値の範囲は、小数点以上4桁以内、小数点以下3桁以内、マイナス符号付の
場合有り
 小数点以下に0だけが続く場合は、最上位の1桁のみを残し削除
(X1.000=>X1.0 X2.100=>X2.1 X3.210=>X3.21)

 以下に、変換に使いたいNCプログラムのサンプルを貼り付けておきますので、よろ
しくお願いします。

Windows XP
秀丸エディタFloat-Macro統合版 7.11

-----サンプルここから-----

O1100()
M98P98
T02
M06T01

N10(..T02-10.0-RF-ED..)
G54G90G00X35.0Y-23.0S2000
G43Z30.0H02
M03M08
Z3.0
G01Z0.2F1000
X-27.0F300
Y-18.491
G03X-13.502Y2.0R18.0
G01X13.502
G03X25.334Y-18.0R18.0
G01X-15.758
G03X-8.337Y-3.0R23.0
G01X8.337
G03X10.304Y-10.5R23.0
G01X-25.0
G00Z30.0
M05M09
N19M98P99
M01T01
M06T02

[ ]
RE:06233 座標値の回転 その二No.06234
山紫水明 さん 09/09/21 09:12
 
 W.Hiroshiさん,

>のようにXとYの座標値だけしか文字が無いときは問題ないので、それで満足し
>ていたのですが、既にNCプログラムとして作成した物などXとYの数値以外の文
>字が入るとうまく行かないようです。

 やれるかどうかは別にして,サンプルデータで少し確認したいことがあります。

G54G90G00X35.0Y-23.0S2000
このようなデータの場合に,X35.0 と Y-23.0 の間に外の文字が入ることがあり
ますか?

X-27.0F300
Y-18.491
このようにXとYが独立の行になって続いているもの,あるいは
G01X-25.0
のようにXだけしかないのがありますが,これらはどう処理しますか?

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

[ ]
RE:06234 座標値の回転 その二No.06235
W.Hiroshi さん 09/09/22 10:21
 
山紫水明さん お世話様です。

 いつも無理なお願いばかりで申し訳ありません。

>G54G90G00X35.0Y-23.0S2000
>このようなデータの場合に,X35.0 と Y-23.0 の間に外の文字が入ることがあり
>ますか?

 G54で始まる行は(実際はG54からG59まであるのですが)、工程の始まりなので、Xと
Yの数値が必ず出てきます。
 他の行でも同じですが、1行の中であれば何処に書いてあっても意味は通じるので
すが、実際は見た目もありますので、XYの順番で、その数値の間に他の文字が入るこ
とはありません。

>X-27.0F300
>Y-18.491
>このようにXとYが独立の行になって続いているもの,あるいは
>G01X-25.0
>のようにXだけしかないのがありますが,これらはどう処理しますか?

 1行の中にXYの数値が両方有るのが原則なのですが、移動しない軸の数値は省略で
きと言う事になっていますので、

「省略されている場合は、その前に出てきた数値と同じ」
と言う事になります。
 場合によっては、Xだけの行や、Yだけの行が何行も続くこともあります。その場合、
省略されている軸の数値は新しい数値が出てくるまで、全て同じと言う事になります。

 急がしい所申し訳ありません。
 手の空いたときにアドバイス頂ければ結構です。
 よろしくお願いします。

[ ]
RE:06235 座標値の回転 その二No.06236
山紫水明 さん 09/09/22 17:48
 
 W.Hiroshiさん,

>「省略されている場合は、その前に出てきた数値と同じ」と言う事になります。
> 場合によっては、Xだけの行や、Yだけの行が何行も続くこともあります。そ
>の場合、省略されている軸の数値は新しい数値が出てくるまで、全て同じと言
>う事になります。

 なるほど,省略されているものも処理するとなると少し敷居が高くなるようで
す。ところで,サンプルの省略行について,
X の場合は
 X-27.0F300
 G01X13.502
のように前か後に他の文字がある形式がありますが,
Y の場合は
Y-18.491
のように,前後に何もない例だけが見られます。このほかの形式もありますか?

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

[ ]
RE:06236 座標値の回転 その二No.06237
W.Hiroshi さん 09/09/22 20:36
 
山紫水明さん、お世話様です。

>X の場合は
> X-27.0F300
> G01X13.502
>のように前か後に他の文字がある形式がありますが,
>Y の場合は
>Y-18.491
>のように,前後に何もない例だけが見られます。このほかの形式もありますか?

サンプルは、パソコンに保存してあったNCプログラムの一部を切り出して貼り付けた
ので、たまたまこういう風になりましたが、

Xだから前後に文字があり、Yだから前後に何もないと言う事はないです。今回は偶然
そう言う部分でしたが、逆のパターンになることもあります。

面倒なことをお願いして申し訳ないです。

[ ]
RE:06237 座標値の回転 その二No.06238
山紫水明 さん 09/09/22 22:39
 
 W.Hiroshiさん,

 以下のようなものを作ってみました。お試しください。

     では, (^^)/~
                                    山紫水明)
                                    SANSHISUIMEI
//----------------------------------------------------------------//
if( selecting ) {
    rangeeditin;
    #select = 1;
}
disabledraw;
setfloatmode 1;
if( result == 0 ) {
    message "浮動小数点数版(統合版)を使ってください。";
    endmacro;
}
setcompatiblemode 0x020c;
gofiletop;
while( 1 ) {
    searchdown2 "X[0-9.-]+(?![0-9.Y])", regular;
    if( result ) {
        #px = foundendx;
        #py = foundendy;
        searchup "Y[0-9.-]+", regular;
        $y = gettext( foundtopx, foundtopy, foundendx, foundendy );
        moveto #px, #py;
        insert $y;
    } else break;
}
gofiletop;
while( 1 ) {
    searchdown2 "^([^X]*)(Y[0-9.-]+)(?\\2)", regular;
    if( result ) {
        #px = foundtopx;
        #py = foundtopy;
        searchup "X[0-9.-]+", regular;
        $x = gettext( foundtopx, foundtopy, foundendx, foundendy );
        moveto #px, #py;
        insert $x;
    } else break;
}
loaddll "HideMath.dll";
#ime = imestate;
if( #ime ) imeswitch;
#angle = val(input("回転角( 反時計回り  単位:度 )"));
if( #angle == 0 ) endmacro;
#angle = #angle * dllfunc( "Pi" ) / 180;
gofiletop;
while( 1 ) {
    searchdown2 "X.+Y.+", regular;
    if( result == false ) break;
    moveto foundtopx, foundtopy;
    searchdown2 "(?<=X)[0-9.-]+", regular;
    #x = val( gettext( foundtopx, foundtopy, foundendx, foundendy, 1 ) );
    delete;
    #p = x;
    searchdown2 "(?<=Y)[0-9.-]+", regular;
    #y = val( gettext( foundtopx, foundtopy, foundendx, foundendy,1 ) );
    delete;
    call Replace #x, #y;
    insert $y2;
    moveto #p, y;
    insert $x2;
}
freedll;
if( #ime ) imeswitch;
gofiletop;
if( #select) rangeeditout;
endmacro;

Replace:
##x2 = ##1 * dllfunc( "Cos", #angle ) - ##2 * dllfunc( "Sin", #angle );
##y2 = ##1 * dllfunc( "Sin", #angle ) + ##2 * dllfunc( "Cos", #angle );
$x2 = dllfuncstr( "Format", "%.3lf", ##x2 );
call Reformat $x2;
$x2 = $$return;
$y2 = dllfuncstr( "Format", "%.3lf", ##y2 );
call Reformat $y2;
$y2 = $$return;
return;

Reformat:
if( rightstr($$1, 1) == "0" ) $$1 = leftstr($$1, strlen($$1) - 1);
if( rightstr($$1, 1) == "0" ) $$1 = leftstr($$1, strlen($$1) - 1);
return $$1;
//----------------------------------------------------------------//


[ ]
RE:06238 座標値の回転 その二No.06239
W.Hiroshi さん 09/09/22 23:26
 
山紫水明さん
早速マクロを作成して頂き有り難うございました。

いくつか試してみましたが、今のところ不具合は見つかりません。
ほぼ想定通りで、完璧な物です。

いつも無理なお願いばかりして申し訳ありません。
なんとお礼を申し上げればいいか、ほんとに感謝しています。
有り難うございました。


[ ]