FAQ
シンボル コレクションに新しいシンボルを追加する方法

ナレッジ番号:5573 | 登録日:2023/07/27 | 更新日:2024/11/21

概要

アノテーションクラスのシンボルを変更する方法を通じて、シンボル コレクションに新しいシンボルを追加する方法を説明します。

シンボル コレクションと SymbolID

アノテーションクラスのシンボルは、ArcCatalog のアノテーションクラス タブでテキスト シンボルのプレビューに表示されているシンボルです。アノテーションクラスとの関連付けは ILabelEngineLayerProperties インタフェースの SymbolID によってなされています。 ArcCatalog のユーザー インタフェースからシンボルを変更すると、既存のシンボルが変更されるのではなく、変更後のシンボルが新しい SymbolID を持った新しいシンボルとしてシンボル コレクションに追加されます。 そしてアノテーションクラスのシンボルは、この新しい SymbolID と関連付けられるようになります。アノテーション フィーチャのシンボルを保存する場合、シンボル コレクションに追加されているシンボルを SymbolID で参照することは一番効率的な方法です。そのため、プログラムでアノテーションクラスのシンボルを変更する場合も、既存の SymbolID のシンボルを変更するのではなく、新しいシンボルをシンボルコレクションに追加し、アノテーションクラスがその新しい SymbolID を参照するようにします。

サンプル コード

IFeatureLayer pannolay = (IFeatureLayer)(アノテーションレイヤのオブジェクト);
IAnnoClass pAnnoClass = (IAnnoClass)(pannolay.FeatureClass.Extension);
IAnnoClassAdmin3 annoadmin = (IAnnoClassAdmin3)pAnnoClass;

IAnnotateLayerPropertiesCollection pAnnotateLayerPropetiesCol = pAnnoClass.AnnoProperties;
ILabelEngineLayerProperties pLabel;
          
IElementCollection placedElements = new ElementCollectionClass();
IElementCollection unplacedElements = new ElementCollectionClass();
IAnnotateLayerProperties pLabelEngineLayerProps = new LabelEngineLayerProperties() as IAnnotateLayerProperties;
pAnnotateLayerPropetiesCol.QueryItem(0,out pLabelEngineLayerProps, out placedElements, out unplacedElements);
//デフォルトのアノテーションクラスの LabelEngineLayerProperties を取得する
                        
pLabel = (ILabelEngineLayerProperties)pLabelEngineLayerProps;
ITextSymbol pTxtSym = pLabel.Symbol;
// 現在のシンボルを取得して変更する。変更後のシンボルを新しいシンボルとしてシンボルコレクションに追加する
// 取得したシンボルはコピーされたものが得られるので既存のシンボルが直接変更されるわけではない。
            
IRgbColor pcolor = (IRgbColor)pTxtSym.Color;
pcolor.Red = 10;
pcolor.Green = 100;
pcolor.Blue = 120;
pTxtSym.Color = pcolor;
// サンプルの色
            
stdole.IFontDisp stdFont =(stdole.IFontDisp)(new stdole.StdFont());
stdFont.Name = "メイリオ";
stdFont.Size = 30;
pTxtSym.Font = stdFont;
//サンプルのフォントとして メイリオフォントで 30 pt とする。

System.Diagnostics.Debug.Print(pLabel.SymbolID.ToString());
//参考:現在のシンボルID を表示してみる

ISymbolCollection2 symbolCollection2 = (ISymbolCollection2)(pAnnoClass.SymbolCollection);
ISymbolIdentifier2 symbolIdentifier2 = null;
symbolCollection2.AddSymbol((ISymbol)pTxtSym, "MySymbol", out symbolIdentifier2);
//変更したシンボルに任意の新しい名前を付けて、シンボルコレクションに追加する。この時点で新しい SymbolID が得られる。

pLabel.SymbolID = symbolIdentifier2.ID;
// アノテーションクラス(ここでは、デフォルトのアノテーションクラス)のシンボル ID を変更する。以降、このシンボル ID のシンボルでアノテーションが定義される。
annoadmin.UpdateProperties(); 
Dim pannolay As IFeatureLayer = CType((アノテーションレイヤのオブジェクト), IFeatureLayer)
Dim pAnnoClass As IAnnoClass = CType(pannolay.FeatureClass.Extension, IAnnoClass)
Dim annoadmin As IAnnoClassAdmin3 = CType(pAnnoClass, IAnnoClassAdmin3)
Dim pAnnotateLayerPropetiesCol As IAnnotateLayerPropertiesCollection = pAnnoClass.AnnoProperties
Dim pLabel As ILabelEngineLayerProperties
Dim placedElements As IElementCollection = New ElementCollectionClass()
Dim unplacedElements As IElementCollection = New ElementCollectionClass()
Dim pLabelEngineLayerProps As IAnnotateLayerProperties = CType(New LabelEngineLayerProperties, IAnnotateLayerProperties)
pAnnotateLayerPropetiesCol.QueryItem(0, pLabelEngineLayerProps, placedElements, unplacedElements)

'デフォルトのアノテーションクラスの LabelEngineLayerProperties を取得する
pLabel = CType(pLabelEngineLayerProps, ILabelEngineLayerProperties)
Dim pTxtSym As ITextSymbol = pLabel.Symbol

'現在のシンボルを取得して変更する。変更後のシンボルを新しいシンボルとしてシンボルコレクションに追加する
'取得したシンボルはコピーされたものが得られるので既存のシンボルが直接変更されるわけではない。
Dim pcolor As IRgbColor = CType(pTxtSym.Color, IRgbColor)
pcolor.Red = 100
pcolor.Green = 10
pcolor.Blue = 120
pTxtSym.Color = pcolor
'サンプルの色
Dim stdFont As stdole.IFontDisp = CType(New stdole.StdFont(), stdole.IFontDisp)

stdFont.Name = "メイリオ"
stdFont.Size = 30
pTxtSym.Font = stdFont
'サンプルのフォントとして メイリオフォントで 30 pt とする。

System.Diagnostics.Debug.Print(pLabel.SymbolID.ToString())
'参考:現在のシンボルID を表示してみる
Dim symbolCollection2 As ISymbolCollection2 = CType(pAnnoClass.SymbolCollection, ISymbolCollection2)
Dim symbolIdentifier2 As ISymbolIdentifier2 = Nothing
symbolCollection2.AddSymbol(CType(pTxtSym, ISymbol), "MySymbol", symbolIdentifier2)
'変更したシンボルに任意の新しい名前を付けて、シンボルコレクションに追加する。この時点で新しい SymbolID が得られる。

pLabel.SymbolID = symbolIdentifier2.ID
'アノテーションクラス(ここでは、デフォルトのアノテーションクラス)のシンボル ID を変更する。以降、このシンボル ID のシンボルでアノテーションが定義される。
annoadmin.UpdateProperties()

備考

新しいシンボルは、[カタログ] ウィンドウのアノテーションレイヤーを右クリック → [プロパティ] → [アノテーション] から確認することができます。
Image

インターフェイスの詳細は、ヘルプ ページをご参考ください。
ILabelEngineLayerProperties Interface
ISymbolCollection2 Interface

メタデータ

機能

種類

製品