Q100291: OpScript에 대한 CEL 문을 수집할 때 효율성을 개선하는 방법

요약

이 문서에서는 OpScript 노드의 Lua 스크립트 내에서 평가된 CEL 명령문( 수집 작업)의 캐시된 결과를 사용하는 방법을 설명합니다.

이는 OpScript 노드에서 스크립트 버튼의 Python 스크립트를 실행하고, 결과 장면 그래프 위치 경로를 사용자 매개변수에 캐싱하여 OpScript 노드의 Lua 스크립트 자체에서 사용할 수 있도록 함으로써 달성됩니다.

이를 통해 사용자는 편리한 시간에 '수집' 작업을 수행할 수 있으며, OpScript Lua 스크립트가 캐시된 결과에 대해 작동하게 되므로 OpScript 노드가 완료될 때마다 CEL 명령문을 전체 장면 그래프에 맞춰 일치시킬 필요가 없습니다.

이러한 스크립트를 설정하는 방법과 이유에 대한 자세한 내용을 읽어보세요.

더 많은 정보

사용자는 Lua 스크립트 내에서 OpScript 노드의 수집 작업 결과를 사용하여, 예를 들어 결과 위치 경로를 장면 그래프 속성 아래에 저장하거나 Lua 스크립트에서 작업할 수 있도록 할 수 있습니다.

바람직하지 않은 접근 방식

OpScript 내에서 CEL 명령문을 평가한 결과를 수집하는 것은 바람직하지 않습니다. 왜냐하면 업스트림 레시피가 수정될 때마다 위치가 주어진 CEL 명령문과 일치하는지 확인하기 위해 장면의 일부 또는 전부를 요리해야 하기 때문입니다.

장면 그래프가 큰 장면을 작업할 경우 이 작업은 매우 많은 계산량과 시간이 소요될 수 있습니다. 이는 대화형 환경에서는 매우 바람직하지 않으며, Katana 의 지연 평가 모델에 위배됩니다.

권장 접근 방식

CEL 명령문 평가 결과를 수집하기 위해 더 나은 방법은 한 번만 실행되는 사용자 트리거 스크립트를 사용하는 것입니다. 이 스크립트는 일회성 쿡(cook) 방식으로 장면을 탐색하고 노드 매개변수를 채우는 데 사용할 수 있는 정보를 수집합니다. 관련 위치가 변경될 경우 프로젝트를 최신 상태로 유지하기 위해 이 작업을 반복해야 합니다.

CEL 문과 일치하는 기존 위치 집합을 검색하려면 CEL 수집 작업을 사용합니다. 스크립트 버튼을 통해 실행되는 스크립트 CollectAndSelectInScenegraph() 위젯 모듈에 포함된 CollectAndSelectInScenegraph() 함수를 사용할 수 있습니다.

collector = Widgets.CollectAndSelectInScenegraph(celStatement, traversalRootLocationPath)
matchedLocationPaths = collector.collectAndSelect(select=False, node=myNode)

어디:

  • celStatement 는 평가할 표현식입니다.
  • traversalRootLocationPath 는 평가가 시작될 씬 그래프 위치 경로입니다. 이 경로는 /root 또는 다른 지정된 씬 그래프 위치일 수 있습니다. 예를 들어, 이 분기의 자식 위치만 CEL 문과 일치해야 하는 경우 /root/world/geo 수 있습니다.

예시 장면

첨부된 예제 장면에서 이 전략의 구현을 확인할 수 있습니다. 이 장면은 'OpScript에서 지오메트리 생성' 예제 프로젝트의 L-시스템을 사용합니다. CollectAndSet OpScript 노드에서 스크립트를 확인하려면 매개변수 탭 상단의 렌치 아이콘을 클릭하고 '사용자 매개변수 편집'을 클릭한 다음, 'CollectGeometryLocations' 버튼 위의 렌치 아이콘 > '위젯 옵션…'을 클릭합니다.

CEL_Statements_OpScript.png

CEL_Statements_OpScript_2.png

CEL_Statements_OpScript_3.png

