乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 59|回复: 11

[编程交流] 用于标记图案填充对象的Lisp

[复制链接]

4

主题

12

帖子

10

银币

初来乍到

Rank: 1

铜币
24
发表于 2022-7-5 16:10:40 | 显示全部楼层 |阅读模式
亲爱的各位,
 
我们都知道Revit具有标记功能,我知道AutoCAD也可以使用Lisp实现这一点。
 
假设我们在不同的层中有5个不同的实体图案填充,如:
层名称-L1
层名称-L2
图层名称-L3
图层名称-L4
层名称-L5
 
我想放置一个名为LNAME的块和一个属性,将它们放置在图案填充上,并在其中获得对象->层比例。
 
我附上了样本文件。
 
提前感谢。
 
文科硕士
LISP标记。图纸
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:16:26 | 显示全部楼层
时间不够了,试试这个
 
  1. (setvar "attdia" 0)
  2. (while (setq obj (vlax-ename->vla-object (car (entsel "\nPick hatch"))))
  3. (setq lay (vla-get-layer obj))
  4. (command "-Insert" "lname" (getpoint) 1000 0.0 lay)
  5. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 16:21:58 | 显示全部楼层
  1. (defun C:test ( / spc SS attr i o p ll ur )
  2. (vl-every 'eval
  3.    '(
  4.      (setq spc (vla-get-Block (vla-get-ActiveLayout (vla-get-ActiveDocument (vlax-get-acad-object)))))
  5.      (princ "\nSelect hatches to insert "LNAME" block on their centroids.")
  6.      (setq SS (ssget '((0 . "HATCH")(2 . "SOLID")(8 . "L1,L2,L3,L4,L5"))))
  7.      (setq attr (getvar 'attreq)) (setvar 'attreq 0)
  8.      (progn
  9.        (repeat (setq i (sslength SS))
  10.          (vla-GetBoundingBox (setq o (vlax-ename->vla-object (ssname SS (setq i (1- i))))) 'll 'ur)
  11.          (setq p (apply 'mapcar (cons '(lambda (a b) (/ (+ a b) 2.)) (mapcar 'vlax-safearray->list (list ll ur))))) ; LM
  12.          (vla-put-Layer (vlax-invoke spc 'InsertBlock p "LNAME" 1.0 1.0 1.0 0.0) (vla-get-Layer o))
  13.        )
  14.        (setvar 'attreq attr)
  15.      )
  16.    )
  17. )
  18. (princ)
  19. ) (vl-load-com) (princ)
回复

使用道具 举报

4

主题

12

帖子

10

银币

初来乍到

Rank: 1

铜币
24
发表于 2022-7-5 16:32:12 | 显示全部楼层
尊敬的Grrr:,
 
谢谢你的回复。您的代码将标记像一个符咒一样放置在图案填充对象质心上!但是,我有两个问题:
 
1、只考虑实体图案填充。我假设您有意将选择范围锁定为实心范围,但图形中甚至可能存在自定义填充图案。附件上的一个用于演示。
2.标签不具有层名称属性。它们都会一直显示“Lx”,这是属性的默认值。
3.我认为可能的层名称在代码中定义为:(setq SS(ssget’((0。“HATCH”)(2。“SOLID”)(8。“L1,L2,L3,L4,L5”))
但它们会随着文件的不同而变化,就像填充图案名称一样。
 
请参阅附件。
 
提前感谢。
 
文科硕士
LISP-TAGGING_V2。图纸
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:34:11 | 显示全部楼层
 
获取一组图案填充(0。“图案填充”)的选择集,图案为实心(2。“实心”),位于任何层L1、L2、L3、L4、L5(8。“L1、L2、L3、L4、L5”)
 
获取图案填充的选择集(setq SS(ssget’((0。“HATCH”)))
 
关于质心的Grr很好。
回复

使用道具 举报

4

主题

12

帖子

10

银币

初来乍到

Rank: 1

铜币
24
发表于 2022-7-5 16:40:53 | 显示全部楼层
尊敬的Bigal:,
 
谢谢你的解释。我们可以将其设置为:
 
获得一组图案填充选择集(0。“图案填充”),具有任何图案(2。“实体”)和任何层(8。“L1、L2、L3、L4、L5”)
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 16:43:41 | 显示全部楼层
 
谢谢,不过这篇文章是由李提供的。
所以我总是在同一行加上他的首字母。
 
 
 
您有两种选择:
a、 删除组码(2。“实心”)和(8。“L1、L2、L3、L4、L5”)
b、 使用:(2“*”)和(8“*”)
 
 
好的,现在我看到您使用了名为“LNAME”的属性块,它的属性带有标记“LNAME”
 
  1. (defun C:test ( / spc SS attr i o p ll ur b lyr )
  2. (vl-every 'eval
  3.    '(
  4.      (setq spc (vla-get-Block (vla-get-ActiveLayout (vla-get-ActiveDocument (vlax-get-acad-object)))))
  5.      (princ "\nSelect hatches to insert "LNAME" block on their centroids.")
  6.      (setq SS (ssget '((0 . "HATCH"))))
  7.      (setq attr (getvar 'attreq)) (setvar 'attreq 0)
  8.      (progn
  9.        (repeat (setq i (sslength SS))
  10.          (vla-GetBoundingBox (setq o (vlax-ename->vla-object (ssname SS (setq i (1- i))))) 'll 'ur)
  11.          (setq p (apply 'mapcar (cons '(lambda (a b) (/ (+ a b) 2.)) (mapcar 'vlax-safearray->list (list ll ur))))) ; LM
  12.          (vla-put-Layer (setq b (vlax-invoke spc 'InsertBlock p "LNAME" 1.0 1.0 1.0 0.0)) (setq lyr (vla-get-Layer o)))
  13.          (vl-some
  14.            '(lambda (x)
  15.              (cond
  16.                ( (not (vlax-write-enabled-p x)) nil)
  17.                ( (= "LNAME" (strcase (vla-get-TagString x))) (vla-put-TextString x (vla-get-Layer o)) T)
  18.              )
  19.            )
  20.            (vlax-invoke b 'GetAttributes)
  21.          )  
  22.        )
  23.        (setvar 'attreq attr)
  24.      )
  25.    )
  26. )
  27. (princ)
  28. ) (vl-load-com) (princ)
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 16:53:17 | 显示全部楼层
你好
 
这是我对Field object的尝试。
  1. (defun c:taghatches (/ getid doc lst blk int hat sel ent q p)
  2. ;;------------------------------------;;
  3. ;;        Tharwat - Date: 26.07.2017        ;;
  4. ;; Tag hatches with Attributed Block        ;;
  5. ;; that entitled: LNAME then add the        ;;
  6. ;; Hatch layer into the previous said        ;;
  7. ;; Att.Block as a field object in Att.;;
  8. ;;------------------------------------;;
  9. (if (and (or (and (setq blk (tblsearch "BLOCK" "LNAME"))
  10.                    (= (cdr (assoc 70 blk)) 2)
  11.                    )
  12.               (alert  "Block Name <LNAME> is either not found in drawing or it's not attributed block <!>")
  13.               )
  14.           (princ "\nSelect hatches :")
  15.           (setq int -1
  16.                 doc (vla-get-activedocument (vlax-get-acad-object))
  17.                 sel (ssget "_:L" '((0 . "HATCH")))
  18.                 )
  19.          
  20.    )
  21.    (progn
  22.       (defun getid (obj doc / u)
  23.         (if (vlax-method-applicable-p (setq u (vla-get-utility doc)) 'getobjectidstring)
  24.           (vla-getobjectidstring u obj :vlax-false)
  25.           (itoa (vla-get-objectid obj))
  26.         )
  27.       )
  28.       (while (setq ent (ssname sel (setq int (1+ int))))
  29.         (vla-getboundingbox (setq hat (vlax-ename->vla-object ent)) 'q 'p)
  30.         (and
  31.           (setq lst (mapcar 'vlax-safearray->list (list q p))
  32.                 blk (vlax-invoke
  33.                       (vla-get-block (vla-get-activelayout doc))
  34.                       'insertblock
  35.                       (mapcar '(lambda (j k) (* (+ j k) 0.5)) (car lst) (cadr lst))
  36.                       "LNAME"
  37.                       1.0
  38.                       1.0
  39.                       1.0
  40.                       0.0
  41.                     )
  42.           )
  43.           (vl-some '(lambda (att)
  44.                       (and (= (strcase (vla-get-tagstring att)) "LNAME")
  45.                            (progn
  46.                              (vla-put-textstring att (strcat "%<\\AcObjProp Object(%<\\_ObjId " (getid hat doc) ">%).Layer>%")) t)
  47.                       )
  48.                     )
  49.                    (vlax-invoke blk 'getattributes)
  50.           )
  51.         )
  52.       )
  53.       (and doc (vla-regen doc acactiveviewport))
  54.     )
  55. )
  56. (princ)
  57. ) (vl-load-com)
回复

使用道具 举报

4

主题

12

帖子

10

银币

初来乍到

Rank: 1

铜币
24
发表于 2022-7-5 16:58:13 | 显示全部楼层
塔瓦,你又来了!
 
谢谢你们!两者都在工作,但Tharwat的代码将块放置在当前层上,因为我们需要将它们放置在标记层上。
 
最后一个问题:
 
代码将标记放置在质心上。因此,当我试图标记一个L形物体时,标记会放置在附件上显示的空白处。
是否可以将标记放置在填充图案的某个位置?
 
提前谢谢。
 
文科硕士
LISP-TAGGING_V3。图纸
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 17:01:09 | 显示全部楼层
你好
 
实际上,代码没有将属性块LNAME放置在中心点,而是位于左下角和右上角点之间的边界框的中心点。
 
回到您关于更改属性块位置的请求,那么它是否总是应该放置在左上角,如上次上载的图形所示?
它是否总是具有相同的偏移距离?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 20:23 , Processed in 0.639386 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表