とにもかくにも地道が一番たい!

猫好きなプログラマのつぶやき

アプリケーションのアップデート

アプリのアップデートにはいろいろ悩まされてきた。

アップデートしてね、と言ってメール配信してもしてくれない人多数。

起動時にアップデートをスケジュールしても休止で終了されるとアップデートされない。

アプリの先頭にアップデート版があるかどうかのチェックを入れて、メッセージで促してもやらない人がいる。

最終的に、強制でやることにした。

やり方は自分自身を書き換えるというもの。

メッセージも出さないので、使ってる人には全く気付かれない。

 

これでやっと落ち着きそうだ。

 

 

DWGファイラー つう物を作って使ってるざます

まあ、簡単に言えばDWGファイル専用のファイラーみたいなもんだけど、下の写真のようにサムネイルを複数表示できる。サムネイルは、履歴からでもフォルダの中からでも、ファイル検索した中からでもいい。

f:id:mazoo:20181125200832p:plain


サムネイルをクリックするとその図面があるところのフォルダとファイルリストを表示する。つまり同期してくれる。

それはそんなに難しくないんだけど、このファイラーのサムネイルは、すべて黒背景で表示されるところがミソなんだ。

AutoCADは昔は、画面の背景を黒にしててもサムネイルは白背景で作ってたんだ。黄色の線なんかほとんど見えないし、それじゃ何が書かれてるかわからない。
やっと今は黒背景のサムネイルになったけど、昔の図面なんかのサムネイルは作り直さない限り白いまま。

そこで自前でファイルからサムネイルを読み込むルーチンを作って、背景がもし白ならそれを黒に変えてやるという離れ業?をやってるんだよねえ。

サムネイルの画像データはそのファイルの先頭あたりに保存されている。それを直接バイト単位で読み込んでイメージに変換するわけだけど、そんなたいそうな行数にはならない。ただしAutoCADはいつからか画像のフォーマットをBMPからPNGに変えたので、それを判断しなければならない。
APIには Database.ThumbnailBitmap というメソッドがあるけど、これを使うにはファイルをいったん読み込まなければ使えない。そのオーバーヘッドが大きいから、ファイルの中身を直接見に行くわけだ。そうすれば100KBのファイルだろうが100MBのファイルだろうが高速で読める。


そんなこんなで、なかなか便利なもんですよ。

結構、ユーザーさんたちの使用頻度は高いです。

【ブロックの原点を変える】コマンド

CADのカスタマイズといっても、いろいろあるけど、

 

操作を単純にするというのは結構たくさんある。

 

たとえば、【ブロックの原点を変える】 と言うのを考えてみよう。

原点を変えるから、ブロック図形もそれにならって変わってしまうよね。

まあ、それでもいいという場合はほとんどないだろ?

つまり、普通はブロックの位置を変えずに原点を変えたいわけだ。

 

CADの操作でこれをやろうとすると、

 

REFEDITコマンドでブロック編集モードにして、、

  ↓

原点を変更する

  ↓

REFEDITモードを抜ける

  ↓

原点が変わったのでブロックの位置も変わっちゃった…・

  ↓

そのブロックだけを選択して

  ↓

原点を動かした逆の方向にブロックを動かす

  ↓

あっ、元の原点がわからなくなった…   もとぉーい!

 

てなわけで原点は動くわけですが、めんどくさいでしょ?

 

そこでカスタマイズでこれを一発でやってしまいます。

 

ポイントは

・WCS,UCS座標を常に念頭において、移動距離を表す座標をBlockReference.BlockTransformを使って座標変換すること。賢いことに、この変換行列はブロックがいくつネストしていても問題ないのよ。

 

このコマンドは結構評判良かったな。。。

 

コードの色分け、よかね。

へぇ~~、hatenablogはプログラムコードを色付けしてくれるのか…

こりゃいいや。

    ''' <summary> Command rrb
    ''' ブロック名を変更する またはブロックを置換する
    ''' </summary>
    <CommandMethod("rrb", CommandFlags.Session)>
    Public Sub renameBlock()
      Dim doc = Application.DocumentManager.MdiActiveDocument
      Dim db = doc.Database
      Dim ed = doc.Editor

      Dim prOps As New PromptEntityOptions(vbLf & If(LANG, "名前変更/置換したいブロックをピックしてください。",
                                                           "Pick the block to be renamed or replaced "))
      prOps.SetRejectMessage(vbLf & "You must pick block entity!")
      prOps.AddAllowedClass(GetType(BlockReference), False)
      Dim prRes As PromptEntityResult = ed.GetEntity(prOps)
      ed.WriteMessage(vbLf)
      If prRes.Status <> PromptStatus.OK Then
        Return
      End If
      Dim selObjID = prRes.ObjectId

      Dim bName As String = ""
      Using blk As BlockReference = selObjID.GetObject(OpenMode.ForRead)
        bName = blk.Name
      End Using

      Using _frmr = New frmRenameBlock
        _frmr.orgObjID = selObjID
        _frmr.txtCurBlockName.Text = bName
        _frmr.txtNewBlockName.Text = bName
        acApp.ShowModalDialog(_frmr)
      End Using

    End Sub


ん? Usingが色ついてないということは、 vba相当と言うことか… まあ、無いよりかはずいぶんましだね。

ブロック名変更・置換

CADのカスタマイズをたらたら書いてみようかな。

それならネタに困るということはないし…へへへ。

 

むかしはAutoCADを長年使ってたんだけど、ここ3年前くらいからBricsCADに鞍替え。AutoCADの強欲さにほとほと嫌気がさしたのが直接の原因なんだけどね。

管理してるCADの数が比較的多いのでその維持費たるやン千万となっちゃうでしょ?

そこで互換CADを調べて過去の遺産であるカスタマイズができるだけちゃんと使える奴を選んだんだよ。

そりゃ100%互換とはいかないけど98%までは大丈夫みたい。


ずいぶん前に作ったもんだけど、

【ブロック名変更・置換】つう奴ね。

AutoCADもBricsCADもブロックの名前変更コマンドってないでしょ?

ブロックの置換は blockreplace と言うのがあるけど、複数指定できないとかいろいろ使いにくい。

と言うことで作ったのがこのコマンド。

f:id:mazoo:20181119124859p:plain



・対象にするブロックを選択できる
・同じ名前のブロックがあるときには置換になる
・置換するブロックを画面からピック出来る

とか、いろいろ細かなところに手の届くコマンド。

ポイントとしては、新しい名前を全部変えるのは簡単だけど、一部だけ変えるというのはそのブロック定義(BlockTableRecord)を別名でコピーするというところかな。

【今日のお言葉】  娘十八 番茶も手鼻

お初ですぅ

今日登録して、ちょっといじってみます。

 

1週間くらい使ってみて気に入ったらメインにしようかな。

 

まずは探索に行ってきま~~~す。

 

 

 【今日のお言葉】     時すでにお寿司