明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6780|回复: 15

[【风之影】] [源码]批量定义函数

  [复制链接]
发表于 2011-9-12 20:29:45 | 显示全部楼层 |阅读模式
本帖最后由 cabinsummer 于 2016-12-24 15:14 编辑

  1. (defun cmdload (cmdlist)
  2.   (mapcar '(lambda (cmdgrp / cmd lay)
  3.     (setq cmd (nth 0 cmdgrp))
  4.     (setq lay (nth 1 cmdgrp))
  5.     (eval (read
  6.       (strcat "(defun c:" cmd "(/ ss)
  7.               (setvar \"cmdecho\" 0)
  8.               (setq ss (ssget))
  9.               (if ss
  10.                 (command \"CHANGE\" ss \"\" \"P\" \"LA\" \"" lay "\" \"\")
  11.                 (setvar \"CLAYER\" \"" lay "\")
  12.               )
  13.               (princ))"
  14.        )
  15.      ))
  16.     )
  17.     cmdlist
  18.   )
  19. )
  20. (cmdload '(("1" "DRAW")
  21.     ("2" "HIDDEN")
  22.     ("3" "CENTER")
  23.     ("4" "DIM")
  24.     ("5" "BORDER")
  25.     ("6" "MISC")
  26.     ("7" "PART")
  27.     ("8" "PHANTOM")
  28.     ("9" "TEXT_ENGLISH")
  29.    )
  30. )


