一括面取り

作成理由

  • jww掲示板で一括で面取りする外部変形が欲しいとのことだったので考えてみる

動作環境

  • ruby 1.8.7 (2010-12-23 patchlevel 330) [i386-mingw32] にて動作確認しています

追記(2023-12-18)

  • jww掲示板でたけおさんの指摘通りci の軸角、扁平率を間違ってました(たけおさん、ありがとう)
  • ちょっと言い訳させてもらうと
    • 久しぶりにベクトル計算とかして始点がここで終点はこっち、だからRの向きがどうたらこうたらなんて考えてるうちに脳みそがとろけててなんとか動くようになったときにそこまでチェックできなかった
    • そもそも自分が jww を日常的に使って外部変形をゴリゴリと書いていたのはもう十何年も前で今はたまに掲示板で話題になるときにその都度どうだったかなって jww_smpl.bat を見ながら書いてるんだから錆びつくのもまあ仕方ないよね
  • なんて言いたいことはいろいろあるのですが、まあなんとかものになったようで良かったです


REM 一括面取り.bat
REM 面取りを一括で行う
CHCP 932
echo off
REM #jww
REM #cd
goto %1
REM #hm【一括面取り】 |辺寸法|R寸法|面寸法|
REM #:1
REM #h2
REM #hc 【辺寸法】面取りする範囲を選択
REM #c 【辺寸法】面取り寸法 無指定:10.0 /_a
REM #e
REM #:2
REM #h2
REM #hc 【R寸法】面取りする範囲を選択
REM #c 【R寸法】面取り寸法 無指定:10.0 /_a
REM #e
REM #:3
REM #h2
REM #hc 【面寸法】面取りする範囲を選択
REM #c 【面寸法】面取り寸法 無指定:10.0 /_a
REM #e
:1
:2
:3
copy jwc_temp.txt temp.txt
REM C:\ruby187b\bin\ruby -Ks -x %~f0 %1 %2 %3
ruby -Ks -x %~f0  %1 %2 %3
GOTO END
REM #~

◎コメント
◎最終更新:2023-12-18
◎バッチファイル名は自由
◎以下 ruby スクリプト部分

#! ruby
# encoding: SJIS

$stdout=open("jwc_temp.txt","w")
$stderr=open("tmp_err.txt","w")

include Math
require "matrix"

class Array
  def to_v
    a=self.map{|e| e.to_f}
    return [Vector[a[0],a[1]],Vector[a[2],a[3]]].sort_by{|e| e.to_a}
  end
  def to_af
    return self.map{|e| e.kind_of?(Vector) ? e.to_a : e}.flatten
  end
end

opt=ARGV[0].to_i
men=10.0
ARGV.each{|e|
  if %r|^a(.*)|=~e
    men=$1.to_f
  end}
men=men/(2**0.5) if opt==3

ar=open("temp.txt").readlines.map{|e| e.chomp}
ln=ar.select{|e| /^ [\d-]/=~e}.
  map{|e| e.split(" ")}.uniq
ln=ln.map{|e| e.to_v}
ln=ln.select{|e| (e[1]-e[0]).r>men*2}

lv=ln.select{|e| e[0][0]==e[1][0]}
lh=ln.select{|e| e[0][1]==e[1][1]}

ar,i=[],0
while lh[i]
  hs=lh[i]
  (lh-hs).select{|he| (he[0][0]==hs[0][0] && he[1][0]==hs[1][0])}.
    map{|he|
      if (lv.include?([hs[0],he[0]]) && lv.include?([hs[1],he[1]])) or
          (lv.include?([hs[0].*(-1),he[0].*(-1)]) && lv.include?([hs[1].*(-1),he[1].*(-1)]))
        ar += [[he,[hs[0],he[0]]],[he,[hs[1],he[1]]],[hs,[hs[0],he[0]]],[hs,[hs[1],he[1]]]]
      end}
  i=i+1
end
ar=ar.uniq
ar=ar.map{|e| e.map{|f| f.sort_by{|g| g.to_a}}}
#a2=a1.map{|e|
ac=ar.map{|e|
  eh,ev=e[0],e[1]
  if    eh[0]==ev[0]
    e1=eh[0]+(eh[1]-eh[0])*men*((eh[1]-eh[0]).r)**(-1.0)
    e2=ev[0]+(ev[1]-ev[0])*men*((ev[1]-ev[0]).r)**(-1.0)
    e3=[e1[0],e2[1],men,180,270]
  elsif eh[0]==ev[1]
    e1=eh[0]+(eh[1]-eh[0])*men*((eh[1]-eh[0]).r)**(-1.0)
    e2=ev[1]-(ev[1]-ev[0])*men*((ev[1]-ev[0]).r)**(-1.0)
    e3=[e1[0],e2[1],men,90,180]
  elsif eh[1]==ev[0]
    e1=eh[1]-(eh[1]-eh[0])*men*((eh[1]-eh[0]).r)**(-1.0)
    e2=ev[0]+(ev[1]-ev[0])*men*((ev[1]-ev[0]).r)**(-1.0)
    e3=[e1[0],e2[1],men,270,0]
  elsif eh[1]==ev[1]
    e1=eh[1]-(eh[1]-eh[0])*men*((eh[1]-eh[0]).r)**(-1.0)
    e2=ev[1]-(ev[1]-ev[0])*men*((ev[1]-ev[0]).r)**(-1.0)
    e3=[e1[0],e2[1],men,0,90]
  end
  [e1,e2,e3,eh]}
ah0=ar.transpose[0].to_a
av0=ar.transpose[1].to_a
ahf=ah0.to_a.flatten
avf=av0.to_a.flatten
ah1=ah0.map{|e|
  em,en=e[0],e[1]
  em=e[0]+(e[1]-e[0])*men*((e[1]-e[0]).r)**(-1.0) if avf.include?(e[0])
  en=e[1]+(e[0]-e[1])*men*((e[0]-e[1]).r)**(-1.0) if avf.include?(e[1])
  [em,en]}
av1=av0.map{|e|
  em,en=e[0],e[1]
  em=e[0]+(e[1]-e[0])*men*((e[1]-e[0]).r)**(-1.0) if ahf.include?(e[0])
  en=e[1]+(e[0]-e[1])*men*((e[0]-e[1]).r)**(-1.0) if ahf.include?(e[1])
  [em,en]}

open("temp.txt").readlines.each{|e|
  if /^hq/=~e
    puts "hd"
  elsif /^ [\d-]/=~e
    ee=e.split(" ").to_v
    if ah0.include?(ee)
      puts " "+ah1[ah0.index(ee)].to_af.join(" ")
      if opt==2
        ac.select{|e| e[3]==ee}.each{|e|
          puts "ci "+e[2].to_af.join(" ")}
      else
        ac.select{|e| e[3]==ee}.each{|e|
          puts " "+[e[0],e[1]].to_af.join(" ")}
      end
    elsif av0.include?(ee)
      puts " "+av1[av0.index(ee)].to_af.join(" ")
    else
      puts e
    end
  else
    puts e
  end
}

__END__
:END

コメント