Last active
June 2, 2016 20:49
-
-
Save shspage/0c9b5b83d48670802661d98a9a55a112 to your computer and use it in GitHub Desktop.
Adobe Illustrator script that draws Delaunay diagrams - example (commented in Japanese)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//@include "~/ailib/delaunay.js" | |
// Adobe Illustrator script | |
// 選択範囲中のパスの中心の座標を元にドロネー図を描画します。 | |
// 線は描かず、三角形の面のみを作成します。 | |
// 描画した面はグループ化され、選択範囲中の最背面のオブジェクトの | |
// 背面に置かれます。 | |
// 選択範囲中に複数のパスから成るグループがあった場合、それぞれの | |
// パスの中心座標を使用します。 | |
// (元にしたパスはあとで削除しやすいようグループ化しているケース | |
// が多いことを想定した処理です。) | |
// テスト環境: Illustrator CS3 | |
// 作成: Hiroyuki Sato http://github.com/shspage | |
// ---- | |
// 'delaunay.js' (by ironwallaby) を include しています。 | |
// https://github.com/ironwallaby/delaunay | |
// ---- | |
(function(){ | |
// pageItem p の中心の座標 [x, y] を返します。 | |
var getCenter = function(p){ | |
var gb = p.geometricBounds; // left, top, right, bottom | |
return [(gb[0] + gb[2]) / 2, (gb[1] + gb[3]) / 2 ]; | |
} | |
// 10~90% gray の GrayColor を生成して返します。 | |
var getFillColor = function(){ | |
var col = new GrayColor(); | |
col.gray = Math.random() * 80 + 10; | |
return col; | |
} | |
// パスを生成して返します。 | |
var createAPath = function(){ | |
var p = app.activeDocument.activeLayer.pathItems.add(); | |
p.closed = true; | |
p.filled = true; | |
p.stroked = false; | |
//p.fillColor = getFillColor(); | |
return p; | |
} | |
// 実行できない状態の場合 true を返します。 | |
var isBadCondition = function(){ | |
if(app.documents.length < 1){ | |
return true; | |
} | |
var adoc = app.activeDocument; | |
if(adoc.activeLayer.locked){ | |
alert("アクティブレイヤーのロックを解除してください。"); | |
return true; | |
} | |
return false; | |
} | |
// オブジェクトの配列 sel から pathItem を抽出して | |
// 配列 paths に入れます。 | |
var getSelectedPaths = function(sel, paths){ | |
for(var i = 0, iEnd = sel.length; i < iEnd; i++){ | |
if(sel[i].typename == "PathItem"){ | |
paths.push(sel[i]); | |
} else if(sel[i].typename == "GroupItem"){ | |
getSelectedPaths(sel[i].pageItems, paths); | |
} else if(sel[i].typename == "CompoundPathItem"){ | |
getSelectedPaths(sel[i].pathItems, paths); | |
} | |
} | |
} | |
// 最背面のオブジェクトを返します。 | |
var getBackmostObject = function(sel){ | |
return sel[sel.length - 1]; | |
} | |
// メイン処理 | |
var main = function(){ | |
if(isBadCondition()) return; | |
var adoc = app.activeDocument; | |
var paths = []; | |
var sel = adoc.selection; | |
if(sel.length > 0){ | |
// あとで選択物の背面に描画するため、選択物中の最背面の物を取得。 | |
var backmost = getBackmostObject(sel); | |
getSelectedPaths(sel, paths); | |
} | |
if(paths.length < 3){ | |
alert("3つ以上のパスを選択してください。"); | |
return; | |
} | |
var vertices = []; | |
for(var i = 0, iEnd = paths.length; i < iEnd; i++){ | |
vertices.push(getCenter(paths[i])); | |
} | |
// 戻り値は vertices の index の配列です。 | |
// 3つずつ順に取り出して三角形の頂点として使います。 | |
var idxs = Delaunay.triangulate(vertices); | |
// アートボードへの描画 | |
// 描画した三角形はグループ化されています。 | |
var gr = adoc.activeLayer.groupItems.add(); | |
gr.move(backmost, ElementPlacement.PLACEAFTER); | |
var p = createAPath(); | |
p.move(gr, ElementPlacement.PLACEATEND); | |
for(var i = 0, iEnd = idxs.length; i < iEnd; i+=3){ | |
var triangle = p.duplicate(); | |
// 塗り色を設定 | |
triangle.fillColor = getFillColor(); | |
triangle.setEntirePath([vertices[idxs[i]], | |
vertices[idxs[i + 1]], | |
vertices[idxs[i + 2]]]); | |
} | |
p.remove(); | |
} | |
main(); | |
})(); | |
// 2016.06.03 - getBackmostObjectを変更 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment