2010年12月28日火曜日

.NET - 2 つの図面のシステム変数の違いを見つける(AutoCAD 2011)


『なんでか他の図面では問題ないんだけど、この図面だけ動きがおかしいんだよね』 なんてときには、図面に保存されているシステム変数の値が原因ってことがあります。
そんな時には、問題ない図面とシステム変数を比較してみるのがいいと思います。

ということで、簡単に比較できるようなツールを .NET の勉強も兼ねて作ってみました。


以前、2つの図面のシステム変数の比較(AutoCAD 2011) で、『.NET の ReadDwgFile メソッドを使用して、2つの図面のシステム変数の比較ができるかもと言ったのですが、チャレンジしてみたのですが、できませんでした。』って言ってたんですが、できました。

システム変数を取得するには Application.GetSystemVariable メソッドを使うしかないと思ってたんですが、Database Properties にシステム変数があるってことに気が付きました。

Database Properties にあるシステム変数をひとつずつ比較してみたので、結構時間がかかりましたが何とかできました。

ただ、システム変数 SKPOLY に関しては、ちゃんと判断できないみたいです。
というのは、SKPOLY には 0、1、2 のどれかの値が設定されるんですが、Database Properties では、True か False しか判断できないのです。
なので、0 は False で判断できるんですが、1 と 2 は両方とも True になっちゃうので、どちかわからないです。

しょうがないので、今回のプログラムでは、True のときは、『1 or 2』 って表示されるようにしました。


DLL ファイルは ここ にあります。

使い方とかは、動画を作ったので見てみてください。

2010年12月20日月曜日

.NET - 寸法図形の寸法スタイルを変更する(AutoCAD 2011)


昨日は、現在の寸法スタイルを変更する方法でしたね。
今日は、既に描かれている寸法図形を他の寸法スタイルに変更する方法を試してみたので、それを紹介したいと思います。

例えば、選択した寸法図形の寸法スタイルを「ACAD Video」という寸法スタイルの変えたいときは、こんな感じでできました。

'--------------------------------------------------------
<CommandMethod("test", "test4", CommandFlags.Modal + CommandFlags.UsePickSet)> _
Public Sub test4()

    Dim doc As Document = Application.DocumentManager.MdiActiveDocument
    Dim db As Database = doc.Database
    Dim ed As Editor = doc.Editor

    Using trans As Transaction = db.TransactionManager.StartTransaction
        Try
            ' PickFirst 選択セットを取得
            Dim psr As PromptSelectionResult = ed.SelectImplied()

            ' PickFirst 選択セットを取得できなかったときは、オブジェクトをオブジェクトを選択する
            If psr.Status <> PromptStatus.OK Then
                psr = ed.GetSelection()
            End If

            ' 何も選択されていなかったら、コマンドを終了する
            If psr.Status <> PromptStatus.OK Then
                Return
            End If

            ' ObjectIdCollection に選択したオブジェクトのオブジェクト ID を設定
            Dim objIdColl As New ObjectIdCollection(psr.Value.GetObjectIds())

            ' 選択したそれぞれのオブジェクトに対して実行
            For Each objId As ObjectId In objIdColl
                ' もし、寸法図形だったら、寸法スタイルを ACAD Vide に変更
                Dim ent As Entity = trans.GetObject(objId, OpenMode.ForRead)
                If TypeOf ent Is Dimension Then
                    Dim d1 As Dimension = ent

                    d1.UpgradeOpen()
                    d1.DimensionStyleName = "ACAD Video"
                End If
            Next

            trans.Commit()

        Catch ex As Autodesk.AutoCAD.Runtime.Exception
            Application.ShowAlertDialog(ex.Message)

        End Try
    End Using

End Sub
'--------------------------------------------------------

また、d1.DimensionStyleName = "ACAD Video" の代わりにこんな感じにしても OK でした。
'--------------------------------------------------------
Dim dimTbl As DimStyleTable = trans.GetObject(db.DimStyleTableId, OpenMode.ForRead)
Dim dimTblRec As DimStyleTableRecord = trans.GetObject(dimTbl("ACAD Video"), OpenMode.ForRead)

d1.DimensionStyle = dimTblRec.ObjectId
'--------------------------------------------------------

2010年12月19日日曜日

.NET - 現在の寸法スタイルを変更する/<優先スタイル> を破棄する(AutoCAD 2011)


今日は、.NET での寸法スタイルの変更についてです。

先日、<優先スタイル> を破棄したいといった質問をいただきました。

<優先スタイル> って知ってます?
例えば上の絵のように、現在の一部の設定(上の例では 「垂直方向の寸法値位置」(DIMTAD))が寸法スタイル(上の例では 「ACAD Video」)と違っているときに出てきます。

