過去ログ

                                Page      74
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼「接近した文字の連結」について  zoo 15/07/19(日) 7:03
   ┣Re(1):「接近した文字の連結」について  kojima 15/07/19(日) 9:41
   ┣Re(1):「接近した文字の連結」について  LA 15/07/19(日) 20:08
   ┗Re(1):「接近した文字の連結」について  zoo 15/07/20(月) 5:41

 ───────────────────────────────────────
 ■題名 : 「接近した文字の連結」について
 ■名前 : zoo
 ■日付 : 15/07/19(日) 7:03
 -------------------------------------------------------------------------
   Jw_cad 情報交換室15/05/12のkojimaさんの「接近した文字の連結」を
使わせていただいています。....というか使えてませんので教えてください。

バッチをJWWに入れてjwwから直接だと使えます。
下位フォルダに入れg_plusに組み込むと止まります。状況は下記です。

文字を範囲選択→確定→文字間隔の最大値→空欄のままクリック→
DOSプロンプトが出て次の状態で止まります。
--------------------------------------------------------------------------
C:/JWW/g_plus.bat:127: warning: parenthesize argument(s)for future version
C:/JWW/g_plus.bat:127: warning: parenthesize argument(s)for future version
C:/JWW/g_plus.bat:128: warning: parenthesize argument(s)for future version
C:/JWW/g_plus.bat:129: syntax error
--------------------------------------------------------------------------
で、g_plus.batは
--------------------------------------------------------------------------
122|if n==0
123|  STDERR.puts "処理した文字数:0"
124|else
125|  STDERR.puts "↑","上記の文字を処理しました"
126|end
127|rem      modified by G+
128|copy jwc_temp.txt "C:\Jww\g_temp.txt" >nul
129|C:
130|cd "C:\Jww"
131|copy g_temp.txt jwc_temp.txt > nul

 ───────────────────────────────────────  ■題名 : Re(1):「接近した文字の連結」について  ■名前 : kojima  ■日付 : 15/07/19(日) 9:41  -------------------------------------------------------------------------
   バッチファイルとスクリプトファイルを別々にしないと
外変メニューソフト(G_PLUS等)では動作しません。

↓バッチファイル(この行はコピペしない)

@REM 接近した文字の連結
@echo off
REM #jww
REM #cd
REM #zz
REM #h3
REM #hc文字を範囲選択してください。 文字基点は全て左下に変更されます
REM #c文字間隔の最大値(図寸) 無指定:1.0/_/a
REM #bz
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -Ks moji_join.rb temp.txt %1 > jwc_temp.txt
pause


↓スクリプトファイル(この行はコピペしない)ファイル名:moji_join.rb

include Math
str_d=1.0
while ARGV.size>1
    case argument=ARGV.pop
        when /\/a/
            str_d=argument[2..-1].to_f
    end
end
#文字データのクラス
class Strdata
    attr_accessor :ch, :cn, :font, :str, :x1, :y1, :x2, :y2
    def initialize(ch,cn,font,str,x1,y1,x2,y2)
        @ch=ch
        @cn=cn
        @font=font
        @str=str
        @x1=x1
        @y1=y1
        @x2=x2
        @y2=y2
    end
end
#文字列の配列str_aから連続した部分文字列を抽出してrenzokuに格納
def renzoku_moji(str_a,str_d)
    a=str_a.shift
    renzoku=[a]
    begin
        b=str_a.find{|item2|
            l=hypot(item2.x1-a.x2,item2.y1-a.y2)
            l<=str_d && a.ch==item2.ch && a.cn==item2.cn
        }
        if b
            a=b
            renzoku<<a
            str_a.delete_if{|item2|item2==b}
        end
    end while(b)
    begin
        a=renzoku[0]
        b=str_a.find{|item2|
            l=hypot(a.y1-item2.y2,a.x1-item2.x2)
            l<=str_d && a.ch==item2.ch && a.cn==item2.cn
        }
        if b
            a=b
            renzoku.unshift(a)
            str_a.delete_if{|item2|item2==b}
        end
    end while(b)
    return renzoku
end
while ARGF.gets
    if $_ =~ /^z3/
        STDERR.puts "寸法値が選択されています 処理を中止します"
        exit
    end
