목록으로

Object Collection()

Pml Basic 5

Object Collection은 기존 PML1 방식보다 사용하기 번거롭습니다.

하지만 2개이상의 Search Scope를 설정 할 수 있다는 장점, Collect 되는 Data 타입이 String이 아닌 Dbref라는점에서 좀 더 효율적인 collect가 필요할떄 사용합니다.


1. OBJECT COLLECTION의 정의

OBJECT COLLECTION은 E3D에서 기본 제공되는 Object로 특정 범위(Scope), 타입(Type), 필터(Filter) 등을 설정하여 조건에 맞는 객체들을 수집합니다.

  • 구문:
!oCollection = OBJECT COLLECTION()

이 구문을 통해 Object Collection을 생성할 수 있습니다.


2. OBJECT COLLECTION의 주요 메서드

OBJECT COLLECTION은 데이터를 수집하고 필터링하기 위한 다양한 메서드를 제공합니다. 여기서는 자주 사용되는 메서드와 그 예제를 설명합니다.

1. SCOPE(STRING scope)

SCOPE 메서드는 Object Collection이 데이터를 수집할 범위를 설정합니다. Scope는 WORLD(전체 모델), CE(현재 요소), 또는 특정 영역 등으로 설정할 수 있습니다. Scope를 설정하면 그 범위 내에서만 객체를 수집합니다.

  • 예제:
!oCollection.SCOPE(WORLD)

이 예제에서는 전체 모델(WORLD) 범위에서 객체를 수집하도록 설정합니다.

2. ADDSCOPE(STRING scope)

ADDSCOPE 메서드는 추가적인 범위를 설정하여 여러 범위에서 데이터를 수집할 수 있게 합니다. 이 메서드를 사용하면 초기 SCOPE에서 지정한 범위 외에 다른 범위도 추가로 포함시킬 수 있습니다.

  • 예제:
!oCollection.addscope(REF OF /ZONE1)

이 예제에서는 /ZONE1이라는 특정 영역을 추가하여, 초기 SCOPE 외에도 이 영역에서 데이터를 수집하도록 설정합니다.

3. TYPE(STRING type)

TYPE 메서드는 수집할 객체의 타입을 지정합니다. 이 메서드를 사용하면 특정 타입의 객체들만 수집할 수 있습니다.

  • 예제:
!oCollection.TYPE('PIPE')

이 예제에서는 'PIPE' 타입의 객체들만 수집하도록 설정합니다.

4. FILTER(STRING expression)

FILTER 메서드는 수집된 객체들 중 특정 조건에 부합하는 객체들만 필터링할 수 있도록 합니다. OBJECT EXPRESSION을 사용하여 원하는 조건을 지정할 수 있습니다.

  • 예제:
!oCollection.FILTER(OBJECT EXPRESSION(|NAME EQ 'PIPE-1001'|))

이 예제에서는 이름이 'PIPE-1001'인 객체만 수집된 객체들 중에서 필터링합니다.

5. RESULTS()

RESULTS 메서드는 설정된 조건들(SCOPE, TYPE, FILTER)에 따라 수집된 객체들을 반환합니다. 반환된 결과는 dbref 타입의 배열이며, 이 배열을 사용해 후속 작업을 수행할 수 있습니다.

  • 예제:
!result = !oCollection.RESULTS()

이 예제에서는 수집된 객체들을 결과로 반환합니다.


3. OBJECT COLLECTION의 사용법

OBJECT COLLECTION은 주로 특정 조건에 맞는 객체들을 수집하고, 수집된 객체들을 활용해 다양한 작업을 수행하는 데 사용됩니다. 일반적인 사용 과정은 다음과 같습니다:

  1. Object Collection 객체 생성: !oCollection = OBJECT COLLECTION()
  2. Scope 설정: !oCollection.SCOPE(...) 또는 !oCollection.addscope(...)
  3. 타입 지정: !oCollection.TYPE(...)
  4. 필터 적용: !oCollection.FILTER(...)
  5. 결과 얻기: !result = !oCollection.RESULTS()

이 과정에서 Scope와 Type을 설정하고, 필터를 통해 필요한 데이터를 정확하게 수집한 후, 수집된 결과를 활용해 작업을 수행할 수 있습니다.


4. OBJECT COLLECTION을 사용한 예제

다양한 예제를 통해 OBJECT COLLECTION의 활용 방법을 더욱 자세히 알아보겠습니다.

