2011年05月

2011年05月31日

SXF3.1の書き出しをちょっだけ変更しました

 3.1から付いた機能で、図面の背景色の設定 を使うことにしました。

 Ver2の保存は今までどおりで、3.1形式で書き出す場合は、常に 背景色=白 の設定を書き出すことにしました。
 データを渡した相手が持っているソフトがVer3.1に対応していたら、その方が図面の背景色を明示的に渡すことができるからです。

 今日から公式ガイドのVBPの部 を書き始めました。
 サンプルを と思い、他のソフトで保存されたSXFファイルの図形化されていないプロットマークを一気にブロック図形に変換するVBPを作りました。

 いざ 作り始めると、やっぱりメソッド不足に直面し、その都度 メソッドの追加と 同時にVBPヘルプへの追記をするので なかなか前に進みません。

 やっぱり まだ メソッド不足かなー という感じです・・・  が、 実際にそれに直面しないと なかなか思いつかないので「まあ 公開後は要望しだいで 追加すればいいかー」 という結論にむりやり持って行き、 作り上げました。

 外変では不可能なようなことが できていますv( ̄∇ ̄)v

ho_cad at 19:49|PermalinkComments(2)TrackBack(0)

2011年05月30日

Vista以降のヘルプシステムでWinhlp32用のヘルプファイル(備忘録)

 Vista以降のOSでは、そのままでは 以前の形式のヘルプファイルが開けない。

 チェックしてみたこと。
・ %SystemRoot%にWinhlp32.exe はあるのか? <ちゃんとあった
・ IHelpSystemのインターフェースは登録されているのか <ちゃんとあった
・ レジストリ内でのファイルの関連付けは? <ちゃんと関連付けしてある。

 ということは、もう実行ファイルの問題としか考えられない。
 WinHlp32.exeのファイルバージョンはどうなっているのかな

 どうも、ファイルバージョンのメジャーバージョンとマイナーバージョンの部分は、osのそれと一致しているようだ。
 2000なら 5.0.・・・ Win7なら 6.1.・・・

 で、Vistaも7も Winhlp32をアップデートするとファイルバージョンが 50.1.・・・ へと変更される。

つまり、Vista以降(OSのメジャーバージョンが6以降)の場合は、%SystemRoot%にあるWinhlp32.exeのファイルバージョンのメジャーの部分が50になっていたら、Winhlp32はアップデートされていて、正常にヘルプファイルが開ける。  6.のままだったらヘルプファイルは開けずにWindowsヘルプとサポートのダイアログが表示される。

 ということに 結論付けることに しよう というか もうこの判定方法しか思いつかないので いいにする。

追記

 実行中のOSがなんなのかを取得するのに、単純にGetVersionExを使用しただけでは、アプリケーションが互換モードで実行されている場合、dwMajorVersionには、設定されている互換モードのメジャーバージョンが返ってきてしまい、 本当のOSが分からない。
 なので、レジストリのCurrentVersionを調べることにしてみたら、これまた、アプリケーションが開始されるとアプリケーションからのレジストリ参照はバーチャルレジストリへの参照となるので、GetVersionExと同じ値が返ってくる。
 
 いろいろ調べて、結局 アプリケーションの互換性の設定は、レジストリの
 HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
  に記録されることとが分かり、ここを調べてみて GetVersionExの調査結果と照らし合わせて、本当のOSを判定することにした。

 今回おまけで分かったのは、逆にさっきのレジストリを設定すると 互換性の設定がアプリケーション側から出来ること。

更に追記

 互換性の設定を「すべてのユーザーの設定」で行うと、レジストリのルートキーはHKEY_CURRENT_USERではなくて、HKEY_LOCAL_MACHINEの方に記録されることが判明

 なので両方をチェックして初めて、互換モードの設定が確定するのだ。


ho_cad at 10:37|PermalinkComments(0)TrackBack(0)

2011年05月26日

UACは強敵だった

 VBPのヘルプ作りはひとまず 完成 ということにしました。

 で今度は 宿題にしていたユーザーアカウント制御とDDEのOPENマクロのぶつかり回避に取り掛かりました。

 エクセルとかPaoとかはデータファイルをダブルクリックして開く場合、開くファイルの情報を実行時引数としてではなく、DDEからのOPENマクロの実行要求によって開いています。

 こういうソフトでは、ファイルをダブルクリックした後で、アプリケーションが準備OKになる前にユーザーアカウント制御の確認が掛かって「ちょっと待った!」になると、アプリケーション側の準備が整う前にDDEの要求が発せられて でも受け取るべきアプリケーションの準備は中断されているし で
 
 UACError のエラーが出てしまいます。

 この現象をなんとか綺麗に回避できないものかといろいろ試行錯誤してみましたが、そもそもUACは勝手にアプリケーションを起動させないようにするための機能なので、どうやってもスッキリしたことにならず、しょうがなしに 対処療法に走りました。

 エラーが出た後で、上手くファイルが開けなかった というのは検出できるので、 そのことを表示して、その対処方法のヘルプに誘導することにしました。
FileOpenErrorDlg

 

 ここからヘルプを表示します。

 UacHelp

 まあ、これしかないかー という感じ。

 それにしても Vista以降のユーザーアカウント制御 というのは めんどくさいわ



ho_cad at 20:30|PermalinkComments(4)TrackBack(0)

2011年05月25日

