フリーのCADソフトで図面作成
主要な商用CADは1席あたり年間10万〜30万円台のコストが一般的で、プロフェッショナル向け機能を必要としないライトユーザーや一時的な作図需要に対しては過剰投資になりがちです¹²。オープンソースや無償プランの成熟が進み、2D作図や部品図、簡易アセンブリ、さらにはプログラムによる自動作図まで、無料ツール(FreeCAD/LibreCAD/QCAD/OpenSCADなど)でも実務に耐えるケースが増えています。CTOやエンジニアリングリーダーにとっては、全席フル機能を配るのではなく、用途に応じて「無料の自動化パイプライン」と「商用CADのレビュー・最終出力」を役割分担させる設計がコストとスループットの両立につながります。本稿では、FreeCADやezdxf、pythonocc-core、OpenSCAD、Node製DXFツールなどを組み合わせ、図面の自動生成・変換・配布(DXF/STEP/SVG/PDF)までをコードで示しつつ、互換性やガバナンス、ROIの観点も具体的に解説します。なお用語は可能な限り平易に補足します(例:DXF/DWG=2D図面の交換/編集フォーマット、STEP/IGES=3D中間フォーマット、ヘッドレス=GUIなし実行、CI/CD=継続的インテグレーション/デリバリー)。
無料CADを業務に入れるための現実的な選定軸(FreeCAD/LibreCAD/QCAD/OpenSCADの比較とDXF/STEP互換性)
無料と言っても対象は広く、2D作図に強いLibreCADやQCAD(コミュニティ版)³、3Dパラメトリック(寸法や式で形状を制御)のFreeCAD、プログラマブルなOpenSCAD、幾何カーネル(形状計算エンジン)を直接扱うpythonocc-coreなど性格が異なります。業務で使うなら、ファイル互換性、ヘッドレス実行の可否、スクリプトやAPIの成熟度、CI/CDへの組み込みやすさ、そしてライセンスや運用ガバナンスを見極める必要があります。特に互換性ではDXF、DWG、STEP、IGES、STL、SVGなどの入出力が要点で、無料系ツールの軸足はDXF/STEP/SVGに置かれていると理解しておくと破綻しにくくなります⁴⁵。DWGネイティブ編集を無償で完璧に、という期待は現実的ではないため、レビューや最終納品がDWG必須なら、設計初期〜自動生成はDXF/STEPで回し、最終変換のみ商用席で行う二段構えが安全です⁴。
もう一つのポイントは自動化適性です。図面テンプレート化や部品寸法のバリエーション展開、派生モデルの量産など、反復が多い領域はコード生成と相性がよく、人手のクリック作業をPythonやNode、OpenSCADスクリプトに置き換えるだけで、工数と差し戻しを同時に削減できます。この運用はGitによる変更履歴や差分レビューとも親和性が高く、設計変更のトレーサビリティが向上します。ライセンス面では、FreeCADやLibreCADはGPL系、pythonocc-coreはLGPL/GPL系依存を持ちますが、生成された図面ファイルは通常ライセンスの伝播対象ではないという一般的な理解があり、社内運用においても扱いやすいのが実情です(最終判断は法務の方針に従ってください)⁷。なお、パラメトリックなスクリプト設計は再現性・共有性の観点でも有効とする報告があります⁶。
参考までに、現場でよくある一例として「板金ブラケットの穴ピッチと幅だけが異なる10バリエーションを都度作図する」業務があります。ここはテンプレート化と寸法パラメータ化の効果が出やすく、DXFのタイトルブロック差し替えと寸法注入を自動化するだけで、作図時間とレビュー差し戻しを目に見えて抑えられるケースが多い領域です。
実装編:無料ツールで図面を自動生成する(DXF/STEP/SVG/PDF対応)
ここからは実務でそのまま使える最小限のコードを示します。いずれもヘッドレス実行を念頭に置き、DXF/STEPといった中間フォーマットで連携します。強調したいのは、生成・変換・配布がすべてスクリプトで繋がることです。これにより夜間バッチやPull Requestトリガで図面を量産し、PDFと中間データを自動配布できます。
Python + ezdxf:A4矩形図面をDXFで生成し、SVGに描画
DXFの生成に特化したezdxfは軽量で高速です(DXF=AutoCAD互換の図面交換フォーマット)。まずは外形とタイトルをもつ最小サンプルをDXFに書き出し、続いてSVG(Webで扱いやすいベクター画像)にレンダリングします。エラー時は非ゼロ終了でCIに通知します。
# gen_dxf.py
import ezdxf
import sys
import time
def build_doc():
doc = ezdxf.new("R2010")
msp = doc.modelspace()
# A4相当のフレーム(単位mm想定)
msp.add_lwpolyline([(0, 0), (297, 0), (297, 210), (0, 210), (0, 0)], close=True)
# タイトルと寸法線の代替注記
msp.add_text("BRACKET-001", dxfattribs={"height": 5}).set_pos((10, 195))
# 穴ピッチの参考線
msp.add_line((40, 105), (257, 105))
return doc
def main(out_path: str) -> None:
t0 = time.perf_counter()
doc = build_doc()
doc.saveas(out_path)
dt_ms = (time.perf_counter() - t0) * 1000
print(f"wrote {out_path} in {dt_ms:.1f} ms")
if __name__ == "__main__":
target = sys.argv[1] if len(sys.argv) > 1 else "drawing.dxf"
try:
main(target)
except Exception as e:
print(f"error: {e}", file=sys.stderr)
sys.exit(1)
生成したDXFをサムネイルやオンラインレビューに載せるにはSVG化が便利です。ezdxfの描画アドオンでベクター出力できます⁸。
# dxf_to_svg.py
import ezdxf
from ezdxf.addons.drawing import Frontend, RenderContext
from ezdxf.addons.drawing.svg import SVGBackend
DOC = ezdxf.readfile("drawing.dxf")
MSP = DOC.modelspace()
backend = SVGBackend()
Frontend(RenderContext(DOC), backend).draw_layout(MSP, finalize=True)
with open("drawing.svg", "wt", encoding="utf-8") as f:
f.write(backend.get_string())
print("wrote drawing.svg")
SVGからPDFへ変換して配布する場合は、CairoSVGのようなツールを併用するとシンプルに自動化できます(要: pip install cairosvg)。
# svg_to_pdf.py
import cairosvg
cairosvg.svg2pdf(url="drawing.svg", write_to="drawing.pdf")
print("wrote drawing.pdf")
Node.js + dxf-writer:JSスタックでDXFを直書き
フロントエンドやNodeで完結させたい場合はdxf-writerが手軽です。社内WebツールからPOSTされた寸法で即座にDXFを返すといった用途に向きます。
// gen-dxf.mjs
import fs from 'node:fs'
import Drawing from 'dxf-writer'
try {
const d = new Drawing()
d.setUnits('Millimeters')
d.drawRect(0, 0, 297, 210)
d.addText('BRACKET-001', 5, 10, 195)
const out = d.toDxfString()
fs.writeFileSync('drawing-js.dxf', out)
console.log('wrote drawing-js.dxf')
} catch (e) {
console.error('error:', e)
process.exit(1)
}
FreeCAD(ヘッドレス)で3DからDXF投影とSTEP出力
パラメトリックな3D部品をFreeCADで生成し、2D投影をDXFに、同時にSTEPを出力します。GUI不要(ヘッドレス)のサーバ上で動作させ、派生サイズを量産できます。TechDrawはGUI依存が強いため、ここではDraftのShape2DViewを使います。
# fc_make_part.py (FreeCADCmdで実行)
import FreeCAD as App
import Part
import Draft
import importDXF
import ImportGui
import time, sys
try:
t0 = time.perf_counter()
doc = App.newDocument()
# 10x20x5の箱を作成
shape = Part.makeBox(10, 20, 5)
obj = doc.addObject("Part::Feature", "Box")
obj.Shape = shape
doc.recompute()
# STEP出力
ImportGui.export([obj], "box.step")
# Z方向投影を作りDXF出力
view = Draft.makeShape2DView(obj, App.Vector(0, 0, 1))
doc.recompute()
importDXF.export([view], "box.dxf")
print(f"done in {(time.perf_counter()-t0)*1000:.1f} ms")
except Exception as e:
print("error:", e)
sys.exit(1)
pythonocc-core:幾何カーネルでSTEPを厳密生成
OCC(Open Cascade)を直接扱うと厳密な曲面・エッジで中間フォーマットを出せます。CAMや他システム連携でSTEP品質を重視する場合に有効です⁹。
# occ_step.py
from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox
from OCC.Core.STEPControl import STEPControl_Writer, STEPControl_AsIs
from OCC.Core.Interface import Interface_Static_SetCVal
import time, sys
try:
t0 = time.perf_counter()
shape = BRepPrimAPI_MakeBox(10.0, 20.0, 5.0).Shape()
writer = STEPControl_Writer()
Interface_Static_SetCVal("write.step.schema", "AP214")
writer.Transfer(shape, STEPControl_AsIs)
status = writer.Write("box_occ.step")
if status != 1:
raise RuntimeError(f"write failed: status={status}")
print(f"wrote box_occ.step in {(time.perf_counter()-t0)*1000:.1f} ms")
except Exception as e:
print("error:", e)
sys.exit(1)
OpenSCAD:寸法パラメータで派生モデルを量産
式とモジュールで形状を定義するOpenSCADは、バリエーション展開が極めて容易です。CIからscadファイルに寸法を注入し、STLやSVGを出力する運用がシンプルに構築できます⁶。
// bracket.scad
$fn = 64;
module bracket(w=60, h=30, t=3, hole_d=6, holes=2) {
difference() {
cube([w, h, t], center=false);
for (i = [0:holes-1])
translate([10 + i*(w-20)/(holes-1), h/2, 0])
cylinder(h=t+1, d=hole_d, center=false);
}
}
bracket(w=80, h=40, t=4, hole_d=8, holes=3);
品質・互換性の見極めと簡易ベンチの考え方(DXF/DWG/STEP対応の落とし穴)
無料ツールでネックになりがちな論点は三つあります。まず線種・尺度・フォントなど表現系の互換性です。DXFはレイヤ名や線種名の持ち回りに癖があり、レビュー側CADのテンプレートと一致させる工夫が必要です⁵。次に投影品質で、FreeCADの形状→2D投影では微小エッジが間引かれるケースがあるため、モデル公差と投影方向を合わせた運用ルールを決めると差し戻しが減ります。最後にパフォーマンスで、100枚単位の量産ではI/Oとフォント解決がボトルネックになりやすいことを踏まえ、描画とI/Oを分離したバッチ構成にしてCPUキャッシュ効率を上げるのが効果的です。
一般的なCIランナー(8コア級)の簡易計測例では、ezdxfによるA4相当のDXF生成は1枚あたり数ミリ秒台、pythonocc-coreによる単純プリミティブのSTEP出力は数十ミリ秒、FreeCADの形状生成とDXF投影は数百ミリ秒の目安になることがあります。もちろん形状の複雑さやフォント、ディスクI/Oで大きく変わるため、自社テンプレートと代表的な部品でベースラインを取り、差分監視することが重要です。計測はtime.perf_counterで十分で、PRごとに前回値との差をログに残すだけでも退行が可視化されます。描画スタックをSVGに寄せるとレビューは軽くなりますが、最終納品がDWGなら最終変換の責務を商用環境に集約して整合性を確保すると良いでしょう⁴。
導入と運用:ガバナンス、教育、ROIの現実解(無料CADの社内展開)
無料CADの導入は、技術だけでなく運用の設計で成果が決まります。まずテンプレートと記号、レイヤ命名、尺度、図枠などの標準をリポジトリ化し、生成スクリプトから参照可能にします。次に変更管理では、寸法や派生数をコードで宣言し、図面そのものではなく寸法源データをレビュー対象にする文化を育てます。教育面は短時間でよく、FreeCADの基本操作とテンプレートの読み方、失敗しやすいエクスポート設定、そしてCIに流す前のローカル検証手順を半日で共有できれば実務は回り始めます。ガバナンスでは、オープンソースライセンスの台帳化、生成物の著作権取り扱い、商用CADへのハンドオーバー条件を明文化し、監査時に説明可能な状態を保ちます⁷。
ROIの考え方は単純です。例えばライトユーザー複数席分を無料系パイプラインに置き換え、最終レビューだけを少数の商用ライセンスで担保する構成を考えます。年間の座席費用が合計で数十万〜数百万円規模になりやすい環境では、スクリプト整備と教育に初期で数十時間を投じても、短期間で損益分岐を超える可能性があります(座席費用の相場感は主要ベンダーの公表価格例に基づく一般的な目安)¹²。さらに自動化により差し戻しが減るため、リードタイム短縮や再現性の向上が二次効果として効いてきます。最初の一歩は小さく、DXFのタイトルブロック自動差し替えや、穴ピッチのバリエーション自動生成といった領域から始めると、成功体験を積みながら段階的に拡張できます。社内ポータルにSVGプレビューを埋め込み、Pull RequestにPDFとSTEPを添付する運用にすれば、関係者のレビュー体験も大きく改善されます。
まとめ:無料を武器に、図面をコードにする(FreeCAD/ezdxfで自動化)
無料のCADツール群は、適材適所で組み合わせれば業務レベルの図面生成に十分耐えます。特に反復の多い部品図や派生モデルでは、図面を手作業で描くのではなく、寸法とテンプレートからコードで生成する発想に切り替えるだけで、工数も品質も同時に引き上がります。最終的な互換性確保や顧客への納品形態に商用ツールが必要な局面は残りますが、その範囲を明確に切り分けることで、全体コストは確実に下がります。あなたのチームで最初に自動化できる図面はどれでしょうか。まずは代表的な1枚を選び、今日示したスクリプトに自社の図枠と寸法を移植してみてください。数日後には、夜間に図面が量産され、朝のレビューから議論が始まる風景が当たり前になっているはずです。
参考文献
- Autodesk AutoCAD – サブスクリプションと価格(日本)
- BricsCAD – Pricing
- LibreCAD – Free Open Source 2D CAD
- FreeCAD Wiki – Import/Export Preferences
- Autodesk Help – Drawing Exchange Format (DXF)
- Machado A. et al. Parametric CAD modeling for open-source scientific hardware: Comparing OpenSCAD and FreeCAD. PLOS ONE. 2019. https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0225795
- FreeCAD Wiki – Licence/en
- ezdxf Documentation – Drawing Add-on (SVG backend)
- Open CASCADE – pythonOCC Project Page