end
puts "hd"
str_a=[]
open("temp.txt","r"){|f|
    while f.gets
        xy=$_.split
        if xy[0] =~ /^hq/
        elsif xy[0] =~ /^cn\"/
            font=$_.chomp
        elsif xy[0] =~ /^cn\d/
            cn=$_.chomp
        elsif xy[0] =~ /^c[hv]/
            if $_ =~ /\"/
                moji=$'.chomp
                ch=xy[0]
                x1,y1=xy[1].to_f,xy[2].to_f
                l=hypot(xy[4].to_f,xy[3].to_f)
                arg=atan2(xy[4].to_f,xy[3].to_f)
                x2,y2=x1+l*cos(arg),y1+l*sin(arg)
                str_a<<Strdata.new(ch,cn,font,moji,x1,y1,x2,y2)
            end
        else
            print $_
        end
    end
}
n=0
while str_a.size>0
    renzoku=renzoku_moji(str_a,str_d)
    moji_a=[]
    renzoku.each{|item|moji_a<<item.str}
    string=moji_a.join
    puts renzoku[0].cn,renzoku[0].font
    ch=renzoku[0].ch
    x1,y1=renzoku[0].x1,renzoku[0].y1
    xl=renzoku[0].x2-renzoku[0].x1
    yl=renzoku[0].y2-renzoku[0].y1
    printf("%s %.11f %.11f %.11f %.11f \"%s\n",ch,x1,y1,xl,yl,string)
    if moji_a.size>1
        STDERR.puts moji_a.join(" & ")<<" → "<<moji_a.join
        n += 1
    end
end
if n==0
    STDERR.puts "処理した文字数:0"
else
    STDERR.puts "↑","上記の文字を処理しました"
end

 ───────────────────────────────────────  ■題名 : Re(1):「接近した文字の連結」について  ■名前 : LA  ■日付 : 15/07/19(日) 20:08  -------------------------------------------------------------------------
       ▼zooさん:
こんにちは


G+のしくみは、

実行したい外変batファイルの前後に、
・カレントフォルダを実行したい外変のフォルダへ移動する
・JWWから出力されるjwc_temp.txtを、実行したい外変のフォルダへコピーし、終了後、JWWのフォルダに書き戻す
という処理を書き加えたものを、g_plus.batという名前で、JWWのフォルダに生成し、それを外変としてJWWのフォルダで実行する

という様な具合の様です。


この為、実行したい外変のbatファイルは、最初から最後の行までbatファイルとして実行される(途中行の回避は可)、という前提の元でつくられており、
最終行がbatファイルとして実行されるようなつくりになっていないと、g_plusが末尾に追加する、jwc_temp.txt を書き戻す処理が行われず、結果、JWW側では 未実行 となります。

又、別言語のスクリプトをbatファイル内に埋め込んだような外変の場合、
末尾にbatファイルの文が追加されるわけですから、そこでもエラーが起こる可能性がありますので、それの対応も必要となります。

>C:/JWW/g_plus.bat:127: warning: parenthesize argument(s)for future version
...
>C:/JWW/g_plus.bat:129: syntax error
は、それが原因です。
これは、rubyが出しているエラーですが、G+が末尾に追加したbatファイル部分をrubyスクリプトとして読み込んだ為、構文エラーが出ました。


そこで、
接近した文字の連結 のbatファイルを、以下のように修正させていただいたところ、G+で動きましたので、参考まで。


・ #!ruby -Ks の前の行(15行目)の exit -> goto end に変更

・ 末尾に、以下の行を挿入
__END__
:end

 ───────────────────────────────────────  ■題名 : Re(1):「接近した文字の連結」について  ■名前 : zoo  ■日付 : 15/07/20(月) 5:41  -------------------------------------------------------------------------
   kojimaさん>有難うございます。
これでバッチリ処理できます。

LAさん>有難うございます。
何となく仕組みはわかってるんですが
>最終行がbatファイルとして実行されるようなつくりになっていないと・・・
こういったあたりが解らないんですね

>末尾にbatファイルの文が追加されるわけですから、そこでもエラーが・・・
このあたりも、解る人には簡単なんでしょうけど、よくわかりませんね。

>exit -> goto end に変更
>末尾に、以下の行を挿入
>__END__
>:end
これ、前にこの掲示板で見たような、、、

書き換えたらうまくいきました。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 74