乐筑天下

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

[编程交流] 查找co的AutoLisp例程

[复制链接]

6

主题

47

帖子

41

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 18:50:04 | 显示全部楼层 |阅读模式
我是AutoLisp新手,非常感谢您的帮助。
 
我有数百张带有两个不同标题栏的图纸:
A) 图纸_Sheet_22X34
B) 图纸_Sheet_22X34-H
属性(标记、提示、值)的设置相同。唯一的区别是,一个是垂直排列,另一个是水平排列。
 
我需要遍历所有图形(没有命令提示),找到标题栏,并用以下内容替换某些属性值(用于修订属性):
 
A) 日期*“2015年6月29日”
日期*是标题栏修订区域中的日期属性之一。*代表一个数字,因此可以是DATE1、DATE2、DATE3、DATE4等。关键是找到合适的替代品。
 
B) 描述*“基线更新-101/111翻新”
与DATE*相同,DESC*为DESC1、DESC2等。
 
REV1,DATE1和DESC1代表一个版本的一部分(REV2,DATE2和DESC2,第二个版本,等等),我需要找到DATE*和DESC*,并用上面的值替换这两个值。
 
标题栏的下角还有一个lone REV属性。为了找到要修改的正确日期*和描述*对,必须找到REV*属性值并与REV属性值匹配。这是例程能够找到要修改的正确修订属性的唯一方法,但标题栏的整体修订属性值应与其中一个修订*属性值匹配。
 
例如,REV2的值为26(版本26)。下角的REV属性也有值26,因此REV2是修订版,其中DATE2和DESC2的值需要替换为上述值。
 
这有意义吗?任何代码都将不胜感激。
 
标题栏已附加。
回复

使用道具 举报

6

主题

47

帖子

41

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 18:54:28 | 显示全部楼层
我忘了提。我附上的图纸是“空的”。版本信息没有任何值。因此,为了测试代码,必须添加一些值。水平边框可以容纳4个修订,我相信垂直边框可以容纳6个修订。
回复

使用道具 举报

5

主题

1074

帖子

1088

银币

初来乍到

Rank: 1

铜币
9
发表于 2022-7-5 18:57:18 | 显示全部楼层
欢迎来到CADTutor。
 
看看这个惊人的Lisp程序,其中至少有无数,非常慷慨地提供了李Mac,在他的网站上。。。
 
http://www.lee-mac.com/bfind.html
 
谢谢李!
回复

使用道具 举报

6

主题

47

帖子

41

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 19:02:35 | 显示全部楼层
爸爸,谢谢你。很高兴来到这里。
 
这是一个很好的Lisp程序。然而,它假设我知道查找和替换将发生在哪里,并且在每个实例中都是相同的。
 
在我的例子中,lisp例程必须首先确定要修改的版本,因为每个图形的版本都不同。所以我需要一个额外的部分来确定要查找替换的属性。
 
换句话说,它需要确定最新的修订版本。所以首先它必须读取REV的值,然后找到具有相同值的REV。假设REV的值为23,REV2的值也为23。因此,DATE2和DESC2是需要更新的属性。或者,如果REV的值为89,REV6的值为89,则需要更新属性DATE6和DESC6。每个图形都不一样,这就是为什么我需要一些东西来匹配REV和REV*(同样,REV*是属性REV1、REV2或REV3,等等,无论哪个与REV的值相同)。
回复

使用道具 举报

5

主题

1074

帖子

1088

银币

初来乍到

Rank: 1

铜币
9
发表于 2022-7-5 19:03:43 | 显示全部楼层
听起来你需要写点什么。
我希望你已经为李的网站添加了书签,因为那里有很多非常有用的Lisp,其中一些涉及属性同步,但可能不是你在这种情况下需要的。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 19:07:37 | 显示全部楼层
好的,答案在这里,但我没有它的书签和更换一个块属性是相当容易的,我知道我已经发表了意见,通过修订块搜索,寻找一个空白条目,并添加到下一个条目。使用“修订”在此处搜索。有一种按位置查看块属性的方法,假设您有一个3x4属性块,您可以查看值1、5和9等。我知道我在某处有代码。
 
