Indexへ
(10000)//【9988】→(9989)
------------------------
【タイトル】文字の基点を取りたい 中中等
【記事番号】 9988 (*)
【 日時 】07/07/19 11:55
【 発言者 】あかし

表の修正等で文字の基点から線を書き出したい時があるのですが
初期設定からの左下(ずれなし)のみを使っています
現在は端点・交点を作図して次に中中基点の文字を記入しています
升目の中芯に文字を入れるのではなく
文字を基準に升目を修正したいのです
他の基点 中中点を取得を簡単に出来ませんか?


Indexへ
(9988)←【9989】→(10006)
------------------------
【タイトル】Re(1):文字の基点を取りたい 中中等
【記事番号】 9989 (9988)
【 日時 】07/07/19 14:54
【 発言者 】joker
【 リンク 】http://www.atsmile.com/jw/



▼あかしさん:
>他の基点 中中点を取得を簡単に出来ませんか?

普通の文字端点スナップでは出来ないと思いますので、
例えば、外部変形アプリなどで、文字枠なり補助点なりを作図して
拾う、という感じではないかと思います。


JWW検索リンクでの検索一覧


Indexへ
(9989)←【10006】→(9990)
------------------------
【タイトル】Re(2):文字の基点を取りたい 中中等
【記事番号】 10006 (9989)
【 日時 】07/07/23 20:17
【 発言者 】sugi

sugiです。皆さん、こんにちは。

jokerさん wrote:
> 例えば、外部変形アプリなどで、文字枠なり補助点なりを作図して
> 拾う、という感じではないかと思います。

この発言を読んで、そのような外部変形を作ってみたのですが、す
でに解決したようだったので出しそびれてました。^^;

このままお蔵入りももったいないので、一応、アップさせてもらい
ます。

外部変形の実行には ruby が必要です。
全角スペースを半角スペースに置換してご利用ください。

=== 文字基点.BAT (ここから) ===
@REM 文字の基点に補助点を作図
@echo off
REM #jww
REM #cd
goto %1
REM #hm【文字基点】 |基準点|基点選択|文字枠|
REM #hc【文字基点】メニューを選択して下さい。
REM #:1
REM #:3
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

: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")

# 基点の指定
if ARGV.grep(/^K/)[0]  #基点選択
 k=ARGV.grep(/^K/)[0].sub(/^K/,"").to_i
elsif ARGV.include?("1") #基準点
 k=0
