Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。
ソート順:
Issue .NET 8 に対応した AutoCAD 2025 用の .NET Wizard はありますか?   Solution .NET 8 に対応した AutoCAD 2025 用の .NET Wizard は、https://aps.autodesk.com/developer/overview/autocad ページ、または Github リポジトリ(https://github.com/ADN-DevTech/AutoCAD-Net-Wizards/releases/download/v2025/PluginVsix.zip) からダウンロードすることが出来ます。   インストール AutoCAD 2025 用の .NET Wizard は、従来の .msi インストーラに代わって、VSIX テクノロジを採用した Visual Studio 2022 の機能拡張として、.vsixインストーラで提供されています。 ダウンロードした ZIP には PluginVsix.vsix ファイルが含まれていますので、任意の場所に解凍してダブルクリックすると、VSIX Installer 画面が表示されます。 [Install] ボタンをクリックして画面の指示に従ってインストールしてください。   Visual Studio 2022 がインストールされている必要があります。 AutoCAD 2025 用 .NET Wizard は、GUID を共有していた AutoCAD 2024 以前までの .NET Wizard と異なり、VSIX ベースの Visual Studio 機能拡張なので、AutoCAD 2024 以前のバージョン用に用意されたいずれか 1 つの .NET Wizard と共存インストールと運用が出来ます。   プロジェクト作成 Visual Studio 2022 を起動後に「新しいプロジェクトの作成」を選択して ”autocad” の文字でフィルタリングすると、C# プロジェクト用の「AutoCAD 2025 Plugin CS」と Visual Basic プロジェクト用の「AutoCAD 2025 Plugin VB」テンプレートが表示されます。 開発に使用したい言語のテンプレートを選択して [次へ(N)] で画面を進めると、プロジェクト名の入力とプロジェクトの作成場所を指定出来ます。両者を指定後に  [次へ(N)] をクリックすると、スケルトン プロジェクトが作成されます。 プロジェクト作成時には、NuGet サーバーからオンラインで AutoCAD 2025 用のアセンブリを解決します。NuGet パッケージから転換されたアセンブリは、C:\Users\<username>\.nuget\packages\autocad.net\25.0.1\lib\net8.0 フォルダに配置されます。 C:\Users\<username>\.nuget\packages\autocad.net\25.0.1\lib\net8.0 フォルダに配置されたアセンブリは、自動的にプロジェクトに参照設定されます。   デバッグ .NET Wizard(AutoCAD 2025 Template)で作成されたプロジェクトには、”Acad” デバッグ プロファイルが作成されています。   ”Acad” デバッグ プロファイルには、デバッグ時に起動する acad.exe へのパスが含まれますが、インストールした環境にあわせたパスの見直しはおこなわれていません。このまま、”Acad” デバッグ プロファイルでデバッグを開始するとエラーになってしまいます。   ”Acad” デバッグ プロファイル の acad.exe へのパスを変更するには、作成したプロジェクト フォルダ配下のフォルダ(C# プロジェクト:<project name>\<project name\Properties フォルダ、VB プロジェクト:<project name>\My Project フォルダ)の launchSettings.json を直接開いて、環境にあわせて acad.exe のパスに "executablePath" の値を変更後、launchSettings.jsonを保存してください。 { "profiles": { "AutoCAD_2025_Plugin_CS1": { "commandName": "Project" }, "Acad": { "commandName": "Executable", "executablePath": "C:\\Program Files\\Autodesk\\AutoCAD 2025\\acad.exe" } } }   アンインストール Visual Studio 2022 の [機能拡張(X)] メニューから [Manage Extensions...] をクリックして [機能拡張の管理] ダイアログを表示させたら、「インストール済み」の機能拡張の中から「AutoCAD 2025 Template」を選択して、[アンインストール(U)] ボタンでアンインストール出来ます。
記事全体を表示
Autodesk Knowledge Network には、過去、よくある質問を中心に、次のような内容を記載していました。   Revit API Tips: 未使用の項目を削除を実行する方法 Revit API Tips: 壁プロファイルの取得方法 Revit API Tips: 複数のファミリを組み合わせて(ネストして)新しいファミリを作成する方法 Revit API Tips: ソリッドやメッシュのジオメトリをプロジェクト上に作図する方法 Revit API Tips: アドインでバッチ処理を実装する方法 InventorのAPIで、IDWファイルをバージョンを指定してDXFに変換する方法 InventorのPack And Go を、VBAから実行する場合の参照設定 Inventor APIでPDF出力後にPDFを表示しないようにしたい Inventor APIでコンテンツセンターの言語設定を切り替える方法 Inventor APIで放射状マーキングメニューをカスタマイズする方法 Inventorの2D図面に配置したView内の各コンポーネントを、AutoCADのブロックにする方法 Inventor API でインスタンスプロパティを取得・設定する方法 Inventor APIでiLogicを実行する方法 Inventor APIでアセンブリ、パートファイルの単位数量と基準単位を出力したい InventorのAPIで図面のシートをコピーする方法 Visual Studioで「InventorViewCtrl.ocxの自己登録に失敗しました」エラーが発生して、Inventor ViewコントロールをWindowsフォームへ追加することが出来ない InventorのFileAccessEvents.OnFileResolutionイベントでFullFileNameに指定したファイルが読み込まれない Inventor ApprenticeServerComponent.Openメソッドを実行すると、「エラー -xxx-xxxxxxxx(80004005) Openメソッドは失敗しました」が発生する APIでパーツリストの一覧をエクセルに出力する方法 API を用いて派生元のモデルの面から、派生先のモデルでの面を特定する方法 APIで、シートメタルの展開図の折り曲げ位置のエッジ線から、山折り/谷折の情報を参照する方法 API で面を指定して移動、削除を行う方法 Vault APIを使用して作成したカスタムアプリケーションからVaultにログインをするとFailed to acquire a license.ダイアログが表示されログインができない 「Valuts」のAPIを利用して、「Vault」で管理されているInventorアセンブリファイルと子のファイルをローカルフォルダに取得してInventorで開く方法 「Valuts」のAPIを利用して、「Vault」で管理されているInventorアセンブリファイルの構成情報を取得する方法 Vaultクライアントで表示されているファイル名と、Vault APIのFileAssoc.ExpectedVaultPathで取得した値が異なっている場合がある Managed .Net API でレイアウト空間のビューポート表示範囲のオブジェクトを取得する方法 AutoCAD .net APIででデータリンク元ファイルの変更の有無を知る方法 AutoCAD .net APIで球の中心座標を取得する方法 AutoCAD .net APIでDBTextの幅を取得する方法 AutoCAD .net APIで図面をブロックとして挿入すると、属性の編集ができない AutoCAD ObjectARX .net APIで3D上の中心点、半径、開始点、終了点、法線を指定して円弧を作成する方法 AutoCAD Plant3D .net APIでスペックエディターのカタログデータ内部品種類総数を取得する方法 AutoCAD Plant3D .net APIで流向記号の向きと、流向記号に結びついている配管を取得する方法 AutoCAD Plant3D .net APIでアイソメメッセージの注記を取得する方法 AutoCAD Plant3D APIで3Dモデルの配管のライン番号タグの値を取得する方法 AutoCAD MechanicalのAPIでパーツリストの値を取得する方法 AutoCAD Mechanical APIでパーツ参照の値を取得する方法 AutoLispでマルチ引出線のスタイルを設定する方法 AutoCAD .NET API :トグルボタンの実現 AutoCAD .NET API :ドラッグシーケンス中の画面移動 AutoCAD .NET API :未参照の PDF アンダーレイ参照の削除 AutoCAD .NET API:パージ処理の実装 AutoCAD .NET API :AutoLISP 関数の定義 AutoCAD .NET API :キーボード ボタン押下の検出 AutoCAD .NET API :ObjectARX 関数の P/Invoke AutoCAD .NET API :マウス左ボタン クリックの検出 AutoCAD .NET API :クロスヘア カーソル位置座標の取得 AutoCAD .NET API :属性値を維持した分解 AutoCAD .NET API :分解せずに寸法文字の情報を取得するには? AutoCAD .NET API:リボンタブの表示制御 AutoCAD .NET API :ユーザ座標系(UCS)の変更 AutoCAD .NET API :3D ソリッド構成面のサーフェス抽出 AutoCAD .NET API:3D ソリッドのエッジへのフィレット AutoCAD .NET API:特定領域の画像出力 AutoCAD .NET API :点がサーフェス上に位置しているか? AutoCAD .NET API :トポロジー情報のアクセス AutoCAD .NET API :画像データの図面への格納 AutoCAD .NET API :選択セットのセッション間の維持 AutoCAD .NET API :拡張ディクショナリの付加・取得・削除 AutoCAD .NET API :拡張エンティティ データの付加・取得・削除 AutoCAD .NET API :属性付きブロック定義とブロック参照の挿入 AutoCAD .NET API :ブロック参照の属性値の変更 AutoCAD .NET API :寸法スタイルに従属せずに寸法矢印を変更するには? AutoCAD .NET API :IGES ファイル出力 AutoCAD .NET API:パレット ダイアログを作成する方法 AutoCAD .NET API :サーフェスと線分の交点を得るには? AutoCAD .NET API :ポリラインの円弧セグメントの指定方法 AutoCAD .NET API:IExtensionApplication.Terminate() が呼び出されない AutoCAD .NET API :外部図⾯ファイル内のブロック定義の情報を現在の図⾯にコピーしたい AutoCAD .NET API :同⼀図⾯データベース内でオブジェクトを複写するには? AutoCAD .NET API:ブロック参照の分解挿入 AutoCAD .NET API :スイープ ソリッドとスイープ サーフェスの作成 AutoCAD .NET API :表示スタイルの変更 AutoCAD .NET API:指定した領域を ZOOM するには? AutoCAD .NET API :プリセットビューの変更 AutoCAD .NET API:図⾯監査の⾃動化は可能か? AutoCAD .NET API:図⾯修復を実装するには? AutoCAD .NET API:図面ウィンドウのタイル表示化 AutoCAD .NET API:パスに沿って押し出すソリッドの作成 AutoCAD .NET API :ロフト ソリッドとロフト サーフェスの作成 AutoCAD .NET API:起動中の AutoCAD が AutoCAD 単体か AutoCAD ベースの業種別製品か区別する方法 AutoCAD .NET API :外部図⾯データベースにオブジェクトを書き出したい ObjectARX:パージ機能の実装 ObjectARX :コマンド プロンプト メッセージの同期表示は可能なのか? ObjectARX:ObjectARX 開発者用ガイド ObjectARX:ObjectARX Wizards が動作しない AutoCAD VBA:自動ローダーで .dvb ファイルがロード出来ない AutoLISP:オブジェクトへの TrueColor 色の設定 AutoCAD API:「コマンドは 4 レベルより深くネストできません。」エラーについて AutoCAD API:ブール演算が失敗する AutoCAD API:Visual Studio 2019 に .NET Wizards が認識されない AutoCAD API:GetCanonicalMediaNames メソッドによる用紙サイズ名の変更について Inventor Apprentice Sever APIリファレンスはどこに有りますか? Inventor API で 外部EXEからカスタムアドインのメソッドの実行処理 Inventorプロジェクト.ipjファイルを変更する方法 アセンブリファイル内のコンポーネントファイルの物理的なファイル名を変更する方法 Vault API 関連の SDK や APIリファレンスはどこから入手できますか? AutoCAD ObjectARX Wizard を使用したカスタムコマンドの作成方法 ObjectARX Wizard 2015で作成したプロジェクトが他の PC の開発環境で開けない ObjectARX Wizard 2015 で新規にプロジェクトを作成できない Windows8.1 の ObjectARX Wizard 2015 で新規にプロジェクトを作成できない 混在開発PC環境にObjectARX Wizard 2015をインストールした時の問題 AutoCAD 2015 の ObjectARX で acedCommand のマイグレーション情報 AutoCAD .Net Wizard を使用した カスタムコマンドの作成 AutoCAD2016の .Net カスタムコマンドで APIによる PLOTコマンドを模倣する方法 Managed .Net API で UCS コマンドの W オプションを模倣する方法 VB.Net カスタムコマンド内で COM/ActiveX を使って PDFファイルの作成 AutoCAD の COM 利用でプロットの用紙サイズにセットする文字列 AutoCAD 2019 の Visual LISP エディタ (VLISP コマンド) で日本語表示&入力ができない AutoCAD の PDF 出力で [印刷可能領域] を変更するAPIはありますか? Mechanical製品で下位バージョンのMechanical DWG として保存する方法 Mechanical 2017 と 2018 の混在インストール PC 環境で 外部 EXE より Mechanical のタイプライブラリ を利用する問題 VB.NET外部EXEから純粋なAutoCAD製品とMechanical製品を起動する方法
記事全体を表示
Issue 連続実行で図形を順番に開いて、処理、保存しようとしています。図面を順次開く必要があるので、定義コマンドに CommandFlags.Session フラグを指定してアプリケーション実行コンテキスト コマンドにしていますが、この実行コンテキストだと、 開いた図面に対して Editor.Command メソッドでコマンド実行させることが出来ません。    次の C# コードでは、C:\temp フォルダ内の図面(.dwg)を順に開き、ZOOM コマンドを実行、図面を同じ名前で保存するものですが、ZOOM コマンドの実行で例外エラーになってしまいます。  [CommandMethod("UpdateDrawings", CommandFlags.Session)] public void UpdateDrawings() { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; DocumentCollection docMgr = Application.DocumentManager; Document doc = null; try { string[] fnames = Directory.GetFiles(@"c:\temp", "*.dwg"); foreach (string fname in fnames) { ed.WriteMessage("\n--- {0}", fname); doc = docMgr.Open(fname, false); Application.DocumentManager.MdiActiveDocument.Editor.Command("ZOOM", "E"); doc.CloseAndSave(fname); } } catch (Autodesk.AutoCAD.Runtime.Exception ex) { ed.WriteMessage("\n ERROR:{0}", ex.Message); } } なにかよい方法はないでしょうか?    Solution プリケーション実行コンテキスト コマンド(CommandFlags.Session フラグ指定コマンド)では、Editor.Command メソッドを利用したコマンドの同期コマンド呼び出しは出来ません。 今回のようなケースでは、通常、Document.SendStringToExecute メソッドで非同期的に実行させたいコマンドを送信することで、便宜上、ドキュメント実行コンテキスト でコマンド実行する対応が考えられます。 また、実行する内容にもよりますが、AutoCAD .NET API 環境では、DocumentCollection.ExecuteInCommandContextAsync メソッドを用いることで、アプリケーション実行コンテキスト コマンド内でドキュメント実行コンテキストを非同期的(Async/Await)にコマンド実行することも可能です。 [CommandMethod("UpdateDrawings", CommandFlags.Session)] public async void UpdateDrawings() { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; DocumentCollection docMgr = Application.DocumentManager; Document doc = null; try { string[] fnames = Directory.GetFiles(@"c:\temp", "*.dwg"); foreach (string fname in fnames) { ed.WriteMessage("\n--- {0}", fname); doc = docMgr.Open(fname, false); await Application.DocumentManager.ExecuteInCommandContextAsync( async (obj) => { await Application.DocumentManager.MdiActiveDocument.Editor.CommandAsync("ZOOM", "E"); }, null ); doc.CloseAndSave(fname); } } catch (Autodesk.AutoCAD.Runtime.Exception ex) { ed.WriteMessage("\n ERROR:{0}", ex.Message); } } 同様に、 スクリプト(.scr)を用いた処理も考えることも出来ます。 ご参考:AutoCAD 雑学:図面のサムネイル画像 - Technology Perspective from Japan (typepad.com)
記事全体を表示
Issue ObjectARX Wizard の入手とインストール方法について押してください。   Solution ObjectARX Wizard は、https://aps.autodesk.com/developer/overview/autocad ページからダウンロードすることが出来ます。また、対応するバージョン毎に Github リポジトリからダウンロードすることも出来ます。   例えば、AutoCAD 2025 用の ObjectARX Wizard は、https://github.com/ADN-DevTech/ObjectARX-Wizards/raw/ForAutoCAD2025/ObjectARXWizardsInstaller/ObjectARXWizard.zip からダウンロードすることが出来ます。   ObjectARX Wizard のインストールでは、次の点に注意してインストールすることをお勧めします。 インストーラにデジタル署名がない旨の警告へ対応する。 管理者権限で起動したコマンドプロンプトで msiexec を使ってインストールする。 インストール時に Windows の ユーザーアカウント制御(UAC)の設定を オフ にする。 各注意点の詳細は、次のとおりです。   1.インストーラにデジタル署名がないない旨の警告へ対応する ObjectARX Wizard のインストーラ(.msi ファイル)にはデジタル署名が施されていないため、インストーラを起動しても警告が表示されてしまいます。インストール時には、次の手順でインストーラを実行してください。   2.管理者権限ドで起動したコマンドプロンプトで msiexec を使ってインストールする​ コマンド プロンプトを管理者権限で起動するには、スタート ボタンから [Windows システム ツール] >> [コマンド プロンプト] を見つけて、マウスの右ボタン メニューから [その他] >> [管理者として実行] を選択してください。 管理者権限で起動したコマンド プロンプトから、次のように、msiexec を使って ObjectARX Wizard をインストールしてください。 msiexec /i <ObjectARXWizardsName>.msi   3.インストール時に Windows の ユーザーアカウント制御(UAC)の設定を オフ にする 上記 1. ~ 2. でインストールしても ObjectARX Wizard が正しく動作しない場合は、ユーザ アカウント制御 (UAC)  の設定を一時的に無効にしてから再インストールすることをお勧めします。UAC を無効にしないと、インストール自体が成功しても、システム レジストリへの書き込みが出来ていない場合があります。    インストール中の RDS 入力について Registreterd Developer Symbol(RDS) は、アプリケーションの開発元を識別し てアプリケーション間で登録されたコマンドの競合を防ぐために使用されていましたが、.NET API への移行も進んだため、その役割を終えて、現在、登録サイトは削除されています。インストール中の次の画面では、単に任意の半角アルファベット 4 文字を入力してください。
記事全体を表示
Issue Excel VBA から Excel シート上のテーブル値に応じた作図が出来ますか?   Solution AutoCAD の ActiveX オートメーションは、Windows の COM 機構を利用します。AutoCAD のカスタマイズを手助けする AutoCAD API のとおり、Microsoft Office 製品は、自身の機能を COM サーバー として公開、内部の VBA を COM クライアントとして公開しているので、AutoCAD VBA から Excel を操作したり、Excel VBA から AutoCAD を操作することが出来ます。     Excel VBA から AutoCAD の ActiveX オートメーション インタフェースを利用するには、Excel VBA からAutoCAD オブジェクト情報を公開している AutoCAD タイプライブラリ(AutoCAD Type Library)を参照設定するだけです。    次のコードは、Excel の「精密テーブル」タブのテーブル上のカーソル列の値を読み取って、AutoCAD 図面のモデル空間に「精密滑車」ブロックを挿入するものです。   Option Explicit Public Sub CommandButton1_Click() On Error Resume Next Dim oApp As AcadApplication Set oApp = GetObject(, "AutoCAD.Application.25") If Err Then Debug.Print "AutoCAD が起動されていません..." Set oApp = CreateObject("AutoCAD.Application.25") End If oApp.Visible = True If oApp.Documents.Count = 0 Then MsgBox "アクティブな図面がありません..." Exit Sub End If Dim oDoc As AcadDocument Set oDoc = oApp.ActiveDocument oDoc.SetVariable "DIMASZ", 0.1 oDoc.SetVariable "DIMEXE", 0.2 oDoc.SetVariable "DIMEXO", 0.1 oDoc.SetVariable "DIMGAP", 0.02 oDoc.SetVariable "DIMTXT", 0.1 Call oDoc.ActiveDimStyle.CopyFrom(oDoc) Dim oModel As AcadModelSpace Set oModel = oDoc.ModelSpace Dim oEntity As AcadEntity For Each oEntity In oModel If oEntity.ObjectName = "AcDbBlockReference" Then Dim oBlockRef As AcadBlockReference Set oBlockRef = oEntity If oBlockRef.Name = "精密滑車" Then oBlockRef.Delete End If End If Next Err.Clear oDoc.Regen (acActiveViewport) Dim ptBase As Variant ptBase(0) = 0#: ptBase(1) = 0# Dim oBlock As AcadBlock Set oBlock = Nothing Set oBlock = oDoc.Blocks.Item("精密滑車") If oBlock Is Nothing Then Set oBlock = oDoc.Blocks.Add(ptBase, "精密滑車") Else For Each oEntity In oBlock oEntity.Delete Next End If Dim SelectedRange As Range Set SelectedRange = Application.ActiveCell Dim SelectedRow As Long SelectedRow = SelectedRange.Row Dim OD As Double Dim Bore As Double Dim A As Double Dim B As Double OD = Sheets("滑車テーブル").Cells(SelectedRow, 2) Bore = Sheets("滑車テーブル").Cells(SelectedRow, 3) A = Sheets("滑車テーブル").Cells(SelectedRow, 4) B = Sheets("滑車テーブル").Cells(SelectedRow, 5) Dim ptVertexs(0 To 17) As Double ptVertexs(0) = 0#: ptVertexs(1) = Bore * -0.5 ptVertexs(2) = ptVertexs(0): ptVertexs(3) = A * -0.5 ptVertexs(4) = B: ptVertexs(5) = ptVertexs(3) ptVertexs(6) = ptVertexs(4): ptVertexs(7) = ptVertexs(3) - (OD - A) * 0.5 ptVertexs(8) = ptVertexs(6) + 0.05: ptVertexs(9) = ptVertexs(7) ptVertexs(10) = ptVertexs(8) + 0.15: ptVertexs(11) = ptVertexs(9) ptVertexs(12) = ptVertexs(10) + 0.05: ptVertexs(13) = ptVertexs(9) ptVertexs(14) = ptVertexs(12): ptVertexs(15) = ptVertexs(1) ptVertexs(16) = ptVertexs(0): ptVertexs(17) = ptVertexs(1) Dim oPLine As AcadLWPolyline Set oPLine = oBlock.AddLightWeightPolyline(ptVertexs) oPLine.SetBulge 4, -0.5 Dim oLoop1(0 To 0) As AcadEntity Set oLoop1(0) = oPLine Dim pt1(0 To 2) As Double Dim pt2(0 To 2) As Double pt1(0) = 0#: pt1(1) = 0#: pt1(2) = 0# pt2(0) = ptVertexs(14): pt2(1) = 0#: pt2(2) = 0# Dim oColor As AcadAcCmColor Set oColor = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.25") Call oColor.SetRGB(255, 0, 0) Dim oHatch1 As AcadHatch Set oHatch1 = oBlock.AddHatch(acHatchPatternTypePreDefined, "ANSI31", True, acHatchObject) oHatch1.AppendOuterLoop (oLoop1) oHatch1.PatternScale = 0.01 oHatch1.TrueColor = oColor oHatch1.Evaluate Dim oLoop2(0 To 0) As AcadEntity Set oLoop2(0) = oLoop1(0).Mirror(pt1, pt2) Dim oHatch2 As AcadHatch Set oHatch2 = oBlock.AddHatch(acHatchPatternTypePreDefined, "ANSI31", True, acHatchObject) oHatch2.AppendOuterLoop (oLoop2) oHatch2.PatternScale = 0.01 oHatch2.TrueColor = oColor oHatch2.Evaluate pt1(0) = 0#: pt1(1) = Bore * -0.5: pt1(2) = 0# pt2(0) = 0#: pt2(1) = pt1(1) + Bore: pt2(2) = 0# Call oBlock.AddLine(pt1, pt2) pt1(0) = ptVertexs(12) pt2(0) = ptVertexs(12) Call oBlock.AddLine(pt1, pt2) Dim oDimAligned As AcadDimAligned Dim ptLoc(0 To 2) As Double pt1(0) = ptVertexs(12): pt1(1) = ptVertexs(11) pt2(0) = ptVertexs(12): pt2(1) = pt1(1) + OD ptLoc(0) = pt1(0) + 1.2: ptLoc(1) = Abs(pt1(1) - pt2(1)) * 0.5: ptLoc(2) = 0# Set oDimAligned = oBlock.AddDimAligned(pt1, pt2, ptLoc) pt1(0) = ptVertexs(0): pt1(1) = ptVertexs(7) + A + (OD - A) pt2(0) = ptVertexs(0) + B: pt2(1) = ptVertexs(7) + A + (OD - A) ptLoc(0) = Abs(pt1(0) - pt2(0)) * 0.5: ptLoc(1) = pt1(1) + 1# Set oDimAligned = oBlock.AddDimAligned(pt1, pt2, ptLoc) pt1(0) = ptVertexs(0): pt1(1) = ptVertexs(3) pt2(0) = ptVertexs(0): pt2(1) = pt1(1) + A ptLoc(0) = pt1(0) - 1.2: ptLoc(1) = Abs(pt1(1) - pt2(1)) * 0.5 Set oDimAligned = oBlock.AddDimAligned(pt1, pt2, ptLoc) pt1(0) = ptVertexs(0): pt1(1) = ptVertexs(3) + (A - Bore) * 0.5 pt2(0) = ptVertexs(0): pt2(1) = pt1(1) + Bore ptLoc(0) = pt1(0) - 0.75: ptLoc(1) = Abs(pt1(1) - pt2(1)) * 0.5 Set oDimAligned = oBlock.AddDimAligned(pt1, pt2, ptLoc) '挿入基点を指定する場合 'Dim ptInsert As Variant 'oDoc.Utility.InitializeUserInput 1 'ptInsert = oDoc.Utility.GetPoint(, vbCrLf & "挿入点を指定:") '挿入基点を原点で固定する場合 Dim ptInsert(0 To 2) As Double ptInsert(0) = 0#: ptInsert(1) = 0# Call oModel.InsertBlock(ptInsert, "精密滑車", 1#, 1#, 1#, 0#) oApp.ZoomExtents End Sub
記事全体を表示
Issue VBA コードでブロック参照に設定されているブロック属性を取得する手順を教えてください。   Solution 挿入されているブロック参照は AcadBlockReference オブジェクト として取得することが出来ます。   AcadBlockReference オブジェクト には属性を取得する GetAttributes メソッド が用意されているので、このメソッドを介して各属性の情報を取得することが出来ます。   なお、ブロック参照の定義情報であるブロック定義(Block オブジェクト)には複数の属性定義(Attribute オブジェクト)を登録出来るので、 GetAttributes メソッドが複数が属性(AttributeReference オブジェクト)を扱えるよう、配列を返すことにご注意ください。   次の例は、選択したブロック参照から属性のタグと値を表示するコードです。VBA コード上、 GetAttributes メソッドが返すのが Variant 型になっています。   Public Sub GetBlockAttribute() Dim returnObj As AcadObject Dim basePnt As Variant On Error Resume Next ThisDrawing.Utility.GetEntity returnObj, basePnt, "ブロック参照を選択:" If Err = 0 Then If returnObj.EntityName = "AcDbBlockReference" Then Dim blkRef As AcadBlockReference Set blkRef = returnObj ThisDrawing.Utility.Prompt vbCrLf & blkRef.Name & " ブロック参照が選択されました." Dim varAttributes As Variant varAttributes = blkRef.GetAttributes If UBound(varAttributes) < 0 Then ThisDrawing.Utility.Prompt vbCrLf & "ブロック参照に属性がありません..." Else Dim strAttributes As String For Each blkAttr In varAttributes strAttributes = "" strAttributes = strAttributes & " タグ名: " & blkAttr.TagString & " - 属性値 " & blkAttr.TextString & vbLf & " " ThisDrawing.Utility.Prompt vbCrLf & strAttributes Next End If ElseIf returnObj.EntityName <> " AcDbBlockReference" Then ThisDrawing.Utility.Prompt vbCrLf & "ブロック参照ではありません..." End If Else ThisDrawing.Utility.Prompt vbCrLf & "何も選択されませんでした..." End If End Sub    
記事全体を表示
Issue オンラインヘルプ「レイアウトをパブリッシュする(.NET) 」の例では、PublishExecute メソッドを利用して DSD ファイルを使ったバッチ印刷の方法を説明しています。ただし、この例では "DWG to PDF.PC3" を指定してプロッタ環境設定をオーバーライド(上書き)しています。 印刷対象のレイアウトに設定されたページ設定を利用してバッチ印刷する方法はありますか?   Solution PublishDsd メソッドで、定義済みのページ設定(印刷デバイスと設定)を使用してレイアウトを印刷、または、/ファイル出力することが出来ます。この場合、また、DsdData.SheetType の値を SheetType.OriginalDevice に指定することで、プロッタ環境設定(.pc3)を指定せずに連続印刷をおこなうことが可能です。 次のコードは、その C# 例です。 Try Dim collection As DsdEntryCollection = New DsdEntryCollection() Dim entry As DsdEntry entry = New DsdEntry() entry.Layout = "レイアウト1" entry.DwgName = "c:\Temp\Drawing1.dwg" entry.Nps = "Setup1" entry.Title = "Sheet1" collection.Add(entry) entry = New DsdEntry() entry.Layout = "レイアウト1" entry.DwgName = "c:\Temp\Drawing2.dwg" entry.Nps = "Setup1" entry.Title = "Sheet2" collection.Add(entry) Dim dsd As DsdData = New DsdData() dsd.SetDsdEntryCollection(collection) dsd.ProjectPath = "c:\Temp\" dsd.LogFilePath = "c:\Temp\logdwf.log" dsd.SheetType = SheetType.OriginalDevice dsd.NoOfCopies = 1 dsd.SheetSetName = "PublisherSet" dsd.WriteDsd("c:\Temp\publisher.dsd") Dim nbSheets As Integer = collection.Count Using progressDlg As PlotProgressDialog = New PlotProgressDialog(False, nbSheets, True) progressDlg.UpperPlotProgressRange = 100 progressDlg.LowerPlotProgressRange = 0 progressDlg.UpperSheetProgressRange = 100 progressDlg.LowerSheetProgressRange = 0 progressDlg.IsVisible = True Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", 0) Dim publisher As Autodesk.AutoCAD.Publishing.Publisher = Autodesk.AutoCAD.ApplicationServices.Application.Publisher publisher.PublishDsd("c:\Temp\publisher.dsd", progressDlg) progressDlg.Destroy() End Using Catch ex As Autodesk.AutoCAD.Runtime.Exception MsgBox(ex.Message) End Try End Sub なお、PublishDsd メソッドを使用して DSD ファイルをパブリッシュする前に、BACKGROUNDPLOT システム変数を 0 に設定する必要があります。
記事全体を表示
Issue 選択セットで条件に合った複数のオブジェクトを取得する際、特定の座標を持つ要素を条件に設定するにはどうしたらいいでしょうか?   Solution 選択セットのフィルタリングで座標を扱う際には、オンラインヘルプ 概要 - 選択セットのフィルタ リストでの関係テスト(AutoLISP) で触れられている、カンマ区切りで関係演算子を利用する方法を利用することが出来ます。   点グループ コードの場合、X、Y、Z に対するテストを結合して単一の文字列にできます。このとき、各演算子をカンマで区切ります(たとえば、">,>,*")。文字列から演算子を省略すると、すべてを選択する演算子 "*" とみなされます(たとえば、"=,<>" では Z がチェックされません)。 次のコードは、円オブジェクトの中心のX 座標が 123.45 以上123.46 以下で、Y 座標が 500.0、Z 座標値を無視するフィルタリングを指定した C# コードの例です。 Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; TypedValue[] typeAry = new TypedValue[9]; typeAry.SetValue(new TypedValue((int)DxfCode.Operator, "<and"), 0); typeAry.SetValue(new TypedValue((int)DxfCode.Start, "CIRCLE"), 1); typeAry.SetValue(new TypedValue((int)DxfCode.Operator, "<and"), 2); typeAry.SetValue(new TypedValue((int)DxfCode.Operator, ">=,=,*"), 3); typeAry.SetValue(new TypedValue((int)DxfCode.XCoordinate, new Point3d(123.45, 500.0, 0.0)), 4); typeAry.SetValue(new TypedValue((int)DxfCode.Operator, "<=,=,*"), 5); typeAry.SetValue(new TypedValue((int)DxfCode.XCoordinate, new Point3d(123.46, 500.0, 0.0)), 6); typeAry.SetValue(new TypedValue((int)DxfCode.Operator, "and>"), 7); typeAry.SetValue(new TypedValue((int)DxfCode.Operator, "and>"), 8); SelectionFilter filter = new SelectionFilter(typeAry); PromptSelectionResult psr = ed.SelectAll(filter); if (psr.Status == PromptStatus.OK) { SelectionSet sset = psr.Value; ed.WriteMessage("\nNumber of objects selected : {0}", sset.Count.ToString()); ObjectIdCollection objIds = new ObjectIdCollection(sset.GetObjectIds()); using (Transaction tr = db.TransactionManager.StartTransaction()) { Entity ent; foreach (ObjectId objId in objIds) { ent = (Entity)tr.GetObject(objId, OpenMode.ForRead); ent.Highlight(); } tr.Commit(); } } else { Application.ShowAlertDialog("\nNumber of objects selected: 0"); }  
記事全体を表示
Issue 次のような「MS Pゴシック」を持つ文字スタイルを作成したいのですが、TextStyleTableRecord.FileName プロパティへの指定方法がわかりません。 どうすれば「MS Pゴシック」を指定することが出来ますか?   Solution 「MS Pゴシック」フォントは、TrueType Collection ファイルとして「MS ゴシック」や「MS UI Gothic」などと共に定義されています。   定義ファイル名は msgothic.ttc になり、FileName プロパティが要求する .ttf ファイルに合致しないため、同プロパティに指定することが出来ません。   この場合、.次のコードのように、ttf に分解した状態のファイル名で指定することが可能です。   Database db = HostApplicationServices.WorkingDatabase; Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; using (Transaction tr = db.TransactionManager.StartTransaction()) { TextStyleTable tbl = (TextStyleTable)tr.GetObject(db.TextStyleTableId, OpenMode.ForWrite); if (!tbl.Has("スタイル1")) { TextStyleTableRecord rec = new TextStyleTableRecord(); rec.Name = "スタイル1"; rec.FileName = "MS PGothic.ttf"; tbl.Add(rec); tr.AddNewlyCreatedDBObject(rec, true); } else { ed.WriteMessage("\nスタイル1 文字スタイルは既に登録されています..."); } tr.Commit(); }   また、オンラインヘルプ フォントを割り当てる(.NET) のように  FontDescriptor オブジェクトで指定することも出来ます。  Database db = HostApplicationServices.WorkingDatabase; Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; using (Transaction tr = db.TransactionManager.StartTransaction()) { TextStyleTable tbl = (TextStyleTable)tr.GetObject(db.TextStyleTableId, OpenMode.ForWrite); if (!tbl.Has("スタイル1")) { TextStyleTableRecord rec = new TextStyleTableRecord(); rec.Name = "スタイル1"; tbl.Add(rec); rec.Font = new FontDescriptor("MS Pゴシック", false, false, 128, 50); tr.AddNewlyCreatedDBObject(rec, true); } else { ed.WriteMessage("\nスタイル1 文字スタイルは既に登録されています..."); } tr.Commit(); }   ご参考: 128 - FontDescriptor.CharacterSet 値:LOGFONT 構造体 の lfCharSet 50 - FontDescriptor.PitchAndFamily 値:LOGFONT 構造体 の lfPitchAndFamily
記事全体を表示
Issue AutoCAD のダイナミック ブロックについて、VBA でどの程度操作ができるかわかりません。 モデル空間などに配置されているダイナミック ブロックのパラメータの状態を取得したり、パラメータの値を更新して、形状や表示状態を変更することはできますか?   Solution ダイナミックブロックとして配置されているブロック参照からは、ある程度の情報を取得したり、その値を変化させることができます。ただし、現在のバージョンでは一部制限があるため、すべての情報の制御や、パラメータ間の関連付けを得ることができません。   ブロック参照からダイナミックブロック固有の情報にアクセスするには、AcadBlockReference オブジェクトの GetDynamicBlockProperties メソッドを使用して、パラメータ情報を含むコレクションを取得します。このコレクションには、DynamicBlockReferenceProperty オブジェクトがパラメータ(アクションとの組み合わせ)数分含まれます。   DynamicBlockReferenceProperty オブジェクトを取得した後は、このオブジェクトが持つプロパティを使って、パラメータ別の情報にアクセスできます。つまり、ダイナミック ブロック参照の現在の設定値を得ることが可能です。   なお、パラメータによっては、ルックアップ テーブルや可視テーブルなど、リスト化された情報も存在します。このような場面では、パラメータを表す DynamicBlockReferenceProperty.Value プロパティは配列として返されます。これをチェックすれば、その内容を AllowedValues プロパティから閲覧することもできます。   添付のコードは、ダイナミックブロックの情報を取得する例です。   Dim nDataIndex As Long Dim vDataInfo As Variant Dim oData As AcadDynamicBlockReferenceProperty Dim nListIndex As Long Dim vListInfo As Variant Dim nRound As Integer Dim oEnt As AcadEntity Dim oBlkRef As AcadBlockReference nRound = ThisDrawing.GetVariable("LUPREC") For Each pEnt In ThisDrawing.ModelSpace If pEnt.ObjectName = "AcDbBlockReference" Then Set oBlkRef = pEnt If oBlkRef.IsDynamicBlock Then ThisDrawing.Utility.Prompt vbCrLf & "***** ダイナミックブロック - " ThisDrawing.Utility.Prompt oBlkRef.EffectiveName & " : " & oBlkRef.Name nCtrlIndex = 1 For nDataIndex = LBound(oBlkRef.GetDynamicBlockProperties) To UBound(oBlkRef.GetDynamicBlockProperties) Set oData = oBlkRef.GetDynamicBlockProperties(nDataIndex) If oData.show Then ' パラメータ名ラベル ThisDrawing.Utility.Prompt vbCrLf & oData.PropertyName & " : " ' パラメータが配列か確認 vDataInfo = oData.Value If IsArray(vDataInfo) Then ' 座標データの場合 ThisDrawing.Utility.Prompt Round(vDataInfo(0), nRound) & "," & Round(vDataInfo(1), nRound) & "," & Round(vDataInfo(2), nRound) Else ' リスト要素か確認 vListInfo = oData.AllowedValues If UBound(vListInfo) > 0 Then ' リスト要素の場合 For nListIndex = LBound(vListInfo) To UBound(vListInfo) If VarType(vDataInfo) = vbDouble Then ThisDrawing.Utility.Prompt vbCrLf & vbTab & CStr(Round(vListInfo(nListIndex), nRound)) Else ThisDrawing.Utility.Prompt vbCrLf & vbTab & vListInfo(nListIndex) End If Next nListIndex If VarType(vDataInfo) = vbDouble Then ThisDrawing.Utility.Prompt vbCrLf & vbTab & "現在値 : " & CStr(Round(vDataInfo, nRound)) Else ThisDrawing.Utility.Prompt vbCrLf & vbTab & "現在値 : " & vDataInfo End If Else ' 通常データの場合 If VarType(vDataInfo) = vbDouble Then ThisDrawing.Utility.Prompt Round(vDataInfo, nRound) Else ThisDrawing.Utility.Prompt vDataInfo End If End If End If End If ThisDrawing.Utility.Prompt vbCrLf Next End If End If Next
記事全体を表示
長期にわたる Autodesk App Store 運営の知見を反映するかたちで、Windows 版 AutoCAD 2026 でパッケージ バンドルを利用した自動ローダーに重要な変更が加えられています。アドイン アプリ運用時のセキュリティを向上させるのが目的です。   従来のパッケージの検出では次の 3 か所のフォルダを利用することが出来ました。   一般的なインストール フォルダ Windows: %PROGRAMFILES%¥Autodesk¥ApplicationPlugins Mac OS: /Applications/Autodesk/ApplicationAddins すべてのユーザ プロファイル フォルダ Windows: %PROGRAMDATA%¥Autodesk¥ApplicationPlugins Mac OS: 該当なし ユーザ プロファイル フォルダ Windows: %APPDATA%¥Autodesk¥ApplicationPlugins Mac OS: ~/Library/Application Support/Autodesk/ApplicationAddins Windows 版 AutoCAD 2026 では、%ProgramData%\Autodesk\ApplicationPlugins(通常はC:\ProgramData\Autodesk\ApplicationPlugins)フォルダに配置したパッケージ バンドルからのアドイン アプリの自動ロードを抑止します。   このため、従来、%ProgramData%\Autodesk\ApplicationPlugins フォルダを利用していたアドイン アプリは、%PROGRAMFILES%¥Autodesk¥ApplicationPlugins フォルダ、または、%APPDATA%¥Autodesk¥ApplicationPlugins フォルダにパッケージ バンドルの配置を変更する必要があります。   %ProgramData%\Autodesk\ApplicationPlugins フォルダを利用する利点は、Windows 上のすべてのユーザー環境下で、AutoCAD にアドインを識別・ロードさせることが出来る点にありましたが、逆にすべてのユーザが書き込み可能な権限を持つことになり、潜在的なセキュリティの脆弱性を生む可能性があります。   一方、%PROGRAMFILES%¥Autodesk¥ApplicationPlugins フォルダ、または、%APPDATA%¥Autodesk¥ApplicationPlugins フォルダへの書き込みには管理者権限を必要とするため、この点で安全なインストールを保証することが出来ます。   %ProgramData%\Autodesk\ApplicationPlugins フォルダを利用する必要がある場合には、システム レジストリの  \HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R25.1\ACAD-9101\Applications\AcadAutoLoader に DWORD 値 1 を持つ LoadFromProgramData キーを追加することで、従来の動作を復元することも出来ます。ただし、前述のセキュリティ上の観点から非推奨となります。   一度、LoadFromProgramData キーを作成して AutoCAD がパッケージを識別すると、キーの値を 0 にしたり、キー自体を削除しても、パッケージを検出するようになりますのでご注意ください。   特に、デジタル署名されていないアドイン ファイルに対して、初回ロード時に [常にロードする] を選択してしまうと、無条件にパッケージ バンドル内のアドイン アプリをロードするようになってしまいます。     初期状態の動作に戻すには、AutoCAD 2026 の再インストールが必要になります。
記事全体を表示
Issue FIELD コマンドで選択したオブジェクトの面積をフィールド文字として作成することは出来ますか?        Solution AutoCAD .NET API では、文字(DBText)または、マルチテキスト(MText)ブロックを作成後、[フィールド] ダイアログ下部に表示される「フィールド式」を SetField メソッドで設定することで、特定のオブジェクトを参照するフィールド文字を作成することが出来ます。     フィールド式中の _ObjId の値は、選択したオブジェクトの ObjectId 値になります。 次の C# コードは、ポリラインの面積をフィールド文字として作図する例です。   [CommandMethod("MyCommand")] public void MyCommand() // This method can have any name { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; PromptEntityOptions options = new PromptEntityOptions("\nポリラインを選択:"); options.SetRejectMessage("\nポリラインを選択"); options.AddAllowedClass(typeof(Autodesk.AutoCAD.DatabaseServices.Polyline), false); PromptEntityResult acSSPrompt = ed.GetEntity(options); if (acSSPrompt.Status != PromptStatus.OK) return; PromptPointOptions ppo = new PromptPointOptions("\n挿入点を指示:"); PromptPointResult ppr = ed.GetPoint(ppo); if (ppr.Status != PromptStatus.OK) return; using (Transaction tr = db.TransactionManager.StartTransaction()) { // %<\AcObjProp.16.2 Object(%<\_ObjId 3132455955584>%).Area \f "%lu2%pr1%ps[面積:, ㎡]%ct8[0.001]">% string strId = acSSPrompt.ObjectId.OldIdPtr.ToString(); string str1 = "%<\\AcObjProp.16.2 Object(%<\\_ObjId "; string str2 = ">%).Area \\f \"%lu2%pr1%ps[面積:, ㎡]%ct8[0.001]\">%"; string format = str1 + strId + str2; DBText text = new DBText(); text.Height = 10.0; text.Position = ppr.Value; ObjectId objId = SymbolUtilityServices.GetBlockModelSpaceId(db); BlockTableRecord btr = tr.GetObject(objId, OpenMode.ForWrite) as BlockTableRecord; btr.AppendEntity(text); tr.AddNewlyCreatedDBObject(text, true); Field entField = new Field(format); entField.Evaluate(); text.SetField(entField); tr.AddNewlyCreatedDBObject(entField, true); tr.Commit(); } }   作図したフィールド文字は、参照したポリラインの変化に追従するようになります。  
記事全体を表示
管理者権限で起動したコマンドプロンプトから ObjectARX Wizards をインストール後、正常にインストールが完了しても、Visual Studio で新規にプロジェクトを作成する際、 ObjectARX Wizards テンプレートがリストされない場合があります。同じ状況でインストールした AutoCAD .NET Wizards は正しく表示されています。  このような場面では、Visual Studio が使用するキャッシュ情報を削除するか、Visual Studio 2022 をアップデートすることで、ObjectARX Wizards  を認識、読み込むことが出来る可能性があります。   1. MEF キャッシュをクリーンアップする ディスク上の MEF キャッシュをクリアし、Visual Studio にキャッシュ情報を再構築させる。 MEF キャッシュをクリアする理由は、キャッシュが破損している可能性があるためです。これは通常、拡張機能または他の Visual Studio コンポーネントをインストールまたは更新するときに発生します。コマンドプロンプトから次のフォルダに移動、フォルダ内のファイルを削除して、Visual Studio を再起動します。   %LOCALAPPDATA%\Microsoft\VisualStudio\<Instance>\ComponentModelCache   例) <Instance> の部分は、Visual Studio バージョンや使用環境によって変化します。(下記の例では 17.0_c96a97f2、17.0 はVisual Stufio 2022 の場合) C:\Users\<username>\AppData\Local\Microsoft\VisualStudio\17.0_c96a97f2\ComponentModelCache   2 . Visual Studio を最新のアップデートに更新します。   Visual Studio を再起動して [新しいプロジェクトの作成] ダイアログを表示させると、強制的にキャッシュの再構築がおこなわれます。この操作でも ObjectARX Wizards が表示されないようなら、検索ボックスに ObjectARX などと入力してみてください。  もし、ここまでの手順を踏んでも Wizard が表示されないようでしたら、Developer Command Prompt を管理者権限で起動後、devenv /updateconfiguration /resetextensions と入力して実行してみてください。 処理完了を待って、再度、Visual Studuo を起動後、 [新しいプロジェクトの作成] ダイアログを表示させると ObjectARX Wizard が表示されるようになる場合があります。  
記事全体を表示
質問 AutoCADのActiveX APIを.NET アプリケーションから実行すると「呼び出し先が呼び出しを拒否しました。 (HRESULT からの例外:0x80010001 (RPC_E_CALL_REJECTED))」エラーが発生することがある。 毎回同じAutoCADのAPIの実行でエラーが発生するわけではなく、また発生頻度もまちまち(発生せずに実行できる場合もある)で規則性は見られない状況。   回答 AutoCADがビジー状態(=何らかの処理中)にあるために、Remote Procedure Call (ここでは、カスタムアプリーケーションからの、AutoCADのAPIの呼び出し)を受け付けることが出来ない状態であるため、APIの呼出しが拒否されている可能性が高い状況です。 外部プロセスからのAcitveX APIの実行は、Windowsの低レベルレイヤーではクライアントアプリケーション(この場合は外部プロセスのカスタムアプリ)が、サーバ側のアプリケーション(この場合はAutoCAD)のメインスレッドに対してWindows Messageを送信する形で、プロセス間でのAPIの実行が行われています。   このため、AutoCAD側のメインスレッドが何らかの別の処理を行っている状態にある場合、Windows Messageが処理されず呼び出し元のアプリケーションは待ちの状態となります。 呼び出し元のアプリケーションが無限に処理待ちの状態となってしまうことを防ぐ機構として、一定時間の経過後に例外を送信する仕組みがActiveXに備わっており、タイトルにあるようなエラーとして出現いたします。   通常は、AcitveXの実行系のデフオルトのリトライ処理で問題なくAPIを実行することが出来ますが、実行環境の状態や処理内容に依存して、エラーが発生するケースがあります。このような場合カスタムプログラム側でIMessageFilterのRetryRejectedCallで、ActiveX APIの呼び出しをリトライをする機構を実装することにより、状況が改善する可能性があります。   以下のブログ記事にて、C#でのIMessageFilterのリトライ処理を実装のサンプルコードが掲載されております。 https://www.keanw.com/2010/02/handling-com-calls-rejected-by-autocad-from-an-external-net-application.html   また、以下のサンプルコードは、上記ブログ記事の IMessageFilterのリトライ処理部をVB.NETに置き換えたものとなります。 Imports System.Runtime.InteropServices Imports Microsoft.Win32 Imports System Imports Microsoft.VisualBasic <ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00000016-0000-0000-C000-000000000046")> Public Interface IMessageFilter <PreserveSig()> Function HandleInComingCall(ByVal dwCallType As Integer, ByVal hTaskCaller As IntPtr, ByVal dwTickCount As Integer, ByVal lpInterfaceInfo As IntPtr) As Integer <PreserveSig()> Function RetryRejectedCall(ByVal hTaskCallee As IntPtr, ByVal dwTickCount As Integer, ByVal dwRejectType As Integer) As Integer <PreserveSig()> Function MessagePending(ByVal hTaskCallee As IntPtr, ByVal dwTickCount As Integer, ByVal dwPendingType As Integer) As Integer End Interface Public Class Form1 Implements IMessageFilter Public Sub New() InitializeComponent() Dim oldFilter As IMessageFilter = Nothing CoRegisterMessageFilter(Me, oldFilter) End Sub Private Function IMessageFilter_HandleInComingCall(ByVal dwCallType As Integer, ByVal hTaskCaller As IntPtr, ByVal dwTickCount As Integer, ByVal lpInterfaceInfo As IntPtr) As Integer Implements IMessageFilter.HandleInComingCall Return 0 End Function Private Function IMessageFilter_RetryRejectedCall(ByVal hTaskCallee As IntPtr, ByVal dwTickCount As Integer, ByVal dwRejectType As Integer) As Integer Implements IMessageFilter.RetryRejectedCall 'retry in a second. Return 1000 End Function Private Function IMessageFilter_MessagePending(ByVal hTaskCallee As IntPtr, ByVal dwTickCount As Integer, ByVal dwPendingType As Integer) As Integer Implements IMessageFilter.MessagePending Return 1 End Function <DllImport("ole32.dll")> Private Shared Function CoRegisterMessageFilter(ByVal lpMessageFilter As IMessageFilter, ByRef lplpMessageFilter As IMessageFilter) As Integer End Function End Class    
記事全体を表示
Issue 現在オープンしている図面の図形を別の図面にコピーしたいのですが、コピー元の図形が参照している画層や線種を一緒にコピーすることは出来ますか?   もし、可能なら、寸法をコピーする際に参照している寸法スタイルを、テキスト文字をコピーする際に参照している文字スタイルを同時にコピー出来ると便利です。   Solution AutoCAD には、オブジェクトの参照関係(つながり)を維持したままコピーをおこなう ディープクローン という機構が存在しています。   ディープクローンを使用すると、図形そのもののコピーだけでなく、そのオブジェクトが参照している他のオブジェクトも深く(ディープ)参照して、元の状態を維持したまま対象図形を別の図面にコピーすることが可能です。例えば、図面 A の線分が同じ図面の ”通り芯” 画層している場合、その線分を図面 B にディープクローンすると、”通り芯” 画層も一緒に、そして、自動的にコピーしてくれます。寸法スタイルや文字スタイルも同様にコピーされます。   VBA が利用する ActiveX オートメーションでは、CopyObjects メソッド でディープクローンを利用することが出来ます。    次の VBA マクロはタイル状に並べた左側の図面のモデル空間の図形を、右側の図面にディープクローンするものです。VBA マクロ実行前、右側の図面には図形や画層はありませんが、図形のディープクローン時に画層もコピーされていることがわかります。   Public Sub DeepClone() Dim A As AcadDocument Set A = ThisDrawing.Application.ActiveDocument Dim B As AcadDocument Set B = ThisDrawing.Application.Documents.Item(1) ThisDrawing.Application.ActiveDocument = A Dim entity As AcadEntity Dim retObjects As Variant Dim index As Integer Dim length As Integer ReDim objCollection(0 To A.ModelSpace.Count - 1) As Object index = 0 For Each entity In A.ModelSpace ThisDrawing.Utility.Prompt (vbCrLf & entity.ObjectName) Set objCollection(index) = entity index = index + 1 Next retObjects = A.Database.CopyObjects(objCollection, B.ModelSpace) ThisDrawing.Application.ActiveDocument = B For index = 0 To length retObjects(index).Update Next B.Application.ZoomExtents End Sub  AutoCAD ActiveX オートメーションでは、ディープクローン先に参照している画層やスタイルがあると、画層やスタイルのディープクローンはおこなわれません(上書きはしません)。 
記事全体を表示
Issue 特定の作図コマンドの実行を抑止する目的で、CommandWillStart イベント ハンドラ内で Document.SendStringToExecute メソッドを使って ESC コード(C#:"\x1B"、VB.NET:Chr$(27) )を送信してコマンドの実行をキャンセルしています。   Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; doc.SendStringToExecute("\x1B\x1B", false, true, false);   他にコマンドの実行を抑止する方法はないでしょうか?   Solution ドキュメント ウィンドウに表示されている図面に作図をする場合、AutoCAD は内部的にドキュメントをロックします。   ドキュメント ロックはアプリケーション実行コンテキストで定義したコマンドの実装時に必要になる知識と言えますが、この仕組みをイベント ハンドラで取得、利用することが出来ます。   この場合、DocumentLockModeChanged イベント ハンドラで DocumentLockModeChangedEventArgs.Veto メソッドを呼び出すことで、作図コマンドの実行時にドキュメント ロックを拒否してコマンドの実行そのものを抑止することが出来ます。    次の C# コードは、LINE コマンドの実行を抑止する例です。   ... [CommandMethod("MyCommand", CommandFlags.Modal)] public void MyCommand() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; Application.DocumentManager.DocumentLockModeChanged += DocumentEvent_LockModeChanged_Handler; } private static void DocumentEvent_LockModeChanged_Handler(object sender, DocumentLockModeChangedEventArgs e) { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; if (e.GlobalCommandName == "LINE") { e.Veto(); ed.WriteMessage(string.Format("\n{0} command was vetoed\n", e.GlobalCommandName)); } } ...    
記事全体を表示
質問 AutoCAD VBAで、ファイルの保存ダイアログを表示する方法はありますか。   回答 残念ながらAutoCADのActiveX APIにはファイルの保存ダイアログを表示するAPIが提供されておりません。 代替手段としては、Autolipsのgetfiled関数をSendCommand()メソッドを用いて実行することでダイアログを表示する方法があります。   以下はサンプルコードです。 Dim fileName As String ThisDrawing.SendCommand "(setvar " & """users1""" & "(getfiled " & """Save As""" & """c:/program files/acad2024/""" & """dwg""" & "1)) " fileName = ThisDrawing.GetVariable("users1")
記事全体を表示
Issue .NET API で開発したアドイン アプリのアセンブリを他のコンピューターで動作テストしようとしています。 一旦、アセンブリを共有サーバーにアップロードして他のコンピューターにダウンロードすると、そのアセンブリがロード出来ません。  具体的には System.IO.FileLoadException 例外エラーが表示されてロードできません。 どうすればいいでしょうか?     Solution .NET Framework のセキュリティ ポリシーにより、クラウド ストレージを含むネットワーク リソースからダウンロードしたアセンブリ ファイルは読み込みがブロックされています。 Windows エクスプローラーからアセンブリのプロパティ ダイアログを表示させると、「許可する」項(Windows バージョンによっては「ブロック解除」項)が表示されます。 この項目にチェックしてブロックを解除すると、NETLOAD 出来るようになります。 一度、NETLOAD 時に例外エラーが発生した場合には、次の NETLOAD 作業前に AutoCAD を再起動してください。(キャッシュされたアセンブリ情報をクリアする目的)
記事全体を表示
Issue コマンド フラグに CommandFlags.UsePickSet を指定したカスタムコマンドで Editor.SelectImplied メソッドを使い、事前選択したオブジェクトを取得しようとしています。使用しているコードは次のとおりです。   [CommandMethod("MyCommand", CommandFlags.Modal | CommandFlags.UsePickSet)] public void MyCommand() { Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; PromptSelectionResult psr = ed.SelectImplied(); if (psr.Status == PromptStatus.OK) { ed.WriteMessage("\n{0} 個のオブジェクトが選択されました ...", psr.Value.GetObjectIds().Length.ToString()); } else { ed.WriteMessage("\nオブジェクトが選択されていません"); } }   このコードで事前選択したオブジェクトは取得出来ますが、コマンド実行時にオブジェクトの選択状態が解除されてしまいます。       コマンド実行時にのブジェクト選択状態の解除を抑止することは出来ますか?   Solution 事前選択したオブジェクトの選択状態を維持したままにするには、定義したカスタム コマンドのコマンド フラグに CommandFlags.Redraw を加える必要があります。コマンド定義内のコードになにかを加える必要はありません。   [CommandMethod("MyCommand", CommandFlags.Modal | CommandFlags.UsePickSet | CommandFlags.Redraw)] public void MyCommand() { Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; PromptSelectionResult psr = ed.SelectImplied(); if (psr.Status == PromptStatus.OK) { ed.WriteMessage("\n{0} 個のオブジェクトが選択されました ...", psr.Value.GetObjectIds().Length.ToString()); } else { ed.WriteMessage("\nオブジェクトが選択されていません"); } }  
記事全体を表示
Question InventorのFileDialogで、ShowSave()実行時にInitialDirectoryプロパティで指定したパスが初期表示されない。 Answer FileDialogのShowSave()メソッド実行時には、InitialDirectoryプロパティで指定したパスが無視されます。 この問題に対応するためには、FileDialogのFileNameプロパティに、ファイル名だけでなくダイアログに初期表示をしたいフォルダを含むフルパスを指定することで回避が可能です。   以下は、現在のドキュメントが存在するフォルダを指定してShowSave()を実行する場合のサンプルとなります。 Dim oFileDlg As Inventor.FileDialog = Nothing InventorVb.Application.CreateFileDialog(oFileDlg) '.ShowSave()の場合InitialDirectoryの設定は無視される 'oFileDlg.InitialDirectory = ThisDoc.Path '.ShowSave()の場合FileNameに初期表示したいフォルダまでのフルパスを含むファイル名を指定する oFileDlg.FileName = ThisDoc.Path + "\" + ThisDoc.FileName(False) oFileDlg.CancelError = True oFileDlg.ShowSave()
記事全体を表示