데이터의 그룹화와 필터링


그룹화와 필터링

Grasshopper 내부의 데이터와 개체 정보를 더욱 상세하게 다룰 수 있다면 좋겠다고 생각하신 적이 있으신가요? 예를 들어, 특정한 재질(예: 유리)이 적용된 모델 안의 개체만 선택해야 한다거나, 모델 내부에서 면적이 지정된 값보다 작으면서 특정한 서피스에 있는 모든 서피스를 삭제해야 하는 경우가 있을 수 있습니다. 이런 작업을 (쉽게) 할 수 있나요?

Rhino 8용 Grasshopper 1에는 데이터를 더욱 효율적으로 관리하는 데 도움이 되는 새로운 컴포넌트가 있습니다.

이 컴포넌트의 사용 방법을 간단한 예를 통해 설명하겠습니다. 이 매스 작업 모델 에는 건물 외피, 바닥 역할을 하는 서피스를 나타내는 BREP이 있습니다. 개체는 다양한 레이어에 배치되어 용도 유형(오피스, 주택 등)을 바탕으로 서로 다른 색을 적용할 수 있습니다.

대부분의 개체에는 사용자 텍스트 항목으로 일부 메타 데이터가 첨부되어 있습니다.

매스 작업 모델의 각 건물의 전체 면적을 계산하는 것으로 튜토리얼을 시작합니다. 모델에 3개의 건물이 있습니다. 각각의 바닥판에는 User Text Entry로 Building ID 번호가 지정되어 있습니다.

콘텐츠 그룹화

먼저 Grasshopper 편집기를 열어, File -> New Document 를 클릭하여 새로운 정의를 시작합니다.

각 건물의 전체 바닥 면적을 계산하기 위해, 먼저 Rhino 모델의 모든 바닥을 Grasshopper 정의에서 참조해야 합니다.

이 튜토리얼의 주제는 데이터 필터링입니다. 우리가 사용하는 모델은 레이어를 기준으로 구성되어 있으므로 Query Model Objects 컴포넌트(Rhino tab 아래의 Object 하위 카테고리에 위치)의 Layer 입력을 사용하여 바닥을 필터링할 수 있습니다. Floors 단위 뒤에 “*” 와일드카드를 사용하면 Floors 하위 레이어에 있는 모든 개체가 선택됩니다.

Objects 출력 매개변수에 마우스를 가져가면 표시되는 31개의 서피스는 모델에 있는 각 바닥판을 나타냅니다.

그 다음, 건물 ID를 그룹화 기준으로 사용하여 각 바닥판을 그룹화해야 합니다. Group Content 컴포넌트(Rhino 탭과 Content 하위에 위치)를 사용하고 쿼리 컴포넌트의 출력을 Content 입력에 연결해 봅시다.

이 컴포넌트는 Key 입력을 사용하여 콘텐츠를 다른 데이터 트리 분기로 그룹화하는지를 결정합니다. Key 입력을 오른쪽 클릭하면 몇 가지 옵션이 표시됩니다.

Select Type - 이 드롭다운에서는 사용자 텍스트 키 또는 데이터 유형 특성을 기준으로 콘텐츠를 그룹화할지 여부를 선택할 수 있습니다. 여기서는 건물 ID 사용자 텍스트 값을 기준으로 개체를 그룹화할 계획이므로 드롭다운 메뉴에서 “User Text"를 선택해야 합니다.

Select Property/Key - 위의 드롭다운 메뉴 선택에 따라, 트리 보기 제어에 필터링 기준으로 사용할 수 있는 사용 가능한 속성 또는 키 목록이 표시됩니다. 이 예에서는 “Building ID” 키를 선택할 수 있습니다.

Content 출력을 보면, 이제 모든 층이 건물 ID 번호에 따라 서로 다른 분기로 분리되었음을 알 수 있습니다. Values 출력은 콘텐츠에서 찾은 모든 고유 키 값의 목록을 반환합니다. 이 경우 콘텐츠 목록과 그룹화된 콘텐츠의 데이터 트리 분기에서 발견된 고유 ID 값에 해당하는 세 가지 값(1, 2, 3) 목록이 표시됩니다.