예제 1: 전체 모델에서 모든 파이프 수집


$* Object Collection 객체 생성
!oCollection = OBJECT COLLECTION()

$* Scope를 WORLD로 설정하여 전체 모델에서 수집
!oCollection.SCOPE(WORLD)

$* 파이프 타입의 객체들만 수집하도록 설정
!oCollection.TYPE('PIPE')

$* 설정된 조건에 따라 객체들을 수집
!pipes = !oCollection.RESULTS()

$* 수집된 파이프들의 이름을 출력
DO !pipe values !pipes
    $P $!pipe.NAME
ENDDO

설명: 이 예제는 전체 모델에서 타입이 'PIPE'인 모든 객체를 수집하고, 그 객체들의 이름을 출력합니다.

예제 2: 특정 이름을 가진 객체들 수집


$* Object Collection 객체 생성
!oCollection = OBJECT COLLECTION()

$* Scope를 현재 요소(CE)로 설정
!oCollection.SCOPE(CE)

$* 추가적으로 특정 영역을 포함하도록 설정
!oCollection.addscope(REF OF /ZONE1)

$* 이름이 'VALVE'로 시작하는 객체들만 수집하도록 필터링
!oCollection.FILTER(OBJECT EXPRESSION(|MATCHWILD(NAME, 'VALVE*')|))

$* 설정된 조건에 따라 객체들을 수집
!valves = !oCollection.RESULTS()

$* 수집된 객체들의 타입을 출력
DO !valve values !valves
    $P !$valve.TYPE
ENDDO

설명: 이 예제는 현재 요소와 특정 영역에서 이름이 'VALVE'로 시작하는 객체들을 수집하고, 그 객체들의 타입을 출력합니다.

예제 3: 특정 범위 내의 모든 ZONE 수집 및 속성 평가


$* Object Collection 객체 생성
!oCollection = OBJECT COLLECTION()

$* Scope를 현재 요소(CE)로 설정
!oCollection.SCOPE(CE)

$* 'ZONE' 타입의 객체들만 수집하도록 설정
!oCollection.TYPE('ZONE')

$* 설정된 조건에 따라 객체들을 수집
!zones = !oCollection.RESULTS()

$* 각 ZONE의 이름을 추출하는 블록 생성
!block = OBJECT BLOCK('!zones[!EvalIndex].NAME')

$* 블록을 평가하여 ZONE 이름들의 배열 생성
!zoneNames = !zones.EVALUATE(!block)

$* 수집된 ZONE 이름들을 출력
DO !zoneName values !zoneNames
    $P $!zoneName
ENDDO

설명: 이 예제는 현재 요소 내의 모든 'ZONE' 타입의 객체를 수집하고, 각 ZONE의 이름을 평가하여 출력합니다.

예제 4: 특정 속성 값에 따라 객체 필터링


$* Object Collection 객체 생성
!oCollection = OBJECT COLLECTION()

$* Scope를 WORLD로 설정하여 전체 모델에서 수집
!oCollection.SCOPE(WORLD)

$* 특정 속성(TYPE)이 'FLANGE'인 객체들만 수집하도록 필터링
!oCollection.FILTER(OBJECT EXPRESSION(|TYPE EQ 'FLANGE'|))

$* 설정된 조건에 따라 객체들을 수집
!flanges = !oCollection.RESULTS()

$* 수집된 객체들의 특정 속성(DIAMETER)을 출력
DO !flange values !flanges
    $P !flange.ATTRIBUTE('DIAMETER')
ENDDO

설명: 이 예제는 전체 모델에서 TYPE 속성이 'FLANGE'인 객체를 수집하고, 그 객체들의 DIAMETER 속성 값을 출력합니다.


예제 5: 무게가 100 이상인 객체들 수집


$* Object Collection 객체 생성
!oCollection = OBJECT COLLECTION()

$* Scope를 WORLD로 설정하여 전체 모델에서 수집
!oCollection.SCOPE(WORLD)

$* 무게(WEIGHT)가 100 이상인 객체들만 수집하도록 필터링
!oCollection.FILTER(OBJECT EXPRESSION(|WEIGHT GT 100|))

$* 설정된 조건에 따라 객체들을 수집
!elements = !oCollection.RESULTS()

$* 수집된 객체들의 이름을 출력
DO !element values !elements
    $P $!element.NAME
