明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: caoyin

【分享明经——发程序、拜新年专贴】

    [复制链接]
发表于 2009-3-11 14:43 | 显示全部楼层
本帖最后由 作者 于 2009-3-11 14:50:34 编辑

;求多边形顶点列表((x1 y1)(x2 y2)(x3 y3)...)面积  
(defun  lstMJ(lst / x y)
   (abs

     (apply
'+
      
(
mapcar '(lambda
(x y)
         (
/(-(*(car x)(cadr y))(*(car y)(cadr
x)))2.0)
         )
  
        
(
reverse(cdr(reverse(cons(last
lst) lst))))
        lst
      
)
     )
   )
)


发表于 2009-3-27 16:43 | 显示全部楼层

caoyin大哥,你二十九楼的程序怎么你不给这个函数我啊,我现在运行起来差了一个

no function definition: VLA-OBJECT->ENAME

 楼主| 发表于 2009-3-27 17:10 | 显示全部楼层

网站的网页程序的关系,直接复制代码有问题

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=74564

发表于 2009-3-30 10:06 | 显示全部楼层
本帖最后由 作者 于 2009-3-30 14:34:24 编辑

贴一个我最新写的函数,希望版主加分^_^:
从列表中移去指定的元素(一个不留,支持任意嵌套表)
  1. ;;; ============================================================================;;
  2. ;;; 函数名:         ;;
  3. ;;; RemoveItem         ;;
  4. ;;; 从列表中移去指定的元素(一个不留,支持任意嵌套表)    ;;
  5. ;;; 参数:         ;;
  6. ;;; 要从列表中移去的元素和一个列表      ;;
  7. ;;; 示例:         ;;
  8. ;;; (RemoveItem nil (list 121 nil (list "abc" nil "dde" nil 111) "aaa" nil 999));;
  9. ;;; -> (121 ("abc" "dde" 111) "aaa" 999)     ;;
  10. ;;; By 木子CAD工具 小李子  2009-3-30      ;;
  11. ;;; ============================================================================;;
  12. (defun RemoveItem (item lst / x tmplst)
  13.   (foreach x (vl-remove item lst)
  14.     (if (listp x)
  15.       (setq tmplst (append (list (RemoveItem item x)) tmplst))
  16.       (setq tmplst (append (list x) tmplst))
  17.     )
  18.   )
  19.   (reverse tmplst)
  20. )
也可以这样:
  1. ;;; ============================================================================;;
  2. ;;; 函数名:         ;;
  3. ;;; RemoveItem         ;;
  4. ;;; 从列表中移去指定的元素(一个不留,支持任意嵌套表)    ;;
  5. ;;; 参数:         ;;
  6. ;;; 要从列表中移去的元素和一个列表      ;;
  7. ;;; 示例:         ;;
  8. ;;; (RemoveItem nil (list 121 nil (list "abc" nil "dde" nil 111) "aaa" nil 999));;
  9. ;;; -> (121 ("abc" "dde" 111) "aaa" 999)     ;;
  10. ;;; By 木子CAD工具 小李子  2009-3-30      ;;
  11. ;;; ============================================================================;;
  12. (defun RemoveItem (item lst / x tmplst)
  13.   (foreach x (vl-remove item lst)
  14.     (if (listp x)
  15.       (setq tmplst (cons (RemoveItem item x) tmplst))
  16.       (setq tmplst (cons x tmplst))
  17.     )
  18.   )
  19.   (reverse tmplst)
  20. )
测试结果:
;|
(RemoveItem "" (list 121 "" (list "abc" "" "dde" "" 111) "aaa" "" 999 000))
-> (121 ("abc" "dde" 111) "aaa" 999 0)
(RemoveItem "" (list 121 "" (list "abc" "" "dde" "" 111) "aaa" "" 999 000
    (list 88 "" 9090 "" "" "AAA" "BBB" ""
          (list "ccc" "" "DDD" ""123)
    )
     )
)
-> (121 ("abc" "dde" 111) "aaa" 999 0 (88 9090 "AAA" "BBB" ("ccc" "DDD" 123)))
|;

评分

参与人数 1明经币 +1 收起 理由
Longfin + 1 【好评】 你的程序还有问题,鼓励一下,

查看全部评分

发表于 2009-4-2 08:23 | 显示全部楼层
  1. ;;;解锁所有图层
  2. (defun UnLock_All_Layers ()
  3.   (vlax-for n (vla-get-layers
  4.   (vla-get-ActiveDocument (vlax-get-acad-object))
  5.        )
  6.     (vla-put-lock n :vlax-false)
  7.   )
  8. )
  9. ;;;解冻所有图层
  10. (defun UnFreeze_All_Layers ()
  11.   (vlax-for n (vla-get-layers
  12.   (vla-get-ActiveDocument (vlax-get-acad-object))
  13.        )
  14.     (if (/= (vla-get-name n) (getvar "clayer"))
  15.       ;;也可以用 (not (equal (vla-get-activelayer adoc) item))判断
  16.       (vla-put-Freeze n :vlax-false)
  17.     )
  18.   )
  19. )
