找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 781|回复: 0

[API应用]:向量应用-角均分线

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-3-6 18:00:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×

  1. ;|
  2.    用法:($XDLSP_PolyLine_getSegAt <多义线实体名> <测试点>)
  3.    获得一个*POLYLINE线上指定一点处的“段”的信息。
  4.    对于直线段返回:(顶点索引 "kLine" 起点 终点)
  5.    对于弧线段返回:(顶点索引 "kArc" 起点 凸度 终点)
  6.    所有返回点在UCS下。
  7. |;
  8. (defun $XDLSP_PolyLine_getSegAt        (e        pt     clr    /             cNa
  9.                                  tf        i      nNums  eTyl   eSegData
  10.                                  el        data1  data2  tf1    tf2
  11.                                 )
  12.   (setq cNa (car (xdrx_Object_ClassName e)))
  13.   (if (wcmatch cNa "*POLYLINE")
  14.     (progn
  15.       (setq tf t)
  16.       (if (setq tf (= cNa "POLYLINE"))
  17.         (setq tf  (xdrx_polyline_ConvertFrom e)
  18.               tf2 tf
  19.         )
  20.         (setq tf t)
  21.       )
  22.       (if tf
  23.         (progn
  24.           (setq        nNums (xdrx_polyline_numVerts e)
  25.                 i     -1
  26.           )
  27.           (setq tf1 t)
  28.           (while (and
  29.                    tf1
  30.                    (< i nNums)
  31.                  )
  32.             (if        (xdrx_polyline_onSegAt
  33.                   e
  34.                   (setq i (1+ i))
  35.                   pt
  36.                 )
  37.               (progn
  38.                 (setq eTyl     (xdrx_polyline_segtype e i)
  39.                       eSegData (cond
  40.                                  ((= "kLine" eTyl)
  41.                                   (setq        data1
  42.                                               (xdrx_polyline_getLineSegAt e i)
  43.                                         data2
  44.                                               (xdrx_polyline_getWidthsAt e i)
  45.                                   )
  46.                                   (if (/= clr 0)
  47.                                     (grvecs (cons -1 data1)) ;By eachy
  48.                                     ;|(progn
  49.                                       (apply
  50.                                           'command
  51.                                           (cons ".pline" data1)
  52.                                         )
  53.                                         (command "")
  54.                                         (if
  55.                                           (= "POLYLINE"
  56.                                              (car (xdrx_object_classname
  57.                                                     (entlast)
  58.                                                   )
  59.                                              )
  60.                                           )
  61.                                            (xdrx_polyline_ConvertFrom
  62.                                              (entlast)
  63.                                            )
  64.                                         )
  65.                                         (xdrx_polyline_setConstantWidth
  66.                                           (entlast)
  67.                                           (/
  68.                                             (getvar "viewsize")
  69.                                             64
  70.                                           )
  71.                                         )
  72.                                         (xdrx_entity_setcolor
  73.                                           (entlast)
  74.                                           1
  75.                                         )
  76.                                     );progn|;
  77.                                   )        ;if
  78.                                   (append data1 data2)
  79.                                  )
  80.                                  ((= "kArc")
  81.                                         ; (xdrx_polyline_getArcSegAt e
  82.                                         ; i)
  83.                                   (list        (xdrx_polyline_getpointat e i)
  84.                                         (xdrx_polyline_getBulgeAt e i)
  85.                                         (xdrx_polyline_getpointat
  86.                                           e
  87.                                           (1+ i)
  88.                                         )
  89.                                   )
  90.                                  )
  91.                                )
  92.                       el       (cons i (cons eTyl eSegData))
  93.                       tf1      nil
  94.                 )
  95.               )
  96.             )
  97.           )
  98.         )
  99.       )
  100.       (if tf2
  101.         (xdrx_polyline->2dpolyline e)
  102.       )
  103.     )
  104.   )
  105.   el
  106. )
  107. ;;[API应用]向量应用-角均分线;
  108. ;;根据拾取线的位置等分角
  109. (defun c:XDTB_JF (/ ptin3   $get_entity_point            e1            e2
  110.                     n            m            sp1            ep1            sp2            ep2
  111.                     p1            p2            p3            p4            ang0    ang
  112.                     rang    pt            p0            p00            plst2   plst1
  113.                     PINT    tf pint0
  114.                    )


  115.   ;;点表 L4 是否在三角形 p1p2p3 内
  116.   ;;whether points in list 'l4' inside the triangle(p1 p2 p3).
  117.   (defun ptin3 (l4 p1 p2 p3 / ln tf)
  118.     (setq ln (max (distance p1 p3) (distance p2 p3)))
  119.     (foreach p4        l4
  120.       (cond
  121.         ((<= ln (distance p3 p4)))
  122.         ((inters p1 p2 p3 p4))
  123.         ((equal p3 p4))
  124.         ((inters p1 p2 p3 (polar p3 (angle p3 p4) ln)) (setq tf t))
  125.       )
  126.     )
  127.     tf
  128.   )
  129.   (defun $get_entity_point (str / e pt ptl tf)
  130.     (setq tf T)
  131.     (while tf
  132.       (setq e (xdrx_entsel str '((0 . "LINE,*POLYLINE"))))
  133.       (xdrx_setenttodb (car e))
  134.       (cond
  135.         ((= (xdrx_getentdxf 0) "LINE")
  136.          (setq ptl (list (xdrx_getentdxf 10)
  137.                          (xdrx_getentdxf 11)
  138.                          (cadr (xdrx_getdist (last e) (car e)))
  139.                    )
  140.          )
  141.          (setq tf nil)
  142.         )
  143.         ((and (wcmatch (xdrx_getentdxf 0) "*POLYLINE")
  144.               (/= (cadr ($XDLSP_PolyLine_getSegAt (car e) (last e) 1))
  145.                   "kArc"
  146.               )
  147.          )
  148.          (setq ptl (cddr ($XDLSP_PolyLine_getSegAt (car e) (last e) 1)))
  149.          (setq ptl (list (car ptl)
  150.                          (cadr ptl)
  151.                          (cadr (xdrx_getdist (last e) (car e)))
  152.                    )
  153.          )
  154.          (setq tf nil)
  155.         )
  156.         (T (princ "\n选择实体不符合要求!"))
  157.       )
  158.     )
  159.     ptl
  160.   )
  161.   (xdrx_begin)
  162.   (xdrx_ucson)
  163.   (xdrx_sysvar_push "osmode")
  164.   (setq plst1 ($get_entity_point "\n第一条线: ")) ;点表
  165.   (setq plst2 ($get_entity_point "\n第二条线: ")) ;点表
  166.   (setq n (getint "\n均分份数[3/4/5/6/7/8/9/10]<2>: "))
  167.   (if (or (= n "") (= n nil))
  168.     (setq n 2)
  169.   )
  170.   (setq        sp1 (car plst1)
  171.         ep1 (cadr plst1)
  172.         sp2 (car plst2)
  173.         ep2 (cadr plst2)
  174.   )
  175.   (setq pint (inters sp1 ep1 sp2 ep2 nil))
  176.   (setq pint0 (inters sp1 ep1 sp2 ep2))
  177.   (setq        tf (if pint0
  178.              T
  179.              nil
  180.            )
  181.   )
  182.   (if pint
  183.     (progn
  184.       ;;判断交点位置
  185.       (if tf
  186.         ;;两直线相交
  187.         (progn
  188.           (setq p1 pint p3 pint)
  189.           (if (xdrx_vector_IsCodirectional
  190.                 (mapcar '- sp1 pint)
  191.                 (mapcar '- (last plst1) pint)
  192.               )
  193.             (setq  p2 sp1)
  194.             (setq  p2 ep1)
  195.           )
  196.           (if (xdrx_vector_IsCodirectional
  197.                 (mapcar '- sp2 pint)
  198.                 (mapcar '- (last plst2) pint)
  199.               )
  200.             (setq p4 sp2 )
  201.             (setq p4 ep2 )
  202.           )
  203.         );progn
  204.         ;;交点在延长线上
  205.         (progn
  206.           (if (< (distance pint sp1) (distance pint ep1))
  207.             (setq p1 sp1
  208.                   p2 ep1
  209.             )
  210.             (setq p1 ep1
  211.                   p2 sp1
  212.             )
  213.           )
  214.           (if (< (distance pint sp2) (distance pint ep2))
  215.             (setq p3 sp2
  216.                   p4 ep2
  217.             )
  218.             (setq p3 ep2
  219.                   p4 sp2
  220.             )
  221.           )
  222.         )
  223.       )
  224.       ;;拾取线夹角
  225.       (setq ang        (/ (xdrx_vector_angle
  226.                      (mapcar '- p2 pint)
  227.                      (mapcar '- p4 pint)
  228.                    )
  229.                    n
  230.                 )
  231.       )
  232.       ;;临时点判断顺逆时针角度
  233.       (setq pt (polar pint
  234.                       (+ (angle pint p2) ang)
  235.                       (/ (distance pint p2) 2)
  236.                )
  237.       )
  238.       ;;临时点是否在夹角内
  239.       (if (ptin3 (list pt) pint p2 p4)
  240.         (setq rang ang)
  241.         (setq rang (- ang))
  242.       )
  243.       (setq m 0)
  244.       (repeat (1- n)
  245.         (setq ang0 (+ (angle pint p2) (* (1+ m) rang)))
  246.         (if (> ang0 (* 2 pi))
  247.           (setq ang0 (- ang0 (* pi 2)))
  248.         )
  249.         (setq pt (polar pint ang0 (/ (distance pint p2) 2)))
  250.         (if tf
  251.           (setq p0 p1)
  252.           (setq p0 (inters p1 p3 pint pt nil))
  253.         )
  254.         (setq p00 (inters p2 p4 pint pt nil))
  255.         (xdrx_line1 p0 p00)
  256.         (setq m (1+ m))
  257.       )
  258.     )
  259.   )
  260.   (xdrx_sysvar_pop)
  261.   (xdrx_ucsoff)
  262.   (xdrx_end)
  263.   (princ)
  264. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-20 13:44 , Processed in 0.378097 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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