Indexへ
(26822)//【26823】→(26832)
------------------------
【タイトル】数値の丸めの外部変形について
【記事番号】 26823 (*)
【 日時 】05/02/08 22:21
【 発言者 】art modanart@hotmail.com

いつも参考にさせて頂いております。
当方は、土木系のコンサルタントに従事する技術者です。
現在下水の図面を作成中なのですが、S=1/500の平面図に将来計画排水管に見立てた線分を適当に引きこれに寸法値にて延長(mm表示、三桁ごとに空白有り)を表示しています。
ところが、適当に線分の長さを引くので細かな延長がでてしまいます。(例えば:15 251というように)
そこでこれを10cm単位に丸めたいのですが(12 251を12 300のように10cm単位の四捨五入)このような外部変形はないんでしょうか。いろいろと探したのですが、小数点がある場合は出来ても空白の場合に出来るものは探す事が出来ませんでした。よろしくお願いいたします。


Indexへ
(26823)←【26832】→(26840)
------------------------
【タイトル】Re(1):数値の丸めの外部変形について
【記事番号】 26832 (26823)
【 日時 】05/02/09 10:47
【 発言者 】牛渡
【 リンク 】http://www61.tok2.com/home2/gravelroad/



ちょっと興味があるので:

>現在下水の図面を作成中なのですが、S=1/500の平面図に将来計画排水管に
>見立てた線分を適当に引きこれに寸法値にて延長(mm表示、三桁ごとに空白有り)
>を表示しています。

問題は、3 桁ごとの空白だと思いますので、寸法の丸めのみならば既存の外変の
手直しでいけそうです。
路線の線分そのものの修正は必要ないのでしょうか? 路線線分も修正できると
あとあと座標で管理する場合にも有効になると思うのですが...。


Indexへ
(26832)←【26840】→(26839)
------------------------
【タイトル】Re(2):数値の丸めの外部変形について
【記事番号】 26840 (26832)
【 日時 】05/02/09 12:15
【 発言者 】art modanart@hotmail.com

▼牛渡さん:
>問題は、3 桁ごとの空白だと思いますので、寸法の丸めのみならば既存の外変の
>手直しでいけそうです。
>路線の線分そのものの修正は必要ないのでしょうか? 路線線分も修正できると
>あとあと座標で管理する場合にも有効になると思うのですが...。
いつもお世話になります。これから平面図に大量の旗揚げをしなければならないのでsDimの練習をしていたところでした。
ところでとりあえずの作業では、線分の長さの変更は必要がありません。表示の部分のみが巧く丸められると良いのですが。


Indexへ
(26840)←【26839】→(26841)
------------------------
【タイトル】Re(1):数値の丸めの外部変形について
【記事番号】 26839 (26823)
【 日時 】05/02/09 12:05
【 発言者 】スター

▼artさん:
>いつも参考にさせて頂いております。
>当方は、土木系のコンサルタントに従事する技術者です。
>現在下水の図面を作成中なのですが、S=1/500の平面図に将来計画排水管に見立てた線分を適当に引きこれに寸法値にて延長(mm表示、三桁ごとに空白有り)を表示しています。
>ところが、適当に線分の長さを引くので細かな延長がでてしまいます。(例えば:15 251というように)
>そこでこれを10cm単位に丸めたいのですが(12 251を12 300のように10cm単位の四捨五入)このような外部変形はないんでしょうか。いろいろと探したのですが、小数点がある場合は出来ても空白の場合に出来るものは探す事が出来ませんでした。よろしくお願いいたします。

12.300を12 300にするのであれば文字をまとめて範囲指定しエディタで.をスペースに変換してはどうでしょうか?


Indexへ
(26839)←【26841】→(26844)
------------------------
【タイトル】オリジナル
【記事番号】 26841 (26823)
【 日時 】05/02/09 14:48
【 発言者 】コジマ

▼artさん:
>いつも参考にさせて頂いております。
>当方は、土木系のコンサルタントに従事する技術者です。
>現在下水の図面を作成中なのですが、S=1/500の平面図に将来計画排水管に見立てた線分を適当に引きこれに寸法値にて延長(mm表示、三桁ごとに空白有り)を表示しています。
>ところが、適当に線分の長さを引くので細かな延長がでてしまいます。(例えば:15 251というように)
>そこでこれを10cm単位に丸めたいのですが(12 251を12 300のように10cm単位の四捨五入)このような外部変形はないんでしょうか。いろいろと探したのですが、小数点がある場合は出来ても空白の場合に出来るものは探す事が出来ませんでした。よろしくお願いいたします。

