if (app.documents.length == 0) app.documents.add();
var selectObj = app.activeDocument.selection;
var res = "dialog {¥
all: Group{¥
orientation: 'column', ¥
check: Checkbox {alignment: 'left', text: '&Inverse'}, ¥
radio : Panel{¥
orientation: 'row', ¥
topView: RadioButton { text: '&Top View' }, ¥
frontView: RadioButton { text: '&Front View' }, ¥
rightSideView: RadioButton { text: '&Right Side View' }¥
}, ¥
buttons: Group{¥
orientation: 'row', ¥
alignChildren: 'center', ¥
okBtn: Button { text: 'Transform', properties:{ name: 'ok' } }, ¥
cancelBtn: Button { text: 'Cancel', properties:{ name: 'cancel' } }¥
}¥
}¥
}";
MainProc(selectObj);
function MainProc(pis){
if (pis.length != 1) return false;
var main = new Window (res, "Isometric Projection" );
main.all.radio.topView.value = true;
var viewfrom = 0;
main.all.radio.topView.onClick = function () { viewfrom = 0; };
main.all.radio.frontView.onClick = function () { viewfrom = 1; };
main.all.radio.rightSideView.onClick = function () { viewfrom = 2; };
main.all.buttons.okBtn.onClick = function (){
switch(viewfrom){
case 0: Isome(pis[0],-45,0,main.all.check.value); break;
case 1: Isome(pis[0],45,-60,main.all.check.value); break;
case 2: Isome(pis[0],-45,60,main.all.check.value); break;
}
main.close();
};
main.show();
}//function MainProc(pis)
function Isome(pi,theta1,theta2,invflag){
var mat = app.getRotationMatrix(theta1);
mat = app.concatenateScaleMatrix(mat,100*Math.sqrt(1.5),100*Math.sqrt(0.5));
mat = app.concatenateRotationMatrix(mat,theta2);
if(invflag) mat = app.invertMatrix(mat);
pi.transform(mat,true,true,true,true,1);
}
パスを寸法線に書き換えるスクリプト @illustrator CS
var keta = 2;// 寸法表示での小数点以下の桁数
var scale = 1;//AI上での長さをL,真の寸法をlとして,scale = L/l
var fontname = "ArialMT"//[TextFont hoge] の"hoge"部分.
// フォントの名前を知りたい場合はテキストオブジェクトを1つ選択してこのスクリプトを実行.
var fontsize = 10;//フォントのサイズ
var linewidth = 0.3;//線の太さ[mm]
var arrowLength = 8;// 矢先の長さ[pt]
var arrowWidth = 1.5;// 矢先の太さ(の半分)[pt]
var offset = fontsize/3;//パスから寸法(テキスト)までの距離[pt]
var mm2pt = 72/25.4;
var pt2mm = 25.4/72;
var black = new RGBColor();
black.red = 0;
black.green = 0;
black.blue = 0;
var res = "dialog {\
edit: Group {\
orientation: 'row', \
s: StaticText { text:'Length[mm]:' }, \
e: EditText { characters: 15 } \
}, \
buttons: Group{\
orientation: 'row', \
okBtn: Button { text: 'OK', properties:{ name: 'ok' } }, \
cancelBtn: Button { text: 'Cancel', properties:{ name: 'cancel' } }\
}\
}";
if (app.documents.length == 0) app.documents.add();
var selectObj = app.activeDocument.selection;
var numofObj = selectObj.length;
mainProc();
function mainProc(){
if (numofObj == 1 && selectObj[0].typename == "TextFrame") {
//選択されたものが1つのテキストなら,そのテキストをフォント名に置換する.
selectObj[0].contents = selectObj[0].textSelection[0].textFont;
return;
}
if (numofObj == 0){
var myPrompt = new Window (res);
myPrompt.edit.e.text = "30";
myPrompt.edit.e.active = true;
myPrompt.buttons.okBtn.onClick = function () {
var len = myPrompt.edit.e.text;
if(!/^[0-9]+./.test(len)) return;
var pi = app.activeDocument.activeLayer.pathItems.add();
DrawLine(pi,[[0,0],[mm2pt * len * scale,0]],false);
pi.translate(activeDocument.width/2,activeDocument.height/2);
var gb = pi.geometricBounds;
dimension(pi,gb);
myPrompt.close();
}
myPrompt.show();
return;
}
if (selectObj[0].typename != "PathItem" || selectObj[0].pathPoints.length == 1) return;
var gb = selectObj[0].geometricBounds;//left, top, right, bottom
if (gb[1]-gb[3] != 0 && gb[2]-gb[0] != 0) Tilt(selectObj[0]) else dimension(selectObj[0],gb);
}
function Tilt(pi){
//指定した直線パスpiの始点に矢印を付ける.
var newGroup = app.activeDocument.activeLayer.groupItems.add();
var p = pi.pathPoints;
var pnum = p.length;
var phi = Math.atan2(p[1].anchor[1]-p[0].anchor[1],p[1].anchor[0]-p[0].anchor[0]);
var theta = Math.atan2(arrowWidth,arrowLength);
var ell = Math.sqrt(arrowWidth*arrowWidth+arrowLength*arrowLength);
var passData = [];
passData[0] = [p[0].anchor[0]+ell*Math.cos(phi+theta),p[0].anchor[1]+ell*Math.sin(phi+theta)];
passData[1] = p[0].anchor;
passData[2] = [p[0].anchor[0]+ell*Math.cos(phi-theta),p[0].anchor[1]+ell*Math.sin(phi-theta)];
var npi = newGroup.pathItems.add();
DrawLine(npi,passData,true);
passData = [];
for(var i=0;i
DrawLine(npi,passData,false);
pi.remove();
}
function dimension(pi,gbP){
// 直線パスpiを,寸法が記入された寸法線に書き換える.
// gbP=pi.geometricBounds
var newGroup = app.activeDocument.activeLayer.groupItems.add();
var len = makeDimensionLine(newGroup,pi);
var textObj = newGroup.textFrames.add();
textObj.contents = len;
textObj.textRange.characterAttributes.size = fontsize;
textObj.textRange.characterAttributes.textFont = textFonts.getByName(fontname);
var newText = textObj.duplicate().createOutline();
var npi = newGroup.pathItems.add();
var gbT = newText.geometricBounds;
newText.remove();
if(gbP[1]-gbP[3] == 0){
x = (gbP[0]+gbP[2])/2 - textObj.width/2 - (textObj.width-(gbT[2]-gbT[0]))/2;
y = (gbP[1]+gbP[3])/2 + offset;
textObj.translate(x,y);
} else {
x = (gbP[0]+gbP[2])/2 - textObj.width/2 - (textObj.width-(gbT[2]-gbT[0]))/2 - (gbT[1]-gbT[3])/2 - offset;
y = (gbP[1]+gbP[3])/2 - (gbT[1]-gbT[3])/2;
textObj.translate(x,y);
textObj.rotate(90);
}
}
function makeDimensionLine(gi,pi){
// piの両端を矢印にした上で,pi.length を指定桁数で丸めた値を返す.
// pi にはパス,gi にはグループを指定.
var p = pi.pathPoints;
var len = pi.length;
var end = p.length-1;
var phi = Math.atan2(p[1].anchor[1]-p[0].anchor[1],p[1].anchor[0]-p[0].anchor[0]);
var theta = Math.atan2(arrowWidth,arrowLength);
var ell = Math.sqrt(arrowWidth*arrowWidth+arrowLength*arrowLength);
var angle1 = phi+theta;
var angle2 = phi-theta;
var passData = [];
passData[0] = [p[0].anchor[0]+ell*Math.cos(angle1),p[0].anchor[1]+ell*Math.sin(angle1)];
passData[1] = p[0].anchor;
passData[2] = [p[0].anchor[0]+ell*Math.cos(angle2),p[0].anchor[1]+ell*Math.sin(angle2)];
var npi = gi.pathItems.add();
DrawLine(npi,passData,true);
passData[0] = [p[end].anchor[0]+ell*Math.cos(angle1+Math.PI),p[end].anchor[1]+ell*Math.sin(angle1+Math.PI)];
passData[1] = p[end].anchor;
passData[2] = [p[end].anchor[0]+ell*Math.cos(angle2+Math.PI),p[end].anchor[1]+ell*Math.sin(angle2+Math.PI)];
npi = gi.pathItems.add();
DrawLine(npi,passData,true);
npi = gi.pathItems.add();
DrawLine(npi,[p[0].anchor,p[end].anchor],false);
pi.remove();
return makeTxt(len,keta);
}
function makeTxt(num,d){
// num[pt] をmm単位に直し,
//小数点以下の桁数が指定桁数dになるように四捨五入した数字を文字列として返す.
var ref = pt2mm/scale*num;
var len = Math.round(ref*Math.pow(10,d))/Math.pow(10,d);
if(Math.abs(len-ref)>0.001) alert(ref+" \nが\n"+len+"\nに丸められました.");
var n = len.toString();
if (n.indexOf(".")==-1){
var m = [];
m[0] = n;
m[1] = "";
for (var i = 0; i < d; i++) m[1] += "0";
if (d==0) return m[0] else return m[0] + "." + m[1];
} else {
var m = n.split(".");
for (i = 0; i < d - m[1].length; i++) m[1] += "0";
return m[0] + "." + m[1];
}
}
function DrawLine(pi,passdata,fillflag){
pi.setEntirePath(passdata);
pi.fillColor = black;
pi.filled = fillflag;
pi.stroked = true;
pi.strokeColor = black;
pi.strokeWidth = mm2pt * linewidth;
pi.strokeJoin = StrokeJoin.BEVELENDJOIN;
pi.strokeDashes = [];
}
画像差し替えごっこai

0 件のコメント:
コメントを投稿