・FreeCADで作図できました。未照査です。勉強中です。
(本日の)ChatGPT先生へ(1回目)
# 質問リスト
1. クレモナ図を出力できるソフト。フリー、オープン、有料プログラム名を教えて下さい。
2. FreeCADで。
3. 任意のトラスで。
4. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。最後の質問も追加して下さい。追番を追加して下さい。Markdown形式で。
(以下回答抜粋)
✅ スクリプト:構造とCremona図の出力(汎用)
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図スクリプト(修正版・汎用)
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()
Gemini先生へ
copilot先生へ
いつもの? sympyの実行環境と 参考のおすすめです。