乐筑天下

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

[编程交流] 顺序编号块att

[复制链接]

4

主题

10

帖子

6

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 07:41:19 | 显示全部楼层 |阅读模式
我已经搜索并找到了几个Lisp程序的词,但它们都不适用于我的block。我尝试使用以下方法:
 
  1. (defun c:mnum(/ stStr stNum nLen cAtr dLst blName
  2.          fLst blLst blSet aName sLst lZer aStr)
  3. (vl-load-com)
  4. (if
  5.    (and
  6.      (setq stStr(getstring "\nSpecify start number: "))
  7.      (setq stNum(atoi stStr))
  8.      (setq nLen(strlen stStr))
  9.      ); end and
  10.    (progn
  11.      (if
  12.    (and
  13.       (setq cAtr(nentsel "\nPick attribute > "))
  14.       (= "ATTRIB"(cdr(assoc 0(setq dLst(entget(car cAtr))))))
  15.      ); end and
  16.    (progn
  17.      (setq blName
  18.        (vla-get-Name
  19.           (vla-ObjectIDToObject
  20.          (vla-get-ActiveDocument
  21.             (vlax-get-acad-object))
  22.                (vla-get-OwnerID
  23.                   (vlax-ename->vla-object(car cAtr)))))
  24.        fLst(list '(0 . "INSERT")(cons 2 blName))
  25.        aName(cdr(assoc 2 dLst))
  26.        ); end setq
  27.      (princ "\n<<< Select blocks to number >>> ")
  28.      (if
  29.        (setq blSet(ssget fLst))
  30.        (progn
  31.         (setq sLst
  32.                    (mapcar 'vlax-ename->vla-object
  33.              (mapcar 'car
  34.               (vl-sort
  35.                (vl-sort
  36.                  (mapcar '(lambda(x)(list x(cdr(assoc 10(entget x)))))
  37.                    (vl-remove-if 'listp
  38.                              (mapcar 'cadr(ssnamex blSet))))
  39.                        '(lambda(a b)(<(caadr a)(caadr b))))
  40.                      '(lambda(a b)(>(cadadr a)(cadadr b)))))))
  41.         (foreach i sLst
  42.           (setq lZer "")
  43.           (repeat(- nLen(strlen(itoa stNum)))
  44.         (setq lZer(strcat lZer "0"))
  45.         ); end repeat
  46.           (setq atLst
  47.              (vlax-safearray->list
  48.             (vlax-variant-value
  49.               (vla-GetAttributes i))))
  50.           (foreach a atLst
  51.         (if
  52.           (= aName(vla-get-TagString a))
  53.              (vla-put-TextString a
  54.            (strcat lZer(itoa stNum)))
  55.           ); end if
  56.         ); end foreach
  57.         (setq stNum(1+ stNum))
  58.           ); end foreach
  59.          ); end progn
  60.        (princ "\nEmpty selection! Quit. ")
  61.        ); end if
  62.      ); end progn
  63.    (princ "\nThis isn't attribute! Quit. ")
  64.    ); end if
  65.      ); end progn
  66.    (princ "\nInvalid start number! Quit. ")
  67.    ); end if
  68. (princ)
  69. ); end of c:mnum
回复

使用道具 举报

11

主题

46

帖子

36

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
55
发表于 2022-7-6 08:02:43 | 显示全部楼层
我做过一些vb编程,但不多。使用上面的代码,我得到了一个运行时错误。“需要对象”
 
调试突出显示此行:
  1. Sub [color="red"]NameOfYourChoice[/color]()
  2.    ' We create our group codes and data values for our selection set.
  3.    Dim gpCode(1) As Integer
  4.    Dim dataValue(1) As Variant
  5.    Dim SS_Blk As AcadSelectionSet
  6.    Dim i As Integer, n As Integer
  7.   
  8.    SS_delete 1
  9.   
  10.    ' This is our filter.
  11.    ' We set the group codes and data values for what we want to find.
  12.    Set SS_blk = ThisDrawing.SelectionSets.Add("SS_blk")
  13.        gpCode(0) = 0: dataValue(0) = "INSERT"
  14.        gpCode(1) = 8: dataValue(1) = "[color="red"]layer entities are on[/color]"
  15.       
  16.    SS_blk.Select acSelectionSetAll, , , gpCode, dataValue
  17.        ' because VBA is object oriented, we have to create the references for our blocks
  18.        ' We create our blocks and the attributes in our blocks.
  19.        Dim Cur_Blk As AcadBlockReference
  20.        Dim Blk_Atts() As AcadAttributeReference
  21.        Dim Cur_Att As AcadAttributeReference
  22.       
  23.        ' This is where we make our loop
  24.        ' " For i ". " i " is equal to the item number in the selection set
  25.        ' until we get to the count of how many entities in SS_blk -1,
  26.        ' because our item count in a selection set starts at 0 not at 1
  27.        ' like in a collection.
  28.        For i = 0 To SS_blk.Count - 1
  29.            Set Cur_Blk = SS_Example.Item(i)
  30.            Blk_Atts = Cur_Blk.GetAttributes
  31.          
  32.            ' " For n ", " n ' is equal to the attribute number in the current block.
  33.            For n = 0 To UBound(Blk_Atts)
  34.                Set Cur_Att = Blk_Atts(n)
  35.               
  36.                If Cur_Att.TagString = "GROUPID" Then
  37.                    CurAtt.textstring = CurAtt.textstring + [color="red"]100[/color]
  38. ' if the attribute text string = 7 then +2 would put it at 9
  39.                End If
  40.            Next n
  41.        Next i
  42.       
  43.    Application.Update
  44. End Sub
  45. '-------------------
  46. Sub SS_delete(x As Byte)
  47.    If ThisDrawing.SelectionSets.Count > 0 Then
  48.    Dim i As Integer
  49.        On Error Resume Next
  50.        For i = 0 To ThisDrawing.SelectionSets.Count - 1
  51.            ThisDrawing.SelectionSets.Item(i).Delete
  52.        Next i
  53.        On Error GoTo 0
  54.    End If
  55. End Sub

 
我对这件事还不太熟悉。
回复

使用道具 举报

4

主题

10

帖子

6

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 08:06:58 | 显示全部楼层
 
对不起,我错过了一些东西。重新复制代码。我将SS_示例更改为SS_blk。
回复

使用道具 举报

11

主题

46

帖子

36

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
55
发表于 2022-7-6 08:21:54 | 显示全部楼层
只是一种调试问题的方法,我不使用If和progn方法,而是一步一步的方法和defuns,其他人会拒绝我,但它更容易找出代码不工作的地方,因为If中包含的代码不多。我经常做的是(普林斯“1”)等等,看看数字1,2,3在4之前停下来,这可能有助于了解它实际上停在哪里。否则,请在错误设置为on的情况下尝试VLIDE。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 08:41:11 | 显示全部楼层
 
 
这就是你的问题所在:代码正在寻找一个特定的块名。。。。。。
 
 
部分是正确的,这并不局限于您的块,而是因为您使用的是一个动态块,其中块名称在参数修改后更改为匿名名称。
 
在本例中(vla get Name…)将为您提供类似“*U2”的内容,(list“(0。“INSERT”)(cons 2 blName))将为您提供
((0。“插入”)(2。“*U2”))作为fLst的值。
 
更好地使用(vla get EffectiveName…)和(list“(0。“INSERT”)(cons 2(strcat blName”,`*U*”)(66.1))
 
把它们放在一起
 
[code](defun c:mnum(/str stNum nLen cAtr dLst blName fLst blLst blSet aName sLst lZer asr)(vl load com)[颜色=蓝色](defun _effname(ssobj bn/e selfil)(setq selfil(ssadd))(重复(sslength ssobj)(if(eq(vla get effectivename(vlax ename->vla object(setq e(ssname ssobj 0)))bn)(ssadd e selfil))(ssdel e ssbj))(if(zerop(sslength selfil))nilselfil))(if(and(setq stStr(getstring“\n指定开始编号:))(setq stNum(numberp(read stStr)))(setq nLen(strlen stStr)));end和(progn(if(和(setq cAtr(nentsel“\nPick属性>”))(=“ATTRIB”(cdr(assoc 0(setq dLst(entget(car cAtr);)))));结束和(progn(setq blName(vla get EffectiveName(vla ObjectIDToObject(vla get ActiveDocument(vlax get acad object))(vla get OwnerID(vlax ename->vla object(car cAtr)а)а)fLst(list’(0。“INSERT”)(cons 2(strcat blName“,`*U*”))(66.1))aName(cdr(assoc 2 dLst))); 结束setq(princ“\n>”)(如果(和[color](setq blSet(ssget fLst))(setq blSet(\u effname blSet blName)))(progn(setq sLst(mapcar“vlax ename->vla对象(mapcar”car(vl sort(vl sort(mapcar)”(lambda(x)(列表x(cdr)(assoc 10(entget x)]]))(vl remove if“listp(mapcar”cadr(ssnamex blSet)))(λ(a b)(
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 08:45:49 | 显示全部楼层
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-9 21:38 , Processed in 0.424799 second(s), 64 queries .

© 2020-2025 乐筑天下

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