過去ログ

                                Page      75
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼曲線への文字の配置  kojima 15/07/18(土) 9:48
   ┣Re(1):曲線への文字の配置  住職 15/07/18(土) 11:22
   ┗Re(1):曲線への文字の配置  R.N 15/07/19(日) 4:11
      ┗Re(2):曲線への文字の配置  kojima 15/07/20(月) 14:03
         ┗Re(3):曲線への文字の配置  R.N 15/07/20(月) 19:01

 ───────────────────────────────────────
 ■題名 : 曲線への文字の配置
 ■名前 : kojima
 ■日付 : 15/07/18(土) 9:48
 -------------------------------------------------------------------------
   ヒマなので
相談室に質問のあった、曲線上へ文字を配置 を外部変形で実現してみました。
相談室の質問は、「外部変形以外で」との条件つきなので、そちらには貼りません。

バッチファイルにrubyスクリプトを記述した外部変形です。

@REM 連続線・曲線への文字均等割付(範囲選択)
@echo off
REM #jww
REM #cd
REM #hp
REM #c文字の入力/_/a
REM #h1
REM #1連続線・曲線の始点を指示(右クリック)
REM #e
copy jwc_temp.txt temp.txt >nul
ruby -x %~f0 temp.txt %1>jwc_temp.txt
exit
#!ruby -Ks
include Math
picth=100
while ARGV.length > 1
  case argument = ARGV.pop
    when /^\/a/
      moji = argument[ 2 .. -1]
  end
end
moji_a=moji.split('')
def moji(x,y,dx,dy,word)
  printf("ch %.11f %.11f %.11f %.11f \"%s\n",x,y,dx,dy,word)
end
def ika3(x)
    s=sprintf("%.3f",x.to_f)
    return s.to_f
end
def arraysum(array)
  sum=0
  array.each{|item| sum += item}
  return sum
end
def en_d_zahyo(x,y,r,arg,hen,ziku_arg)
    rx=r*cos(arg)
    ry=r*sin(arg)*hen
    l=hypot(ry,rx)
    arg1=atan2(ry,rx)
    x1=x+l*cos(arg1+ziku_arg)
    y1=y+l*sin(arg1+ziku_arg)
    return [x1,y1]
end
sen=[];by=[];hp=[];s=0
while ARGF.gets
    xy =split
    if xy[0] =~ /^hs/
        xy[1..-1].each{|item|by<<item.to_i}
    end
    if xy[0] =~ /^lg/
        lg=xy[0][2,1];zusun=by[lg.hex]
    end
    if xy[0] =~ /^hp/
        hp<<[ika3(xy[1]),ika3(xy[2])]
    end
    if xy[0] =~ /^\d|^-/
        xy.collect!{|item|ika3(item)}
        sen<<xy
    end
    if xy[0] =~ /^ci/
        xy.collect!{|item|item.to_f}
        x,y,r=xy[1],xy[2],xy[3]
        if xy.size==4
            sikaku,syukaku,hen,ziku=0,360,1,0
        else
            sikaku,syukaku,hen,ziku=xy[4..-1]
        end
        if sikaku>syukaku
            sikaku -= 360
        elsif sikaku==syukaku
            syukaku += 360
        end
        n=20
        d_kaku=(syukaku-sikaku)/n
        d_arg=d_kaku*PI/180
        ziku_arg=ziku*PI/180

        arg=sikaku*PI/180
        n.times{
            x1,y1=en_d_zahyo(x,y,r,arg,hen,ziku_arg)
            x2,y2=en_d_zahyo(x,y,r,arg+d_arg,hen,ziku_arg)
            arg += d_arg
            sen<<[ika3(x1),ika3(y1),ika3(x2),ika3(y2)]
        }
    end
end
i=0
renzoku=[];a=hp[i]
begin
    renzoku<<a
    b=sen.find{|item|[item[0],item[1]]==a or [item[2],item[3]]==a}
    if b
        if renzoku[-1][0]==b[0] && renzoku[-1][1]==b[1]
            a=[b[2],b[3]]
        elsif renzoku[-1][0]==b[2] && renzoku[-1][1]==b[3]
            a=[b[0],b[1]]
        end
        sen.delete_if{|item|item==b}
    end
