Examples/ビアを正規化する

Last-modified: 2021-09-21 (火) 00:06:41

概要

ビアについて、見た目の形状をそのまま変えずに orient プロパティだけを R0R0 に(矯正)する。

背景

Virtuoso Layout Suite でシンボリックビアをいろんな向き(orient)に置くことがある。既存のビアをコピーして反転配置したりしてる内に気がついたらいろんな向きになってることがある。

だけど気持ち悪いのは、それらのビアのエンクローズとか展開数とかのプロパティを調整したりするとき。見た目とは逆の方向に広がったり、90°回転された方向に広がったりすること。それって気持ち悪いし編集しにくい。だから「見た目の形状をそのまま変えずに orient プロパティだけを R0 に(矯正)する」、いわば「正規化」したいなと思うことがよくある。

そこで今回シンボリックビアを「正規化」するコードを考えてみた。(via_normalize this) で this としてビアを与えると、そのビアが正規化されるんだ。

コード

(define (via_normalize this)
  (unless (equal "R0" (dbGet this 'orient)) ; 正規化が必要な場合にだけ以下の処理をする
    (let
      (
      (_cutColumns (dbGet this 'cutColumns)) (_cutRows   (dbGet this 'cutRows  ))
      (_cutWidth   (dbGet this 'cutWidth  )) (_cutHeight (dbGet this 'cutHeight))
      (transform (list (range 0 0) (dbGet this 'orient) 1))
      )
      (when (member (dbGet this 'orient) '("R90" "R270" "MXR90" "MYR90")) ; X/Y 交換が必要な場合
        (dbSet this _cutRows                          'cutColumns)
        (dbSet this _cutColumns                       'cutRows   )
        (dbSet this _cutHeight                        'cutWidth  )
        (dbSet this _cutWidth                         'cutHeight )
        (dbSet this (reverse (dbGet this 'cutSpaces)) 'cutSpaces )
        (dbSet this (reverse (dbGet this 'layer1Enc)) 'layer1Enc )
        (dbSet this (reverse (dbGet this 'layer2Enc)) 'layer2Enc )
      )
      (when (dbGet this 'layer1Offset) (dbSet this (dbTransformPoint transform (dbGet this 'layer1Offset)) 'layer1Offset))
      (when (dbGet this 'layer2Offset) (dbSet this (dbTransformPoint transform (dbGet this 'layer2Offset)) 'layer2Offset))
      (when (dbGet this 'originOffset) (dbSet this (dbTransformPoint transform (dbGet this 'originOffset)) 'originOffset))
      (dbSet this "R0" 'orient)
    )
    this
  ) ; unless
) ; define via_normalize

使用例

現在選択しているオブジェクトの中に含まれすべてのビアを正規化する。

(foreach v (setof o (geGetSelectedSet) (member (dbGet o 'objType) '("stdVia" "customVia")))
  (via_normalize v)
)