IT·인터넷

오토캐드 리습 여러 객체 선택하기, ssget 필터·sslength·ssname 사용법

인포픽랩 2026. 9. 3. 11:03

AutoLISP에서 객체 하나를 선택할 때 entsel을 사용했다면, 여러 객체를 한꺼번에 선택할 때는 ssget을 사용할 수 있습니다.

ssget으로 만든 Selection Set은 sslength로 객체 수를 확인하고, ssname으로 객체를 하나씩 꺼내 처리할 수 있습니다.

또한 DXF 그룹 코드를 필터로 사용하면 LINE만 선택하거나 특정 레이어의 객체만 골라내는 리습도 만들 수 있습니다.

객체 하나를 선택하고 entget으로 정보를 확인하는 방법을 먼저 보고 싶다면 아래 글을 참고해도 좋습니다.

오토캐드 리습 객체 선택하기, entsel·entget으로 객체 정보 확인하는 방법

ssget이란?

ssget은 AutoLISP에서 하나 이상의 객체를 선택해 Selection Set으로 가져오는 함수입니다.

가장 기본적인 형태는 다음과 같습니다.

(setq ss (ssget))

이 코드를 실행하면 AutoCAD가 객체 선택을 요청하고 사용자는 여러 객체를 선택할 수 있습니다.

선택이 정상적으로 완료되면 Selection Set이 ss에 저장되고, 아무 객체도 선택하지 않았다면 nil이 반환될 수 있습니다.

따라서 실제 리습에서는 선택 성공 여부까지 확인하는 것이 좋습니다.

(if (setq ss (ssget))
  (princ "\n객체가 선택되었습니다.")
  (princ "\n객체가 선택되지 않았습니다.")
)

오토캐드 리습 ssget 여러 객체 선택 Selection Set AutoLISP
ssget 은 여러 객체를 직접 선택해 Selection Set으로 저장하며, 아무 객체도 선택하지 않으면 nil 이 반환될 수 있습니다.

ssget에 안내문을 직접 넣어도 될까요?

다음과 같은 코드는 사용하지 않는 것이 좋습니다.

(ssget "\n객체를 선택하세요: ")

ssget의 문자열 인수는 사용자에게 표시할 임의의 안내문을 넣는 자리가 아니라 객체 선택 방식을 지정하는 데 사용됩니다.

기본적인 여러 객체 선택이라면 다음처럼 인수 없이 사용하면 됩니다.

(ssget)

AutoCAD가 자체적으로 객체 선택 프롬프트를 표시합니다.

별도의 설명 문구가 필요하다면 princ 등을 먼저 사용한 뒤 ssget을 호출하는 방법을 사용할 수 있습니다.

(princ "\n확인할 객체를 선택하세요.")
(setq ss (ssget))

entsel과 ssget은 무엇이 다른가요?

두 함수 모두 객체를 선택하는 데 사용하지만 목적이 다릅니다.

entsel

→ 객체 하나 선택
→ Entity name과 pick point 반환

ssget

→ 하나 이상의 객체 선택
→ Selection Set 반환

따라서 하나의 객체 정보를 확인하는 간단한 리습에는 entsel, 여러 객체를 반복 처리하거나 조건에 맞는 객체를 모을 때는 ssget이 적합합니다.

sslength로 선택한 객체 수 확인하기

Selection Set에 객체가 몇 개 들어 있는지 확인할 때는 sslength를 사용합니다.

(sslength ss)

예를 들어 객체 5개를 선택했다면 결과는 다음과 같습니다.

5

선택한 객체 수를 명령창에 표시하려면 다음처럼 사용할 수 있습니다.

(princ
  (strcat
    "\n선택된 객체 수: "
    (itoa (sslength ss))
  )
)

sslength가 반환하는 값은 숫자이므로 문자열과 연결할 때는 itoa를 이용해 문자열로 변환할 수 있습니다.

ssname으로 객체를 하나씩 가져오기

Selection Set 안의 객체를 실제로 처리하려면 ssname을 사용할 수 있습니다.

첫 번째 객체를 가져오려면 다음과 같이 작성합니다.

(ssname ss 0)

Selection Set의 순서는 0부터 시작합니다.

0 → 첫 번째 객체
1 → 두 번째 객체
2 → 세 번째 객체

따라서 반복문에서 인덱스를 하나씩 증가시키면서 객체를 가져올 수 있습니다.

(setq i 0)

(while (< i (sslength ss))
  (setq ent (ssname ss i))

  ;; 객체 처리

  (setq i (1+ i))
)

ssname은 해당 순서에 있는 주 객체의 Entity name을 반환합니다.

AutoLISP sslength ssname Selection Set 객체 수 확인 인덱스 반복 처리
sslength 로 선택한 객체 수를 확인하고 ssname 으로 인덱스 0부터 객체를 하나씩 가져와 반복 처리할 수 있습니다.

entget과 연결하면 객체 종류도 확인할 수 있어요

ssname으로 Entity name을 얻었다면 앞에서 배운 entget을 그대로 사용할 수 있습니다.

