乐筑天下

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

访问动态块定义中的可见性特性

[复制链接]

8

主题

15

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
51
发表于 2017-1-11 07:36:45 | 显示全部楼层 |阅读模式
Hiya
我正在研究一个项目,该项目必须确定块定义中实体的可见性属性。
任务是确定模型空间中块参照的最大绘制范围,但是由于我的代码未考虑当前所选的可见性状态,因此具有多个可见性状态的块当前以更大的范围显示。
我想做的是将可见性状态名称传递给函数,并让它将遇到的每个实体与状态名称进行比较,如果实体在该状态下不可见,请忽略它。
这样,我可以将块名称和可见性状态传递给函数,并且它将仅在该可见性模式下返回块的最大范围。
计算最大范围的函数下面的代码片段,
块参数是块表中的块定义,用于定义正在处理的引用。
SubjectDwg是一种作弊,允许将此脚本/例程作为批处理的一部分进行处理。
可选的“view”参数是正在处理的当前块引用的可见性状态名称:
有没有人知道我如何在代码中获取条件语句来识别实体的可见性参数?
  1. Function GetExtents(Block As AcadBlock, SubjectDwg As AcadDocument, Optional View As String) As Double()
  2. Dim Obj As AcadEntity
  3. Dim MinExt(0 To 1) As Variant 'minimum bounding extents of block
  4. Dim MaxExt(0 To 1) As Variant 'maximum bounding extents of block
  5. Dim ObjMinExt As Variant
  6. Dim ObjMaxExt As Variant
  7. Dim TempArray() As Double
  8. ReDim TempArray(0 To 3)
  9. For Each Obj In Block
  10.     Select Case Obj.EntityName
  11.             Case "AcDbTable"
  12.                 'ignore
  13.             Case "AcDbBlockReference"
  14.                 TempArray = GetExtents(SubjectDwg.Blocks.Item(Obj.Name), SubjectDwg)
  15.             Case "AcDbPolyline", "AcDbLine", "AcDbArc", "AcDbCircle"
  16.                 If UCase(Obj.Layer) Like "CENTRELINES" Or UCase(Obj.Layer) Like "*-C" Or UCase(Obj.Layer) Like "*-CLEAR" Then
  17.                  'ignore
  18.                 ElseIf obj.visilitystate  View then #########################  MaxExt(0) Then
  19.                         MaxExt(0) = ObjMaxExt(0)
  20.                     End If
  21.                     If ObjMaxExt(1) > MaxExt(1) Then
  22.                         MaxExt(1) = ObjMaxExt(1)
  23.                     End If
  24.                     If MinExt(0) > ObjMinExt(0) Then
  25.                         MinExt(0) = ObjMinExt(0)
  26.                     End If
  27.                     If MinExt(1) > ObjMinExt(1) Then
  28.                         MinExt(1) = ObjMinExt(1)
  29.                     End If
  30.                 End If
  31.         End Select
  32. Next Obj
  33. TempArray(0) = MinExt(0)
  34. TempArray(1) = MinExt(1)
  35. TempArray(2) = MaxExt(0)
  36. TempArray(3) = MaxExt(1)
  37. GetExtents = TempArray()
  38.         
  39. End Function

感谢
G

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

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

铜币
238
发表于 2017-1-11 11:44:23 | 显示全部楼层
我不确定我是否完全理解你的问题,但在我看来,你的代码在逻辑上是错误的(如果函数中的AcadBlock参数不是ModelSpace或PaperSpace):
1.块定义的范围不一定与块引用相同。例如,块定义可以有一些属性定义,具有非常短的标记字符串,而相应的属性引用可以具有非常长的值字符串,或者甚至块引用可以具有没有匹配属性定义的属性引用,或者根本没有属性引用。这很可能会使块引用的范围与块定义不同。此外,还需要考虑到块参照可以缩放/旋转,这也会导致与块定义不同的范围。
2. 在块定义中没有可用于访问动态设计的 API,因此您的代码注释“
如果您的目标是了解动态块引用的所有可能范围,则非常简单:
1. 在块引用中获取可用的动态属性名称列表(请记住,其他动态属性而不是可见性也可能导致不同的范围);
2. 逐个遍历属性并进行设置,获取块引用的范围。
当然,如果多个动态属性的组合可能导致不同的程度,那么事情就相当复杂,这取决于你来找出答案。
在简单的情况下(假设您只有一个属性/可见性和值列表),然后您可以执行此操作(伪代码):
Dim originalVal as Object
Dim propVals() As Object
Dim i as Integer
Dim j As Integer
Dim props As AcadDynamicBlockReferenceProperty
Dim props As Variant
//Get the value list of the property/Visibility
props=TheBlockRef.GetDynamicBlockProperties()
For i=0 To Ubound(props)
prop=props
    如果道具。PropertyName=[The target property] Then
For j=0 To Ubound(prop.AllowedValues)
Redim Preserve propVals(j)
propVals(j)=prop.AllowedValues(j)
Next
Exit For
End If
Next
//Loop through the priperty/visibility state
Dim state as object
For i=0 to Ubound(propVals)
set state=propVals(i)
'' 获取块引用的属性/对值
的可见性 '' 获取此状态
下的块引用的范围 下一页
回复

使用道具 举报

8

主题

15

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
51
发表于 2017-1-11 12:06:53 | 显示全部楼层
嗨,Norman,
目的是找到当前可见状态的块范围-在这种情况下,可见性状态指的是面板安装控件或连接器的正面、顶部、底部和侧面标高,但我只需要知道面板布局的正面标高范围
我理解你关于属性的论点-但是在这种情况下,属性是不相关的,尽管我在原始问题中没有说明这一点。缩放不应应用于预期用途,并且在代码的另一部分中允许旋转
当前编写的代码(即没有注释行)已经返回了所有可能的范围,因为它忽略了可见性参数,但由于块的动态特性,它在获取不需要的视图/方向范围时抛出了假值
您的第二点令人失望,因为这意味着对该项目进行了相当大的重新思考,也许是为了找到一种询问块参照而不是定义的方法-或者通过使用Autocad创建的匿名块来表示动态块参照。。?
回到绘图板上,我想。。
回复

使用道具 举报

8

主题

15

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
51
发表于 2018-4-26 08:33:51 | 显示全部楼层
更新:
离开问题一段时间后,我从另一个角度重新审视了它。
目标是找到块的最大和最小范围,因此考虑到这一点,我决定分解块参考将解析可见性状态并丢弃任何不可见的几何图形,然后可以以常规方式对其进行评估。 由于分解方法使原始块不受影响,因此在询问新的分解对象后,可以简单地将其删除。
回复

使用道具 举报

3

主题

213

帖子

6

银币

后起之秀

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

铜币
224
发表于 2018-4-26 13:06:43 | 显示全部楼层

您可以使用GetBoundingBox方法来查找块的范围,但是您将再次遇到动态块的问题; 如果一个元素具有“移动”,“拉伸”,“缩放”......。等动态属性。每个块参照的边界框将不同,即使它基于相同的块定义。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-4-19 09:33 , Processed in 1.521137 second(s), 63 queries .

© 2020-2025 乐筑天下

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