サンプルコード

【サンプルコード】200個の円を一瞬で作成する!【AutoLISP】

many-circle

今回はサンプルコードを紹介します。

はこ

動作の結果はこんな感じです。

動作結果

簡単に言うと200個の円を一瞬で作図できるコードです。

しかも、1個ずつ色を変え、画層も作成してくれます。

ぶっちゃけ実用性は皆無ですが、このコードからは次のことが学べます。

  • 図形と画層を同時に作成する方法
  • 図形の色の変え方
  • 格子状に配置する座標の計算方法

動作を一つずつ分かりやすく説明していきますので、独自コマンド作成の参考にしていただけると幸いです。

【サンプルコード】200個の円を一瞬で作成する!【AutoLISP】

サンプルコード

最初に説明した動作結果のコードは次の通りです。

コードを使用される場合は自己責任でお願いします。不具合が起きないように空のファイルで実行することをおすすめします。

(defun c:test
  (
    / 
  ;ローカル変数定義
    row column xpitch ypitch n xpt ypt center ent
  )

 ;初期値
  (setq row 10)
  (setq column 20)
  (setq xpitch 2)
  (setq ypitch 2)
  (setq n 0)

 ;ループ
  (repeat (* row column)

  ;中心座標の算出
    (setq xpt (* (rem n column) xpitch))
    (setq ypt (* (fix (/ n column)) ypitch))
    (setq center (list xpt ypt))

  ;円と画層の作成
    (setq ent (list (cons 0 "circle") (cons 10 center) (cons 40 0.5) 
                    (cons 8 (itoa (1+ n))) (cons 62 n)))
    (entmake ent)

  ;ループカウントをカウントアップ
    (setq n (1+ n))
  )
)

動作内容を簡単に説明するとこんな感じです。

  • 格子の行数と列数、それぞれのピッチを定義
  • 作成する円の中心を算出
  • 図形データを定義して、円と画層を作成
  • 2と3を行数x列数(今回は200回)繰り返す
はこ

それでは解説をしていきます。

コードの解説

まずはじめに、このコードの関数名と変数定義について説明します。

ローカル変数定義

(defun c:test
  (
    / 
  ;ローカル変数定義
    row column xpitch ypitch n xpt ypt center ent
  )
  ;省略
)

関数名は「test」です。先頭に「c:」を付けていますのでそのままコマンドラインに「test」と入力するだけで実行できます。

今回使用する変数はすべて「/」のあとに記述していますので、ローカル変数となります。それぞれの変数に格納される値を表にまとめます。

ローカル変数って何?という方はこちらの記事をご覧ください。
関連記事:AutoLISP初心者が最初に覚えるべき関数5種

変数格納されるデータ
row 格子の行数(Y方向)
column 格子の列数(X方向)
xpitch 格子配置するX方向のピッチ
ypitch 格子配置するY方向のピッチ
n ループのカウント
xpt 算出した円中心のX座標
ypt 算出した円中心のY座標
center 円の中心座標
ent 作成する円の図形データ

初期値の設定

次に、円を作成するループに入る前準備として必要な変数に値を格納します。

今回の例では行数10、列数20、X方向ピッチ2、Y方向ピッチ2としています。

(defun c:test
  (
    / 
  ;ローカル変数定義
    row column xpitch ypitch n xpt ypt center ent
  )

 ;初期値
  (setq row 10)
  (setq column 20)
  (setq xpitch 2)
  (setq ypitch 2)
  (setq n 0)

 ;省略
)

中心座標の算出

続いて、中心を算出して円を作成するループに入ります。

(defun c:test
  (
    / 
    row column xpitch ypitch n xpt ypt center ent
  )

  ;省略

 (setq n 0)

 ;ループ
  (repeat (* row column)

  ;中心座標の算出
    (setq xpt (* (rem n column) xpitch))
    (setq ypt (* (fix (/ n column)) ypitch))
    (setq center (list xpt ypt))

    ;省略

  ;ループカウントをカウントアップ
    (setq n (1+ n))
  )
)

X座標(xpt)はループカウントを列数で割った余りにX方向のピッチをかけて算出します。

Y座標(ypt)はループカウントを列数で割ったにY方向のピッチをかけて算出します。

そして、これらの数値をリストにしてcenterに格納しています。

ちなみにremは余りを返す関数で、fixは実数の小数点以下を切り捨てた整数を返す関数です。

円と画層の作成

ここからは円の図形データを定義して、円と画層を作成していきます。

(defun c:test
  (
    / 
  ;ローカル変数定義
    row column xpitch ypitch n xpt ypt center ent
  )

 ;省略

 ;ループ
  (repeat (* row column)

    ;省略

  ;円と画層の作成
    (setq ent (list (cons 0 "circle") (cons 10 center) (cons 40 0.5) 
                    (cons 8 (itoa (1+ n))) (cons 62 n)))
    (entmake ent)

  ;ループカウントをカウントアップ
    (setq n (1+ n))
  )
)

各グループコードに対応した情報を以下の表にまとめます。

グループコードグループコードの意味定義するデータ
0図形タイプ"circle"
10座標算出した中心座標
40半径0.5
8画層文字列化したループカウント数
62色番号ループカウント数

表の内容で図形データを定義し、entmakeを実行しています。

図形データとentmakeについてはこちらの記事が参考になります。
関連記事:【AutoLISP】図形データ関数の使い方【entget / entsel】

整数を文字列化する関数itoaについてはこちらの記事をご覧ください。
関連記事:【AutoLISP】文字列操作関数の使い方【substr・strcat】

この方法だと①円の作成、②画層の作成、③色の変更が同時にできます。

そして、ループカウントをカウントアップして次の円作成を行うようになっています。

まとめ

今回ご紹介したコードの動作をまとめます。

  1. 初期値の設定
    ⇒行数、列数、X方向ピッチ、Y方向ピッチに数値を代入
  2. 円の中心座標を算出
    ⇒格子配置の座標を行列数とピッチから算出
  3. 円の図形データを定義して円と画層を作成
    ⇒図形種、画層、半径、中心、色番号を定義し、entmakeを実行する
  4. 2と3を繰り返す
    ⇒行数 x 列数の数だけ繰り返す

-サンプルコード

独学おすすめ書籍はコチラ
独学おすすめ書籍はコチラ