乐筑天下

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

用VBA重定义块。。

[复制链接]

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-3-19 12:04:49 | 显示全部楼层 |阅读模式
您好,
有一个程序,可以创建一个块,添加一个属性表,然后插入它,现在一切都可以正常工作了(感谢所有以前帮助过我的人)…
但是如果图形中已经有一个相同类型的块引用,我想用用户输入的新信息重新定义它,而不是添加到它,这似乎是在程序中做的…
,当用户表单加载时,它会检查块是否存在,并用其属性值填充用户表单,这很好,这允许用户编辑块中的信息,而不是每次都重新开始,但当用户完成程序并插入块时,它是现有和新信息的almagamma。有什么想法吗

回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-3-19 14:15:05 | 显示全部楼层
如果图形中已经有块参照,您可以执行一些不同的操作…a)重命名旧块参照[b],这是最理想的
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-3-19 14:18:07 | 显示全部楼层
唐#039;我现在没有时间测试它,但请为该DWG中的每个blkref尝试一个。mspace;如果blkref。名称=“”;x“;然后 blkref。更新;如果下一个blkref,则结束
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-3-19 15:28:31 | 显示全部楼层
用户只是在更改属性信息,还是图形本身在更改
为什么要重新定义块定义?
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-3-19 16:17:40 | 显示全部楼层
在将数据添加到块之前,请尝试此功能
  1. Function CleanoutBlock(currentBlock As AcadBlock)
  2.     Dim blkItem As AcadEntity
  3.     For Each blkItem In currentBlock
  4.         blkItem.Delete
  5.     Next blkItem
  6. End Function

回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-3-20 05:58:32 | 显示全部楼层
您好,
到目前为止,我已经在我的程序中尝试过这一点……(SSetX是它在用户表单加载时创建的一个选择集,用于检查现有块……
  1. 'Redefine current block info if chart exists..
  2. Dim BlK As AcadBlockReference
  3. Dim EntX As AcadEntity
  4. If SSetX.Count > 0 Then
  5.     For Each BlK In SSetX
  6.         If BlK.Name = "Fixings_Chart" Then
  7.             For Each EntX In BlK
  8.                 EntX.Delete
  9.             Next EntX
  10.         End If
  11.     Next BlK
  12. End If
它标记一个错误,表示对象不'我不支持这种方法,这显然是指BlockRef,如果我想访问其中的实体,它应该是一个块而不是一个块引用……那么我该从这里走到哪里
我也喜欢基思's函数:
  1. Function CleanoutBlock(currentBlock As AcadBlock)
  2.     Dim blkItem As AcadEntity
  3.     For Each blkItem In currentBlock
  4.         blkItem.Delete
  5.     Next blkItem
  6. End Function
但是在添加新数据之前,如何从代码中调用函数呢
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-3-20 08:31:12 | 显示全部楼层
我不知道'我不知道你的具体情况,但你的代码有一些潜在的问题,也许我们可以解决
显然,使用您提供的代码,您正在选择图形中的所有块,然后遍历它们。如果要编辑块参照,必须编辑块定义。如果编辑块定义,它将自动反映在所有块参照中,因此无需迭代图形中的所有块参照。使用您提供的代码,如果有效,它将为图形中插入的每个块实例反复重新定义同一块。这是不必要的,也不需要重复相同的程序
之前您说过,您有将项目放入块的代码,但您没有't没有代码从块中删除项。我提供的代码从作为参数传递给函数的块中删除了所有项。但必须传递AcadBlock,而不是AcadBlockReference
下载我在上一个线程中发布的模块并将其导入到您的项目中(在项目浏览器中右键单击并单击导入文件),然后将此代码添加到表单加载事件中
  1. Dim Blk As AcadBlock
  2. If acBlock.BlockExists("Fixings_Chart").Exists = True Then
  3.   Set Blk = ThisDrawing.Blocks.Item("Fixings_Chart")
  4.   CleanoutBlock Blk '<-- call the CleanoutBlock function here
  5. End If
  6. 'Add code here to put the new entities in the block
  7. 'Blk.Addxxx functions to add the entities as needed
将此代码作为新函数添加到表单中[代码您可以提供更多的代码,我们可以为您指出错误所在。
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-3-20 09:06:55 | 显示全部楼层
谢谢Keith,感谢你抽出时间来做这件事(也感谢其他人)……我完全按照你说的做了,它插入的新实例看起来完全是它应该做的,而不是新旧元素的混合……唯一的一点是,所有现有的块插入都是&#039;t改变了,看起来仍然像再次运行程序之前一样
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-3-20 09:11:49 | 显示全部楼层

然后你还有其他事情要做……这些可能已经被编辑并保存为动态块了吗?如果是这样,它们可能无法正确更新……或者您应该重新生成所有视图
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-3-20 09:41:19 | 显示全部楼层
啊,如果我重新生成,则块的图形性质会更新,但属性不会更新。如果用户从列表中删除了属性的数量,则这些属性仍保留在块中,以便表具有正确的行数,但是属性的数量不正确(有些超出了表的范围)
我会发布我的完整代码,但它超过了每个帖子的字符限制。也许,无论如何,把代码放在不同的帖子上,会有所帮助
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-5 02:05 , Processed in 0.550741 second(s), 73 queries .

© 2020-2025 乐筑天下

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