図形を回転するときってどこを中心に動くの?
LocPinXとLocPinYが中心になるよ
図形を回転する時の中心ってどこだとおもいますか?何となく図形の真ん中あたり。そう!初期値は図形の真ん中あたり、シェイプシートのLocPinXとLocPinYという値で指定します。そして位置座標の基準もこの座標で決まります。今回はなんとなく動かしていた図形の位置や回転の基準点についてご紹介していきます。
ちなみにエクセルは図形の位置は左上指定なので、基準点が変えられるのは移植したりしたときにも便利です。
図形を移動・回転するときの基準点LocPinXとLocPinY
図形のどこに基準点を置いているのか気になるよね?
Visioの場合図形を回転する時の中心となる点、位置を指定する時の基準となる点はどちらもLocPinX(X座標)、LocPinY(Y座標)という値。図形ごとにどこに置くかを指定することができます。
このLocPinX,LocPinYは、図形毎に自由に設定することが可能。シェイプシートのShape Transformで図形ごとに設定することができます。
値は図形ののどこに置くか?でして、図形の左下が(0,0)になります。
例えば
LocPinX=0 LocPinY=0 であれば図形の左下
LocPinX=Width LocPinY=Height であれば右上
そして初期値は
LocPinX=Width*0.5(図形の幅の1/2) LocPinY=Height*0.5(図形の高さの1/2)つまり中心ですね。
回転するときの中心は(LocPinX,LocPinY)
LocPinXとLocPinYとは?
図形を回転させるときは丸っこい矢印のついた、ハンドルでクルッと動かすことが多いと思います。その時、回転の中心になるのは(LocPinX,LocPinY)です。
上の図形は基準点(LocPinX,LocPinY)を、図形の中心、左下、右上に置いて回転させたときのイメージです。回転角度はシェイプシートのShape TransformのAngle(deg)でも取得・設定することができます。
Sample
コード
Sub test2() Debug.Print Application.FormatResult("5 cm", "ft", "in", "#.00 u") Debug.Print Application.FormatResult(5, "cm", "in", "#.00 u") Debug.Print Application.FormatResult(5, "cm", "in", "#.0 u") Debug.Print Application.FormatResult(5, "cm", "pt", "#.00 u") End Sub
イミディエイトウインドウにcmをインチに変換した結果を出力します。
実行結果
【出力結果】 1.97 in 1.97 in 2.0 in 141.73 pt
イミディエイトウインドウにこんな数字が出力されたかと思います。
位置を指定するときの中心も(LocPinX,LocPinY)
図形をドラックして移動するときにはあまり座標は気にしないかもしれませんが、VBAを使ってコピーをする時や図形を描く時には位置を座標で指定することも多いと思います。その時、図形の基準点=図形のどこがその座標になるか?というと(LocPinX,LocPinY)です。
位置の指定はシェイプシートのShape TransformのPinX,PinYでも取得・設定することができます。
上の図形は基準点(LocPinX,LocPinY)を、図形の中心、左下、右上に置いたときのイメージです。こちらの図では3つともPinYの値を同じにしたのですが、基準点が違うのでこんな感じの配置になりました。
エクセルはピクセルだった気が・・・同じOfficeでも違うんだね
そうなの!しかもVisio内でもユーザーフォームはピクセルなんだ。紛らわしいよね。
なかなかインチと言われてもピンとこないですよね。
ページのこの辺に図形を描きたい!と言う方にA4に対してどのくらい?という大体の座標位置を書いておきます。
LocPinX,Yを指定したサンプルコード
LocPinX,Yを指定する構文
LocPinX,LocYを取得・設定するための構文はこちら。
Cells(“LocPinX”)
Cells(“LocPinY”)
シェイプシートの値を取得・設定するだけだね
サンプルコードは回転と位置指定の2つ用意したよ
Sample① LocPinX,Yを指定して図形を回転させる
コード
長方形をコピーして任意の位置に移動、右上を中心に20度回転させます。
またコピーしてさらに20度・・・
最後に長方形を指定したのと同じ位置に円を置きます。
Sub test1()
Dim shp As Object
Dim dig As Integer
dig = 20
For i = 0 To 22 Step 1
'長方形をコピーします
ActiveDocument.Pages.Item("ページ - 4").Shapes.Item("sheet.1").Duplicate
'LocPinX,Yを0にする
Set shp = ActiveWindow.Selection(1)
shp.Cells("LocPinX") = shp.Cells("Width")
shp.Cells("LocPinY") = shp.Cells("Height")
'PinX,Yを任意の位置(62mm,250mm)にする
shp.Cells("PinX") = 62 / 25.4
shp.Cells("PinY") = 250 / 25.4
'角度を付ける
shp.Cells("Angle") = dig / 45 * Atn(1)
dig = dig + 20
Next
'円をコピーします
ActiveDocument.Pages.Item("ページ - 4").Shapes.Item("sheet.2").Copy
'任意の位置(62mm,250mm)に貼り付けます。
ActiveDocument.Pages.Item("ページ - 4").PasteToLocation 62 / 25.4, 250 / 25.4, 0
End Sub
実行結果
Sample② LocPinX,Yを指定して図形を重ねる
コード
4枚の大きさの違う長方形をコピーして任意の位置に移動、左下を中心にして同じ位置に重ねます。
Sub test2()
Dim num As Integer
num = 1
For i = 0 To 3 Step 1
'長方形をコピーします
ActiveDocument.Pages.Item("ページ - 4").Shapes.Item("四角" & num).Duplicate
'LocPinX,Yを0にする
Set shp = ActiveWindow.Selection(1)
shp.Cells("LocPinX") = 0
shp.Cells("LocPinY") = 0
'PinX,Yを任意の位置(62mm,250mm)にする
shp.Cells("PinX") = 30 / 25.4
shp.Cells("PinY") = 147 / 25.4
num = num + 1
Next
End Sub
実行結果
右側が元の長方形とすると、図形は左下を中心に重なったのではないでしょうか?
エクセルが左上指定いだから、移植したときにも便利だね。