数年前に退社された方のパソコンがなぜか私の手元に来ました。
中をのぞくと、社内で10年以上にわたり作成、改造した冶具のcad図面のデータが入ってます。これは会社の貴重な財産です。パソコンごと捨てられる前にバックアップしました。
さて、それを利用したいのですが、win3.1の時代のWINCAD3という CADソフトのDXFデータです。迎え撃つのは、フリーのQCADです。
結論として、今のところ、線の太さの情報がデータに入ってないようで、すべて同じ太さの線になりますが、破線や一点鎖線は元通りに取り込めます。コメント表示の文字化けもなくなりました。十分実用になります。
やり方です。
① WINCAD3のデータをDXFの拡張子でPYTHONの実行ファイルと同じフォルダに保存する。
DXFファイルの グループコードの値は次の事がわかってます。
0 種類(ARC,CIRCLE,TEXT,LINE等)
6 ラインタイプ(CONTINUOUS:連続線,HIDDEN:破線 1,DASHDOT:一点鎖線,)
8 画層:レイヤー
10 開始点のx座標
20 開始点のy座標
11 終了点のx座標
21 終了点のy座標
40 半径
50 開始角度
51 終了角度
370 線の太さ ー1;画層による。-2;ブロックによる。 30:0.3㎜
② テキスト部分をUNICODEに書き換える(PYTHONにやってもらいます)
pythonと同じフォルダに置いてある"ABCD-00.DXF"を”ABCD-00X.DXF”に変換します。
'KANJI'と書いてある行を探し、その2行上の行のコードを変換します
WINCAD3コードそのままで変換しないのは
0x0000 ~ 0x0390
0x0450 ~ 0x2fff
0x3001 ~ 0x3030
それ以外は UTF-16に変換します。
また、'ff9f' は '00b0'に変換します。
いまのところこれで文字化けには遭遇してません。
以下実行コードです
>import glob
files = glob.glob("*.DXF")
for file in files:
print(file)
before2_line = ''
before1_line = ''
KANJI_flag = 0
with open(file) as f , open((str(file)[:-4])+"X.DXF",'w') as new_f :
l = f.readlines()
print(type(l))
print(l)
for line in l:
#print(line)
new_line = ''
if 'KANJI' in line :
#print(before2_line)
#print(before1_line)
for car in before2_line:
#print(car)
utf_car =hex(ord(car))
#print(utf_car)
utf_car2 = utf_car[2:]
#print(utf_car2)
"""
encode: ~ 0x3031
0x3000
0x044f ~ 0x0391
no_encode: 0x3030 ~ 0x3001
0x2fff ~ 0x0450
0x0390 ~ 0x0000
"""
if ((int(utf_car2,16) <= 0X3030 and int(utf_car2,16) > 0X3000)
or (int(utf_car2,16) <= 0X2fff and int(utf_car2,16) > 0X044f)
or int(utf_car2,16) < 0X0391 ) :
new_line = new_line +(car)
else :
if utf_car2 == 'ff9f' :
new_line = new_line +(r'\U+' + '00b0')
elif len(utf_car2) == 1 :
new_line = new_line +(r'\U+' + '000' + utf_car2)
elif len(utf_car2) == 2 :
new_line = new_line +(r'\U+' + '00' + utf_car2)
elif len(utf_car2) == 3 :
new_line = new_line +(r'\U+' + '0' + utf_car2)
else :
new_line = new_line +(r'\U+' + utf_car2)
#new_line = new_line[:-4]
print(new_line)
new_f.write(new_line )
KANJI_flag = 2
else :
if KANJI_flag == 0 :
print(before2_line)
new_f.write(before2_line )
#new_f.write(before2_line + '\n')
elif KANJI_flag == 2 :
KANJI_flag = 1
else :
KANJI_flag = 0
before2_line = before1_line
before1_line = line
print(before2_line)
new_f.write(before2_line )
print(before1_line)
new_f.write(before1_line )
print('EOF')
new_f.write('EOF' )
f.close()
new_f.close()
③ QCADでファイルを開いて何もせずに上書き保存する。
QCADで ○○X.DXFというファイルを一括で開いて、上書き保存→閉じる、上書き保存→閉じる、を全数繰り返します。これが一番面倒です。
④ テキストのSTANDARD 表示をUNICODEに変更する(PYTHONにやってもらいます)
pythonと同じフォルダに置いてある"ABCD-00X.DXF"を”ABCD-00Y.DXF”に変換
テキストごとに STANDARDというフォントを全ファイル一括でUNICODEに書き換えます。これでテキストの文字は日本語で表示されます。
import globfiles = glob.glob("*X.DXF")
for file in files:
print(file)
before2_line = ''
before1_line = ''
KANJI_flag = 0
with open(file) as f, open((str(file)[:-5])+"Y.DXF",'w')as new_f:
l = f.readlines()
print(type(l))
#print(l)
for line in l:
#print(line)
new_line = ''
if 'Standard' in line :
line = 'Unicode ' + '\n'
print(line)
new_f.write(line )
f.close()
new_f.close()
⑤ 文字の大きさを変更する
pythonと同じフォルダに置いてある"ABCD-00Y.DXF"を”ABCD-00Z.DXF”に変換
”ABCD-00Y.DXF” で読めますが、文字サイズが大きく見ずらいので変更します。
文字の倍率は mag_textで指定します。0.7倍で見やすくなりました。
import glob
mag_text = 0.7
def is_num(x):
try:
float(x)
except ValueError:
return False
else:
return True
files = glob.glob("*Y.DXF")
for file in files:
print(file)
base_line = 0
before2_line = ''
before1_line = ''
line_count = 0
KANJI_flag = 0
line_list = []
with open(file) as f, open((str(file)[:-5])+"Z.DXF",'w')as new_f:
l = f.readlines()
print(type(l))
#print(l)
for line in l:
line_count = line_count + 1
line_list.append(line)
print (line_count)
#print(line)
#new_line = ''
for line_number in range (line_count):
if line_list[line_number] == 'AcDbText\n':
print (line_list[line_number + 8])
if is_num(line_list[line_number + 8]) :
line_list[line_number + 8] = str(float(line_list[line_number + 8]) * mag_text)+"\n"
for line in line_list :
new_f.write(line )
f.close()
new_f.close()
実際の図面の絵のビフォーアフターを乗せれないのが残念です。
WINCAD3はネットでさがしてもほとんど情報が得られないので、古いデータの活用をあきらめてる方がおられるやも知れません。こんな再利用方法もありますよ。
0 件のコメント:
コメントを投稿