找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 431|回复: 1

[每日一码] 指定间距等分凸凹多边形(草稿)

[复制链接]

已领礼包: 201个

财富等级: 日进斗金

发表于 2020-12-23 15:05:30 | 显示全部楼层 |阅读模式

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

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

×
  1. (defun dblk (pts1 /) ;点表创建闭合多段线
  2.   (entmake (append
  3.              (list
  4.                '(0 . "LWPOLYLINE")
  5.                '(100 . "AcDbEntity")
  6.                '(8 . "板轮廓线")
  7.                '(70 . 1)
  8.                '(100 . "AcDbPolyline")
  9.                 (cons 90 (length pts1)))
  10.                 (mapcar '(lambda (pt) (cons 10 pt)) pts1))
  11.   )
  12. )
  13. (defun sortxy (pts2 Tol / pt1 pt2) ;点表XY排序函数
  14.   (vl-sort pts2 '(lambda (pt1 pt2)
  15.                   (if (equal (cadr pt1) (cadr pt2) tol)
  16.                     (if (equal (car pt1) (car pt2) tol)
  17.                       (< (caddr pt1) (caddr pt2))
  18.                       (< (car pt1) (car pt2))
  19.                     )
  20.                     (< (cadr pt1) (cadr pt2))
  21.                   )
  22.                 )
  23.   )
  24. )
  25. (defun getarea (pts3 / pts1 iSum p0 p1 p2 x0 x1 x2 y0 y1 y2)
  26. (setq pts1 pts3)
  27. (setq iSum 0)
  28. (setq p0 (car pts3)
  29. x0 (car  p0)
  30. y0 (cadr p0)
  31. )
  32. (while (cdr pts1)
  33.    (setq p1 (car pts1)
  34.    x1 (car p1)
  35.    y1 (cadr p1)
  36.    p2 (cadr pts1)
  37.    y2 (cadr p2)
  38.    x2 (car p2)
  39.    iSum (+ iSum (- (* x1 y2) (* x2 y1)))
  40.    pts1 (cdr pts1)
  41.    )
  42. )
  43. (/ (+ iSum (- (* (caar pts1) y0)  (* x0 (cadar pts1)))) 2.0)
  44. )
  45. (defun Sortnn (pts e / acaddocument acadobject e1 mspace  obj objname x y)
  46.   (vl-load-com)
  47.   (defun AddPline (space lst / x)

  48.     (if (> (length lst) 2)
  49.        (vlax-invoke space  'AddLightWeightPolyline (apply
  50.                                                  'append
  51.                                                  (mapcar
  52.                                                    '(lambda (x)
  53.                                                       (list (float (car x)) ; _此处应为Double, INT会Fail
  54.                                                             (float (cadr x))
  55.                                                       )
  56.                                                     )
  57.                                                    lst
  58.                                                  )
  59.                                                )
  60.         )
  61.         (progn
  62.           (vla-AddXLine space (vlax-3d-point (car lst))(vlax-3d-point (cadr lst)))
  63.         )
  64.     )
  65.   )
  66.   (cond
  67.     ((and
  68.        (= (type e) 'ENAME)
  69.        (setq objname (cdr (assoc 0 (entget e))))
  70.        (wcmatch (strcase objname) "*LINE,*CIRCLE,*ARC,*ELLIPSE")
  71.      )
  72.       (setq pts1 (mapcar
  73.                    'cdr
  74.                    (vl-sort (mapcar
  75.                               '(lambda (x)
  76.                                  (cons (vlax-curve-getParamAtPoint e (vlax-curve-getClosestPointTo e x t)) x)
  77.                                )
  78.                               pts
  79.                             ) '(lambda (x y)
  80.                                  (< (car x) (car y))
  81.                                )
  82.                    )
  83.                  )
  84.       )
  85.     )
  86.     ((and (= (type e) 'LIST)
  87.           (> (length e) 1)
  88.      )
  89.       (setq AcadObject (vlax-get-acad-object)
  90.             AcadDocument (vla-get-ActiveDocument AcadObject)
  91.             mSpace (vla-get-ModelSpace AcadDocument)
  92.       )
  93.       (addpline mspace e)
  94.       (vlax-release-object mSpace)
  95.       (vlax-release-object AcadDocument)
  96.       (vlax-release-object AcadObject)
  97.       (setq e1 (entlast))
  98.       (setq pts1 (Pnts-Sort-Cruve pts e1))
  99.       (entdel e1)
  100.     )
  101.   )
  102.   pts1
  103. )
  104. (defun sortonpl (pl pts7)
  105.   (setq pts7 (mapcar
  106.        '(lambda (x)
  107.    (list (vlax-curve-getdistatpoint
  108.     pl
  109.     (vlax-curve-getclosestpointto pl x)
  110.          )
  111.          x
  112.    )
  113.         )
  114.        pts7
  115.      )
  116. pts7 (vl-sort pts7
  117.        '(lambda (e1 e2)
  118.    (< (car e1) (car e2))
  119.         )
  120.      )
  121.   )
  122.   (list pl
  123. (mapcar
  124.    'cadr
  125.    pts
  126. )
  127.   )
  128. )
  129. (defun ptjd (pts5 pts6  / i j ii jj pt1 pt2 pt3 pt4 intpt interpt) ;交点坐标计算函数
  130.    (setq ii (1- (length pts5)))
  131.    (setq jj (1- (length pts6)))
  132.    (setq intpt nil interpt nil i 0 )
  133.    (while (< i ii)
  134.      (setq pt1 (nth i pts5))
  135.      (setq pt2 (nth (1+ i) pts5))
  136.      (setq j 0)
  137.      (while (< j jj)
  138.        (setq pt3 (nth j pts6))
  139.        (setq pt4 (nth (1+ j) pts6))
  140.        (setq intpt (inters pt1 pt2 pt3 pt4 t) )
  141.        (if (/= intpt nil)
  142.            ;将交点坐标存入点表
  143.            (setq interpt (append interpt (list intpt)))
  144.        )
  145.        (setq j (1+ j))
  146.      )
  147.      (setq i (1+ i))
  148.    )
  149. interpt
  150. )              
  151. (defun pntisin (pnt1 pnts1  / pts0 pts1 an ptn total);判断点在线内
  152. (setq pts1
  153.   (if (not (equal (car pnts1) (last pnts1) 1e-5))
  154.    (reverse (cons (car pnts1) (reverse pnts1))) ;点表闭合
  155.    pnts1
  156. )
  157.    pts0   (mapcar 'list pts1 (cdr pts1));首尾组对
  158.    total 0
  159.       )
  160.   (mapcar
  161.     '(lambda (x)
  162.        (setq an (- (angle pnt1 (car x)) (angle pnt1 (cadr x))))   
  163.        (cond
  164.          ((> an pi)
  165.            (setq an (- an pi))
  166.          )
  167.          ((< an (* -1 pi))
  168.            (setq an (+ an pi))
  169.          )
  170.        )
  171.        (setq total (+ total an))
  172.      )
  173.     pts0
  174.   )
  175.   (if (equal (- (abs total) pi) 0.0 1e-5)
  176.     t
  177.     nil
  178.   )
  179. )
  180. (defun pntison (pnt2 pnts2  / pts0 pts1 xca xcb xa xb i gg p1 p3);判断点在线上
  181.   (setq pts1
  182.   (if (not (equal (car pnts2) (last pnts2) 1e-5))
  183.    (reverse (cons (car pnts2) (reverse pnts2)))    ;点表闭合
  184.    pnts2
  185. ))
  186.    (setq pts0   (mapcar 'list pts1 (cdr pts1));首尾组对
  187.       )
  188. (setq xca
  189.   (mapcar
  190.     '(lambda (x)
  191.        (mapcar '- pnt2 (car x))
  192.        )
  193.     pts0
  194.     ))
  195. (setq xcb
  196.   (mapcar
  197.     '(lambda (x)
  198.        (mapcar '- (cadr x) (car x))
  199.        )
  200.     pts0
  201.     ))
  202.   (setq i 0)
  203.   (repeat (length xca)
  204.     (setq xa (nth i xca)
  205.           xb (nth i xcb)
  206.           xx (- (* (car xa) (cadr xb)) (* (car xb) (cadr xa)))
  207.           p1 (apply 'mapcar (cons 'min (nth i pts0)))
  208.           p3 (apply 'mapcar (cons 'max (nth i pts0)))
  209.           i (1+ i)
  210.           )
  211.   (if (and
  212.           (equal xx 0 1e-5)
  213.           (AND
  214.           (or
  215.           (< (CAR P1) (CAR pnt2) (CAR P3))
  216.           (equal (CAR P1) (CAR pnt2) 1e-5)
  217.           (equal (CAR P3) (CAR pnt2) 1e-5)
  218.           )
  219.           (or
  220.           (< (CADR P1) (CADR pnt2) (CADR P3))
  221.           (equal (CADR P1) (CADR pnt2) 1e-5)
  222.           (equal (CADR P3) (CADR pnt2) 1e-5)
  223.           )
  224.           )
  225.         )
  226.       (setq gg (cons xx gg))
  227.     )
  228.     )
  229.   (vl-some '(lambda (x)
  230.                    (equal x 0 1e-5))
  231.                 gg)
  232.     )
  233. (defun c:sqdb () ;获取程序  
  234.   (setq ss1 (ssget '(
  235.              (-4 . "<AND")
  236.              (0 . "LWPOLYLINE")
  237.              (8 . "板轮廓线")
  238.              (-4 . "AND>")
  239.             )
  240.                    )
  241.         )
  242.   (setq i -1)
  243.   (repeat (sslength ss1)
  244.     (setq tybs (cons (ssname ss1 (setq i (1+ i))) tybs))
  245.   )
  246.   (setq tybs (reverse tybs)
  247.         n      0
  248.         )
  249. (repeat (setq shs (sslength ss1))
  250.   (setq mod0 (vl-remove nil (mapcar  '(lambda (x) (if (= (car x) 10) (cdr x))) (entget (setq yy (nth n tybs))))))
  251.   (if (/= (setq ang1 (/ (* (angle (car mod0) (cadr mod0)) 180) pi)) 0)
  252.       (progn
  253.       (setq strpt (car mod0) ;旋转点坐标
  254.             bty  (ssadd) ;板选择集
  255.             )
  256.       (command "_.rotate" (nth n tybs) "" strpt  (- 360 ang1))
  257.       (setq mod0 (vl-remove nil (mapcar  '(lambda (x) (if (= (car x) 10) (cdr x))) (entget (setq yy (nth n tybs))))))
  258.       ));旋转判断函数,若不为正交则旋转
  259.         (setq
  260.         ptmin (apply 'mapcar (cons 'min mod0)) ;;;拾取点表最小坐标值
  261.         ptmax (apply 'mapcar (cons 'max mod0)) ;;;拾取点表最大坐标值
  262.         dxy (mapcar '- ptmax ptmin)
  263.         n (1+ n)
  264.         )     
  265.   (if (> (cadr dxy) (car dxy))
  266.     (progn
  267.       (setq dfs (getint "\n请输入等分数: ")
  268.             bfk (getreal "\n请输入板缝宽: ")
  269.             lbk (/ (- (cadr dxy) (* bfk (1- dfs))) dfs)
  270.             pt1 ptmin
  271.             pt2 (list (car ptmax) (cadr ptmin))
  272.             pt3 (list (car ptmax) (+ (cadr ptmin) lbk))
  273.             pt4 (list (car ptmin) (+ (cadr ptmin) lbk))
  274.             dbd (list pt1 pt2 pt3 pt4 pt1)
  275.             )
  276.       (repeat dfs
  277.       (setq db1 (append        (ptjd dbd (reverse (cons (car mod0) (reverse mod0)))) (vl-remove-if '(lambda(x)
  278.                                                              (not (or
  279.                                                                (pntison x dbd)
  280.                                                                (pntisin x dbd)
  281.                                                                ))) mod0)
  282.                         )
  283.             db1 (XD::List:RemoveDup db1)
  284.             db1 (XD::PntS:MinX->MinY db1 1e-5)
  285.             db1 (sortnn db1 yy)
  286.             dbd (mapcar '(lambda(x)
  287.                            (list (car x) (+ (cadr x) lbk bfk))) dbd)
  288.             )
  289.         (xdrx_polyline_make  db1 t)
  290.         (ssadd (entlast) bty)
  291.         )
  292.       (command "_.rotate" bty "" strpt  ang1)
  293.       )
  294.     )
  295.   )
  296.       )


连着学带做,30多岁了还有这种毅力,做出来现在这些代码还真有成就感,不得不佩服代码这东西,越写越着魔
首先还是得感谢Lispboy的点表沿实体排序函数,搜刮好久,一直没有找到合适的函数
其次得感谢 newer marting版主 在我提问时给我的解答
子函数 基本都是参考了XDAPI为了便于学习码的,有需要的同僚可以直接用API
主程序还缺少另一个方向的分割,但至少Y方向和非正交问题可以解决了
工夫不负有心人哪,代码优化完成后我会贴上来,各位大神可以先看看可以优化的程序结构
主程序完成时,我想定义两种等分模式,固定间距等分和模数化等分,有建议也可以指点指点

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 201个

财富等级: 日进斗金

 楼主| 发表于 2021-1-2 01:05:57 | 显示全部楼层
没有人指点一下嘛
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-27 10:42 , Processed in 0.231264 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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