Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。
ソート順:
現象 Inventorを、VBAや.NET FrameworkのCreateObject()等のCOM API経由で起動後、カスタマイズプログラムからQuit()を実行せずに、GUIで終了(xボタン押下当)した場合、バックグラウンドプロセスとしてInventorが残ってしまう。   診断 外部プロセスから、VBAや.NET Framework等のCreateObject()等を用いて外部アプリケーションを起動した場合、対象のアプリケーションはQuit()メソッドにより終了をさせる必要があります。Quit()を実行せずアプリケーションGUI側から終了した場合バックグラウンドにプロセスが残存してしまいます。 この挙動はInventorのみならずExcel等でも同様で、COMオブジェクトを公開するアプリケーションに共通の挙動となります。   解決策 CreateObject()により取得したアプリケーションオブジェクトをQuit()メソッドで終了せず利用したい場合は、CreateObject()ではなくProcess.Start()等によりプロセスを起動し、GetObject()等を用いて起動中のアプリケーションのCOMオブジェクトを取得することで回避が可能です。   「APIでInventorを起動する際にバージョン指定する方法」にProcess.Start()を用いてInventorを起動し起動したInventorアプリケーションのCOMオブジェクトを取得する方法のサンプルコードがありますので、ご参照ください。  
記事全体を表示
現象 AutoCAD 2025のAccoreconsole.exe でSystem.Data.OleDbを参照するプラグインのカスタムコマンドを実行すると、Accoreconsole.exeが異常終了するAutoCAD 2025のAccoreconsole.exe でSystem.Data.OleDbを参照するプラグインのカスタムコマンドを実行すると、Accoreconsole.exeが異常終了してしまいます。   なお、プラグインはAutoCAD 2025に合わせて.net 8を利用するように移植済みです。 また、System.Data.OleDbはVisual Studio のNugetパッケージマネージャから 9.0.2をプロジェクトにインストールして使用しています。 診断 AutoCAD インストールフォルダ配下のSystem.Data.OleDb.dllのバージョンと、プラグインプロジェクトのNugetでインストールしているSystem.Data.OleDb.dllのバージョンの差異に起因してAccoreconsole.exeが異常終了している状況です。   AutoCAD 2024以前は、.NET FrameworkのAppDomain機能を用いてプラグインは分離された実行空間にロード・実行されていました。AutoCADが利用するアセンブリとは異なるバージョンのアセンブリをプラグインが参照している場合でも問題なく実行することが出来ておりました。 一方で、AutoCAD 2025では、従来の.NET Frameworkから、.NET Core(.NET 8)にサポートプラットフォームが変更されましたが、この.NET CoreではAppDomain機能がサポートされておらず、すべてのプラグインとその参照アセンブリは同じ実行空間にロードされます。このため、AutoCADとプラグイン、または異なるプラグイン間でバージョンの異なる同じアセンブリを参照している場合、競合が発生して異常終了等の予期せぬ事態が発生することがあります(参照アセンブリによっては異常終了せず動作する場合もあります)。   解決策 System.Data.OleDbに特化した解決方法としては、プラグインが参照するSystem.Data.OleDbのライブラリをAutoCADのインストールフォルダ配下の者とすることで、問題を解消することが可能です。 以下、手順となります。 1.VisualStudio のプロジェクトからSystem.Data.OleDbのNugetパッケージを削除する 2.代わりに、VisualStudio のプロジェクトの参照設定で、AutoCADのインストールフォルダ(acad.exeおよびaccoreconsole.exeがあるフォルダ)配下のSystem.Data.OleDb.dllを参照ファイルに追加をする。   また、System.Data.OleDbに特化しない一般的な解決方法としては、.NET Coreが提供するAssemblyLoadContext機能を用いて、カスタム処理を異なる空間で実行することにより、参照するアセンブリのバージョン違いによる干渉を防ぐ方法となります。 AssemblyLoadContext機能については、Microsoft社の提供するマテリアル「System.Runtime.Loader.AssemblyLoadContext について」をご参照ください。
記事全体を表示
質問 InventorのVBA環境で、VBAの「ツール」-「参照設定」から利用するライブラリの参照設定が行えます。 VBAを実行するクライアント端末が複数あり、各端末でライラリファイルの参照設定をすることが手間なので、ライブラリの参照設定を出力して配布することは可能でしょうか? 回答 Inventorの設定ファイルには、VBAでの参照設定を編集する機能はありません。また、InventorのAPI にも直接的に参照設定を編集する機能はありません。   一方で、InventorのAPIで、Microsoft社が提供するVBA開発環境のVBProjectオブジェクトを取得するAPIが公開されているため、VBProjectオブジェクトのReferences.AddFromFile()メソッド等を利用することで、プログラムコードから参照設定を行うことが可能です。   以下は、"Adbe Acrobat 10 Type Library”への参照を追加する場合のサンプルコードとなります。 Dim app As Application Set app = ThisApplication Dim VBProject As Object Set VBProject = app.VBAProjects.Item(1).VBProject Const RefFile As String = "<path to acrobat.tlb file>" VBProject.References.AddFromFile RefFile
記事全体を表示
AutoCAD .NET APIリファレンスに記載の様に、PromptSelectionOptions.SingleOnlyは、AutoCAD ObjectARXでのacedSSGet()での”:S”モードの設定に相当します。また、 PromptSelectionOptions.SinglePickInSpaceは、":A"モードに相当します。   ObjectARXでのacedSSGetでは、”:S"モードは、単一のエンティティの選択が許容される状態となりますが、窓選択については有効な状態のままとなります。   また、”:A"モードについては、aecdSSGetのリファレンスでは「This mode option causes acedSSGet() to perform single pick selection in space on entities that implement a subselection filter.」との説明がありますが、これは例えばテーブルの様な、エンティティ内にサブエンティティがあるようなエンティティにおいて、テーブルのセル内の文字のクリックを、テーブル自身の選択とするオプション設定となります。
記事全体を表示
Issue VPORTS[ビューポート管理] コマンドで作成したモデル空間ビューポート内の表示をすべて再作図したいのですが、.NET API で REGENALL[全再作図] コマンドと同じような実装をすることは可能でしょうか?     Solution AutoCAD .NET API の Editor.Regen メソッドには、表示中のすべてのモデル空間ビューポートの再作図を指定するパラメーターがありません。このため、すべてのモデル空間ビューポートを走査して、ビューポートを識別する ViewportTableRecord.Number プロパティの値を CVPORT システム変数に指定、アクティブなビューポートをを切り替えて Editor.Regen メソッドを呼び出す必要があります。   [CommandMethod("MyCommand", CommandFlags.Modal)] public void MyCommand() { Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; var curVPort = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("CVPORT"); using (Transaction tr = db.TransactionManager.StartTransaction()) { ViewportTable vpTable = (ViewportTable)tr.GetObject(db.ViewportTableId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead); if (vpTable != null) { ed.WriteMessage(Constants.vbLf + "Model Space Viewports : "); foreach (ObjectId vpId in vpTable) { ViewportTableRecord vptr = (ViewportTableRecord)tr.GetObject(vpId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite); Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("CVPORT", vptr.Number); ed.WriteMessage(vptr.Number.ToString()); ed.Regen(); } } tr.Commit(); } Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("CVPORT", curVPort); }    もちろん、プロジェクトの参照設定に Autodesk.AutoCAD.Interop.Common.dll と Autodesk.AutoCAD.Interop.dll の 2つのアセンブリを追加して、COM Interop(COM 相互運用機能)で ActiveX オートメーション(COM API)を利用、 acAllViewports パラメーターを指定して Regen メソッドを呼び出すことも可能です。   [CommandMethod("MyCommand", CommandFlags.Modal)] public void MyCommand() // This method can have any name { Autodesk.AutoCAD.Interop.AcadApplication COM_App = (Autodesk.AutoCAD.Interop.AcadApplication)Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication; COM_App.ActiveDocument.Regen(Autodesk.AutoCAD.Interop.Common.AcRegenType.acAllViewports); }   
記事全体を表示
質問 Vaultクライアントで、プロジェクトエクスプローラ($)配下の、あるフォルダに対してローカル作業フォルダを規定値から別のフォルダに変更するを設定しました。 その後、Vault APIで対象のフォルダのローカル作業フォルダのパスを取得すると、変更したフォルダパスではなく、規定値のフォルダパスが取得されている状況です。 Vault クライアントで変更したフォルダパスを取得する方法はありますか。 回答  Vaultのローカル作業フォルダの設定を規定値から変更した場合、変更した設定は以下のファイルに保存されます(*****部は、実行環境により変化します)。   C:\Users\<Windows ログインユーザ>\AppData\Roaming\Autodesk\VaultCommon\Servers\Services_Security_******\<接続先サーバ名>\Vaults\<ボルト名>\Objects\WorkingFolders.xml     ファイルパスに<Windowsログインユーザ>、<接続先サーバ名>、<ボルト名>が含まれているため、カスタムアプリケーションからVaultに接続する際に、これらのどれかが異なる場合には、異なるローカル作業フォルダの設定が読み込まれます(ファイルが存在しない場合は、既定のパスとなります)。   ローカル作業フォルダの設定を規定値から変更したVaultクライアントアプリケーションと、APIを実行しているアプリケーションで、この値のどれかが異なっている場合Vault クライアントで変更したフォルダパスを取得することが出来ません。これらの値を合わせたうえで、変更後のフォルダパスが取得できるかを確認してください。
記事全体を表示
Issue モデル空間やペーパー空間(レイアウト)の作図領域の背景色は、[オプション] ダイアログの [表示] タブからアクセス出来る [作図ウィンドウの色] ダイアログから変更出来ますが、AutoCAD .NET API で同等の処理を実装することは出来ますか?     Solution あいにく、AutoCAD .NET API ネイティブにモデル空間やペーパー空間(レイアウト)の作図領域の背景色を変更する API が用意されていません。   代替として、COM Interop を使って PreferencesDisplay オブジェクト(ActiveX) の  GraphicsWinModelBackgrndColor プロパティ(モデル空間背景色)、 GraphicsWinLayoutBackgrndColor プロパティ(ペーパー空間背景色)を使用、背景色を取得、設定することが出来ます。   この場合、 GraphicsWinModelBackgrndColor プロパティ、 GraphicsWinLayoutBackgrndColor プロパティには AcCmColor オブジェクト が適用出来ないため、インデックスカラーやカラーブックの指定は出来ず、RGB 指定になってしまう点にご注意ください。   次の C# コードは、  GraphicsWinModelBackgrndColor プロパティ を使ってモデル空間の作図領域の背景色を変更するものです。   using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application; ... ... Editor ed = AcadApp.DocumentManager.MdiActiveDocument.Editor; // ↓ if you face an error at 'var acadApp' below, try 'dynamic acadApp' var acadApp = (AcadApplication)AcadApp.AcadApplication; var modelBk = acadApp.Preferences.Display.GraphicsWinModelBackgrndColor; var color = ColorTranslator.FromOle((int)modelBk); ed.WriteMessage("\nCurrent Color = {0}", color.ToString()); acadApp.Preferences.Display.GraphicsWinModelBackgrndColor = (uint)ColorTranslator.ToOle(System.Drawing.Color.FromArgb(11, 22, 33)); modelBk = acadApp.Preferences.Display.GraphicsWinModelBackgrndColor; color = ColorTranslator.FromOle((int)modelBk); ed.WriteMessage("\nNew Color = {0}", color.ToString()); ...   なお、ObjectARX では、 acedGetCurrentColors() グローバル関数と acedSetCurrentColors() グローバル関数を使って、AcColorSettings 構造体の dwGfxModelBkColor 値、dwGfxLayoutBkColor 値で背景色の取得/設定をおこなうことが出来ます。
記事全体を表示