访问动态块定义中的可见性特性
你好;我正在从事一个项目,该项目除其他外,必须确定块定义中实体的可见性特性任务是确定块参照在模型空间内的最大图形范围,但是由于我的代码没有考虑当前选定的可见性状态,具有多个可见性状态的块当前显示的范围更大
I';我想做的是将可见性状态名称传递给函数,让它将遇到的每个实体与状态名称进行比较,如果实体在该状态下不可见,则忽略它
通过这种方式,我可以将块名和可见性状态传递给函数,它将仅在该可见性模式下返回块的最大范围
计算最大范围的函数下面的代码片段,block参数是blockstable中的块定义,用于定义正在处理的引用
SubjectDwg是一种欺骗,允许将此脚本/例程作为批处理的一部分进行处理
可选#039;视图#039;参数是正在处理的当前块引用的可见性状态名称:有人知道如何在代码中获得条件语句来识别实体的可见性参数吗
Function GetExtents(Block As AcadBlock, SubjectDwg As AcadDocument, Optional View As String) As Double()
Dim Obj As AcadEntity
Dim MinExt(0 To 1) As Variant 'minimum bounding extents of block
Dim MaxExt(0 To 1) As Variant 'maximum bounding extents of block
Dim ObjMinExt As Variant
Dim ObjMaxExt As Variant
Dim TempArray() As Double
ReDim TempArray(0 To 3)
For Each Obj In Block
Select Case Obj.EntityName
Case "AcDbTable"
'ignore
Case "AcDbBlockReference"
TempArray = GetExtents(SubjectDwg.Blocks.Item(Obj.Name), SubjectDwg)
Case "AcDbPolyline", "AcDbLine", "AcDbArc", "AcDbCircle"
If UCase(Obj.Layer) Like "CENTRELINES" Or UCase(Obj.Layer) Like "*-C" Or UCase(Obj.Layer) Like "*-CLEAR" Then
'ignore
ElseIf obj.visilitystateView then #########################MaxExt(0) Then
MaxExt(0) = ObjMaxExt(0)
End If
If ObjMaxExt(1) > MaxExt(1) Then
MaxExt(1) = ObjMaxExt(1)
End If
If MinExt(0) > ObjMinExt(0) Then
MinExt(0) = ObjMinExt(0)
End If
If MinExt(1) > ObjMinExt(1) Then
MinExt(1) = ObjMinExt(1)
End If
End If
End Select
Next Obj
TempArray(0) = MinExt(0)
TempArray(1) = MinExt(1)
TempArray(2) = MaxExt(0)
TempArray(3) = MaxExt(1)
GetExtents = TempArray()
End Function
谢谢
我不确定我是否完全理解您的问题,但在我看来,您的代码在逻辑上是错误的(如果函数中的AcadBlock参数不是ModelSpace或PaperSpace):1。块定义的范围不一定与块引用相同。例如,块定义可以有几个具有很短标记字符串的属性定义,而相应的属性引用可以有很长的值字符串,甚至块引用也可以有没有匹配属性定义的属性引用,或者根本没有属性引用。这很可能会使块参照的范围与块定义不同。此外,您需要考虑到块参照可以缩放/旋转,这也会导致与块定义不同的范围;s、 没有API可用于访问块定义中的动态设计,因此您的代码注释<;=这个条件语句需要工作&引用;不可行
如果您的目标是了解动态块参照的所有可能范围,那么这相当简单:获取块参照中可用的动态特性名称列表(请记住,其他动态特性而非可见性也可能导致不同的范围)
一个接一个地遍历属性并设置它,然后获得块参照的范围
当然,如果多个动态特性的组合可能会导致不同程度的结果,那么事情就相当复杂,这将由您来发现
在简单的情况下(假设您只有一个属性/可见性和一系列值),然后可以执行此操作(伪代码):
Dim originalVal as Object
Dim propVals()as ObjectDim i as Integer
Dim j as IntegerDim prop as AcadDynamicBlockReferenceProperty
Dim props as Variant
获取属性/可见性的值列表。GetDynamicBlockProperties()
用于i=0到Ubound(props)
 ;道具=道具 ;如果是道具。PropertyName=[目标属性],然后   ;对于j=0到Ubound(属性允许值)     ;Redim Preserve propVals(j)     ;属性(j)=属性。允许值(j)   ;下一步   ;退出 ;结束If下一步
//循环通过属性/可见性状态作为对象的暗状态
,对于i=0到Ubound(propVals)
 ;设置状态=属性(i) '' 获取块参考#039;s属性/价值可见性 
 '' 获取块参考';s区段在此状态下下 大家好,诺曼,目的是找到当前可见状态的块范围-在这种情况下,可见性状态指的是面板安装的控件或连接器的正面、顶部、底部和侧面标高,但我只需要知道正面标高的范围,以便进行面板布局
我理解你关于属性的论点,但是在这个例子中,属性是不相关的,尽管我没有';t在原问题中陈述。缩放比例应为';t应适用于预期用途,并且在代码的另一部分中允许旋转
代码';当前编写的(即没有我的注释行)将返回所有可能的范围,因为它忽略了可见性参数,但由于块的动态性质,它会抛出错误值,因为它';s获取非';t需要
您的第二点令人失望,因为这意味着对该项目进行了重大反思,可能是想找到一种询问块参照而不是定义的方法,或者使用Autocad创建的匿名块来表示动态块参照 
回到回到绘图板上,我想。。 更新:离开这个问题一段时间后,我从另一个角度重新审视了它
目标是找到块的最大和最小范围,因此考虑到这一点,我决定分解块参考将解决可见性状态并丢弃任何不可见的几何体,然后可以以常规方式进行评估 ;由于分解方法使原始块不受影响,因此在新分解的对象';我被审问了。
您可以使用GetBoundingBox方法来查找块的范围,但您将再次遇到动态块的问题;如果一个元素有一个;移动“&引用;拉伸&引用;比例尺;。。。。。。。。。etc动态特性。每个块参照的边界框将不同,即使它基于相同的块定义。 查看与每个块引用关联的匿名BlockTableRecord(ABTR),无需与任何动态块API交互。ABTR持有所有块实体的副本,您可以查看它们的可见性属性
伪:
get block references
get block definition (regardless of dynamic or other)
go through the entities getting visibility and grow your bounding box
-skip non constant attributes
transform bounding box by block ref transform
go through attribute collection, grow bounding box for each visible attribute
~et voila~ 只是为了好玩,这里';这是一个c实现,我没有';t用属性测试它。我只测试了它的可见度,效果很好。享受吧
   [命令方法#40&引用;getbrExtents“)]
br.AttributeCollection中的对象id#41
页:
[1]