文字起点

経緯

  • 文字の基点や中点、枠線を描く外部変形
  • 以前作ってjwwの掲示板にアップしたのが2007年7月
  • 動作が怪しいということで見直してみます

外部変形

SJISで保存して使用してください

@REM 文字の基点に補助点を作図
@REM 文字起点.bat
@echo off
REM #jww
REM #cd
goto %1
REM  #hm【文字基点】 |基準点|基点選択|文字枠|
REM  #hc【文字基点】メニューを選択して下さい。
REM #:1
REM #bz
REM #zc
REM #ht10
REM #h3
REM #g1
REM #hc文字を選択
REM #e
REM #:2
REM #bz
REM #ht10
REM #h3
REM #g1
REM #hc文字を選択
REM #k 基点選択 |左下(L)|中下(R)|右下|左中|中中|右中|左上|中上|右上|/_K
REM #e
REM #:3
REM #bz
REM #ht10
REM #h3
REM #g1
REM #hc文字を選択
REM #e

:1
:2
:3
copy jwc_temp.txt jwc_temp.bak
ruby -Ks -x %~f0 %1 %2 > jwc_temp.txt
goto END

:COMENT
文字の基点に補助点を作図します
【基準点】  :もともとの基点に補助点を作成します。
【基点選択】:左下から右上のなかから基点を選択し、補助点を作成します。
【文字枠】  :補助線で文字枠を作成します。
:END
EXIT
~
#! ruby -Ks
require 'matrix'
$stderr=open("error.log","w")

opt=ARGV[0].to_i

# 基点の指定
if opt==1     #基準点
  k=0
elsif opt==2  #基点選択
  k=ARGV[1].sub(/^K/,"").to_i
elsif opt==3  #文字枠
  k=10
end

hch,ch=[],0
File.open("jwc_temp.bak"){|f|
  while line=f.gets
    case line
    when /^hq/
      #puts "hd"
    when /^hch/
      hch=line.split.map{|e| e.to_f}
      puts line
    when /^cn\d+$/
      cn=line.split
      ch=cn[2].to_f if cn.size>1
      ch=hch[cn[0][2..-1].to_i] if cn.size==1
      puts line
    when /^c[hvsropt]/
      cs=line.chomp.split[1..-1].map{|e| e.to_f}
      v0=Vector[cs[0],cs[1]]
      va=Vector[cs[2],cs[3]]
      vb=Matrix[[0,-1],[1,0]]*va
      vb=vb*(ch/vb.r)
      if k==10  #文字枠
        puts "lc9"
        puts " "+[v0.to_a,(v0+va).to_a].join(" ")
        puts " "+[v0.to_a,(v0+vb).to_a].join(" ")
        puts " "+[(v0+va).to_a,(v0+va+vb).to_a].join(" ")
        puts " "+[(v0+vb).to_a,(v0+va+vb).to_a].join(" ")
      else
        vp=v0               if k<=1
        vp=v0+va*0.5        if k==2
        vp=v0+va            if k==3
        vp=v0+vb*0.5        if k==4
        vp=v0+va*0.5+vb*0.5 if k==5
        vp=v0+va+vb*0.5     if k==6
        vp=v0+vb            if k==7
        vp=v0+va*0.5+vb     if k==8
        vp=v0+va+vb         if k==9
        puts "pn9"
        puts "pt "+vp.to_a.join(" ")
      end
    else
      print line
    end
  end}

注意点

  • ruby1.8.7とruby2.6.5で動作を確認しています

