2009年4月アーカイブ

Test [MT4/HighSlide]

HighSlideを入れてみたのでテストです。

vpg.jpg

一応できたみたいですけど、cssへのpathが間違っているような気が・・・(汗

あと、
class="highslide" onclick="return hs.expand(this)" onkeypress="return hs.expand(this)"

をHTMLモードにして毎回挿入するのはちょっと面倒ですね。リッチテキストエディタから画像挿入したときに勝手に入るように出来ないものか・・・、ちょっと模索してみます。


しかもなんかエディタの挙動がおかしくなってる・・・


以前紹介した海外のブログ「Through the Interface」さんのRSSフィードをたまに読んでいるのですが、興味深い話題がありましたので紹介します。

DevTV: AutoCAD VBA to .NET Migration Basics (Through the Interface, 2009.4.21)

As mentioned in a comment on a recent post, Stephen Preston, our DevTech Americas Manager, has put together a useful tool and accompanying DevTV session to help people migrate their VBA code to VB.NET. The resultant code uses COM Interop to call into AutoCAD.

VBAプロジェクトをVB6プロジェクトに変換するプログラムというのがあるというのは少し前から知っていました(使い方が分からなかったですけど(汗))。この記事では、VBAプロジェクトをVB.NETプロジェクトに変換するという話題について書かれています。また、DevTVの解説ムービーファイル(のzip)や実際のVB.NETプロジェクト(のzip)なども掲載されています。

なお、ムービーはオンラインでも以下のアドレスから見られるようです。

http://download.autodesk.com/media/adn/VBA_Migration/DevTV_Recording/VBA_Migration.html


会計検査対策等でしばらく忙しい日が続いています。

最近作ったのは、Lineオブジェクトを連続で選択していって合計延長を出すマクロくらいです。今までに作ったものを流用できたので15分ほどで作れてしまいました。結構習熟してきたかも・・・(汗
その次にポイントを次々に選択していって合計延長を出すマクロを作りたいんですが、多忙のためにしばし断念しています。会検明けには取りかかれるでしょうか。



さて、日本のAmazonの洋書コーナーに1点在庫があったのでポチってしまいました。USに比べると随分と高いんですが・・・

ac06vba01.jpgまだ届いたばかりなので中身をじっくり見ていませんが、WindowsAPIを使うとか、他のApplicationへの接続方法とかが書いていて参考になりそうな気がします・・・。

これ買った後、ついカッとなって、Amazon.USで「VB.NET Programing for AutoCAD Customize Level1」をポチってしまいました。USからのインポートは初めてなので到着するか不安ですが、たぶん船便。3~5週間後に来るはずです。

実は結構楽しみです。

[AV] YAMAHA AX-V565のレビュー記事

ヤマハのAVアンプで快適エンタテイメントライフ! (Phile-web, )
ハイCPモデルAX-V565の実力を試す: レポート 折原一也氏 (Phile-web, 2009.4.23)

AV情報雑誌「AVレビュー」でAV機器ファンから支持されているAV系ニュース・レビューサイトPhile-webにて、YAMAHA AX-V565のレビュー記事が掲載されました。

---
YAMAHA AVアンプ(ミドルレンジ以下)ファンの私が今現在最も気になっているAX-V565、そのレビューが掲載されました。ユーザーにしてみるとやはりこういった性能評価をしてくれる記事というのは非常にありがたいです。

機能面では従来DSP-AX863以上に搭載だった1080pへのHDビデオアップスケーリングが搭載されたのが最も素晴らしい点。安月給でなかなか手を出しづらかったのですが、V565ならなんとか・・・(汗)。

個人的に難をいえば、メインスピーカ以外のスピーカ端子がプッシュ型なのがやはり貧弱です。現在バナナプラグを使っているので対応して欲しかったですが、ローエンドの機種にそれを言うのは酷かもしれませんね。上位機種になるであろう(予想ですが)V765に期待を寄せておきましょうか。

マクロの発想は仕事の中から生まれることが多いのですが、今回も正にそうでした。

系統図を作成していて背景が1/2500のラスターイメージです。色は8か254あたりに設定していますので全く見づらいという訳ではないです。ただ、やはり細かいところで見づらい部分が出てきます。それで表示をオフにするのですが、今度は背景ラスターを確認したくなります。そのたびにラスター枠を選んで表示プロパティを切り替えるという作業が発生します。拡大していたりするとラスター枠が見えるまで縮小してから選択したりと単純なようで意外に面倒な作業です。また、あらかじめ、「修正」→「オブジェクト」→「イメージ」→「フレーム」→「1」と選んで境界枠が表示されるようにしておかなくてはいけません(これをしておかないと、クイック選択に頼らないといけなくなります)。

そこで、ツールバーのアイコンをクリックしたらラスター表示をオン/オフできるようなマクロを組むことにしました。


■ §1. 基本的な仕組みで理解する

今回のマクロは簡素化すると以下のような流れとなります。

図面内のラスターイメージオブジェクトを取得

ImageVisibilityプロパティを取得

TrueだったらFalseに、FalseだったらTrueにする

※注意:VisibleプロパティではなくImageVisibilityプロパティになります。

はじめVisibleプロパティをFalseにしてしまい、画面から全く見えなくなって焦りました(汗) それでRasterオブジェクトのヘルプを見直したところ、ImageVisibilityプロパティを発見したというわけです。


■ §2. オブジェクトの取得ってどうやるの?

今まで作ってきたマクロでは、図形オブジェクトの取得をGetEntityメソッドでクリックして選んだり、選択セットを作成した上でSelectOnScreenで選択または範囲選択して取得していました。
これに対して、今回のマクロではマクロを起動したら勝手に取得してくれなければなりません。ここのところの処理を考えるのに一番苦労しました。

愛用している開発者用ヘルプの「AutoCAD VBA/ActiveXレファレンス」から、「Selectなんとか」や「Getなんとか」というメソッドがないか、「取得」「オブジェクト,追加」というキーワードなどで探しました。一通り見ましたが、「ある特定のオブジェクトを取得するメソッド」という都合の良いものはやはりありませんでした(笑)

繰り返しますが、ポイントは「手を動かさずに取得する」ことです。そして見つけたのが、SelectionSetオブジェクトからリンクされたSelectメソッドです。

Selectメソッド:オブジェクトを選択し、それを選択セットに配置する

構文
object.Select Mode[, Point1][, Point2][, FilterType][, FilterData]

    object : SelectionSet
    Mode : acSelectionSetAll = すべてのオブジェクトを選択する


これによって図面内の全てのオブジェクトを選択セットに取得することが出来ました。


■ §3. 選択セットからラスターオブジェクトだけ抜き出すには?

図面内の全てのオブジェクトが選択セットに配置されました。それなら選択セット内からラスターイメージだけを抜き出せばいいのではないか、と考えました。

更に調べていくと、Itemメソッドというのが使えそうでした。

Itemメソッド:コレクション、グループ、または選択セット内の指定された
              インデックスにしたがって、メンバー オブジェクトを取得します。

構文
Set RetObject = object.Item(Index)

    object : SelectionSet
    Index : 整数または文字列。整数の場合は0からN-1までとし、この場合 N は
            コレクションまたは選択セット内のオブジェクトの数


この時、N = SelectionSet.Count で取得できますので、For Nextループで処理が可能です。つまり、0~N-1番目のオブジェクトを一つ一つチェックしていき、ラスターイメージなら処理をする、という構造が作れます。

この時の注意点を一つ。但し書きに「このメソッドに対する戻り値のタイプは IAcadObject です。」とあります。そこでまたハテナ? IAcadObjectって何? AcadObjectとどう違うの?ということで前のエントリーに書きました。結局分かってないままなのですが...。


最終的なコードは以下となります。

Option Explicit

Public Sub RasterOnOff()

    ' ラスターの表示をオン/オフするマクロ
    '  ※実行すると即反映されます。
    
    Dim SentakuSet As AcadSelectionSet
    Dim objEnt As IAcadObject
    ' ※Itemメソッドに対する戻り値のタイプは IAcadObject です。
    Dim intCnt As Integer
    Dim n As Integer
    Dim boolTF As Boolean
        
    ' エラー処理
    On Error GoTo ersub
                
    ' 選択セットの追加
    Set SentakuSet = ThisDrawing.SelectionSets.Add("SS15")
    
    ' 選択セットに画面上の全てのオブジェクトを追加
    SentakuSet.Select acSelectionSetAll
    
    ' 選択セット内のオブジェクト数を取得
    intCnt = SentakuSet.Count
    
    ' オブジェクトの数だけループ処理
    For n = 0 To (intCnt - 1)
    
        ' 選択セット内のn番目のオブジェクトを取得
        Set objEnt = SentakuSet.Item(n)
        ' ※Setステートメントが無いとError91になる
        
        ' オブジェクトがラスターなら処理
        If objEnt.ObjectName = "AcDbRasterImage" Then
            boolTF = objEnt.ImageVisibility
        
            ' 処理:ImageVisibilityプロパティ値の変更
            If boolTF = True Then
                objEnt.ImageVisibility = False
                objEnt.Update
                ThisDrawing.Utility.Prompt "ラスターを不可視に _
                                                      変更しました。"
            
            Else
                objEnt.ImageVisibility = True
                objEnt.Update
                ThisDrawing.Utility.Prompt "ラスターを可視に _
                                                      変更しました。"
            
            End If
        End If
    Next
    
    ' 選択セットを削除
    SentakuSet.Delete
    
    Exit Sub
    
ersub:

    ' エラーをクリア
    Err.Clear
    ' 選択セットを削除
    SentakuSet.Delete
    
End Sub


早速ツールバーに登録しました。

これは!!! すごい便利になりました。アイコンをクリックするだけでラスター表示のオンオフが可能に。いやまあそういう様に作ったので当然なのですが、実際使うと非常に便利でした。

このマクロは皆さんにも自信を持ってお薦めできると思います。良かったら試してみて下さい。

 

[ 2009.5.30 02:40 追記 ]

選択セット内のオブジェクト数を取得する場合、整数型(Integer型)では32,768個までしか扱えません。ちょっと大きめの図面ファイルだとオーバーしている可能性が高いです。したがって、長整数型(Long型)に変更して下さい。Long型では2,147,483,648個(約21億個)までのオブジェクトに対応出来ます

次のマクロを作っている途中にヘルプだったかWebだったか忘れたんですが、違いを書いてあるところがありました。再度探してみたけど見つかりません(汗

記憶によると・・・

  • AcadObject型・・・全てのオブジェクト
  • AcadEntity型・・・図形オブジェクト
acad.jpg



らしいです。図形以外のオブジェクトとは、例えばApplicationオブジェクトとかLayerオブジェクトなどだと思います。

これはとりあえず(なんとなく)理解できたのですが、もっと理解できないものが出てきました。

AcadObject型 と IAcadObject型 の違いって何?


検索してもヒット数が少なく、すこし見てみましたが分かりませんでした。

DWG TrueView 2008, 2009はフリーでDWGの参照や印刷が可能です。見た目は本当に編集機能を省いたAutoCADそのものです。しかし、よくある連続印刷はスクリプトを使ったものであるため、TrueViewでの使用ができません。(もちろんVBAも出来ません。)

それならば、.NETから接続してやってなんとか制御できないか・・・。


という妄想を思いつきました。
前にAutoCADと.NETの関連書籍が海外にしかなさそうだということを調べてたんですが、Amazon.jpで洋書の取り扱いもあったなと思い、調べてみました。やっぱりありませんでした。残念。Amazon.usから取り寄せるしかなさそうです。





ただ、AutoCAD2006とVBAの本なら日本でも買えるようです。

AutoCAD 2006 VBA: A Programmer's Reference (Programmer's Reference) (ハードカバー)

vba2006.jpgこれはちょっと欲しいかも。


Googleで海外で検索したところ、blogをやっている方は結構いる感じでした。
あまり調べてないんですが、ここが参考になりそうかな、と思ったところを紹介します。

■Through the Interface
AutoCADとVisual C#.NETの連携の話題を書いているようです。Visual C#.NETとVisual Basic.NETはコード変換サイトがあるのできっと役に立つだろうと思っています。

[SONY] PSP2の噂・・・

PSP2はスライドタッチスクリーンで年内登場、という説 (Engadget Japanese, 2009.4.7)

開発は当然している(だろう)、PowerVR系の新グラフィックスコアを採用(かもしれない)、UMD廃止(もありうる)とさまざまな説が囁かれている次世代PSPにまたあらたなうわさが出てきました。英Pocket Gamerが「新PSPのハードウェア開発にかかわるインサイダー」なる人物から得たと主張するところによれば、新型PSPはスライド式のタッチスクリーンとゲーム用キー・ボタンを備え、現在のPSPよりもiPhoneに似たデバイスになるとのこと。

閉じた状態ではiPhone / iPod touch的な全面タッチスクリーン、開くとゲームコントローラボタンが現れるというのは、おなじみ「ぼくが考えた新PSP」(下の画像)を読んで形容したかのような表現です。さらに「インサイダー」によれば、アナログ方向キーがついに2つになるという話もあります。

あまり新鮮味がないうえにソースがあやふやなうわさとして強いておもしろい点を挙げればUMDレスになること、および今年の「クリスマス前」発売とされていることなど。PSストアでの新旧作ダウンロードなどから将来的なUMDレス路線は理解できるとして、今年年末商戦にマイナーチェンジのPSP-4000ではなく新規格の PSP2発売はなかなか激しいお話です。従来のPSシリーズのように独自アーキテクチャの高機能チップを作っている場合ではない(らしい)ことを踏まえれば、どうやら携帯ゲーム市場を本気で脅かしそうなiPhone / iPod touchに追い上げられる前に、そして任天堂に絶妙なタイミングで介入されないことを狙った電撃作戦と解釈すべきかもしれません。

hot-psp-render.jpg--
個人的にはUMDレスには反対ですね。

まず、下位互換が失われます。外付けUMDドライブでも出してくれるなら別ですが、可搬性が損なわれる可能性が高いです。

次に、メモリーの問題です。もし現在のPSPと同様にメモリースティックを使ってくるとなると、純正で16GB程度しか容量がありません。PSPストアのようなところからゲームを購入してきても容量があっという間になくなってしまうと思われます。爆裂に安くなっているSDHC系のカードに対応するか、若しくはSSDでも搭載してくるなら話は変わりますが・・・。


下水道の平面線形は概ね図-1のような感じです。

ss000084.jpg
図-1

◎表示は組立1号マンホールです。◎の中心を結んだ線分の延長がマンホール間距離になります。図-1でいうと L=12.00m などと記入している部分です。

今回はこの延長表示を手軽に作成できるマクロを組んでみました。上図を単純化したものが以下の図-2です。

ss000085.jpg
図-2

人により違うかもしれませんが、平面図を描くときは、マンホールの丸を描いて、それを結ぶ線分を引きます。上図にはありませんが、実際には線の端点に丸があると思って下さい。言わずもがなですが、図-1のようにするにはこの丸で線分をトリムします。

さて、せっかくAutoCADで実寸で図面を引いているのですから、これをうまく使わない手はありません。線分オブジェクトには長さや角度のプロパティがありますので、これらを使って文字をおいていくことにしました。

コーディングの概要です。

  1. 線分を選択(GetEntityメソッド)
  2. 長さと角度を取得(Lengthプロパティ、Angleプロパティ)
  3. 線分の始点と終点の座標を取得(StartPointプロパティ、EndPointプロパティ)
  4. 線分の中点の座標を計算
  5. 延長を整形して中点を基点として文字を作図(AddTextメソッド)
  6. 文字を線分の角度に合わせて回転する
  7. 文字の基点を下中心にする
  8. 文字の基点座標を改めて線分の中点座標にする
  9. 文字オブジェクトの表示を更新
となります。

テスト段階では文字の高さを固定していましたが、高さを最初に入力できるようにしました(GetRealメソッド) この入力の部分については「SeaGate Annex : VBAではじめるAutoCADカスタマイズ 第7回」を参考にさせて頂きました。

実際のコーディングは以下のようになります。

Option Explicit

Public Sub LineLongText()

start:

    Dim ReturnObject As AcadEntity
    Dim BasePoint As Variant
    
    Dim StartPoint As Variant
    Dim EndPoint As Variant
    Dim InsPoint(0 To 2) As Double
    Dim Height As Single
        
    Dim LengthMeter As Double
    Dim strLength As String
    Dim dblAngle As Double
    
    Dim objTxt As AcadEntity
    
    ' Null/0/マイナス値を入力できないようにする
    Call ThisDrawing.Utility.InitializeUserInput(1 + 2 + 4)
    
    ' 文字高さを実数入力
    Height = ThisDrawing.Utility.GetReal("文字高さを入力:")
    
main:
    
    ' エラー処理
    On Error GoTo ersub
    
    ' オブジェクトの選択:GetEntityメソッド
    ThisDrawing.Utility.GetEntity ReturnObject, BasePoint, _
        "線分を選択して下さい / Cancel=ESC"
    
        ' 選択オブジェクトが「線分」なら処理
        If ReturnObject.ObjectName = "AcDbLine" Then
            
            ' 延長(mm)を(m)に変換
            LengthMeter = ReturnObject.Length / 1000
            ' 延長文字列を整形
            strLength = "L=" & Format(LengthMeter, "##0.00") & "m"
            
            ' 線分の角度を取得
            dblAngle = ReturnObject.Angle
                        
            ' プロンプトにて延長と角度の確認
            ThisDrawing.Utility.Prompt _
                "延長=" & strLength & _
"/ 角度=" & dblAngle & "Radian" & vbCrLf ' 線分の始点と終点の取得 StartPoint = ReturnObject.StartPoint EndPoint = ReturnObject.EndPoint ' 文字の挿入ポイントを計算(始点と終点の中間点) InsPoint(0) = (StartPoint(0) + EndPoint(0)) / 2 InsPoint(1) = (StartPoint(1) + EndPoint(1)) / 2 InsPoint(2) = (StartPoint(2) + EndPoint(2)) / 2 ' 文字を生成(内容, 挿入座標, 高さ) Set objTxt = ThisDrawing.ModelSpace.AddText(strLength, _
InsPoint, Height) ' 文字の角度を設定 objTxt.Rotation = dblAngle ' 文字の基点を「下中心」に設定 objTxt.Alignment = acAlignmentBottomCenter ' 文字の基点座標を挿入ポイントに改めて設定 objTxt.TextAlignmentPoint = InsPoint ' 文字オブジェクトを更新 objTxt.Update ' 線分選択に戻る GoTo main Else ' エラー処理:線分じゃなかったら警告を出して線分選択に戻る MsgBox "これは線分ではありません。選択し直して下さい。" GoTo main End If Exit Sub ersub: ' エラー処理
Err.Clear
 ThisDrawing.Utility.Prompt "エラー:コマンドを終了します。" End Sub

難儀したのは、座標値のデータ型です。StartPointとEndPointはVariant型で取得、AddTextメソッドで使う挿入点(InsertionPoint)は、XYZ各数値を入力するためバラバラにDouble型で設定するところです。

もう一つ難儀したのは、文字を配置した後にプロパティを変更するところで、基点座標を改めて設定し直さなければならなかった部分です。

いつものようにdvbに保存してから実行します。

ss000080.jpgここで実行。

ss000081.jpg文字高さを入力してから、線分を選択

ss000082.jpg延長がセットされました。ESCキーを押すまで連続実行されます。

ss000083.jpgこのような結果となります。




実際のところ平面図・縦断図は専用ソフトを使ってCAD生成することが多いのですが、系統図の作成などで使えるのかなと思っています。

先日のエントリーで、

  • 英数字は半角変換したいが、カタカナは半角変換したくない

という課題を残しておりました。今日、アイディアが浮かびましたので報告します。
ただし、条件があります。私の描く図面に出てくる専門用語では「ひらがなが使用されることは希です」。つまり、ひらがなを含まない文字列の場合のみを想定しています。

半角のひらがなが無いことに注目しました。

つまり、StrConvで
  • 「文字列中の全角カタカナをひらがなに変換」 (32)
  • 「文字列全体を全角から半角に変換」 (8)
  • 「文字列中のひらがなを全角カタカナに変換」 (16)
するだけです。

コードは省略します。
2本の線分の内角を求める手法についてはいくつか考えられますが、ここでは最も単純な手法として、線分オブジェクト(AcDbLine)の角度(Angle)プロパティを使ったものを使ってみました。

ss000068.jpg
図-1

図を参照して下さい。図-1のような点A, 点Bを端点とする線分があります。始点と終点が逆になると角度が180°変わることのみを注意点とします。今回は、180°以上の角度の線分は180を引いて全て0°以上180°未満の角度の線分と認識するようにしました
(例:θ2→θ1, 180°→0°, 320°→140°)

ss000075.jpg
図-2

また、図-2のように、内角を2本の線分の作る角のうちの狭い方と定義しました。

コーディングです。
前回の記事で習得したGetEntityメソッドで線分を選択し、Angleプロパティ値を取得します。
Angleプロパティ値はラジアンですので、180/π をかけて度に変換します。
結果表示はFormatステートメントで書式の整形をしました。

Option Explicit

Public Sub naikaku()

    Const PI As Double = 3.14159265358979
    
    Dim Kaku(1 To 4) As Double
    Dim naikaku As Double
    Dim GaiKaku As Double
    
    Dim n As Integer
    Dim strKekka(1 To 4) As String
    
    Dim intDo As Integer
    Dim intFun As Integer
    Dim intByo As Integer
            
    Dim returnObject As AcadObject
    Dim basepoint As Variant
    
    On Error GoTo ersub
        
    For n = 1 To 2
        
        ' 線分の選択
        ThisDrawing.Utility.GetEntity returnObject, basepoint, _
            n & "本目の線分を選択して下さい。"
        
        ' 選択したのが線分なら処理をする
        If returnObject.ObjectName = "AcDbLine" Then
        
            ' ラジアンから角度へ変換
            Kaku(n) = returnObject.Angle * 180 / PI
            
            ' 180°以上の角度は180を引いて180°未満にする
            If Kaku(n) >= 180 Then
                Kaku(n) = Kaku(n) - 180
            End If
            
            Kaku(n) = Round(Kaku(n), 4)
                        
        ' 選択したのが線分でないならメッセージを出して終了
        Else
        
            MsgBox "NG:これは線分ではありません。" & _
                vbCrLf & "コマンドをキャンセルします。"
            Exit Sub
                                    
        End If

    Next n
    
    ' 内角と外角を求める(内角<外角とする)
    Kaku(3) = Abs(Kaku(2) - Kaku(1))
    Kaku(4) = 180 - Kaku(3)
    
    If Kaku(3) <= Kaku(4) Then
        naikaku = Kaku(3)
        GaiKaku = Kaku(4)
    Else
        naikaku = Kaku(4)
        GaiKaku = Kaku(3)
    End If
    
    ' 結果
    strKekka(1) = "線1:" & Format(Kaku(1), "##0.0000") & "°"
    strKekka(2) = "線2:" & Format(Kaku(2), "##0.0000") & "°"
    strKekka(3) = "内角:" & Format(naikaku, "##0.0000") & "°"
    strKekka(4) = "外角:" & Format(GaiKaku, "##0.0000") & "°"
    
    ' AutoCADのプロンプトに表示する
    ThisDrawing.Utility.Prompt "結果:" & strKekka(1) & "/" _
        & strKekka(2) & "/" & strKekka(3) & "/" & strKekka(4)
       
    Exit Sub
    
ersub:
    
    ' エラー処理(エラーがあったら何もしないで終了)
            
End Sub

始めはMsgBoxを使って結果をダイアログ表示していましたが、AutoCADのプロンプトに表示した方がスマートだしコピペも出来るのでそのようにしてみました。

結果が小数点以下4桁で四捨五入しているので、Double型じゃなくてSingle型でもいいのかなとも思いました。

VBARUNでマクロを起動します。

ss000076.jpg線分を2本、順番に選択します。

ss000078.jpg
プロンプトに結果が表示されました。



 この手法では、線分と線分の角度は測れますが、構築線や放射線は測れません。構築線や放射線はAngleプロパティ値を持たないからです。

ss000069.jpg次回(かどうかは分かりませんが)は、図のような基点Aと2本の線分の任意の点B,Cをクリックして内角θを求めるマクロを組もうと思います。

■使いそうなメソッド、プロパティ
GetPointメソッド
returnpoint = ThisDrawing.Utility.GetPoint(,"ポイントをクリックする")
returnpoint (0) = x座標
returnpoint (1) = y座標
returnpoint (2) = z座標 (※XY平面なので使いません)
Lineオブジェクト (線分オブジェクト)
StartPointプロパティ
EndPointプロパティ
XLineオブジェクト (構築線オブジェクト)
BasePointプロパティ (基点座標)
SecondPointプロパティ (2番目の座標)
DirectionVectorプロパティ (方向, ベクトル)

前回、全角半角変換を組みましたが、他人のコードを流用したため一部意味を理解していない部分がありました。また、次にやりたいことにも関連してくるので、単純なコードでまず意味を理解することが必要です。全角半角変換のときは、選択セットを作って一括でオブジェクトを変更しましたが、次は一つだけオブジェクトを選択してプロパティ値を取得して処理したいと思っています。

ということで今回は「オブジェクトを一つだけ選択する」をやります。

AutoCAD VBAリファレンスより、それっぽい名前のメソッドを探したところ、GetEntityメソッドが見つかりました。また、サンプルコードから以下のように使うようです。

ThisDrawing.Utility.GetEntity Object, PickedPoint[, Prompt]
Object:選択するオブジェクト
PickedPoint:選択時のクロスヘアカーソルの座標
Prompt:ユーザーに入力を求めるときに表示される文字(省略可)

コーディングしてみました。GetObject.dvbで保存しておきます。

Option Explicit

Public Sub GetObject()

    ' *** オブジェクトを選択しオブジェクトのタイプ名を表示するマクロ ***
    
    'Dim ReturnObject As AcadObject
    '//疑問点: AcadObject型とAcadEntity型の違いは何?
    
    Dim ReturnObject As AcadEntity
    Dim BasePoint As Variant
    
    'オブジェクトの選択:GetEntityメソッド
    ThisDrawing.Utility.GetEntity ReturnObject, BasePoint, _
                                  "オブジェクトを選択して下さい。"
    
    'オブジェクトのタイプ名:ObjectNameプロパティ
    MsgBox "選択したオブジェクトは、" & ReturnObject.ObjectName & " です。"
    
End Sub
実際に動かしてみます。VBARUNからGetObject.dvbを実行します。

ss000071.jpg円を選択

ss000072.jpg結果

ss000073.jpg円、つまりAcDbCircleという結果が得られました。どうやら大丈夫のようです。

最後にエラー処理を加えます。上の画面の「オブジェクト選択」の際に、「ESC」キーや「Enter」キーを押すとエラーが出てしまいます。これを回避するため、On Error Gotoで飛ばします。エラー処理を加えたコードが以下になります。処理と言っても何もしないで終了させるだけですけどね。

Option Explicit

Public Sub GetObject()

    ' *** オブジェクトを選択しオブジェクトのタイプ名を表示するマクロ ***
    
    'Dim ReturnObject As AcadObject
    '//疑問点: AcadObject型とAcadEntity型の違いは何?
    
    Dim ReturnObject As AcadEntity
    Dim BasePoint As Variant
    
    'エラー処理
    On Error GoTo ersub
    
    'オブジェクトの選択:GetEntityメソッド
    ThisDrawing.Utility.GetEntity ReturnObject, BasePoint, _
                        "オブジェクトを選択して下さい。"
    
    'オブジェクトのタイプ名:ObjectNameプロパティ
    MsgBox "選択したオブジェクトは、" & ReturnObject.ObjectName & " です。"
    
    Exit Sub
    
ersub:

    'エラー時、何もしないで終了

End Sub

最後に、今回の疑問点。
コードを見れば分かりますが、AcadObject型AcadEntity型の違いが分かりませんでした。どちらにしても問題なく動きました。

カスタム検索
Access Counter
Powered by Movable Type 4.22-ja

2016年9月

Sun Mon Tue Wed Thu Fri Sat
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30