付録
押出し(Extrude)の例¶
import Part
from FreeCAD import Base
# ドキュメントの作成
doc = App.newDocument()
# 線分の定義
edges = [Part.Edge(Base.Vector(0, 0, 0), Base.Vector(10, 0, 0)),
Part.Edge(Base.Vector(10, 0, 0), Base.Vector(10, 5, 0)),
Part.Edge(Base.Vector(10, 5, 0), Base.Vector(0, 5, 0)),
Part.Edge(Base.Vector(0, 5, 0), Base.Vector(0, 0, 0))]
# 線分から面の作成
face = Part.Face(edges)
# 面を3次元空間に投影して立体を作成
extrusion_vector = Base.Vector(0, 0, 10)
solid = face.extrude(extrusion_vector)
# ドキュメントに追加
doc.addObject("Part::Feature", "Solid").Shape = solid
# ビューの更新
Gui.updateGui()
このスクリプトは、FreeCADで断面形状を3次元空間に投影して立体を作成する方法を示している。extrudeメソッドを使用して、指定された方向に立体を押し出す。
ロフト(Loft)の例¶
ロフトは複数の断面形状を連続的に投影して立体を作成する。
import FreeCAD as App
import Part
from FreeCAD import Base
# ドキュメントの作成
doc = App.newDocument()
# 線分の定義
edges1 = [Part.Edge(Base.Vector(0, 0, 0), Base.Vector(10, 0, 0)),
Part.Edge(Base.Vector(10, 0, 0), Base.Vector(10, 5, 0)),
Part.Edge(Base.Vector(10, 5, 0), Base.Vector(0, 5, 0)),
Part.Edge(Base.Vector(0, 5, 0), Base.Vector(0, 0, 0))]
edges2 = [Part.Edge(Base.Vector(0, 0, 10), Base.Vector(10, 0, 10)),
Part.Edge(Base.Vector(10, 0, 10), Base.Vector(10, 5, 10)),
Part.Edge(Base.Vector(10, 5, 10), Base.Vector(0, 5, 10)),
Part.Edge(Base.Vector(0, 5, 10), Base.Vector(0, 0, 10))]
# 線分から面の作成
face1 = Part.Face(edges1)
face2 = Part.Face(edges2)
# ロフトを作成(第2引数に True を指定するとソリッドになります。シェルの場合は False または省略)
loft = Part.makeLoft([face1, face2], True)
# ドキュメントにシェイプを追加して画面に表示
feature = doc.addObject("Part::Feature", "Loft")
feature.Shape = loft
# ビューの更新
Gui.updateGui()
見た目全く形状の違うものをロフト(Loft)でつなげようとすると失敗する。
翼素の基本的な形状¶
翼素の基本的な形状は以下のようになる。この形状は流体解析や空力中心をもとめるために使用される。 理論的な形状であり、翼型データベースとあわせて理解する。
import numpy as np
import matplotlib.pyplot as plt
def airfoil(x, a=0.1):
# 余弦関数を用いてなめらかな翼型(厚み分布)を定義
y = a * (1 - np.cos(2 * np.pi * x)) / 2
return y
# 弦長に沿ったx座標の生成 (0 から 1 まで)
x = np.linspace(0, 1, 500)
y = airfoil(x)
# 上面・下面のプロット作成
plt.figure(figsize=(10, 4))
plt.plot(x, y, label="Upper Surface", color="blue")
plt.plot(x, -y, label="Lower Surface", color="red")
plt.title("Airfoil Profile (Basic Shape)")
plt.xlabel("x / c")
plt.ylabel("y / c")
plt.axhline(0, color='black', linewidth=0.8, linestyle='--')
plt.grid(True)
plt.axis('equal')
plt.legend()
plt.show()