NCプログラムの変数の書換えNo.05651
tackan さん 07/10/08 10:16
 
はじめまして
みなさんにご教授いただきたいと思い投稿しました。

WindowsXP
秀丸6.14


NCプログラムの変数のデータが下記のように保存されて
いまして計算結果を書換えをするマクロが出来ないかと思っています

データ例)

#500=0
#501=0
#502=18432*65536/33554432
#503=0
#504=20480*65536/[67108864*2]
#505=25600*65536/8388608
#506=16384*65536/[67108864*8]
#507=28160*65536/33554432
#508=[-25088]*65536/33554432
#509=0
#510=-20480*65536/33554432
#511=0
#512=-25600*65536/67108864
#513=-[29491*65536+13107]/[67108864*4]
#514=-[32112*65536+41943]/[67108864*64]


マクロ基本動作想定は、
"#XXX(番号)="はそのまま書き出し、=後の計算結果を以下のように
出力したいのです。

出力例)
#500=0
#501=0
#502=36
#503=0
#504=10
#505=200
#506=2
#507=55
#508=-49

出来るのではないかと思うのですが、
マクロ初心者なのでマクロ文がまったく思いつきません・・・。

部分的でも構いませんのでアドバイス等
宜しくお願いします。



[ ]
RE:05651 NCプログラムの変数の書換えNo.05652
三月 さん 07/10/08 14:07
 
>データ例)
>
>#500=0
>#501=0
>#502=18432*65536/33554432
>#503=0
>#504=20480*65536/[67108864*2]
>#505=25600*65536/8388608
>#506=16384*65536/[67108864*8]
>#507=28160*65536/33554432
>#508=[-25088]*65536/33554432
>#509=0
>#510=-20480*65536/33554432
>#511=0
>#512=-25600*65536/67108864
>#513=-[29491*65536+13107]/[67108864*4]
>#514=-[32112*65536+41943]/[67108864*64]
>
>
>マクロ基本動作想定は、
>"#XXX(番号)="はそのまま書き出し、=後の計算結果を以下のように
>出力したいのです。
>
>出力例)
>#500=0
>#501=0
>#502=36
>#503=0
>#504=10
>#505=200
>#506=2
>#507=55
>#508=-49
>
>出来るのではないかと思うのですが、
>マクロ初心者なのでマクロ文がまったく思いつきません・・・。
>
自力でマクロに計算させるのはかなり難しいのではないかと思われます。

そこでマクロライブラリを検索すると
http://hide.maruo.co.jp/lib/macro/mc_01.html
ポンタさんの数式計算DLLがありましたので、これを使ってやれば
下記のように=の右辺の計算式を取得してDLLに計算してもらって
置き換えるといった動作でできるかと。

あくまでも参考程度って事で。
-------------------------------------
loaddll "Mathcalc.dll";

