乐筑天下

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

[编程交流] 向每个b添加新属性

[复制链接]

14

主题

40

帖子

26

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 12:20:42 | 显示全部楼层 |阅读模式
大家好,
 
如何在该图形中搜索没有名为“Handle\u ID”属性的块。如果没有,则在块中添加贡品。
 
我得到了这个:
  1. Sub test2()
  2. Dim attributeObj As AcadAttribute
  3. Dim BlockObj As AcadBlockReference
  4. Dim BlockObj2 As AcadBlock
  5.    For Each Elem In ThisDrawing.ModelSpace
  6.        With Elem
  7.            If StrComp(.EntityName, "AcDbBlockReference", 1) = 0 Then
  8.                If ((Elem.HasAttributes) And (Left(Elem.EffectiveName, 3) = "G_B") Or (Left(Elem.EffectiveName, 3) = "G_E") Or _
  9.                (Left(Elem.EffectiveName, 3) = "G_I") Or (Left(Elem.EffectiveName, 3) = "G_L")) Then
  10.                Handle = Elem.Handle
  11.                Dim InsertionPnt(0 To 2) As Double
  12.                InsertionPnt(0) = 0#: InsertionPnt(1) = 0#: InsertionPnt(2) = 0#
  13.                Set BlockObj = Elem
  14.                Set BlockObj2 = BlockObj [color=red]<-FIRST ERROR)[/color]
  15.                Set attributeObj = BlockObj2.AddAttribute(1, acAttributeModeInvisible, "HANDLE_ID", InsertionPnt, "HANDLE_ID", Handle) [color=red]<-SECOND ERROR)[/color]
  16.                ThisDrawing.SendCommand "_ATTSYNC" & vbCr & "NAME" & vbCr & Elem.EffectiveName & vbCr
  17.                End If
  18.            End If
  19.        End With
  20.    Next Elem
  21. End Sub


  1. Set BlockObj2  = ThisDrawing.Blocks(BlockObj.Name)

对于动态块
HTH公司
 
~'J'~
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 12:27:31 | 显示全部楼层
 
谢谢你的回复。但是你能把它放在一个工作过程中,同时检查Handle\u ID是否存在吗?如果没有,它会被添加到块中?
回复

使用道具 举报

14

主题

40

帖子

26

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 12:28:03 | 显示全部楼层
 
您需要检查现有的属性名(TagString)
而不是检查手柄
只需迭代属性-请参阅帮助文件中的Gettributes
这个论坛上也有很多代码示例
从另一方面来说,你可以用过滤器代替选择
通过所有图形对象循环
对不起,我现在没有足够的时间为您编写完整的解决方案
 
~'J'~
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 12:32:07 | 显示全部楼层
好的,我有几分钟的时间,所以我试着写得又快又脏
只是我无法在没有动态块的情况下测试它
希望这能让你有所了解
 
  1. Set BlockObj2  = ThisDrawing.Blocks(BlockObj.EffectiveName)

 
~'J'~
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 12:37:02 | 显示全部楼层
Thnx!我也尝试了一些东西,它也有效。。。我想我一点也不差:眨眼:
 
  1. Option Explicit
  2. Sub test2()
  3.    Dim attributeObj As AcadAttribute
  4.    Dim BlockObj As AcadBlockReference
  5.    Dim BlockObj2 As AcadBlock
  6.    Dim elem As AcadEntity
  7.    Dim Handle As String
  8.    Dim blockName As String
  9.    Dim collNames As New Collection
  10.    Dim i As Integer
  11.    Dim j As Integer
  12.    'collect just unique block names into collection
  13.    For Each elem In ThisDrawing.ModelSpace
  14.        If (TypeOf elem Is AcadBlockReference) Then
  15.            Set BlockObj = elem
  16.            With BlockObj
  17.                If ((.HasAttributes) And (Left(.EffectiveName, 3) = "G_B") Or (Left(.EffectiveName, 3) = "G_E") Or _
  18.                    (Left(.EffectiveName, 3) = "G_I") Or (Left(.EffectiveName, 3) = "G_L")) Then
  19.                    On Error Resume Next    ' to bypass error on duplicate name
  20.                    collNames.Add .EffectiveName, .EffectiveName
  21.                End If
  22.            End With
  23.        End If
  24.    Next elem
  25.    Dim InsertionPnt(0 To 2) As Double
  26.    InsertionPnt(0) = 0#: InsertionPnt(1) = 0#: InsertionPnt(2) = 0#
  27.    ' iterate trough collection
  28.    For i = 1 To collNames.Count
  29.        blockName = collNames.Item(i)
  30.        Set BlockObj2 = ThisDrawing.Blocks(blockName)
  31.        Set attributeObj = BlockObj2.AddAttribute(1, acAttributeModeInvisible, "New prompt", InsertionPnt, "NEW_TAG", "0")
  32.        With ThisDrawing
  33.            .SetVariable "CMDECHO", 0
  34.            .SendCommand "_ATTSYNC _N " & blockName & vbCr
  35.            .SetVariable "CMDECHO", 1
  36.            .Regen acAllViewports
  37.        End With
  38.    Next i
  39.    ThisDrawing.Regen acAllViewports
  40.    Dim ftype(1) As Integer
  41.    ftype(0) = 0: ftype(1) = 2
  42.    Dim fdata(1) As Variant
  43.    fdata(0) = "INSERT"
  44.    ' iterate trough collection again
  45.    For i = 1 To collNames.Count
  46.        blockName = collNames.Item(i)
  47.        fdata(1) = "`*," & blockName
  48.        Dim oSset As AcadSelectionSet
  49.       
  50.        With ThisDrawing.SelectionSets
  51.            While .Count > 0
  52.                .Item(0).Delete
  53.            Wend
  54.            Set oSset = .Add("$Blocks$")
  55.        End With
  56.       
  57.        oSset.Select acSelectionSetAll, , , ftype, fdata
  58.       
  59.        For Each elem In oSset
  60.            Set BlockObj = elem
  61.            Handle = elem.Handle
  62.            Dim atts() As AcadAttributeReference
  63.            Dim att As AcadAttributeReference
  64.            
  65.            With BlockObj
  66.                atts = .GetAttributes()
  67.                For j = 0 To UBound(atts)
  68.                    Set att = atts(j)
  69.                    If att.TagString = "NEW_TAG" Then
  70.                        att.TextString = CStr(Handle)
  71.                        '//Exit For
  72.                    End If
  73.                Next j
  74.                Exit For
  75.            End With
  76.            
  77.        Next elem
  78.       
  79.        '//oSset.Delete
  80.       
  81.    Next i
  82.    MsgBox "Get to work!"
  83. End Sub

 
