HN 日本語サマリー

← 一覧へ戻る
プログラミング

Antimony: CAD Software Evolved from Lisp Machines and Not Drafting Tables

Antimony: CAD Software Evolved from Lisp Machines and Not Drafting Tables (mattkeeter.com)

36 pointsby pmkary9 コメント

要約

Antimonyは、CAD(コンピュータ支援設計)ソフトウェアが製図台からではなくLispマシンから進化した、並列宇宙からのツールです。これは、情報フローを追跡する有向非巡回グラフ(DAG)のフレームワーク、CSG(Constructive Solid Geometry)のためのジオメトリエンジン、そして形状と変換の標準ライブラリに基づいています。Pythonスクリプトでノードを定義し、それらを繋げて複雑な3Dモデルを作成できます。

全文翻訳

Matt Keeter // Antimony

について

Antimonyは、CAD(コンピュータ支援設計)ツールであり、CADソフトウェアが製図台からではなくLispマシンから進化した並列宇宙からのものです。

デモ

基盤

Antimonyは、主に直交する3つの軸に基づいています。

  • 有向非巡回グラフ(DAG)を通じた情報フローを追跡するためのフレームワーク
  • CSG(Constructive Solid Geometry)を行うためのジオメトリエンジン
  • 形状と変換の標準ライブラリ
グラフエンジン

Antimonyでのソリッドモデリングは、グラフ内のノードを接続することによって行われます。
[画像: Graph example]

各ノードはカスタマイズ可能なスクリプトによって定義されます。AntimonyはPython 3.xにいくつかの追加の魔法のキーワードを使用します。

上記の円ノードは次のようになります。

import fab.shapes

# 入力ポートのセットを定義
# (ローカル名前空間に変数を注入する)
input('x', float)
input('y', float)
input('r', float)

# 入力ポートから来た変数を使用して、
# 標準シェイプライブラリの 'circle' 関数を呼び出す
c = fab.shapes.circle(x, y, r)

# 円の形状を生成する出力ポートを作成
output('shape', c)

ノードは通常、プリミティブな形状または変換を表します。リンクは追跡され、変更は自動的に下流に伝播されます。

[画像: Change propagation]

グラフエンジンは、複雑なマルチパートアセンブリまでスケールアップします。

[画像: Kelvin]

[画像: Kelvin]

ジオメトリエンジン

Antimonyのジオメトリエンジンは、ソリッドモデリングのために関数表現を使用します。この表現は、ブール演算(和集合/積集合/差集合)を用いたモデリングに特に適しています。

[画像: Boolean example]

アプリケーションでは、ジオメトリエンジンは形状をシェーディングされたビットマップとしてレンダリングします。その後、それらは3Dビューポートにブリットされます。

[画像: Application screenshot]

Antimonyは、2.5Dプロセス用のハイトマップと、3D製造用の.stlファイルをエクスポートできます。.stlエクスポートには、コーナーとエッジをシャープに保つためのフィーチャー検出が含まれています。

[画像: Mesh]

標準ライブラリ

Antimonyの標準ライブラリは、多くの形状と変換を定義しています。基本的なもの(回転、スケール、ブール演算)から珍しいもの(引き付け、反発、曲げ)まであります。

これらの形状はノード定義で使用され、通常は入力ポートと出力ポートを追加し、オプションでUI機能を定義できます。

UI機能を定義するノードの例を次に示します。

import fab

title('Rectangle')

input('xmin', float)
input('ymin', float)
input('xmax', float, 1)
input('ymax', float, 1)

output('shape', fab.shapes.rectangle(xmin, xmax, ymin, ymax))

# UI
sb.ui.wireframe([(xmin, ymin, 0), (xmax, ymin, 0),
                 (xmax, ymax, 0), (xmin, ymax, 0)], close=True)
sb.ui.point(xmin, ymin, 0)
sb.ui.point(xmax, ymax, 0)

3Dビューポートでは、スクリプトの下部で定義されたUI機能が、長方形のレンダリングの上に描画されます。

これらのUI機能はグラフにフックバックされます。長方形のコーナーの点をドラッグすると、グラフノードに変更がプッシュされます。

[画像: UI dragging]

余談ですが、ほとんどのユーザーは組み込みの形状で満足しますが、カスタム形状を定義することも可能です。

形状は、解析しやすいが解読するには少し難解なプレフィックス文字列構文で表されます。上記の円形状の定義は次のとおりです。

def circle(x0, y0, r):
    return Shape(
            '-r+q-Xf%gq-Yf%gf%g' % (x0, y0, r), # math string
            x0 - r, y0 - r, x0 + r, y0 + r)     # bounds

プレフィックス文字列を解凍して階層的にインデントすると、次のようになります。

-
  r
    +
      q
        -
          X
          f%g
      q
        -
          Y
          f%g
  f%g
% (x, y, r)

これは2D円の距離場表現をエンコードしています。

f(x,y) = sqrt(pow(x - x0, 2) + pow(y - y0, 2)) - r

ここで、x0、y0、rは円の中心と半径です(circleが呼び出されたときに指定されます)。

プレフィックス文字列からインフィックス関数への正確なマッピングは、読者への演習として残されています(または私の論文の付録Aで確認できます)。

ダウンロード

Mac用のプリビルドアプリケーションは、Githubのリリースページからダウンロードできます。

AntimonyのソースはGithubで入手可能であり、MacおよびLinuxでのビルド方法に関する指示も含まれています。

開発

Antimonyは、アクティブな開発中の長期プロジェクトです。

[画像: Development]

ベータレベルの安定性です。堅牢ですが、ミッションクリティカルな用途には推奨されません。

貢献に興味がある場合、参入障壁はかなり低いです。基本的なPythonの知識があれば、カスタムノードの作成から始めることができます(HSBカラーノードのような、RobotGrrlが寄稿したものや、Neilが寄稿した多数のノードなど)。

C++の経験を持つより野心的な方のために、レンダリングの高速化からUIのクリーンアップ、グラフ評価の最適化まで、さまざまな改善が可能です。これが興味を引くなら、私に連絡してください。

歴史

Antimonyは、MIT Center for Bits and Atomsでの強力なパーソナルスケールのCAD/CAMワークフローに関する私の仕事から生まれました。

これは、cad_uiとkokopelliを含む一連のソフトウェアの最新ツールであり、fabserverからインスピレーションを得ています。

歴史的な視点として、初期のAntimonyに関するいくつかの記事があります。

  • 2014年初頭(世界経済フォーラムのデモとして開発)
  • 2014年秋(How to Make Almost Anythingでの使用に合わせて更新)

この更新は、Fab Academyの2015年版と一致します。人々がどのようにそれを使用しているかを見るには、この検索クエリを使用してください。

プレス&ディスカッション