gofiletop;           // ファイルの先頭へ
searchdown "=";      // =を探す
while( result ) {    // =がなくなるまで
  right;             // =の右側
  #bx = x; #by = y;  // =の右の開始位置
  beginsel;          // 範囲選択開始
  golineend;         // 行末まで選択
  #ex = x; #ey = y;  // 行末の位置
  $exp = gettext(#bx, #by, #ex, #ey, 1); // =の右辺を取得
  cut;               // 切り取る
  #n = dllfunc("SetExpression",$exp); // 計算の実行
  #e = dllfunc("ErrorNo");
  if (#e!=0) {
    insert $ex;      // 計算に失敗したら戻す
  } else {
    #n = dllfunc("Value"); // 結果取得
    insert str(#n);        // 結果表示
  }
  finddown;          // 次ぎの=を探す
}

owari:
freedll;
endmacro;


[ ]
RE:05652 NCプログラムの変数の書換えNo.05653
tackan さん 07/10/08 14:56
 
>
>そこでマクロライブラリを検索すると
>http://hide.maruo.co.jp/lib/macro/mc_01.html
>ポンタさんの数式計算DLLがありましたので、これを使ってやれば
>下記のように=の右辺の計算式を取得してDLLに計算してもらって
>置き換えるといった動作でできるかと。
>
>あくまでも参考程度って事で。
>-------------------------------------
>loaddll "Mathcalc.dll";
>
>gofiletop;           // ファイルの先頭へ
>searchdown "=";      // =を探す
>while( result ) {    // =がなくなるまで
>  right;             // =の右側
>  #bx = x; #by = y;  // =の右の開始位置
>  beginsel;          // 範囲選択開始
>  golineend;         // 行末まで選択
>  #ex = x; #ey = y;  // 行末の位置
>  $exp = gettext(#bx, #by, #ex, #ey, 1); // =の右辺を取得
>  cut;               // 切り取る
>  #n = dllfunc("SetExpression",$exp); // 計算の実行
>  #e = dllfunc("ErrorNo");
>  if (#e!=0) {
>    insert $ex;      // 計算に失敗したら戻す
>  } else {
>    #n = dllfunc("Value"); // 結果取得
>    insert str(#n);        // 結果表示
>  }
>  finddown;          // 次ぎの=を探す
>}
>
>owari:
>freedll;
>endmacro;
>


以上の方法で思ったとおりの書換えが行えました。
本当にありがとうございました。

[ ]
RE:05652 NCプログラムの変数の書換えNo.05654
tackan さん 07/10/08 15:44
 
>>データ例)
>>
>>#500=0
>>#501=0
>>#502=18432*65536/33554432
>>#503=0
>>#504=20480*65536/[67108864*2]
>>#505=25600*65536/8388608
>>#506=16384*65536/[67108864*8]
>>#507=28160*65536/33554432
>>#508=[-25088]*65536/33554432
>>#509=0
>>#510=-20480*65536/33554432
>>#511=0
>>#512=-25600*65536/67108864
>>#513=-[29491*65536+13107]/[67108864*4]
>>#514=-[32112*65536+41943]/[67108864*64]
>>
>>
>>マクロ基本動作想定は、
>>"#XXX(番号)="はそのまま書き出し、=後の計算結果を以下のように
>>出力したいのです。
>>
>>出力例)
>>#500=0
>>#501=0
>>#502=36
>>#503=0
>>#504=10
>>#505=200
>>#506=2
>>#507=55
>>#508=-49
>>
>>出来るのではないかと思うのですが、
>>マクロ初心者なのでマクロ文がまったく思いつきません・・・。
>>
>自力でマクロに計算させるのはかなり難しいのではないかと思われます。
>
>そこでマクロライブラリを検索すると
>http://hide.maruo.co.jp/lib/macro/mc_01.html
>ポンタさんの数式計算DLLがありましたので、これを使ってやれば
>下記のように=の右辺の計算式を取得してDLLに計算してもらって
>置き換えるといった動作でできるかと。
>
>あくまでも参考程度って事で。
>-------------------------------------
>loaddll "Mathcalc.dll";
>
>gofiletop;           // ファイルの先頭へ
>searchdown "=";      // =を探す
>while( result ) {    // =がなくなるまで
>  right;             // =の右側
>  #bx = x; #by = y;  // =の右の開始位置
>  beginsel;          // 範囲選択開始
>  golineend;         // 行末まで選択
>  #ex = x; #ey = y;  // 行末の位置
>  $exp = gettext(#bx, #by, #ex, #ey, 1); // =の右辺を取得
>  cut;               // 切り取る
>  #n = dllfunc("SetExpression",$exp); // 計算の実行
>  #e = dllfunc("ErrorNo");
>  if (#e!=0) {
>    insert $ex;      // 計算に失敗したら戻す
>  } else {
>    #n = dllfunc("Value"); // 結果取得
>    insert str(#n);        // 結果表示
>  }
>  finddown;          // 次ぎの=を探す
>}
>
>owari:
>freedll;
>endmacro;
>


三月さんの方法でできましたが、
不具合と追加したいものがありますので、
宜しくお願いします。


[元データ例1]
#513=-[29491*65536+13107]/[67108864*4]
#514=-[32112*65536+41943]/[67108864*64]
#515=-32768*65536/67108864
#516=[24903*65536+44565]/[67108864*64]
#517=30720*65536/33554432

[元データ例2]
#532=#0
#533=#0
#534=#0
#535=#0
#536=#0


上記の元データ例1の#514のように計算結果が少数の場合、
0と出力されてしまいます。


また元データ例2のように=の後が#0の場合、
そのまま#0を出力したい。


まったくの素人で、お願いばかりで申し訳ございませんが、
宜しくお願いします。


[ ]
RE:05654 NCプログラムの変数の書換えNo.05655
三月 さん 07/10/08 16:50
 
>[元データ例1]
>#513=-[29491*65536+13107]/[67108864*4]
>#514=-[32112*65536+41943]/[67108864*64]
>#515=-32768*65536/67108864
>#516=[24903*65536+44565]/[67108864*64]
>#517=30720*65536/33554432
>

>上記の元データ例1の#514のように計算結果が少数の場合、
>0と出力されてしまいます。
>
少数の場合にどうなってほしいか不明です。
少数を使いたい場合、
http://hide.maruo.co.jp/software/hmfloat.html
の秀丸エディタ浮動小数点数バージョンをつかって、
マクロの先頭に
setfloatmode 1;
を追加、
ポンタさんの数式計算DLLも浮動小数点数バージョンにすれば
少数はでると思いますが(未確認)少数以下が0の場合に
どうなるか不明(未確認)。

>[元データ例2]
>#532=#0
>#533=#0
>#534=#0
>#535=#0
>#536=#0
>
>また元データ例2のように=の後が#0の場合、
>そのまま#0を出力したい。
>

  $exp = gettext(#bx, #by, #ex, #ey, 1); // =の右辺を取得
  cut;               // 切り取る
  if( strstr($exp, "#0" ) >= 0 ){
    insert $exp; // "#0"があればそのまま
  } else {
    // "#0"がなければ計算する
    #n = dllfunc("SetExpression",$exp); // 計算の実行
    #e = dllfunc("ErrorNo");
    if (#e!=0) {
      insert $ex;      // 計算に失敗したら戻す
    } else {
      #n = dllfunc("Value"); // 結果取得
      insert str(#n);        // 結果表示
    }
  }
のように#0を判定すればよいでしょう。

[ ]
RE:05655 NCプログラムの変数の書換えNo.05656
三月 さん 07/10/08 18:04
 
>>[元データ例1]
>>#513=-[29491*65536+13107]/[67108864*4]
>>#514=-[32112*65536+41943]/[67108864*64]
>>#515=-32768*65536/67108864
>>#516=[24903*65536+44565]/[67108864*64]
>>#517=30720*65536/33554432
>>
>
>>上記の元データ例1の#514のように計算結果が少数の場合、
>>0と出力されてしまいます。
>>
>少数の場合にどうなってほしいか不明です。
>少数を使いたい場合、
>http://hide.maruo.co.jp/software/hmfloat.html
>の秀丸エディタ浮動小数点数バージョンをつかって、
>マクロの先頭に
>setfloatmode 1;
>を追加、
>ポンタさんの数式計算DLLも浮動小数点数バージョンにすれば
>少数はでると思いますが(未確認)少数以下が0の場合に
>どうなるか不明(未確認)。
>
実際に浮動小数点版にすると下記のようになった。

#513=-7.199999999254942
#514=-0.4899999999906868
#515=-32
#516=0.3800000001210719
#517=60

[ ]
RE:05656 NCプログラムの変数の書換えNo.05657
tackan さん 07/10/09 07:58
 

>実際に浮動小数点版にすると下記のようになった。

おはようございます
実際、浮動少数点バージョンで実行したところ、下記のマクロ、データで行ったとこ
ろ少数点以下が表示されません。浮動小数点数バージョンで実行できているのです
が・・・
三月さんのような結果にしたいのですが


[マクロ]
setfloatmode 1;
loaddll "Mathcalc.dll";

if( 1/2 == 0 ) {
        message "整数バージョンです";
    } else {
        message "浮動小数点数バージョンです";
    }

gofiletop;           // ファイルの先頭へ
searchdown "=";      // =を探す
while( result ) {    // =がなくなるまで
  right;             // =の右側
  #bx = x; #by = y;  // =の右の開始位置
  beginsel;          // 範囲選択開始
  golineend;         // 行末まで選択
  #ex = x; #ey = y;  // 行末の位置
  $exp = gettext(#bx, #by, #ex, #ey, 1); // =の右辺を取得
  cut;               // 切り取る
  if( strstr($exp, "#0" ) >= 0 ){
    insert $exp;  // "#0"があればそのまま
  } else {        // "#0"がなければ計算する
  //message($exp);
  #n = dllfunc("SetExpression",$exp); // 計算の実行
  #e = dllfunc("ErrorNo");
  if (#e!=0) {
    insert $ex;      // 計算に失敗したら戻す
  } else {
    #n = dllfunc("Value"); // 結果取得
insert str(#n);        // 結果表示
  }
 }
  finddown;          // 次の=を探す
}

owari:
freedll;
endmacro;


[データ]
#500=0
#501=0
#502=18432*65536/33554432
#503=0
#504=20480*65536/[67108864*2]
#505=25600*65536/8388608
#506=16384*65536/[67108864*8]
#507=28160*65536/33554432
#508=-25088*65536/33554432
#509=0
#510=-20480*65536/33554432
#511=0
#512=-25600*65536/67108864
#513=-[29491*65536+13107]/[67108864*4]
#514=-[32112*65536+41943]/[67108864*64]
#515=-32768*65536/67108864
#516=[24903*65536+44565]/[67108864*64]
#517=30720*65536/33554432
#518=16384*65536/[67108864*16]


出力結果

#500=0
#501=0
#502=36
#503=0
#504=10
#505=200
#506=2
#507=55
#508=-49
#509=0
#510=-40
#511=0
#512=-25
#513=-7
#514=0
#515=-32
#516=0
#517=60
#518=1

なぜか理由がわかりません。
宜しくお願いします。

[ ]
RE:05651 NCプログラムの変数の書換えNo.05658
ENCODINGSHIFTJIS さん 07/10/09 14:24
 
PowerShell のスクリプトを秀丸で作り、PowerShell 窓に投げ込んでみました

#504=20480*65536/[67108864*2]

'#504=' + $(20480*65536/(67108864*2) )

最初に [と]を (と) に全置換して
引用符と プラスと $( ) でくくる。
それを PowerShell に投入

結果は

PS > '#504=' + $(20480*65536/(67108864*2) )
#504=10
PS >
これを回収、マクロ無しでも、手作業でもできますが。
PSは cmd.exe より 高機能です。

[ ]
RE:05657 NCプログラムの変数の書換えNo.05659
秀丸担当 さん 07/10/09 16:49
 

>おはようございます
>実際、浮動少数点バージョンで実行したところ、下記のマクロ、データで行ったとこ
>ろ少数点以下が表示されません。浮動小数点数バージョンで実行できているのです
>が・・・
>三月さんのような結果にしたいのですが

こちらでやってみたところ、結果は三月さんと同じようになりました。
何が違うのでしょうか。
もし浮動小数点数版に不具合があるとしたら、調査しなければならないかもしれ
ません。
関係あるかわからないですが、秀丸エディタのバージョン、Windowsの種類、
Mathcalc.dllのバージョン(ファイルの日付と大きさ?)は何でしょうか。

[ ]
RE:05657 NCプログラムの変数の書換えNo.05660
三月 さん 07/10/09 19:15
 
>なぜか理由がわかりません。

秀丸担当 さんのかかれているように、
Mathcalc.dllが整数バージョンの可能性が高いです。
Mathcalc.dllの整数バージョンで動かしたら少数以下がすきませんでした。

整数版秀丸で浮動小数点数版dllをつかおうとするとエラーになりますが
逆はエラーにならないようです。

私の経験からすると、lzhをひらいたままdllを回答すると前回のdllが
キャッシュから引っ張り出されて代わらないと言うことも・・・

[ ]
RE:05659 NCプログラムの変数の書換えNo.05661
tackan さん 07/10/09 21:19
 
>秀丸担当さんへ

関係あるかわからないですが、秀丸エディタのバージョン、Windowsの種類、Mathcal
c.dllのバージョン(ファイルの日付と大きさ?)は何でしょうか。


秀丸担当さん、こんばんわ
先ほど、秀丸をアンインストールして統合版を再インストールしたら
三月のように小数点以下のの結果がでました。

お手数かけてすいませんでした。


>三月さんへ
おっしゃるとおり、整数バージョンで動いていたようです。

三月さんのおかげで想定していた計算、書き換えができました。
本当にありがとうございました。



[ ]
RE:05658 NCプログラムの変数の書換えNo.05662
ENCODINGSHIFTJIS さん 07/10/10 15:20
 
NCソース(定数式)  から 秀丸マクロを 発生させ、それを実行して
NCソースを得ることもできます。

全置換
^(.+?)=(.+)

insert "\1="+ str(\2) ;insertreturn;
により
setfloatmode 1; gofileend;

insert "#500="+ str(0) ;insertreturn;
insert "#501="+ str(0) ;insertreturn;
insert "#502="+ str(18432*65536/33554432) ;insertreturn;
insert "#503="+ str(0) ;insertreturn;
insert "#504="+ str(20480*65536/(67108864*2)) ;insertreturn;
insert "#505="+ str(25600*65536/8388608) ;insertreturn;
insert "#506="+ str(16384*65536/(67108864*8)) ;insertreturn;
insert "#507="+ str(28160*65536/33554432) ;insertreturn;
insert "#508="+ str((-25088)*65536/33554432) ;insertreturn;
insert "#509="+ str(0) ;insertreturn;
insert "#510="+ str(-20480*65536/33554432) ;insertreturn;
insert "#511="+ str(0) ;insertreturn;
insert "#512="+ str(-25600*65536/67108864) ;insertreturn;
insert "#513="+ str(-(29491*65536+13107)/(67108864*4)) ;insertreturn;
insert "#514="+ str(-(32112*65536+41943)/(67108864*64)) ;insertreturn;

これを、マクロとして保存、マクロ実行すると

#500=0
#501=0
#502=36
#503=0
#504=10
#505=200
#506=2
#507=55
#508=-49
#509=0
#510=-40
#511=0
#512=-25
#513=-7.199999999254942
#514=-0.4899999999906868

[ ]
RE:05662 NCプログラムの変数の書換えNo.05663
山紫水明 さん 07/10/10 20:30
 
 ENCODINGSHIFTJISさん,

>NCソース(定数式)  から 秀丸マクロを 発生させ、それを実行して
>NCソースを得ることもできます。

 こういうやり方もおもしろいです。少々強引な気もしますが。
どうせやるなら,いっそ全部マクロで自動化できますね。

//---------------------------------------------
$file = filename2;
disabledraw;
replaceallfast"[", "(";
replaceallfast"]", ")";
replaceallfast"^(.+?)=(.+)",
    "insert \"\\1=\"+ str(\\2) ;insertreturn;", regular;
gofiletop;
insert "setfloatmode 1;\n";
gofileend;
insert "endmacro;\n";
saveas macrodir + "\\@@NC.mac";
#handle = hidemaruhandle( 0 );
newfile;
closehidemaru #handle;
execmacro "@@NC.mac";
changename $file;
endmacro;
//---------------------------------------------

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

[ ]