Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。
ソート順:
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オブジェクトが選択されていません"); } }  
記事全体を表示
Issue AutoCAD を使用していると、テーブル(*Tnn ) / 寸法(*Dnn)/ ハッチング( *Xnn)などの匿名ブロックが作成されています。( nn は図面内で一意になるような数字)   INSERT コマンドや BLOCK コマンドのユーザ インタフェースには匿名ブロック名が表示されないので、カスタマイズ運用時に便利なのですが、この匿名ブロックを AutoCAD .NET API で作成することは出来ますか?   Solution API で(ユーザー定義で)登録することが出来る匿名ブロックの作成では、新しく作成するブロック名に "*U" の名前をつけることで、AutoCAD が図面内で重複しないように数字を付加してブロック名を定義します。 次の C# コードは、円を含む匿名ブロックを作成するものです。   Database db = HostApplicationServices.WorkingDatabase; Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; using (Transaction tr = db.TransactionManager.StartTransaction()) { try { // 匿名ブロック定義の作成 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite); BlockTableRecord blkdef = new BlockTableRecord(); Circle oCirc = new Circle(Point3d.Origin, Vector3d.ZAxis, 10.0); blkdef = new BlockTableRecord(); blkdef.Name = "*U"; bt.Add(blkdef); tr.AddNewlyCreatedDBObject(blkdef, true); blkdef.AppendEntity(oCirc); tr.AddNewlyCreatedDBObject(oCirc, true); ed.WriteMessage("\n匿名ブロック名 : {0}", blkdef.Name); // 匿名ブロック参照の作成 Point3d pt = new Point3d(100.0, 100.0, 0.0); BlockReference blkref = new BlockReference(pt, blkdef.ObjectId); BlockTableRecord model = (BlockTableRecord)tr.GetObject(bt["*MODEL_SPACE"], OpenMode.ForWrite); model.AppendEntity(blkref); tr.AddNewlyCreatedDBObject(blkref, true); tr.Commit(); } catch (Autodesk.AutoCAD.Runtime.Exception ex) { ed.WriteMessage("\n例外エラー : {0}", ex.ToString()); } }
記事全体を表示
Issue 現在オープンしている図面に配置されている "TEST" ブロック参照を、別の図面に定義されている同じ名前のブロック定義を元に置き換えたいのですが、AutoCAD VBA で可能でしょうか?    Solution AutoCAD VBA で現在の図面上のブロック参照を置き換えるには、置き換え対象のブロック定義を持つ図面をオープン後、ブロック定義を現在の図面にディープクローン、同ブロック定義を元にブロック参照を挿入する必要があります。 この場合、ディープクローン前に現在の図面から置き換え対象のブロック定義と、同ブロック定義を元に挿入されているブロック参照を削除しておく必要があります。   現在の図面(ブロック参照を置き換える図面を図面 A、置き換えるブロック定義を含む外部図面を図面 B とすると、おおまかに次のような手順となります。   図面 A を変数に保存 図面 A 上で対象となるブロック参照数を把握 図面 A 上で対象となるブロック参照の挿入パラメーターをオブジェクト変数に保存 図面 A 上で対象となるブロック参照のを削除 図面 A 上で対象となるブロック定義を削除 ブロック定義をディープクローンするため図面 B をオープン 図面 B 上でディープクローンするブロック定義を変数に保存 対象となるブロック定義を CopyObjects メソッド でディープクローン 図面 B をクローズ ディープクローンしたブロック定義を元に保持したパラメーターで挿入 この実装例は次の通りです。    クラス モジュール(Parameters クラス定義): Option Explicit ' ブロック参照パラメーター Public X As Double Public Y As Double Public Z As Double Public XS As Double Public YS As Double Public ZS As Double Public R As Double Private Sub Class_Initialize() X = 0# Y = 0# Z = 0# XS = 0# YS = 0# ZS = 0# R = 0# End Sub   プロシージャ: Public Sub ReplaceBlock() ' 図面 A を変数に保存 Dim A As AcadDocument Set A = ThisDrawing.Application.ActiveDocument ' 図面 A 上で対象となるブロック参照数を把握 Dim target As String target = "TEST" Dim entity As AcadEntity Dim block As AcadBlockReference Dim length As Integer length = 0 For Each entity In A.ModelSpace If entity.ObjectName = "AcDbBlockReference" Then Set block = entity If block.Name = target Then length = length + 1 End If End If Next ' 図面 A 上で対象となるブロック参照の挿入パラメーターをオブジェクト変数に保存 Dim index As Integer index = 0 ReDim params(length - 1) As Parameters For Each entity In A.ModelSpace If entity.ObjectName = "AcDbBlockReference" Then Set block = entity If block.Name = target Then Set params(index) = New Parameters params(index).X = block.InsertionPoint(0) params(index).Y = block.InsertionPoint(1) params(index).Z = block.InsertionPoint(2) params(index).XS = block.XScaleFactor params(index).YS = block.YScaleFactor params(index).ZS = block.ZScaleFactor params(index).R = block.Rotation index = index + 1 End If End If Next ' 図面 A 上で対象となるブロック参照のを削除 For Each entity In A.ModelSpace If entity.ObjectName = "AcDbBlockReference" Then Set block = entity If block.Name = target Then block.Delete End If End If Next ' 図面 A 上で対象となるブロック定義を削除 A.Blocks.Item(target).Delete ' ブロック定義をディープクローンするため図面 B をオープン Dim B As AcadDocument Set B = A.Application.Documents.Open("<your_own_path>\B.dwg") ' 図面 B 上でディープクローンするブロック定義を変数に保存 Dim objCollection(0) As Object Set objCollection(0) = B.Blocks.Item(target) ThisDrawing.Application.ActiveDocument = A ' 対象となるブロック定義をディープクローン Dim retObjects As Variant retObjects = B.Database.CopyObjects(objCollection, A.Blocks) ' 図面 B をクローズ B.Close ' ディープクローンしたブロック定義を元に保持したパラメーターで挿入 Dim insertionPnt(0 To 2) As Double For index = 0 To length - 1 insertionPnt(0) = params(index).X insertionPnt(1) = params(index).Y insertionPnt(2) = params(index).Z Set block = A.ModelSpace.InsertBlock(insertionPnt, target, params(index).XS, params(index).YS, params(index).ZS, params(index).R) Next End Sub    
記事全体を表示
Question AutoCAD .net APIで、エンティティマウスドラッグ操作(移動・回転 等)でマウス操作に追随してプレビューイメージを表示するにはどうしたらよいでしょうか。 Answer AutoCAD .net APIのEntityJigの仕組みが利用可能です。   EntityJigを継承したクラスを作成し、Sampler()メソッドをとUpdate()メソッドをオーバライドして、入力に応じた処理を実装します。   以下は、マウスに追随してプレビューを表示しながら選択したエンティティを回転させるサンプルコードとなります。  [CommandMethod("MyRotateEnt")] public static void MyRotateEnt() { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; Database db = HostApplicationServices.WorkingDatabase; PromptEntityResult per = ed.GetEntity("\nPick an entity:"); if (per.Status != PromptStatus.OK) { return; } PromptPointResult pr = ed.GetPoint("\nBase Point: "); if(pr.Status != PromptStatus.OK) { return; } try { using (Transaction tx = db.TransactionManager.StartTransaction()) { Entity ent = tx.GetObject(per.ObjectId, OpenMode.ForWrite) as Entity; if (ent != null) { RotateJigger jigger = new RotateJigger(ent, pr.Value, ed.CurrentUserCoordinateSystem); if (jigger.Run() == PromptStatus.OK) { tx.Commit(); } } } } catch (System.Exception ex) { ed.WriteMessage(ex.ToString()); } } public class RotateJigger : EntityJig { private double mRt = 0.0; private Point3d mBp = new Point3d(); private double mLastAngle = 0.0; private Matrix3d mUcs; public RotateJigger(Entity ent, Point3d bp, Matrix3d ucs) : base(ent) { mBp = bp; mUcs = ucs; } protected override bool Update() { Point3d basePt = new Point3d(mBp.X, mBp.Y, mBp.Z); Matrix3d mat = Matrix3d.Rotation(mRt - mLastAngle , Vector3d.ZAxis.TransformBy(mUcs) , basePt.TransformBy(mUcs)); this.Entity.TransformBy(mat); mLastAngle = mRt; return true; } protected override SamplerStatus Sampler(JigPrompts prompts) { PromptDoubleResult pr = prompts.AcquireAngle( new JigPromptAngleOptions("\nRotation angle:") { BasePoint = mBp, UseBasePoint = true }); if (pr.Status == PromptStatus.Cancel) return SamplerStatus.Cancel; if (pr.Value.Equals(mRt)) { return SamplerStatus.NoChange; } mRt = pr.Value; return SamplerStatus.OK; } public PromptStatus Run() { Document doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) return PromptStatus.Error; return doc.Editor.Drag(this).Status; } }
記事全体を表示
長期にわたる 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 VBA マクロで特定のブロック名パターンを持つブロックのブロック属性を得たいのですが、可能でしょうか? 例えば、図面内の A で始まるブロック名を持つすべてのブロックのみを対象にする、といった方法です。   Solution 特定のブロック名パターンに検索には、選択セットのフィルタ リストにアスタリスク記号でワイルドカード(*)を組み合わせて指定することが出来ます。A で始まるブロック名を持つブロックは、A* で指定可能です。   次のコードは、ワイルドカードを含めたブロック名パターンを指定して、対象ブロック参照を取得、ブロック属性の有無をチェックして、ブロック属性が含まれる場合に属性のタグと値を表示するものです。なお、*fix* や *tub など、ワイルドカードはブロック名中、どこに置いても指定することが出来ます。   Public Sub GetBlockAttribute2() On Error Resume Next Dim sset As AcadSelectionSet ThisDrawing.SelectionSets.Item("ssblocks").Delete Set sset = ThisDrawing.SelectionSets.Add("ssblocks") ThisDrawing.Utility.InitializeUserInput NoNull returnString = ThisDrawing.Utility.GetString(True, "対象のブロック名を入力 [すべて (*) ] : ") If returnString = "" Then returnString = "*" End If Dim FilterType(1) As Integer Dim FilterData(1) As Variant FilterType(0) = 0 FilterData(0) = "Insert" FilterType(1) = 2 FilterData(1) = returnString sset.Select acSelectionSetAll, , , FilterType, FilterData If sset.Count > 0 Then Dim ent As AcadEntity For Each ent In sset Dim blkRef As AcadBlockReference Set blkRef = ent 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 Next Else ThisDrawing.Utility.Prompt vbCrLf & returnString & " ブロック名パターンに合致するブロック参照がありません..." End If End Sub   次の例では、ブロック名パターン * で全ブロックのブロック属性を、A* で A で始まるブロック名を持つブロック参照のブロック属性を表示しています。  
記事全体を表示
Question AutoCADでnetloadでロードしたカスタムプラグインが参照する外部Dllが読み込まれずエラーとなります。 どうすればカスタムプラグインが参照する外部Dllを読み込むことが出来ますか。 Answer Windowsのデスクトップアプリケーションがロード対象のDLLを検索する際には、「プローブ」と呼ばれるWindowsの機能が用いられます。一般的なデスクトップアプリケーションの場合、プローブでのDLLを検索は、通常以下の順で行われます。   1.アプリケーションがロードされたディレクトリ(DLLをホストするexeファイルの場所) 2.カレント・ディレクトリ 3.システム・ディレクトリ(%Systemroot%\System32) 4.16bit・システム・ディレクトリ(%Systemroot%\System) 5.Windowsディレクトリ(%Systemroot%) 6.PATH環境変数に列挙されているディレクトリ 参考: https://docs.microsoft.com/ja-jp/windows/win32/dlls/dynamic-link-library-search-order?redirectedfrom=MSDN#standard-search-order-for-desktop-applications   また、WindowsおよびAutoCADではDLLの配置先を解決する方法として上述の「プローブ」を以外に、manifestファイルを用いる等のいくつかの仕組みがあります。 代表的な方法としては以下が挙げられます。 a.厳密名を持つアセンブリの場合、acad.exe.configにDLLのパスを設定する b.AutoCADの AutoLoaderの仕組みを利用する c.対象のDLLがアセンブリの場合、System.Reflection.Assembly.LoadFromを用いて、対象の機能を実行する直前にDLLをロードする。 d.AppDomain.AssemblyResolveイベントハンドラを実装し対象のアセンブリをロードする   「プローブ」を用いた検索はmanifest等の方法で、DLLの配置先を解決できない場合に用いられる方法となりますが、厳密にDLLを指定することが難しいため、DLLのバージョンによる問題が発生する可能性があります。 このためカスタムプラグインが参照する外部Dllを読み込ませるには、まずはmanifest等で挙げた法を用いることを検討ください。   なお、上述のc及びdの方法については、プログラムの修正が必要となり、ここでは詳細は割愛し、aとbの方法について解説をします。   「a.厳密名を持つアセンブリの場合、acad.exe.configにDLLのパスを設定する」方法 外部Dllが、厳密名を持つアセンブリかは、sn.exeを用いるて以下のコマンドを実行することで判定が可能です(sn.exeはVisual Studio と共に自動的にインストールされます)。   >sn.exe" -v <外部.dllへのパス> もし対象の外部dllが厳密名を持つアセンブリであった場合、acad.exe.configに以下のようなアセンブリの厳密名とアセンブリへのパスを記述をすることで、ロードさせることが可能です。 ※DLLのパス、PublicKeyToken、Version等の情報はコマンドで取得した情報で置き換えが必要です。 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="DllToLoad" publicKeyToken="cace528f15d690ab" culture="neutral" /> <codeBase version="1.0.0.0" href= "file://C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\TestDllLoad\DllToLoad\bin\Debug\DllToLoad.dll"/> </dependentAssembly> </assemblyBinding>   b.AutoCADの AutoLoaderの仕組みを利用する AutoCADのAutoLoader メカニズムについては以下URLのリファレンスを参照してください。 https://help.autodesk.com/view/ACD/2020/JPN/?guid=GUID-5E50A846-C80B-4FFD-8DD3-C20B22098008   AutoLoaderを用いたプラグインのロードの場合、AutoLoaderがロード対象のDLL(=プラグインのDll)のロードと合わせて、バンドルフォルダを、アプリケーションのロードパスに追加をします。このため、アプリケーションは同一フォルダにある外部DLLを検索、ロードが可能になります。   ここまでの方法による解決(c, dの方法を含む)が難しい場合は、「プローブ」を用いた方法を用いての解決を検討ください。 ・acad.exeがあるディレクトリに、外部.dllを配置する ・PATH環境変数に外部.dllが存在するディレクトリを追加する 等
記事全体を表示
Issue VBA では表を TABLE オブジェクトで作成することが出来ますが、データ値にオブジェクトのプロパティをフィールドとして利用、表の内容を最新に保つようなことは出来ますか?   Solution  TABLE オブジェクト のデータセルにフィールド文字を挿入することは可能です。どのようなフィールド文字列を値に設定するべきかは、FIELD[フィールド] コマンド 表示される [フィールド] ダイアログで、特定のオブジェクトと同オブジェクト タイプで利用可能なプロパティを選択すると、ダイアログ下部の「フィールド式」に表示される内容で取得することが出来ます。   このとき、特定のオブジェクトは AutoCAD API の識別子の 1つである ObjectId で関連付けされますので、VBA マクロでフィールド式をセルに指定する際に、適宜変更する必要があります。     次のマクロは、モデル空間に作図されているすべてのオブジェクトのハンドル番号とオブジェクト タイプ、オブジェクトの色を表に書き込むものです。色の情報がフィールド式で指定されているので、作図後に REGEN[再作図] コマンド を実行すると、値が更新されるようになります。   Option Explicit Public Sub FieldTable() ' 新しい表スタイルの作成 On Error Resume Next Dim oTblDict As AcadDictionary Set oTblDict = ThisDrawing.Dictionaries.Item("ACAD_TABLESTYLE") Dim oTblStyle As AcadTableStyle Set oTblStyle = oTblDict.Item("MyTableStyle") If Err Then ' 新しい表スタイル "MyTableStyle" を作成 Err.Clear Set oTblStyle = oTblDict.AddObject("MyTableStyle", "AcDbTableStyle") ' タイトル欄の設定(背景色:青、文字色:白、文字高さ:4.0) Dim oColor As AcadAcCmColor Set oColor = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.25") oColor.ColorIndex = acWhite oTblStyle.SetColor acTitleRow, oColor oColor.ColorIndex = acBlue oTblStyle.SetBackgroundColorNone acTitleRow, False oTblStyle.SetBackgroundColor acTitleRow, oColor oTblStyle.SetTextHeight acTitleRow, 4# oTblStyle.TitleSuppressed = False ' 列見出し欄の色設定(背景色:白、文字色:緑、文字高さ:2.5) oColor.ColorIndex = acWhite oTblStyle.SetColor acHeaderRow, oColor oColor.ColorIndex = acGreen oTblStyle.SetBackgroundColorNone acHeaderRow, True oTblStyle.SetBackgroundColor acHeaderRow, oColor oTblStyle.SetTextHeight acHeaderRow, 2.5 oTblStyle.HeaderSuppressed = False ' データ欄の色設定(背景色:なし、文字色:白、文字高さ:2) oColor.ColorIndex = acWhite oTblStyle.SetColor acDataRow, oColor oTblStyle.SetBackgroundColorNone acDataRow, True oTblStyle.SetTextHeight acDataRow, 2 oTblStyle.SetAlignment acDataRow, acMiddleCenter End If ' 配置基点を指示 Dim ptBase As Variant ThisDrawing.Utility.InitializeUserInput 1 ptBase = ThisDrawing.Utility.GetPoint(, vbCrLf & "表の配置点を指定:") ' 表特性の算出 Dim nRow As Integer Dim nCol As Integer Dim dHeight As Double nRow = ThisDrawing.ModelSpace.Count + 2 ' タイトル+列見出し nCol = 3 dHeight = ThisDrawing.GetVariable("TEXTSIZE") ' 現在のレイアウトに表を配置 Dim oTbl As IAcadTable Set oTbl = ThisDrawing.ActiveLayout.Block.AddTable(ptBase, nRow, nCol, dHeight, dHeight * 10#) oTbl.RegenerateTableSuppressed = True oTbl.StyleName = "MyTableStyle" oTbl.GenerateLayout ' タイトルの設定 oTbl.SetText 0, 0, "モデル空間図形の色一覧" oTbl.SetRowHeight 0, 7# oTbl.SetText 1, 0, "ハンドル番号" oTbl.SetText 1, 1, "クラス名" oTbl.SetText 1, 2, "色" oTbl.SetRowHeight 1, 5# ' データの設定 Dim nRowCnt As Integer Dim strField As String Dim oEnt As AcadEntity nRowCnt = 2 For Each oEnt In ThisDrawing.ModelSpace ' ハンドル番号 oTbl.SetText nRowCnt, 0, oEnt.Handle ' クラス名 oTbl.SetText nRowCnt, 1, oEnt.ObjectName ' フィールド式(オブジェクトID で特定したオブジェクトの色) strField = "%<\AcObjProp Object(%<\_ObjId " & CStr(oEnt.ObjectID) & ">%).TrueColor>%" oTbl.SetText nRowCnt, 2, strField ' 行高さの設定 oTbl.SetRowHeight nRowCnt, 5# ' 行カウンタ nRowCnt = nRowCnt + 1 Next oTbl.RegenerateTableSuppressed = False End Sub   このマクロコードでは、表スタイルを登録して表に使用しています。表スタイルの内容と図面の尺度が適切でない場合がありますので、必要に応じて文字高さ等を変更してください。AutoCAD VBA では、表スタイルは TableStyle オブジェクト で作成・編集することが出来ます。この例では、椅子のブロック参照の色を水色(cyan)から青(blue)に変更しています。    
記事全体を表示
Question NavisworksのAPIからコマンドを実行する方法はありますか? Answer NavisworksのAPI ExecuteCommand()を用いることでAPIからコマンドを実行することが可能です。 ExecuteCommand()の第一引数には、実行するコマンドのIdを指定します。   C:\Program Files\Autodesk\<Navisworks Manage version>\Layout 配下のRoamerCommands.xmlファイルに、Navisworksの既定のコマンドのIdが定義されています。   以下は「全体表示」を実行するサンプルです。 Autodesk.Navisworks.Api.Interop.LcRmFrameworkInterface.ExecuteCommand("RoamerGUI_AutoCAM_Zoom_All", Autodesk.Navisworks.Api.Interop.LcUCIPExecutionContext.ePANEL);  
記事全体を表示
Issue MSPACE[モデル空間] コマンドや PSPACE[ペーパー空間] コマンド のように、レイアウト上に配置したビューポートの編集モードを変更するメソッドはありますか?     Solution Editor.SwitchToModelSpace メソッドと Editor.SwitchToPaperSpace メソッドがそれぞれ該当します。   Editor.SwitchToModelSpace メソッドは、現在のビューポートをモデル空間編集モードに切り替えます。同様に、Editor.SwitchToPaperSpace メソッドは、現在のビューポートをペーパー空間編集モードに切り替えます。   AutoCAD のオンラインヘルプ「AutoCAD 2024 Developer and ObjectARX ヘルプ | 浮動ビューポート(.NET) | Autodesk」も参考にしてください。
記事全体を表示
現象 C#のコンソールアプリケーションで、Inventor Apprentice Server のApprenticeServerDocument.Thumbnailプロパティにアクセスするとエラーが発生します。 回避方法はありますか。   解決策 C#のコンソールApplicationの場合、Main関数に[STAThread]属性を付加しSTAで動作するように指定することで、Thumbnailプロパティにアクセスできるようになります。   [STAThread] static void Main(string[] args) {   なお、VB.netの場合コンソールアプリケーションはデフォルトでSTAで動作する設定のため、[STAThread]属性を付加する必要はありません。 また、C#の場合でもWindows フォームアプリケーションの場合も[STAThread]属性を付加する必要はありません。
記事全体を表示
症状 Inventor VBAでSketchedSymbols.Add()メソッドで正しい引数を渡しているにもかかわらず「プロシージャの呼び出し、または引数が不正です。」エラーが発生する。 再現手順 1.Inventorを起動し、図面ファイルを新規作成します。   2. VBAエディタで以下のコードを実行し、スケッチシンボルを追加します。 Public Sub CreateSketchedSymbolDefinition() ' Set a reference to the drawing document. ' This assumes a drawing document is active. Dim oDrawDoc As DrawingDocument Set oDrawDoc = ThisApplication.ActiveDocument ' Create the new sketched symbol definition. Dim oSketchedSymbolDef As SketchedSymbolDefinition Set oSketchedSymbolDef = oDrawDoc.SketchedSymbolDefinitions.Add("Circular Callout") ' Open the sketched symbol definition's sketch for edit. This is done by calling the Edit ' method of the SketchedSymbolDefinition to obtain a DrawingSketch. This actually creates ' a copy of the sketched symbol definition's and opens it for edit. Dim oSketch As DrawingSketch Call oSketchedSymbolDef.Edit(oSketch) Dim oTG As TransientGeometry Set oTG = ThisApplication.TransientGeometry ' Use the functionality of the sketch to add sketched symbol graphics. Dim oSketchLine As SketchLine Set oSketchLine = oSketch.SketchLines.AddByTwoPoints(oTG.CreatePoint2d(0, 0), oTG.CreatePoint2d(20, 0)) Dim oSketchCircle As SketchCircle Set oSketchCircle = oSketch.SketchCircles.AddByCenterRadius(oTG.CreatePoint2d(22, 0), 2) Call oSketch.GeometricConstraints.AddCoincident(oSketchLine.EndSketchPoint, oSketchCircle) ' Make the starting point of the sketch line the insertion point oSketchLine.StartSketchPoint.InsertionPoint = True ' Add a prompted text field at the center of the sketch circle. Dim sText As String sText = "<Prompt>Enter text 1</Prompt>" Dim oTextBox As TextBox Set oTextBox = oSketch.TextBoxes.AddFitted(oTG.CreatePoint2d(22, 0), sText) oTextBox.VerticalJustification = kAlignTextMiddle oTextBox.HorizontalJustification = kAlignTextCenter Call oSketchedSymbolDef.ExitEdit(True) End Sub   3.作成したスケッチシンボルをシートに追加する以下のコードを実行すると、oSketchedSymbols.Add()の行でエラーが発生します。 Public Sub InsertSketchedSymbolOnSheet() ' Set a reference to the drawing document. ' This assumes a drawing document is active. Dim oDrawDoc As DrawingDocument Set oDrawDoc = ThisApplication.ActiveDocument ' Obtain a reference to the desired sketched symbol definition. Dim oSketchedSymbolDef As SketchedSymbolDefinition Set oSketchedSymbolDef = oDrawDoc.SketchedSymbolDefinitions.Item("Circular Callout") Dim oSheet As Sheet Set oSheet = oDrawDoc.ActiveSheet ' This sketched symbol definition contains one prompted string input. An array ' must be input that contains the strings for the prompted strings. Dim sPromptStrings(0) As String sPromptStrings(0) = "A" Dim oTG As TransientGeometry Set oTG = ThisApplication.TransientGeometry ' Add an instance of the sketched symbol definition to the sheet. ' Rotate the instance by 45 degrees and scale by .75 when adding. ' The symbol will be inserted at (0,0) on the sheet. Since the ' start point of the line was marked as the insertion point, the ' start point should end up at (0,0). Dim oSketchedSymbols As Object Set oSketchedSymbols = oSheet.SketchedSymbols Dim oSketchedSymbol As SketchedSymbol Set oSketchedSymbol = oSketchedSymbols.Add(oSketchedSymbolDef, oTG.CreatePoint2d(0, 0), (3.14159 / 4), 0.75, sPromptStrings) End Sub 原因 上述のスケッチシンボルをシートに追加するコードで、SketchedSymbolsオブジェクトを格納する変数oSketchedSymbolsがObject型で宣言されていることエラーの原因です。   SketchedSymbols.Add()メソッドは、第五引数のオプショナル引数に文字列の配列を指定可能ですがSketchedSymbolsオブジェクトがObject型の変数で宣言されている場合、VBAはこの引数を文字列の配列ではなく、IUnknown型の配列に変換してメソッド呼び出し行います。 このため、指定している引数の型不一致と判断されエラーとなります。   対処法  以下サンプルコードの様にSketchedSymbolsオブジェクトを格納する変数oSketchedSymbolsを明示的にSketchedSymbols型として宣言をすることで、このエラーは発生しなくなります。   Public Sub InsertSketchedSymbolOnSheet() ' Set a reference to the drawing document. ' This assumes a drawing document is active. Dim oDrawDoc As DrawingDocument Set oDrawDoc = ThisApplication.ActiveDocument ' Obtain a reference to the desired sketched symbol definition. Dim oSketchedSymbolDef As SketchedSymbolDefinition Set oSketchedSymbolDef = oDrawDoc.SketchedSymbolDefinitions.Item("Circular Callout") Dim oSheet As Sheet Set oSheet = oDrawDoc.ActiveSheet ' This sketched symbol definition contains one prompted string input. An array ' must be input that contains the strings for the prompted strings. Dim sPromptStrings(0) As String sPromptStrings(0) = "A" Dim oTG As TransientGeometry Set oTG = ThisApplication.TransientGeometry ' Add an instance of the sketched symbol definition to the sheet. ' Rotate the instance by 45 degrees and scale by .75 when adding. ' The symbol will be inserted at (0,0) on the sheet. Since the ' start point of the line was marked as the insertion point, the ' start point should end up at (0,0). Dim oSketchedSymbols As SketchedSymbols Set oSketchedSymbols = oSheet.SketchedSymbols Dim oSketchedSymbol As SketchedSymbol Set oSketchedSymbol = oSketchedSymbols.Add(oSketchedSymbolDef, oTG.CreatePoint2d(0, 0), (3.14159 / 4), 0.75, sPromptStrings) End Sub     なお、この現象はメソッドをチェイン実行した場合にも発生します。例えば上記サンプルで以下のようにoSheet変数をObject型として宣言して、oSheet.SketchedSymbols.Add()と実行した場合などです。この場合もoSheetがObject型として宣言されているため以降のメソッド呼び出しが、VBAの実行時バインディング を用いて呼び出されるため、VBAが第五引数の変数の型をIUnknown型の配列に変換してしまうためです。 Dim oSheet As Object ... Set oSketchedSymbol = oSheet.SketchedSymbols.Add(oSketchedSymbolDef, oTG.CreatePoint2d(0, 0), (3.14159 / 4), 0.75, sPromptStrings)    
記事全体を表示
Issue VBA で拡張エンティティ データを付加・参照・削除するには、それぞれ、どのようなマクロを作成すればいいでしょうか?   Solution 拡張エンティティ データは、AutoCAD 図面内の任意のオブジェクトに任意のカスタム データの付加、参照する手法です。   AutoCAD の標準コマンドは、付加された拡張エンティティ データを認識しないので、標準ユーザー インタフェースに値が表示されることはありませんが、逆に、ユーザから付加された固有データを隠蔽することが可能です。また、プログラムを介在させない限り、拡張エンティティ データを削除したり、値を変更したりすることができないので、ユーザーによる改変を防止することもできます。    次のコードは、拡張エンティティ データを付加する SetXData マクロ、参照する GetXData マクロ、削除する RemoveXData マクロの例です。 Public Sub GetXData() 'オブジェクト選択 Dim ptPick As Variant Dim oEnt As Object Dim oUtil As AcadUtility Set oUtil = ThisDrawing.Utility oUtil.GetEntity oEnt, ptPick, "拡張オブジェクトデータを参照する図形を選択:" '拡張オブジェクトデータ取得 Dim vXDataType As Variant Dim vXDataValue As Variant oEnt.GetXData "MYDATA", vXDataType, vXDataValue If VarType(vXDataType) = vbEmpty Then oUtil.Prompt (vbCrLf & "拡張オブジェクトデータ 'MYDATA' が付加されていません...") Else 'データ表示 oUtil.Prompt (vbCrLf & "年齢は " & CInt(vXDataValue(2))) oUtil.Prompt (vbCrLf & "身長は " & CDbl(vXDataValue(3))) oUtil.Prompt (vbCrLf & "体重は " & CDbl(vXDataValue(4))) oUtil.Prompt (vbCrLf & "人相は " & CStr(vXDataValue(5))) End If End Sub Public Sub SetXData() 'オブジェクト選択 Dim ptPick As Variant Dim oEnt As Object Dim oUtil As AcadUtility Set oUtil = ThisDrawing.Utility oUtil.GetEntity oEnt, ptPick, "拡張オブジェクトデータを付加する図形を選択:" '拡張オブジェクトデータ取得 Dim vXDataType As Variant Dim vXDataValue As Variant oEnt.GetXData "MYDATA", vXDataType, vXDataValue If VarType(vXDataType) <> vbEmpty Then oUtil.Prompt (vbCrLf & "既に拡張オブジェクトデータ 'MYDATA' が付加されています...") Else '入力 Dim nAge As Integer oUtil.InitializeUserInput (7) nAge = oUtil.GetInteger(vbCrLf & "年齢を入力(整数):") Dim dHeight As Double oUtil.InitializeUserInput (7) dHeight = oUtil.GetReal(vbCrLf & "身長を入力(実数):") Dim dWeight As Double oUtil.InitializeUserInput (7) dWeight = oUtil.GetReal(vbCrLf & "体重を入力(実数):") Dim strLooks As String strLooks = oUtil.GetString(True, vbCrLf & "人相を入力(文字):") 'データ付加 Dim nDataType(0 To 6) As Integer Dim vDataValue(0 To 6) As Variant nDataType(0) = 1001 'アプリケーション名 vDataValue(0) = "MYDATA" 'アプリケーション名 nDataType(1) = 1002 'コントロール文字 vDataValue(1) = "{" 'コントロール文字 nDataType(2) = 1070 '年齢(整数) vDataValue(2) = nAge '年齢(整数) nDataType(3) = 1040 '身長(実数) vDataValue(3) = dHeight '身長(実数) nDataType(4) = 1040 '体重(実数) vDataValue(4) = dWeight '体重(実数) nDataType(5) = 1000 '人相(文字) vDataValue(5) = strLooks '人相(文字) nDataType(6) = 1002 'コントロール文字 vDataValue(6) = "}" 'コントロール文字 oEnt.SetXData nDataType, vDataValue End If End Sub Public Sub RemoveXData() 'オブジェクト選択 Dim ptPick As Variant Dim oEnt As Object Dim oUtil As AcadUtility Set oUtil = ThisDrawing.Utility oUtil.GetEntity oEnt, ptPick, "拡張オブジェクトデータを削除する図形を選択:" '拡張オブジェクトデータ取得 Dim vXDataType As Variant Dim vXDataValue As Variant oEnt.GetXData "MYDATA", vXDataType, vXDataValue If VarType(vXDataType) <> vbEmpty Then 'データ付加 Dim nDataType(0) As Integer Dim vDataValue(0) As Variant nDataType(0) = 1001 'アプリケーション名 vDataValue(0) = "MYDATA" 'アプリケーション名 oEnt.SetXData nDataType, vDataValue Else oUtil.Prompt (vbCrLf & "拡張オブジェクトデータ 'MYDATA' が付加されていません...") End If End Sub 1 オブジェクトへの付加サイズ総量が 16 キロバイトまでに制限されています。 削除したい拡張エンティティ データのアプリケーション名を SetXData メソッドで上書きすると、同じアプリケーション名の拡張エンティティ データを削除することが出来ます。 付加されている拡張エンティティ データは、Express Tools の XDLIST コマンドで参照することが出来ます。
記事全体を表示
Issue Database.CurrentSpaceId プロパティでアクティブなレイアウトのレイアウト(ペーパー空間)の BlockTableRecord を取得して、対応する Layout を得ています。   [CommandMethod("GetLayoutId", CommandFlags.NoTileMode | CommandFlags.Modal)] public void GetLayoutId() { Database acCurDb = Application.DocumentManager.MdiActiveDocument.Database; Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor; using (Transaction acTr = acCurDb.TransactionManager.StartTransaction()) { ObjectId objId = acCurDb.CurrentSpaceId; BlockTableRecord oRec = (BlockTableRecord)acTr.GetObject(objId, OpenMode.ForRead); if (oRec.IsLayout) { Layout oLay = (Layout)acTr.GetObject(oRec.LayoutId, OpenMode.ForRead); acDocEd.WriteMessage("\nCurrent LayoutId:{0}, Tab Name:{1}", oLay.ObjectId.ToString(), oLay.LayoutName); } acTr.Commit(); } }   ただ、レイアウト上のビューポートでモデル空間がアクティブになっていると、モデル空間を表す BlockTableRecord に対するレイアウト名(モデル空間のタブ名「モデル」は英語の「Model」)が表示されてしまいます。      ビューポートでモデル空間がアクティブな状態でも、アクティブなレイアウトに対応する Layout を得ることは出来るでしょうか?   Solution Database.CurrentSpaceId プロパティは、アクティブな空間の ID を返すプロパティです。 アクティブなレイアウトタブに対応する BlockTableRecord の ID を得るためには、システム変数 CTAB を利用することが出来ます。   [CommandMethod("GetLayoutId2", CommandFlags.NoTileMode | CommandFlags.Modal)] public void GetLayoutId2() { Database acCurDb = Application.DocumentManager.MdiActiveDocument.Database; Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor; string strLay = (string)Application.GetSystemVariable("CTAB"); using (Transaction acTr = acCurDb.TransactionManager.StartTransaction()) { BlockTable oTbl = (BlockTable)acTr.GetObject(acCurDb.BlockTableId, OpenMode.ForRead); Layout oLay; BlockTableRecord oRec; foreach (ObjectId objId in oTbl) { oRec = (BlockTableRecord)acTr.GetObject(objId, OpenMode.ForRead); if (oRec.IsLayout) { oLay = (Layout)acTr.GetObject(oRec.LayoutId, OpenMode.ForRead); if (oLay.LayoutName == strLay) acDocEd.WriteMessage("\nCurrent LayoutId:{0}, Tab Name:{1}", oLay.ObjectId.ToString(), strLay); } } acTr.Commit(); } }  
記事全体を表示
質問 Inventor iLogicで現在開いているファイルがVaultに登録されているかを知る方法はありますか。 回答 Inventor iLogicからVaultのAPIを用いて、Vaultのチェックイン状態を確認することが可能です。   Vaultでのチェックイン状態を知るためには、対象のファイルのVualtのフォルダ構造のパス情報を用いてDocumentService.FindLatestFilesByPaths()メソッドを利用します。     以下は、現在Inventorで開いているファイルおよびその参照ファイルがVaultに登録されているかを確認し、Vaultに登録されていない場合は、iLogicのログにファイルのパスを出力するサンプルコードとなります。   なお、サンプルコードではわかりやすさを優先して、1ファイルずつDocumentService.FindLatestFilesByPaths()メソッドを実行していますが、 DocumentService.FindLatestFilesByPaths()メソッドには複数のパス情報を配列として指定可能なため、パフォーマンスを考慮した場合には、まとめて実行することをお勧めいたします。     ◆iLogicのファイルヘッダ AddReference "Autodesk.Connectivity.WebServices.dll" Imports AWS = Autodesk.Connectivity.WebServices AddReference "Autodesk.DataManagement.Client.Framework.Vault.dll" Imports VDF = Autodesk.DataManagement.Client.Framework AddReference "Connectivity.Application.VaultBase.dll" Imports VB = Connectivity.Application.VaultBase AddReference "Autodesk.DataManagement.Client.Framework"   ・ iLogicソース  Sub Main() Dim conn As VDF.Vault.Currency.Connections.Connection conn = VB.ConnectionManager.Instance.Connection If conn Is Nothing Then MessageBox.Show("Vaultにログインしていません。") Return End If Dim rootFolder As String rootFolder = conn .WorkingFoldersManager.GetWorkingFolder("$/").FullPath For Each doc As Inventor.Document In ThisDoc.Document.AllReferencedDocuments If (FindFileInVault(doc.FullFileName, rootFolder, conn)) Then Else Logger.Trace("{0} is not checked in to Vault ", doc.FullFileName) End If Next End Sub Public Function FindFileInVault(localfilePath As String, workingfolder As String, conn As VDF.Vault.Currency.Connections.Connection) As Boolean Dim VaultPath As String = localfilePath.Replace(workingfolder, "$/") VaultPath = VaultPath.Replace("\", "/") Dim VaultPaths() As String = New String() {VaultPath} Dim wsFiels() As AWS.File = conn.WebServiceManager.DocumentService.FindLatestFilesByPaths(VaultPaths) If wsFiels(0).Id <> -1 Then Return True End If Logger.Trace("localfilePath is {0}", localfilePath) Logger.Trace("VaultPath={0}, id={1}", VaultPath, wsFiels(0).Id) Return False End Function  
記事全体を表示
質問 AutoCAD .net APIで寸法補助線の開始、終了点と寸法線と寸法補助線の交差点の座標を取得したいのですが、方法はありますか。 回答 AutoCADの.net APIには、直接的に寸法補助線の開始・終了点や寸法線と寸法補助線の交差点の座標を取得するメソッドやプロパティはありません。このため、対象の寸法線の幾何情報から算出して取得する必要があります。 最も簡便な方法としては、対象の寸法線をExplodeにより分解し、分解して取得したオブジェクトの内容から計算をして取得する形となります。   以下は、平行寸法線に対して、寸法補助線の開始・終了点や寸法線と寸法補助線の交差点に点オブジェクトを作成するC#のサンプルコードです。  private static void makePoint(Point2d point, Transaction tx, BlockTableRecord acBlkTblRec) { DBPoint acPoint = new DBPoint(new Point3d(point.X, point.Y, 0)); acPoint.SetDatabaseDefaults(); acBlkTblRec.AppendEntity(acPoint); tx.AddNewlyCreatedDBObject(acPoint, true); } [CommandMethod("GetPointsOnAlignedDimension")] public static void GetPointsOnAlignedDimension() { Document dc = Application.DocumentManager.MdiActiveDocument; Database db = dc.Database; Editor ed = dc.Editor; PromptSelectionOptions pso = new PromptSelectionOptions(); pso.MessageForAdding = "\nSelect an Aligned Dimension:"; pso.SingleOnly = true; pso.SinglePickInSpace = true; PromptSelectionResult psr = ed.GetSelection(pso); if (psr.Status != PromptStatus.OK) return; SelectionSet ss = psr.Value; SelectedObject so = ss[0]; if (!so.ObjectId.ObjectClass.IsDerivedFrom(RXClass.GetClass(typeof(AlignedDimension)))) { ed.WriteMessage("\nSelected entity is not Aligned Dimension..."); return; } ObjectId id = so.ObjectId; using (Transaction tx = db.TransactionManager.StartTransaction()) { try { // Open the Block table for read BlockTable acBlkTbl = tx.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; // Open the Block table record Model space for write BlockTableRecord acBlkTblRec = tx.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; AlignedDimension dim = tx.GetObject(id, OpenMode.ForRead) as AlignedDimension; DBObjectCollection col = new DBObjectCollection(); dim.Explode(col); Point3d dimLoc = dim.DimLinePoint; Point3d xPt1 = dim.XLine1Point; Point3d xPt2 = dim.XLine2Point; Line2d entityLine = new Line2d(new Point2d(xPt1.X, xPt1.Y), new Point2d(xPt2.X, xPt2.Y)); Line2d dimensionLine = new Line2d(new Point2d(dimLoc.X, dimLoc.Y), entityLine.Direction); Line2d lineStargingFromPt1 = entityLine.GetPerpendicularLine(new Point2d(xPt1.X, xPt1.Y)); Line2d lineStargingFromPt2 = entityLine.GetPerpendicularLine(new Point2d(xPt2.X, xPt2.Y)); Point2d interSection1 = lineStargingFromPt1.IntersectWith(dimensionLine).First(); Point2d interSection2 = lineStargingFromPt2.IntersectWith(dimensionLine).First(); makePoint(interSection1, tx, acBlkTblRec); makePoint(interSection2, tx, acBlkTblRec); foreach(DBObject dbObj in col) { Line line = dbObj as Line; if (line == null) { continue; } Point2d startPt = new Point2d(line.StartPoint.X, line.StartPoint.Y); Point2d endPt = new Point2d(line.EndPoint.X, line.EndPoint.Y); if (lineStargingFromPt1.IsOn(startPt) && lineStargingFromPt1.IsOn(endPt)) { makePoint(startPt, tx, acBlkTblRec); makePoint(endPt, tx, acBlkTblRec); } else if (lineStargingFromPt2.IsOn(startPt) && lineStargingFromPt2.IsOn(endPt)) { makePoint(startPt, tx, acBlkTblRec); makePoint(endPt, tx, acBlkTblRec); } } db.Pdmode = 34; db.Pdsize = 1; tx.Commit(); } catch (System.Exception e) { tx.Abort(); ed.WriteMessage(e.Message); } } }   平行寸法線以外の場合にも、Explodeしたオブジェクトから各寸法線の特徴に合わせて幾何計算を行うことで取得が可能です。
記事全体を表示
Issue カスタムコマンドで意図的にオブジェクトを選択させて、コマンド終了後も選択状態を維持させたいと思っています。次のようなコードを作成してみましたが、期待した状態になりません。   [CommandMethod("MyCommand", CommandFlags.Modal)] public void MyCommand() { Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; Database db = doc.Database; PromptEntityOptions peo = new PromptEntityOptions("\nオブジェクトを選択:"); PromptEntityResult per = ed.GetEntity(peo); if (per.Status == PromptStatus.OK) { using (Transaction tr = db.TransactionManager.StartTransaction()) { Entity ent = (Entity)tr.GetObject(per.ObjectId, OpenMode.ForWrite); ent.Highlight(); tr.Commit(); } } }   具体的には、オブジェクトのハイライトは維持するものの、事前選択のようにグリップが表示されません。また、[プロパティ] パレットには選択したオブジェクトのプロパティも表示されません。      事前選択した状態のように、ハイライトとグリップ表示、[プロパティ] パレットへのプロパティ表示を実装するには、どのようにしたらいいでしょうか?   Solution 事前選択の状態は、Editor.SetImpliedSelection メソッドで選択状態にしたい ObjectId 配列を指定することで実装することが出来ます。   [CommandMethod("MyCommand", CommandFlags.Modal)] public void MyCommand() { Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; PromptEntityOptions peo = new PromptEntityOptions("\nオブジェクトを選択:"); PromptEntityResult per = ed.GetEntity(peo); if (per.Status == PromptStatus.OK) { ObjectId[] objIds = [per.ObjectId]; ed.SetImpliedSelection(objIds); } }    
記事全体を表示
質問 AutoCAD Plant3D .net APIで機器にノズルがついているかを判定する方法はありますか   回答 機器に設定したノズルは、Plant3Dの.net API Equipment.AllSubPartsにより取得が可能です。 ノズルが設定されていない場合、Equipment.AllSubParts.Countが0となるため、これによりノズルの有り無しを判定が可能です。 以下は選択したエンティティのEquipment.AllSubParts.Countを取得し、コマンドラインにメッセージを表示するサンプルコードです。   Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; PromptEntityResult res = ed.GetEntity("Pick Object : "); if (res.Status == PromptStatus.OK) { ObjectId objectId = res.ObjectId; Database trDatabase = objectId.Database; using (Transaction tr = trDatabase.TransactionManager.StartTransaction()) { Equipment equipment = tr.GetObject(objectId, OpenMode.ForRead) as Equipment; if( equipment != null) { ed.WriteMessage("\n Selected equipment has {0} nozzles.", equipment.AllSubParts.Count); } else { ed.WriteMessage("\n Selected entity is not a equipment."); } } }  
記事全体を表示
Question Inventor APIでInventorのdwgファイルとAutoCADのdwgファイルを識別する方法はありますか? Answer InventorAPIの、FileManager.IsInventorDWG()メソッドを利用することで判別が可能です。 メソッドの引数には対象のdwgファイルへのフルパスを指定します。  
記事全体を表示
Issue 図面ファイルを開いた際に、その図面ファイルの DWG ファイル形式が表示されます。 この情報を AutoCAD .NET API で取得することは出来ますか?    Solution 図面ファイル形式は、Database.OriginalFileVersion プロパティで返される DwgVersion 値で取得することが出来ます。    次のコードは、その C# 使用例です。   [CommandMethod("MyCommand", CommandFlags.Modal)] public void MyCommand() { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; Database db = Application.DocumentManager.MdiActiveDocument.Database; ed.WriteMessage("\nSaved DWG format:{0}", GetDwgFormat(db.OriginalFileVersion)); } private string GetDwgFormat(DwgVersion ver) { string dwgFormat = string.Empty; switch (ver) { case DwgVersion.AC1002: dwgFormat = "AutoCAD 2.5 形式"; break; case DwgVersion.AC1003: dwgFormat = "AutoCAD 2.6 形式"; break; case DwgVersion.AC1004: dwgFormat = "AutoCAD R9 形式"; break; case DwgVersion.AC1006: dwgFormat = "AutoCAD R10 形式"; break; case DwgVersion.AC1009: dwgFormat = "AutoCAD R11/R12 形式"; break; case DwgVersion.AC1012: dwgFormat = "AutoCAD R13 形式"; break; case DwgVersion.AC1014: dwgFormat = "AutoCAD R14 形式"; break; case DwgVersion.AC1015: dwgFormat = "AutoCAD 2000 形式"; break; case DwgVersion.AC1021: dwgFormat = "AutoCAD 2007 形式"; break; case DwgVersion.AC1024: dwgFormat = "AutoCAD 2010 形式"; break; case DwgVersion.AC1027: dwgFormat = "AutoCAD 2013 形式"; break; case DwgVersion.AC1032: dwgFormat = "AutoCAD 2018 形式"; break; case DwgVersion.AC1800: case DwgVersion.AC1800a: dwgFormat = "AutoCAD 2004 形式"; break; default: dwgFormat = "Unknown 形式"; break; } return dwgFormat; }    
記事全体を表示