コメント

  1. ban より:

    sugiさん、こんにちは

    banです。

    2010年に入手した 文字枠と文字基点 があります。
    多分、sugiさん作だと思います。

    AFさんが、2.5D文字に関して検証なされていましたので、
    when /^c[hvsropt]/ 部分を
    when /^c[hvsroptkz2]/ に変更しましたら、
    2.5D文字でも上手く動作しました。
    又、
    任意サイズの文字については、
    when /^cn¥d/となっていて、問題ありませんでした。

    付きましては、jww本家の方にスクリプトをUPしたいと思いますが
    よろしいでしょうか?

    事前に、ここに書き込んだほうがよろしいですか?

    • igus より:

      ああああぁぁぁ、すいません。
      基本、放置のホームページでコメントがついてることが
      分かってませんでした orz

      当時作ったスクリプトが手元に残っていなくって
      どういう処理をしてたんだろうってのは
      我ながら疑問でもありました。

      私のスクリプトに関しては一度発表したあとは
      煮るなり焼くなり好きにしてって思ってますので
      本家の方にアップして頂いても構いません。
      というかかつて自分がどう処理してたのか知りたいので
      むしろよろしくお願いします。

  2. AF より:

    sugi さん、こんにちは。

    72行目
    when /^cn\d+$/
      ↓
    when /^cn\d/

    これで任意サイズ文字でも文字枠が作図出来ます。(掲示板で、下線になる、という話がありましたがこれで直ります) banさんがおっしゃっていた 2010年版では、「+$」は付いていないとの事です。

    77行目
    when /^c[hvsropt]/
      ↓
    when /^c[hvsroptkz2]/

    これで日影文字・2.5D文字にも作図出来ます。まぁ出来なくても私的には仕様だと納得できますが、banさん曰く「不具合」との事。そういう需要もあるんだろうか?あるんだろうなぁ「不具合」って言う位だもんなぁ。

    というわけで誰もJWW掲示板ではコメントされてませんからこちらに一応報告入れておきます。

    ではでは、作業、お疲れ様でした :)

    • igus より:

      AFさん、こんにちは。
      自分としては質問に対してひとつひとつ本家に書き込むと
      やたらとスレが伸びて迷惑だろうとか
      かといって安易に5ch(AFさんは嫌いでしょうけど)に
      誘導するのもどうだろうなんて思ってるうちに
      hayabusaさんが新たなスクリプトをアップしてくださって
      これで一件落着なんてつもりでいました。

      なんだか正規表現の辺りが怪しいようで、もう一度見直してみます。

  3. ban より:

    sugiさん こんばんは。

    私が2010年頃に入手したスクリプトは下記の通りです。
    多分 sugiさんがupしてくれた物だと思います。

    尚、
    when /^c[hvsropt]/ 部分は

    when /^c[hvsroptkz2]/ に変更してあります。

    ———————————————-
    @REM 文字枠と文字基点
    @echo off
    REM #jww
    REM #cd
    goto %1
    REM #hm 【文字枠と文字基点】メニュー選択 |文字枠(L)|文字基点(R)|
    REM #hc 【文字枠と文字基点】メニューを選択して下さい。
    REM #:1
    REM #bz
    REM #ht10
    REM #h3
    REM #hc文字を選択
    REM #i 色選択(無指定:カレント) |線色1|線色2|線色3|線色4|線色5|線色6|線色7|線色8|線色9|/_C
    REM #e
    REM #:2
    REM #zc
    REM #bz
    REM #ht10
    REM #h3
    REM #hc文字を選択
    REM #i 基点選択(無指定:デフォルト)|左下|中下|右下|左中|中中|右中|左上|中上|右上|/_K
    REM #i 色選択(無指定:カレント) |線色1|線色2|線色3|線色4|線色5|線色6|線色7|線色8|線色9|/_C
    REM #e

    :1
    :2
    copy jwc_temp.txt temp.txt
    ruby -Ks -x %~f0 %1 %2 %3
    goto :EOF

    #! ruby -Ks

    $stderr=open(“error.log”,”w”)
    $stdout=open(“jwc_temp.txt”,”w”)

    require ‘matrix’

    op=ARGV[0].to_i #オプション
    kj=ARGV.find{|e| /^K(\d)/=~e} ? $1.to_i : 0 #基点
    cl=ARGV.find{|e| /^C(\d)/=~e} ? $1.to_i : 0 #線色+点色
    # p op,kj,cl
    open(“temp.txt”){|f|
    while f.gets
    case $_
    when /^hq/
    when /^hch/
    hch=$_.split.map{|e| e.to_f}
    puts $_
    when /^cn\d/
    cn=$_.split
    ch=cn[2].to_f if cn.size>1
    ch=hch[cn[0][2..-1].to_i] if cn.size==1
    #puts $_
    when /^lc(\d+)$/
    if cl==0
    puts “lc”+$1
    puts “pn”+$1
    else
    puts “lc#{cl}”
    puts “pn#{cl}”
    end
    when /^cc([0-8])/
    cc=$1.to_i
    when /^c[hvsroptkz2]/
    cs=$_.chomp.split[1..-1].map{|e| e.to_f}
    v0=Vector[cs[0],cs[1]] #始点
    va=Vector[cs[2],cs[3]] #方向
    vb=Matrix[[0,-1],[1,0]]*va #高さ
    vb=vb*(ch/vb.r)
    if op==1 #文字枠
    puts (v0.to_a+(v0+va).to_a).join(” “)
    puts (v0.to_a+(v0+vb).to_a).join(” “)
    puts ((v0+vb).to_a+(v0+va+vb).to_a).join(” “)
    puts ((v0+va+vb).to_a+(v0+va).to_a).join(” “)
    elsif op==2 #文字基点
    vc=Vector[0,0] #左下
    vc=va*0.5 if cc==1 #中下
    vc=va if cc==2 #右下
    vc=vb*0.5 if cc==3 #左中
    vc=vb*0.5+va*0.5 if cc==4 #中中
    vc=vb*0.5+va if cc==5 #右中
    vc=vb if cc==6 #左上
    vc=vb+va*0.5 if cc==7 #中上
    vc=vb+va if cc==8 #右上
    puts “pt “+v0.to_a.join(” “) if kj==0 #デフォルト
    puts “pt “+(v0-vc).to_a.join(” “) if kj==1 #左下
    puts “pt “+(v0+va*0.5-vc).to_a.join(” “) if kj==2 #中下
    puts “pt “+(v0+va-vc).to_a.join(” “) if kj==3 #右下
    puts “pt “+(v0+vb*0.5-vc).to_a.join(” “) if kj==4 #左中
    puts “pt “+(v0+va*0.5+vb*0.5-vc).to_a.join(” “) if kj==5 #中中
    puts “pt “+(v0+va+vb*0.5-vc).to_a.join(” “) if kj==6 #右中
    puts “pt “+(v0+vb-vc).to_a.join(” “) if kj==7 #左上
    puts “pt “+(v0+va*0.5+vb-vc).to_a.join(” “) if kj==8 #中上
    puts “pt “+(v0+va+vb-vc).to_a.join(” “) if kj==9 #右上
    end
    else
    print $_
    end
    end}
    ——————————
    以上です。