明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: vken7az2p

[求助]:[0304]關於"屬性標籤值"內容替換問題?

  [复制链接]
发表于 2006-3-10 12:33:00 | 显示全部楼层
本帖最后由 作者 于 2006-3-13 12:02:08 编辑

ts.vlx档(繁体版),增加起始数设定

 

本帖子中包含更多资源

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

x
发表于 2006-3-10 17:15:00 | 显示全部楼层
谢谢版大的程序,所需要的排序已经可以达到,
另外是否可以请版大提供一下源码让大家学习呢?
先谢谢您了~
 楼主| 发表于 2006-3-10 20:51:00 | 显示全部楼层

版大真是谢谢您的程序,这样编排就方便多了,但缺乏定义起始编号,

另外不知道是否可以提供一下源码让大家学习呢?

麻烦您了~谢谢~

发表于 2006-3-14 12:38:00 | 显示全部楼层

版大:

是否可以请您提供一下源码让大家学习呢?

发表于 2006-3-14 14:16:00 | 显示全部楼层

论坛是讨论问题的地方,有问题可发至论坛。

到底版主在论坛得到了什么?不可能是整个程序,我主要是在磨练程序技巧,并用程序实现各种可能,源码不提供也是为了磨练网友,每个人写程序的思路都会不一样,从中才能得到一些其他方法。

前面不是已经有一个初版的源码了吗?应从简单学起,那初版是整个程序的关键,所有的关键技术都在其中了,看懂了初版,程序就能写出来。

 楼主| 发表于 2006-6-5 11:02:00 | 显示全部楼层


请教龙版主
关於此案例中,属性排序方面
仅限於属性第一位,
但第2~3...笔资料的排序问题
该怎样处里呢?
另外此问题也影响后面编号写入问题

请问是否可以指导一下
谢谢~

目前我用这程序取出属性标籤的座标
但好像在置换时还是不行用...

