Programming 언어/Skill

[SKILL] path, rectangular 의 center point 찾기

호드맨 2017. 1. 3. 17:55

Layout을 하다 보면 Path, Rectangular의 Center좌표를 알아야 하는 경우가 생기게 된다. 언제부터 추가되었는지 몰라도 지금은 Smart Snap Option 이 생겨서 특정 Object, Shape의 Edge, Center 부분을 쉽게 찾을 수 있게 되었지만, 그거랑 별개로 특정 위치를 산정해서 ruler를 생성시키는 기능은 알아두면 편리할 수 있다. 사실 어떠한 규칙성만 있으면 Skill로 작성할 수 있다. 복잡한 기능, 여러 가지 변수를 가질수록 어렵지만 이 처럼 단순한 규칙성을 가질 때는 오히려 작성하기 쉽다.

procedure(p_center()
   prog(()
      cv=hiGetCurrentWindow()->cellView

      foreach(inst geGetSelSet()
         if(inst->objType=="path" then
            lpp=list((car(car(inst->points))+car(cadr(inst->points)))/2.000 (cadr(car(inst->points))+cadr(cadr(inst->points)))/2.000)
            if(car(car(inst->points))==car(cadr(inst->points)) then
               leCreateRuler(cv list(list(car(lpp)-inst->width cadr(lpp)) list(car(lpp)+inst->width cadr(lpp))))
            else
               leCreateRuler(cv list(list(car(lpp) cadr(lpp)-inst->width) list(car(lpp) cadr(lpp)+inst->width)))
            )
         )
         
         if(inst->objType=="rect" then
            x1(car(car(inst->bBox))
            x2(car(cadr(inst->bBox))
            y1(cadr(car(inst->bBox))
            y2(cadr(cadr(inst->bBox))
            
            leCreateRuler(cv list(list(x1-0.1 (y1+y2)/2.000) list(x2+0.1 (y1+y2)/2.000)))
            leCreateRuler(cv list(list((x1+x2)/2.000 y1-0.1) list((x1+x2)/2.000 y2+0.1)))
         )
      )
   )
)

결과는 잘 동작한다. 사용하는 grid에 따라서 나누고 곱하는 값을 좀 변경하거나 grid에 안 맞는 중간값을 가질 경우 경고창을 띄우는 옵션도 넣을 수 있지만, 그렇게 복잡한 기능을 생각한 것은 아니었다. 대신 지금은 앞서 말한 Smart Snap 기능 때문에 사용할 일이 없어진 듯하다. 해당 기능이 없는 ICAD 버전이라면 아직도 유용하게 사용할 수 있을 것 같다.

 

center ruler 생성 결과