관련: 지식인

 

상황이나 도형의 형태에 따라 다르겠지만

점과 점 사이의 평행을 맞추기가 쉽지 않은 경우

점편집보다는 기존 도형에서 임의의 사각형 도형을 도형병합(빼기)로 빼는 방법을 추천합니다.

다른 방법으로는

VBA를 이용해서 정확한 수치로 좌표를 이전 노드 혹은 다음 노드의 좌표와 일치시킬 수 있습니다.

아래와 같은 사각형(Freeform)이 있을 때 노드는 총 5개로 구성됩니다. 시작 노드와 마지막 노드는 같아야 닫힌 도형이 됩니다. 노드의 x,y 좌표는 슬라이드 크기 px값으로 나타냅니다. 아래의 경우 720 * 405입니다.

printXY매크로를 실행해서 각 노드의 구성을 살펴볼 수 있습니다.

(참고: 이 경우는 직선 도형인 경우로 꼭지점 개수 +1 개의 노드가 존재하지만

만약 곡선이 들어간 경우에는 곡선인 한 점에 대해 베지어 곡선을 이루는 흰색 안내점 2개의 노드가 추가됩니다.)

 1             0             405 
 2             6.6           7.8 
 3             720           0 
 4             720           405 
 5             0             405

위와 같이 printXY명령으로 5개의 노드의 x, y좌표값을 알 수 있습니다.

문제는 2번 노드입니다.

이 경우 2번 노드의 x좌표를 1번 노드의 x좌표와 동일하게 바꾸면 세로로 수직인 도형이 됩니다.

이 때 alignX 2 라는 명령을 실행하면 2번노드의 x 좌표를 이전 노드인 1번 노드의 x좌표와 일치시켜서 세로로 직각인 도형으로 만들어 줍니다.

또한 alignY 2, false라는 명령을 실행하면 2번노드의 y좌표를 다음 노드인 3번 좌표의 y좌표와 일치시켜서 가로로 평행인 도형으로 만들어 줍니다.

결국 두 개 명령을 모두 실행하면 2번 노드가 세로, 가로로 평행인 직각 사각형으로 바뀌게 됩니다.

실행화면:

 

다른 도형의 경우도 도형을 선택하고 Ctrl-G실행창을 켜고 printXY로 먼저 노드의 구성을 알아보고

원하는 노드의 인덱스(순서)를 지정해서 alignX나 alignY를 실행해서 가로나 세로로 평행인 도형으로 바꿔줄 수 있습니다.

 

전체 코드입니다:

 

Sub printXY()

    Dim shp As Shape
    
    On Error Resume Next
    Set shp = ActiveWindow.Selection.ShapeRange(1)
    With shp.Nodes
        For i = 1 To .Count
            Debug.Print i, .Item(i).Points(1, 1), .Item(i).Points(1, 2)
        Next i
    End With
    
End Sub

Sub alignXY()
    
    ' n번째 좌표의 Y값을 n-1번째 좌표의 Y값과 일치 즉 세로로 평행하게 만드는 경우
    '=> alignY n
    
    alignX 2            '2번째 노드를 이전 x좌표와 일치시킴
    alignY 2, False     '2번째 노드를 다음 y좌표와 일치시킴
    
End Sub

Function alignX(index As Integer, Optional prev As Boolean = True)
    Dim shp As Shape
    Dim x!, y!, ii As Integer

    Set shp = ActiveWindow.Selection.ShapeRange(1)
    With shp.Nodes
        If prev Then ii = index - 1 Else ii = index + 1
        x = .Item(ii).Points(1, 1)
        y = .Item(index).Points(1, 2)
        .SetPosition index, x, y
    End With
    
End Function

Function alignY(index As Integer, Optional prev As Boolean = True)
    Dim shp As Shape
    Dim x!, y!, ii As Integer

    Set shp = ActiveWindow.Selection.ShapeRange(1)
    With shp.Nodes
        If prev Then ii = index - 1 Else ii = index + 1
        x = .Item(index).Points(1, 1)
        y = .Item(ii).Points(1, 2)
        .SetPosition index, x, y
    End With
    
End Function

샘플 파일 첨부합니다.

 

editpoints1.pptm
0.04MB