明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1751|回复: 12

[函数] 分享几个表处理函数

  [复制链接]
发表于 2022-10-1 12:33 | 显示全部楼层 |阅读模式
本帖最后由 caoyin 于 2022-10-1 12:35 编辑

;;;刚刚看到网友发的表处理函数,就把自己写的分享出来,不一定好用,抛砖引玉

;;;函数以递归法居多


; ------------------------------------------------------------
;; [功能] 多维数组转三维数组
;; 用于处理VLA函数返回的点集,如IntersectWith求对象交点
;; (MD->3D '(0 1 2 3 4 5 6 7 8 9))
(defun md->3d (L)
  (if (> (length L) 3)
    (cons (list (car L) (cadr L) (caddr L))
          (md->3d (cdddr L))
    )
    (list L)
  )
)
;; ------------------------------------------------------------
;; [功能] 多维数组转二维数组
;; 用于处理VLA函数返回的点集,如 Coordinates 获得多段线顶点
;; (MD->2D '(0 1 2 3 4 5 6 7 8 9))
(defun md->2d (L)
  (if (> (length L) 2)
    (cons (list (car L) (cadr L))
          (md->2d (cddr L))
    )
    (list L)
  )
)
;; ------------------------------------------------------------
;; [功能] 三维点转换为二维点,并把数字全部转换为实数
(defun 3d->2d (L)
  (mapcar '+ L '(0.0 0.0))
)


;; ------------------------------------------------------------
;; [功能] 返回表中指定项之前的部分
;; (Before 3 '(1 2.5 3 2.8 3.5 3 4 6))
(defun Before (A L / B)
  (if (and (setq B (car L)) (/= A B))
    (cons B (Before A (cdr L)))
  )
)


;; ------------------------------------------------------------
;; [功能] 修剪掉表后面部分,从 0 到指定位置截取表
;; (Trim '(0 1 2 3 4 5 6 7 8 9) 4)->(0 1 2 3)
(defun Trim (L N)
  (if (and L (/= N 0))
    (cons (car L) (Trim (cdr L) (1- N)))
  )
)


;; ------------------------------------------------------------
;; [功能] 返回表末端指定长度的部分
;; (ends '(0 1 2 3 4 5 6 7 8) 4)
(defun ends (L N)
  (repeat (- (length L) N)
    (setq L (cdr L))
  )
)


;; ------------------------------------------------------------
;; [功能] 修剪掉表后面部分,从 0 到符合比较函数条件的位置截取表
;(Trim-If '(1 2.5 2.8 3.5 5 7 3 4 6) '(lambda (X) (= X 3)))
(defun Trim-If (L *F* / X)
  (if (and (setq X (car L)) (not ((eval *F*) X)))
    (cons X (Trim-If (cdr L) *F*))
  )
)


;; ------------------------------------------------------------
;; [功能] 返回表指定位置指定长度的子项
;; (SubItems '(0 1 2 3 4 5 6 7 8 9) 2 3)
(defun SubItems (L N I)
  (if (and (< N (length L)) (> I 0))
    (cons (nth N L) (SubItems L (1+ N) (1- I)))
  )
)


;; ------------------------------------------------------------
;; [功能] 截取表的局部
;; (Extract '(0 1 2 3 4 5 6 7 8 9) nil 8)
;; (Extract '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9") "2" "8")
;; (Extract '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9") "4" nil)
(defun Extract (LST ITM1 ITM2 / X)
  (setq X (car LST))
  (if LST
    (if (or (not ITM1) (= ITM1 X))
      (if (/= ITM2 X)
        (cons X (Extract (cdr LST) nil ITM2))
      )
      (Extract (cdr LST) ITM1 ITM2)
    )
  )
)


;; ------------------------------------------------------------
;; [功能] 将表在指定位置断开,并返回包含两个子表的表
;; (Break '(1 2.5 2.8 3.5 5 7 3 4 6) 4)
(defun Break (L N / *F* X)
  (defun *F* (L N)
    (if (setq X L)
      (if (/= N 0)
        (cons (car X) (*F* (cdr X) (1- N)))
      )
    )
  )
  (list (*F* L N) X)
)


;; ------------------------------------------------------------
;; [功能] 按照指定长度拆分表
;; (Split '(0 1 2 3 4 5 6 7 8 9) 4)
(defun Split (L N)
  (if L
    (cons (car (setq L (Break L N)))
          (Split (cadr L) N)
    )
  )
)


;; ------------------------------------------------------------
;; [功能] cdr 函数的反向操作
;; (rcdr '(1 2 3 4 5 6 7 8))
(defun rcdr (L / X)
  (if (setq X (cdr L))
    (cons (car L) (rcdr X))
  )
)


评分

参与人数 5明经币 +4 金钱 +20 收起 理由
QF770 + 1
dtucad + 1 很给力!
guosheyang + 1 很给力!
start4444 + 1 很给力!
tigcat + 20 很给力!

查看全部评分

"觉得好,就打赏"
    共1人打赏
发表于 2022-10-8 09:30 | 显示全部楼层
牛啊,有些看都看不懂,但是测试真好用,哈哈,忍不住点个赞
发表于 2022-10-2 09:27 | 显示全部楼层
谢谢分享,很实用的函数
发表于 2022-10-6 18:29 | 显示全部楼层
多谢版主分享,学习了
发表于 2022-10-1 17:18 | 显示全部楼层
多谢版主分享
发表于 2022-10-1 19:57 | 显示全部楼层
多谢版主分享,学习了
发表于 2022-10-1 22:35 | 显示全部楼层
谢谢! 版主分享函数!!!!
发表于 2022-10-2 13:49 | 显示全部楼层

多谢版主分享
发表于 2022-10-2 20:12 | 显示全部楼层
感谢版主发国庆红包
发表于 2022-10-3 11:34 | 显示全部楼层
感谢版主分享
发表于 2022-10-4 13:17 | 显示全部楼层
多谢版主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-28 21:58 , Processed in 0.473540 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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