背景
レーザー加工用の切断データはパス(Path)と呼ばれるベクトルデータで作成します。周知のようにベクトルグラフィックソフトのデファクトスタンダードはAdobe Illustrator(AI)ですが比較的高価なため、趣味として切断データを作成する場合にはLibreOffice Drawなど無料のベクトルグラフィックソフトを使います。
課題
自宅でLibreOffice Drawを使って切断データを作成し、SVG形式のファイルをUSBメモリに保存してレーザー加工機のあるファブ施設に向かいます。ファブ施設ではデファクトスタンダードなAIがレーザー加工機のインターフェースとなっている場合が多いので、LibreOffice DrawのSVGファイルをAIに読み込ませます。AIで開くと、一見、作成した時と同じ図形のように表示されますが、実際は同じ図形が二重になっています。そのままレーザー加工機で加工を行うとレーザーが二度通過するために多くの時間がかかったり、切断面が焦げてしまいます。慣れないAIを使って手作業で重なったパスを取り除くのはかなり苦痛な作業です。AIはプロが素早く作業ができることを目指していて、素人が使うようにはできていないのです。
SVGファイルならば全て二重になるかといえば、そんなことはありません。AIで作成した切断データをSVG形式で保存して、それをAIで読み込んだ場合は二重になるような不具合は生じません。
SVGファイルはテキストで書かれているので、テキストエディタで開いて両方のファイルを比べてみると、AIで作成したSVGファイルはヘッダーとパスしかないシンプルなファイルであることがわかりました。つまり、AI風なSVGならOK!!
無料のベクトルグラフィックソフトで作成した加工図を使って不具合なくレーザー加工をするために、「LibreOffice DrawのSVGファイルをAIで作成したSVGファイルのように変換したい」
解決方法
LibreOffice DrawのSVGファイルからAIが必要とする部分だけを抽出して新しいファイルを作成する。テキストファイルの文字列操作なので、ほとんどのプログラム言語で容易に作成することができるはずです。ここではMac OS、Windows 10、Linux用に実行ファイルを作成できるProcessing(バージョン3.3.5)を使用しました。個々のPCで実行するためには無料のJava実行環境をインストールする必要があります。Mac OSとWindows 10では動作を確認しましたが、Linuxでの動作は未確認です。
プログラムを実行し、ユーザーが変換するファイルを指定すると、「xml:space=”preserve”>」が含まれるヘッダー行と「<path fill=”none”」が含まれるパスデータだけを抽出して、ファイルの末尾に「</svg>」を置きます。そしてファイル名の末尾に「_ai」を追加した新しいファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
//LibreOfficeDrawSVGtoAiSVG // // LibreOffice Drawを使ってレーザー加工機の切断パスを作成する時に //LibreOffice Drawで保存したSVGファイルをAdobeIllustratorのSVGファイル風に変換するアプリケーション // //計測・解析ラボ 大橋康司 2021.07.22 //無保証 //CC BY-NC String svgFile; String newFileName; String fileExtension=".svg"; String insertSuffix="_ai.svg"; BufferedReader reader; String line; PrintWriter writer; String headerKey="xml:space="+ char(34)+"preserve"+char(34)+">";// xml:space="preserve"> String pathKey="<path fill="+ char(34)+"none"+ char(34);// <path fill="none" void setup() { size(560,180); titleText(); selectInput("変換するSVGファイルを選択してください。", "newThread"); } void convertSVG(){ reader = createReader(svgFile);// file path to "User selected SVG file" newFileName=svgFile.replace(fileExtension,insertSuffix); writer = createWriter(newFileName); while(true){ try { line = reader.readLine(); } catch (IOException e) { e.printStackTrace(); line = null; } if (line != null) { if (line.contains(headerKey)){ writer.println(line); } if (line.contains(pathKey)){ writer.println(line); } } else { writer.println("</svg>"); writer.flush(); writer.close(); exit(); } } } void newThread(File selection) { if (selection == null) { println("Window was closed or the user hit cancel."); } else { svgFile=selection.getAbsolutePath(); if(svgFile.contains(fileExtension)){ println(svgFile); println("SVG file Selected"); convertSVG(); } else{ println("Select SVG file"); exit(); } } } void titleText(){ background(190,220,240); textSize(40); fill(0,0,255); text("Convert LibreOffice SVG", 50, 50); text("to AI style SVG", 230, 100); fill(255,0,0); text("Select SVG File", 50, 150); delay(3000); } |
ProcessingプログラムファイルとサンプルSVGファイル
実行ファイル(Javaランタイムエンジンを別途ダウンロードする必要がある)
Windows64bit
Windows32bit
Mac OS
Linux64
Linux32
LinuxArm64
LinuxArmV6hf
その他
InkscapeのSVGファイルも同様な処理をすればAI風なSVGにできると思いますが、私にはInkscapeが使いづらいので確認する意欲がありません。Inkscapeの好きな人は多いと思いますのでどなたか検討していただけるとありがたいと感じてくれる人が多いのではないかと思います。
LibreOffice Drawは使いやすいですよ。