« isNaNメソッド | トップページ | 1~1000まで »

2022年10月19日 (水)

数値集計

指定文字種で作図された数値を集計する外部変形です。
対象文字は横文字、指定文字種以外は除外します。
指定文字種、行間は、ユーザー設定で指定してください。

2022.10.23  数値⇔文字変換時の誤差対策実施

Photo_20221019162201

@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()

|

« isNaNメソッド | トップページ | 1~1000まで »

コメント

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分

コメントを書く



(ウェブ上には掲載しません)




« isNaNメソッド | トップページ | 1~1000まで »