果報は寝て待て: 2月 2022

2022年2月19日土曜日

winCAD3のデータをQCADで読み取る

数年前に退社された方のパソコンがなぜか私の手元に来ました。

 中をのぞくと、社内で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 glob

files = 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はネットでさがしてもほとんど情報が得られないので、古いデータの活用をあきらめてる方がおられるやも知れません。こんな再利用方法もありますよ。