PhotoshopでUIBezierPath(2018/03/02版)

PhotoshopでUIBezierPathで作った時とSwiftの仕様がまた変わっているようなので新しいものをば。

多分今はSwift3.0? 新しいものがどんどん出てくるのでついていくのがちょっときついですね…^^;



とりあえずSwift3.0用に書き直してみました

それと、いまたまたま気づいたんですがPhothoshopの環境設定で「定規」の単位をpixelにしてないとうまく動きませんね…

何か回避する方法はあるのかしらん…

// Only run if we're in a supported version of Photoshop

// Note, removing this will not make the script work, as it depends on

// core application code, it just makes it fail better.

if (!app.featureEnabled("ImageStack Creation")) {

throw (new Error(localize("$$$/JavaScripts/Statistics/CommandNotAvailable=The Statistics feature is not available in this version of Photoshop.")));

}

try{

makePath();

}catch(err){

alert(err);

}

function makePath(){

// preferences.rulerUnits = Units.PIXELS;

height = activeDocument.height.value

width = activeDocument.width.value

var str="//let height : CGFloat = "+String(height)+";\n";

str += "//let width : CGFloat = "+String(width)+";\n";

if(activeDocument.pathItems.length == 0){

throw "パスを選択してください。";

}

for(var i=0; i<activeDocument.pathItems.length; i+=1){

var activePath = activeDocument.pathItems[i];

str += "let "+activePath.name+" : UIBezierPath = UIBezierPath();\n";

for(var j=0; j<activePath.subPathItems.length; j+=1){

for(var k=0; k<activePath.subPathItems[j].pathPoints.length; k+=1){

var activePathPoints = activePath.subPathItems[j].pathPoints;

if(k==0){

str += activePath.name+".move(to: CGPoint(x: "+String(activePathPoints[k].anchor[0])+", y: "+String( activePathPoints[k].anchor[1])+"));\r\n";

// str += activePath.name+".move(to: CGPoint(x: "+String(activePathPoints[k].anchor[0])+", y: "+String(height- activePathPoints[k].anchor[1])+"));\r\n";

}else{

str += activePath.name+".addCurve(to: CGPoint(x: "+String(activePathPoints[k].anchor[0])+", y: "+String(activePathPoints[k].anchor[1])+"),\r\n";

str += "controlPoint1: CGPoint(x: "+String(activePathPoints[k-1].leftDirection[0])+", y: "+String(activePathPoints[k-1].leftDirection[1])+"),\r\n";

str += "controlPoint2: CGPoint(x: "+String(activePathPoints[k].rightDirection[0])+", y: "+String(activePathPoints[k].rightDirection[1])+"));\n";

// str += activePath.name+".addCurveToPoint(CGPoint(x: "+String(activePathPoints[k].anchor[0])+", y: "+String(height-activePathPoints[k].anchor[1])+"),\r\n";

// str += "controlPoint1: CGPoint(x: "+String(activePathPoints[k-1].leftDirection[0])+", y: "+String(height-activePathPoints[k-1].leftDirection[1])+"),\r\n";

// str += "controlPoint2: CGPoint(x: "+String(activePathPoints[k].rightDirection[0])+", y: "+String(height-activePathPoints[k].rightDirection[1])+"));\r\n";

}

}

str += activePath.name+".addCurve(to: CGPoint(x: "+String(activePathPoints[0].anchor[0])+", y: "+String(activePathPoints[0].anchor[1])+"),\r\n";

str += "controlPoint1: CGPoint(x: "+String(activePathPoints[activePath.subPathItems[j].pathPoints.length-1].leftDirection[0])+", y: "+String(activePathPoints[activePath.subPathItems[j].pathPoints.length-1].leftDirection[1])+"),\r\n";

str += "controlPoint2: CGPoint(x: "+String(activePathPoints[0].rightDirection[0])+", y: "+String(activePathPoints[0].rightDirection[1])+"));\r\n";

}

}

str += activePath.name+".close();\r\n"

str += "//UIColor.black.setStroke();\r\n"

str += "//"+activePath.name+".lineWidth = 2.0;\r\n"

str += "//"+activePath.name+".stroke();\r\n"

str += "//UIColor.red.setFill();\r\n"

str += "//"+activePath.name+".fill();\r\n"

txtLayer = activeDocument.artLayers.add();

txtLayer.kind = LayerKind.TEXT;

txtLayer.textItem.kind = TextType.PARAGRAPHTEXT;

txtLayer.textItem.contents = str; //文字列

txtLayer.textItem.position = Array(10, 30); //位置 Array(x, y)

txtLayer.textItem.width = "100 px";

txtLayer.textItem.height = "100 px";

txtLayer.textItem.size = 3; //フォントサイズ

//alert(str);

}


