明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 816|回复: 1

[函数] 几个用于联合属性列表增删插入的函数

[复制链接]
发表于 2021-1-18 19:13:18 | 显示全部楼层 |阅读模式
  1. (defun endata_sub (key val_new pair_old ent_data / pair_old pair_new)
  2. ;defun定义联合属性列表属性值替换函数:根据组码替换联合属性列表中组码值对应点对列表的属性值。
  3.     (setq pair_new (cons key val_new))
  4.     ;用key和属性值val_new生成新的点对列表,赋值pair_new。
  5.     (if (and (= (type (cdr pair_new)) 'real) (= (type (cdr pair_old)) 'real));if_1 start.
  6.       (if (<= 0.0001 (abs (- (cdr pair_new) (cdr pair_old))));if_1.1 start.
  7.         (setq ent_data (subst pair_new pair_old ent_data))
  8.         ;替换ent_data中组码key对应点对列表,并更新联合属性列表ent_data。
  9.     );if_1.1 end.
  10.       (if (/= pair_new pair_old);if_1.2 start.
  11.         (setq ent_data (subst pair_new pair_old ent_data))
  12.     );if_1.2 end.
  13.   );if_1 end.
  14.     ent_data
  15. )
  16. (defun endata_add (key val_new ent_data / pair_new)
  17. ;defun定义合属性列表属性值增加函数:生成新的点对列表添加到联合属性列表中。
  18.     (setq pair_new (cons key val_new))
  19.     ;生成新的联合属性列表,赋值pair_new。
  20.     (append ent_data (list pair_new))
  21.   ;将新的点对列表pair_new添加到联合属性列表中,并更新联合属性列表ent_data。
  22. )
  23. (defun endata_find (key val ent_data / cnt)
  24. ;defun定义查找指定组码与属性值的函数。
  25.   (if (= (type val) 'real);real型带有浮点数特性,需要和其他类型变量分开讨论。
  26.     (progn;progn_1 start.
  27.         (setq lstlen (length ent_data))
  28.         (setq cnt 0)
  29.         (while (<= cnt lstlen);while_1 start.
  30.           (setq pair (nth cnt ent_data))
  31.           (if (= (type (cdr pair)) 'real);if_1 start.对比点对列表的属性值也为real型就需要考虑浮点数特性。
  32.             (if (> 0.00001 (abs (- (cdr pair) val)));if_1.1 start.
  33.               (setq signal T)
  34.               (setq signal nil)
  35.           );if_1.1 end.
  36.             (if (= pair (cons key val));if_1.2 start.
  37.               (setq signal T)
  38.               (setq signal nil)
  39.           );if_1.2 end.
  40.           );if_1 end.
  41.           (setq cnt (+ 1 cnt))
  42.       );while_1 end.
  43.       );progn_1 end.
  44.     (progn;progn_2 start.
  45.         (setq lstlen (length ent_data))
  46.         (setq cnt 0)
  47.         (while (<= cnt lstlen);while_2 start.
  48.           (setq pair (nth cnt ent_data))
  49.           (if (= pair (cons key val));if_2 start.
  50.             (setq signal T)
  51.             (setq signal nil)
  52.         );if_2 end.
  53.           (setq cnt (+ 1 cnt))
  54.       );while_2 end.
  55.       );progn_2 end.
  56.   )
  57.   signal
  58. )
  59. (defun endata_insert (index lst_insert ent_data / lst_front lst_rear)
  60. ;defun定义根据指定索引(组码位置)把一个或多个点对列表组成的列表插入指定索引后的函数。
  61.     (setq lst_rear ent_data lst_front (reverse ent_data))
  62.     (repeat (+ 1 index) (setq lst_rear (cdr lst_rear)))
  63.     ;删除索引位置之前(包括索引位置)的所有元素,赋值lst_rear。
  64.     (repeat (- (- (length lst_front) index) 1) (setq lst_front (cdr lst_front)))
  65.     ;删除索引位置之后(不包括索引位置)的所有元素(整个列表是倒序),赋值lst_front。
  66.     (setq lst_front (reverse lst_front))
  67.     ;将倒序列表拨正。
  68.   (setq ent_data (append (append lst_front lst_insert) lst_rear))
  69.     ;拼接插入目标列表。
  70.     ent_data
  71. )
  72. (defun lst_del (lst stt end / cnt lst1 lst2)
  73. ;删除列表lst中索引为0的元素开始的第stt至第end个元素,并返回删除后的列表。
  74.   (setq lst1 lst lst2 (reverse lst))
  75.   (repeat (+ 1 end)
  76.    (setq lst1 (cdr lst1))
  77.   )
  78.   (repeat (- (length lst) stt)
  79.    (setq lst2 (cdr lst2))
  80.   )
  81.   (setq lst (append (reverse lst2) lst1))
  82. )

 楼主| 发表于 2021-1-18 19:16:16 | 显示全部楼层
我不知道是不是activeX有我不知道的函数可以达到这些效果,就目前来说我是写了这些自定义函数充数。测试过各种类型,都还挺好用的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-17 07:17 , Processed in 0.159380 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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