但其他人也加入了进来。
回复

使用道具 举报

6

主题

47

帖子

41

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 19:12:13 | 显示全部楼层
比格尔,谢谢你。我搜索了这个论坛,但我似乎找不到任何像你所描述的内容。
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-5 19:12:21 | 显示全部楼层
 
 
简单,这里有一个问题,什么会优先?转速*或转速值?如果REV值是23,REV2是24,REV1是23,那么会怎样?将REV值更改为24,并更新DATE2和DESC2?或者删除REV2并更新DATE1和DESC1?
回复

使用道具 举报

12

主题

395

帖子

384

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-5 19:15:33 | 显示全部楼层
有人可以随意清理主功能,我不确定你是否有多个布局,但我已经编写了所有的子功能,所以。。。
 
  1. (defun c:test11 ( / )
  2. (if
  3.    (setq blockSS (ssget "X" (list (cons 0 "INSERT") (cons 2 "Drawing_Sheet_22x34"))))
  4.    (progn
  5.      (setq blockList (mapcar 'cadr (ssnamex blockSS)))
  6.      (setq attName (vla-get-tagstring (car (cb:matchAtts "REV" "REV" (vlax-ename->vla-object(car blockList))))))
  7.      (setq attNumber (substr attName (strlen attName) 1))
  8.    (cb:replaceAttributeValue (strcat "DATE" attNumber) "29-JUN-15" (vlax-ename->vla-object(car blockList)))
  9.    (cb:replaceAttributeValue (strcat "DESC" attNumber) "BASELINE UPDATE - 101/111 RENOVATIONS" (vlax-ename->vla-object(car blockList))))
  10.    )
  11. )
  12. (defun cb:matchAtts (baseAttName attPrefix Blk / )
  13. (setq baseAtt (car (vl-remove-if-not '(lambda (x) (= baseAttName (vla-get-tagstring x))) (cb:variantToList (vla-getattributes Blk)))))
  14. (vl-remove-if-not '(lambda (x)
  15.                (and
  16.                  (wcmatch (vla-get-tagstring x) (strcat attPrefix "*"))
  17.                  (not (eq (vla-get-tagstring x) baseAttName))
  18.                  (eq (vla-get-textstring x) (vla-get-textstring baseAtt))
  19.                  ))
  20.    (cb:variantToList (vla-getattributes Blk)))
  21. )
  22. (defun cb:variantToList (theVariant / )
  23. (if (= 'variant (type theVariant))
  24. (vlax-safearray->list (vlax-variant-value theVariant))
  25.    nil
  26.    )
  27. )
  28. ;;;;;Replace Attribute Value;;;;;;;;;
  29. ;;;;;By: CommandoBill;;;;;;;;;;;;;;;;;
  30. ;;;;;01/24/15;;;;;;;;;;;;;;;;;;;;;;;;
  31. ;;;;;Send a block to this function with an attribute you want to replace with a new value
  32. ;;;;attName = the name of the attribute which value you want to replace
  33. ;;;;attNewVal = the new value you want in the attribute
  34. ;;;;Blk = the vla-object verision of the block which the attribute is in
  35. (defun cb:replaceAttributeValue (attName attNewVal Blk / )
  36. (mapcar '(lambda (x) (if (= attName (vla-get-tagstring x))
  37.                  (vla-put-textstring x attNewVal))) (cb:variantToList (vla-getattributes Blk)))
  38. (princ)
  39.      )
回复

使用道具 举报

6

主题

47

帖子

41

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 19:21:11 | 显示全部楼层
REV优先,因为它总是有REV*的值,即我试图修改的日期*和DESC*。不会删除任何内容。可能存在具有空值的属性。例如:REV是23,REV2是23(因此我将只在所有属性中更新DATE2和DESC2),但REV4是空的(它还没有被使用,修订还没有达到那么高)。难点在于定位。我正在寻找的版本*将始终是图纸的最新版本,因此它将始终与版本匹配。但是它可以是任何一个REV*属性,这取决于标题栏中有多少修订。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-18 23:34 , Processed in 1.700565 second(s), 72 queries .

© 2020-2025 乐筑天下

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