乐筑天下

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

[编程交流] 用draworder过度杀戮,只是

[复制链接]

76

主题

312

帖子

254

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
390
发表于 2022-7-5 15:39:13 | 显示全部楼层 |阅读模式
大家好,
 
我正在寻找一些“简单”的代码,根据draworder删除重复的直线和圆弧。我需要该程序始终保持'上'行和删除重复。常规的过度杀戮并不奏效,因为复制品位于不同的层上。
 
目前,我使用下面的代码,但过程需要很长时间,我希望能找到下面代码的更“简单”的版本。
 
我希望有人能帮我解决这个问题。。。
  1. (defun KGA_Block_DrawOrder (blkObj / sortArr sortTblObj)
  2. (if
  3.    (and
  4.      (= :vlax-true (vla-get-hasextensiondictionary blkObj))
  5.      (setq sortTblObj (KGA_Sys_Apply 'vla-item (list (KGA_Data_ObjectExtDictGet blkObj) "ACAD_SORTENTS")))
  6.    )
  7.    (progn
  8.      (vla-getfulldraworder sortTblObj 'sortArr :vlax-false)
  9.      (mapcar 'vlax-variant-value (vlax-safearray->list sortArr)) ; Last is the top of the draworder.
  10.    )
  11. )
  12. )
  13. (defun KGA_Conv_Pickset_To_ObjectList (ss / i ret)
  14. (if ss
  15.    (repeat (setq i (sslength ss))
  16.      (setq ret (cons (vlax-ename->vla-object (ssname ss (setq i (1- i)))) ret))
  17.    )
  18. )
  19. )
  20. (defun KGA_Data_ObjectExtDictGet (object)
  21. (if (= :vlax-true (vla-get-hasextensiondictionary object))
  22.    (vla-getextensiondictionary object)
  23. )
  24. )
  25. ; Make a zero based list of integers.
  26. ; With speed improvement based on Reini Urban's (std-%setnth).
  27. ; (KGA_List_IndexSeqMakeLength 7) => (0 1 2 3 4 5 6)
  28. (defun KGA_List_IndexSeqMakeLength (len / ret)
  29. (repeat (rem len 4)
  30.    (setq ret (cons (setq len (1- len)) ret))
  31. )
  32. (repeat (/ len 4)
  33.    (setq ret
  34.      (vl-list*
  35.        (- len 4)
  36.        (- len 3)
  37.        (- len 2)
  38.        (- len 1)
  39.        ret
  40.      )
  41.    )
  42.    (setq len (- len 4))
  43. )
  44. ret
  45. )
  46. (defun KGA_Sys_Apply (expr varLst / ret)
  47. (if (not (vl-catch-all-error-p (setq ret (vl-catch-all-apply expr varLst))))
  48.    ret
  49. )
  50. )
  51. (defun KGA_Sys_ObjectOwner (obj)
  52. (vla-objectidtoobject (vla-get-database obj) (vla-get-ownerid obj))
  53. )
  54. (defun BKG_OverkillEqual  (ss seg fuzz
  55.                            / N_Equal_P N_EqualPoints_P N_PointList
  56.                              curveALst datLst delA_P idxLst n ordLst ptsLst
  57.                          )
  58. (defun N_Equal_P (curveALst curveBLst) ; Format of lists: (staPt endPt objNme obj).
  59.    (cond
  60.      (
  61.        (and
  62.          (equal (car curveALst) (car curveBLst) fuzz)   ; Sta = Sta.
  63.          (equal (cadr curveALst) (cadr curveBLst) fuzz) ; End = End.
  64.        )
  65.        (if (= "AcDbLine" (caddr curveALst) (caddr curveBLst))
  66.          T
  67.          (N_EqualPoints_P (cadddr curveALst) (cadddr curveBLst) nil)
  68.        )
  69.      )
  70.      (
  71.        (and
  72.          (equal (car curveALst) (cadr curveBLst) fuzz)  ; Sta = End.
  73.          (equal (cadr curveALst) (car curveBLst) fuzz)  ; End = Sta.
  74.        )
  75.        (if (= "AcDbLine" (caddr curveALst) (caddr curveBLst))
  76.          T
  77.          (N_EqualPoints_P (cadddr curveALst) (cadddr curveBLst) T)
  78.        )
  79.      )
  80.    )
  81. )
  82. (defun N_EqualPoints_P (objA objB revB_P / ptsA ptsB)
  83.    (setq ptsA (cond ((cadr (assoc objA ptsLst))) ((N_PointList objA))))
  84.    (setq ptsB (cond ((cadr (assoc objB ptsLst))) ((N_PointList objB))))
  85.    (if revB_P
  86.      (equal ptsA (reverse ptsB) fuzz)
  87.      (equal ptsA ptsB fuzz)
  88.    )
  89. )
  90. (defun N_PointList (obj / pts size) ; Output does not include start and end point.
  91.    (setq size (/ (vlax-curve-getdistatparam obj (vlax-curve-getendparam obj)) seg))
  92.    (setq pts
  93.      (mapcar
  94.        '(lambda (idx) (vlax-curve-getpointatdist obj (* idx size)))
  95.        idxLst
  96.      )
  97.    )
  98.    (setq ptsLst (cons (list obj pts) ptsLst))
  99.    pts
  100. )
  101. (setq idxLst (cdr (KGA_List_IndexSeqMakeLength seg))) ; Used by N_PointList.
  102. ;; For "_X" and "_A" sets the last created object is the first in datLst.
  103. ;; This is the top of the draworder if ordLst is nil.
  104. (setq datLst (KGA_Conv_Pickset_To_ObjectList ss))
  105. (setq ordLst (reverse (KGA_Block_DrawOrder (KGA_Sys_ObjectOwner (car datLst))))) ; First is the top of the draworder.
  106. (setq datLst
  107.    (vl-remove
  108.      nil
  109.      (mapcar
  110.        '(lambda (obj / onm)
  111.          (if
  112.            (and
  113.              (vlax-write-enabled-p obj)
  114.              (vl-position
  115.                (setq onm (vla-get-objectname obj))
  116.                '("AcDb2dPolyline" "AcDbArc" "AcDbCircle" "AcDbEllipse" "AcDbLine" "AcDbPolyline" "AcDbSpline")
  117.              )
  118.            )
  119.            (list
  120.              (vlax-curve-getstartpoint obj)
  121.              (vlax-curve-getendpoint obj)
  122.              onm
  123.              obj
  124.            )
  125.          )
  126.        )
  127.        datLst
  128.      )
  129.    )
  130. )
  131. (setq n 0)
  132. (while (cadr datLst)
  133.    (setq delA_P nil)
  134.    (setq curveALst (car datLst))
  135.    (foreach curveBLst (setq datLst (cdr datLst))
  136.      (if (N_Equal_P curveALst curveBLst)
  137.        (if
  138.          (or
  139.            (not ordLst)
  140.            (< (vl-position (cadddr curveALst) ordLst) (vl-position (cadddr curveBLst) ordLst))
  141.          )
  142.          (progn
  143.            (setq datLst (vl-remove curveBLst datLst))
  144.            (vla-delete (cadddr curveBLst))
  145.            (setq n (1+ n))
  146.          )
  147.          (setq delA_P T) ; Don't delete curve A just yet.
  148.        )
  149.      )
  150.    )
  151.    (if delA_P
  152.      (progn
  153.        (vla-delete (cadddr curveALst))
  154.        (setq n (1+ n))
  155.      )
  156.    )
  157. )
  158. n ; Return total deleted entities.
  159. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 21:09 , Processed in 0.665515 second(s), 54 queries .

© 2020-2025 乐筑天下

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