Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。

AutoCADの.net APIで寸法拘束の拘束フォームを変更する方法

質問

AutoCADの.net APIで寸法拘束の拘束フォームを変更する方法はありますか。

回答

残念ながら、AutoCADの.net APIには寸法拘束の拘束フォームを変更するAPIはありません。

一方でObjectARX C++のAPIには対応するAPIが存在するため、.netのプログラムからは、P/Invoke を用いることで.netから寸法拘束の拘束フォームを変更することが可能です。

 

寸法拘束の拘束フォームの変更には、ObjectARX C++の寸法線の基底クラスAcDbDimensionの、isConstraintDynamic()メソッドおよびsetConstraintDynamic(bool isDynamic)メソッドを使用します。

 

isConstraintDynamic()メソッドは、その戻り値で現在の拘束フォームの設定状態を確認することが出来ます(true:ダイナミック, false:注釈)。

また、setConstraintDynamic(bool isDynamic)メソッドは、引数に指定した値で拘束フォームの設定状態を変更することが可能です。

 

以下は、AutoCAD 2023でP/Invokeを用いて.net で作成したAutoCADのカスタムコマンドから、選択した寸法拘束の拘束フォームの設定を変更するサンプルコードとなります。

[CommandMethod("FlipConstraintsForm")]
public void FlipConstraintsForm()
{
	Document doc = Application.DocumentManager.MdiActiveDocument;
	Database db = doc.Database;
	Editor ed = doc.Editor;

	var option = new PromptEntityOptions("\n" + "Select a dimension constraints.");
	PromptEntityResult result = ed.GetEntity(option);
	if (result.Status != PromptStatus.OK)
		return;

	ObjectId id = result.ObjectId;
	using (Transaction tx = db.TransactionManager.StartTransaction())
	{
		Dimension dim = tx.GetObject(id, OpenMode.ForWrite) as Dimension;
		DatabaseExtensions.DatabaseExtensions.Dimension_FlipConstraintsForm(dim);
		tx.Commit();
	}
}

//DatabaseExtensions.cs
namespace DatabaseExtensions
{

	public class DatabaseExtensions
	{
		private static class AcDbDimension
		{
			[DllImport("acdb24.dll", CallingConvention = CallingConvention.ThisCall, CharSet = CharSet.Unicode, EntryPoint = "?isConstraintDynamic@AcDbDimension@@QEBA_NXZ")]
			[return: MarshalAs(UnmanagedType.Bool)]
			public static extern  Boolean isConstraintDynamic(IntPtr dimension);

			[DllImport("acdb24.dll", CallingConvention = CallingConvention.ThisCall, CharSet = CharSet.Unicode, EntryPoint = "?setConstraintDynamic@AcDbDimension@@QEAA?AW4ErrorStatus@Acad@@_N@Z")]
			public static extern ErrorStatus setConstraintDynamic(IntPtr dimension, [MarshalAs(UnmanagedType.Bool)] Boolean bDynamic);
		}

		public static void Dimension_FlipConstraintsForm(Dimension dim)
		{
			dim.UpgradeOpen();
			bool isDynamic = AcDbDimension.isConstraintDynamic(dim.UnmanagedObject);
			AcDbDimension.setConstraintDynamic(dim.UnmanagedObject, !isDynamic);
		}
	}
}

 

DllImportによりImportするdllファイル名は、対象のAutoCADのバージョンに依存して変わる点にご留意ください。

 

なお、P/Invokeを用いたAPIの実装方法についてはこちらの記事に開設がありますので、ご参照ください。