海贼凌源 发表于 2015-8-26 01:28:31

如何生成图中除弧线以外的元素?


程序:
选取p1和p2点后,其他数据都自动生成,新手,不知道mt2和m2的点坐标怎样得
到。求大神给予解答。
;思路
;红色的弧线是本来就有的
;选取p1点和p2点,链接成直线L1
;取直线L1的中点m1做垂线,与弧线的交点m2, m1 m2连线为L2
;选取距p1点200的地方做mt1,做垂线,与弧线交点mt2, mt1 mt2连线为L3
;量取L2和L3长度并显示


另:对于垂线的方向
;我的想法
;比较p1和p2的y值(取大的为MAX小的为MIN)
;若弧线的y值的集合全部大于最小值则垂线向上
;若弧线的y值的集合全部小于最大值则垂线向下
还有什么其他的方法判断垂线的方向吗?

edata 发表于 2015-8-26 08:12:23

已经知道圆弧,那么圆心半径知道,圆心到中点m1的方向就是垂线方向,

ZZXXQQ 发表于 2015-8-26 08:22:05

;先简单写一个。;已知弧画线
(defun c:tt ()
(setvar "CMDECHO" 0)
(setq oldos (getvar "OSMODE"))
(setvar "OSMODE" 1)
(if (and (setq p1 (getpoint "\n选择圆弧一个端点: "))
         (setq p2 (getpoint p1 "\n选择圆弧另一个端点: "))
         (setq ss (ssget "C" p1 p1 '((0 . "ARC"))))) (progn
(setq ent (entget(ssname ss 0))
      pc (cdr(assoc 10 ent))
      r (cdr(assoc 40 ent))
      pm (mapcar '(lambda (a b) (/ (+ a b) 2)) p1 p2)
      p3 (polar p1 (angle p1 p2) 200)
      p4 (polar p1 (angle pc pm) 200)
      p5 (polar pc (angle pc pm) r))
(command "_.LINE" p1 p2 "")
(command "_.RAY" pm p5 "")
(command "_.RAY" p3 p4 "")
))
(setvar "OSMODE" oldos)
(princ)
)

edata 发表于 2015-8-26 16:13:43

(defun c:tt(/ @200 @200_arc_pt @a a ang2 b c cen en end_ang end_pt mid_arc_pt mid_pt rad start_ang start_pt)
(if(and(setq en(car(entsel"\n选择圆弧==>:" )))
       (=(sk_dxf en 0) "ARC"))
    (progn
      (setq cen(sk_dxf en 10)
          start_ang(sk_dxf en 50)
          end_ang(sk_dxf en 51)
          rad(sk_dxf en 40)
          )
      (setq start_pt(polar cen start_ang rad)
          end_pt(polar cen end_ang rad))
      (setq ang2(+ (angle end_pt start_pt   ) (* pi 0.5)))
      (setq mid_pt(mapcar '* '( 0.5 0.5 0.5) (mapcar '+ start_pt end_pt)))
      (setq mid_arc_pt(polar cen ang2 rad))
      (setq @200(polar end_pt (angle end_pt start_pt) 200.0))
      (setq @a(polar @200 (angle mid_pt cen) (distance mid_pt cen)))
      (setq a (distance @a cen)
          c rad
          b (sqrt (abs (- (* c c) (* a a ))))          
          )
      (setq @200_arc_pt (polar @aang2 b))      
      (entmake (list '(0 . "line")(cons 10 start_pt)(cons 11 end_pt)))
      (entmake (list '(0 . "line")(cons 10 mid_pt)(cons 11 mid_arc_pt)))
      (entmake (list '(0 . "line")(cons 10 @200)(cons 11 @200_arc_pt)))                  
      )
    (princ"\n未选择圆弧对象")
    )
(princ)
)
(defun sk_dxf(ent code)(cdr(assoc code(entget ent))))

海贼凌源 发表于 2015-9-4 16:21:12

ZZXXQQ 发表于 2015-8-26 08:22 static/image/common/back.gif
;先简单写一个。

谢谢你的回答,不过实际测试时没有成功。
选择完第二个点,之后的命令效果变为以第二个点为起点,选中的点为方向做出的射线。

海贼凌源 发表于 2015-9-4 16:34:32

edata 发表于 2015-8-26 16:13 static/image/common/back.gif


谢谢你的回答。
虽然不是我想要的选取两个点的方式,但形成的最终效果除了标注外和我想要的一样。
还有 sk_dxf 代表的是什么意思

edata 发表于 2015-9-4 16:56:07

sk_dxf是自定义函数,提取图元的组码值。
你可以直接地理解为 (cdr(assoc code(entget ent)))
因为你提供的已知条件已经满足绘图需求,所以直接选取圆弧来获得弦长的起点和终点比点击两点方便。
当然也可以更改为你的两点方式+选取圆弧,更改
(setq start_pt(polar cen start_ang rad)
            end_pt(polar cen end_ang rad))
(setq   start_ang(sk_dxf en 50)
            end_ang(sk_dxf en 51)            
            )
这几个变量为(getpoint)和(angle censtart_pt) (angle cenend_pt)
具体的你可以自己推敲推敲。
至于标注,这个由你自己完成了。标注涉及到标注样式和标注文字点,这个需要你自己去完善。

waterchen 发表于 2015-9-5 12:54:17

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

楼主看看,是不是想要这样效果的。

(defun c:tt (/
       ang
       c
       data dimsty dimoff dimtxh dimp1 dimp2 dimp3
       ent *error*
       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)) (setq ent (car (nentselp p1))))
    (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-getClosestPointto ent m1 nil)
data (entget ent)
c    (cdr (assoc 10 data))
r    (cdr (assoc 40 data))
mt1(polar p1 ang 200.0)
mt2(polar
         mt1
         (if (> (car (trans (mapcar '- m2 p1) 0 (mapcar '- p2 p1))) 0.0)
   (+ ang (* 0.5 pi))
   (- ang (* 0.5 pi))
   )
         (- (sqrt (- (expt r 2.0) (expt (distance m1 mt1) 2.0))) (distance m1 c))
         )
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 m1 ang dimtxh)
dimp2(polar mt1 ang dimtxh)
dimp3(polar mt2
          (if (> (car (trans (mapcar '- m2 p1) 0 (mapcar '- p2 p1))) 0.0)
      (+ ang (* 0.5 pi))
      (- ang (* 0.5 pi))
      )
          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)))
      )
    )
(setq *error* olderr)
(princ)
)

edata 发表于 2015-9-5 14:10:23

waterchen 发表于 2015-9-5 12:54 static/image/common/back.gif
楼主看看,是不是想要这样效果的。

很不错,如果圆心角大于180的时候,不正确,nentselp不如ssget,否则。。。

waterchen 发表于 2015-9-5 14:19:02

edata 发表于 2015-9-5 14:10 static/image/common/back.gif
很不错,如果圆心角大于180的时候,不正确,nentselp不如ssget,否则。。。

E大,你真细心,没测试过大角度的。
页: [1] 2
查看完整版本: 如何生成图中除弧线以外的元素?