elsif ARGV.include?("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.collect{|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].collect{|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}
=== 文字基点.BAT (ここまで) ===

--
sugi


Indexへ
(10006)←【9990】→(9993)
------------------------
【タイトル】Re(1):文字の基点を取りたい 中中等
【記事番号】 9990 (9988)
【 日時 】07/07/19 15:19
【 発言者 】joker
【 リンク 】http://www.atsmile.com/jw/



▼あかしさん:

建築資料館の掲示板で よく似た話題がありました。
http://www.ath-j.com/cbbs2/cbbs.cgi?mode=all&namber=35146&type=0&space=0&no=1


Indexへ
(9990)←【9993】→(9992)
------------------------
【タイトル】Re(2):文字の基点を取りたい 中中等
【記事番号】 9993 (9990)
【 日時 】07/07/19 18:12
【 発言者 】あかし

▼jokerさん:
 ありがとうございます
そちらのスレは気がつきませんでした
皆様適当に工夫がおありですね
外変・オフセット・仮点打ち等試してみます

苦しい時だけの神頼みですみませんでした


Indexへ
(9993)←【9992】→(9994)
------------------------
【タイトル】Re(1):文字の基点を取りたい 中中等
【記事番号】 9992 (9988)
【 日時 】07/07/19 17:14
【 発言者 】rj
【 リンク 】http://rj-ryu.cocolog-nifty.com/



▼あかしさん:
>表の修正等で文字の基点から線を書き出したい時があるのですが
>初期設定からの左下(ずれなし)のみを使っています
>現在は端点・交点を作図して次に中中基点の文字を記入しています
>升目の中芯に文字を入れるのではなく
>文字を基準に升目を修正したいのです
>他の基点 中中点を取得を簡単に出来ませんか?

本体機能でやるのなら

→文字コマンドで文字基点設定を ・左下 □ずれ使用なし ■上線作図 にして
→書込み済みの文字を 複写(R)(その文字が文字ボックスに取り込まれる)
→書込み済み文字の左下をReadして配置
 (書込み済みの文字に同じ文字が新しく重なり、上線が書き込まれる)
→文字の左下と上線の右端の中心点を取得できるようになる
→上線(及び重なった文字)を消去

が楽そうです。


Indexへ
(9992)←【9994】→(10001)
------------------------
【タイトル】Re(2):文字の基点を取りたい 中中等
【記事番号】 9994 (9992)
【 日時 】07/07/19 18:22
【 発言者 】あかし

▼rjさん:
 早速にレスありがとうございました
上線は使った事がありませんでした
上線と基準の左下点の中間に(中心線右クリック)で
文字の中心横線が引けますね
後は範囲・文字位置等の組み合わせでだいぶ簡略できそうです
直前にjoker様から頂いたヒントと共に思考いたします

ありがとうございました


Indexへ
(9994)←【10001】→(10003)
------------------------
【タイトル】Re(1):文字の基点を取りたい 中中等
【記事番号】 10001 (9988)
【 日時 】07/07/22 07:41
【 発言者 】hayabausa

▼あかしさん:
>表の修正等で文字の基点から線を書き出したい時があるのですが
>初期設定からの左下(ずれなし)のみを使っています
>現在は端点・交点を作図して次に中中基点の文字を記入しています
>升目の中芯に文字を入れるのではなく
>文字を基準に升目を修正したいのです
>他の基点 中中点を取得を簡単に出来ませんか?

あかしさん、こんにちは。
皆さん、よこから失礼します。

一部訂正しましたので削除のうえ再投稿します。m(_ _)m

下記は既存文字列の基点に関わらず基点を[中中]に
再設定するものです。
注意点はバッチファイルに記してあります。

この外部変形にはmswin32Ruby1.8.1が必要です。
下記のhikari様の
JWW外変環境設定支援ソフト J_GARU Ver2.0
というソフトで自動導入できます。
尚、導入する前にHPの説明を熟読して下さい。
(特にHPにも解説がありますがActiveScriptRuby重複導入には注意して下さい。)

http://officehikari.art-studio.cc/

以下、Lite & Seen Lite のMiyakeさんの手法に基づくスクリプト兼用バッチファイルです。
http://www17.ocn.ne.jp/~lite/

バッチファイル名は mojiPoint.bat としてください。
#######下記からメモ帳にコピペしで全角スペース→半角スペースの置換をしてください。
@REM 文字基点[中中]設定&実点作図
@echo off
goto do%1
REM #jww
REM #cd
REM #hm |基点再設定|実点共作図|BAT 編集|
REM #:1
REM #:2
REM #h3
REM #g1 全グループ対象(書込みグレープのみ場合は g0 )
REM #hc 文字または寸法値を範囲選択(寸法図形の寸法値対象外)
REM #bz 図寸で書出し
REM #zz 寸法属性書出し
REM #hr
REM #e
REM #:3
REM #h0
REM #hr
REM #e
:do1
:do2
copy jwc_temp.txt temp.txt > nul
ruby -x %~f0 temp.txt %1 > jwc_temp.txt
del temp.txt
rem pause
exit
goto END
:do3
start notepad.exe mojiPoint.bat
echo # > jwc_temp.txt
goto END
#!ruby
####### 注意点 ###########################################################
#
# 1.対象文字列は全レイヤグループです。
#
# 2.項目1は既存文字の基点位置に関わらず基点を[中中]に設定します。
#  この項目を有効にするには環境設定ファイルにMOFST 8.をONにして下さい。
#
# 3.項目2は既存文字の基点位置に関わらず[中中]に実点を作図します。
#
# 4.文字列は任意角度に対応していますが図面軸角0で使用してください。
#
# 5.この外部変形はデータを書換えており思わぬ不具合があるかもしれませんの
#  で十分注意して下さい。
#  問題が発生した場合は使用を中止してください。
#
####### 設 定 ###########################################################
#
$pn = "9"   #実点点種初期設定
#
##########################################################################
def main
 $koumoku = (ARGV.pop).to_s
 include Math
 mojis_data=[]   #文字データ配列
 count = 0     #処理文字データ数カウント
 while ARGF.gets  #jwc_temp.txt読込み
  if $_ =~ /^hq/
   puts "hd"      #文字データ書換
   puts "bz"      #図寸書出し
  elsif $_ =~ /^hch/  #文字種1〜10 高mm
   moji_h = split
  elsif $_ =~ /^c[hsvroptkz2]\s|^cn[0-9]|^cn\"|^l[gy]|^z3/ #文字データ
   mojis_data << $_
  end
 end
 ll = mojis_data.size-1
 ii = 0
 for idx in ii..ll
  if mojis_data[idx].strip =~ /^cn[0-9]/    #文字種の場合
   puts mojis_data[idx]            #文字種書出し
   iidx = idx + 1
   while mojis_data[iidx] =~ /^c[hsvroptkz2]\s|^l[gy]|^z3|^cn\"/
    if mojis_data[iidx] =~ /^l[gy]|^z3|^cn\"/
     puts mojis_data[iidx]         #レイヤ、寸法属性、フォント書出し
    else
     moji = mojis_data[iidx].split
     mc = moji[0].to_s           #文字データ種類
     moji.collect!{ |item| item.to_f }
     no = mojis_data[iidx].index(/\"/)
     string = mojis_data[iidx][no..-1].to_s #文字列(寸法値)
     if mojis_data[idx] =~ /^cn0/      #任意文字の場合
      cn0 = mojis_data[idx].split
      moji_h2 = cn0[2].to_f          #任意文字列の高さ
     elsif mojis_data[idx] =~ /^cn[1-9]/  #文字種1〜10の場合
      cn = mojis_data[idx][2..-1].to_i    #文字種番号
      moji_h2 = moji_h[cn].to_f        #文字列の高さの抽出
     end
     moji_w = sqrt(moji[3]**2+moji[4]**2)  #文字列長さ
     kr_xl = moji[3]; kr_yl = moji[4]    #文字列xlyl成分
     kr = mojikaku(kr_xl,kr_yl)       #文字角度計算
     kr1 = mojikaku(moji_w,moji_h2)     #水平時文字中心角度計算
     krc = (kr+kr1)*PI/180.0        #文字角度+文字中心角度(ラジアン)
     lc = (sqrt(moji_w**2+moji_h2**2))/2.0 #文字列中心と基点左下との距離
     xc = moji[1]+lc*cos(krc); yc=moji[2]+lc*sin(krc) #文字列中心座標
     xc=sprintf("%0.9f",xc).to_f  #誤差調整
     yc=sprintf("%0.9f",yc).to_f  #誤差調整
     puts "cc4"           #文字基点[中中]書出し
     puts [mc,xc,yc,kr_xl,kr_yl,string].join("\s") #基点変更による文字書き戻し
     if $koumoku=="2"
      puts "pn"+$pn        #点種書出し
      puts ["pt",xc,yc].join("\s") #点データ書出し
     end
     count += 1
    end
    iidx += 1
   end
   ii = iidx
  end
  if count >= 1
   puts "h# #{count}個の文字列を処理しました。"
  else
   puts "h# 対象文字列がありません。"
  end
 end
end
def mojikaku(kr_x,kr_y)
 kdo=180.0/PI
 if kr_x>0 && kr_y==0   #0
  kr=0.0
 elsif kr_x==0 && kr_y>0 #90
  kr=90.0
 elsif kr_x<0 && kr_y==0 #180
  kr=180.0
 elsif kr_x==0 && kr_y<0 #-90
  kr=-90.0
 else
  kr = atan2(kr_y,kr_x)*kdo
 end
 kr=sprintf("%0.9f",kr).to_f  #小数点9位丸め
 return kr
end
main()
:END
###############################以上です。


Indexへ
(10001)←【10003】→(10004)
------------------------
【タイトル】Re(2):文字の基点を取りたい 中中等
【記事番号】 10003 (10001)
【 日時 】07/07/22 12:30
【 発言者 】あかし

▼hayabausaさん:
ありがとうございます
早速試してみましたバッチリで大変感激いたしました
実点も作図は目標点が分かりやすくまとめて消せますし大助かりです
それに外変Batがスクリプトを含むのも初体験でした
始めはBatとrbファイルを作成しましたが動かず
その後にHikari様のHPで詳細を勉強できました
私は通常のMSW RBUYのみですがキチンと動作いたしました


Indexへ
(10003)←【10004】→(10005)
------------------------
【タイトル】Re(3):訂正および機能拡張
【記事番号】 10004 (10003)
【 日時 】07/07/22 15:18
【 発言者 】hayabausa

こんにちは。

一部不具合があり訂正しましたので差替えてください。
ついでに任意の基点を設定するようにしました。
######下記から mojiPoint.bat として再保存して下さい。
@REM 文字基点再設定&実点作図
@echo off
goto do%1
REM #jww
REM #cd
REM #hm |基点再設定|実点共作図|BAT 編集|
REM #:1
REM #:2
REM #h3
REM #g1 全グループ対象(書込みグレープのみ場合は g0 )
REM #hc 文字または寸法値を範囲選択(寸法図形の寸法値対象外)
REM #bz 図寸で書出し
REM #zz 寸法属性書出し
REM #hr
REM #e
REM #:3
REM #h0
REM #hr
REM #e
:do1
:do2
copy jwc_temp.txt temp.txt > nul
ruby -x %~f0 temp.txt %1 > jwc_temp.txt
del temp.txt
rem pause
exit
goto END
:do3
start notepad.exe mojiPoint.bat
echo # > jwc_temp.txt
goto END
#!ruby
####### 注意点 ###########################################################
#
# 1.この外部変形は既存文字位置を変えることなく基点を再設定するものです。
#
# 2.対象文字列は全レイヤグループです。
#
# 3.項目1は既存文字の基点位置に関わらず再設定します。
#  この項目を有効にするには環境設定ファイルのMOFST 8.をONにして下さい。
#
# 4.項目2は既存文字の基点位置に関わらず設定基点に実点を作図します。
#
# 5.文字列は任意角度に対応していますが図面軸角0で使用してください。
#
# 6.この外部変形はデータを書換えており思わぬ不具合があるかもしれませんの
#  で十分注意して下さい。
#  問題が発生した場合は使用を中止してください。
#
####### 設 定 ###########################################################
#
$cc = "4"   #文字基点初期設定
#       |6: 左上|7: 中上|8: 右上|
#       |3: 左中|4: 中中|5: 右中|
#       |0: 左下|1: 中下|2: 右下|
#
$pn = "9"   #実点点種初期設定
#
##########################################################################
def main
 $koumoku = (ARGV.pop).to_s
 include Math
 mojis_data=[]   #文字データ配列
 count = 0     #処理文字データ数カウント
 while ARGF.gets  #jwc_temp.txt読込み
  if $_ =~ /^hq/
   puts "hd"      #文字データ書換
   puts "bz"      #図寸書出し
  elsif $_ =~ /^h[ks]/ #軸角、縮尺書出し
   puts $_
  elsif $_ =~ /^hch/  #文字種1〜10 高mm
   moji_h = split
  elsif $_ =~ /^c[hsvroptkz2]\s|^cn[0-9]|^cn\"|^l[gy]|^z3/ #文字データ
   mojis_data << $_
  end
 end
 ll = mojis_data.size-1
 ii = 0
 for idx in ii..ll
  if mojis_data[idx].strip =~ /^cn[0-9]/    #文字種の場合
   puts mojis_data[idx]            #文字種書出し
   iidx = idx + 1
   while mojis_data[iidx] =~ /^c[hsvroptkz2]\s|^l[gy]|^z3|^cn\"/
    if mojis_data[iidx] =~ /^l[gy]|^z3|^cn\"/
     puts mojis_data[iidx]         #レイヤ、寸法属性、フォント書出し
    else
     moji = mojis_data[iidx].split
     mc = moji[0].to_s           #文字データ種類
     moji.collect!{ |item| item.to_f }
     no = mojis_data[iidx].index(/\"/)
     string = mojis_data[iidx][no..-1].to_s #文字列(寸法値)
     if mojis_data[idx] =~ /^cn0/      #任意文字の場合
      cn0 = mojis_data[idx].split
      moji_h2 = cn0[2].to_f          #任意文字列の高さ
     elsif mojis_data[idx] =~ /^cn[1-9]/  #文字種1〜10の場合
      cn = mojis_data[idx][2..-1].to_i    #文字種番号
      moji_h2 = moji_h[cn].to_f        #文字列の高さの抽出
     end
     moji_w = sqrt(moji[3]**2+moji[4]**2)  #文字列長さ
     kr_xl = moji[3]; kr_yl = moji[4]    #文字列xlyl成分
     kr = mojikaku(kr_xl,kr_yl)       #文字角度計算
##########文字基点座標計算
     if $cc =~ /^[012]/    #文字基点[012]の場合
      if $cc=="0"
       mw=0; mh=0
      elsif $cc=="1"
       mw=moji_w/2.0; mh=0
      elsif $cc=="2"
       mw=moji_w; mh=0
      end
     elsif $cc =~ /^[36]/   #文字基点[36]の場合
      if $cc=="3"
       mw=0; mh=moji_h2/2.0
      elsif $cc=="6"
       mw=0; mh=moji_h2
      end
     elsif $cc == "5"     #文字基点[5]の場合
      mw=moji_w; mh=moji_h2/2.0
     elsif $cc =~ /^[48]/   #文字基点[48]の場合
      if $cc=="4"
       mw=moji_w/2.0; mh=moji_h2/2.0
      elsif $cc=="8"
       mw=moji_w; mh=moji_h2
      end
     elsif $cc == "7"     #文字基点[7]の場合
      mw=moji_w/2.0; mh=moji_h2
     end
     xc,yc = mojipoint(mw,mh,kr,moji[1],moji[2])  #基点座標計算
     puts "cc"+$cc         #文字基点書出し
     puts [mc,xc,yc,kr_xl,kr_yl,string].join("\s") #基点変更による文字書き戻し
     if $koumoku=="2"
      puts "pn"+$pn        #点種書出し
      puts ["pt",xc,yc].join("\s") #点データ書出し
     end
     count += 1
    end
    iidx += 1
   end
   ii = iidx
  end
 end
 if count >= 1
  puts "h# #{count}個の文字列を処理しました。"
 else
  puts "h# 対象文字列がありません。"
 end
end
###########基点座標計算
def mojipoint(mw,mh,kr,x0,y0)
 kr1 = mojikaku(mw,mh)         #水平時文字基点角度計算
 krc = kr+kr1              #文字角度+基点角度
 lc = sqrt(mw**2+mh**2)         #文字左下より基点距離
 xc = x0+lc*cos(krc); yc=y0+lc*sin(krc) #基点座標
 xc=sprintf("%0.9f",xc).to_f      #誤差調整
 yc=sprintf("%0.9f",yc).to_f      #誤差調整
 return xc,yc
end
#########文字角度計算
def mojikaku(kr_x,kr_y)
 if kr_x>0 && kr_y==0   #0
  kr=0.0
 elsif kr_x==0 && kr_y>0 #90
  kr=PI/2.0
 elsif kr_x<0 && kr_y==0 #180
  kr=PI
 elsif kr_x==0 && kr_y<0 #-90
  kr=-PI/2.0
 else
  kr = atan2(kr_y,kr_x)
 end
 #kr=sprintf("%0.9f",kr).to_f
 return kr
end
main()
:END
#########以上です。


Indexへ
(10004)←【10005】//(9995)
------------------------
【タイトル】Re(4):訂正および機能拡張
【記事番号】 10005 (10004)
【 日時 】07/07/22 18:04
【 発言者 】あかし

▼hayabausaさん:
再度検討いただいたのですね
私には残念ながらどの部分を修正されたのか交互に切り替えて検証しても
動作上では確認出来ませんでした
各基点の変更が手軽に出来るのは素晴らしいですね
外変中にスクリプトの変更をするのは始めてですが手軽に使えました
エディター起動するのもわずらわしいですし
切換選択の機能も持たせるわけですね
              感謝です  ありがとうございました