找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1690|回复: 10

[LISP程序]:[原创]对块追加属性

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-5-19 10:07:57 | 显示全部楼层 |阅读模式

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

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

×
2003.05.20 修改

  1. ;|
  2. 功能:对块追加属性;
  3. 说明: e      块引用实体;
  4.        pt     属性插入点;
  5.        high   属性字高;
  6.        tag    属性标签;
  7.        pro    提示;
  8.        val    默认值;
  9.        mode   属性模式;
  10.               1   不可见,系统变量 attdisp 将覆盖不可见属性;
  11.               2   预置属性;
  12.               3   校验;
  13.               4   默认;
  14. |;
  15. (defun block-addattribute (e            pt             high     tag      pro
  16.                            val            mode     /              obj      insertpt
  17.                            blkdef   attdef   blkref   attref   tf
  18.                            blk_attref             !last    xscale   yscale
  19.                            zscale   rotation pinblk
  20.                           )
  21.   (defun !last (lst)
  22.     (reverse (cdr (reverse lst)))
  23.   )
  24.   (setq        obj         (vlax-ename->vla-object e)
  25.         insertpt (vlax-safearray->list
  26.                    (vlax-variant-value (vla-get-insertionpoint obj));插入点
  27.                  )
  28.         xscale         (vla-get-xscalefactor obj);x比例
  29.         yscale         (vla-get-yscalefactor obj);y比例
  30.         zscale         (vla-get-zscalefactor obj);z比例
  31.         rotation (vla-get-rotation obj);旋转角
  32.   )
  33.   ;;处理有旋转的块
  34.   (if (/= rotation 0.0)
  35.     (setq pinblk (polar        '(0. 0. 0.)
  36.                         (- (angle insertpt pt)
  37.                            rotation
  38.                         )
  39.                         (distance insertpt pt)
  40.                  )
  41.     )
  42.     (setq pinblk (mapcar '- pt insertpt))
  43.   )
  44.   (setq        blkdef (vla-item
  45.                  (vla-get-blocks
  46.                    (vla-get-activedocument (vlax-get-acad-object))
  47.                  )
  48.                  (vla-get-name obj)
  49.                )
  50.   )
  51.   (setq blk_attref (vla-get-hasattributes obj))
  52.   (cond
  53.     ((= blk_attref :vlax-false) (setq tf t)) ;不含属性
  54.     ;;含属性但没有与追加属性相同的
  55.     (T
  56.      (if (not (setq tf
  57.                      (not
  58.                        (member t
  59.                                (mapcar
  60.                                  '(lambda (x)
  61.                                     (= (vla-get-tagstring x) tag)
  62.                                   )
  63.                                  (vlax-safearray->list
  64.                                    (vlax-variant-value (vla-getattributes obj))
  65.                                  )
  66.                                )
  67.                        )
  68.                      )
  69.               )
  70.          )
  71.        (setq tf nil)                        ;有与追加属性相同的
  72.      )
  73.     )
  74.   )
  75.   (if tf
  76.     (progn
  77.       (setq attdef (vla-addattribute
  78.                      blkdef
  79.                      high
  80.                      (cond
  81.                        ((= mode 1) acAttributeModeInvisible)
  82.                        ((= mode 2) acAttributeModeConstant)
  83.                        ((= mode 3) acAttributeModeVerify)
  84.                        (t acAttributeModePreset)
  85.                      )
  86.                      tag
  87.                      (vlax-3d-point pinblk)
  88.                      pro
  89.                      val
  90.                    )
  91.       )
  92.       (setq blkref (vla-insertblock
  93.                      (vla-get-modelspace
  94.                        (vla-get-activedocument (vlax-get-acad-object))
  95.                      )
  96.                      (vlax-3d-point insertpt)
  97.                      (vla-get-name BLKDEF)
  98.                      xscale
  99.                      yscale
  100.                      zscale
  101.                      rotation
  102.                    )
  103.       )
  104.       (setq attref (vlax-safearray->list
  105.                      (vlax-variant-value (vla-getattributes blkref))
  106.                    )
  107.       )
  108.       (if (> (length attref) 1)
  109.         (mapcar
  110.           '(lambda (x)
  111.              (vla-put-tagstring x (vla-get-tagstring x))
  112.              (vla-put-textstring x (vla-get-textstring x))
  113.              (vla-put-insertionpoint x (vla-get-insertionpoint x))
  114.            )
  115.           (!last attref)
  116.         )
  117.       )
  118.       (vla-put-tagstring (last attref) tag)
  119.       (vla-put-textstring (last attref) pro)
  120.       (vla-put-insertionpoint (last attref) (vlax-3d-point pt))
  121.       (vla-delete obj)
  122.     )
  123.     ;;tf 为空时修改块内属性;
  124.     (princ "\n块内含有相同标签的属性!")
  125.   )  
  126.   (princ)
  127. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-5-19 12:20:09 | 显示全部楼层
;;USAGE:(BLOCK-ADDATTRIBUTE (CAR(ENTSEL "\n选追加属性图块: ")) (GETPOINT "\n属性插入点: ") 5 "12" "45" "bbb" 2)

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-5-19 13:22:35 | 显示全部楼层
最初由 LUCAS 发布
[B];;USAGE:(BLOCK-ADDATTRIBUTE (CAR(ENTSEL "\n选追加属性图块: ")) (GETPOINT "\n属性插入点: ") 5 "12" "45" "bbb" 2)

用_ddatte编辑看看,会发现追加的属性没有出现在_ddatte对话框中 [/B]

后面的 vla-for 不对,已修改。另外请教个问题,用getattributes得到的用哪个函数处理。

这个程序是写绿化标注时才学的,应该在 BLKDEF 后加个遍历块内实体检查是否有属性,没有追加;有,是否与追加的Tag一样,一样,不追加仅在后面改,不一样的追加,后面引用时要加条件。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-20 07:51:43 | 显示全部楼层

  1. ;|
  2. 功能:对块追加属性;
  3. 说明: e      块引用实体;
  4.        pt     属性插入点;
  5.        high   属性字高;
  6.        tag    属性卷标;
  7.        pro    提示;
  8.        val    默认值;
  9.        mode   属性模式;
  10.               1   不可见,系统变量 attdisp 将覆盖不可见属性;
  11.               2   预置属性
  12.               3   校验;
  13.               4   默认;
  14. |;
  15. ;; (BLOCK-ADDATTRIBUTE (CAR(ENTSEL "\n选追加属性图块: ")) (GETPOINT "\n属性插入点: ") 5 "12" "45" "bbb" 3)
  16. ;;Sorry!我错了!Mode 2 是固定属性
  17. ;;对旋转后的图块增加属性,位置非预期

  18. (defun BLOCK-ADDATTRIBUTE (E          PT         HIGH        TAG    PRO    VAL
  19.                            MODE          /         OBJ        INSERTPT      BLKDEF
  20.                            ATTDEF
  21.                           )
  22.   (setq        OBJ         (vlax-ename->vla-object E)
  23.         INSERTPT (vlax-safearray->list
  24.                    (vlax-variant-value (vla-get-insertionpoint OBJ))
  25.                  )
  26.   )
  27.   (setq        BLKDEF (vla-item
  28.                  (vla-get-blocks
  29.                    (vla-get-activedocument (vlax-get-acad-object))
  30.                  )
  31.                  (vla-get-name OBJ)
  32.                )
  33.   )
  34.   (setq        ATTDEF (vla-addattribute
  35.                  BLKDEF
  36.                  HIGH
  37.                  (cond
  38.                    ((= MODE 1) acattributemodeinvisible)
  39.                    ((= MODE 2) acattributemodeconstant)
  40.                    ((= MODE 3) acattributemodeverify)
  41.                    (t acattributemodepreset)
  42.                  )
  43.                  TAG
  44.                  (vlax-3d-point (mapcar '- PT INSERTPT))
  45.                  PRO
  46.                  VAL
  47.                )
  48.   )
  49.   (command "_.attsync" "n" (vla-get-name OBJ))
  50.   (princ)
  51. )


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

使用道具 举报

发表于 2003-5-20 08:20:35 | 显示全部楼层
最初由 eachy 发布
[B][QUOTE]最初由 LUCAS 发布
[B];;USAGE:(BLOCK-ADDATTRIBUTE (CAR(ENTSEL "\n选追加属性图块: ")) (GETPOINT "\n属性插入点: ") 5 "12" "45" "bbb" 2)

用_ddatte编辑看看,会发现追加的属性没有出现在_ddat... [/B]

getattributes得到的是variant
可以用vlax-variant-value 转变为数组,再用vlax-safearray->list转变为LIST
..............................................................................................................
如果不知道一个函数的返回值,可以用TYPE测试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-20 09:21:30 | 显示全部楼层
eachy, 修改后的贴出来了吗? 未见呀!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-5-20 10:01:35 | 显示全部楼层
最初由 LUCAS 发布
[B][code]
;|
功能:对块追加属性;
说明: e      块引用实体;
       pt     属性插入点;
       high   属性字高;
       tag    属性卷标;
       pro    提示;
       val    默认值;
       mode   属性?.. [/B]

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

使用道具 举报

发表于 2003-6-12 13:52:04 | 显示全部楼层
能否扩充到直接将点取得属性或文本直接追加到点取的图块中?这样会比较方便。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-6-20 23:55:41 | 显示全部楼层
上面两位把属性模式给定义死了,属性模式是可以相加的.

0        无属性模式选定
1        不可见
2        常数
4        验证
8        预置


  1. Mode        AcAttributeMode enum; input-only
  2. [color=red]
  3. (any combination of constants can be used by adding them together):
  4. [/color]
  5. acAttributeModeInvisible
  6. acAttributeModeConstant
  7. acAttributeModeVerify

  8. acAttributeModePreset
复制代码


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

使用道具 举报

发表于 2007-3-2 17:46:05 | 显示全部楼层
这里有两个定义好的属性文本做成的一个块,下面的代码怎么到第二个的时候不能正常修改了阿?

(Foreach ;此循环有点问题
                  I
                   (Vlax-Safearray->List
                     (Vlax-Variant-Value
                       (Vla-Getattributes Att_Zbbz)
                     ) ;_ End Vlax-Variant-Value
                   ) ;_ End Vlax-Safearray->List
          (Vla-Put-Textstring I Att_StrX) ;更改属性值
          (Vla-Put-Textstring I Att_StrY) ;更改属性值  ;此句有点问题



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

使用道具 举报

发表于 2007-3-27 12:28:09 | 显示全部楼层
为什么这个在发贴时总是无法控制好版面,尤其是LISP源程序,有啥高招吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 15:52 , Processed in 0.612156 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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