(setq ss (ssget '((0 . "insert") (66 . 1)) ) )
(setq n -1)
(setq lst '())
(setq sstime(sslength ss))
(repeat sstime
(setq blkobj (vlax-ename->vla-object (ssname SS (setq N (1+ N)) )) )
(setq xvar (vla-GetAttributes blkobj))
(setq svar (vlax-variant-value xvar))
(setq att_obj_list (vlax-safearray->list svar))

(foreach obj att_obj_list
(if (= (vla-get-tagstring obj) "NU") ;;判断属性名称
(progn
(setq atobj (vla-get-insertionpoint obj))
(setq atobj_v (vlax-variant-value atobj))
(setq atobj_s (vlax-safearray->list atobj_v))
(setq lst (append lst (list atobj_s)))
) ;_progn
) ;_if
) ;_foreach
)

发表于 2006-6-6 07:51:00 | 显示全部楼层
  1. ;;看来你并不清楚图中的图块属性结构?
  2. ;;图块中的属性标籤只有一种"NU"
  3. ;;程序已经取得所有属性插入点,接下来只有排序了
  4. (defun C:TT (/ BLKOBJ LST LST1 N SS)
  5.   (load (findfile "sortent.vlx") NIL)
  6.   (setq SS (ssget '((0 . "insert") (66 . 1))))
  7.   (setq N -1)
  8.   (repeat (sslength SS)
  9.     (setq BLKOBJ (vlax-ename->vla-object (ssname SS (setq N (1+ N)))))
  10.     (foreach OBJ (vlax-invoke BLKOBJ 'GETATTRIBUTES)
  11.       (setq
  12. LST (append LST
  13.       (list (list (vlax-get OBJ 'INSERTIONPOINT) OBJ))
  14.      )
  15.       )
  16.     )
  17.   )
  18.   ;;接下来只有排序了----晓东EACHY班竹有一个排序函数可用
  19.   ;;排序后再把数字写入属性即可!
  20.   ;;排序有8种方式----改参数即可
  21.   (setq LST1 (EA:SORT_ENTITY LST 1 1 5))
  22.   ;;(setq LST1 (EA:SORT_ENTITY LST 1 2 5))
  23.   ;;(setq LST1 (EA:SORT_ENTITY LST 1 3 5))
  24.   ;;(setq LST1 (EA:SORT_ENTITY LST 1 4 5))
  25.   ;;(setq LST1 (EA:SORT_ENTITY LST 0 1 5))
  26.   ;;(setq LST1 (EA:SORT_ENTITY LST 0 2 5))
  27.   ;;(setq LST1 (EA:SORT_ENTITY LST 0 3 5))
  28.   ;;(setq LST1 (EA:SORT_ENTITY LST 0 4 5))
  29.   (setq N 1)
  30.   (foreach ENT LST1
  31.     (foreach OBJ ENT
  32.       (vla-put-textstring (cadr OBJ) N)
  33.       (setq N (1+ N))
  34.     )
  35.   )
  36.   (princ)
  37. )
  38. ;|
  39. 程序:sortent.vlx  作者:eachy
  40. 调用格式: (ea:sort_entity entity_list mode key vx)
  41. 参数说明:
  42.         1 mode 0 按行 1 按列
  43.         2 key
  44.              (mod = 0)    (mod = 1)
  45.           1  Y降X升       X升Y降   (左上至右下)
  46.           2  Y降X降       X降Y降   (右上至左下)
  47.           3  Y升X降       X降Y升   (右下至左上)
  48.           4  Y升X升       X升Y升   (左下至右上)
  49.          
  50.         3 vx 行(列)允许误差,为 nil 实取 0
  51.         4 entity_list 表, 格式如下
  52.                   ((pt1 ent1) (pt2 ent2) ... (ptn entn))
  53.           a pt 为 ent 的特徵点, ent 可以为 entity 或 vla-object
  54.             比如对文字排序,pt 可以使用文字的插入点
  55.             
  56.           b 当 pt 为实数时,vx 为行列最大及最小值的差值,此时 mode key 为任意值
  57.             如一组数 (1 3 56 89 56 45 6 8 45 91 45 69 78 15 12 11) vx 取 10
  58.             排序后为 ((1 3 6 8 11) (12 15) (45 45 45) (56 56) (69 78) (89 91))
  59.             总表及子表均为由大到小排列
  60.          
  61. 返 回 值: 表,子表为按要求排列的 行/列
  62. 说    明: 因为是 lisp 函数,本函数内部并不对数据的合法性进行检查,以提高程序的效率
  63.           使用前确保各参数的的正确性
  64. |;
  65. ;;所有排序皆从此程序变化
  66. ;;作者:秋枫
  67. ;;Sort_and_Write_pList :见件
  68. (setq FNAME "C:\\LSP\\DAT.LSP")
  69. (setq PLIST '((1 3 4)
  70.        (2 4 5)
  71.        (3 4 5)
  72.        (1 3 2)
  73.        (3 5 2)
  74.        (2 4 0)
  75.        (1 2 3)
  76.        (1 2 0)
  77.        (1 1 0)
  78.       )
  79. )
  80. (defun SORT_AND_WRITE_PLIST (FNAME PLIST / FP PT)
  81.   ;; sort plist first
  82.   (setq PLIST (vl-sort PLIST
  83.          '(lambda (P1 P2)
  84.      (cond ((< (car P1) (car P2)) t)
  85.     ((and (= (car P1) (car P2))
  86.           (< (cadr P1) (cadr P2))
  87.      )
  88.      t
  89.     )
  90.     ((and (= (car P1) (car P2))
  91.           (= (cadr P1) (cadr P2))
  92.           (< (caddr P1) (caddr P2))
  93.      )
  94.      t
  95.     )
  96.     (t NIL)
  97.      )
  98.    )
  99.        )
  100.   )
  101.   ;; write plist then
  102.   (setq FP (open FNAME "w"))
  103.   (foreach PT PLIST (princ PT FP) (princ "\n" FP))
  104.   (close FP)
  105. )
  106. ;;(SORT_AND_WRITE_PLIST FNAME PLIST)

本帖子中包含更多资源

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

x
 楼主| 发表于 2006-6-6 08:20:00 | 显示全部楼层
谢谢解答,但假如说目前的属性标签名称,
不只存在"NU"一种,
另有其他的名称存在,
那该怎样先排除这不需要排序的属性标签名称呢?
烦请再次帮忙解答一下
谢谢~
 楼主| 发表于 2006-6-6 08:54:00 | 显示全部楼层

3

使用版大的程序改写了将属性标籤名称加入选取
但因为不太清楚用法
不知道该怎样将没有属性标籤名称所產生的,
如下面这样
(nil #<VLA-OBJECT IAcadAttributeReference2 0f7516f4>)
该怎样去掉此串列呢?

目前的程序如下,
如有错误请在指点指点~谢谢~
(setq ss (ssget '((0 . "insert") (66 . 1))))
(setq n -1)
(setq lst '())
(repeat
(sslength ss)
(setq blkobj (vlax-ename->vla-object (ssname ss (setq n (1+ n)))))
   (foreach obj (vlax-invoke blkobj 'getattributes)
      (setq lst (append
     lst (list (list
            (if (= (vla-get-tagstring obj) "NU") ;;设置判断属性名称
            (vlax-get obj 'insertionpoint)
     )
            obj)) 
         ) ;_ 结束append
      ) ;_ 结束setq
   ) ;_ 结束foreach
) ;_ 结束repeat

回传结果如下:
((nil #<VLA-OBJECT IAcadAttributeReference2 0f7516f4>) ((5423.97 846.051 0.0)

#<VLA-OBJECT IAcadAttributeReference2 0f751674>) ((5423.97 786.051 0.0)

#<VLA-OBJECT IAcadAttributeReference2 0f7515f4>) ((5285.76 845.143 0.0)

#<VLA-OBJECT IAcadAttributeReference2 0f752f84>) ((5229.93 845.143 0.0)

#<VLA-OBJECT IAcadAttributeReference2 0f752ee4>) ((5164.51 845.143 0.0)

#<VLA-OBJECT IAcadAttributeRefer

 楼主| 发表于 2006-6-6 08:58:00 | 显示全部楼层


(setq ss (ssget '((0 . "insert") (66 . 1))))
(setq n -1)
(setq lst '())
(repeat
(sslength ss)
(setq blkobj (vlax-ename->vla-object (ssname ss (setq n (1+ n)))))
   (foreach obj (vlax-invoke blkobj 'getattributes)
      (setq lst (append
     lst 
            (if (= (vla-get-tagstring obj) "NU") ;;设置判断属性名称
            (list (list(vlax-get obj 'insertionpoint)obj))
     )
               ) ;_ 结束append
      ) ;_ 结束setq
   ) ;_ 结束foreach
) ;_ 结束repeat

 

这样的编写正确吗?

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

本版积分规则

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

GMT+8, 2025-6-9 06:28 , Processed in 0.164978 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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