LINEでAutoCAD自動モデリング
はい、LINEでも可能です。仕組みは「LINEの受信メッセージ → Webhook(自作Bot)→ MCPサーバ → AutoCAD」です。ChatGPT経由と同じ“描画ツール”を呼ぶだけなので、構成を1つ足すだけで実現できます。
# 全体構成
- **PC**:AutoCAD+あなたの**MCPサーバ**(前回の`draw_circle`等ツール)
- **中継**:LINE **Messaging API Bot**(Webhookサーバ)
- **ユーザー**:あなたのLINEアプリから「半径100で中心(100,100)の円」等と送信
> 受け取ったテキストをWebhookで受信 → パースして `{tool:"draw_circle", cx, cy, r}` を組み立て → MCPへHTTP/JSONで転送 → AutoCADで作図。
---
# 手順(最短ルート)
## 1) LINE Botの用意
1. LINE Developersで**Messaging API**チャンネル作成
2. **Channel secret / Access token** を控える
3. Webhook URLを設定(後述のFlaskサーバURL)&有効化
- 開発中は **ngrok/Cloudflare Tunnel** で一時公開が簡単
## 2) Webhookサーバ(Python + Flask例)
- 受信した日本語コマンドを**簡易パーサ**で数値化し、**MCP HTTPプロキシ**(先の`mcp_http_proxy.py`)へPOSTします。
```python
# line_bridge.py
import os, re, requests
from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
# LINEの資格情報
CHANNEL_SECRET = os.getenv("LINE_CHANNEL_SECRET")
CHANNEL_TOKEN = os.getenv("LINE_CHANNEL_TOKEN")
# MCP HTTPプロキシのエンドポイント(例:ローカルAutoCADブリッジ)
MCP_ENDPOINT = "http://127.0.0.1:8888/"
app = Flask(__name__)
line_bot_api = LineBotApi(CHANNEL_TOKEN)
handler = WebhookHandler(CHANNEL_SECRET)
# --- 超簡易パーサ:円コマンドを拾う ---
CIRCLE_PAT = re.compile(
r"(円|circle).*(半径|r)\s*(?P<r>[-+]?\d+(\.\d+)?)"
r".*(中心|center).*\(?\s*x\s*=\s*(?P<cx>[-+]?\d+(\.\d+)?)\s*,\s*y\s*=\s*(?P<cy>[-+]?\d+(\.\d+)?)\s*\)?",
re.I
)
@app.route("/callback", methods=['POST'])
def callback():
sig = request.headers.get('X-Line-Signature', '')
body = request.get_data(as_text=True)
try:
handler.handle(body, sig)
except InvalidSignatureError:
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def on_message(event: MessageEvent):
text = event.message.text.strip()
# 1) 円コマンドを検出
m = CIRCLE_PAT.search(text.replace(" "," "))
if m:
r = float(m.group("r"))
cx = float(m.group("cx"))
cy = float(m.group("cy"))
# 2) MCPへ投げる
try:
res = requests.post(MCP_ENDPOINT, json={
"tool":"draw_circle", "cx":cx, "cy":cy, "r":r
}, timeout=5)
ok = res.status_code == 200 and res.json().get("ok")
if ok:
msg = f"AutoCADに円を作図:中心({cx}, {cy}) 半径{r}"
else:
msg = f"作図エラー: {res.text[:120]}"
except Exception as e:
msg = f"接続エラー: {e}"
line_bot_api.reply_message(event.reply_token, TextSendMessage(text=msg))
return
# 他の形状コマンドのヒント
help_msg = ("使い方例:\n"
"・半径100で中心(x=100,y=100)の円\n"
"・始点(0,0) 終点(200,0)の線\n")
line_bot_api.reply_message(event.reply_token, TextSendMessage(text=help_msg))
if __name__ == "__main__":
# 例:python line_bridge.py(本番はgunicorn等推奨)
app.run(host="0.0.0.0", port=8000)
```
> Webhook URL例:`https://<あなたの公開ドメイン>/callback`
> ngrok使用例:`ngrok http 8000` → 得たURLをLINE DevelopersのWebhookに設定。
## 3) MCP側(前回の**C#アドイン+HTTP**または**Python COM直叩き**)
- すでに前回お渡ししたどちらかを起動しておきます。
- 上のFlaskは `{"tool":"draw_circle", ...}` を **`http://127.0.0.1:8888/`** へ投げます(C#アドイン例だとそのまま動きます)。
---
# すぐ試せる“日本語入力テスト”
- LINEでBot宛てに:
「**半径100で中心(x=100,y=100)の円を描いて**」
- 成功レス:
「AutoCADに円を作図:中心(100.0, 100.0) 半径100.0」
- AutoCADモデル空間に円ができていればOK。
---
# 精度アップの実践ポイント
- **正規表現の拡張**:
- 全角/半角、順序の揺れ:「中心100,100で半径100の円」「r=100 center(100,100)」も拾う
- 単位(mm/m/インチ)を許容し、内部は図面単位(WCS)に変換
- **コマンド辞書化**:
- `draw_line(x1,y1,x2,y2)`, `draw_arc(...)`, `extrude(...)`, `insert_block(...)`, `set_layer(name)` などをツール化
- **エラー返し**:
- 不正値(半径≤0)、図面ロック時、AutoCAD未起動等に対し、LINEへ具体的な原因メッセージ
- **認証**:
- Webhook自体はLINE署名で保護、**MCPへのPOSTはローカル限定**or **トークン必須**にする
- **同時実行**:
- キュー化 or 排他制御(特にAutoCAD COMはシングルスレッド推奨)
---
# 運用形態の選択肢
- **開発用**:`LINE → ngrok → Flask(Webhook) → MCP(ローカル) → AutoCAD`
- **本番**:`LINE → Cloud Run/Functions/ECS(HTTPS) → VPN/ゼロトラ→ 社内PCのMCP → AutoCAD`
- 会社PCの場合はEDR/Firewallポリシーに合わせて**アウトバウンドのみ**で到達できるようトンネル方式が安全
---
# ChatGPT連携も併用するなら
- LINEメッセージをそのまま**ChatGPTに投げてコマンド抽出**→ MCPへ、という構成も可能です(自然言語の揺れに強い)。
- ただし**同期レスポンス時間**と**コスト**を考慮。定型コマンドは正規表現で直叩き、複雑な依頼のみChatGPTで**構文化(ツール呼び出し)**が実務的です。
---
必要であれば、**線/円弧/矩形/押し出し/ブロック挿入/寸法**まで含めたコマンド一式、そして**LINEのクイックリプライ(候補ボタン)**や**リッチメニュー**付きの完成版サンプル(Flask or FastAPI)をまとめてお渡しできます。
コメント
コメントを投稿