ついに 組み込み関数のヘルプを書き上げたぞー

 書いたー !
 ついに 書き上げたー 関数58個(だったかどうかも・・・)

 これだけあればVBPから何でも出来るのではないか! 
Functions

 一般的な幾何計算から地理計算まで網羅。 ほかなことにも使えそう。

Func_Cross4
 

 一口に交点計算といっても、交点のでき方によってやりたいことが変わって来るので実際の関数はこんな感じになります。 

 Func_XYtoBL

 逆にヘルプはこういうのが単純で作りやすいです。

 はぁー とうとう 全部打ったわー

 

ho_cad at 20:07|PermalinkComments(4)TrackBack(0)

2011年05月23日

実用VBP第2弾

 Paoには図郭とトンボの自動作成機能がない。
 一応、汎用CADというポリシーがあるので・・・

 そこで、測量座標系がちゃんと設定されている図面で、図枠の下書きからXY座標軸が付いた図郭を自動作成するマクロを作りました。

CreateXYFrame

座標軸を書き込むのは結構面倒な作業なので、これだけでも随分便利です。

'矩形を選択して座標値付きの図郭を作成
Sub CreateXYFrame()
  If Selection.Count <> 1 Then Exit Sub
  If Selection.First.FeatureType <> hoc_Polyline Then Exit Sub
  '座標値文字のフォント設定
  With FontSeting
    .Height = 4.0
    .Width = 4.0
    .FontName = "MS 明朝"
  End With

  '内側の枠を作る
  PenNo = 1
  LineKind = 1
  Set Verts1 = New CoordList
'頂点座標リスト
  Verts1.Add Selection.First.Verts(0)
'右下
  Verts1.Add Selection.First.Verts(1)
'左下
  Verts1.Add Selection.First.Verts(2)
'左上
  Verts1.Add Selection.First.Verts(3)
'右上
  DrawPolyline Verts1, hoc_oc_Close
 
'左下角の測量座標値を計算する
  Set SvyLeftBottom1 = GroupInfo(0).PosToSvyCoord(Selection.First.Verts(1))
 
  'X座標値の書き出し
  BaseX1 = Fix(SvyLeftBottom1.X / 100) * 100
  Set LeftBase1 = GroupInfo(0).SvyCoordToPos(CoordXY(BaseX1, SvyLeftBottom1.Y))
  Set RightBase1 = CoordXY(Verts1.Item(0).X, LeftBase1.Y)
  While LeftBase1.Y < Verts1.Item(2).Y  
    DrawLine LeftBase1, CoordXY(LeftBase1.X - 15, LeftBase1.Y)
    DrawText CoordXY(LeftBase1.X - 7.5, LeftBase1.Y), CStr(BaseX1)
    DrawLine RightBase1, CoordXY(RightBase1.X + 15, RightBase1.Y)
    DrawText CoordXY(RightBase1.X + 7.5, RightBase1.Y), CStr(BaseX1)
    LeftBase1.Offset 0, 100 * 1000 * GroupScale(0)
    RightBase1.Offset 0, 100 * 1000 * GroupScale(0)
    BaseX1 = BaseX1 + 100
  Wend  
  BaseY1 = Fix(SvyLeftBottom1.Y / 100) * 100 + 100
  Set BottomBase1 = GroupInfo(0).SvyCoordToPos(CoordXY(SvyLeftBottom1.X, BaseY1))
  Set TopBase1 = CoordXY(BottomBase1.X, Verts1.Item(2).Y)

  'Y座標値の書き出し
  While BottomBase1.X < Verts1.Item(0).X  
    DrawLine BottomBase1, CoordXY(BottomBase1.X, BottomBase1.Y - 15)
    DrawText CoordXY(BottomBase1.X, BottomBase1.Y - 7.5), CStr(BaseY1), 270
    DrawLine TopBase1, CoordXY(TopBase1.X, TopBase1.Y + 15)
    DrawText CoordXY(TopBase1.X, TopBase1.Y + 7.5), CStr(BaseY1), 270
    BottomBase1.Offset 100 * 1000 * GroupScale(0), 0
    TopBase1.Offset 100 * 1000 * GroupScale(0), 0
    BaseY1 = BaseY1 + 100
  Wend  

  '外側の枠を作る
  PenNo = 2
  Verts1.Item(0).Offset 15, -15
  Verts1.Item(1).Offset -15, -15
  Verts1.Item(2).Offset -15, 15
  Verts1.Item(3).Offset 15, 15
  DrawPolyline Verts1, hoc_oc_Close

End Sub

 こうして、サンプルとしてではなく、実際に使用するものを作成してみると、作りづらいところがよく見えてきます。
 その都度 チューニングしつつ、だいぶそれなりにコーディングできるようになってきました。
今は、とにかくVBPのヘルプが直ぐに表示されるようにしたので、それだけでだいぶ楽になりました。

 今はこれを「マイマクロ」に置いていますが、こういったユーティリティマクロが増えていくと、やっぱりアドインマクロのような機能が欲しくなります。 これは まあ 後々の課題で・・・

 まだバグもちらほら 見つかりますが、もうかなりレアケースのバグばかりになってきました。 
 Pao自体は、ほぼ自分中での「こういうCADだったらいいなー」というものになって来た感じです。
 あとはVBPのヘルプを完成させるのみ!



ho_cad at 21:06|PermalinkComments(2)TrackBack(0)