Examples/Expand Shrink Path

Last-modified: 2021-09-21 (火) 00:12:05

レイアウトSKILLマクロ関数のサンプルです。

Expand Shrink Path :既存Pathの端(エッジ選択)を任意の方向に曲げるor伸縮

※mosaicを選択していた場合はuX,uYが変わります。その他、自前Pcell用の動作も入ってます。
 pathのみにしたければcase文の他の分岐箇所を削除してください。

;----------------------------------------
;@ NAME @ (shi_ExpandShrink ?mosaic_dx ?mosaic_dy ?path_dx ?path_dy)
;@ EXPL @ mosaic/pc_VIA/pc_VIA0/pc_CONNECT ... expand/shrink uX/uY/pitch_x/pitch_y
;                                   path   ... expand/shrink path line (not width)
;@USAGE @
;----------------------------------------
(procedure (shi_ExpandShrink @key (mosaic_dx 0.1) (mosaic_dy 0.1) (path_dx 0.5) (path_dy 0.5))
  (foreach s (geGetSelectedSet)
    (case s~>objType
      ;#--- mosaic ---#
      ("mosaic"
        (when mosaic_dx (s~>uX = (s~>uX + mosaic_dx)))
        (when mosaic_dy (s~>uY = (s~>uY + mosaic_dy)))
      ) ; "mosaic"
      ;#--- inst(pc_CA/pc_VIA/pc_VIA0/pc_CONNECT) ---#
      ("inst"
        (cond
          ((equal s~>cellName PCELL_CA_NAME)
            (let
              (
              (x_space (or (dbFindProp s "x_space") (dbCreateProp s "x_space" "float" 0.0)))
              (y_space (or (dbFindProp s "y_space") (dbCreateProp s "y_space" "float" 0.0)))
              )
              (x_space~>value = (x_s_prop~>value + mosaic_dx))
              (y_space~>value = (y_s_prop~>value + mosaic_dy))
            )
          ) ; PCELL_CA_NAME
          ((or (equal s~>cellName PCELL_VIA0_NAME) (equal s~>cellName PCELL_VIA_NAME))
            (let
              (
              (plus_x_space (or (dbFindProp s "plus_x_space") (dbCreateProp s "plus_x_space" "float" 0.0)))
              (plus_y_space (or (dbFindProp s "plus_y_space") (dbCreateProp s "plus_y_space" "float" 0.0)))
              )
              (plus_x_space~>value = (plus_x_space~>value + mosaic_dx))
              (plus_y_space~>value = (plus_y_space~>value + mosaic_dy))
            )
          ) ; PCELL_CONNECT_NAME || PCELL_VIA_NAME
          ((equal s~>cellName PCELL_CONNECT_NAME)
            (let
              (
              (pitch_x (or (dbFindProp s "pitch_x") (dbCreateProp s "pitch_x" "float" PC_CONNECT_PITCH_X)))
              (pitch_y (or (dbFindProp s "pitch_y") (dbCreateProp s "pitch_y" "float" PC_CONNECT_PITCH_Y)))
              )
              (pitch_x~>value = (pitch_x~>value + mosaic_dx))
              (pitch_y~>value = (pitch_y~>value + mosaic_dy))
            )
          ) ; PCELL_CONNECT_ANEM
        ) ; cond
      ) ; "inst"
      ;#--- path ---#
      ("path"
        (let ((ps s~>points) (ps_isReversed nil))
          ;if edge select
          (unless (car (geGetSelSetFigPoint s))
            (setq ps (reverse ps))
            (setq ps_isReversed t)
          )
          (let ((p0 (car ps)) (p1 (cadr ps)) (p_new nil))
            (setq ps
              (cond
                ((and (zerop path_dx) path_dy (eqv (xCoord p0) (xCoord p1)))
                  (cons (Point_translate_XY p0 0.0 path_dy) (cdr ps))
                )
                ((and path_dx (zerop path_dy) (eqv (yCoord p0) (yCoord p1)))
                  (cons (Point_translate_XY p0 path_dx 0.0) (cdr ps))
                )
                (t
                  (setq p_new (Point_translate_XY p0 path_dx path_dy))
                  (cons p_new ps)
                )
              ) ; cond
            ) ; setq ps
            (when ps_isReversed
              (setq ps (reverse ps))
            )
            (s~>points = ps)
            (when p_new
              (geSelectArea (hiGetCurrentWindow)
                (list
                  (Point_translate_XY p_new -0.00025 -0.00025)
                  (Point_translate_XY p_new +0.00025 +0.00025)
                )
              )
            ) ; when
          ) ; let - p0, p1, p_new
        ) ; let - ps, ps_isReversed
      ) ; "path"
    ) ; case
  ) ; foreach
) ; procedure
; -----------------------------------------------------------------------------
; (Point_translate_XY this dx dy)
; -----------------------------------------------------------------------------
; 点 this に対して X方向に dx、Y方向に dy だけ離れた位置の点を生成する汎用の関数。
; -----------------------------------------------------------------------------
(define (Point_translate_XY this dx dy)
  (range (plus (car this) dx) (plus (cadr this)))
)