前回と同じくPlaygroundでみてみます。

inspectorからPlatformをiOSに変更して一旦開き直さないと「UIKitなんてモジュールはないよ!」って怒られるみたいです。


コメントアウトされてる最後の数行をいじれば完成。

import UIKit

import XCPlayground

class Shape : UIView {

override func draw(_ rect: CGRect) {

//Photoshopからコピペ

}

}

let shape : Shape = Shape(frame: CGRect(x:0, y:0, width:427, height:438));

shape.backgroundColor = UIColor.white;

shape.draw(shape.frame)

XCPlaygroundPage.currentPage.liveView = shape


無事出力できました。


カテゴリ: その他
| コメントを残す

着せかえ販売開始しました

何度か審査に落ちた末、やっと審査通過しました。


「同じ着せかえの複製だよ」と言われたり、「実は審査中に製作ガイドがアップデートされてたよ」とか言われたり…

(中には、いやこれ絶対複製じゃない、というのも含まれてましたけど)


初めてだったのでよくわからない部分もありましたがなんとかなりました(笑


よろしくおねがいしますー。

store_thumbnail store_thumbnail
とまチョップ とまチョップ ゆるふわクレヨン風

カテゴリ: その他
| コメントを残す

LINE着せ替え

みなさま、おひさしぶりです。

生きております。とまカフェです。


LINE着せ替えの審査が開始されましたので、市役所へそれ関連の資料を送ってまいりました。

来週には返事が返ってくるでしょうか?


問題はLINEの審査を通過するかですね…

まだ前例が全くありませんから、どんな理由でリジェクトされるかわかりませんからね…


(実は、リンクは貼ってありませんが、審査用に着せ替え用の固定ページがすでに作ってあったりします。そこでどんな着せ替えか見れちゃったりします)


カテゴリ: その他
| コメントを残す

Fabric Twitterに改行が投稿できない

ちょっとTwitterに文字列を投稿したかっただけなのですが、

\<>{}などの記号が入っているとツイートを投稿できないようなんですよ…

インジェクション対策?

こんな感じなのですが、


func postTweet(){

var clientError : NSError?

// \<>{}

let tweet = tweetTextView.text//.stringByReplacingOccurrencesOfString("\n", withString: "\\n")

let param : [NSObject : AnyObject] = ["status":tweet]

print(param)

// let param : [NSObject : AnyObject] = ["status":"test"]

let request : NSURLRequest? = client.URLRequestWithMethod("POST", URL:"https://api.twitter.com/1.1/statuses/update.json", parameters: param, error: &clientError)

if request != nil {

client.sendTwitterRequest(request!, completion: {response, data, connectionError in

if(connectionError == nil){

do{

/*let json : AnyObject? = */try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers)

// print(json)

}catch(let jsonError){

print("updateJsonError: \(jsonError)")

}

}else{

print("updateConnectionError: \(connectionError!.localizedFailureReason)")

}

});

}

}

最初に気づいたのは改行を投稿した時です。

Could not authenticate you.

が出たのですが、その直前に認証の確認をしていたのでauthenticateできていないわけもなく…

で、怪しいと思って改行を消してみたらpostできてしまいまして…

それからstringByReplacingOccurrencesOfString “\n”%0aやら\\nやら<br>やら\r\nに変えてみたのですが、どれもダメで…

結局解決はしていないのです…

うーん、どうしたものか。


ちなみに前にRubyで投稿した時はtweet.gsub(/\\n/, “\n”) でいけたんですけどねぇ


カテゴリ: アプリ制作
| コメントを残す

PhotoshopでUIBezierPath

SwiftがさわってみたくてとまチョップスタンプをSwiftで作り直しているのですが、ちょっと吹き出しの形の絵を使いたくなりまして…

でもiPhoneの大きさがたくさん増えたので直接UIImageViewとかに画像を入れるわけにもいかないんですよ。

そこで思い出したのが、いつか見たイラレのベジェ曲線を自動でUIbezierPathに変換してくてるスクリプトです。

その頃は、あー誰かPhotoshopで同じの作ってくれないかなー程度に思っていたのですが、この間.jsxを触ったばかりなのでこれ自分で作れないか、と。

(吹き出しならpopOver使えよというツッコミはなしです)


で、例のごとくリファレンスのようなものを見ながらいじっていたわけですが、まあ分からないんですよ。

全部英語なんですよ。パスの取得すら危うい。

→続きを読む…

カテゴリ: Photoshop, アプリ制作
| コメントを残す

宛名.jsx

宛名.jsxはPhotoshop用プラグインです。

