材料力学「クレモナ図を出力できるソフト。フリー、オープン、有料プログラム名を教えて下さい。」をAI先生ヘ。  


・FreeCADで作図できました。未照査です。勉強中です。

# (本日の)ChatGPT先生へ(１回目)
```
# 質問リスト
1. クレモナ図を出力できるソフト。フリー、オープン、有料プログラム名を教えて下さい。
2. FreeCADで。
3. 任意のトラスで。
4. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。最後の質問も追加して下さい。追番を追加して下さい。Markdown形式で。
```
#### (以下回答抜粋)
>✅ スクリプト：構造とCremona図の出力（汎用）
```python
import FreeCAD as App
import Draft

doc = App.ActiveDocument if App.ActiveDocument else App.newDocument("Cremona")

# ユーザー定義：節点の位置（任意の2Dトラスに対応）
nodes = {
    'A': App.Vector(0, 0, 0),
    'B': App.Vector(1000, 0, 0),
    'C': App.Vector(2000, 0, 0),
    'D': App.Vector(500, 800, 0),
    'E': App.Vector(1500, 800, 0),
}

# ユーザー定義：部材（節点ペア）
members = [
    ('A', 'B'), ('B', 'C'),
    ('A', 'D'), ('B', 'D'), ('B', 'E'), ('C', 'E'),
    ('D', 'E'),
]

# 力（仮の方向を仮定）：構造解析ソフトの出力などに合わせて変更
# 各節点での力の順に並べる（例：support反力、部材力など）
cremona_vectors = {
    'A': [App.Vector(0, 300, 0), App.Vector(500, 400, 0), App.Vector(-500, -700, 0)],
    'B': [App.Vector(-500, 400, 0), App.Vector(500, 400, 0), App.Vector(0, -800, 0)],
    'C': [App.Vector(0, 800, 0), App.Vector(-500, -400, 0), App.Vector(500, -400, 0)],
    # 他の節点も必要に応じて定義
}

# --- 構造図の作成 ---
for name, pos in nodes.items():
    Draft.make_point(pos)
    Draft.make_text([name], point=pos.add(App.Vector(-100, -100, 0)))

for n1, n2 in members:
    Draft.make_wire([nodes[n1], nodes[n2]], closed=False)

# --- Cremona図の作成 ---
offset = App.Vector(3000, 0, 0)  # 構造図との距離
cremona_origin = offset

for joint, vecs in cremona_vectors.items():
    pts = [cremona_origin]
    for v in vecs:
        pts.append(pts[-1].add(v))  # 連続ベクトル
    for i in range(len(pts) - 1):
        Draft.make_wire([pts[i], pts[i+1]], closed=False)
    # 線を閉じる
    Draft.make_wire([pts[-1], pts[0]], closed=False)
    Draft.make_text([joint], point=pts[0].add(App.Vector(10, 10, 0)))
    cremona_origin = cremona_origin.add(App.Vector(0, -1000, 0))  # 節点ごとに下にずらす

doc.recompute()
```
# (本日の)ChatGPT先生へ(2回目)
>✅ FreeCAD Cremona図スクリプト（修正版・汎用）
```python
import FreeCAD as App
import Draft

doc = App.ActiveDocument if App.ActiveDocument else App.newDocument("Cremona")

# ユーザー定義：節点の位置（任意の2Dトラスに対応）
nodes = {
    'A': App.Vector(0, 0, 0),
    'B': App.Vector(1000, 0, 0),
    'C': App.Vector(2000, 0, 0),
    'D': App.Vector(500, 800, 0),
    'E': App.Vector(1500, 800, 0),
}

# ユーザー定義：部材（節点ペア）
members = [
    ('A', 'B'), ('B', 'C'),
    ('A', 'D'), ('B', 'D'), ('B', 'E'), ('C', 'E'),
    ('D', 'E'),
]

# 力（仮定の釣り合い図用ベクトル）：各節点にベクトルを順に与える
cremona_vectors = {
    'A': [App.Vector(0, 300, 0), App.Vector(500, 400, 0), App.Vector(-500, -700, 0)],
    'B': [App.Vector(-500, 400, 0), App.Vector(500, 400, 0), App.Vector(0, -800, 0)],
    'C': [App.Vector(0, 800, 0), App.Vector(-500, -400, 0), App.Vector(500, -400, 0)],
    # 必要に応じてDやEも追加
}

# --- 構造図の作成 ---
for name, pos in nodes.items():
    Draft.make_point(pos)
    Draft.make_text([name], [pos.add(App.Vector(-100, -100, 0))])

for n1, n2 in members:
    Draft.make_wire([nodes[n1], nodes[n2]], closed=False)

# --- Cremona図の作成 ---
offset = App.Vector(3000, 0, 0)  # 構造図との距離
cremona_origin = offset

for joint, vecs in cremona_vectors.items():
    pts = [cremona_origin]
    for v in vecs:
        pts.append(pts[-1].add(v))  # ベクトル加算で連続点を得る
    for i in range(len(pts) - 1):
        Draft.make_wire([pts[i], pts[i+1]], closed=False)
    Draft.make_wire([pts[-1], pts[0]], closed=False)  # 閉ループ
    Draft.make_text([joint], [pts[0].add(App.Vector(10, 10, 0))])
    cremona_origin = cremona_origin.add(App.Vector(0, -1000, 0))  # 次の節点図を下に配置

doc.recompute()
```

![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/43ab08ac-1116-4d5a-8544-94f609aa70d6.png)

# Gemini先生へ

# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0

# いつもと違うおすすめです。
#### Qiita内