以下、自作の外部変形です。
この外部変形の実行にはmswin32 版 Rubyのインストールが必要です
以下で入手してください。(牛渡様のサイトです)

http://www61.tok2.com/home2/gravelroad/tips/install.html

コピペ後、全角スペースを半角スペースに一括置換してください。

◎バッチファイル(ファイル名 00$.bat)

REM 10の位以下を四捨五入
echo off
REM #jww
REM #cd
REM #zz
REM #h3
REM #hc文字を範囲選択してください
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -Ks 00$.rb temp.txt > jwc_temp.txt


◎スクリプトファイル(ファイル名 00$.rb)

BEGIN{
    puts "hd"
}
def main
    hash={"0"=>"0","1"=>"1","2"=>"2","3"=>"3","4"=>"4",
    "5"=>"5","6"=>"6","7"=>"7","8"=>"8","9"=>"9"," "=>" ","."=>"."}
    hash1=hash.invert
    while ARGF.gets
    xy =split
        if xy[0] =="hq"
        elsif xy[0] =~/^cs/ or xy[0] =~/^ch/
            a=$_.split("\"")
            tango1=(a[1].chop).delete("\s")
            tango2=tango1.delete(" ")

            tango3=tango2.split('')
            if tango3[0].size==1
                word=tango2

            else
                tango=tango3.collect{|item| hash1[item]}
                word=tango.join('')
            end
            if word=~/^[0-9]/ && word=~/[0-9]$/
                x=xy[1].to_f
                y=xy[2].to_f
                mojix=xy[3].to_f
                mojiy=xy[4].to_f
                word2=((((word.to_f)/100).round)*100).to_s
                if tango3[0].size==1
                    sunpou=(comma(word2).gsub("\,","\s"))

                else
                    tango4=((comma(word2)).gsub(
                            "\,","\s")).split('')
                    tango5=tango4.collect{|item|hash[item]}
                    sunpou=tango5.join('')
                end
                printf("ch %.10f %.10f %.10f %.10f \"%s\n",
                            x,y,mojix,mojiy,sunpou)
            else
                print $_
            end
        else
            print $_
        end
    end
end
def comma(s)
  r = [/(\d\d\d)((?=\d))/,/(\d)(\d\d)/,/(\d\d)(\d)/] [s.size % 3]
  s.gsub!(r,'\1,\2')
end
main


Indexへ
(26841)←【26844】→(26847)
------------------------
【タイトル】Re(1):オリジナル
【記事番号】 26844 (26841)
【 日時 】05/02/09 15:17
【 発言者 】art modanart@hotmail.com

▼コジマさん:
いつもいつもお世話になります。
又、すばらしい外部変形を作っていただきありがとうございます。
今回も思っていたような事が行えるようになりました。
これで又さらにJWWが手放せなくなりそうです。
ありがとうございました。


Indexへ
(26844)←【26847】→(26876)
------------------------
【タイトル】修正
【記事番号】 26847 (26844)
【 日時 】05/02/09 15:40
【 発言者 】コジマ

数値が3桁以内だと、消えてしまいますね。
(動作確認不足でした)

以下、修正しました。

BEGIN{
    puts "hd"
}
def main
    hash={"0"=>"0","1"=>"1","2"=>"2","3"=>"3","4"=>"4",
    "5"=>"5","6"=>"6","7"=>"7","8"=>"8","9"=>"9","\s"=>" ","."=>"."}
    hash1=hash.invert
    while ARGF.gets
    xy =split
        if xy[0] =="hq"
        elsif xy[0] =~/^cs/ or xy[0] =~/^ch/
            a=$_.split("\"")
            tango1=(a[1].chop).delete("\s")
            tango2=tango1.delete(" ")

            tango3=tango2.split('')
            if tango3[0].size==1
                word=tango2

            else
                tango=tango3.collect{|item| hash1[item]}
                word=tango.join('')
            end
            if word=~/^[0-9]/ && word=~/[0-9]$/
                x=xy[1].to_f
                y=xy[2].to_f
                mojix=xy[3].to_f
                mojiy=xy[4].to_f
                word2=((((word.to_f)/100).round)*100).to_s
                worda=word2.split('')
                if tango3[0].size==1

                    if worda.size>3
                        sunpou=(comma(word2).gsub("\,",
                                    "\s"))
                    else
                        sunpou=word2
                    end
                else
                    if worda.size>3
                        tango4=((comma(word2)).gsub(
                            "\,","\s")).split('')
                    else
                        tango4=word2.split('')
                    end
                    tango5=tango4.collect{|item|hash[item]}
                    sunpou=tango5.join('')
                end
                printf("ch %.10f %.10f %.10f %.10f \"%s\n",
                            x,y,mojix,mojiy,sunpou)
            else
                print $_
            end
        else
            print $_
        end
    end
