数値集計
@if(0==1) //数値集計
@echo off
REM #jww
REM #cd
REM #h3
REM #hc 範囲選択してください。
REM #0 位置を指定してください
REM #e
cscript //nologo //e:jscript "%~f0" %*
copy temp.txt jwc_temp.txt
del temp.txt
goto:eof
@end
//ファイルオープン
fso=new ActiveXObject("Scripting.FileSystemObject")
r=fso.OpenTextFile("jwc_temp.txt")
w=fso.CreateTextFile("temp.txt")
//ユーザー設定
cnn="cn3" //指定文字種
dh=3 //行間
tl="合計 " //タイトル
//初期設定
dq="\"" //ダブルコーテーション
sp=" " //スペース
sum=0 //初期値
x=0;y=0 //作図原点
dx=5;dy=0 //水平指定
n=0 //カウンタ
k=5 //小数点第5位
k=Math.pow(10,k) //累乗
/////jwc_temp.txt読込み
while (!r.AtEndOfLine){
line=r.ReadLine()
if(/hq/.test(line)){}
else if(/hs/.test(line)){
//各レイヤグループの尺度を配列に格納
hs=line.split(/\s+/)
for(i=0;i<=9;i++){hs[i]=hs[i+1]}
hs["a"]=hs[11];hs["b"]=hs[12];hs["c"]=hs[13]
hs["d"]=hs[14];hs["e"]=hs[15];hs["f"]=hs[16]
}
else if(/lg/.test(line)){
lg=line.substr(2) //レイヤグループ名(0~9、a~f)
s=hs[lg] //尺度(1/S)
}
//文字種取得
else if(/^cn/.test(line)){
cn=line.split(/\s+/)
cn=cn[0]
cnf=cn.substr(3,1)
if(cn==cnn){jd=1 //指定文字種
w.WriteLine(line)}
else if(cnf=="$"){ //フォント
if(n==0){
w.WriteLine(line)
n=n+1}
else{id=0}}
else{jd=0}} //他文字種
else if(/#/.test(line)){
w.WriteLine(line) //区切り
w.WriteLine("cc2")} //文字基点(右下)
//文字取得
else if(/^ch/.test(line)){
ch=line.split(/\s+/)
ch=ch[5];chn=ch.split(dq) //数値取得
chn=Number(chn[1]) //数値変換
err=msg(chn) //数値判定
val=["ch",x,y,dx,dy,dq+chn]
val=val.join(sp)
if(jd==1){
if(err=="OK"){
sum=sum+chn
w.WriteLine(val)
y=y-s*dh}
else{}} //数値以外
else{}}
//設定情報
else{w.WriteLine(line)}} //while
/////作図
if(sum==0){
w.WriteLine("h#数値がありません")
WScript.Quit(0)}else{}
sum=String(sum) //文字変換(端数
sum=Number(sum) //数値変換
sum=Math.round(sum*k)/k //四捨五入(第6位)
sum=["ch",x,y,dx,dy,dq+tl+sum]
sum=sum.join(sp)
w.WriteLine(sum)
//ユーザー定義関数
function msg(n){
if(isNaN(n)){
return "NG"} //NaN
else{ return "OK"}}
r.Close();w.close()
| 固定リンク
コメント
somem様
お世話になっております
実行しましたが…
・時々、合計が少数13桁で吐き出すみたいです
・例えば、文字種5で色がsxf場合拾わないみたいです
・縮尺値が大きい場合、行間を百単位でせっていですね?
アルファベットなど混在した空間で数値拾えるのがとても有難いです
以上、確認しました
投稿: a.fujii | 2022年10月22日 (土) 08時15分
a.fujiさん、こんばんは。
>時々、合計が少数13桁で吐き出すみたいです
再現性があるのであれば、条件を教えてください。
>例えば、文字種5で色がsxf場合拾わないみたいです
sxf線色を指定できるのは、任意サイズです。
サイズが同じでも、指定文字種として認識しません。
>縮尺値が大きい場合、行間を百単位でせっていですね?
縮尺対応のスプリクトに修正しました。m(__)m
投稿: somem | 2022年10月22日 (土) 22時02分
somem様
お世話になっております
縮尺対応ありがとうございます。
少数13桁の件
実際の掃き出し例
①
761.987
761.94
761.893
761.987
761.94
761.893
合計 4571.64
②
761.987
761.94
761.893
762.034
761.987
761.94
761.893
合計 5333.674000000001
③
762.081
762.034
761.987
761.94
762.081
762.034
761.987
761.94
合計 6096.084000000001
④
762.128
762.081
762.034
761.987
762.128
762.081
762.034
761.987
合計 6096.46
と言う感じ
同じCADデータ上です
投稿: a.fujii | 2022年10月23日 (日) 08時56分
追伸
⑤
762.081
762.034
761.987
761.94
761.893
762.081
762.034
761.987
761.94
761.893
合計 7619.869999999999
端数処理でしょうか?
投稿: a.fujii | 2022年10月23日 (日) 09時05分
a.fujiさん
検証データありがとうございます。
数値変換後、数値加算を繰り返す簡単なスプリクトです。
端数は、スプリクト言語側の内部処理で、
数値にダブルコーテーションを付加する際に、
発生する場合があるようです。(文字作図のルール)
もう一度、数値に戻して、四捨五入処理が必要ですね。
↓上段が加算値、下段がダブルコーテーション付加
762.081
"762.081
1524.115
"1524.115
2286.102
"2286.102
3048.042
"3048.042
3809.935
"3809.935
4572.016
"4572.016
5334.05
"5334.049999999999
6096.037
"6096.036999999999
6857.93
"6857.929999999999
7619.87
"7619.869999999999
7619.87
ch 0 -30 5 0 "合計 7619.869999999999
投稿: somem | 2022年10月23日 (日) 12時20分
somem様
お世話になっております
問題なく処理できました
お邪魔しました~
投稿: a.fujii | 2022年10月24日 (月) 10時20分