乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
楼主: rouho

[编程交流] 等距分割多段线

[复制链接]

4

主题

20

帖子

16

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 00:40:04 | 显示全部楼层
M、 R.最后一个lisp很好用
 
 
非常感谢你们两个!
回复

使用道具 举报

4

主题

20

帖子

16

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 00:42:51 | 显示全部楼层
你好,Marko,
 
是否可以自定义lisp,以便在新线段上添加点和顶点。我的意思是在每个插入点下有一个多段线顶点。
 
非常感谢。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-6 00:48:50 | 显示全部楼层
  1. (defun c:divplsegs+vtxs ( / add_vtx trunc clean_poly ss ssh mind i pl ep k j dk dj d n dd m p ptlst )
  2. (vl-load-com)
  3. (defun add_vtx ( obj add_pt ent_name / bulg )
  4.      (vla-addVertex
  5.          obj
  6.          (1+ (fix add_pt))
  7.          (vlax-make-variant
  8.              (vlax-safearray-fill
  9.                  (vlax-make-safearray vlax-vbdouble (cons 0 1))
  10.                      (list
  11.                          (car (trans (vlax-curve-getpointatparam obj add_pt) 0 ent_name))
  12.                          (cadr (trans (vlax-curve-getpointatparam obj add_pt) 0 ent_name))
  13.                      )
  14.              )
  15.          )
  16.      )
  17.      (setq bulg (vla-GetBulge obj (fix add_pt)))
  18.      (vla-SetBulge obj
  19.          (fix add_pt)
  20.          (/
  21.              (sin (/ (* 4 (atan bulg) (- add_pt (fix add_pt))) 4))
  22.              (cos (/ (* 4 (atan bulg) (- add_pt (fix add_pt))) 4))
  23.          )
  24.      )
  25.      (vla-SetBulge obj
  26.          (1+ (fix add_pt))
  27.          (/
  28.              (sin (/ (* 4 (atan bulg) (- (1+ (fix add_pt)) add_pt)) 4))
  29.              (cos (/ (* 4 (atan bulg) (- (1+ (fix add_pt)) add_pt)) 4))
  30.          )
  31.      )
  32.      (vla-update obj)
  33. )
  34. (defun trunc ( expr lst )
  35.    (if (and lst
  36.       (not (equal (car lst) expr))
  37.        )
  38.      (cons (car lst) (trunc expr (cdr lst)))
  39.    )
  40. )
  41. (defun clean_poly ( ent / e_lst p_lst vtx1 vtx2 )
  42.    (setq e_lst (entget ent))
  43.    (cond
  44.      ((= "LWPOLYLINE" (cdr (assoc 0 e_lst)))
  45.       (setq p_lst (vl-remove-if-not
  46.         '(lambda (x)
  47.            (or (= (car x) 10)
  48.          (= (car x) 40)
  49.          (= (car x) 41)
  50.          (= (car x) 42)
  51.            )
  52.          )
  53.         e_lst
  54.       )
  55.       e_lst (vl-remove-if
  56.         '(lambda (x)
  57.            (member x p_lst)
  58.          )
  59.         e_lst
  60.       )
  61.       )
  62.       (if (= 1 (cdr (assoc 70 e_lst)))
  63.         (while (equal (car p_lst) (assoc 10 (reverse p_lst)))
  64.     (setq p_lst (reverse (cdr (member (assoc 10 (reverse p_lst))
  65.               (reverse p_lst)
  66.             )
  67.              )
  68.           )
  69.     )
  70.         )
  71.       )
  72.       (while p_lst
  73.         (setq e_lst (append e_lst (trunc (assoc 10 (cdr p_lst)) p_lst))
  74.         p_lst (member (assoc 10 (cdr p_lst)) (cdr p_lst))
  75.         )
  76.       )
  77.       (entmod e_lst)
  78.      )
  79.      ((and (= "POLYLINE" (cdr (assoc 0 e_lst)))
  80.      (zerop (logand 240 (cdr (assoc 70 e_lst))))
  81.       )
  82.       (setq e_lst (cons e_lst nil)
  83.       vtx1     (entnext ent)
  84.       vtx2     (entnext vtx1)
  85.       )
  86.       (while (= (cdr (assoc 0 (entget vtx1))) "VERTEX")
  87.         (if (= (cdr (assoc 0 (entget vtx2))) "SEQEND")
  88.     (if
  89.       (or (not
  90.       (equal    (assoc 10 (entget vtx1))
  91.        (assoc 10 (last (reverse (cdr (reverse e_lst)))))
  92.       )
  93.           )
  94.           (zerop (logand 1 (cdr (assoc 70 (last e_lst)))))
  95.       )
  96.        (setq e_lst (cons (entget vtx1) e_lst))
  97.     )
  98.     (if
  99.       (not
  100.         (equal (assoc 10 (entget vtx1)) (assoc 10 (entget vtx2)) 1e-9)
  101.       )
  102.        (setq e_lst (cons (entget vtx1) e_lst))
  103.     )
  104.         )
  105.         (setq vtx1 vtx2
  106.         vtx2 (entnext vtx1)
  107.         )
  108.       )
  109.       (setq e_lst (reverse (cons (entget vtx1) e_lst)))
  110.       (entdel ent)
  111.       (mapcar 'entmake e_lst)
  112.      )
  113.      (T (princ "\nEntité non valide."))
  114.    )
  115.    (princ)
  116. )
  117. (prompt "\nSelect 2d polylines...")
  118. (setq ss (ssget "_:L" '((0 . "*POLYLINE") (-4 . "<not") (-4 . "&=") (70 .  (-4 . "not>"))))
  119. (setq ssh (ssadd))
  120. (initget 7)
  121. (setq mind (getdist "\nSpecify min. distance for segments division: "))
  122. (setq i -1)
  123. (while (setq pl (ssname ss (setq i (1+ i))))
  124.    (if (eq (cdr (assoc 0 (entget pl))) "POLYLINE")
  125.      (progn
  126.        (command "_.convertpoly" "_l" pl "")
  127.        (ssadd pl ssh)
  128.      )
  129.    )
  130.    (setq ep (vlax-curve-getendparam pl))
  131.    (setq k -1.0)
  132.    (while (< (setq k (1+ k)) ep)
  133.      (setq j (1+ k))
  134.      (setq dk (vlax-curve-getdistatparam pl k))
  135.      (setq dj (vlax-curve-getdistatparam pl j))
  136.      (setq d (- dj dk))
  137.      (setq n (fix (/ d mind)))
  138.      (if (> n 1)
  139.        (progn
  140.          (setq dd (/ d (float n)))
  141.          (setq m -1.0)
  142.          (repeat n
  143.            (setq p (vlax-curve-getpointatdist pl (+ dk (* dd (setq m (1+ m))))))
  144.            (entmake (list '(0 . "POINT") (cons 10 p)))
  145.            (setq ptlst (cons p ptlst))
  146.          )
  147.        )
  148.        (progn
  149.          (setq p (vlax-curve-getpointatdist pl dk))
  150.          (entmake (list '(0 . "POINT") (cons 10 p)))
  151.          (setq ptlst (cons p ptlst))
  152.        )
  153.      )
  154.    )
  155.    (entmake (list '(0 . "POINT") (cons 10 (vlax-curve-getendpoint pl))))
  156.    (setq ptlst (cons p ptlst))
  157.    (foreach p (reverse ptlst)
  158.      (vl-catch-all-apply 'add_vtx (list (vlax-ename->vla-object pl) (vlax-curve-getparamatpoint pl (vlax-curve-getclosestpointto pl p)) pl))
  159.    )
  160.    (setq ptlst nil)
  161.    (clean_poly pl)
  162. )
  163. (setq i -1)
  164. (while (setq pl (ssname ssh (setq i (1+ i))))
  165.    (command "_.convertpoly" "_h" pl "")
  166. )
  167. (princ)
  168. )
M.R。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-10 21:15 , Processed in 1.221444 second(s), 56 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表