お知らせ

--------------------------------------------------

プログラム作成/コンサルティングの申し込みはこちら

--------------------------------------------------

2010年4月1日木曜日

AutoCAD が作れる画層の数は?(AutoCAD 2011)

AutoCAD が作れる画層の数っていくつか知ってます?

確か無制限って聞いたことがあるような。
でも、この世の中に無制限って本当にあるんでしょうか?

まあ、画層が作れなくなって困ったということは今まで聞いたことがないので、実質的には無制限と言ってもいいと思うのですが、ちょっと興味が湧いたので試してみました。

AutoLISP で画層をいっぱい作って確認してみたところ、どうやら最大 32767 までのようです。(integer 整数の設定になっているということでしょうか。)
それ以上の画層を作成しようとすると、フェイタル エラーで異常終了します。

また、画層は 32766 まで作れますが、動作が非常に不安定です。ちょっとした拍子に、すぐにフェイタル エラーになっちゃうみたいです。

そんなに一杯の画層を作ることはないと思いますが、画層の数が極端に増えると、画層管理などの動作が非常に遅くなってしまうのでシンプルにまとめた方がいいです。シンプル・イズ・ベスト!!

管理人が試してみたところ、画層の数が 1000 ぐらいであればそんなに遅くなることはないようで、それ以上になると、徐々にパフォーマンスが悪くなってきます。

※ 管理人の環境は、Winodws 7 x64 メモリ 8GB です。

動画をつくってみたので、興味があれば見てみてください。

2 件のコメント:

  1. .NET API だと不安定にならないようです。AutoLISP の Integer が内部的に C/C++ の signed short 型(http://msdn.microsoft.com/ja-jp/library/k15zsh48(VS.80).aspx)を採用していて、オーバーフローを起こして動作が不安定になっているのでは?

    _
    Public Sub MyCommand() ' This method can have any name

    Dim oDb As Database = HostApplicationServices.WorkingDatabase
    Dim oTr As Transaction = oDb.TransactionManager.StartTransaction

    Try

    Dim oLt As LayerTable = oTr.GetObject(oDb.LayerTableId, OpenMode.ForWrite)
    Dim oLtr As LayerTableRecord
    For nIndex As Long = 1 To 10000
    If Not oLt.Has(nIndex.ToString()) Then
    oLtr = New LayerTableRecord
    oLtr.Name = nIndex.ToString()
    oLt.Add(oLtr)
    oTr.AddNewlyCreatedDBObject(oLtr, True)
    End If
    Next nIndex
    oTr.Commit()

    Catch oEx As Autodesk.AutoCAD.Runtime.Exception
    MsgBox(oEx.ToString())
    Finally
    oTr.Dispose()
    End Try

    End Sub

    返信削除
  2. コメントありがとうございます。
    コメント書いてくれる人が全然いないので、コメントいただけるととても嬉しいです。

    .NET でちゃちゃっとプログラム作れるなんてとても羨ましいです。
    私はまだサンプルコード使ってちょっとだけ作り方だけを試してみただけで、全然作れないので勉強しなきゃと思ってます。

    ところで、画層の数が多くて動作が不安定になる件ですが、画層を 32767 個にしたときなんです。
    10000 このときは、すこし遅くなるけど、落ちるということはないみたいです。

    書いていただいたコードを元に試したんですが、「For nIndex As Long = 1 To 10000」 のところを 「For nIndex As Long = 1 To 32766」にしてみたところ、図面を保存したあと閉じようとしたらフェイタル エラーになっちゃいました。
    きっと、そちらの環境でも 1 To 32766 にすれば不安定になるような気もするんですが、ひょっとしたら、メモリとか環境によって違うのかもしれませんね。

    ※ 書いていただいたコードをそのまま使おうとしたのですが、何故かうまく動かなかったので、こちらで試してみるときはヘルプにあるサンプルファイルを元にちょっと変えてしまいました。
    何が原因か突き止めるまでの知識がまだないので。。。

    今後もなにか気になることなどあれば、コメントいただけると嬉しいです。

    返信削除