2024年6月6日木曜日

ポリラインの幅をゼロにする

(IJCADヘルプセンター)ポリラインが太く表示される場合はどうすればよいですか

選択したポリラインの幅をゼロにするには次のコマンドを作ればよい。

;; ポリラインの線幅を0にする
(defun C:PLZERO ( / ss i n obj)
  (if (setq ss (ssget '((0 . "LWPOLYLINE,POLYLINE"))))
    (progn
      (setq i 0 n (sslength ss))
      (while (< i n )
        (setq obj (vlax-ename->vla-object (ssname ss i)))
        (vla-put-ConstantWidth obj 0.0)
        (setq i (1+ i) obj nil)
      )
      (setq ss nil)
    )
  )
)

(ssget)で複数図形選択対話、(sslength)で選択した図形数を取得して、while ループを回して(ssname)で番号指定で図形名を取得するというのが複数図形を処理する鉄板です。覚えてね。

(vlax-ename->vla-object)でオブジェクトとして取得して、ConstantWidth プロパティを 0.0 に設定することによりポリラインのグローバル幅を0にしています。これだけ。

図形リストでやろうとすると大変

図形リストバージョン次の通りになります。わかりやすくするために3つの部分に分けました。
;; 図形リストを使ってポリラインの線幅を0にする
(defun C:PLZERO_EL ( / ss i n el)
  (if (setq ss (ssget '((0 . "LWPOLYLINE,POLYLINE"))))
    (progn
      (setq i 0 n (sslength ss))
      (while (< i n )
        (setq el (entget (ssname ss i)))
        (if (= "LWPOLYLINE" (cdr (assoc 0 el)))
          (plzero0 el)
          (plzero1 el)
        )
        (setq i (1+ i))
      )
      (setq ss nil)
    )
  )
)

;; ライトウェイトポリラインの線幅を0にする
(defun plzero0 ( el / nl )
  (if (assoc 43 el)
    ;グローバル幅(43)があればそれを変える
    (entmod (subst (cons 43 0.0)(assoc 43 el) el))
    ;開始幅、終了幅を全部0にする必要がある
    (progn
      (while el
        (if (or (= 40 (caar el))(= 41 (caar el)))
          (setq nl (cons (cons (caar el) 0.0) nl))
          (setq nl (cons (car el) nl))
        )
        (setq el (cdr el))
      )
      (entmod (reverse nl))
    )
  )
)

;; ヘビーウェイトポリラインの線幅を0にする
(defun plzero1 ( el / )
  ;図形リストは POLYLINE,複数のVERTEX,SEQEND
  (while (/= "SEQEND" (cdr (assoc 0 el)))
    ;開始幅(40)と終了幅(41)を0にする
    (if (assoc 40 el)
      (setq el (subst (cons 40 0.0)(assoc 40 el) el))
    )
    (if (assoc 41 el)
      (setq el (subst (cons 41 0.0)(assoc 41 el) el))
    )
    ;リストを更新
    (entmod el)
    ;次の従属図形の図形リストを取得する
    (setq el (entget (entnext (cdr (assoc -1 el)))))
  )
)

コマンドの部分では、(vlax-ename->vla-object)が(entget)に変わって図形リストを取得している部分と、図形種類(0)がライトウェイトポリライン "LWPOLYLINE" かどうかで進む関数が分岐している部分が違います。

ライトウェイトポリラインの変更ではグローバル幅(43)が設定されている場合は、グローバル幅を変更するだけでよいのですが、グローバル幅が設定されていない場合は、図形リストから複数存在する開始幅(40)と終了幅(41)を検出して0.0に変更する必要があります。

ヘビーウエイトポリラインの変更では、主図形のポリライン図形(POLYLINE)と、従属図形の頂点図形(VERTEX)の開始幅(40)と終了幅(41)を0.0に変更する必要があります。頂点図形を変更するために従属図形の終了マーカー(SEQEND)を検出するwhileループが必要です。

このように、図形種類によって図形リストが大きく変化する場合、オブジェクトを扱ったほうがわかりやすくなります。


0 件のコメント:

コメントを投稿

ARESのトリニティ(三位一体)

 ARESのトリニティ戦略、どこがトリニティなんでしょう。 まずはデスクトップCADが、WindowsにもMacにもLinux版もあるというトリニティ。 デスクトップCADと、モバイルCAD(ARES Touch)と、ブラウザとサーバーCAD(ARES Kudo)のトリニティ。 ...