end
def comma(s)
  r = [/(\d\d\d)((?=\d))/,/(\d)(\d\d)/,/(\d\d)(\d)/] [s.size % 3]
  s.gsub!(r,'\1,\2')
end
main


Indexへ
(26847)←【26876】→(26882)
------------------------
【タイトル】Re(1):オリジナル
【記事番号】 26876 (26841)
【 日時 】05/02/10 17:22
【 発言者 】kuro

artさん、コジマさん横から失礼いたします。

コジマさんのオリジナルのスクリプトを
少し変えて私なりに使わせてもらいたいと
思いまして投稿しました。
数値にカンマの桁区切りがある場合は
どこを修正すれば良いのでしょうか。
一度カンマを消して再度付け直すのではないかと
あれこれやってみたのですがわかりませんでした。
外部変形を探して見たのですが、小数点以下だけの
設定でうまくいきませんでした。
エディタで直す方法もあるのですが、できることなら
一度で数値を丸めたいと思っています。
時間のあるときで構いませんので
教えていただけないでしょうか。
よろしくお願いします。


Indexへ
(26876)←【26882】→(26889)
------------------------
【タイトル】Re(2):オリジナル
【記事番号】 26882 (26876)
【 日時 】05/02/10 18:36
【 発言者 】コジマ

▼kuroさん:
>artさん、コジマさん横から失礼いたします。
>
>コジマさんのオリジナルのスクリプトを
>少し変えて私なりに使わせてもらいたいと
>思いまして投稿しました。
>数値にカンマの桁区切りがある場合は
>どこを修正すれば良いのでしょうか。
>一度カンマを消して再度付け直すのではないかと
>あれこれやってみたのですがわかりませんでした。
>外部変形を探して見たのですが、小数点以下だけの
>設定でうまくいきませんでした。
>エディタで直す方法もあるのですが、できることなら
>一度で数値を丸めたいと思っています。
>時間のあるときで構いませんので
>教えていただけないでしょうか。
>よろしくお願いします。

この外部変形は、数値にカンマの桁区切りがある場合は、
カンマを削除して、スペースに置き換えますので、そのまま使って結構です。

このスクリプトは、元々、数値にカンマを付けるスクリプトを引用して、
一旦、数値にカンマを付けた後、スペースに置き換えています。

この後、スペース、カンマの区切文字を選択できるように変更しました。

以下、変更版です。

◎バッチファイル(00$.bat)

REM 10の位以下を四捨五入
echo off
REM #jww
REM #cd
REM #zz
REM #h3
REM #hc文字を範囲選択してください
REM #k3桁ごとの区切文字 無指定= 1)|1)コンマ(L)|2)スペース(R)| /_/a
REM #k数値を丸める桁数(四捨五入) 無指定= 1)|1)無(L)|2)下1桁(R)|3)下2桁|4)下3桁| /_/b
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -Ks 00$.rb temp.txt %1 %2 > jwc_temp.txt

◎スクリプトファイル(00$.rb)

BEGIN{
    puts "hd"
    $kugiri="1"
    $keta="1"
    while ARGV.length > 1
        case argument=ARGV.pop
            when/^\/a/
                $kugiri=argument[2..-1]
            when/^\/b/
                $keta=argument[2..-1]

        end
    end
}
def main
    if $keta=="1";keta=1;elsif $keta=="2";keta=10;elsif $keta=="3";keta=100
        elsif $keta=="4";keta=1000
    end
    hash={"0"=>"0","1"=>"1","2"=>"2","3"=>"3","4"=>"4",
    "5"=>"5","6"=>"6","7"=>"7","8"=>"8","9"=>"9",
    ","=>",","\s"=>" ","."=>"."}
    hash1=hash.invert
    while ARGF.gets
    xy =split
        if xy[0] =="hq"
        elsif xy[0] =~/^cs/ or xy[0] =~/^ch/
            a=$_.split("\"")
            tango1=a[1].chop
            tango2=tango1.tr("  ,,","")
            tango3=tango2.split('')
            if tango3[0].size==1
                tango=tango3
                word=tango2
            else
                tango=tango3.collect{|item| hash1[item]}
                word=tango.join('')
            end
            if word=~/^[0-9]/ && word=~/[0-9]$/ &&
                         tango.include?(nil)!=true
                x=xy[1].to_f
                y=xy[2].to_f
                mojix=xy[3].to_f
                mojiy=xy[4].to_f
                word2=((((word.to_f)/keta).round)*keta).to_s
                worda=word2.split('')
                if tango3[0].size==1
                    if worda.size>3
                        if $kugiri=="1"
                            sunpou=comma(word2)
                        elsif $kugiri=="2"
                            sunpou=(comma(word2).gsub("\,","\s"))
                        end
                    else
                        sunpou=word2
                    end
                else
                    if worda.size>3
                        if $kugiri=="1"
                            tango4=comma(word2).split('')
                        elsif $kugiri=="2"
                            tango4=((comma(word2)).gsub("\,","\s")).split('')
                        end

                    else
                        tango4=word2.split('')
                    end
                    tango5=tango4.collect{|item|hash[item]}
                    sunpou=tango5.join('')
                end
                printf("ch %s %s %s %s \"%s\n",
                            x,y,mojix,mojiy,sunpou)
            else
                print $_
            end
        else
            print $_
        end
    end
