明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2400|回复: 13

表處理.......................

  [复制链接]
发表于 2003-9-27 17:38:00 | 显示全部楼层 |阅读模式
我原本的程序如下

(defun c:ccv (/)
  (defun GET-TAG (en /)
    (setq ed (entget en '("MY_TAG")))
    (setq tag1 (cdr (cadr (cadr (assoc -3 ed)))))
  )
  (setq li nil)
  (setq ss (ssget))
  (setq count 0)
  (while (> (sslength ss) count)
    (setq en (ssname ss count))
    (setq count (1+ count))
    (GET-TAG en)
    (setq li (cons tag1 li))
  )
)

這樣子所得到的結果是
("Spring" "Spring" "Spring" "Spring" "test" "test")

現在我想改成這樣子
(("spring" 實體1 實體4 實體10...)("test" 實體3 實體6...)...)

程序如下
(defun c:ccv (/)
  (defun GET-TAG (en /)
    (setq ed (entget en '("MY_TAG")))
    (setq tag1 (cdr (cadr (cadr (assoc -3 ed)))))
  )
  (setq li nil)
  (setq ss (ssget))
  (setq count 0)
  (while (> (sslength ss) count)
    (setq en (ssname ss count))
    (setq count (1+ count))
    (setq tagg (GET-TAG en))
    (if (setq a (assoc tagg li))
    (setq li (cons en li))               ;如果li裏有這個標簽引導的表了,就加這個實體到這表中.
    (setq li (cons (list tag1 en ) li))        ;如果li沒有,就新生一個
      )
  )
)

但是沒有成功,我的程序要怎麼改才可以呢????
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2003-9-27 17:40:00 | 显示全部楼层
dwg

本帖子中包含更多资源

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

x
发表于 2003-9-27 18:18:00 | 显示全部楼层
(append)
发表于 2003-9-27 18:28:00 | 显示全部楼层
(defun c:ccv2 (/)
  (defun GET-TAG (en /)
    (setq ed (entget en '("MY_TAG")))
    (setq tag1 (cdr (cadr (cadr (assoc -3 ed)))))
  )
  (setq li nil)
  (setq ss (ssget))
  (setq count 0)
  (while (> (sslength ss) count)
    (setq en (ssname ss count))
    (setq count (1+ count))
    (setq tagg (GET-TAG en))
    (if (setq a (assoc tagg li))
      (setq li (subst (append (assoc tagg li) (list en)) (assoc tagg li) li));这样
      ;(setq li (cons en li))               ;如果li裏有這個標簽引導的表了,就加這個實體到這表中.
      (setq li (cons (list tag1 en ) li)) ;如果li沒有,就新生一個
    )
  )
)
 楼主| 发表于 2003-9-27 18:35:00 | 显示全部楼层
本帖最后由 作者 于 2003-9-27 19:00:35 编辑

謝謝.

那為甚麼我用 CONS 加入不行呢??




加入一個元素到串列的開端或建構一個點線串列
(cons new-first-element list-or-atom)

引數

new-first-element

要加入串列開端的元素。這個元素可以是原子或串列。

list-or-atom

串列或原子。

傳回值

傳回的值依 list-or-atom 的資料類型而定。如果 list-or-atom 是一個串列,cons 傳回那個加入 new-first-element 作為串列中第一個項目的串列。如果 list-or-atom 是一個原子,cons 傳回由 new-first-element 及 list-or-atom 構成的對數。

範例

指令: (cons 'a '(b c d))

(A B C D)

指令:(cons '(a) '(b c d))

((A) B C D)

指令:(cons 'a 2)

(A . 2)
发表于 2003-9-28 11:28:00 | 显示全部楼层
用CONS也可以,不过你的"spring"就会跑到后面去了,就向你原来程序中的,"spring"将会在倒数第二项。
不过你的用法是错的,你想想,你的LI是(("spring" 實體1 實體4 實體10...)("test" 實體3 實體6...)...),这样如果你用cons,
假设("spring" ...)为s1 ("test"...)为s2,那么li就是(s1 s2)
这样(cons en li)就是(en s1 s2),看出来问题出在哪儿了吗?那个subst在这里是不可少的,除非你换种循环方式
 楼主| 发表于 2003-9-28 12:29:00 | 显示全部楼层
謝謝!!!
发表于 2003-9-28 13:58:00 | 显示全部楼层
你的图做了什么处理,打开它,我的CAD就自动把express  tools给装上了,
 楼主| 发表于 2003-9-28 19:00:00 | 显示全部楼层
是嗎,你用的是哪個版本的.
我也不知道這是怎麼回事,我用 R14 打開不會阿
 楼主| 发表于 2003-9-30 21:43:00 | 显示全部楼层
我後來整理了一下程序,可是注解出來的 h1 有好幾個,找了好久不知道是哪個循環出錯了.


;;;功能:注解輸出
;;;By Spring
;;;09/27-03
;;;______________________________________________________
(defun c:ccv (/ ed tag l hc ss en count a n li1 name p1 ent)
  (defun GET-TAG (en /)
    (setq ed (entget en '("MY_TAG")))
    (setq tag (cdr (cadr (cadr (assoc -3 ed)))))
  )                                        ;取得注解,保存在變量 tag
;;;______________________________________________________
  (setq li nil)
  (setq hch nil)                        ;建立空白表
  (setq ss (ssget))
  (setq count 0)
  (while (> (sslength ss) count)        ;循環
    (setq en (ssname ss count))
    (setq count (1+ count))
    (GET-TAG en)                        ;取得其中一個
    (if        tag                                ;如果 tag 不為 nil 則執行
      (progn
        (if (setq a (assoc tag li))
          (setq        li (subst (append (assoc tag li) (list en))
                          (assoc tag li)
                          li
                   )
          )                                ;如果 li 表裡有 tag 這個標籤了,就將實體加入到 li 表裡去
          (setq li (cons (list tag en) li)) ;如果沒有就新增一個
        )
      )
    )
  )                                        ;結束循環;;到這裡表 li 鷹該是 ((tag 1 2 3...)(tag 1 2 3 ...))
  (setq n 0)
  (while (> (length li) n)                ;循環 li
    (setq li1 (nth n li))                ;取得 li 的其中一個,到這裡表 li1 應該是 (tag 1 2 3...)
    (setq tag (car li1))                ;取得標籤 (tag)
    (setq li1 (cdr li1))                ;取得實體名 (1 2 3...)
    (setq n (1+ n))
    (setq name (strcat "H" (itoa n)))        ;h1
    (setq tag (strcat name ": " (itoa (length li1)) "-" "(" tag ")"))
    (setq hch (cons tag hch))                ;將要注解的文字寫進表 hch
    (setq j? 0)
    (while (> (sslength ss) j?)                ;循環選中的實體
      (setq enn (ssname ss j?))
      (setq j? (1+ j?))
      (GET-TAG enn)
      (if tag                                ;如果實體中含有標籤則執行
        (progn
          (setq j?# 0)
          (while (> (length li1) j?#)        ;循環 li1 表中的實體名稱
            (setq ed2 (nth j?# li1))        ;取得其中一個
            (setq j?# (1+ j?#))
            (if        (= (cdr (list ed2)) (cdr (list enn))) ;如果實體名稱一樣
              (progn
                (setq edf (entget ed2))
                (if (= (cdr (assoc 0 edf)) "CIRCLE")
                  (progn
                    (setq circle_xy nil)
                    (setq rad (cdr (assoc 40 edf)))
                    (setq cen (cdr (assoc 10 edf)))
                    (setq cen_x (car cen))
                    (setq cen_y (nth 1 cen))
                    (setq circle_x (+ cen_x (* 0.8 rad)))
                    (setq circle_y (+ cen_y (* 0.8 rad)))
                    (setq circle_xy (list circle_x circle_y))
                    (command "UCS" "World")
                    (command "TEXT" circle_xy 10 0 name)
                    (command "UCS" "rev")
                  )
                  (progn
                    (setq n$ 0)
                    (setq listxy nil)
                    (while (/= (nth n$ edf) nil)
                      (if (= (car (nth n$ edf)) 10)
                        (setq
                          listxy
                           (append listxy
                                   (list (list (cadr (nth n$ edf))
                                               (caddr (nth n$ edf))
                                         )
                                   )
                           )

                        )
                      )
                      (setq n$ (1+ n$))
                    )
                    (setq listxy (nth 2 listxy))
                    (command "UCS" "World")
                    (command "TEXT" listxy 10 0 name)
                    (command "UCS" "rev")
                  )
                )
              )
            )
          )
        )
      )
    )
  )
  (setq p1 (getpoint "\ninsert point"))
  (setq tag (nth 0 hch))
  (command "_.TEXT" p1 8 0 tag)
  (setq hch (cdr hch))
  (foreach ent hch
    (command "_.TEXT" "" ent)
  )
)




本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-10-2 14:23 , Processed in 0.211809 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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