ユーザ定義プロパティ(UDP)を使用することにより、追加データをポイントにアタッチすることができます(UDP を区画に割り当てることもできます)。UDP は、UDP 分類というグループに編成され、順に PointGroups に割り当てられます。UDP が「未分類」であることもあります。UDPClassification が PointGroup オブジェクトに関連付けられている(UseCustomClassification() メソッドを使用)場合、UDPClassification 内の UDP 定義はPointGroup の各ポイントに割り当てられます。UDP の値は各ポイントごとに一意であり、個別に変更することができます。割り当てにより、各ポイントは UDP の既定値を取得します(UseDefault が UDP に対して True の場合)。
UDP の各インスタンスは UDP 基本クラスから派生されたクラスで、データ型に応じて追加のプロパティがあります。UDPDouble と UDPInteger 型には、範囲を示す下限および上限プロパティがあります。UDPEnumeration 型には、定義されているすべての値の配列を取得する GetEnumerationValues() メソッドがあります。
UDP を作成するには、最初に AttributeTypeInfo<type> オブジェクトを作成し(UDP タイプごとに 1 つ)、既存の UDPClassification の CreateUDP() メソッドに渡します。UDP には、名前と同様に GUID もあり、名前+GUID の組み合わせによって一意の識別子であることが保証されます。CreateUDP() メソッドは省略可能な GUID パラメータを受け入れるため、特定の名前+GUID の組み合わせを使用して UDP を作成することができます。これにより、複数の図面で同じ UDP を作成することができます。
ユーザ定義プロパティおよびユーザ定義分類の詳細は、『Autodesk Civil 3D ユーザ ガイド』の「ユーザ定義プロパティの分類」を参照してください。
次の例では、"Example" というポイントの新しいユーザ定義のプロパティ分類を作成し、上限と下限および既定値で新しいユーザ定義プロパティを追加します。
[CommandMethod("C3DSAMPLES", "UDPExample", CommandFlags.Modal)]
public void UDPExample()
{
using (Transaction tr = startTransaction())
{
// _civildoc is the active CivilDocument instance.
UDPClassification udpClassification = _civildoc.PointUDPClassifications.Add("Example");
AttributeTypeInfoInt attributeTypeInfoInt = new AttributeTypeInfoInt("Int UDP");
attributeTypeInfoInt.DefaultValue = 15;
attributeTypeInfoInt.UpperBoundValue = 20;
attributeTypeInfoInt.LowerBoundValue = 10;
UDP udp = udpClassification.CreateUDP(attributeTypeInfoInt);
// assign a point group
ObjectId pointGroupId = _civildoc.PointGroups.AllPointGroupsId;
PointGroup pointGroup = pointGroupId.GetObject(OpenMode.ForWrite) as PointGroup;
pointGroup.UseCustomClassification("Example");
tr.Commit();
}
}
この例では、ドキュメント内のすべてのポイントの UDPClassifications のコレクショにアクセスし、各 UDPClassificationreading の 各 UDP を読み出す方法を示します。
[CommandMethod("C3DSAMPLES", "ListUDPs", CommandFlags.Modal)]
public void ListUDPs()
{
using (Transaction tr = startTransaction())
{
// _civildoc is the active CivilDocument instance.
foreach (UDPClassification udpClassification in _civildoc.PointUDPClassifications)
{
_editor.WriteMessage("\n\nUDP Classification: {0}\n", udpClassification.Name);
foreach (UDP udp in udpClassification.UDPs)
{
_editor.WriteMessage(" * UDP name: {0} guid: {1}, description: {2}, default value: {3}, use default? {4}\n",
udp.Name, udp.Guid, udp.Description, udp.DefaultValue, udp.UseDefaultValue);
_editor.WriteMessage("\tUDP type: {0}\n", udp.GetType().ToString());
var udpType = udp.GetType().Name;
switch (udpType)
{
// Booleans and String types do not define extra properties
case "UDPBoolean":
case "UDPString":
break;
case "UDPInteger":
UDPInteger udpInteger = (UDPInteger)udp;
_editor.WriteMessage("\tUpper value: {0}, inclusive? {1}, Lower bound value: {2}, inclusive? {3}\n",
udpInteger.UpperBoundValue, udpInteger.UpperBoundInclusive, udpInteger.LowerBoundValue, udpInteger.LowerBoundInclusive);
break;
case "UDPDouble":
UDPDouble udpDouble = (UDPDouble)udp;
_editor.WriteMessage("\tUpper value: {0}, inclusive? {1}, Lower bound value: {2}, inclusive? {3}\n",
udpDouble.UpperBoundValue, udpDouble.UpperBoundInclusive, udpDouble.LowerBoundValue, udpDouble.LowerBoundInclusive);
break;
case "UDPEnumeration":
UDPEnumeration udpEnumeration = (UDPEnumeration)udp;
_editor.WriteMessage("\tEnumeration values: {0}\n", udpEnumeration.GetEnumValues());
break;
}
}
}
tr.Commit();
}
}