電子納品Layer


 
土木CAD製図基準
 

 2004年度CALS完全実施。とうとうその時が来た。電子納品はすでに設計では始まっている。CALS対応図面Templateを準備しておかなければならない。CAD製図基準に従い、まずはレイヤーの名前、色、線種の設定をしておこう。
 完全運用でCALS対応図面が流通すれば、既存図面からTemplateに整理しておけばいいのだが、まだ回って来ない状況だ。インターネットで検索しても見当たらない。PDF仕様を眺め、作るしかないのだろうか。
 「(社)日本土木工業協会」にはCALS/EC特別委員会があり活発な活動をしている。 CALS/EC部会のページにこんなEXCELの表があった。EXCELはHTMLで保存できる。HTML形式でここに転載させて頂く。
上部工構造図 レイヤ名 内容 線種 線色
SDCM※1 TTL   外枠 実線
FRAM タイトル枠、凡例図枠 実線
LINE 区切線、罫線 実線
TXT 文字列 実線
BMK   構造物基準線(中心線) 一点鎖線
  HTXT 旗揚げ 実線
STR   主構造物外形線 実線
STR1 主構造物1(鉄筋) 実線
STR2 主構造物2(PC) 実線
STRn 主構造物n(その他) 実線 任意
DIM 寸法線、寸法値 実線
TXT 文字列 実線
HTXT 旗揚げ 実線
MTR   材料表タイトル 実線
FRAM 材料表図枠 実線
TXT 文字列 実線
MTXT 数量表示文字列 実線
※1 S:測量D:設計C:施工M:維持管理

 EXCELはCSVを掃き出すこともできる。CSVからXMLリストを作ってみよう。

 

CSVからXML
 

CSVの確認


 CAD製図基準の付属資料には14工種のレイヤ一覧表がある。PDFの文書セキュリテー の「内容のコピーまたは抽出」が「許可」であることを確認してTXTを抽出する。それを、 CSVに整形した橋梁詳細設計のレイヤー規則が上のTXT。
 このデータを眺め、XMLの構造を考える。

 XMLの例は、同じくCAD製図基準の付属資料5にある。TXTを抽出整形し、XMLの 拡張子で保存すれば、りっぱなXML文書。

XMLの例


 このXML文書の大まかな構造は下記。
<?xml version="1.0" encoding="Shift_JIS" ?> <!DOCTYPE drawingdata SYSTEM "DRAW02.DTD"> <drawingdata DTD_version="02"> <ソフトウェア情報> *********** </ソフトウェア情報> <図面情報> *********** </図面情報> </drawingdata>

 図面情報は次の9項目。
<図面情報> <図面名>平面図</図面名> <図面ファイル名>DOPL001Z.ABC</図面ファイル名> <作成者名>○○建設コンサルタント株式会社</作成者名> <図面ファイル作成ソフトウェア名>○○CADVer1.0     </図面ファイル作成ソフトウェア名> <図面尺度>1:10000</図面尺度> <図面番号>1</図面番号> <場所情報> ******** </場所情報> <基準点情報> ******** </基準点情報> <その他> ******** </その他> </図面情報>

 本来レイヤ情報は図面情報の要素であるが、CAD製図基準通りなら省略ということだろう。このXMLのDTD(Document Type Definition) を見てみると、追記はエラーとなりそうだ。もし、基準通りでないなら、「その他」の「受注者説明文」の中に書くのであろうか。
 以上より図面レイヤ情報は次のようなXMLデータとしよう。
<?xml version="1.0" encoding="Shift_JIS" ? standalone="yes"?> <drawingdata> <工種>橋梁詳細設計</工種> <図面情報> <図面名>上部工構造図</図面名> <図面ファイル名>DOPL001Z.DWG</図面ファイル名> <レイヤ情報> <Layer ID="D-TTL">外枠 <linetype>実線</linetype> <color>黄</color> </Layer> <Layer ID="D-TTL-FRAM">タイトル枠、凡例図枠 <color>実線</color> <linetype>黄</linetype> </Layer> ******** </レイヤ情報> </図面情報> </drawingdata>

 このXMLのソースにCSVのデータを合成すればいいだろう。javaScriptで行う。 XMLの概要はここに整理しておいた。

 

javaScript
 

 javaScriptのソースは下記。CSVのデータをXLMのタグでラッピングしている。 包装紙がHTMLタグなら、サーバーでCGIがしてる事と同じ。