이 처리 과정에서 마지막 단계는 데이터 트리의 각 분기에 있는 모든 영역을 합산하는 것입니다. 이제 모든 바닥 서피스가 서로 다른 분기로 분리되었으므로, Group Content 컴포넌트의 출력을 Area 컴포넌트로 전달한 다음 Mass Addition 컴포넌트를 사용하여 해당 값을 모두 쉽게 추가할 수 있습니다.

위의 Grasshopper 정의에서 다음의 정보를 알 수 있습니다:

  • Building 1 = 43,622 sf
  • Building 2 = 36,626 sf
  • Building 3 = 5,736 sf

이 작업 흐름은 그룹화 기준을 변경하기 쉽다는 점이 그 장점입니다. 예를 들어, 단순히 각 건물의 총 면적이 아니라, 다양한 용도 유형(주거용, 사무실, 상업용 등)의 총 면적을 결정한다고 가정해 봅시다. 이러한 시나리오에서는 Key 속성을 “Use Type"으로 변경하기만 하면 됩니다. 다른 모든 것은 그대로 두어도 됩니다.

그룹화 조건을 “Use Type"으로 바꾸면 총 제곱피트(sf)의 합계는 다음과 같습니다:

  • Commercial = 21,740 sf
  • Educational = 5,736 sf
  • Mixed Use = 11,326 sf
  • Office = 23,972 sf
  • Residential = 23,210 sf

콘텐츠 필터링

그룹화 외에도, 특정 조건에 맞게 콘텐츠를 필터링할 수 있습니다. 특히, 필터링 조건은 하나의 개체 속성을 다른 속성과 비교하여 부울 연산 값(True 또는 False)을 반환합니다. x=y 이거나, x가 y와 크거나 같은 조건을 생각해 보세요. 연산자를 사용하여 이러한 규칙을 더욱 복잡한 정규식으로 합칠 수 있습니다.

기존 모델을 사용하여, 다음 기준에 따라 바닥판을 분리시키는 일련의 필터를 만들어 봅시다:

  1. Use Type은 반드시 “Office” 이고 또한
  2. 바닥 면적은 반드시 2,250 제곱피트보다 커야 하고 또한
  3. 바닥 면적은 반드시 2,500 제곱피트보다 작아야 함

새로운 Grasshopper 정의를 만드는 것부터 시작해 봅시다. Grasshopper 파일 메뉴에서 File -> New Document 를 클릭합니다. 이전 예와 마찬가지로 모든 바닥 서피스를 이 Grasshopper 문서에서 참조하도록 Query Model Objects 컴포넌트에서 Layer 필터를 “Floors” 설정하여 사용합니다. 출력에는 모델에 있는 각각의 바닥판을 나타내는 31개의 서피스가 포함되어야 합니다.

다음, 위의 첫 번째 조건(사용 유형이 “Office” 유형과 동일한 모든 바닥판을 필터링)을 정의하는 필터를 만들어 봅시다. Rhino 탭과 Content 하위 카테고리의 다양한 필터들 중 몇 개는 균등함을 확인하는 필터입니다. 그러나, 이 튜토리얼에서는 Match Text Filter 컴포넌트를 캔버스에 추가하는 방법으로 시작합니다.

Match Text Filter는 텍스트 비교에 사용하는 강력하고 유연한 컴포넌트입니다. 이 필터로 각 바닥판을 조회하여 “Use Type” 사용자 텍스트 항목에 적용된 값을 추출하고, 그 값이 “Office"라는 단어와 일치하는지 여부를 확인한 후 그에 따라 개체를 필터링합니다.

Match Text Filter에는 세 가지 연산 모드가 있습니다. Match Text Filter 컴포넌트의 가운데를 오른쪽 클릭하면 세 가지 모드의 목록이 표시됩니다:

이 예에서 “Office"라는 단어와 *Equal(균등)*한 텍스트 값만 주목합니다. Match Text Filter의 오른쪽 클릭 메뉴에서 Equals 모드만 선택합니다.

다음, 콘텐츠를 어떻게 필터링할지 결정하는 Key 입력을 지정해야 합니다. 이번에도 앞서 설명한 예와 마찬가지로 Key 입력을 오른쪽 클릭하고 드롭다운 메뉴에서 “User Text"를 선택한 후, 트리 뷰 제어에서 “Use Type"을 선택합니다.

