Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。
ソート順:
Issue AutoCAD .NET API:ダウンロードしたアセンブリが NETLOAD 出来ない - Autodesk Community の内容に沿ってブロック解除したアドイン アプリ アセンブリがロード出来ません。  なぜでしょうか?     Solution アセンブリ ファイルのブロックを解除しても改善が見られないようでしたら、SECURITYOPTIONS コマンドで [セキュリティ オプション] ダイアログの信頼できるパスにアセンブリ ファイルの配置パスをに追加してみてください。     セキュリティ オプションを変更したら、AutoCAD を再起動して、再度、NETLOAD してみてください。   ご参考: AutoCAD 2016 のセキュリティとアドインのデジタル署名 - Technology Perspective from Japan (typepad.com) アドイン ロード時の警告ダイアログ抑止 - Technology Perspective from Japan (typepad.com)
記事全体を表示
Issue .NET API で開発したアドイン アプリのアセンブリを他のコンピューターで動作テストしようとしています。 一旦、アセンブリを共有サーバーにアップロードして他のコンピューターにダウンロードすると、そのアセンブリがロード出来ません。  具体的には System.IO.FileLoadException 例外エラーが表示されてロードできません。 どうすればいいでしょうか?     Solution .NET Framework のセキュリティ ポリシーにより、クラウド ストレージを含むネットワーク リソースからダウンロードしたアセンブリ ファイルは読み込みがブロックされています。 Windows エクスプローラーからアセンブリのプロパティ ダイアログを表示させると、「許可する」項(Windows バージョンによっては「ブロック解除」項)が表示されます。 この項目にチェックしてブロックを解除すると、NETLOAD 出来るようになります。 一度、NETLOAD 時に例外エラーが発生した場合には、次の NETLOAD 作業前に AutoCAD を再起動してください。(キャッシュされたアセンブリ情報をクリアする目的)
記事全体を表示
Issue MSPACE[モデル空間] コマンドや PSPACE[ペーパー空間] コマンド のように、レイアウト上に配置したビューポートの編集モードを変更するメソッドはありますか?     Solution Editor.SwitchToModelSpace メソッドと Editor.SwitchToPaperSpace メソッドがそれぞれ該当します。   Editor.SwitchToModelSpace メソッドは、現在のビューポートをモデル空間編集モードに切り替えます。同様に、Editor.SwitchToPaperSpace メソッドは、現在のビューポートをペーパー空間編集モードに切り替えます。   AutoCAD のオンラインヘルプ「AutoCAD 2024 Developer and ObjectARX ヘルプ | 浮動ビューポート(.NET) | Autodesk」も参考にしてください。
記事全体を表示
Issue 寸法が参照する画層が、同寸法の削除後も削除出来ません。     ただし、一度、図面を保存して開き直すと削除出来ます。 図面を開き直さなくても、この画層を削除したいのですが、AutoCAD .NET API で可能でしょうか?   Solution AutoCAD .NET API では、Database.ReclaimMemoryFromErasedObjects メソッドでメモリ上の図面データベースからオブジェクトを削除する方法を利用することが出来ます。   このメソッドは、元々、32 ビット環境で大規模図面を操作する際の消費メモリ低減を狙ったものですが、図面を保存して開き直さなくても、同じセッションで図面データベース内の削除フラグが付いたオブジェクトをメモリから削除することが可能です。 下記コード例では、対象の寸法オブジェクトの削除後に ReclaimMemoryFromErasedObjects メソッドで同オブジェクトをメモリ上から削除、その後、参照画層と寸法を表現していた匿名ブロックを削除している点にご注意ください。 後半の処理(下部の Using スコープ)がないと、AUDIT コマンドで図面破損が報告されてしまうので注意が必要です。 少し趣旨が異なりますが、ちょうど、LAYDEL[画層削除] コマンドが処理する内容と似ています。   Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; PromptEntityOptions peo1 = new PromptEntityOptions("\n削除する寸法を選択:"); PromptEntityResult pent = ed.GetEntity(peo1); if (pent.Status != PromptStatus.OK) { return; } ObjectIdCollection erased = new ObjectIdCollection(); ObjectId layId = ObjectId.Null; ObjectId blkId = ObjectId.Null; using (Transaction tr = db.TransactionManager.StartTransaction()) { Dimension dim = (Dimension)tr.GetObject(pent.ObjectId, OpenMode.ForWrite); erased.Add(pent.ObjectId); layId = dim.LayerId; blkId = dim.DimBlockId; dim.Erase(); tr.Commit(); } db.ReclaimMemoryFromErasedObjects(erased); using (Transaction tr = db.TransactionManager.StartTransaction()) { LayerTableRecord lay = (LayerTableRecord)tr.GetObject(layId, OpenMode.ForWrite); lay.Erase(); BlockTableRecord blk = (BlockTableRecord)tr.GetObject(blkId, OpenMode.ForWrite); blk.Erase(); tr.Commit(); }  
記事全体を表示
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(); } }  
記事全体を表示
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)); } } ...    
記事全体を表示