明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: 革天明

如何将多段线按标注分割成多个小多段线?返回值为小多段线的图元名和对标的图元名

  [复制链接]
发表于 2012-10-25 08:54 | 显示全部楼层
好复杂呀,我来个简单点的能不能符合你的要求
(defun c:daduan( / old ss ss1 en pt1 pt2 pt pt-list pts temp lst m n s s1 s2)
  (DEFUN ENT_SSINT (S1 S2 / L1 L2 S3 K E
  (DEFUN SYS_SWAP ($$P1 $$P2 / P)
  (SETQ P (EVAL $$P1))
  (SET (EVAL (quote $$P1)) (EVAL $$P2))
  (SET (EVAL (quote $$P2)) P)
  (PRINC)
  )
  (SETQ L1 (SSLENGTH S1)
        L2 (SSLENGTH S2)
  )
  (IF (> L1 L2)
    (PROGN
      (SYS_SWAP (quote S1) (quote S2))
      (SYS_SWAP (quote L1) (quote L2))
    )
  )
  (SETQ S3 (SSADD)
        K 0
  )
  (REPEAT L1
    (SETQ E (SSNAME S1 K))
    (IF (SSMEMB E S2)
      (SETQ S3 (SSADD E S3))
    )
    (SETQ K (1+ K))
  )
  (IF (= (SSLENGTH S3) 0)
    (SETQ S3 NIL)
  )
  S3
)
  (setq old (getvar "osmode"))
  (setvar "osmode" 0)
    (prompt "\n请选择尺寸对象:")
    (setq ss  (ssget '((0 . "DIMENSION"))))
    (prompt "\n请选择要处理的对象:")
    (setq ss1  (ssget '((0 . "LWPOLYLINE"))) pt-list '())
    (repeat (setq n (sslength ss))
    (setq en (ssname ss (setq n (1- n))))
    (setq pt1 (cdr (assoc 13 (entget en)))
          pt2 (cdr (assoc 14 (entget en)))
          )
      (if (not (member pt1 pt-list)) (setq pt-list (append (list pt1) pt-list)))
      (if (not (member pt2 pt-list)) (setq pt-list (append (list pt2) pt-list)))
      )
    (setq pt-list (vl-sort pt-list '(lambda (x y)
                                 (< (car x) (car y))
                               )))
    (setq pts (list (vlax-curve-getStartPoint (vlax-ename->vla-object (ssname ss1 0)))
                    (vlax-curve-getEndPoint (vlax-ename->vla-object (ssname ss1 0)))))
    (mapcar
      '(lambda(x)
         (command "line" x (polar x (/ pi 2) 10) "")
         (setq temp (entlast))
         (setq pt (vla-intersectwith  (vlax-ename->vla-object temp) (vlax-ename->vla-object (ssname ss1 0)) acExtendThisEntity))
         (setq pt (safearray-value (vlax-variant-value pt)))
         (if (and pt (not (member pt pts))) (setq pts (append (list pt) pts)))
         (command "erase" temp "")
         )
      pt-list)
    (setq pts (vl-sort pts '(lambda (x y)
                                 (< (car x) (car y))
                               )))
    (mapcar '(lambda(x)
    (setq ss2 (ssget "c" x x '((0 . "LWPOLYLINE"))))
               (command "break" (list (ssname ss2 0) x) x "")
               )
            pts)
    (setq n 0 lst '())
    (repeat (1- (length pts))
            (setq s1 (ssget "c" (nth n pts) (nth n pts) '((0 . "LWPOLYLINE"))))
            (setq s2 (ssget "c" (nth (1+ n) pts) (nth (1+ n) pts) '((0 . "LWPOLYLINE"))))
            (setq s (ENT_SSINT s1 s2))
            (repeat (setq m (sslength ss))
              (setq en (ssname ss (setq m (1- m))))
              (setq pt1 (cdr (assoc 13 (entget en)))
                    pt2 (cdr (assoc 14 (entget en)))
              )
              (if (> (car pt1) (car pt2)) (setq pt pt1 pt1 pt2 pt2 pt))
              (if (and (equal (car pt1) (car (nth n pts)) 0.0001) (equal (car pt2) (car (nth (1+ n) pts)) 0.0001))
                (setq lst (append lst (list (list (ssname s 0) en))))
                )
              )
             (setq n (1+ n))
             )
    (setq n 0)
    (mapcar '(lambda(x) (command "chprop" (car x) (cadr x) "" "c" (if (> (setq n (1+ n)) 255) (setq n 1) n) "" "")) lst)
  (setvar "osmode" old)
   lst
    )

点评

另外程序有个括号不匹配,在(DEFUN ENT_SSINT (S1 S2 / L1 L2 S3 K E)这里的最后一个右括号  发表于 2012-10-25 11:51
处理的结果有点错误,但我会学习你的写法的,我的不是多,而是我把草稿一块发上来了,里面有好几个命令而且有些函数是用不上的,所以显得长了些,谢谢你!  发表于 2012-10-25 11:50
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-10 09:22 , Processed in 0.133172 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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