Examples/インスタンスのライブラリ名・セル名・ビュー名を変更する

Last-modified: 2021-09-27 (月) 14:39:31

レイアウトでは既存のインスタンスの参照先ライブラリ名やセル名やビュー名を変更したい場合があります。一つや二つならプロパティエディタを使って変更してもよいでしょうが、たくさんするとなるとバッチスクリプトにしたいものです。そんな時にこれが使えます。

個別のインスタンス(またはモザイク)をマップで指定したように置換する

「個別のインタンス(またはモザイク)」をここでは現在選択中のオブジェクト((geGetSelectedSet) で求める)としており、これはGUIで個別に特定のインタンスを置換したい場合に特に使える。だが、GUI 使用時だけでなくバッチ処理でも使えるハズ...。

(let
  ((replaceMap
   '(
    (("oldLib1" "oldCell1" "oldView1") ("newLib1" "newCell1" "newView1"))
    (("oldLib2" "oldCell2" "oldView2") ("newLib2" "newCell2" "newView2"))
                                      :
    (("oldLibN" "oldCellN" "oldViewN") ("newLibN" "newCellN" "newViewN"))
    )
  ))
  (foreach inst (setof o (geGetSelectedSet) (member o~>objType '("inst" "mosaic")))
    (let ((e (assoc (list inst~>libName inst~>cellName inst~>viewName) replaceMap)))
      (when e ; ← replaceMap に該当するものが見つかった場合
        (let ((new (cadr e)))
          (leReplaceAnyInstMaster
            inst ; ← このインスタンスについて置換する
            (car new) (cadr new) (caddr new) ; newLib newCell newView
          ))))))

指定のセルビュー中に含まれるすべてのインタンスとモザイクをマップで指定したように置換する

「指定のセルビュー」をここでは編集中のセルビュー((geGetEditCellView) で求める)にしているが、dbOpenCellViewByName などで開いたビューにしてもよい。

セルビュー中のインタンスとモザイクのすべてが対象になるので、グループ化されているものも置換の対象である。

(let ((cellView (geGetEditCellView)))
  (foreach rm
   '(
    (("oldLib1" "oldCell1" "oldView1") ("newLib1" "newCell1" "newView1"))
    (("oldLib2" "oldCell2" "oldView2") ("newLib2" "newCell2" "newView2"))
                                      :
    (("oldLib2" "oldCell2" "oldView2") ("newLib2" "newCell2" "newView2"))
    )
    (let ((old (car rm)) (new (cadr rm)))
      (leRemasterInstances
        cellView ; ← このセルビュー中のものをすべて置換する
        (car old) (cadr old) (caddr old) ; oldLib oldCell oldView
        (car new) (cadr new) (caddr new) ; newLib newCell newView
      ))))