紫苏炒黄瓜 发表于 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




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


czb203 发表于 2024-8-7 11:28:45

ss->lst

缺函数

baitang36 发表于 2024-8-7 11:29:03

“错误:出现异常:oxco080005(访问冲实);警告:忽略展开异常”出现这种错误,一般是访问了不该访问的内存导致的。
Vlax开头的程序占用内存比较大,是不是内存不够用了?

tryhi 发表于 2024-8-7 12:02:16

本帖最后由 tryhi 于 2024-8-7 12:11 编辑

试了几次没报错

紫苏炒黄瓜 发表于 2024-8-7 12:32:01

(alloc 1000)
(expand 10)

(gc)
都无法完全解决问题,看来只能换写法,大量数据时不用mapcar

tryhi 发表于 2024-8-7 12:47:23

czb203 发表于 2024-8-7 11:28
ss->lst

缺函数

;;选择集转图元名表
;;参数:选择集;返回,图名表
(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)
)

kozmosovia 发表于 2024-8-7 13:08:58

这个报不报错取决于处理数量和内存大小,内存过小会容易出错。内存满了以后,Buffer的读写要慢得多,往往会代码运行完了,Buffer还没写好,所以下一步读取时就会出错。

czb203 发表于 2024-8-7 15:31:34

tryhi 发表于 2024-8-7 12:47
;;选择集转图元名表
;;参数:选择集;返回,图名表
(defun try-ss2EnList(ss / a en lst)


感谢热心的海哥:handshake~

lelelewfxy 发表于 2024-8-9 10:06:06

里面加上清空不用内存的语句试试
页: [1]
查看完整版本: 碰到个奇怪的问题