ビューポートの矩形を描く


モデル空間でしか使ってませんので、
ペーパー空間とかはどうなるのか全くわかりません
とりあえずのメモ

(defun c:test(
/
ctr
vsize
vmax
vmin
fac
dis
ang
pt1
pt2
)
(setq ctr (getvar "viewctr"))
(setq vsize (getvar "viewsize"))
(setq vmax (getvar "vsmax"))
(setq vmin (getvar "vsmin"))
(setq fac (/ (/ vsize 2.0) (- (cadr vmax) (cadr vmin))))
(setq dis (* fac (distance vmax vmin)))
(setq ang (angle vmin vmax))
(setq pt1 (polar ctr (+ PI ang) dis))
(setq pt2 (polar ctr ang dis))
(command "rectang" pt1 pt2)
)
  1. #1 by mkr - 4月 15th, 2008 at 16:32

    再作図せずに窓の大きさを変えて実行したらうまくいきませんでした。
    窓の大きさがリアルタイムで反映される SCREENSIZE の方が良いかも?です。
    「仮想スクリーン」の意味が解らなくて、ヘルプで検索してみました。
    vsmin,vsmax が下記の事なら、うまくいかないのはなんとなく解る気がします。
    —————–
    ヘルプより
    用語集–仮想スクリーン表示(virtual screen display)
    AutoCAD が図面を再作図せずに画面移動やズーミングできる領域。
    —————–

  2. #2 by ゆり - 4月 15th, 2008 at 19:48

    >SCREENSIZE の方が良いかも?
    SCREENSIZEをビューポートの大きさにする方法がわからない・・・(T^T)

  3. #3 by mkr - 4月 16th, 2008 at 05:25

    ;;; VIEWSIZEとSCREENSIZE(Y方向)は単位が違うだけで同じです。
    (defun C:Test ( / viwctr viwsiz scrX:Y hafvsX hafvsY)
    (setq viwctr (getvar “VIEWCTR”)
    viwsiz (getvar “VIEWSIZE”)
    scrX:Y (/ (car (getvar “SCREENSIZE”))
    (cadr (getvar “SCREENSIZE”)) )
    hafvsX (* (* viwsiz scrX:Y) 0.5) ; X方向の1/2長さ
    hafvsY (* viwsiz 0.5) ; Y方向の1/2長さ
    )
    (command “_.rectang” (mapcar ‘- viwctr (list hafvsX hafvsY))
    (mapcar ‘+ viwctr (list hafvsX hafvsY)) )
    );;END defun

  4. #4 by mkr - 4月 16th, 2008 at 05:28

    すんません。
    字下げのやりかたが。。。

  5. #5 by ゆり - 4月 17th, 2008 at 23:05

    おおおお♪
    ありがとうございます!m(_ _)m

  6. #6 by Shirubadappuru - 6月 25th, 2011 at 08:18

    初めまして。
    ビューポートの矩形を描く
    見よう見まねでこのLispから図面範囲ズーム(アニメーション的な)を作りました。
    とても参考になりました。
    ;==============================================================================
    ;図面範囲ズームアニメーション
    (defun c:ZumenHaniZoom_Anime(/
    rh
    ld
    rhani
    ldani
    echo
    ctr
    vsize
    vmax
    vmin
    fac
    dis
    ang
    pt1
    pt2
    p1
    p2

    )
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (setq
    rh nil
    ld nil
    rhani nil
    ldani nil
    echo nil
    )
    (setq
    echo (getvar “CMDECHO”)
    )
    (setq ctr (getvar “viewctr”))
    (setq vsize (getvar “viewsize”))
    (setq vmax (getvar “vsmax”))
    (setq vmin (getvar “vsmin”))
    (setq fac (/ (/ vsize 2.0) (- (cadr vmax) (cadr vmin))))
    (setq dis (* fac (distance vmax vmin)))
    (setq ang (angle vmin vmax))
    (setq pt1 (polar ctr (+ PI ang) dis))
    (setq pt2 (polar ctr ang dis))

    (setvar “CMDECHO” 0)
    ;;;
    ;;; マーカー点をオフにします。
    ;;;
    (command “blipmode” “OFF”)
    ;;;
    ;;; 文字省略モードをオンにします。文字の代わりにボックスを表示します。
    ;;;
    ; (setvar “QTEXTMODE” 1)
    ; (command “regen” )
    ;;;***************************************************
    (princ)
    ;== ②図面範囲の右上の座標を取得し【rh】へ代入
    (setq rh (getvar “limmax”))
    (setq rh (trans rh 0 1)) ; ポイントを相対座標に変換
    ;== ③図面範囲の左下の座標を取得し【ld】へ代入
    (setq ld (getvar “limmin”))
    (setq ld (trans ld 0 1)) ; ポイントを相対座標に変換
    (setq cnt 1);;ここよ カウンターを初期化
    (while (< cnt 11);;ここよ カウンターが10で
    ;;;***************************************************
    ;;;
    ;;; 表示範囲をAnimation
    ;;;
    (setq xxld (car ld)) ;X座標
    (setq yyld (cadr ld)) ;y座標
    (setq zzld (caddr ld));z座標
    (setq xxrh (car rh)) ;X座標
    (setq yyrh (cadr rh)) ;y座標
    (setq zzrh (caddr rh)) ;z座標
    ;;;
    (setq xxmin (car pt1)) ;X座標
    (setq yymin (cadr pt1)) ;y座標
    (setq zzmin (caddr pt1)) ;z座標
    (setq xxmax (car pt2)) ;X座標
    (setq yymax (cadr pt2)) ;y座標
    (setq zzmax (caddr pt2)) ;z座標
    ;;;
    (setq xx1 (+ xxmin (*(- xxld xxmin) (* 0.1 cnt )))) ;X座標
    (setq yy1 (+ yymin (*(- yyld yymin) (* 0.1 cnt )))) ;y座標
    (setq zz1 (+ zzmin (*(- zzld zzmin) (* 0.1 cnt ))) );z座標
    (setq xx2 (- xxmax (*(- xxmax xxrh ) (* 0.1 cnt ))) );X座標
    (setq yy2 (- yymax (*(- yymax yyrh) (* 0.1 cnt ))));y座標
    (setq zz2 (- zzmax(*(- zzmax zzrh) (* 0.1 cnt )))) ;z座標
    (setq p1 (list xx1 yy1 zz1))
    (setq p2 (list xx2 yy2 zz2))
    ;;;***************************************************
    (command "zoom" "w" p1 p2 )
    (setq cnt (1+ cnt))
    )
    ;;;
    ;;; 文字省略モードをオフにします。文字を表示します。
    ;;;
    ; (setvar "QTEXTMODE" 0)
    ; (command "regen" )
    ;;;
    ;;; マーカー点をオンにします。
    ;;;
    (command "blipmode" "ON")

    ;;;***************************************************
    ;;;***************************************************
    (setvar "CMDECHO" echo)
    ;;;;;;;;;;;;;
    (princ)
    )
    ;;;***************************************************
    ;;;***************************************************

  7. #7 by yuri - 6月 25th, 2011 at 12:16

    はじめまして、お役に立てたようでよかったです。

    LISPを試してみたのですが、

    コマンド: ZUMENHANIZOOM_ANIME
    ; エラー: 引数のタイプが間違っています: (or stringp symbolp): nil

    と言われて実行できませんでした(^^;

  8. #8 by Shirubadappuru - 6月 25th, 2011 at 14:59

    お返事有難うございます。
    YuriさんのBlog上に載せさせていただいたLispをコピーして
    動かしてみたら同じようにエラーになりました。
    (\(゜ロ\)ココハドコ? (/ロ゜)/アタシハダアレ?)

    手元のものと見比べると
    (setq ctr (getvar “viewctr”))が
    (setq ctr (getvar “viewctr”))になっており
    Lispの編集に使っているLispPadで開くと”が赤字になるはずがなっていないので
    文字化けの原因はよくわかりませんがこれのせいかなという気がします。

    あとオブジェクト範囲,図面範囲,矩形選択ズームの3種類を作成しましたが
    矩形選択ズームの時に少し不自然な動きをするので
    VIEWSIZEとSCREENSIZEのことが書いてあったのでこれを試してみようと思います。

(will not be published)
  1. No trackbacks yet.