(setq ent  (ssname ss i))
(setq data (entget ent))

객체 유형은 DXF 그룹 코드 0을 이용합니다.

(cdr (assoc 0 data))

LINE을 선택했다면

LINE

CIRCLE이라면

CIRCLE

처럼 객체 종류를 확인할 수 있습니다.

즉 기본 흐름은 다음과 같습니다.

ssget

→ 여러 객체 선택

sslength

→ 객체 수 확인

ssname

→ 객체 하나씩 가져오기

entget

→ 객체 정보 읽기

assoc + cdr

→ 원하는 값 꺼내기

여러 객체의 유형을 표시하는 SSINFO 리습 만들기

지금까지 배운 내용을 하나의 예제로 만들어보겠습니다.

(defun c:SSINFO ( / ss i ent data objtype )
  (if (setq ss (ssget))
    (progn
      (setq i 0)

      (while (< i (sslength ss))
        (setq ent     (ssname ss i)
              data    (entget ent)
              objtype (cdr (assoc 0 data))
        )

        (princ
          (strcat
            "\n객체 "
            (itoa (1+ i))
            ": "
            objtype
          )
        )

        (setq i (1+ i))
      )
    )
    (princ "\n객체가 선택되지 않았습니다.")
  )

  (princ)
)

LSP 파일로 저장하고 APPLOAD로 불러온 뒤 명령창에서

SSINFO

를 입력합니다.

LINE, CIRCLE, TEXT 등을 여러 개 선택했다면 결과는 다음과 비슷하게 표시될 수 있습니다.

객체 1: LINE
객체 2: CIRCLE
객체 3: TEXT

이 예제를 이해하면 여러 객체의 레이어를 확인하거나 길이를 계산하는 등 다양한 반복작업으로 확장할 수 있습니다.

왜 지역변수를 사용하는 것이 좋을까요?

완성 코드 첫 줄에서는 다음처럼 변수를 선언했습니다.