end
def comma(s)
  r = [/(\d\d\d)((?=\d))/,/(\d)(\d\d)/,/(\d\d)(\d)/] [s.size % 3]
  s.gsub!(r,'\1,\2')
end
main


Indexへ
(26882)←【26889】→(26885)
------------------------
【タイトル】Re(3):オリジナル
【記事番号】 26889 (26882)
【 日時 】05/02/10 23:08
【 発言者 】kuro

コジマさんありがとうございます。
こんなに早くやっていただいて
とても感謝しています。
早速使ってみます。
私もすこし外部変形を勉強してみます。
本当にありがとうございます。


Indexへ
(26889)←【26885】→(26890)
------------------------
【タイトル】線長(寸法)の一括記入
【記事番号】 26885 (26823)
【 日時 】05/02/10 18:48
【 発言者 】コジマ

▼artさん:
>線分を適当に引きこれに寸法値にて延長(mm表示、三桁ごとに空白有り)を表示しています。
>ところが、適当に線分の長さを引くので細かな延長がでてしまいます。(例えば:15 251というように)
>そこでこれを10cm単位に丸めたいのですが(12 251を12 300のように10cm単位の四捨五入)このような外部変形はないんでしょうか。いろいろと探したのですが、

koさんの外部変形(AWKスクリプト「線寸法」m単位のみ)をアレンジして
範囲選択した線上に、ご希望の書式の寸法値を一括記入するようにしてみました。

◎バッチファイル(ファイル名 線長記入.bat)

@REM 線の長さを記入する(mm)
@echo off
REM #jww
REM #cd
REM #c 書込文字種の指定 無指定:文字種2 /_/a
REM #c 文字と線の離れ(図寸)無指定= 1mm /_/b
REM #k 無指定= 1)|1)半角(L)|2)全角(R)| /_/c
REM #k3桁ごとの区切文字 無指定= 1)|1)コンマ(L)|2)スペース(R)| /_/d
REM #k数値を丸める桁数(四捨五入) 無指定= 1)|1)無(L)|2)下1桁(R)|3)下2桁|4)下3桁| /_/e
REM #h1
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -Ks 線長記入.rb temp.txt %1 %2 %3 %4 %5> jwc_temp.txt

◎スクリプトファイル(ファイル名 線長記入.rb)

