明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 742|回复: 8

[讨论] 碰到个奇怪的问题

[复制链接]
发表于 2024-8-7 10:33:46 | 显示全部楼层 |阅读模式
本帖最后由 紫苏炒黄瓜 于 2024-8-7 11:16 编辑

(defun 获取图元小大点 (name / minp maxp)
        (Vlax-Invoke-Method (Vlax-Ename->Vla-Object name) 'GetBoundingBox 'minp 'maxp)
        (mapcar 'vlax-safearray->list (list minp maxp))
)
(setq pt2 (getcorner (setq pt1 (getpoint "\n选择矩形范围的第一个角点:")) "\n选择矩形范围的第二个角点:"))
(setq xiao (list (min (car pt1) (car pt2)) (min (cadr pt1) (cadr pt2))))
(setq da (list (max (car pt1) (car pt2)) (max (cadr pt1) (cadr pt2))))
(setq xiaoda (list xiao da))
(setq ss (ssget "c" (car xiaoda) (cadr xiaoda) ));测试对象10w个圆
(length (setq entlst1 (ss->lst ss)))

;方式一,重复运行几次,极大概率报错,“错误:出现异常:oxco080005(访问冲实);警告:忽略展开异常”
(length
        (setq ent_xiaoda
                (mapcar
                        (function
                                (lambda (x)
                                        (cons x (获取图元小大点  x))
                                )
                        )        
                        entlst1
                )
        )
)

;方式二,重复运行也不会报错

(setq entlst2 entlst1)
(setq ent_xiaoda nil)
(while (setq aabbcc (car entlst2))
        (setq ent_xiaoda (cons (cons aabbcc (获取图元小大点  aabbcc)) ent_xiaoda) )
        (setq entlst2 (cdr entlst2))
)
(length ent_xiaoda)


;测试环境cad2018、2024




为什么会报错呢?是否要避免这种写法?


本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-8-7 11:28:45 | 显示全部楼层
ss->lst

缺函数
发表于 2024-8-7 11:29:03 | 显示全部楼层
“错误:出现异常:oxco080005(访问冲实);警告:忽略展开异常”出现这种错误,一般是访问了不该访问的内存导致的。
Vlax开头的程序占用内存比较大,是不是内存不够用了?
发表于 2024-8-7 12:02:16 | 显示全部楼层
本帖最后由 tryhi 于 2024-8-7 12:11 编辑

试了几次没报错
 楼主| 发表于 2024-8-7 12:32:01 | 显示全部楼层
(alloc 1000)
(expand 10)

(gc)
都无法完全解决问题,看来只能换写法,大量数据时不用mapcar
发表于 2024-8-7 12:47:23 | 显示全部楼层

;;选择集转图元名表
;;参数:选择集;返回,图名表
(defun try-ss2EnList(ss / a en lst)
        (setq a -1)
        (if ss
                (while
                        (setq en(ssname ss(setq a(1+ a))))
                        (setq lst(cons en lst))
                )
        )
        (reverse lst)
)
发表于 2024-8-7 13:08:58 | 显示全部楼层
这个报不报错取决于处理数量和内存大小,内存过小会容易出错。内存满了以后,Buffer的读写要慢得多,往往会代码运行完了,Buffer还没写好,所以下一步读取时就会出错。
发表于 2024-8-7 15:31:34 | 显示全部楼层
tryhi 发表于 2024-8-7 12:47
;;选择集转图元名表
;;参数:选择集;返回,图名表
(defun try-ss2EnList(ss / a en lst)

感谢热心的海哥~
发表于 2024-8-9 10:06:06 | 显示全部楼层
里面加上清空不用内存的语句试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 09:47 , Processed in 0.195363 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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