$GRAB 응용

ASAP이 컴퓨터 프로그램이다보니 원하는 모든것을 해줄 수는 없다. 그 중 한가지가 메모리의 한계이다. 너무 많은 object를 만들거나 너무 많은 rays를 생성하다 보면 전혀 예상치 못했던 곳에서 error가 발생된다. 스피커에서 ‘삐’ 소리가 나면서 메모리가 부족하다는 창이 뜨기도 하고, entity number를 초과했다고 에러가 나기도 한다. 초보자들이 LCD Backlight를 설계하면서 수만은 dot 들을 만들고 수백만개의 rays를 생성시켰을 때 자주 나타나는 현상이다.

아래 프로그램을 실행시켜 보자.

SYSTEM NEW
RESET

EDGES
  LINE
0 0 0, 0 5 0
  ARC X 0, 5 0, 7 1 30
  ARC X 0, 5.767949 0.866025, 10 3 20
  COMPOSITE  3                         !! Combine last 3 edges
OBJECT ‘TEST’

NUMBERS  SUMMARY            !! Displays current members

WINDOW Z Y
PLOT  FACETS
 5  5
RETURN

위의 프로그램을 보면 Line, Arc, Arc의 총3개의 Entities를 만들었다. 그런데, 아래의 결과를 한번 보자.

— NUMBERS SUMMAY

Geometry ENTITIES        1/   30000   0.00%

Geometry Storage      32/6000000    0.00%
Patch Boxes        3/1397802     0.00%
OBJECTS        1/     9999       0.0

Geometry Entities의 수가 1로 되어있다. 그런테, 여기서 COMPOSITE -3 명령어 라인을 지우거나 주석처리 후 다시 실행시켜보자. 그러면, 아래 결과처럼 값이 3으로 바뀔 것이다.

— NUMBERS SUMMAY

Geometry ENTITIES     3/  30000     0.01%

Geometry Storage      32/6000000    0.00%
Patch Boxes        1/1397802      0.00%
OBJECTS        1/      9999      0.0

여기서 NUMBERS 명령어는 현재 사용중인 여러 종류의 데이터들에 대한 숫자를 알려준다. 그리고, COMPOSITE은 여러개의 EDGE들을 하나로 묶어주는 명령어이다.  COMPOSITE이 Lens 명령어에 사용되면 Lens Entities들을 묶어주기도 한다.

NUMBERS (ASAP Command)
Displays current valid media, surfaces, edges, lenses, and object members.Syntax
NUMBERS [ NAMES  ]
                 SUMMARY

Option Description
NAMES lists a table of numbers and names for all media, coatings, and objects
SUMMARY lists a short summary of storage usage
COMPOSITE (Edge Modifier) (ASAP Command)
Combines several edge entities into a single edge entity.Syntax
COMPOSITE [   -n    ] [ GAPS q [ q’ ] ]
                       i [ i’]

Option Description
-n last n edges
i i’ edges i through i’
GAPS q q’ connection factors

 

아래 프로그램과 같이 한 단계 더 나가보자. $DO로 30개의 EDGE를 만들고 NUMBERS SUMMARY로 EDGE의 숫자를 확인하였다.

SYSTEM NEW
RESET

$DO 1 30
{
  EDGE
    RECTANGLE  Z  0  1  1
    SHIFT  Z  2*?
}
NUMBERS  SUMMARY

$GRAB  ‘Geometry ENTITIES‘  0  1 NUM_EDGES
&REG

EDGE
  COMPOSITE
 -(NUM_EDGES)

NUMBERS SUMMARY

RETURN

처음에 있는 NUMBERS SUMMARY 명령어를 통해서 Geometry ENTITIES가 30개 인것을 확인할 수 있다.

— NUMBERS  SUMMARY
Geometry ENTITIES      30/  30000        0.10%
Geometry Storage     600/6000000    0.01%

그런데 $GRAB ‘Geometry ENTITIES’  0  1 NUM_EDGES 명령어를 사용하면 ‘Geometry ENTITIES’ 라는 이름을 찾을 수 있고, 0행 1열에 있는 숫자값 30을 NUM_EDGES 라는 변수명에 저장할 수 있다. 그리고, &REG 명령어를 사용해서 NUM_EDGES=30임을 확인하였다.

— $GRAB  ‘Geometry ENTITIES’  0  1 NUM_EDGES

— &REG
NUM_EDGES=30


30개의 EDGES를 하나로 묶기 위해 COMPOSTIE 명령어를 사용하려는데, COMPOSITE은 EDGE Entities에만 적용되기 때문에 EDGE 명령어를 먼저 선언하고 COMPOSITE 명령어를 추가하였다. 묶으려는 숫자는 NUM_EDGES 만큼이다.

EDGE

—  COMPOSITE  -(NUM_EDGES)

그러면, NUMBERS SUMMARY 명령어로 Geometry ENTITIES가 1개로 묶여진 것을 확인할 수 있을 것이다.

— NUMBERS SUMMARY
Geometry ENTITIES       1/  30000       0.00%
Geometry Storage     600/6000000    0.0

Note…
COMPOSITE 명령어는 EDGE 나 LENS Entities에만 적용되는 명령어이다. 위 프로그램은 $DO를 사용하기 때문에 COMPOSITE 명령어를 $DO 안에 넣을 수는 없다. 그래서, 나중에 COMPOSITE 명령어를 사용하려고 하면 다시 EDGE를 선언하고 COMPOSITE 명령어를 사용해야 한다. 위의 프로그램에서 COMPOSITE 앞에 있는 EDGE를 삭제하고 Run 시키면 Unrecognized command or macro라고 하면서 COMPOSITE에서 에러가 발생한다.


COMPOSITE 를 사용하지 않으면 진짜 문제가 될까? ASAP에서는 Geometry ENTITIES가 30,000개까지 허용된다고 하니(버전에 따라 다름) 30,000개 이상을 한번 만들어 보자. 그럼 아래와 같은 결과를 보여준다.

– {
–  EDGE
–    RECTANGLE Z 0 1 1
–     SHIFT Z 2*30000

– }
– {
–  EDGE
–    RECTANGLE Z 0 1 1
Error in MATCHE *** Entity number exceeds 30,000

결국, Entity가 30,000개를 넘었다고 하면서 프로그램이 종료되어 버린다.

이번 장에서는 NUMBERS SUMMARY, &GRAB, &REG, COMPOSITE등 많은 명령어들이 복합적으로 사용했다. 프로그램을 꼼꼼히 따져보면서 앞으로 어떻게 이 명령어들을 응용하면 좋을지 고민해 보기 바란다.

Note…
ASAP을 사용하다 보면 약자를 많이 사용하게 된다. 이번의 NUMBERS SUMMARY의 경우도 NUM SUM 이라고 해도 되고, N S 라고 해도 에러없이 원하는 결과를 얻을 수 있다. 프로그램을 Run 시키고 나서 Command Input Window에 N S 라고 입력하고 엔터를 쳐보자. 그러면, Command Output Window에 동일한 결과가 나타나는 것을 확인할 수 있을 것이다.

  

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: