2011年05月
2011年05月31日
SXF3.1の書き出しをちょっだけ変更しました
Ver2の保存は今までどおりで、3.1形式で書き出す場合は、常に 背景色=白 の設定を書き出すことにしました。
データを渡した相手が持っているソフトがVer3.1に対応していたら、その方が図面の背景色を明示的に渡すことができるからです。
今日から公式ガイドのVBPの部 を書き始めました。
サンプルを と思い、他のソフトで保存されたSXFファイルの図形化されていないプロットマークを一気にブロック図形に変換するVBPを作りました。
いざ 作り始めると、やっぱりメソッド不足に直面し、その都度 メソッドの追加と 同時にVBPヘルプへの追記をするので なかなか前に進みません。
やっぱり まだ メソッド不足かなー という感じです・・・ が、 実際にそれに直面しないと なかなか思いつかないので「まあ 公開後は要望しだいで 追加すればいいかー」 という結論にむりやり持って行き、 作り上げました。
外変では不可能なようなことが できていますv( ̄∇ ̄)v
2011年05月30日
Vista以降のヘルプシステムでWinhlp32用のヘルプファイル(備忘録)
チェックしてみたこと。
・ %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の方に記録されることが判明
なので両方をチェックして初めて、互換モードの設定が確定するのだ。
2011年05月26日
UACは強敵だった
で今度は 宿題にしていたユーザーアカウント制御とDDEのOPENマクロのぶつかり回避に取り掛かりました。
エクセルとかPaoとかはデータファイルをダブルクリックして開く場合、開くファイルの情報を実行時引数としてではなく、DDEからのOPENマクロの実行要求によって開いています。
こういうソフトでは、ファイルをダブルクリックした後で、アプリケーションが準備OKになる前にユーザーアカウント制御の確認が掛かって「ちょっと待った!」になると、アプリケーション側の準備が整う前にDDEの要求が発せられて でも受け取るべきアプリケーションの準備は中断されているし で
この現象をなんとか綺麗に回避できないものかといろいろ試行錯誤してみましたが、そもそもUACは勝手にアプリケーションを起動させないようにするための機能なので、どうやってもスッキリしたことにならず、しょうがなしに 対処療法に走りました。
エラーが出た後で、上手くファイルが開けなかった というのは検出できるので、 そのことを表示して、その対処方法のヘルプに誘導することにしました。

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

まあ、これしかないかー という感じ。
それにしても Vista以降のユーザーアカウント制御 というのは めんどくさいわ
2011年05月25日
2011年05月23日
実用VBP第2弾
Paoには図郭とトンボの自動作成機能がない。
一応、汎用CADというポリシーがあるので・・・
そこで、測量座標系がちゃんと設定されている図面で、図枠の下書きからXY座標軸が付いた図郭を自動作成するマクロを作りました。
座標軸を書き込むのは結構面倒な作業なので、これだけでも随分便利です。
'矩形を選択して座標値付きの図郭を作成
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のヘルプを完成させるのみ!


