waterchen 发表于 2015-9-7 11:25:54

本帖最后由 waterchen 于 2015-9-7 14:31 编辑

    改进一下,支持大角度.

(defun c:tt (/
       ang
       c
       d data dimsty dimoff dimtxh dimp1 dimp2 dimp3
       ent *error*
       flg1 flg2
       olderr
       m1 m2 mt1 mt2
       p1 p2
       r
       )
(defun *error* (msg)
    (princ (strcat "\nError: " msg))
    (if (= 8 (logand 8 (getvar 'UNDOCTL)))
      (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
      )
    (setq *error* olderr)
    (princ)
    )

(defun make_Dim (p1 p2 p3 ang /)
    (entmakex
      (list
'(0 . "DIMENSION")
'(100 . "AcDbEntity")
'(100 . "AcDbDimension")
(cons 10 p3)
'(11 0. 0. 0.)
'(70 . 32)
'(100 . "AcDbAlignedDimension")
(cons 13 p1)
(cons 14 p2)
(cons 50 ang)
'(100 . "AcDbRotatedDimension")
)
      )
    )

(defun make_line (p1 p2)
    (entmakex (list '(0 . "LINE")
       '(100 . "AcDbEntity")
       '(100 . "AcDbLine")
       (cons 10 p1)
       (cons 11 p2)
       '(210 0. 0. 1.)
       )
       )
    )
;;;**************************main program**************************;;;
(setq olderr *error*)
(setqp1 (getpoint    "\nFirst point:"))
(initget (+ 32 128))
(setqp2 (getpoint p1 "\nSecond point:"))
(if (and
(= 'LIST (type p1))
(= 'LIST (type p2))
(> (distance p1 p2) 250.0)
(setq ent (car (nentselp p1)))
)
    (progn
      (setq data (entget ent))
      
      (if (equal (cdr (assoc 0 data)) "ARC")
(progn
    (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
    (setq
      ang    (angle p1 p2)
      m1   (polar p1 ang (* 0.5 (distance p1 p2)))
      m2   (vlax-curve-getPointAtDist ent
         (* 0.5
      (vlax-curve-getdistatparam
      ent
      (vlax-curve-getendparam ent)
      )
      )
         )
      c      (cdr (assoc 10 data))
      r      (cdr (assoc 40 data))
      mt1    (polar p1 ang 200.0)
      dimsty (tblsearch "Dimstyle" (getvar "dimstyle"))
      dimoff (* (cdr (assoc 40 dimsty)) (cdr (assoc 147 dimsty)))
      dimtxh (* (cdr (assoc 40 dimsty)) (cdr (assoc 140 dimsty)))
      dimtxh (+ dimoff (* 3.0 dimtxh))
      dimp1(polar m1ang dimtxh)
      dimp2(polar mt1 ang dimtxh)
      flg1   (car (trans (mapcar '- m2 p1) 0 (mapcar '- p2 p1)))
      flg2   (car (trans (mapcar '- cp1) 0 (mapcar '- p2 p1)))
      )
   
    (cond
      ((or
       (and (> flg1 0.0) (> flg2 0.0))
       (and (< flg1 0.0) (< flg2 0.0))
       )
       (setq d (+ (sqrt (- (expt r 2.0) (expt (distance m1 mt1) 2.0))) (distance m1 c)))
       )
      
      ((or
         (and (> flg1 0.0) (<= flg2 0.0))
         (and (< flg1 0.0) (>= flg2 0.0))
         )
       (setq d (- (sqrt (- (expt r 2.0) (expt (distance m1 mt1) 2.0))) (distance m1 c)))
       )
      )
    (setq
      ang   (angle m1 m2)
      mt2   (polar mt1 ang d)
      dimp3 (polar mt2 ang dimtxh)
      )
    (make_line p1p2)
    (make_line m1m2)
    (make_line mt1 mt2)
    (make_Dim m1m2dimp1 (angle m1m2))
    (make_Dim mt1 mt2 dimp2 (angle mt1 mt2))
    (make_Dim p1mt2 dimp3 (angle p1mt1))
    (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
    )
(princ "\nEntity is not an ARC!")
)
      )
    (princ "\nAt first point can not select ARC entity \nor the distance between 2 points is too short!")
    )

(setq *error* olderr)
(princ)
)

海贼凌源 发表于 2016-2-20 14:55:09

本帖最后由 海贼凌源 于 2016-2-20 14:57 编辑

waterchen 发表于 2015-9-5 12:54 static/image/common/back.gif
楼主看看,是不是想要这样效果的。
谢谢你的回答,抱歉回复的晚了。不知道为什么代码在我的电脑里使用没有反应,其他的代码也是,但感觉学习到了不少。

waterchen 发表于 2016-2-22 10:10:56

海贼凌源 发表于 2016-2-20 14:55 static/image/common/back.gif
谢谢你的回答,抱歉回复的晚了。不知道为什么代码在我的电脑里使用没有反应,其他的代码也是,但感 ...

再试试这个吧,加多了一句 (vl-load-com)。

(defun c:tt (/
       ang
       c
       d data dimsty dimoff dimtxh dimp1 dimp2 dimp3
       ent *error*
       flg1 flg2
       olderr
       m1 m2 mt1 mt2
       p1 p2
       r
       )
(vl-load-com)
(defun *error* (msg)
    (princ (strcat "\nError: " msg))
    (if (= 8 (logand 8 (getvar 'UNDOCTL)))
      (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
      )
    (setq *error* olderr)
    (princ)
    )

(defun make_Dim (p1 p2 p3 ang /)
    (entmakex
      (list
'(0 . "DIMENSION")
'(100 . "AcDbEntity")
'(100 . "AcDbDimension")
(cons 10 p3)
'(11 0. 0. 0.)
'(70 . 32)
'(100 . "AcDbAlignedDimension")
(cons 13 p1)
(cons 14 p2)
(cons 50 ang)
'(100 . "AcDbRotatedDimension")
)
      )
    )

(defun make_line (p1 p2)
    (entmakex (list '(0 . "LINE")
       '(100 . "AcDbEntity")
       '(100 . "AcDbLine")
       (cons 10 p1)
       (cons 11 p2)
       '(210 0. 0. 1.)
       )
       )
    )
;;;**************************main program**************************;;;
(setq olderr *error*)
(setqp1 (getpoint    "\nGet First point on arc:"))
(initget (+ 32 128))
(if (listp p1)
    (setqp2 (getpoint p1 "\nGet Second point on arc:"))
    )
(if (and
(listp p1)
(listp p2)
(> (distance p1 p2) 250.0)
(setq ent (car (nentselp p1)))
)
    (progn
      (setq data (entget ent))
      
      (if (equal (cdr (assoc 0 data)) "ARC")
(progn
    (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
    (setq
      ang    (angle p1 p2)
      m1   (polar p1 ang (* 0.5 (distance p1 p2)))
      m2   (vlax-curve-getPointAtDist ent
         (* 0.5
      (vlax-curve-getdistatparam
      ent
      (vlax-curve-getendparam ent)
      )
      )
         )
      c      (cdr (assoc 10 data))
      r      (cdr (assoc 40 data))
      mt1    (polar p1 ang 200.0)
      dimsty (tblsearch "Dimstyle" (getvar "dimstyle"))
      dimoff (* (cdr (assoc 40 dimsty)) (cdr (assoc 147 dimsty)))
      dimtxh (* (cdr (assoc 40 dimsty)) (cdr (assoc 140 dimsty)))
      dimtxh (+ dimoff (* 3.0 dimtxh))
      dimp1(polar m1ang dimtxh)
      dimp2(polar mt1 ang dimtxh)
      flg1   (car (trans (mapcar '- m2 p1) 0 (mapcar '- p2 p1)))
      flg2   (car (trans (mapcar '- cp1) 0 (mapcar '- p2 p1)))
      )
   
    (cond
      ((or
       (and (> flg1 0.0) (> flg2 0.0))
       (and (< flg1 0.0) (< flg2 0.0))
       )
       (setq d (+ (sqrt (- (expt r 2.0) (expt (distance m1 mt1) 2.0))) (distance m1 c)))
       )
      
      ((or
         (and (> flg1 0.0) (<= flg2 0.0))
         (and (< flg1 0.0) (>= flg2 0.0))
         )
       (setq d (- (sqrt (- (expt r 2.0) (expt (distance m1 mt1) 2.0))) (distance m1 c)))
       )
      )
    (setq
      ang   (angle m1 m2)
      mt2   (polar mt1 ang d)
      dimp3 (polar mt2 ang dimtxh)
      )
    (make_line p1p2)
    (make_line m1m2)
    (make_line mt1 mt2)
    (make_Dim m1m2dimp1 (angle m1m2))
    (make_Dim mt1 mt2 dimp2 (angle mt1 mt2))
    (make_Dim p1mt2 dimp3 (angle p1mt1))
    (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
    )
(princ "\nEntity is not an ARC!")
)
      )
    (princ "\nAt first point can not select ARC entity \nor the distance between 2 points is too short!")
    )

(setq *error* olderr)
(princ)
)

海贼凌源 发表于 2016-2-22 17:26:35

本帖最后由 海贼凌源 于 2016-2-22 17:30 编辑

waterchen 发表于 2016-2-22 10:10 static/image/common/back.gif
再试试这个吧,加多了一句 (vl-load-com)。
谢谢,这回有效果了,是我要的效果。
请问你用什么制作的动图?

waterchen 发表于 2016-2-23 09:31:19

海贼凌源 发表于 2016-2-22 17:26 static/image/common/back.gif
谢谢,这回有效果了,是我要的效果。
请问你用什么制作的动图?

制作这个有很多软件,我用的是LICEcap,网上找下就有了。

海贼凌源 发表于 2016-2-24 11:14:54

waterchen 发表于 2016-2-23 09:31 static/image/common/back.gif
制作这个有很多软件,我用的是LICEcap,网上找下就有了。

再次感谢

haotaer 发表于 2016-2-24 17:10:41

高手出手那纯属娱乐。只是热心帮忙
页: 1 [2]
查看完整版本: 如何生成图中除弧线以外的元素?