function Convert(){ var msg=TXT.document.body.createTextRange().text; var i=0; msg2="<?xml version='1.0' encoding='Shift_JIS'?>\r\n"; msg2+="<drawingdata>\r\n"; var n1=0; var n=0; n=msg.indexOf("\n",0 ); myStr=msg.substring(n1,n-1).split(","); n1=n+1; msg2+="<工種>"+myStr[0]+"</工種>\r\n"; msg2+="<図面情報>\r\n"; while ((n=msg.indexOf("\n",n1))!=-1) { myStr=msg.substring(n1,n-1).split(","); n1=n+1; Str =myStr[1].split("@"); msg2+="<図面名>"+Str[0]+"</図面名>\r\n"; i=i+1; if (i< 10) {ii="00"+i.toString(10)} else if (ii<100) {ii="0"+i.toString(10)} msg2+="<図面ファイル名>D0"+Str[1]+ii+"0.dwg</図面ファイル名>\r\n"; msg2+="<レイヤ情報>\r\n"; while ((n=msg.indexOf("\n",n1))!=-1) { myStr=msg.substring(n1,n-1).split(","); if (myStr[1] !="" ) { break ; } n1=n+1; msg2+="<Layer ID='D-"+myStr[4]+"'>\r\n"; msg2+="<name>"+myStr[2]+myStr[3]+"</name>\r\n"; msg2+="<linetype>"+myStr[6]+"</linetype>\r\n"; msg2+=" <color>"+myStr[5]+"</color>\r\n"; msg2+="</Layer>\r\n"; } msg2+="</レイヤ情報>\r\n"; } msg2+="</図面情報>\r\n"; msg2+="</drawingdata>\r\n"; TXT.document.body.createTextRange().text=msg2; }
 

CSVからXML変換
 

[ファイル選択]

[工種選択]  
道路詳細設計
平面交差点詳細設計
立体交差点詳細設計
橋梁詳細設計
共同溝設計
電線共同溝詳細設計
管路詳細設計
築堤・護岸詳細設計
樋門・樋管設計
海岸構造物設計
重力式コンクリートダム詳細設計
砂防ダム及び床固め工詳細設計
山岳トンネル詳細設計
シールドトンネル詳細設計
地質平面図
地質断面図



 工種を選択してCSV -->XMLをクリックでXML変換される。

 ついでに、AutoCADLT用のスクリプトファイルを作っておこう。AutoCADスクリプトはコマンドに CSVデータを割り付けるので、上のjavaScriptのソースを利用すればいいが、XML変換された XML文書があるのだから、これを利用してみよう。

 
XMLDOM
 

 Internet Explorer6.0をインストールするとMsxml3.dllがPCのwindows/systemに組込まれる。知らない人が大半だが、PCの中を検索するとMsxml3.dll、Msxml3a.dll、Msxml3r.dllのセットであるはずだ。

MSXML3はXMLパーサ、DOM、SAX、XSLTの機能を提供する。

当面、これだけあればXMLは事足りる。


 XMLパーサは何をしてくれるかといえば、XML文書の文法チェック。間違いがあると矢印 で指摘してくれる。XML変換がリストとして無事に上で表示されたのは、 チェックをパスしたからだ。

 DOMは何をしてくれるか。XML文書をオブジェクトにしてくれる。オブジェクトは階層構造があって、一番外のタグがルート、その内側は親、その内側は子、孫と系図状に定義される。javaScriptはオブジェクト指向言語。これで処理するのに便利。ただそれだれのこと。


電子納品図面レイヤ仕様

上の画面でファイル選択してクリック

     

          


 XMLのソースを眺めれば分るのだが、タグ付きデータ=エレメントが階層構造に並べてある。これら全体をドキュメントと呼ぶ。xmlのルール。
 眺めたり、データとして抜き取ったり、削除修正するにはアクセスできなければならない。JavaScriptはオブジェクト指向言語だから当然DOMのオブジェクトを利用する。要素には属性があった。属性は要素の付属物だから、要素と属性は対等関係ではない。しかし、まずはなんでもnodeというオブジェクトにしてしまおう。これがDOMの発想のようだ。

 JavaScriptでXMLファイルからデーターを読み込む。そのため、xml用のオブジェクトを作る。名前はxmlのルールに従い自由に付ける。

