乐筑天下

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

[编程交流] Lisp预览中的所有块

[复制链接]

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:37:46 | 显示全部楼层 |阅读模式
大家好,
我正在编写这段代码以预览图形中的所有块,但有一个问题我无法解决:
我需要从每个块中获取边界框,并比较它们的高度(Y坐标)。
然后插入每个块,使用极函数-类似于:
  1. (setq newBspt (polar prevBspt (DtR 270.0) max-Y) )

 
工作完成了一半,似乎我无法从“Bobj”那里获得边界框:
  1. (defun C:test ( / pt att BlockLst Bname Bent Bobj)
  2. (if
  3.         (setq pt (getpoint "\nPick insertion point"))
  4.         (progn
  5.                 (setq att (getvar 'attreq))
  6.                 (setq BlockLst (tblnext "BLOCK" T))
  7.                 (while BlockLst
  8.                         (setq Bname (cdr (assoc 2 BlockLst)))
  9.                         (setq Bent (tblobjname "block" bname))
  10.                         (setq Bobj (vlax-ename->vla-object Bent))
  11.                         (setvar 'attreq 0)
  12.                         (vl-cmdf "_.-insert" Bname "_S" 1.0 "_R" 0.0 "_non" pt "")
  13.                         (setvar 'attreq att)
  14.                         (setq BlockLst (tblnext "BLOCK"))
  15.                 )
  16.         );progn
  17. );if
  18. (princ)
  19. )

有什么想法吗?
编辑:
我附上了一个样本图纸:样本黑色预览。dwg,显示结果和所需内容。
编辑:
这张图更适合测试:树pln。图纸
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:49:10 | 显示全部楼层
下面是一些快速而肮脏的代码,但它完成了任务:
  1. ; PREVIEW BLOCKS in the drawing
  2. (defun C:test ( / pt att BlockLst Bname Bent Bobj SS ent vla-obj bbox mnPt mxPt currentY maxY blkcnt )
  3. (setvar 'CMDECHO 0)
  4. (if
  5.         (setq pt (getpoint "\nPick insertion point"))
  6.         (progn
  7.                 (setq att (getvar 'attreq))
  8.                 (setq BlockLst (tblnext "BLOCK" T)) ; check all blocks in the drawing and insert them on "pt"
  9.                 (while BlockLst
  10.                         (if
  11.                                 (and
  12.                                         (setq Bname (cdr (assoc 2 BlockLst)))
  13.                                         (setq Bent (tblobjname "block" bname))
  14.                                         (setq Bobj (vlax-ename->vla-object Bent))
  15.                                 )
  16.                                 (progn
  17.                                         (setvar 'attreq 0)
  18.                                         (vl-cmdf "_.-insert" Bname "_S" 1.0 "_R" 0.0 "_non" pt )
  19.                                         (setvar 'attreq att)
  20.                                 )
  21.                         )
  22.                         (setq BlockLst (tblnext "BLOCK"))
  23.                 )
  24.                 (if
  25.                         (setq SS (ssget "_C" pt pt '((0 . "INSERT")))) ; manually select all the inserted blocks
  26.                         (progn
  27.                                 (defun DtR (d) ( * PI (/ d 180.0)))
  28.                                 (setq maxY 0)
  29.                                 (repeat (setq i (sslength SS)) ; iterate trought selection to find maxY
  30.                                         (setq ent (ssname SS (setq i (1- i)))) ; current entity
  31.                                         (setq vla-obj (vlax-ename->vla-object ent))
  32.                                         (setq bbox (vla-getboundingbox vla-obj 'mn 'mx))
  33.                                         (setq mnPt (trans (vlax-safearray->list mn) 0 1) )
  34.                                         (setq mxPt (trans (vlax-safearray->list mx) 0 1) )
  35.                                         (setq currentY (- (cadr mxPt) (cadr mnPt)))
  36.                                         (if (> currentY maxY) (setq maxY currentY))
  37.                                 );repeat
  38.                                 (princ maxY) ; Found maxY
  39.                                
  40.                                 (command "_.erase" SS "") ; erase all inserted blocks
  41.                                 (setq blkcnt 0)
  42.                                 (setq BlockLst (tblnext "BLOCK" T)) ; check all blocks in the drawing and insert them on "pt" with incremented polar function
  43.                                 (while BlockLst
  44.                                         (setq blkcnt (+ blkcnt 1))
  45.                                         (if
  46.                                                 (and
  47.                                                         (setq Bname (cdr (assoc 2 BlockLst)))
  48.                                                         (setq Bent (tblobjname "block" bname))
  49.                                                         (setq Bobj (vlax-ename->vla-object Bent))
  50.                                                 )
  51.                                                 (progn
  52.                                                         (setvar 'attreq 0)
  53.                                                         (vl-cmdf "_.-insert" Bname "_S" 1.0 "_R" 0.0 "_non" (if (= blkcnt 1) pt (setq pt (polar pt (DtR 270.0) maxY))) )
  54.                                                         (setvar 'attreq att)
  55.                                                 )
  56.                                         )
  57.                                         (setq BlockLst (tblnext "BLOCK"))
  58.                                 )
  59.                         ); progn
  60.                 ) ; if
  61.                
  62.         ); progn
  63. );if
  64. (princ)
  65. )                               

我想不出还有什么。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:58:45 | 显示全部楼层
你的方法是合理的-另一种方法是迭代构成块定义的对象,并在插入每个块之前计算块定义的边界框,但你的方法同样有效(不过,你会收到动态块的意外结果-我在这里发布了一个更精确的函数来计算沼泽处块的边界框[你需要等到沼泽恢复后才能查看])。
 
以下是编写程序的另一种方法,供您参考:
  1. (defun c:bprev ( / bpt cnt doc idx llp lst obj spc urp vec )
  2.    (if (setq bpt (getpoint "\nSpecify insertion point: "))
  3.        (progn
  4.            (setq doc (vla-get-activedocument (vlax-get-acad-object))
  5.                  spc (vlax-get-property doc (if (= 1 (getvar 'cvport)) 'paperspace 'modelspace))
  6.                  bpt (trans bpt 1 0)
  7.            )
  8.            (vlax-for blk (vla-get-blocks doc)
  9.                (if (and (= :vlax-false (vla-get-islayout blk))
  10.                         (= :vlax-false (vla-get-isxref   blk))
  11.                         (not (wcmatch  (vla-get-name blk) "`**,`_*,*|*"))
  12.                    )
  13.                    (progn
  14.                        (setq obj (vlax-invoke spc 'insertblock bpt (vla-get-name blk) 1.0 1.0 1.0 0.0))
  15.                        (vla-getboundingbox obj 'llp 'urp)
  16.                        (setq idx (cons (cadr (mapcar '- (vlax-safearray->list urp) (vlax-safearray->list llp))) idx)
  17.                              lst (cons obj lst)
  18.                        )
  19.                    )
  20.                )
  21.            )
  22.            (setq vec  (list 0.0 (- (apply 'max idx)) 0.0)
  23.                  cnt '(0 0 0)
  24.            )
  25.            (foreach idx (vl-sort-i idx '>)
  26.                (vlax-invoke (nth idx lst) 'move '(0.0 0.0 0.0) (mapcar '* vec cnt))
  27.                (setq cnt (mapcar '1+ cnt))
  28.            )
  29.        )
  30.    )
  31.    (princ)
  32. )
  33. (vl-load-com) (princ)
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 18:04:58 | 显示全部楼层
你好,李,
你的代码是完美的。
我想知道这到底是怎么做到的,因为我试图通过将表对象转换为vla对象来获取边界框,并以这种方式获取边界框-但我遇到了一个错误。
 
  1.   (if (and (= :vlax-false (vla-get-islayout blk))
  2.                         (= :vlax-false (vla-get-isxref   blk))
  3.                         (not (wcmatch  (vla-get-name blk) "`**,`_*,*|*"))
  4.                    )

我再一次看到了这些我从未想过的细节。
 
我同意我的代码非常完善,它代表了我有限的lisp知识。
我将尝试分析您的代码中发生了什么,尽管它看起来非常复杂,即使我认为自己是一个中等技能的lisper。
再次感谢您!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:09:31 | 显示全部楼层
 
谢谢你,Grrr。
 
 
我在沼泽的代码(我在上面提供了一个链接)给出了一个完整的例子,说明了如何做到这一点(沼泽应该随时恢复在线!)。
 
 
不客气-如果您对发布的代码有任何进一步的问题,请随时询问。
 
回复

使用道具 举报

10

主题

895

帖子

887

银币

初来乍到

Rank: 1

铜币
49
发表于 2022-7-5 18:21:37 | 显示全部楼层
打开设计中心,打开绘图选项卡,双击块,完成。
回复

使用道具 举报

17

主题

1274

帖子

25

银币

后起之秀

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

铜币
260
发表于 2022-7-5 18:25:17 | 显示全部楼层
 
第二个!
 
我在宏中使用adcnavigate命令打开带有街道标志块的MUTCD图形中的设计中心。
节省时间。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 18:32:13 | 显示全部楼层
谢谢大家的建议!
但我实际上想在模型空间中插入图形中的所有块,以便于比较和用于其他目的。
第二个原因是编码部分(代码工作所需的方法并不常见),因此LM向我们展示了一些新的学习方法。
 
抱歉误解了,有时候我很难解释我想要达到的目标。
回复

使用道具 举报

17

主题

1274

帖子

25

银币

后起之秀

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

铜币
260
发表于 2022-7-5 18:45:20 | 显示全部楼层
 
没问题,我是李代码的超级粉丝。任何时候我都可以访问他的网站。提供选项以防万一。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 03:54 , Processed in 0.421313 second(s), 70 queries .

© 2020-2025 乐筑天下

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