在这里,我纠正了罗伊的代码,虽然有些不同,但逻辑是相同的。。。
- (defun c:3DRect ( / v^v unit doc normal pt1 pt2 pt3 pt4 )
- (vl-load-com)
- (defun v^v ( u v )
- (list
- (- (* (cadr u) (caddr v)) (* (caddr u) (cadr v)))
- (- (* (caddr u) (car v)) (* (car u) (caddr v)))
- (- (* (car u) (cadr v)) (* (cadr u) (car v)))
- )
- )
- (defun unit ( v )
- (if (not (equal v '(0.0 0.0 0.0) 1e-)
- (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
- )
- )
- (setq doc (vla-get-activedocument (vlax-get-acad-object)))
- (vla-endundomark doc) ; End open undo group.
- (vla-startundomark doc)
- (if
- (and
- (setq pt1 (trans (getpoint "\nFirst corner : ") 1 0))
- (setq pt3 (trans (getpoint (trans pt1 0 1) "\nOther corner : ") 1 0))
- (setq normal (unit (v^v '(0.0 0.0 1.0) (mapcar '- pt3 pt1))))
- )
- (progn
- (setq pt2 (inters pt1 (mapcar '+ pt1 (v^v normal (append (mapcar '+ '(0.0 0.0) (mapcar '- pt3 pt1)) (list 0.0)))) pt3 (mapcar '+ pt3 (append (mapcar '+ '(0.0 0.0) (mapcar '- pt1 pt3)) (list 0.0))) nil))
- (setq pt4 (inters pt3 (mapcar '+ pt3 (v^v normal (append (mapcar '+ '(0.0 0.0) (mapcar '- pt1 pt3)) (list 0.0)))) pt1 (mapcar '+ pt1 (append (mapcar '+ '(0.0 0.0) (mapcar '- pt3 pt1)) (list 0.0))) nil))
- (entmake
- (list
- '(0 . "LWPOLYLINE")
- '(100 . "AcDbEntity")
- '(100 . "AcDbPolyline")
- '(90 . 4)
- (cons 70 (+ 1 (* (getvar 'plinegen) 128)))
- (cons 43 (getvar 'plinewid))
- (cons 38 (caddr (trans pt1 0 normal))) ; Elevation.
- (cons 39 (getvar 'thickness))
- (cons 10 (trans pt1 0 normal))
- (cons 10 (trans pt2 0 normal))
- (cons 10 (trans pt3 0 normal))
- (cons 10 (trans pt4 0 normal))
- (cons 210 normal)
- )
- )
- )
- )
- (vla-endundomark doc)
- (princ)
- )
M、 R。 |