snigefqb 发表于 2014-3-6 13:27:55

关于数据跟新的问题

程序如下
(defun c:y12 (/        new-s new-i new-r en new-ext-list endata entype
              old-ext-list)
(regapp "sakura")                        ;注册专属应用名称
(setq new-s (getstring "编号<141400>:"))
(if (not (not new-s))
    (setq new-s "141400")
)
(setq new-i (getstring "\n整数值<123:>"))
(if (not (not new-i))
    (setq new-i 123)
)
(setq new-r (getstring "\n实数值<45.8>:"))
(if (not (not new-r))
    (setq new-r 45.8)
)
(setq en (car (entsel "\n选择对象:")))
(if en
    (progn
                                        ;------------扩展数据的格式要求
                                        ;------------(-3 ("SAKJRA"(1000 . "A0001")(1070 .123)(1040 . 45.8)))
      (SETQ new-ext-list
             (list -3
                   (list "sakura"
                       (cons 1000 new-s) ;群码1000必须是字符串
                       (cons 1070 new-i) ;群码1070必须是整数
                       (cons 1040 new-r) ;群码1040必须是实数
                   )
             )
      )
      (setq endata (entget en '("*")))
      (setq entype (cdr (assoc 0 endata)))
      (if (setq old-ext-list (assoc -3 endata))
        (setq endata (subst new-ext-list old-ext-list endata))
        (setq endata (append endata (list new-ext-list)))
      )
      (entmod endata)
      (princ (strcat "*"
                     entype
                     "*"
                     "加入扩展数据成功--"
                     new-s
                     ","
                     (itoa new-i)
                     ","
                     (rtos new-r)
             )
      )
    )
)
(prin1)
)

现图中有一图元
((-1 . <图元名: 7ef7dd38>) (0 . "POLYLINE") (330 . <图元名:
7ef73cc0>) (5 . "44F") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"DGX") (62 . 3) (6 . "Continuous") (100 . "AcDb2dPolyline") (66 . 1) (10 0.0
0.0 0.0) (70 . 130) (40 . 0.15) (41 . 0.15) (210 0.0 0.0 1.0) (71 . 0) (72 . 0)
(73 . 0) (74 . 0) (75 . 0) (-3 ("SOUTH" (1000 . "201102"))))
但是运行程序过后数据变成了,
((-1 . <图元名: 7ef7dd38>) (0 . "POLYLINE") (330 . <图元名:
7ef73cc0>) (5 . "44F") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"DGX") (62 . 3) (6 . "Continuous") (100 . "AcDb2dPolyline") (66 . 1) (10 0.0
0.0 0.0) (70 . 130) (40 . 0.15) (41 . 0.15) (210 0.0 0.0 1.0) (71 . 0) (72 . 0)
(73 . 0) (74 . 0) (75 . 0) (-3 ("sakura" (1000 . "141400") (1070 . 123) (1040 .
45.8)) ("SOUTH" (1000 . "201102"))))

请问为什么 没把(-3 ("SOUTH" (1000 . "201102"))) 替换成(-3 ("sakura" (1000 . "141400") (1070 . 123) (1040 . 45.8)))
当运行(setq endata (subst new-ext-list old-ext-list endata))时数据已经跟新为
((-1 . <图元名: 7ef7dd38>) (0 . "POLYLINE") (330 . <图元名:
7ef73cc0>) (5 . "44F") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"DGX") (62 . 3) (6 . "Continuous") (100 . "AcDb2dPolyline") (66 . 1) (10 0.0
0.0 0.0) (70 . 130) (40 . 0.15) (41 . 0.15) (210 0.0 0.0 1.0) (71 . 0) (72 . 0)
(73 . 0) (74 . 0) (75 . 0) (-3 ("sakura" (1000 . "141400") (1070 . 123) (1040 .
45.8))))

请问,这是什么情况,该怎么解决

edata 发表于 2014-3-6 14:12:00