var xmlDoc= new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async = false; xmlDoc.load("../freedata/DOUROsyousai.xml");
 loadはメソッド。XML文書をオブジェクトとしてメモリーに データー展開してくれる。一つのXML文書に一つのdocument を作り、その下にElementを系図状に管理される。

 xmlにはルート要素があった。これがdocumentElementに対応する。オブジェクトとプロパテーをこの様に指定する。
documentElement.nodeName documentElement.childNodes.length documentElement.childNodes.item(0).nodeName documentElement.childNodes.item(1).nodeName

 ルート要素のnodeNameを確認して、その直下のnode数をしらべ、 直下のnode(=子node)の名前を確認する。それを文字列に 取出して表示する。上の「ROOT INFO」に割り付けてある。

 childNodes.item(1)はchildNodes[1]と短く書ける。documentElement.childNodes[1].childNodes[2]のようにルートから辿れば、どのnodeにもアクセス出来るが、階層が深いと気が遠くなる。ビジネスツールはもっとスマートなはず。nodeの名前は要素の名前、つまりタグ名ということ。ならば、タグ名で検索ができるはずだ。

この場合getElementsByTagName()を使いリストを作る。

objNodeList = xmlDoc.getElementsByTagName("図面名")

nodeListに拾い出されているitem()は一人前のnode。というより、nodeListはオリジナルなnodeの仮集計票という感じだ。item()を通じてオリジナルnodeにアクセスする。
objNodeList = xmlDoc.getElementsByTagName("図面名"); n=objNodeList.length; string="図面枚数 = "+n+"\n"; for (i=0;i<n;i++) { string+="図面名= "+objNodeList.item(i).text+"\n"; }

上の「図面リスト」、「図面名リスト」、「画層リスト」は、これを利用している。

 図面情報は1枚の図面の「図面名」、「図面ファイル名」、「画層データ」をセットで並べた。7枚だから 21の項目が並列に並ぶ。一見処理に都合の悪い階層構造のようだが、DOMのメソッドのおかげで、不都合はない。工種によって、図面枚数は不定形だ。この構造は、これに対応する柔軟性を持っている。

「Layer情報リスト」のソースコードは以下。Microsoft.XMLDOMを利用しDOM仕様にするとJavaScriptのソースが スマートになるということだろう。
function LAYER() { var msg=TXT4.document.body.createTextRange(); xmlDoc.load(xmlfilename); objNodeList1 = xmlDoc.getElementsByTagName("図面名"); objNodeList2 = xmlDoc.getElementsByTagName("図面ファイル名"); objNodeList3 = xmlDoc.getElementsByTagName("レイヤ情報"); string=xmlDoc.documentElement.childNodes.item(0).text+"\r\n"; string+=" ..................\n"; n=objNodeList1.length; for (i=0;i<n;i++) { string+="図面名 "+objNodeList1.item(i).text+"\n"; string+="図面ファイル名 "+objNodeList2.item(i).text+"\n"; n1=objNodeList3.item(i).childNodes.length; for (j=0;j<n1;j++) {   currNode = objNodeList3.item(i).childNodes.item(j); string+=currNode.attributes.item(0).text+"\r\n"; for (k=0;k<3;k++) { string+=currNode.childNodes.item(k).text+"\r\n"; } } string+=" ..................\n"; } msg.text=string; }

 XML文書をデータとして要素の拾い出しをJavaScriptで行った。あとはAutoCADのSctiptに変換する。これはコマンドでラッピングすればいい。上のボタンに割り付けてみた。
 新規図面はパッケージソフトを利用したり、電子納品図面をテンプレートに整理 したりの方法がある。過去の図面資産を電子納品図面にリメークする場合は手作業となるが、結構時間が掛かる。既存図面に電子納品レイヤーを追加する時には、このスクリプトは 重宝している。

 電子納品はなぜXMLなの? そんな疑問を持つのだが。確かに、これからはテキストタグベースが文書構造の基本だろう。今回JavaScriptをDOMの応援で使った。このように、XMLは後の処理のデータとして使える。これが「今後はXML」という理由の一つ。PDFでは次世代仕様でないということだ。
 今回JavaScriptを使ったが、 Scriptなしでワープロ感覚プロセッサーとしてXMLを扱えるのがSAX、XSLTのようだ。XMLベースのツールが続々登場してくるだろう。だからXMLと理解した。


2004.1.26
by Kon