明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 792|回复: 4

[讨论] 请问修剪内部比外部慢几十甚至百倍。不知道什么问题

[复制链接]
发表于 2018-7-26 21:10 | 显示全部楼层 |阅读模式
很多line或pline,两端通过矩形a.矩形a内部修剪很慢,外部修剪很快,其他地方不变,只是偏移一个图形选内,外,那里变化一下,其他代码均不变,速度相差,上百倍,几千条线实验,
  1. (defun pts (SS0 / elist n ptlist) ;端点列表
  2.   (setq ptlist nil)
  3.   (setq elist (entget SS0))
  4.   (foreach n elist
  5.     (if  (or (= 10 (car n)) (= 11 (car n))) ;同时处理PLINE和 LINE
  6.       (setq ptlist (cons (cdr n) ptlist))
  7.     )
  8.   )
  9.   (setq ptlist (reverse ptlist))
  10.   
  11. )

  12. (defun trim
  13.        (na / las obj os ptlist sss x)
  14.   
  15.   (setq os (getvar "osmode"))
  16.   (setvar "osmode" 0)
  17.   (setq Obj (vlax-ename->vla-object na))

  18.       (
  19.        vla-offset obj
  20.   ;-0.3
  21.   0.3   ;这里内外偏移防误选

  22.   )
  23.       

  24.       (setq las (entlast))
  25.       (setq ptlist(pts las))
  26.       (entdel las)
  27.       (command "ZOOM" "o" na "")
  28.    
  29.       ;;------------------------------------------------------
  30.       (repeat 2
  31.   (command "regen" "")
  32.   (if (SETQ
  33.         SSS (SSGET "f"
  34.        ptlist
  35.        '((0 . "LWPOLYLINE,LINE,ARC,CIRCLE,ELLIPSE,hatch"))
  36.       )
  37.       )
  38.     (progn (command ".trim" na "" "f")
  39.      (foreach x ptlist (command x))
  40.      (command "" "")
  41.     ) ;progn
  42.   )
  43.       ) ;repeat
  44.       ;;------------------------------------------------------
  45.       (command "zoom" "p")
  46.   
  47. ;;;;;;;;;;
  48.   (setvar "osmode" os)
  49. )

  50.    
  51. (defun c:tt ( / d end-time h m na s start-time ts) ;修剪内部比外部慢几十甚至百倍。不知道什么问题
  52.   (setq na (car (entsel "\n pick")))

  53. (setq start-time (* 86400 (getvar "tdusrtimer")))
  54.   (trim na)
  55.   (if start-time
  56.     (progn
  57.       (setq end-time (* 86400 (getvar "tdusrtimer"))
  58.      ts (- end-time start-time)
  59.      d (rtos (fix (/ ts 86400.0)) 2 0)
  60.      ts (rem ts 86400)
  61.      h (rtos (fix (/ ts 3600.0)) 2 0)
  62.      ts (rem ts 3600)
  63.      m (rtos (fix (/ ts 60.0)) 2 0)
  64.      ts (rem ts 60)
  65.      s (rtos ts 2 2)
  66.       )
  67.       (if (> (distof d) 0)
  68. (princ (strcat "\n用时 : " d "天" h "小时" m "分" s "秒"))
  69. (if (> (distof h) 0)
  70.    (princ (strcat "\n用时 : " h "小时" m "分" s "秒"))
  71.    (if (> (distof m) 0)
  72.      (princ (strcat "\n用时 : " m "分" s "秒"))
  73.      (princ (strcat "\n用时 : " s "秒"))
  74.    )
  75. )
  76.       )
  77.     )
  78.   )
  79. )

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2018-7-27 08:12 | 显示全部楼层
不要用 command  ,自己想一下算法 就可以解决 的, 提供思路,先求交点,采用几何算法 交点打断,然后重绘,速度 很快 的

点评

你是指用break命令吗?据我所知VBA没有break和trim等函数。  发表于 2018-7-27 09:32
 楼主| 发表于 2018-7-27 08:33 | 显示全部楼层
pengfei2010 发表于 2018-7-27 08:12
不要用 command  ,自己想一下算法 就可以解决 的, 提供思路,先求交点,采用几何算法 交点打断,然后重绘 ...

谢谢,我也是这么考虑的.就是不明白修剪内部为什么慢上百倍,外部快得很。
 楼主| 发表于 2018-7-27 11:28 | 显示全部楼层
本帖最后由 434939575 于 2018-7-27 11:31 编辑

如果包含circle,spl,el,arc这种计算可能比较繁琐,我想法把修剪边界中间打断为2部分,要修剪部分复制一份,做两次修剪,因为只一个交点的修剪万个都是秒杀,这样也很快了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 15:47 , Processed in 0.245476 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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