(defun c:y12 (/      new-s new-i new-r en new-ext-list endata entype
            old-ext-list)
(regapp "sakura")                        ;注册专属应用名称
(if(= (setq new-s (getstring "编号<141400>:"))"")
    (setq new-s "141400")
)
(if(not(setq new-i (getint "\n整数值<123:>")))
    (setq new-i 123)
)
(if(not(setq new-r (getreal "\n实数值<45.8>:")))
    (setq new-r 45.8)
)
(setq en (car (entsel "\n选择对象:")))
(if (and en (/= new-s "") new-i new-r)
    (progn
                                        ;------------扩展数据的格式要求
                                        ;------------(-3 ("SAKJRA"(1000 . "A0001")(1070 .123)(1040 . 45.8)))
      (SETQ new-ext-list
             (list -3
                   (list "sakura"
                         (cons 1000 new-s) ;群码1000必须是字符串                       
                         (cons 1070 new-i) ;群码1070必须是整数
                         (cons 1040 new-r) ;群码1040必须是实数                       
                   )
             )
      )
      (setq endata (entget en '("*")))
      (setq entype (cdr (assoc 0 endata)))
      (if (setq old-ext-list (assoc -3 endata))
      (setq endata (subst new-ext-list old-ext-list endata))
      (setq endata (append endata (list new-ext-list)))
      )
      (print endata)
      (entmod endata)
      (princ (strcat "*"
                     entype
                     "*"
                     "加入扩展数据成功--"
                     new-s
                     ","
                     (itoa new-i)
                     ","
                     (rtos new-r)
             )
      )
    )
)
(prin1)
)

snigefqb 发表于 2014-3-6 16:22:49

edata 发表于 2014-3-6 14:12 static/image/common/back.gif


还是不行哎,还是一样的根本就没有替换掉

edata 发表于 2014-3-7 10:46:19

如果将某一个扩展数据清除,必须是清空数据。
注意,该程序无差别清除全部扩展数据
(defun c:y12 (/      new-s new-i new-r en new-ext-list endata entype
            old-ext-list)
(regapp "SAKJRA")                        ;注册专属应用名称
(if(= (setq new-s (getstring "编号<141400>:"))"")
    (setq new-s "141400")
)
(if(not(setq new-i (getint "\n整数值<123:>")))
    (setq new-i 123)
)
(if(not(setq new-r (getreal "\n实数值<45.8>:")))
    (setq new-r 45.8)
)
(setq en (car (entsel "\n选择对象:")))
(if (and en (/= new-s "") new-i new-r)
    (progn
                                        ;------------扩展数据的格式要求
                                        ;------------(-3 ("SAKJRA"(1000 . "A0001")(1070 .123)(1040 . 45.8)))
      (SETQ new-ext-list
             (list -3
                   (list "SAKJRA"
                         (cons 1000 new-s) ;群码1000必须是字符串                        
                         (cons 1070 new-i) ;群码1070必须是整数
                         (cons 1040 new-r) ;群码1040必须是实数                        
                   )
             )
      )
      (setq endata (entget en '("*")))
      (setq entype (cdr (assoc 0 endata)))
      (if (setq old-ext-list (assoc -3 endata))
        (progn
          (setq old_data(cdr old-ext-list) i -1)
          (repeat (length old_data)
          (setq old-ext-list (subst (list (setq old_app(car(nth (setq i(1+ i)) old_data))))(assoc old_app old_data)old-ext-list ))
          )
          (setq endata (subst old-ext-list (assoc -3 endata) endata))
          (entmod endata)
          (setq endata (entget en '("*")))
          (setq endata (append endata (list new-ext-list)))
        )
      (setq endata (append endata (list new-ext-list)))
      )      
      (entmod endata)
      (princ (strcat "*"
                     entype
                     "*"
                     "加入扩展数据成功--"
                     new-s
                     ","
                     (itoa new-i)
                     ","
                     (rtos new-r)
             )
      )
    )
)
(print(entget en '("*")))
(prin1)
)

再来个容易看的。
(defun c:y12 (/      new-s new-i new-r en new-ext-list endata entype
            old-ext-list)
(regapp "sakura")                        ;注册专属应用名称
(if(= (setq new-s (getstring "编号<141400>:"))"")
    (setq new-s "141400")
)
(if(not(setq new-i (getint "\n整数值<123:>")))
    (setq new-i 123)
)
(if(not(setq new-r (getreal "\n实数值<45.8>:")))
    (setq new-r 45.8)
)
(setq en (car (entsel "\n选择对象:")))
(if (and en (/= new-s "") new-i new-r)
    (progn
                                        ;------------扩展数据的格式要求
                                        ;------------(-3 ("SAKJRA"(1000 . "A0001")(1070 .123)(1040 . 45.8)))
      (SETQ new-ext-list
             (list -3
                   (list "sakura"
                         (cons 1000 new-s) ;群码1000必须是字符串                        
                         (cons 1070 new-i) ;群码1070必须是整数
                         (cons 1040 new-r) ;群码1040必须是实数                        
                   )
             )
      )
      (setq endata (entget en '("*")))
      (setq entype (cdr (assoc 0 endata)))
      (if (setq old-ext-list (assoc -3 endata))
      (setq endata (subst new-ext-list old-ext-list endata))
      (setq endata (append endata (list new-ext-list)))
      )
      (print endata)
      (entmakex endata)
      (entdel en)
      ;(entmod endata)
      (princ (strcat "*"
                     entype
                     "*"
                     "加入扩展数据成功--"
                     new-s
                     ","
                     (itoa new-i)
                     ","
                     (rtos new-r)
             )
      )
    )
)
(prin1)
)

snigefqb 发表于 2014-3-7 18:03:35

edata 发表于 2014-3-7 10:46 static/image/common/back.gif
如果将某一个扩展数据清除,必须是清空数据。
注意,该程序无差别清除全部扩展数据



谢了,弄懂了,我一直都是选的曲线,读取不了坐标,多段线的就可以了

wlmq 发表于 2014-7-18 10:32:39

好东西,收藏了!
页: [1]
查看完整版本: 关于数据跟新的问题