ENDDO

예제 6: 길이가 50 이하인 객체들 수집


$* Object Collection 객체 생성
!oCollection = OBJECT COLLECTION()

$* Scope를 WORLD로 설정하여 전체 모델에서 수집
!oCollection.SCOPE(WORLD)

$* 길이(LENGTH)가 50 이하인 객체들만 수집하도록 필터링
!oCollection.FILTER(OBJECT EXPRESSION(|LENGTH LE 50|))

$* 설정된 조건에 따라 객체들을 수집
!elements = !oCollection.RESULTS()

$* 수집된 객체들의 이름을 출력
DO !element values !elements
    $P $!element.NAME
ENDDO

예제 7: 재질이 'STEEL'로 시작하는 객체들 수집


$* Object Collection 객체 생성
!oCollection = OBJECT COLLECTION()

$* Scope를 WORLD로 설정하여 전체 모델에서 수집
!oCollection.SCOPE(WORLD)

$* 재질(MATR)이 'STEEL'로 시작하는 객체들만 수집하도록 필터링
!oCollection.FILTER(OBJECT EXPRESSION(|MATCHWILD(MATR, 'STEEL*') GT 0|))

$* 설정된 조건에 따라 객체들을 수집
!elements = !oCollection.RESULTS()

$* 수집된 객체들의 이름을 출력
DO !element values !elements
    $P $!element.NAME
ENDDO

예제 8: 반지름이 10보다 큰 객체들 수집


$* Object Collection 객체 생성
!oCollection = OBJECT COLLECTION()

$* Scope를 WORLD로 설정하여 전체 모델에서 수집
!oCollection.SCOPE(WORLD)

$* 반지름(RADIUS)이 10보다 큰 객체들만 수집하도록 필터링
!oCollection.FILTER(OBJECT EXPRESSION(|RADIUS GT 10|))

$* 설정된 조건에 따라 객체들을 수집
!elements = !oCollection.RESULTS()

$* 수집된 객체들의 이름을 출력
DO !element values !elements
    $P $!element.NAME
ENDDO

예제 9: 직경이 20 이하인 객체들 수집


$* Object Collection 객체 생성
!oCollection = OBJECT COLLECTION()

$* Scope를 WORLD로 설정하여 전체 모델에서 수집
!oCollection.SCOPE(WORLD)

$* 직경(DIAMETER)이 20 이하인 객체들만 수집하도록 필터링
!oCollection.FILTER(OBJECT EXPRESSION(|DIAMETER LE 20|))

$* 설정된 조건에 따라 객체들을 수집
!elements = !oCollection.RESULTS()

$* 수집된 객체들의 이름을 출력
DO !element values !elements
    $P $!element.NAME
ENDDO

5. !!collectAllFor 함수

!!collectAllFor 함수는 OBJECT COLLECTION의 사용을 간소화하여, 더 빠르고 간편하게 객체를 수집할 수 있도록 도와줍니다. 이 함수는 조건에 맞는 객체를 한 번에 수집하여 반환합니다.

  • 구문:
!!collectAllFor(!types is STRING, !expr is STRING, !item is DBREF) is ARRAY
  • 예제:
!result = !!collectAllFor('PIPE', |MATCHWILD(NAME, 'TEST*')|, CE)

이 예제는 현재 요소에서 이름이 'TEST'로 시작하는 'PIPE' 타입의 객체들을 한 번에 수집하여 반환합니다. 이 함수는 복잡한 수집 작업을 단순화할 수 있는 매우 유용한 도구입니다.


결론

OBJECT COLLECTION은 PML에서 매우 강력한 도구로, 특정 조건에 부합하는 객체들을 수집하고 필터링하는 데 탁월한 성능을 발휘합니다. 이 도구를 사용하면 모델 내에서 필요한 데이터를 정확하게 수집하고, 후속 작업을 효율적으로 수행할 수 있습니다. 또한 !!collectAllFor와 같은 함수는 이러한 작업을 더욱 간소화할 수 있습니다.

이제 OBJECT COLLECTION을 사용하여 다양한 범위와 조건에서 데이터를 수집하고, 필요에 따라 필터링하여 원하는 결과를 얻을 수 있습니다. 이를 통해 AVEVA E3D 및 PDMS와 같은 시스템에서 더 효율적이고 관리하기 쉬운 코드를 작성할 수 있습니다.