これは、はがきの表(通信面、住所とか書いてある方)の面の印刷を簡単に行うためのものです。

つまり宛名を印刷するものです。

Officeをうまく使えないので少しでもPhotoshopを多く使おうとして作ったものです

Photohshop最高です

→続きを読む…

カテゴリ: Photoshop
| コメントを残す

Photoshopで宛名⑦

今回で最後になる予定です


⑩pngで出力

やりたいことは明快です。

「Save as…」で指定パスにpngで保存→ついでにpsdも保存。

activeDocument.layerSets.add();で追加したレイヤーグループを


for(i=0; i

app.activeDocument.layerSets[i];

}

とでもしてグループごとに(人ごとに)処理していきます


グループごとにpngに書き出したいので

一番下のグループから一つづつ表示して順次出力していきます。


for(i=0; i

for(j=0; j<layerSetArr.length; j++){

app.activeDocument.layerSets[j].visible = false;

}

app.activeDocument.layerSets[i].visible = true;

}

一旦全てのグループを非表示にしてからi番目のグループを表示します。

saveAs(saveIn[, options][, asCopy][, extensionType]) でセーブしていきます。


pngFilePath = new File(folderPath+"/"+app.activeDocument.layerSets[i].name+".png");

pngOpt = new PNGSaveOptions();

pngOpt.interlaced = false;

activeDocument.saveAs(pngFilePath, pngOpt, true, Extension.LOWERCASE);

パス”指定したフォルダ名/現在ドキュメント名/表示されているグループ名.png”、

インターレースなし、

コピー、

小文字(?)(他がUPPERCASEとNONEだったので…)

で保存。

→続きを読む…

カテゴリ: Photoshop
| コメントを残す

Photoshopで宛名書き⑥

前回に引き続きphotoshopで宛名です

⑨プリンタの位置ずれの調整はダイアログに追加する形で実現していきますよ。

1画面に収めるのは辛くなってきたのでタブ(「基本」と「詳細」)を追加します。

menu.tabParent = menu.add(“tabbedpanel”,[10,10,width-110,height-10]);

でwindowにTabbedPanelを追加します。

これはTabを追加するための親レイヤーのようなもののようです。




ではTabを追加していきます。

menu.tabParent.tab1 = menu.tabParent.add(“tab”,undefined,”基本”);

大きさは親TabbedPanelで指定したものと同じになるからundefinedにしろ、と書いてありましたのでおとなしくundefinedにしておきました

addしていけばどんどんタブを増やせるようです。

→続きを読む…

カテゴリ: Photoshop
| コメントを残す

Photoshopで宛名⑤

⑧フォントの指定は大変でした…

これまではAdobeのJAVASCRIPT TOOLS GUIDEを見て書いていたのですが、今度は何の情報もない。

とりあえず

dialog = new Window('dialog', '宛名', [x, y, y + width, x + height]);

dialog.show();

でよくPhotoshopの「ファイル>スクリプト」でよく見るようなダイアログが表示されたのでこれにボタンやドロップダウンメニューを追加していきます。

そこで検索したらたまたま見つけました。

ADOBE PHOTOSHOP CS5 JAVASCRIPT SCRIPTING REFERENCE

こんないいものがあるではないか。でも欲しい情報がちょっと足りなかったりするのでTOOLS GUIDEの方も併用していきます。

→続きを読む…

カテゴリ: Photoshop
| コメントを残す

Photoshopで宛名書き④

前回の続きです


⑤配列からの文字レイヤー作成ですが、文字レイヤーはほかのレイヤーとは少し機能が異なるようでTextItemというプロパティを持っているらしいです。

とりあえず新規テキストレイヤー作成。


var newLayer = layerSet.artLayers.add();

newLayer.kind = LayerKind.TEXT;


それから指定したい値をいじります


newLayer.textItem.contents = text; //文字列

newLayer.textItem.position = position; //位置 Array(x, y)

newLayer.textItem.font = font.postScriptName; //フォント(postScriptNameで指定しないといけないらしい)

newLayer.textItem.size = size; //フォントサイズ

newLayer.textItem.direction = dir; //縦書き、横書き(HORIZONTAL, VERTICAL)

newLayer.textItem.justification = Justification.LEFTJUSTIFIED; //文字揃え

newLayer.textItem.maximumLetterScaling = newLayer.textItem.minimumLetterScaling = newLayer.textItem.desiredLetterScaling = kering; //文字間隔

newLayer.textItem.maximumWordScaling = newLayer.textItem.minimumWordScaling = newLayer.textItem.desiredWordScaling = kering*2; //空白との間隔


→続きを読む…

カテゴリ: Photoshop
| コメントを残す