明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1532|回复: 16

[已解答] 如何生成图中除弧线以外的元素?

[复制链接]
发表于 2015-8-26 01:28 | 显示全部楼层 |阅读模式

程序:
选取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值的集合全部小于最大值则垂线向下
还有什么其他的方法判断垂线的方向吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2015-8-26 08:12 来自手机 | 显示全部楼层
已经知道圆弧,那么圆心半径知道,圆心到中点m1的方向就是垂线方向,
发表于 2015-8-26 08:22 | 显示全部楼层
;先简单写一个。
  1. ;已知弧画线
  2. (defun c:tt ()
  3. (setvar "CMDECHO" 0)
  4. (setq oldos (getvar "OSMODE"))
  5. (setvar "OSMODE" 1)
  6. (if (and (setq p1 (getpoint "\n选择圆弧一个端点: "))
  7.          (setq p2 (getpoint p1 "\n选择圆弧另一个端点: "))
  8.          (setq ss (ssget "C" p1 p1 '((0 . "ARC"))))) (progn
  9.   (setq ent (entget(ssname ss 0))
  10.         pc (cdr(assoc 10 ent))
  11.         r (cdr(assoc 40 ent))
  12.         pm (mapcar '(lambda (a b) (/ (+ a b) 2)) p1 p2)
  13.         p3 (polar p1 (angle p1 p2) 200)
  14.         p4 (polar p1 (angle pc pm) 200)
  15.         p5 (polar pc (angle pc pm) r))
  16.   (command "_.LINE" p1 p2 "")
  17.   (command "_.RAY" pm p5 "")
  18.   (command "_.RAY" p3 p4 "")
  19. ))
  20. (setvar "OSMODE" oldos)
  21. (princ)
  22. )
发表于 2015-8-26 16:13 | 显示全部楼层
  1. (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)
  2.   (if(and(setq en(car(entsel"\n选择圆弧==>:" )))
  3.          (=(sk_dxf en 0) "ARC"))
  4.     (progn
  5.       (setq cen(sk_dxf en 10)
  6.             start_ang(sk_dxf en 50)
  7.             end_ang(sk_dxf en 51)
  8.             rad(sk_dxf en 40)
  9.             )
  10.       (setq start_pt(polar cen start_ang rad)
  11.             end_pt(polar cen end_ang rad))
  12.       (setq ang2(+ (angle end_pt start_pt   ) (* pi 0.5)))
  13.       (setq mid_pt(mapcar '* '( 0.5 0.5 0.5) (mapcar '+ start_pt end_pt)))
  14.       (setq mid_arc_pt(polar cen ang2 rad))
  15.       (setq @200(polar end_pt (angle end_pt start_pt) 200.0))
  16.       (setq @a(polar @200 (angle mid_pt cen) (distance mid_pt cen)))
  17.       (setq a (distance @a cen)
  18.             c rad
  19.             b (sqrt (abs (- (* c c) (* a a ))))            
  20.             )
  21.       (setq @200_arc_pt (polar @a  ang2 b))      
  22.       (entmake (list '(0 . "line")(cons 10 start_pt)(cons 11 end_pt)))
  23.       (entmake (list '(0 . "line")(cons 10 mid_pt)(cons 11 mid_arc_pt)))
  24.       (entmake (list '(0 . "line")(cons 10 @200)(cons 11 @200_arc_pt)))                  
  25.       )
  26.     (princ"\n未选择圆弧对象")
  27.     )
  28.   (princ)
  29.   )
  30. (defun sk_dxf(ent code)(cdr(assoc code(entget ent))))

 楼主| 发表于 2015-9-4 16:21 | 显示全部楼层
ZZXXQQ 发表于 2015-8-26 08:22
;先简单写一个。

谢谢你的回答,不过实际测试时没有成功。
选择完第二个点,之后的命令效果变为以第二个点为起点,选中的点为方向做出的射线。
 楼主| 发表于 2015-9-4 16:34 | 显示全部楼层
edata 发表于 2015-8-26 16:13

谢谢你的回答。
虽然不是我想要的选取两个点的方式,但形成的最终效果除了标注外和我想要的一样。
还有 sk_dxf 代表的是什么意思
发表于 2015-9-4 16:56 | 显示全部楼层
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 cen  start_pt) (angle cen  end_pt)
具体的你可以自己推敲推敲。
至于标注,这个由你自己完成了。标注涉及到标注样式和标注文字点,这个需要你自己去完善。
发表于 2015-9-5 12:54 | 显示全部楼层
本帖最后由 waterchen 于 2015-9-5 14:14 编辑

  楼主看看,是不是想要这样效果的。
  1. (defun c:tt (/
  2.        ang
  3.        c
  4.        data dimsty dimoff dimtxh dimp1 dimp2 dimp3
  5.        ent *error*
  6.        olderr
  7.        m1 m2 mt1 mt2
  8.        p1 p2
  9.        r
  10.        )
  11.   (defun *error* (msg)
  12.     (princ (strcat "\nError: " msg))
  13.     (if (= 8 (logand 8 (getvar 'UNDOCTL)))
  14.       (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  15.       )
  16.     (setq *error* olderr)
  17.     (princ)
  18.     )
  19.   
  20.   (defun make_Dim (p1 p2 p3 ang /)
  21.     (entmakex
  22.       (list
  23.   '(0 . "DIMENSION")
  24.   '(100 . "AcDbEntity")
  25.   '(100 . "AcDbDimension")
  26.   (cons 10 p3)
  27.   '(11 0. 0. 0.)
  28.   '(70 . 32)
  29.   '(100 . "AcDbAlignedDimension")
  30.   (cons 13 p1)
  31.   (cons 14 p2)
  32.   (cons 50 ang)
  33.   '(100 . "AcDbRotatedDimension")
  34.   )
  35.       )
  36.     )
  37.   
  38.   (defun make_line (p1 p2)
  39.     (entmakex (list '(0 . "LINE")
  40.        '(100 . "AcDbEntity")
  41.        '(100 . "AcDbLine")
  42.        (cons 10 p1)
  43.        (cons 11 p2)
  44.        '(210 0. 0. 1.)
  45.        )
  46.        )
  47.     )
  48.   ;;;**************************main program**************************;;;
  49.   (setq olderr *error*)
  50.   (setq  p1 (getpoint    "\nFirst point:"))
  51.   (initget (+ 32 128))
  52.   (setq  p2 (getpoint p1 "\nSecond point:"))
  53.   (if (and (= 'LIST (type p1)) (= 'LIST (type p2)) (setq ent (car (nentselp p1))))
  54.     (progn
  55.       (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  56.       (setq
  57.   ang  (angle p1 p2)
  58.   m1   (polar p1 ang (* 0.5 (distance p1 p2)))
  59.   m2   (vlax-curve-getClosestPointto ent m1 nil)
  60.   data (entget ent)
  61.   c    (cdr (assoc 10 data))
  62.   r    (cdr (assoc 40 data))
  63.   mt1  (polar p1 ang 200.0)
  64.   mt2  (polar
  65.          mt1
  66.          (if (> (car (trans (mapcar '- m2 p1) 0 (mapcar '- p2 p1))) 0.0)
  67.      (+ ang (* 0.5 pi))
  68.      (- ang (* 0.5 pi))
  69.      )
  70.          (- (sqrt (- (expt r 2.0) (expt (distance m1 mt1) 2.0))) (distance m1 c))
  71.          )
  72.   dimsty (tblsearch "Dimstyle" (getvar "dimstyle"))
  73.   dimoff (* (cdr (assoc 40 dimsty)) (cdr (assoc 147 dimsty)))
  74.   dimtxh (* (cdr (assoc 40 dimsty)) (cdr (assoc 140 dimsty)))
  75.   dimtxh (+ dimoff (* 3.0 dimtxh))
  76.   dimp1  (polar m1 ang dimtxh)
  77.   dimp2  (polar mt1 ang dimtxh)
  78.   dimp3  (polar mt2
  79.           (if (> (car (trans (mapcar '- m2 p1) 0 (mapcar '- p2 p1))) 0.0)
  80.       (+ ang (* 0.5 pi))
  81.       (- ang (* 0.5 pi))
  82.       )
  83.           dimtxh
  84.           )
  85.   )
  86.       (make_line p1  p2)
  87.       (make_line m1  m2)
  88.       (make_line mt1 mt2)
  89.       (make_Dim m1  m2  dimp1 (angle m1  m2))
  90.       (make_Dim mt1 mt2 dimp2 (angle mt1 mt2))
  91.       (make_Dim p1  mt2 dimp3 (angle p1  mt1))
  92.       (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  93.       )
  94.     )
  95.   (setq *error* olderr)
  96.   (princ)
  97.   )

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2015-9-5 14:10 | 显示全部楼层
waterchen 发表于 2015-9-5 12:54
楼主看看,是不是想要这样效果的。

很不错,如果圆心角大于180的时候,不正确,nentselp不如ssget,否则。。。
发表于 2015-9-5 14:19 | 显示全部楼层
edata 发表于 2015-9-5 14:10
很不错,如果圆心角大于180的时候,不正确,nentselp不如ssget,否则。。。

E大,你真细心,没测试过大角度的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-20 23:54 , Processed in 0.177022 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表