明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1175|回复: 10

[提问] 关于如何搜索相关命令

[复制链接]
发表于 2015-9-5 08:11:39 | 显示全部楼层 |阅读模式
本帖最后由 Gu_xl 于 2015-9-5 08:58 编辑

当看别人的代码时,不明白的时候可以去找AutoLisp函数(葵花宝典).chm文件相应的知识。
但当自己看的代码还不多的时候,对很多函数还不了解的时候,自己写代码想要用到一个功能的函数,却不知道是否有这样的函数,像这种情况下,应该如何自学?如何搜索相关命令?

以上问题主要是在改编他人代码的时候,遇到的,具体问题如下:

需要将一个字符串“1,2,3,4,5”里的“,3”删除,想要得到剩下内容的新字符串“1,2,4,5”。这里不适合用substr命令,因为我删除的对象自己并不知道“,3”在哪里。
遇到这个问题后,应该如何找寻有关字符串的所有函数?
这个具体的问题是否有函数可以解决?

原代码如下:
  1. (defun C:fe (/ ES EN EL i fl clay)
  2. (princ "冻结自己.")
  3. (setq ES (ssget)
  4.     i 0
  5.     EN ""
  6.     EL nil
  7.     FL nil)
  8. (while (/= EN nil)
  9.   (setq EN (ssname ES i)
  10.       EL (cons EN EL)
  11.       i (1+ i)
  12.     )
  13.   )
  14. (setq EL (cdr EL)
  15.        FL (cdr (assoc ' 8 (entget (car EL))))
  16.      EL (cdr EL)
  17.   )
  18. (repeat (- i 2)
  19.    (setq EN (cdr (assoc ' 8 (entget (car EL))))
  20.        FL (strcat EN "," FL)
  21.        EL (cdr EL)
  22.     )
  23.   )
  24.   
  25. (command "LAYER" "F" (eval FL) "")

  26. (princ))
这个代码是用来冻结选中的图层,变量FL代表的是字符串,比如:“1,2,3,4,5",但冻结对于当前层不可操作,所以我要把当前层的图层”3“排除掉,想变成”1,2,4,5"。是否可以解决?

点评

平时还是注意区分下字符的半角与全角,有时人懒了可能直接复制去进行测试或者调试  发表于 2015-9-5 22:21
发表于 2015-9-5 08:47:34 | 显示全部楼层
(vl-remove (getvar 'clayer) fz)
发表于 2015-9-5 08:54:21 | 显示全部楼层
本帖最后由 lucas_3333 于 2015-9-5 08:56 编辑

搜索 "删除表中指定的元素"
来个简单的
  1. (defun mRemoveItem (item lst)
  2.   (vl-remove-if '(lambda (x) (= x item)) lst)
  3. )


_$ (MREMOVEITEM 3 '(1 2 3 3))
(1 2)

发贴时请选择提问即可 ,不要使用[不死猫] ,这个标签是个人专属标签!
 楼主| 发表于 2015-9-5 09:28:15 | 显示全部楼层
鱼与熊掌 发表于 2015-9-5 08:47
(vl-remove (getvar 'clayer) fz)

感谢你提供的帮助。
vl-remove排除的是表fz中的(getvar 'clayer)元素,而我上面的代码里,fz并不是表,而是字符串(由图层和逗号组成的),fz设定为字符串是方便最后一条(command "LAYER" "F" (eval FL) "")应用。所以vl-remove对于字符串不起作用。
谢谢你的帮助,不知道我是否表达清楚了。
 楼主| 发表于 2015-9-5 09:35:53 | 显示全部楼层
lucas_3333 发表于 2015-9-5 08:54
搜索 "删除表中指定的元素"
来个简单的

感谢你提供的帮助。
我上面的代码里,fz并不是表,而是字符串(由图层和逗号组成的),fz设定为字符串是方便最后一条(command "LAYER" "F" (eval FL) "")应用。你所提供的函数对于字符串不起作用。

发贴时请选择提问即可 ,不要使用[不死猫] ,这个标签是个人专属标签!
感谢你指正,由于是新手,不太会上论坛。第一次发贴的时候,系统提示”请选择主题类别“,我看到下面是提问,提问下面有四位高手,所以我理解成提问问题要分成四个片区,分别由四位高手来主持管理,于是我就都选了[不死猫]。下回发贴时会注意。我原先那样点取的意思是[不死猫]提问问题,是这个意思吧。

下回我要提问,直接点取提问就好了,是吧?

谢谢你的帮助。
发表于 2015-9-5 10:44:49 | 显示全部楼层
BenjaminXM 发表于 2015-9-5 09:35
感谢你提供的帮助。
我上面的代码里,fz并不是表,而是字符串(由图层和逗号组成的),fz设定为字符串是 ...

提问直接点取提问就好, 这次应该是Gu_xl版主帮你改过来了, 下次注意好了
没看你的代码, 工作忙死了,看代码就头痛, 你可以用字符串转表
  1. ;; String to List  -  Lee Mac
  2. ;; Separates a string using a given delimiter
  3. ;; str - [str] String to process
  4. ;; del - [str] Delimiter by which to separate the string
  5. ;; Returns: [lst] List of strings

  6. (defun LM:str->lst ( str del / pos )
  7.     (if (setq pos (vl-string-search del str))
  8.         (cons (substr str 1 pos) (LM:str->lst (substr str (+ pos 1 (strlen del))) del))
  9.         (list str)
  10.     )
  11. )
发表于 2015-9-5 22:26:11 | 显示全部楼层
本帖最后由 llsheng_73 于 2015-9-5 22:28 编辑

其实你选择孤时候就可以过滤掉当前图层的东东,根本就不会出现后边的问题
(setq es(ssget(list(cons 8(strcat"~"(getvar'clayer)))))
        i 0
       en"")
至于el和fl,因为它们已经被定义为局部变量,没必要为它们赋初值nil
紧接的while不如直接(repeat(sslength es)
                                  ...)
能准确计算循环次数的情况下,repeat比别的循环更具优势
 楼主| 发表于 2015-9-6 20:32:31 | 显示全部楼层
本帖最后由 BenjaminXM 于 2015-9-6 21:35 编辑
llsheng_73 发表于 2015-9-5 22:26
其实你选择孤时候就可以过滤掉当前图层的东东,根本就不会出现后边的问题
(setq es(ssget(list(cons 8(str ...

平时还是注意区分下字符的半角与全角,有时人懒了可能直接复制去进行测试或者调试
这点确定是应该要注意,以后会做到位。

你的回答已经全部理解了,思路没有打开,一直想在后面折腾,按你的想法的确非常直接有效。
对于“~”,((8 . "~Supt-建筑")),这个代表的意思是非“Supt-建筑”图层吗?头一次见到这种表达。波浪符是通配符,表示匹配此字符串以外的所有字符串吧。

谢谢~
发表于 2015-9-6 20:56:20 | 显示全部楼层
关于字符串参考wcmatch函数。。
ssget应用参见,比较全面。
ssget  后跟mode 的部分理解(不断更新)
http://bbs.mjtd.com/forum.php?mo ... &fromuid=338795

entmake创建图元必要条件(慢慢更新)
http://bbs.mjtd.com/forum.php?mo ... &fromuid=338795

【分享系列1】grread函数应用例子大汇总,源码分享!
http://bbs.mjtd.com/forum.php?mo ... &fromuid=338795

[函数]我整理的很多有用的通用函数,有别人写的,也有本人写的
http://bbs.mjtd.com/forum.php?mo ... &fromuid=338795

[分享]Lisp源码3000
http://bbs.mjtd.com/forum.php?mo ... &fromuid=338795
整理收藏的Lee Mac程序 源码分享
http://bbs.mjtd.com/forum.php?mo ... &fromuid=338795
 楼主| 发表于 2015-9-6 21:31:14 | 显示全部楼层
本帖最后由 BenjaminXM 于 2015-9-6 21:33 编辑
edata 发表于 2015-9-6 20:56
关于字符串参考wcmatch函数。。
ssget应用参见,比较全面。
ssget  后跟mode 的部分理解(不断更新)


关于字符串参考wcmatch函数。。
这个是用来解决我最开始提出的问题吗?应该如何解决?wcmatch这个函数将模式字符串与某指定的字符串进行匹配比较,是否是通过这个函数来告诉我有关通配符~的意义?

以下给出的连接,非常感谢。有一个疑问想咨询一下,作为一个新手,现在这个阶段是开始尝试解决一些问题而自己写代码,遇到不明白不会的时候再去找答案,这种模式是否合适。还是先多看别人写的代码,把别人的代码都看差不多的时候,自然而然就可以写出代码?你从新手到现在这个水平,走的是哪个模式?花了多长的时间?

发的那么多链接我是否要先停下来认真看一遍?Lisp源码3000看到目录就有点怵了。

还请指导一下学习方法,谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-21 16:08 , Processed in 0.166980 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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