(defun c:SSINFO ( / ss i ent data objtype )

/ 뒤에 있는

ss
i
ent
data
objtype

는 이 함수 안에서만 사용하는 지역변수입니다.

지역변수로 만들면 다른 리습에서 사용하는 변수와 충돌할 가능성을 줄일 수 있고 함수가 종료된 뒤 불필요한 값이 남는 것도 방지할 수 있습니다.

실제 업무용 AutoLISP를 만들 때는 함수 안에서만 사용하는 변수를 지역변수로 선언하는 습관을 들이는 것이 좋습니다.

ssget 필터로 LINE만 선택하기

ssget의 장점 중 하나는 원하는 조건에 맞는 객체만 Selection Set에 넣을 수 있다는 것입니다.

예를 들어 LINE 객체만 선택하려면 다음과 같이 DXF 그룹 코드 0을 필터로 사용할 수 있습니다.

(setq ss
  (ssget '((0 . "LINE")))
)

사용자가 LINE과 CIRCLE을 함께 선택하려고 하더라도 결과 Selection Set에는 조건을 만족하는 LINE만 포함됩니다.

간단한 LINE 선택 리습을 만들면 다음과 같습니다.

(defun c:SELLINE ( / ss )
  (if (setq ss (ssget '((0 . "LINE"))))
    (princ
      (strcat
        "\n선택된 LINE 수: "
        (itoa (sslength ss))
      )
    )
    (princ "\nLINE이 선택되지 않았습니다.")
  )

  (princ)
)

명령창에서 SELLINE을 실행한 뒤 여러 객체를 선택하면 LINE만 Selection Set에 포함됩니다.

특정 레이어의 객체만 선택하려면?

레이어 조건에는 DXF 그룹 코드 8을 사용할 수 있습니다.

예를 들어 WALL 레이어의 객체만 선택하려면 다음과 같이 작성합니다.

(setq ss
  (ssget '((8 . "WALL")))
)

이 경우 객체 유형과 관계없이 WALL 레이어에 속하면서 사용자가 선택한 객체만 결과에 포함됩니다.

WALL 레이어의 LINE만 선택하기

객체 유형과 레이어 조건을 함께 사용할 수도 있습니다.

(setq ss
  (ssget
    '(
      (0 . "LINE")
      (8 . "WALL")
    )
  )
)

이 필터는

LINE이면서

WALL 레이어에 있는 객체

만 선택합니다.

두 조건 중 하나만 만족하면 포함되는 것이 아니라 두 조건을 모두 만족해야 합니다.

즉 여러 일반 필터 조건을 함께 사용하면 기본적으로 AND 조건으로 이해하면 됩니다.

ssget "X"는 무엇이 다른가요?

다음과 같은 코드도 AutoLISP에서 자주 볼 수 있습니다.

(ssget "X" '((0 . "LINE")))

여기서 "X"는 사용자가 화면에서 직접 선택하도록 하는 방식과 다릅니다.

도면 데이터베이스에서 필터 조건에 맞는 객체를 검색합니다.

따라서

(ssget)

은 사용자가 직접 여러 객체를 선택하고,

(ssget '((0 . "LINE")))

은 사용자가 선택하는 객체 중 LINE만 골라내며,

(ssget "X" '((0 . "LINE")))

은 도면 데이터베이스에서 조건에 맞는 LINE을 검색하는 방식이라고 구분하면 쉽습니다.

오토캐드 ssget 필터 LINE 레이어 WALL X 도면 전체 객체 검색
ssget 필터를 이용하면 LINE이나 특정 레이어 객체만 선택할 수 있고, "X" 를 사용하면 도면 전체에서 조건에 맞는 객체를 검색할 수 있습니다.

ssget "X"를 사용할 때는 주의하세요

"X" 방식은 도면 전체를 대상으로 검색하기 때문에 현재 화면에 눈에 보이는 객체만 가져온다고 생각하면 안 됩니다.

꺼진 레이어나 동결된 레이어 등에 있는 객체도 조건에 따라 Selection Set에 포함될 수 있습니다.

객체가 많은 도면에서 무조건 "X"를 사용하면 예상보다 많은 객체가 선택될 수도 있습니다.

따라서 전체 도면 검색이 정말 필요한 경우에 사용하고, 가능하면 객체 유형이나 레이어 등의 필터를 함께 지정하는 것이 좋습니다.

예를 들어 도면 전체에서 WALL 레이어의 LINE만 찾으려면:

(setq ss
  (ssget
    "X"
    '(
      (0 . "LINE")
      (8 . "WALL")
    )
  )
)

처럼 사용할 수 있습니다.

Window나 Crossing 선택도 사용할 수 있나요?

ssget은 기본 객체 선택 외에도 여러 선택방식을 지원합니다.

대표적으로 Window, Crossing, Previous, Fence, Window Polygon, Crossing Polygon 등 다양한 방법을 사용할 수 있습니다.

하지만 AutoLISP를 처음 배우는 단계에서는

(ssget)

기본 선택부터 익힌 뒤

객체 유형 필터

레이어 필터

"X" 전체검색

순서로 익히는 것이 이해하기 쉽습니다.

복잡한 선택방식과 OR·NOT 같은 논리 필터는 기본 필터에 익숙해진 뒤 확장해도 늦지 않습니다.

아무 객체도 선택하지 않으면 어떻게 될까요?

사용자가 선택을 완료하지 않았거나 조건에 맞는 객체가 없다면 ssget은 nil을 반환할 수 있습니다.

따라서 다음처럼 먼저 Selection Set이 존재하는지 확인하는 것이 좋습니다.

(if (setq ss (ssget))
  (princ "\n객체가 선택되었습니다.")
  (princ "\n객체가 선택되지 않았습니다.")
)

선택 성공 여부를 확인하지 않고 곧바로

(sslength ss)

등을 실행하면 예상하지 못한 오류가 발생할 수 있습니다.

사용자 입력이 있는 리습에서는 정상적인 선택뿐 아니라 선택하지 않았을 때의 처리도 함께 작성하는 것이 중요합니다.

Windows용 AutoCAD LT에서도 사용할 수 있나요?

Windows용 AutoCAD LT 2026에서도 이번 글에서 사용한 기본적인 Selection Set 관련 AutoLISP 함수를 사용할 수 있습니다.

예를 들어

ssget
sslength
ssname
entget
assoc
cdr

등을 이용한 기본 객체 선택과 정보 확인 예제를 연습할 수 있습니다.

다만 AutoCAD LT와 일반 AutoCAD의 모든 자동화 기능이 완전히 동일한 것은 아니므로 더 복잡한 AutoLISP 기능을 사용할 때는 사용 중인 제품의 지원 여부를 확인하는 것이 좋습니다.

AutoCAD LT for Mac은 AutoLISP 지원 범위가 다르므로 운영체제도 함께 확인하세요.

ssget 사용법 핵심 정리

여러 객체를 선택하는 기본 코드는 다음과 같습니다.

(setq ss (ssget))

선택한 객체 수는:

(sslength ss)

Selection Set에서 객체 하나를 가져오려면:

(ssname ss 0)

LINE만 선택하려면:

(ssget '((0 . "LINE")))

특정 레이어만 선택하려면:

(ssget '((8 . "WALL")))

WALL 레이어의 LINE만 선택하려면:

(ssget '((0 . "LINE") (8 . "WALL")))

도면 전체에서 LINE을 검색하려면:

(ssget "X" '((0 . "LINE")))

이 정도만 이해해도 ssget을 이용해 여러 객체를 반복 처리하거나 원하는 객체만 골라내는 기본 AutoLISP를 만들 수 있습니다.

객체 하나를 다루던 entsel에서 여러 객체를 다루는 ssget까지 익혔다면 이후에는 getpoint 같은 사용자 입력 함수와 결합해 실제 도면 자동화 기능으로 확장해보세요.

공식 참고자료

Autodesk AutoLISP ssget 함수

Autodesk AutoLISP sslength 함수

Autodesk AutoLISP Selection Set 필터