BEGIN{
    $moji="2"
    $hanare=1
    $han_zen="1"
    $kugiri="1"
    $keta="1"
    while ARGV.length > 1
        case argument=ARGV.pop
            when/^\/a/
                $moji=argument[2..-1]
            when/^\/b/
                $hanare=argument[2..-1].to_f
            when/^\/c/
                $han_zen=argument[2..-1]
            when/^\/d/
                $kugiri=argument[2..-1]
            when/^\/e/
                $keta=argument[2..-1]
        end
    end
}
def main
    hash={"0"=>"0","1"=>"1","2"=>"2","3"=>"3","4"=>"4",
    "5"=>"5","6"=>"6","7"=>"7","8"=>"8","9"=>"9","\s"=>" ","."=>"."}
    by=[]
    puts "cn"+$moji
    puts "cc1"
    while ARGF.gets
    xy =split      
        if xy[0]=~/^hs/
            xy[1..-1].each{|item|by<        end
        if xy[0]=~/^lg/
            lg=xy[0][2,1]
            zusun=by[lg.hex]
        end
        if xy[0]=~/^[0-9]/ or xy[0]=~ /^-/
            xy.collect!{ |item| item.to_f }
            if xy[0] > xy[2]
                  xy[0],xy[2],xy[1],xy[3]=xy[2],xy[0],xy[3],xy[1]
            end

            if xy[0] == xy[2]
                if xy[1]>xy[3]
                    xy[1],xy[3]=xy[3],xy[1]
                end
            end
            xx=xy[2]-xy[0]
            yy=xy[3]-xy[1]
            $xy=Math.sqrt(xx**2+yy**2)
            dx=xx/$xy
            dy=yy/$xy
            if $keta=="1";keta=1;elsif $keta=="2";keta=10
            elsif $keta=="3";keta=100;elsif $keta=="4";keta=1000
            end
            word=((($xy/keta).round)*keta).to_s

            if $kugiri=="1"
                word1=comma(word)
            else
                word1=(comma(word)).gsub("\,","\s")
            end
            if $han_zen=="2"
                a=word1.split('')
                a.collect!{|item|hash[item]}
                word2=a.join('')
            else
                word2=word1
            end
            puts "z3"
            printf("ch %f %f %f %f \"%s\n",
                xy[0]+xx/2-$hanare*zusun*dy,
                xy[1]+yy/2+$hanare*zusun*dx,dx,dy,word2)
        end
    end
end
def comma(s)
  r = [/(\d\d\d)((?=\d))/,/(\d)(\d\d)/,/(\d\d)(\d)/] [s.size % 3]
  s.gsub!(r,'\1,\2')
end
main()


Indexへ
(26885)←【26890】//(26825)
------------------------
【タイトル】修正
【記事番号】 26890 (26885)
【 日時 】05/02/11 00:16
【 発言者 】コジマ

またやってしまいました(^_^;

1m以下の長さは記入されませんね。

以下、修正しました。


BEGIN{
    $moji="2"
    $hanare=1
    $han_zen="1"
    $kugiri="1"
    $keta="1"
    while ARGV.length > 1
        case argument=ARGV.pop
            when/^\/a/
                $moji=argument[2..-1]
            when/^\/b/
                $hanare=argument[2..-1].to_f
            when/^\/c/
                $han_zen=argument[2..-1]
            when/^\/d/
                $kugiri=argument[2..-1]
            when/^\/e/
                $keta=argument[2..-1]
        end
    end
}
def main
    hash={"0"=>"0","1"=>"1","2"=>"2","3"=>"3","4"=>"4",
    "5"=>"5","6"=>"6","7"=>"7","8"=>"8","9"=>"9",
    ","=>",","\s"=>" ","."=>"."}
    by=[]
    puts "cn"+$moji
    puts "cc1"
    while ARGF.gets
    xy =split      
        if xy[0]=~/^hs/
            xy[1..-1].each{|item|by<        end
        if xy[0]=~/^lg/
            lg=xy[0][2,1]
            zusun=by[lg.hex]
        end
        if xy[0]=~/^[0-9]/ or xy[0]=~ /^-/
            xy.collect!{ |item| item.to_f }
            if xy[0] > xy[2]
                  xy[0],xy[2],xy[1],xy[3]=xy[2],xy[0],xy[3],xy[1]
            end

            if xy[0] == xy[2]
                if xy[1]>xy[3]
                    xy[1],xy[3]=xy[3],xy[1]
                end
            end
            xx=xy[2]-xy[0]
            yy=xy[3]-xy[1]
            $xy=Math.sqrt(xx**2+yy**2)
            dx=xx/$xy
            dy=yy/$xy
            if $keta=="1";keta=1;elsif $keta=="2";keta=10
            elsif $keta=="3";keta=100;elsif $keta=="4";keta=1000
            end
            word=((($xy/keta).round)*keta).to_s


            if word.size>3
                if $kugiri=="1"
                    word1=comma(word)
                else
                    word1=(comma(word)).gsub("\,","\s")
                end
            else
                word1=word
            end
            if $han_zen=="2"
                a=word1.split('')
                a.collect!{|item|hash[item]}
                word2=a.join('')
            else
                word2=word1
            end
            puts "z3"
            printf("ch %f %f %f %f \"%s\n",
                xy[0]+xx/2-$hanare*zusun*dy,
                xy[1]+yy/2+$hanare*zusun*dx,dx,dy,word2)
        end
    end
end
def comma(s)
  r = [/(\d\d\d)((?=\d))/,/(\d)(\d\d)/,/(\d\d)(\d)/] [s.size % 3]
  s.gsub!(r,'\1,\2')
end
main()