end while(b)
renzoku.uniq!
dx=[0];dy=[0];larray=[0];l=0;n=0
while n<renzoku.size-1
    lx=renzoku[n+1][0]-renzoku[n][0]
    ly=renzoku[n+1][1]-renzoku[n][1]
    lxy=hypot(lx,ly)
    dx<<lx/lxy
    dy<<ly/lxy
    larray<<lxy
    n+=1
end
l=arraysum(larray)
picth=l/(moji_a.size-1)
yotyo=0;ruisin=0;s=0
puts "cc1"
moji(renzoku[0][0],renzoku[0][1],dx[1],dy[1],moji_a[s])
m=1;l=0
s += 1
while m<larray.size
    if (larray[m]+yotyo)>=picth
        warisu=((larray[m]+yotyo)/picth).to_i
        n=1
        warisu.times{
            moji(renzoku[l][0]+(picth*n-yotyo)*dx[m],renzoku[l][1]+(picth*n-yotyo)*dy[m],dx[m],dy[m],moji_a[s])
            n+=1;s+=1
        }
        yotyo=(larray[m]+yotyo)-picth*warisu
    else
        yotyo += larray[m]
    end
    m+=1;l+=1
end
moji(renzoku[-1][0],renzoku[-1][1],dx[-1],dy[-1],moji_a[-1])

 ───────────────────────────────────────  ■題名 : Re(1):曲線への文字の配置  ■名前 : 住職  ■日付 : 15/07/18(土) 11:22  ■Web : http://homepage2.nifty.com/siegel/  -------------------------------------------------------------------------
   ▼kojimaさん:
>ヒマなので
>相談室に質問のあった、曲線上へ文字を配置 を外部変形で実現してみました。
>相談室の質問は、「外部変形以外で」との条件つきなので、そちらには貼りません。
>
>バッチファイルにrubyスクリプトを記述した外部変形です。

使用させていただき、動作確認しました。
(Win8.1 Jww_8.00d Ruby_1.8.6)

 ───────────────────────────────────────  ■題名 : Re(1):曲線への文字の配置  ■名前 : R.N  ■日付 : 15/07/19(日) 4:11  -------------------------------------------------------------------------
   kojimaさん;こんにちは

円弧でも確認しました。
ありがとうございます。
線上点2点では---と勝手なことを

(win7 64bit ruby1.8.6 jww8.00d)

 ───────────────────────────────────────  ■題名 : Re(2):曲線への文字の配置  ■名前 : kojima  ■日付 : 15/07/20(月) 14:03  -------------------------------------------------------------------------
   >線上点2点では---と勝手なことを

直線上の2点? 連続線上の2点?

指示点が円上だと実行されません。


@REM 連続線の2点間に文字均等配置
@echo off
REM #jww
REM #cd
REM #h1
REM #c文字の入力/_/a
REM #1線上1点目を指示してください
REM #2線上2点目を指示してください
REM #e
copy jwc_temp.txt temp.txt >nul
ruby -x %~f0 temp.txt %1>jwc_temp.txt
pause
exit
#!ruby -Ks
include Math
class Sen
    attr_accessor :x1, :y1, :x2, :y2
    def initialize(x1,y1,x2,y2)
        @x1=x1
        @y1=y1
        @x2=x2
        @y2=y2
    end
end
while ARGV.length > 1
  case argument = ARGV.pop
    when /^\/a/
      moji = argument[ 2 .. -1]
  end
end
moji_a=moji.split('')
def moji(x,y,dx,dy,word)
  printf("ch %.11f %.11f %.11f %.11f \"%s\n",x,y,dx,dy,word)
end
def ika3(x)
    s=sprintf("%.3f",x.to_f)
    return s.to_f
