0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Illustrator javascriptとC#でのPageItem

Posted at

#illustratorのオブジェクト
illustratorのオブジェクトにはGroupItemやPathItem等色々な種類があるが
その細かい種類に分類せずにとりあえずオブジェクト全般というものがあり、それが

PageItem と PageItems

例えばレイヤー内にGroupやPath、CompoundPath等色々入ってるけど
参照したいプロパティは、表示状態やロック状態等の
どのオブジェクトでも共通の場合にはPageItemを使用するほうが楽
※どの種類のオブジェクトか判断しないで良い為

ということで、良くPageItemを使うのですが
例えば、PageItemsを回して、個々のPageItemのプロパティにアクセスする場合

##javascriptだと以下のようになる

pageItem.js
for(var i = 0; i < layer.pageItems.length; i++){
	var pageItem = layer.pageItems[i];
	
	$.writeln(pageItem.locked);
	$.writeln(pageItem.visible);
}

##C#のだと…(↓コンパイルエラーになる)

しかし、C#の場合にはPageItemsはあるがPageItemが無い…:cry:

pageItem.cs
foreach (PageItem pageItem in pageItems)
{
    Console.WriteLine(pageItem.Locked));
    Console.WriteLine(pageItem.Visible));
}

じゃあvarにしたらいいんじゃないの?

varにすると型がobjectとなってしまう。
っていうかそもそもPageItem自体が無いって話だから型推論もクソも無い:innocent:

###どうすりゃいいの?

###と思いましたがここで登場するはなんとあのダイナミックな奴:muscle:

##C#これが正解

pageItem.cs
foreach (dynamic pageItem in pageItems)
{
    Console.WriteLine(pageItem.Locked));
    Console.WriteLine(pageItem.Visible));
}

###その名の通りdynamicを使います:relaxed:

dynamicの説明はここではしませんが、ざっくりいうと実行時まで型がわからないjavascript的なvarです

なんでわざわざPageItemを実装せずdynamicを使用する仕様にしたのかはわかりませんが
C#でPageItemを使うときはこの方法で出来るようです。

ただ実行時まで型がわからないので、IDEでプロパティの候補が出ないし大文字小文字などの誤字もコンパイルエラーで教えてくれないのでそこがちょっと微妙ですね。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?