找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1247|回复: 13

[求助] [求助]:vlisp有这样的函数吗?

[复制链接]
发表于 2003-5-29 16:12:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
如何在一个表中加入一个新的表
比如:((1 2) (2 3)),加入(3  4)后,变为:((1 2) (2 3) (3  4)) ?
如何将:“((1 2) (2 3) (3  4))” 变为 :((1 2) (2 3) (3  4)) ?
感觉编程编糊涂了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-5-29 16:34:42 | 显示全部楼层
1.
(setq a1 '((1 2) (2 3)))
(setq a1 (append a1 '((3 4))))

2.
(setq g1 "((1 2) (2 3) (3 4))")
(read g1)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-30 14:16:51 | 显示全部楼层

谢谢楼上的

我本来是想把选定的几行文字按Y坐标的大小顺序,排一下序,谁知遇到了麻烦,麻烦你帮我看一下,为什么到VL-SORT这一步就不能继续了,显示:error: 参数类型错误: consp QUOTE。试了很多其他方法也不行。(我用Y坐标值和图元名称构成了一个表,想排完序后再逐个提取图元,不知这样做的思路有没有问题。)
(defun C:tt ()
  (setvar "cmdecho" 0)
  (setq p (ssget))
  (princ "\n选择段落文字:")
(setq n (sslength p))
(setq index 0)
(repeat        n
  (setq name (ssname p index))
  (setq lp (entget name))
  (setq coy (caddr (assoc 10 lp)))
(setq item (list coy name))
  (setq aa1 (vl-princ-to-string item))
  (if (= 0 index)
    (setq aa2 aa1)
  (setq aa2 (strcat aa2 " " aa1)))
  (setq aa3 (strcat "(" aa2 ")"))
  (setq aaa (strcat "'" aa3))
  (setq aal (read aaa))
  (setq index (1+ index))
)
(setq newsort
        (vl-sort aal
            (function (lambda (e1 e2)
                        (< (car e1) (car e2)))) )
       
)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2003-5-30 14:46:22 | 显示全部楼层

(setq aaa (strcat "'" aa3))
(setq aal (read aaa))
改为
(setq aal (read aa3))试试。
vl-sort函数操作的对象是表,“'”(quote)函数返回不求值的表达式,一般只在直接给定一个表时使用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-30 15:55:45 | 显示全部楼层
不愧长老,几句话就解决了困扰我半天的问题,多谢了。
我现在走到了这一步,排序后,用nth 等函数得出了第一个
"(-1 . <图元名: 7EFB59D0>)" ,比正式的图元表多两个引号,现在用
read函数也不灵了。怎么才能由"(-1 . <图元名: 7EFB59D0>)"得到
(-1 . <图元名: 7EFB59D0>)?能赐教吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-30 22:54:06 | 显示全部楼层

Re: 谢谢楼上的

最初由 ybyuan 发布
[B]我本来是想把选定的几行文字按Y坐标的大小顺序,排一下序,谁知遇到了麻烦,麻烦你帮我看一下,为什么到VL-SORT这一步就不能继续了,显示:error: 参数类型错误: consp QUOTE。试了很多其他方法也不行。(我用Y坐标?.. [/B]


(defun C:ttt ()
(setvar "cmdecho" 0)
(setq p (ssget))
(princ "\n选择段落文字:")
(setq n (sslength p)bbb'())
(setq index 0)
(repeat n
  (setq name (ssname p index))
  (setq lp (entget name))
  (setq coy (caddr (assoc 10 lp)))
  (setq bbb (append bbb (list (list coy name))))

;;; 甚至直接(setq bbb (append bbb (list (list coy lp))))也可

;;;(setq aa1 (vl-princ-to-string item))
;;;(if (= 0 index)
;;;(setq aa2 aa1)
;;;(setq aa2 (strcat aa2 " " aa1)))
;;;(setq aa3 (strcat "(" aa2 ")"))
;;;(setq aaa (strcat "'" aa3))
;;;(setq aal (read aaa))
  (setq index (1+ index))
)
;;;(setq newsort
;;;(vl-sort aal
;;;(function (lambda (e1 e2)
;;;(< (car e1) (car e2)))) )

;;;)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-31 23:16:14 | 显示全部楼层

你的方法简单多了

你的方法简单多了,很快就可以排序,出现例如:
((11756.8 <图元名: 40084500>) (11308.6 <图元名: 40081DD8>) (10794.5 <图元名: 40081DE0>))
这样的表
我现在在提取图元名进行下一步时,遇到了困难,用cdr提取来之后显示 (<图元名: 40084500>),加了括号的图元名entget不读取,该如何是好?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-1 11:29:59 | 显示全部楼层
第一个这样也可以的哦
(vl-list* '(3 4) '((1 2) (2 3)))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-1 12:09:21 | 显示全部楼层

Re: 你的方法简单多了

最初由 ybyuan 发布
[B]你的方法简单多了,很快就可以排序,出现例如:
((11756.8 <图元名: 40084500>) (11308.6 <图元名: 40081DD8>) (10794.5 <图元名: 40081DE0>))
这样的表
我现在在提取图元名进行下一步时,遇到了困难,用cdr提取?.. [/B]


cdr不行你用cadr试试.建议你通读一遍所有lisp函数.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-1 13:35:00 | 显示全部楼层
看是肯定都看过了,有些不熟练。上面的问题不是你想象那样,用cdr, cadr 都不能完成,你可以试试
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-6-1 13:43:54 | 显示全部楼层
Command: (setq a(entlast))
< Entity name: 50105a0 >

Command: (setq a(list 34.3 a))
(34.3 < Entity name: 50105a0 >)

Command: (cadr a)
< Entity name: 50105a0 >


怎么会不行?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-1 17:06:04 | 显示全部楼层
你们这样是可以,但我这样确实不行,我经过下面程序处理后,得到类似(33356.2 <图元名: 4009D150>)的表,但再用cadr之后,总是显示有问题,不信你们可以运行一下看看。我估计是因为这个表的构成采用了strcat之类的字符串处理命令造成这种情况,如果用append函数组成的表就没这种问题。但不明白为什么显示的情况一样,得出的结果却不同?


(defun C:tt ()                       
  (setvar "cmdecho" 0)
  (setq p (ssget))
  (princ "\n选择段落文字:")
  (setq n (sslength p))
  (setq index 0)
  (repeat n
    (setq name (ssname p index))
    (setq lp (entget name))
    (setq coy (caddr (assoc 10 lp)))
    (setq item (list coy name))
    (setq aa1 (vl-princ-to-string item))
    (if        (= 0 index)
      (setq aa2 aa1)
      (setq aa2 (strcat aa2 " " aa1))
    )
    (setq aa3 (strcat "(" aa2 ")"))
    (setq aal (read aa3))       
    (setq index (1+ index))
  )
  (setq        newsort
         (vl-sort aal
                  (function (lambda (e1 e2)
                              (> (car e1) (car e2))
                            )
                  )
         )
  )
   (setq n1 (length newsort))
  (setq ind 0)
  (repeat n
    (setq ntt (nth ind newsort))
    (setq ty (cadr ntt))
)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-2 09:23:39 | 显示全部楼层
最初由 ybyuan 发布
[B]你们这样是可以,但我这样确实不行,我经过下面程序处理后,得到类似(33356.2 <图元名: 4009D150>)的表,但再用cadr之后,总是显示有问题,不信你们可以运行一下看看。我估计是因为这个表的构成采用了strcat之类的字... [/B]

原因:
你处理后的表不是关键表(点对),此时“<图元名: 4009D150>”中有空格,实际上(33356.2 <图元名: 4009D150>)是一个三元素表,CADR得到的是<图元名: ,而不是<图元名: 4009D150>)。
解决方法:
不用图元名,改用句柄,用handent函数返回图元名。
修改了一下你的代码:

  1.   [FONT=courier new]
  2. (defun C:tt ()
  3.   (setvar "cmdecho" 0)
  4.   (setq p (ssget))
  5.   (princ "\n选择段落文字:")
  6.   (setq n (sslength p))
  7.   (setq index 0)
  8.   (setq aal '())
  9.   (repeat n
  10.     (setq name (ssname p index))
  11.     (setq lp (entget name))
  12.     (setq coy (caddr (assoc 10 lp)))
  13.     (setq item (list coy (cdr (assoc 5 lp))))
  14.     (setq aal (cons item aal))
  15.     (setq index (1+ index))
  16.   )
  17.   (setq        newsort
  18.          (vl-sort aal
  19.                   (function (lambda (e1 e2)
  20.                               (> (car e1) (car e2))
  21.                             )
  22.                   )
  23.          )
  24.   )
  25.   (setq n1 (length newsort))
  26.   (setq ind 0)
  27.   (repeat n
  28.     (setq ntt (nth ind newsort))
  29.     (setq ty (handent (cadr ntt)))
  30.   )
  31. )
  32.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-2 16:13:07 | 显示全部楼层
明白了,谢谢 :)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-26 09:48 , Processed in 0.216977 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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