end
#線の配列senから連続線を区分けする
def loop_zukei(sen)
    a=sen.shift
    renzoku=[a]
    begin
        b=sen.find{|item2|
            item2.x1==a.x2 && item2.y1==a.y2 or item2.x2==a.x2 && item2.y2==a.y2
        }
        if b
            if renzoku[-1].x2==b.x1 && renzoku[-1].y2==b.y1
                a=Sen.new(b.x1,b.y1,b.x2,b.y2)
            elsif renzoku[-1].x2==b.x2 && renzoku[-1].y2==b.y2
                a=Sen.new(b.x2,b.y2,b.x1,b.y1)
            end
            sen.delete_if{|item2|item2==b}
            renzoku<<a
        end
    end while(b)
        begin
            a=renzoku[0]
            b=sen.find{|item2|
                item2.x1==a.x1 && item2.y1==a.y1 or item2.x2==a.x1 && item2.y2==a.y1
            }
            if b
                if renzoku[0].x1==b.x1 && renzoku[0].y1==b.y1
                    a=Sen.new(b.x2,b.y2,b.x1,b.y1)
                elsif renzoku[0].x1==b.x2 && renzoku[0].y1==b.y2
                    a=Sen.new(b.x1,b.y1,b.x2,b.y2)
                end
                sen.delete_if{|item2|item2==b}
                renzoku.unshift(a)
            end
        end while(b)
    return renzoku
end
def sen_ue?(sen,ten)
    sen_l=hypot(sen.y2-sen.y1,sen.x2-sen.x1)
    sen_arg=atan2(sen.y2-sen.y1,sen.x2-sen.x1)
    ten_l=hypot(ten[1]-sen.y1,ten[0]-sen.x1)
    ten_arg=atan2(ten[1]-sen.y1,ten[0]-sen.x1)
    if ika3(sen_arg)==ika3(ten_arg) && sen_l>=ten_l
        return 1
    elsif sen.x1==ten[0] && sen.y1==ten[1]
        return 1
    else
        return 0
    end
end

def arraysum(array)
  sum=0
  array.each{|item| sum += item}
  return sum
end
def en_d_zahyo(x,y,r,arg,hen,ziku_arg)
    rx=r*cos(arg)
    ry=r*sin(arg)*hen
    l=hypot(ry,rx)
    arg1=atan2(ry,rx)
    x1=x+l*cos(arg1+ziku_arg)
    y1=y+l*sin(arg1+ziku_arg)
    return [x1,y1]
end

sen=[];hp=[]
while ARGF.gets
    xy=$_.split
    if xy[0]=~/^hp\d/
        hp<<[ika3(xy[1]),ika3(xy[2])]
    end
    if xy[0]=~/^\d|^-/
        xy.collect!{|item|ika3(item)}
        sen<<Sen.new(xy[0],xy[1],xy[2],xy[3])
    end
    if xy[0] =~ /^ci/
        xy.collect!{|item|item.to_f}
        x,y,r=xy[1],xy[2],xy[3]
        if xy.size==4
            sikaku,syukaku,hen,ziku=0,360,1,0
        else
            sikaku,syukaku,hen,ziku=xy[4..-1]
        end
        if sikaku>syukaku
            sikaku -= 360
        elsif sikaku==syukaku
            syukaku += 360
        end
        n=20
        d_kaku=(syukaku-sikaku)/n
        d_arg=d_kaku*PI/180
        ziku_arg=ziku*PI/180

        arg=sikaku*PI/180
        n.times{
            x1,y1=en_d_zahyo(x,y,r,arg,hen,ziku_arg)
            x2,y2=en_d_zahyo(x,y,r,arg+d_arg,hen,ziku_arg)
            arg += d_arg
            sen<<Sen.new(ika3(x1),ika3(y1),ika3(x2),ika3(y2))
        }
    end
