Kye 发表于 2015-3-26 15:11:28

如何用entmake 去实现 断点命令

本帖最后由 Kye 于 2015-3-26 16:44 编辑

在线段或圆弧上选取任一点,将线段或圆弧打断,用下面这个在2012中好用在2007中又不好用
;_断点
;;;http://cadtips.cadalyst.com/2d-operations/break-a-selected-point
(defun breakpt ( pt1 )
;(setq pt1 (getpoint"Select Braking Point: "))
(command"break" pt1 "@" "")
(princ)
)

所以想改用entmake新建两个圆弧或直线,删除原来圆弧及直线,直线解决了,但圆弧遇到了困难,反正弦函数角度范围(- 0.5pi +0.5pi),下面程序中如果选取点与圆弧起始点的圆心角大于0.5pi 也不清楚如何处理,生成新圆弧的设定条件调试很长时间,没搞定,请哪位大侠出手帮忙指点迷津,或者帮忙提供个新的不用break的断点程序,谢谢了


;_顶角就是要求的圆心角θ,设弦长为h,则sin(θ/2)=(h/2)÷r=h/2r,θ=2arcsin(h/2r).

;_e=(car (entsel))
;_(setq e (car (entsel)))
(defun mkArc (e sa ea)
(setq ed (entget e))
(setq ed (subst (cons 50 sa) ;_ed (entget e)
    (assoc 50 ed)
    ed
    )
ed (subst (cons 51 ea)
    (assoc 51 ed)
    ed
    )
)
(entmake ed)
)

(defun c:TT   ()
;_取得组码值
(defun dxf (e i)
    (cdr (assoc i (entget e)))
)
;_反正弦函数
;;; Arcsin(x)
;;; x valid in [-1,1]
;;; Return: Radian
;;; Standard Mathematics defined Arcsin on
;;; [-pi/2, pi/2]
(defun arcsin (x)
(cond
    ((= x 1.0) (/ pi 2.0))
    ((= x -1.0) (/ pi -2.0))
    ((and (> x -1.0) (< x 1.0))
   (atan (/ x (sqrt (- 1.0 (* x x)))))
    )
    (T nil)
)
)


(setq ss (ssget '((0 . "arc"))))
(setq e(ssname ss 0 )ed (entget e) )
      
   (setq sa (dxf e 50)) ;_获取起始角度
   (setq Ea (dxf e 51)) ;_获取终止角度
   (setq r (dxf e 40 ));_获取圆弧半径
   (setq cenpt (dxf e 10)) ;_获取圆弧圆心 e=(car (entsel))
   (setq sp (polar cenpt sa r) ;_获取圆弧起始点
ep (polar cenpt Ea r) ;_获取圆弧终止点
)
(setq l   (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)));_圆弧长度
   
(setq sita (/ l r));_圆心角
   

(setq getpt (getpoint "\n 选取点:"))
(setq h (distance sp getpt))
(setq x (/ h ( * 2 r)))
(setq ArcAng (* 2 (arcsin x)));_选取点与圆弧起始点的圆心角
(if ( < arcAng 0) (setq ArcAng (- (* pi 2) ArcAng)))

;(setq positionAng (- (angle ep sp) (angle cenpt sp)));_positionAng 方位角
;(if (< positionAng 0)
   (if(equal (abs ( - sa ea)) sita 0.01)
    (progn (setq temp (+ sa ArcAng))
    (mkArc e sa temp)
    (mkArc e temp Ea)
    (entdel e)
    )
    (progn (setq temp (- sa ArcAng))
    (mkArc e sa temp)
    (mkArc e temp Ea)
    (entdel e)
    )
   
)

)


ZZXXQQ 发表于 2015-3-27 08:52:33

(defun c:tt ()
(while (and (setq s1 (entsel "选圆弧打断点: "))
         (setq ent (entget(car s1)))
         (= (cdr(assoc 0 ent)) "ARC"))
(setq r (cdr(assoc 40 ent)))
(setq pc (cdr(assoc 10 ent)))
(setq sa (cdr(assoc 50 ent)))
(setq ea (cdr(assoc 51 ent)))
(setq ps (polar pc sa r))
(setq pe (polar pc ea r))
(setq pb (osnap (cadr s1) "NEA"))
(setq ba (angle pc pb))
(entmod (subst (cons 51 ba) (assoc 51 ent) ent))
(entmake (subst (cons 50 ba) (assoc 50 ent) (cdr ent)))
)
(princ)
)

Kye 发表于 2015-3-27 11:54:02

本帖最后由 Kye 于 2015-3-27 11:55 编辑

再次谢谢Z版
页: [1]
查看完整版本: 如何用entmake 去实现 断点命令