本帖最后由 zhynt 于 2011-6-26 17:02 编辑
先粗略的写了一下,无须用户输入什么,点哪里就画哪里,没有规划图层、线型等
- ;;;点到直线的距离
- (defun point_line (pt pt1 pt2 / ptangle ptn pt pt1 pt2 dist jptx)
- (setq ptangle (angle pt1 pt2)
- ptn (polar pt (+ (* 0.5 pi) ptangle) 0.01)
- jptx (inters pt ptn pt1 pt2 nil)
- dist (distance pt jptx)
- )
- dist
- )
- ;;;两点的中点
- (defun mpt (mpt1 mpt2)
- (polar mpt1 (angle mpt1 mpt2) (/ (distance mpt1 mpt2) 2))
- )
- (defun C:ttt ()
- ;;;获取图元以及控制点
- (setq en (entsel)
- ent (entget (car en))
- pt (cadr en)
- )
- ;;;获取矩形顶点表
- (setq ptlist (vl-remove-if '(lambda (x) (/= 10 (car x))) ent))
- (setq ptlist (mapcar 'cdr ptlist))
- ;;;对顶点表排序
- (setq ptlist
- (vl-sort ptlist
- (function
- (lambda (e1 e2)
- (< (+ (car e1) (cadr e1)) (+ (car e2) (cadr e2)))
- )
- )
- )
- )
- ;;;;规范pt1 pt2 pt3 pt4
- (setq pt1 (nth 0 ptlist)
- pt3 (nth 3 ptlist)
- ptax (car pt1)
- ptay (cadr pt1)
- ptbx (car pt3)
- ptby (cadr pt3)
- pt2 (list ptbx ptay)
- pt4 (list ptax ptby)
- )
- ;;;;矩形四边组表
- (setq linelst (list (list pt1 pt2)
- (list pt1 pt4)
- (list pt2 pt3)
- (list pt3 pt4)
- )
- )
- ;;;获取距控制点最近的边
- (setq linelst
- (vl-sort linelst
- (function
- (lambda (e1 e2)
- (< (point_line pt (car e1) (cadr e1))
- (point_line pt (car e2) (cadr e2))
- )
- )
- )
- )
- )
- ;;;计算中点
- (setq pt5 (mpt (car (car linelst)) (cadr (car linelst))))
- ;;;获取距中点距离最大的点
- (setq ptlist (vl-sort ptlist
- (function
- (lambda (e1 e2)
- (> (distance pt5 e1) (distance pt5 e2))
- )
- )
- )
- )
- ;;;作图,在这里可以对图层线型进行控制
- (command "_.line" (car ptlist) pt5 (cadr ptlist) "")
- )
|