これをなくしたいってことなんですが、以下のようにやってもなくならないといった内容です。
db.Dimstyle = dimTblRec.ObjectId

※ db は Database、dimTblRec は DimStyleTableRecord
確かに、これを実行しても <優先スタイル> はなくなりませんでした。
なんででしょう???

いろいろ調べてみたんですが、<優先スタイル> ってどこにも覚えられていなみたいなんですよね。
どこかに覚えられていればそれを消せばいいかと思ってたんですが、それがどこにもなさそうなので、諦めかけてたんですが、やっと見つけました。

SetDimstyleData っていうのがあって、これを使うようです。
具体的にはこんな感じです。
'-----------------------------------------------------------------
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim db As Database = doc.Database

Using trans As Transaction = db.TransactionManager.StartTransaction
    Try
        Dim dimTbl As DimStyleTable = trans.GetObject(db.DimStyleTableId, OpenMode.ForRead)
        Dim dimTblRec As DimStyleTableRecord = trans.GetObject(dimTbl("ACAD Video"), OpenMode.ForRead)

        db.Dimstyle = dimTblRec.ObjectId
        db.SetDimstyleData(dimTblRec)

        trans.Commit()

    Catch ex As Autodesk.AutoCAD.Runtime.Exception
        Application.ShowAlertDialog(ex.Message)

    End Try
End Using
'-----------------------------------------------------------------

現在の寸法スタイルを変更するときもこれと同じで OK です。
(<優先スタイル> を破棄するときは、db.Dimstyle = dimTblRec.ObjectId がなくても OKです。)

なんで Dimstyle の設定だけではダメかというと、こういった理由になると思います。

DIM* といった寸法に関するシステム変数は、現在のデータベースに設定されています。
Dimstyle の設定を置き換えるように設定すると、現在の寸法スタイルは指定したものになりますが、他のシステム変数(例:DIMTAD など)は変わらずそのままです。
なので、<優先スタイル> も残ったままになります。

そのため、寸法スタイルの設定から、すべての DIM* というシステム変数を読み込む必要があります。
それをするのが SetDimstyleData ということです。

2010年12月13日月曜日

.NET - コマンドをキーボードから簡単に実行(AutoCAD 2011)


コマンドを実行するとき、通常はリボンやツールボタンから実行すると思うのですが、キーボードからも実行できます。

例えば、L と入力すると LINE[線分] コマンドが実行されたり、C と入力すると CIRCLE[円] コマンドが実行されたりします。
よく使うコマンドをこのようにキーボードから簡単に実行できたら、ひょっとしたらリボンやツールボタンから実行するよりも早く実行することができるかもしれませんね。

この L とか C というのは、コマンド エイリアスといって acad.pgp っているファイルで設定されています。

この acad.pgp ファイルは、テキスト ファイルなので、メモ帳などで編集することもできます。([管理]タブ-[エイリアス編集]をクリックすると、メモ帳で開かれます。)
また、[Express Tools]タブ-[Command Aliases] でも編集できます。

でもちょっと面倒なので、もう少し簡単に変更するプログラムを .NET で作ってみました。
(以前も http://blog.acadvideo.com/2010/09/net-autocad-2011.html で作ったのですが、あんまり使い勝手がよくなくて管理人自身も使わなくなってしまったので、改善してみました。)

使い方としては、こんな感じです。
  1. AVDO_SetAlias2.dll をダウンロードします。
  2. NETLOAD コマンドを実行して、AVDO_SetAlias2.dll をロードします。
    http://blog.acadvideo.com/2010/10/net-dll-autocad-2011.html の方法を使えば、AutoCAD 起動時に勝手にロードしてくれます。)
  3. AVDO_SetAlias2_Add コマンドを実行します。
    図面を開くたびに実行する必要があります。acaddoc.lsp に AVDO_SetAlias2_Add コマンドを実行するよう記述しておくと、図面を開いたときに勝手に実行してくれます。
  4. コマンド エイリアスを設定したいコマンドを実行します。
    コマンドを完了 または キャンセルします。
  5. AVDO_SetAlias2 コマンドを実行します。
※ http://blog.acadvideo.com/2010/09/net-autocad-2011.html では対応していなかった Express Tools の AutoLISP で作られたコマンドに対しても対応しました。


動画を作ってみたので見てみてください。
今回は、今までのように文字を入れるのではなく、しゃべってみました。
今回はじめてだったので、結構時間かかりましたが、慣れてくればしゃべった方が文字入れるより簡単かも。