티스토리 뷰

반응형

도면 정렬에 대하여...

본 코드는 BricsCAD에서 사용중인 코드입니다.  AutoCAD와 다를수 있으니 참고바랍니다.

코드 전체글:  [CAD/VBA] - 자동출력 VBA
이 글은 코드 전체 중 출력 순서에 대한 부분만 있습니다.

  • 회사마다 도면을 정렬하는 방식이 달라 4가지 방식으로 구분 하였으니 그 중 자신의 회사와 맞는 방식을 확인하여 코드를 수정하시기 바랍니다. 


출력 순서

Enum 문(열거형변수)으로 정의.

Enum PrtSquence
    TD
    TU
    DD
    DU
End Enum


1. TD : 
    한줄 출력후 아래로 내려오며 반복.
    정렬기준점은 좌측단.

2. TU : 
    한줄 출력후 아래로 내려오며 반복. 
    정렬기준점은 좌측단.

3. DD : 
    한줄 출력후 위로 올라가며 반복. 
    정렬기준점은 좌측단.

4. DU : 
    한줄 출력후 위로 올라가며 반복. 
    정렬기준점은 좌측단.

위 스타일중 맞는형식을 사용하시면 됩니다.

저는 3번째 형식을 사용중이여서 아래와 같이 사용했습니다.

PrtSq = DD


정렬


'구조체 정의
Type PrtArea
    X1 As Double
    Y1 As Double
    X2 As Double
    Y2 As Double
End Type
'----------------------------------------------------------------------------------
Dim Doc As AcadDocument
'----------------------------------------------------------------------------------
'정렬
Sub Sort(ByRef Data() As PrtArea, Sq As PrtSquence)
    Dim lb As Integer, ub As Integer
    Dim i As Integer, J As Integer
    lb = LBound(Data)
    ub = UBound(Data)
    
    '상하 정렬
    For i = lb To ub - 1
        For J = i + 1 To ub
            '내림차순
            If Sq = TD Or Sq = TU Then
                '좌측하단기준
                If Sq = TD Then
                    If Data(i).Y1 < Data(J).Y1 Then Call CData(Data(i), Data(J))
                '좌측상단기준
                Else
                    If Data(i).Y2 < Data(J).Y2 Then Call CData(Data(i), Data(J))
                End If
            '오름차순
            Else
                '좌측하단기준
                If Sq = DD Then
                    If Data(i).Y1 > Data(J).Y1 Then Call CData(Data(i), Data(J))
                '좌측상단기준
                Else
                    If Data(i).Y2 > Data(J).Y2 Then Call CData(Data(i), Data(J))
                End If
            End If
        Next
    Next
    
    '좌우 정렬
    For i = lb To ub - 1
        For J = i + 1 To ub
            '하단기준
            If Sq = TD Or Sq = DD Then
                If Data(i).X1 > Data(J).X1 And Int(Data(i).Y1) = Int(Data(J).Y1) _
                Then Call CData(Data(i), Data(J))
            '상단기준
            Else
                If Data(i).X1 > Data(J).X1 And Int(Data(i).Y2) = Int(Data(J).Y2) _
                Then Call CData(Data(i), Data(J))
            End If
        Next
    Next
End Sub
'----------------------------------------------------------------------------------
'데이터 교환
Sub CData(ByRef D1 As PrtArea, ByRef D2 As PrtArea)
Dim tmp As PrtArea
tmp = D2
D2 = D1
D1 = tmp
End Sub

17행 Doc전역 변수로 사용했습니다.
    
UCS 초기화 함수나 다른 함수에서 접근이 가능하게 하기 위함입니다.

정렬에 대해선 따로 설명할필요는 없는것 같아 넘어가겠습니다.


코드 전체글:  [CAD/VBA] - 자동출력 VBA
사용자 변경사항 2. 프린터 설정
사용자 변경사항 3. 
출력 블럭 설정


반응형

'프로그래밍 > CAD' 카테고리의 다른 글

자동출력 VBA - 출력 블럭 설정  (0) 2018.02.09
자동출력 VBA - 프린터 설정  (0) 2018.02.09
자동출력 VBA  (1) 2018.02.08
VBA에서 사용하는 기초 LISP  (0) 2018.02.06
CAD VBA 시작  (1) 2018.02.05
댓글