Archive for category LISP

ダイナミックブロック

ダイナミックブロックのプロパティ変更。
(y_dyblk [名前] [値] [図形名])

Read the rest of this entry »

5 Comments

ある点からの曲線への投影点

;;曲線を選択
(setq E_NAME (entsel))
;;曲線以外の場所の点を選択
(setq PT (getpoint))
(setq V_OBJ (vlax-ename->vla-object (car E_NAME)))
(setq S_PT (vlax-curve-getClosestPointTo V_OBJ PT T))
S_PT点がそれ。
VLISPは曲線関数があってうれしいね。
間違えを訂正しました。m(_ _)m

6 Comments

ARXオブジェクトID

ようやくフィールドが使えそうな雰囲気なので。
(setq ENAME (car (entsel)))
(setq VLOBJ (vlax-ename->vla-object ENAME))
(vla-get-objectid VLOBJ)

No Comments

文字列に数字が入ってるか

半角数字
(wcmatch STRING “*#*”)
全角数字
(wcmatch STRING “*[1234567890]*”)

No Comments

変換マトリクス


UCSが設定してある図面において、
赤い線をLISPでブロックにすることを考える。
まずは普通にentgetしてブロックにし、insertしてみる。

(defun c:test(/ E_DATA)
;;線のエンティティデータE_DATA
(setq E_DATA (entget (car (entsel "\n線を選択:"))))
;;ブロック名B_NAME
(setq B_NAME "テストォ")
(entmake
(list
'(0 . "BLOCK")
'(100 . "AcDbEntity")
'(67 . 0)
(cons 8 (getvar "clayer"))
'(100 . "AcDbBlockBegin")
'(70 . 2)
'(10 0.0 0.0 0.0)
(cons 2 B_NAME)
'(1 . "")
)
)
;;属性
(entmake E_DATA)
;;ブロック宣言終わり
(entmake
(list
'(0 . "ENDBLK")
(cons 8 (getvar "clayer"))
)
)
)

すると、あ~ら不思議、UCSが設定されてるので、とんでもない傾きに。

つまり、WCSでの傾きを求めなければならない。

こんな点の変換を行う必要がある・・・ってどうすればいいんじゃ!
いや~な予感がしつつ、マトリクス変換とかいうのを使わにゃ面倒だ。
ってかマトリクス変換って方が面倒に感じる私だが、がんばるしかない。

(defun y_ucsrotate(
PT	;座標
B_PT	;挿入点
/
)
(y_pt+ (y_matrix (y_pt- PT B_PT) (y_ucsmatrix)) B_PT)
)
(defun y_matrix(
PT	;座標
MT	;変換マトリクス
/
)
(mapcar
'(lambda (x)
(+
(* (nth x (nth 0 MT))(nth 0 PT))
(* (nth x (nth 1 MT))(nth 1 PT))
(if (= (length PT) 3)
(* (nth x (nth 2 MT))(nth 2 PT))
0.0
)
(nth x (nth 3 MT))
)
)
(if (= (length PT) 3)
'(0 1 2)
'(0 1)
)
)
)
(defun y_ucsmatrix(
/
)
(list
(trans '(1 0 0) 0 1 T)
(trans '(0 1 0) 0 1 T)
(trans '(0 0 1) 0 1 T)
'(0 0 0)
)
)

UCSは設定したままでね。
(y_ucsrotate 変換したい座標 ブロックの原点)
これで変換先のWCSの座標が求められる(はず)。
試しに、
(command “circle” (trans (y_ucsrotate (trans (getpoint) 1 0) (trans (getpoint) 1 0)) 0 1) “500”)
とかしてみると、変換されてるのがわかる。
誰か行列教えてくれ~。

5 Comments

印刷スタイルテーブル

アクティブなレイアウト(モデル含)のスタイルテーブルの変更

(vlax-put-property
(vlax-get-property
(vlax-get-property
(vlax-get-acad-object)
'ActiveDocument
)
'ActiveLayout
)
'StyleSheet
"Default.stb"
)

No Comments

ポリラインの接線

道路の測点を打ったり、幅員描くLISPを書き直そうとしてたら、いいもの見つけた。
導関数
そういえば、微分習ってた時に、接線とかなんとか先生が言ってた気が。
もっと早く気づけばよかったよ。

;;ポリライン上の任意の点においての接線と接線の垂直線を描くVLISP
(vl-load-com)
(defun c:test(
/
e_name
e_obj
pt
param
pt2
pt3
)
(setq e_name (car (entsel)))
(setq e_obj (vlax-ename->vla-object e_name))
(setq pt (getpoint))
(setq param (vlax-curve-getParamAtPoint e_obj pt))
(setq pt2 (vlax-curve-getFirstDeriv e_obj param))
(setq pt3 (vlax-curve-getSecondDeriv e_obj param))
(command "xline" pt (mapcar '+ pt pt2) (mapcar '+ pt pt3) "")
)

No Comments