글목록

2022년 1월 27일

PowerPoint 매크로 - 회전된 도형 크기, 위치 다시 정의하기

파워포인트에 사진이나 도형을 삽입한 후 회전을 시키게 되면, 크기, 위치 정보는 회전되지 않은 원본의 폭이나, 크기 정보로부터 읽어오게 됩니다.

만약, 여러 개의 사진이나 그림을 선택하고, 폭이 5cm가 되도록 리본 메뉴나 개체 속성에서 폭이나 높이를 입력하게 되면, 회전되지 않은 개체는 원하는대로 지정이 되지만, 회전된 개체는 원하는 크기로 변경되지 않습니다.

예를 들어 아래와 같이 폭 10cm, 높이 5cm 그림을 삽입하고, 약 30도 회전(파란색 사각형)시켰다고 했을 때, 이 그림의 폭을 8cm로 바꾸게 되면, 주황색 사각형과 같이 원본의 폭을 8cm로 바꾸게 됩니다. 얼핏 생각하기에는 사진의 폭(width)이 바뀌어야할 것 같은데, 회전시키기 전의 원본 그림의 크기 속성을 바꿔버립니다.


그림이 갖고 있는 위치, 크기, 회전 정보를 각각 저장하고 있기 때문에 그러한 개념을 잘 이해하는 사람들은 개체를 컨트롤하는 것이 쉬울 수 있습니다만, 파워포인트에 도형이나 사진을 넣고 그 개체가 얼마나 회전되었는지 일일이 기억하면서 작업하는 것은 상당히 번거로운 일입니다. 다시말해, 작업자 입장에서는 그냥 그림이 회전되어있든 말든, 폭이나 높이를 변경하면 원본의 속성을 변경하는게 아니라 보이는 도형의 폭과 높이가 바뀌는게 편리하겠지요.

만약 매크로를 작성하여 도형의 크기를 일괄적으로 변경하려면, 도형의 회전 여부에 무관하게 현재 보이는 상태에서 크기를 바꿔주도록 매크로를 작성하는 것이 직관적으로 사용하기 좋은 매크로가 될 것입니다. 따라서, 현재 도형이나 사진의 회전 상태를 감안하여, 개체의 크기나 위치 정보를 수정해서 가져올 수 있다면 좋을 것입니다.

아래의 매크로는 도형의 개체속성으로부터 회전된 상태 그대로의 위치 정보를 가져오는 매크로입니다. 정보를 가져왔다고 해서, 바로 도형의 크기를 변경할 수 있는 것은 아닙니다만, 유사한 매크로를 작성하여 도형의 크기를 직관적으로 변경하는 매크로로 응용할 수 있습니다.

-----------------------------------------------

Public Const Pi = 3.14159265358979
'Shape 개체가 가지는 기본 속성 이외에 아래와 같이 회전된 개체의 위치와 크기 속성을 저장할 수 있는 type 변수를 선언해줍니다.
Public Type typePicPos
  Left As Single
  Top As Single
  Height As Single
  Width As Single
  Rotation As Single
  CX As Single
  CY As Single
End Type
-----------------------------------------------
'회전된 도형이 있다면, 회전 각도를 읽어와서 0~90도의 1사분면 회전각에 대응시켜줍니다. 이는 시계방향으로 30도 회전한 것과 반시계방향으로 30도로 회전한 도형은 폭이나 높이가 같기 때문에 1사분면 각도에 대응시켜서 계산해줍니다.
Function Get1QAngle(iAngle As Single) As Single
  Dim tAngle As Single
  tAngle = iAngle
  Do While tAngle < 0
    tAngle = tAngle + 360
  Loop
  Do While tAngle >= 360
    tAngle = tAngle - 360
  Loop  

  If tAngle > 90 And tAngle <= 180 Then
    tAngle = 180 - tAngle
  ElseIf tAngle > 180 And tAngle <= 270 Then
    tAngle = tAngle - 180
  ElseIf tAngle > 270 And tAngle <= 360 Then
    tAngle = 360 - tAngle
  End If
  Get1QAngle = tAngle
End Function
-----------------------------------------------
'임의의 도형이나 사진(Shape 개체)을 입력하면, 개체의 회전각을 읽어와서 현재 보여지는 상태의 폭과 높이, 중심점, 왼쪽 및 위쪽 좌표 등 위치, 크기 정보를 재계산해서 반환해줍니다.
Function GetPositionOfRotatedShape(iSh As Shape) As typePicPos
  Dim tPos As typePicPos
  With iSh
    tPos.Rotation = Get1QAngle(.Rotation)
    tPos.CX = .Left + .Width / 2
    tPos.CY = .Top + .Height / 2
    tPos.Width = .Width * Cos(tPos.Rotation / 180 * Pi) + .Height * Sin(tPos.Rotation / 180 * Pi)
    tPos.Height = .Height * Cos(tPos.Rotation / 180 * Pi) + .Width * Sin(tPos.Rotation / 180 * Pi)
    tPos.Left = tPos.CX - tPos.Width / 2
    tPos.Top = tPos.CY - tPos.Height / 2
  End With
  GetPositionOfRotatedShape = tPos
End Function
-----------------------------------------------

댓글 없음:

댓글 쓰기

의견이나 질문이 있으신 분은 언제든지 댓글을 달아주세요~

많이 본 글 :