CollectAndSelect OpScript 노드의 사용자 매개변수는 다음 단계에 따라 설정되었습니다.

  1. OpScript 노드를 만들고 e를 눌러 매개변수 탭에서 매개변수를 엽니다.
  2. 매개변수 탭 상단의 렌치 아이콘을 클릭한 다음 '사용자 매개변수 편집'을 클릭하세요. 그러면 user 라는 이름의 새 그룹 매개변수가 노드에 추가됩니다 .

    CEL_Statements_OpScript_4.png

  3. '추가'를 클릭하여 사용자 그룹 매개변수에 매개변수를 추가하고 매개변수 유형으로 '문자열 배열'을 선택하세요. 이 매개변수에 일치하는 위치 경로가 저장됩니다.

    CEL_Statements_OpScript_5.png

  4. 새 매개변수 바로 위에 있는 렌치 아이콘을 클릭하고 '매개변수 이름 바꾸기'를 클릭하세요. 새 이름을 입력할 수 있는 대화 상자가 열립니다. 매개변수 이름을 'matchedLocationPaths'로 변경하세요.

    CEL_Statements_OpScript_6.png

  5. 다시 '추가'를 클릭하고 이번에는 매개변수 유형으로 '버튼'을 선택합니다.
  6. 새로 만든 버튼 바로 위에 있는 렌치 아이콘을 클릭하고 '위젯 옵션…'을 선택하세요. 그러면 버튼 텍스트를 'CollectGeometryLocations'와 같이 설명적인 텍스트로 변경할 수 있는 대화 상자가 열립니다. 이 대화 상자에는 버튼을 클릭할 때 실행될 Python 명령을 추가할 수 있는 스크립트 필드도 있습니다.
  7. 다음 Python 명령을 복사하여 스크립트 필드에 붙여넣습니다.

    collector = Widgets.CollectAndSelectInScenegraph('//*{hasattr("geometry")}', '/root/world/geo')
    # This command will match all scene graph locations underneath /root/world/geo that have a ‘geometry’ attribute
    paths = collector.collectAndSelect(select=False, node=node)
    # The 'node' variable is this parameter's node
    노드의 matchedLocationPaths 사용자 매개변수에 일치하는 위치 경로를 저장하려면 스크립트에 다음 명령을 추가합니다.

    paramName = 'user.matchedLocationPaths'
    param = node.getParameter(paramName)
    element = param.buildXmlIO(True)
    element.removeAllChildren()
    for path in paths:
       child = element.addChild(PyXmlIO.Element("string_parameter"))
       child.setAttr("name", "i%i" % (len(element) - 1))
       child.setAttr("value", path)
    element.setAttr("size", len(element))
    param.parseXmlIO(element)

버튼을 클릭하여 스크립트를 실행하면 장면이 탐색되고 위치가 조리되는 동안 모달 대화 상자가 열리고 작업을 취소할 수 있는 옵션이 제공됩니다.

collectAndSelect collectAndSelect() 함수는 위치 경로 목록을 반환합니다. 이 목록은 OpScript 노드에서 사용자 매개변수로 설정될 수 있으므로 Lua 스크립트에서 사용자 Op Arg로 사용할 수 있습니다. 예:

CEL_Statements_OpScript_7.png

추가 읽기

CEL 구문에 대한 자세한 내용은 Katana 개발자 가이드의 CEL 참조 섹션을 참조하세요.

OpScript 노드의 Lua 스크립트에서 Python 스크립트에 설정된 것과 같은 사용자 opArgs에 액세스하는 방법에 대한 자세한 내용 Katana Cook 인터페이스(OpScript) 에 대한 Katana 개발자 가이드를 참조하세요 .

이와 관련하여 문제가 발생할 경우 지원 티켓을 개설하여 문제와 지금까지 취한 문제 해결 단계를 알려주시기 바랍니다.

지원 티켓을 여는 방법에 대한 자세한 내용은 Q100064: 지원 티켓을 제기하는 방법을 참조하세요 .

첨부 파일

우리는 문제로 불편을 끼쳐 드려 죄송합니다

이유를 알려주세요