以上例子为图形内有九个层,层名分别"DRAW" "HIDDEN" "CENTER" "DIM" "BORDER" "MISC" "PART" "PHANTOM" "TEXT"。
按数字1-9后,如果有选择的实体,则将实体的层改为指定的层,如果没有选择则将当前图层切换到指定的图层。此函数还可以扩展,对于很多功能类似而又略有差别的函数定义是很方便的。例如将上述代码另存为cmdload.lsp,用以下代码加载
  1. (autoload "cmdload" '("1" "2" "3" "4" "5" "6" "7" "8" "9"))

评分

参与人数 2明经币 +2 收起 理由
zctao1966 + 1 很给力!
payforfree + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2018-11-25 21:43:24 | 显示全部楼层
我编译后,出现以下的情况;
  1. 警告: 运行时计算的表达式: (READ (STRCAT "(defun c:" CMD "(/ ss)\n    (setvar "cmdecho" 0)\n    (setq ss (ssget))\n    (if ss\n      (command "CHANGE" ss "" "P" "LA" "" ... ))
发表于 2019-9-30 12:17:41 | 显示全部楼层
程序使用反馈:有的图纸中,至改了图层,颜色没有改变。
发表于 2011-9-12 22:00:05 | 显示全部楼层
mapcar 和lambda还不怎么能领会,学习中!
 楼主| 发表于 2011-9-12 22:17:01 | 显示全部楼层
lambda是定义无名函数,mapcar有两个参数,将第二参数的列表逐个应用到前一参数中。
发表于 2011-9-12 22:45:13 | 显示全部楼层
学习者
发表于 2011-9-13 09:52:32 | 显示全部楼层
lambda后面的progn是不需要的.
 楼主| 发表于 2011-9-13 10:11:02 | 显示全部楼层
xshrimp 发表于 2011-9-13 09:52
lambda后面的progn是不需要的.

You are right
发表于 2011-9-13 16:08:33 | 显示全部楼层
除了用数字,可以用字母吗?

点评

当然可以。但是单个字母除了“K”、“Y”、“N”没有被AutoCAD定义外,其它的全被用了,你可以用多个字母和数字组合使用  发表于 2011-9-13 21:25
发表于 2011-9-13 17:56:45 | 显示全部楼层
顶一个!!!.........
发表于 2011-9-19 21:44:33 | 显示全部楼层
  1. ;;; 局部放大视图标注式样批量定义程序.
  2. ;;;
  3. ;;; 程序设计者: LCAD, (USER2128, QQ:781400968,Email:Leedashan@163.com)
  4. ;;;
  5. ;;; 绘制过程中, 不可避免地要涉及到局部放大视图.
  6. ;;; 习惯只在“模型”空间绘图时,对局部放大视图进行尺寸标注时,
  7. ;;; 就要临时去修改系统变量"dimlfac"(如放大2倍时, dimlfac=0.5),
  8. ;;; 在标注完局部放大视图后, 还要改回: dimlfac=1, 工作不便.
  9. ;;;
  10. ;;; 本程序批量定义局部放大视图比例函数: 1 2 3 4 5 6 7 8 9 10 20倍,
  11. ;;; 调用命令为: 在提示符(command: )下:键入下列其中之一:
  12. ;;;        X1、X2、X3、X4、X5、X6、X7、X8、X9、X10、X20
  13. ;;; 即可设置好、对应的、放大1、2、3、4、5、6、7、8、9、10、20倍的、
  14. ;;; 局部放大视图进行标注时所需标注式样.
  15. ;;; 标注完成局部放大视图中的尺寸后, 键入X1即返回1:1绘图的标注式样(基本式样).
  16. ;;;
  17. ;;; 程序中, 参数“D_style”为图中已存在的、1:1绘图时的标注式样名,
  18. ;;; 如参数“D_style”为“nil”, 则默认以当前的标注式样为基本式样.

  19. ;;;============================================================
  20. (defun chg_dimlfac (D_style / Lst i a b c)
  21.   (setvar "CMDECHO" 0)
  22.   (setq LST '(1 2 3 4 5 6 7 8 9 10 20))
  23.   (foreach I LST
  24.     (setq A (itoa I)
  25. B (list
  26.     'defun
  27.     (read (strcat "C:X" A))
  28.     (list '/ 'xx)
  29.     (if (not D_style) (setq D_style (getvar "dimstyle")))
  30.     (list 'if (list 'tblsearch "dimstyle" D_style)
  31.           (list 'progn
  32.                 (list 'command "._dimstyle" "_restore" D_style)
  33.     (list 'if (list '= i 1) 'nil
  34.           (list 'progn
  35.                 (list 'setq 'xx (list 'strcat D_style "_X" A))
  36.                 (list 'setvar "dimlfac" (list '/ 1.0 i))
  37.                 (list 'command "._dim" "_save" 'xx)
  38.                       (list 'if (list 'tblsearch "dimstyle" 'xx)
  39.                             (list 'command "_yes" "_exit")
  40.                             (list 'command "_exit"))
  41.                 )))
  42.           (list 'princ (list 'strcat "\n图中不存在标注式样""
  43.                              D_style
  44.                              "", 先建立该式样,然后再使用该项命令."))
  45.           )
  46.     (list 'princ)
  47.     ))
  48.     (eval B)
  49.     ) ;_结束 foreach
  50.   (princ)) ;_结束 defun
  51. ;;;(chg_dimlfac "INTE")
  52. (chg_dimlfac nil)
  53. ;;; 本例为:默认以当前的标注式样为基本式样.
  54. ;;; 你可以使用(chg_dimlfac "ISO-25")或(chg_dimlfac "STANDARD")
  55. ;;; 即以名称为"ISO-25"或"STANDARD"的标注式样为基本式样.
  56. ;;;============================================================

点评

水平不错!赞一个  发表于 2011-9-24 14:58
不错不错,你是InteCAD吧?  发表于 2011-9-19 21:50

评分

参与人数 1明经币 +1 收起 理由
zctao1966 + 1 很给力!

查看全部评分

发表于 2011-9-19 22:30:03 | 显示全部楼层
以前用过InteCAD,后来就不用了

点评

;;;(chg_dimlfac "INTE") 我根据这行猜的  发表于 2011-9-19 22:31
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 01:12 , Processed in 0.214050 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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