Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。
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の実装方法についてはこちらの記事に開設がありますので、ご参照ください。