마지막 단계는 비교할 대상인 텍스트 값을 정의하기 위해 Match Text Filter의 Pattern 입력을 정의하는 것입니다. 이 예에서는 Use Type 값이 “Office"라는 단어와 같은지 확인하여, 해당 단어가 포함된 텍스트 패널을 Pattern 입력에 추가할 수 있습니다.

이제 필터를 만들었으니, 캔버스상에 Filter Content 컴포넌트를 추가하여 실제 필터링 작업을 실행해야 합니다. 필터링하려는 콘텐츠는 Query Model Objects 컴포넌트에서 반환된 31개의 BREP입니다. 그리고, Match Text Filter를 사용하여 방금 만든 필터를 사용하려고 합니다.

출력을 보면, 지금은 필터링 기준(예: “Office” 사용 유형에 대응하는 바닥판)과 일치한 10개의 서피스만 있습니다. 아직 다 끝난 것이 아닙니다. 2,250 제곱피트보다 크고 2,500 제곱피트보다 작은 면적을 가진 바닥판을 필터링해야 합니다.

Greater Than Filter 컴포넌트를 Match Text Filter 컴포넌트 아래에 추가해 봅시다. 앞서 했던 것처럼, 이 필터에서 어떤 값을 비교할지를 정의하는 Key 입력을 설정해야 합니다. 이 경우, Key가 Area 사용자 텍스트 값을 주목하도록 설정해야 합니다. Key 입력에서 오른쪽 클릭하여 트리 뷰 제어에서 “Area"를 선택합니다.

다음, 면적 값을 비교할 숫자 값을 정의해야 합니다. Numeric Slider (Params 탭 아래의 Input 하위 카테고리에 위치)를 추가하고 값을 2,250으로 설정합니다. 이 슬라이더의 최소값과 최대값을 원하는 대로 설정할 수 있으나, 여기에서는 각 값을 2,000, 2,500 으로 설정하였습니다.

면적이 2,250 제곱피트보다 큰 바닥판을 확인하는 필터가 만들어졌습니다. 면적이 2,500 제곱피트보다 작은 바닥판을 찾는 다른 필터도 만들어 봅시다.

방금 만든 Greater Than Filter 아래에 Smaller Than Filter 컴포넌트를 추가합니다. Key 입력을 Area 사용자 텍스트 값으로 설정합니다. 방금 만든 슬라이더를 선택하고 이를 Copy(복사)하여 캔버스상에 Paste(붙여넣기) 실행합니다. 이 새로운 슬라이더의 값을 2,500으로 설정하고 출력을 Smaller Than Filter의 Value 입력에 연결합니다.

이제 정의에 위에서 정의한 기준과 일치하는 3개의 필터가 생겼습니다. 그러나 콘텐츠가 올바르게 필터링되려면, 3개의 필터가 모두 true가 되어 이를 하나로 결합해야 합니다. 이렇게 하려면, Intersection Filter 컴포넌트를 사용해 보겠습니다.

Intersection Filter를 사용하여 여러 개의 필터를 하나로 합칠 수 있으며, 모든 필터가 TRUE가 되어야만 TRUE를 반환합니다. SHIFT 키를 누른 상태에서 3개의 필터의 출력을 Intersection Filder의 Filters 입력에 연결합니다.

마지막으로, Filter Content 컴포넌트의 Filter 입력에 연결된 Match Text Filter를 Intersection 필터의 출력으로 교체합니다. 이제 정의가 아래 이미지처럼 보여야 합니다.

Filter Content 컴포넌트에서 반환되는 BREP이 5개만 있는 것을 알 수 있습니다. 이는 “Office” 용도 유형에 맞는 5개의 바닥판이며 역시 2,250 제곱피트보다 크고 2,500 제곱피트보다 작습니다.

직접 실행해 보세요

자세히

이러한 기능에 대한 간략한 안내를 보시려면 Grasshopper 데이터 유형 소개 동영상을 보시거나, Rhino 8의 새 기능 소개 페이지를 참조하세요.

다음 가이드에 안내된 다른 Data Type 컴포넌트의 사용법을 참조하세요: