レイアウトのインスタンスを市松模様に配置するスクリプトです。配置は X 方向を優先に行います。
; ----------------------------------------------------------------------------- ; (jp_wikiwiki_aiou_layoutInstancesXIchimatsu instances columns basePoint pitches startsByCorner) ; ----------------------------------------------------------------------------- ; 与えられたインスタンス列 instances の要素を市松模様に配置する。 ; 配置の順番は「Z」の字の筆順の Y 方向を反転したもの。 ; ※ インスタンスの向き(R0、MY 等)は変更しない。 ; instances : 配置させたいインスタンス群 ; columns : 市松模様の仮想格子の列数。 ; basePoint : 市松模様の仮想格子の基準点。 ; pitches : 市松模様の仮想格子の1列の幅、1行の高さを要素とするリスト。要素は負数でも良い。 ; startsByCorner : 開始点を格子の角とする場合は t、その右隣(左隣)の位置とする場合は nil。 ; ; 《例1》 (1.5, 3.75) の位置を基準に X方向ピッチ 13.5、Y方向ピッチ 7.25、 ; 列数 6 の格子に、角を開始点として 8 個のインスタンスを配置する。 ; ; (setq instances (list ~8個のインスタンス~)) ; (jp_wikiwiki_aiou_layoutInstancesXIchimatsu instances 6 '(1.5 3.75) '(13.5 7.25) nil) ; ; |6|-|7|-|-|-| ; |-|3|-|4|-|5| ; |0|-|1|-|2|-| ; ; ※「0」の位置が (1.5, 3.75) である。 ; ; 《例2》 例1と同様だが、角の右隣を開始点とする。 ; ; (jp_wikiwiki_aiou_layoutInstancesXIchimatsu instances 6 '(1.5 3.75) '(13.5 7.25) t) ; ; |-|6|-|7|-|-| ; |5|-|3|-|4|-| ; |-|0|-|1|-|2| ; ; ※「0」の位置が (1.5+13.5, 3.75) である。 ; ; 《例3》 例1と同様だが、Y方向ピッチを -7.25 とする。 ; ; (jp_wikiwiki_aiou_layoutInstancesXIchimatsu instances 6 '(1.5 3.75) '(13.5 -7.25) nil) ; ; |0|-|1|-|2|-| ; |-|3|-|4|-|5| ; |6|-|7|-|-|-| ; ; ※「0」の位置が (1.5, 3.75) である。 ; -----------------------------------------------------------------------------
(define (jp_wikiwiki_aiou_layoutInstancesXIchimatsu instances columns basePoint pitches startsByCorner) (setq instances (setof o instances (equal "inst" o~>objType))) (mapcar (lambda (i p) (i~>xy = (mapcar 'plus basePoint (mapcar 'times pitches p)))) instances (Points_generateUnitXIchimatsu columns (length instances) startsByCorner) ) )
; ----------------------------------------------------------------------------- ; (Points_generateUnitXIchimatsu columns points_length startsByCorner) ; ----------------------------------------------------------------------------- ; 仮想格子幅・高さが 1 の 市松模様 点列 を生成する汎用の関数。 ; 点の順番は「Z」字の筆順の Y 方向反転。 ; columns : 市松模様の仮想格子の列数。 ; points_length : 生成する点の個数。 ; startsByCorner : 開始点を角にする場合は t、その右隣(左隣)にする場合は nil。 ; ----------------------------------------------------------------------------- (define (Points_generateUnitXIchimatsu columns points_length startsByCorner) (let ( (offset (if startsByCorner 0 1)) (buffer nil) ) (if (evenp columns) (let ((halfColumns (xquotient columns 2))) (for n 0 (sub1 points_length) (letseq ( (y (xquotient n halfColumns)) (x (xplus (modulo (xtimes 2 n) columns) (modulo (xplus y offset) 2))) ) (setq buffer (cons (list x y) buffer)) ) ) ) ; else (for n 0 (sub1 points_length) (letseq ( (_2n_plus_offset (plus (xtimes 2 n) offset)) (x (modulo _2n_plus_offset columns)) (y (xquotient _2n_plus_offset columns)) ) (setq buffer (cons (list x y) buffer)) ) ) ) (reverse buffer) ) )