明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1110|回复: 11

[基础] 动态修改表元素

[复制链接]
发表于 2019-3-19 15:15:08 | 显示全部楼层 |阅读模式
本帖最后由 jack093 于 2019-3-19 15:16 编辑

例如有以下数组(a1 b1 c1 d1) (a2 b2 c2 d2 ) (a3 b3 c3 d3) ... (an bn cn dn)如何修改其中的第i行第j列
(defun lstmod(lst i j val/)
...


请赐教



发表于 2019-3-19 15:22:34 | 显示全部楼层
本帖最后由 fangmin723 于 2019-3-19 15:24 编辑

nth 配合 subst 使用
 楼主| 发表于 2019-3-20 08:48:08 | 显示全部楼层
fangmin723 发表于 2019-3-19 15:22
nth 配合 subst 使用

你好, subst 使用有些不熟,只会在entmod的时候用,是这样吗?
                (setq ent (entget tem))
                (entmod (subst (cons 8 "00")(assoc 8 ent) ent)))
我只会用循环nth 重新构造一个表,可能太笨了,
发表于 2019-3-20 09:12:57 | 显示全部楼层
  1. ;|
  2. abc 修改表中的第i行第j列元素
  3. 双重表 '((a1 b1 c1 d1) (a2 b2 c2 d2 ) (a3 b3 c3 d3) ... (an bn cn dn))
  4. 实例:
  5. (setq lst '((1 2 3) (4 5 6) (7 8 9) (10 11 12 13 14)))
  6. (abc lst 3 2 100) → '((1 2 3) (4 5 6) (7 8 9) (10 11 100 13 14))
  7. |;
  8. (defun abc (lst n1 n2 new / i j)
  9.   (setq        i -1
  10.         j -1
  11.   )
  12.   (mapcar '(lambda (x)
  13.              (setq i (1+ i))
  14.              (if (= i n1)
  15.                (mapcar '(lambda        (y)
  16.                           (setq j (1+ j))
  17.                           (if (= j n2) new  y)
  18.                         )
  19.                        x
  20.                )
  21.                x
  22.              )
  23.            )
  24.           lst
  25.   )
  26. )

点评

要判断 i, j >0 且 i < Length (l) , j < Length (item) ,越界时函数返回值应是nil  发表于 2019-3-20 23:53
发表于 2019-3-20 09:52:44 | 显示全部楼层
jack093 发表于 2019-3-20 08:48
你好, subst 使用有些不熟,只会在entmod的时候用,是这样吗?
                (setq ent (entget tem ...

3楼,院长已经帮你写好了,你就用他的把!
 楼主| 发表于 2019-3-20 11:17:05 | 显示全部楼层
用vlax-make-safearray解决
谢谢
 楼主| 发表于 2019-3-20 12:50:11 | 显示全部楼层
非常谢谢院长;写了二十几年的lisp,一直没用过  mapcar lambda  这两个函数,只会do while for循环,有空了还得学这两个函数,看了躲不过去了,再次谢谢院长!
忙了一上午,以为用vlax-make-safearray可以解决了,真是奇了怪了这两行在命令行好好地
(setq retlst (vlax-make-safearray vlax-vbString '(0 . 50) '(0 . 2)))
(vlax-safearray->list retlst)
在程序中就不工作了



本帖子中包含更多资源

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

x
 楼主| 发表于 2019-3-20 14:58:56 | 显示全部楼层
写了一个丑陋的初始化

(defun array-init (n1 n2 val / ret lst)
    (setq lst nil)
    (repeat n2 (setq lst (append lst (list val))))
    (setq ret nil)
    (repeat n1 (setq ret (append ret (list lst))))
    ret
);;(array-init 3 5 nil)
发表于 2019-3-20 20:12:34 | 显示全部楼层
本帖最后由 e2002 于 2019-3-20 20:13 编辑

注意:上面xyp的函数没有对 l,i ,j 的值做检查,实际使用中你需要先做检查,才能保证最后的返回的结果正确。
另外,这种操作效率最高的还是直接使用指针传递,可以直接修改元素的值。

点评

你测试了4楼的代码?  发表于 2019-3-20 22:48
发表于 2019-3-21 13:53:03 | 显示全部楼层
e2002 发表于 2019-3-20 20:12
注意:上面xyp的函数没有对 l,i ,j 的值做检查,实际使用中你需要先做检查,才能保证最后的返回的结果正 ...

“要判断 i, j >0 且 i < Length (l) , j < Length (item) ,越界时函数返回值应是nil ”

越界时不修改,返回原表!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-19 01:26 , Processed in 0.197524 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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