发表于 2009-4-8 00:50 | 显示全部楼层

最简洁代码为:

;; 删除去除字符串中的所有空格
;; by 小李子 木子CAD 2009-3-2
(defun strs->No32 (str /)
  (vl-list->string (vl-remove 32 (vl-string->list str)))
)

这个怎么用啊?

发表于 2009-4-14 14:58 | 显示全部楼层
感谢学习学习
发表于 2009-4-24 12:08 | 显示全部楼层

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=60071&replyID=&skin=1

多功能表操作函数以索引 [替代/添加/删除] 表中元素,支持嵌套表!


(defun fsxm-subst-index (lst index_lst var / subst0 subst1)
   (defun subst0 (lst index var / lst2 position)
     (cond ((or (= index T) (> index (1- (length lst))))
     (append lst var)
    )
    ((>= index 0)
     (setq position 0)
     (while (< position index)
       (setq lst2 (cons (car lst) lst2))
       (if (<= position (1- index))(setq lst (cdr lst)))
       (setq position (1+ position))
     )
     (append (reverse lst2) var (cdr lst))
    )
    ((< index 0)
     (append var lst)
    )
     )
   )
   (defun subst1 (lst index_lst var / index)
     (if (cadr index_lst)
       (progn (setq index (car index_lst))
       (subst1 lst
        (list index)
        (list (subst1 (nth index lst) (cdr index_lst) var))
       )
       )
       (subst0 lst (car index_lst) var)
     )
   )
   (if (listp var) t (setq var (list var)))
   (if (listp index_lst) t (setq index_lst (list index_lst)))
   (subst1 lst index_lst var)
)

(defun fsxm-subst-index (lst index_lst var / subst0 subst1)
   (defun subst0 (lst index var / lst2 position)
     (cond ((or (= index T) (> index (1- (length lst))))
     (append lst var)
    )
    ((>= index 0)
     (setq position 0)
     (while (< position index)
       (setq lst2 (cons (car lst) lst2))
       (if (<= position (1- index))(setq lst (cdr lst)))
       (setq position (1+ position))
     )
     (append (reverse lst2) var (cdr lst))
    )
    ((< index 0)
     (append var lst)
    )
     )
   )
   (defun subst1 (lst index_lst var / index)
     (if (cadr index_lst)
       (progn (setq index (car index_lst))
       (subst1 lst
        (list index)
        (list (subst1 (nth index lst) (cdr index_lst) var))
       )
       )
       (subst0 lst (car index_lst) var)
     )
   )
   (if (listp var) t (setq var (list var)))
   (if (listp index_lst) t (setq index_lst (list index_lst)))
   (subst1 lst index_lst var)
)

使用方法如:

(setq lst '(0 1 2 (30 31 32 (330 331 332)) 4 5 6 (70 71 72) 8 9))

替代
(fsxm-subst-index lst 2 "test")
->(0 1 "test" (30 31 32 (330 331 332)) 4 5 6 (70 71 72) 8 9)

删除
(fsxm-subst-index lst 2 nil)
->(0 1 (30 31 32 (330 331 332)) 4 5 6 (70 71 72) 8 9)

批量插入
(fsxm-subst-index lst '(3 3 0.5) '("test1" "test2"))
->(0 1 2 (30 31 32 (330 "test1" "test2" 331 332)) 4 5 6 (70 71 72) 8 9)

 楼主| 发表于 2009-4-24 13:21 | 显示全部楼层
fsxm发表于2009-4-24 12:08:00http://bbs.mjtd.com/forum.php?mod=viewthread&tid=60071&replyID=&skin=1............. 

高手来了,多贴点东西让咱学习一下噻!!

发表于 2009-4-26 19:36 | 显示全部楼层
caoyin老大,"高手"两字不敢当啊~!
潜水多年了,Lisp也忘记的差不多了!
只能多拿出点以前的老本,给老大你捧场哈!
;;建立目录.支持嵌套目录名.(递归的简单运用)
  1. (defun fsxm-mkdir (dir / dir2)
  2.   (cond ((vl-directory-files dir))
  3. ((= (setq dir2 (vl-filename-directory dir)) dir) nil)
  4. (t (fsxm-mkdir dir2) (vl-mkdir dir))
  5.   )
  6. )
1.如果目录名存在,就返回目录内所有文件名.
fsxm-mkdir "c:\\windows")
2.如果建立失败就返回nil.
fsxm-mkdir "c:")
3.如果成功就返回T.
如: (fsxm-mkdir "c:\\1\\2\\3\\4\\5\\6\\7\\8\\9")

点评

这是通过函数自身循环的经典案例  发表于 2009-4-26 00:00
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 21:45 , Processed in 0.858095 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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