只是看起来比你的简单多了
回复

使用道具 举报

14

主题

40

帖子

26

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 12:38:50 | 显示全部楼层
格伦科,
 
这个线程似乎与线程“句柄出了什么问题?”
 
这些线程中讨论的问题,以及RK McSwain发布的问题,对于任何试图将AutoCAD图形协调到外部数据库的人来说都很重要。
 
我要说的是,上面发布的过程是解决非持久性句柄问题的一种聪明方法,但令人沮丧的是,接受这样一个问题实际上存在。定制文档始终声明句柄在文档中是唯一的,并且保持不变。
 
我不怀疑你关于绘图和数据库之间协调中断的说法;然而,如果发生这种中断的图形中有一些共同的元素,则会带来一些安慰。
 
发生和未发生的地方有什么不同吗?
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 12:43:51 | 显示全部楼层
那个http://discussion1.autodesk.com/forums/thread.jspa?threadID=729961link,尽管有着相当对立的基调(或者我应该说泛音),但它提供了相当丰富的信息,并列出了几个可能导致手柄改变的原因。
 
WBLOCKing当然是一个很可能的候选者,并且可以在不太困难的情况下解决。
 
也:
 
恢复可能是另一个可能的原因,尽管如果这真的改变了手柄,我会有点恼火。
 
如果重新处理不是文档范围的,即只有图形的一个子集在更改,然后进行剪切和粘贴,甚至Lisp/VBA等,则可能需要检查程序。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 12:48:37 | 显示全部楼层
我唯一知道的是,图形中的所有句柄都已更改,但我无法复制它。这并不经常发生。只有我的一些同事。可能是在他们做一些不寻常的事情时。
 
我正忙于重建VBA例程,因为它对动态块的处理速度很慢,并且一些功能不能正常工作。我们还认为这是导致数据库空的原因。除了,这件事也发生在我身上!
 
如果你看附上的图片,你可以看到我的数据库是如何填写的。我只在图形中有新项(新句柄)时才向其添加记录。
 
注2的记录=!!删除!!是在图形中找不到的具有句柄(数据库中的唯一对象ID)的项。因此,如果我删除一个项目,数据库会将Note_2设置为!!删除!!。您可以看到,对于第一条记录(Object_ID=1A83B),类型和组为“P”和“355”。这是他的原始手柄的原始项目。
 
一些关于如何将手柄更改为1C431的信息。我从来没有复制、剪切、粘贴、wblock或其他什么。它是同一个图形中未更改的块。当我的数据库更新时,更改的句柄被视为新数据库,因此它将其添加到自身中。您可以在该记录中找到“P”和“355”,因为它们是根据该特定块的属性添加的。这个项目在我的画作中只有一次。
 
如您所见,每个项目都会发生这种情况,并将其再次添加到数据库中。其他信息(描述、供应商类型等)添加到数据库中,因此该数据不会添加到新记录中。
 
在我重建例程之前,我们不知道问题的原因,因为记录会立即从数据库中删除。现在我知道了问题所在(更改了句柄),所以我想通过将每个项添加到其自己的属性和数据库中来备份其句柄。现在我可以检查是否有更改的句柄。如果有,则用新句柄替换原始记录。
 
如果我构建正确,就不会有更多的空数据库,但还有一件事要做。。。为什么/什么时候我的把手变了??
回复

使用道具 举报

14

主题

40

帖子

26

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 12:49:07 | 显示全部楼层
你让我警觉起来。我已经设计了一个基于不变手柄的游戏计划,但现在将密切关注它。
 
坦率地说,基于Tony Tanzillo在Autodesk中提出的一些问题,我希望保持原样。讨论链接。最主要的是,在不复制ID的情况下复制对象的能力。如果在初始数据库构建之后执行额外工作,这是一个重要问题。
 
我确实想到了一件事,可以用Handle属性方法检查。仅仅向块/块引用添加额外属性的行为是否会改变实体的句柄?这可能与区块有关;参考文献可能没有这么多。
132045pgiexykv97bvj9yr.jpg
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 12:56:00 | 显示全部楼层
 
如果我正确理解你的意思。
 
AddAttribute操作是在我发现句柄已更改后添加的。即使很难,当我使用addattribute时,块的句柄保持不变。
 
可以肯定的是:我对属性的句柄不感兴趣。我对包含几个属性的块his handle感兴趣。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 06:16 , Processed in 0.375750 second(s), 74 queries .

© 2020-2025 乐筑天下

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