end
renzoku=loop_zukei(sen)
flg=0
rensen=[]
renzoku.each{|item|
    if sen_ue?(item,hp[0])==1 && sen_ue?(item,hp[1])==0
        if flg==0
            x1,y1,x2,y2=hp[0][0],hp[0][1],item.x2,item.y2
        elsif flg==1
            x1,y1,x2,y2=item.x1,item.y1,hp[0][0],hp[0][1]
        end
        l=hypot(y2-y1,x2-x1)
        if l>0
            rensen<<Sen.new(x1,y1,x2,y2)
            flg += 1
        end
    end
    if sen_ue?(item,hp[1])==1 && sen_ue?(item,hp[0])==0
        if flg==0
            x1,y1,x2,y2=hp[1][0],hp[1][1],item.x2,item.y2
        elsif flg==1
            x1,y1,x2,y2=item.x1,item.y1,hp[1][0],hp[1][1]
        end
        l=hypot(y2-y1,x2-x1)
        if l>0
            rensen<<Sen.new(x1,y1,x2,y2)
            flg += 1
        end
    end
    if sen_ue?(item,hp[0])==1 && sen_ue?(item,hp[1])==1
        l=hypot(hp[1][1]-hp[0][1],hp[1][0]-hp[0][0])
        if l>0
            rensen<<Sen.new(hp[0][0],hp[0][1],hp[1][0],hp[1][1])
            flg += 2
        end
    end
    if sen_ue?(item,hp[0])==0 && sen_ue?(item,hp[1])==0
        if flg==1
            rensen<<item
        end
    end
    break if flg==2
}
if flg==0
    printf "h#線上の指示点がありません\n"
    exit
end
i=0
renzoku=[];a=hp[i]
begin
    renzoku<<a
    b=rensen.find{|item|[item.x1,item.y1]==a or [item.x2,item.y2]==a}
    if b
        if renzoku[-1][0]==b.x1 && renzoku[-1][1]==b.y1
            a=[b.x2,b.y2]
        elsif renzoku[-1][0]==b.x2 && renzoku[-1][1]==b.y2
            a=[b.x1,b.y1]
        end
        rensen.delete_if{|item|item==b}
    end
end while(b)
dx=[0];dy=[0];larray=[0];l=0;n=0
while n<renzoku.size-1
    lx=renzoku[n+1][0]-renzoku[n][0]
    ly=renzoku[n+1][1]-renzoku[n][1]
    lxy=hypot(lx,ly)
    dx<<lx/lxy
    dy<<ly/lxy
    larray<<lxy
    n+=1
end
l=arraysum(larray)
picth=l/(moji_a.size-1)
yotyo=0;ruisin=0;s=0
puts "cc1"
moji(renzoku[0][0],renzoku[0][1],dx[1],dy[1],moji_a[s])
m=1;l=0
s += 1
while m<larray.size
    if (larray[m]+yotyo)>=picth
        warisu=((larray[m]+yotyo)/picth).to_i
        n=1
        warisu.times{
            moji(renzoku[l][0]+(picth*n-yotyo)*dx[m],renzoku[l][1]+(picth*n-yotyo)*dy[m],dx[m],dy[m],moji_a[s])
            n+=1;s+=1
        }
        yotyo=(larray[m]+yotyo)-picth*warisu
    else
        yotyo += larray[m]
    end
    m+=1;l+=1
end
moji(renzoku[-1][0],renzoku[-1][1],dx[-1],dy[-1],moji_a[-1])

 ───────────────────────────────────────  ■題名 : Re(3):曲線への文字の配置  ■名前 : R.N  ■日付 : 15/07/20(月) 19:01  -------------------------------------------------------------------------
   kojimaさん;こんにちは、

あの後、直線でもできることに気付いた次第です。
曲線のとき、途中点を右クリックで拾えたのですが、文字が曲線に対して逆方向にしかならないので、自分でなんとかならないか、やっていたところでした。
(解読するのも、大変ですが、できた時には、感激!!、多少のことは、改変させて頂いて、個人利用させて頂いてます)

直線の線上点も拾えることも、確認しました。
お手上げ状態のところを手助け頂き、感謝です。
ありがとうございます。

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