© 2025 STUDIO TAMA

✅ Inputs
- `square_size`: float – 放射構造が収まる正方形のサイズ(中心を原点とする)
- `arc_angle_deg`: float – 各アークの曲げ角度(deg)
- `arc_count`: int – 放射状に配置するアークの数(奇数推奨)
- `z_offset`: float – 交互に Z 方向へ持ち上げる高さ(立体感の調整)✅ Outputs
- `results`: list of `Brep` – Loft でつながれたアーク面群✅ Code
import Rhino.Geometry as rg
import math
results = []
# 中心
center = rg.Point3d(0, 0, 0)
# 正方形(XY平面、中心原点)
half = square_size / 2
square_corners = [
rg.Point3d(-half, -half, 0),
rg.Point3d(half, -half, 0),
rg.Point3d(half, half, 0),
rg.Point3d(-half, half, 0),
rg.Point3d(-half, -half, 0)
]
square_crv = rg.Polyline(square_corners).ToNurbsCurve()
# Arcを構築
arcs = []
for i in range(arc_count):
angle_rad = i * (2 * math.pi / arc_count)
dir_vec = rg.Vector3d(math.cos(angle_rad), math.sin(angle_rad), 0)
ray_crv = rg.Line(center, dir_vec * 1000).ToNurbsCurve()
intersections = rg.Intersect.Intersection.CurveCurve(ray_crv, square_crv, 0.001, 0.001)
if intersections.Count == 0:
continue
end_pt = intersections[0].PointA
tangent = rg.Vector3d(
math.cos(angle_rad + math.radians(arc_angle_deg)),
math.sin(angle_rad + math.radians(arc_angle_deg)),
0
)
arc = rg.Arc(center, tangent, end_pt)
arcs.append(arc.ToNurbsCurve())
# Z方向交互オフセット
arcs_shifted = []
for i, arc in enumerate(arcs):
copy = arc.DuplicateCurve()
if i % 2 == 1:
copy.Transform(rg.Transform.Translation(0, 0, z_offset))
arcs_shifted.append(copy)
results = []
for i in range(len(arcs_shifted)):
crv_a = arcs_shifted[i]
crv_b = arcs_shifted[(i + 1) % len(arcs_shifted)]
loft = rg.Brep.CreateFromLoft([crv_a, crv_b], rg.Point3d.Unset, rg.Point3d.Unset, rg.LoftType.Normal, False)
if loft: results.append(loft[0])ライセンス・利用規約
| 項目 | 可否 | 説明 |
|---|---|---|
| 自身のプロジェクトへの組み込み | ○ | 個人・商用問わず、スクリプトや作品の一部として自由に使えます。 |
| コードの改変・学習利用 | ○ | 自身の学習や、目的に合わせたカスタマイズは大歓迎です。 |
| SNSへのシェア・紹介 | ○ | 作品の画像やURLのシェアは許可不要です。ぜひご紹介ください! |
| 再配布・転載 | × | コードやファイルを丸ごと自身のサイト等でコンテンツとして公開しないでください。 |
| 素材・プログラムとしての転売 | × | 本サイトの内容をそのまま、あるいは微調整のみで有料販売しないでください。 |
| 著作権表示・リンク | 任意 | 必須ではありませんが、引用元としてリンクを貼っていただけると励みになります。 |