访问动态块定义中的可见性特性
Hiya我正在研究一个项目,该项目必须确定块定义中实体的可见性属性。
任务是确定模型空间中块参照的最大绘制范围,但是由于我的代码未考虑当前所选的可见性状态,因此具有多个可见性状态的块当前以更大的范围显示。
我想做的是将可见性状态名称传递给函数,并让它将遇到的每个实体与状态名称进行比较,如果实体在该状态下不可见,请忽略它。
这样,我可以将块名称和可见性状态传递给函数,并且它将仅在该可见性模式下返回块的最大范围。
计算最大范围的函数下面的代码片段,
块参数是块表中的块定义,用于定义正在处理的引用。
SubjectDwg是一种作弊,允许将此脚本/例程作为批处理的一部分进行处理。
可选的“view”参数是正在处理的当前块引用的可见性状态名称:
有没有人知道我如何在代码中获取条件语句来识别实体的可见性参数?
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
感谢
G
**** Hidden Message ***** 我不确定我是否完全理解你的问题,但在我看来,你的代码在逻辑上是错误的(如果函数中的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= 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)
'' 获取块引用的属性/对值
的可见性 '' 获取此状态
下的块引用的范围 下一页
嗨,Norman,
目的是找到当前可见状态的块范围-在这种情况下,可见性状态指的是面板安装控件或连接器的正面、顶部、底部和侧面标高,但我只需要知道面板布局的正面标高范围
我理解你关于属性的论点-但是在这种情况下,属性是不相关的,尽管我在原始问题中没有说明这一点。缩放不应应用于预期用途,并且在代码的另一部分中允许旋转
当前编写的代码(即没有注释行)已经返回了所有可能的范围,因为它忽略了可见性参数,但由于块的动态特性,它在获取不需要的视图/方向范围时抛出了假值
您的第二点令人失望,因为这意味着对该项目进行了相当大的重新思考,也许是为了找到一种询问块参照而不是定义的方法-或者通过使用Autocad创建的匿名块来表示动态块参照。。?
回到绘图板上,我想。。 更新:
离开问题一段时间后,我从另一个角度重新审视了它。
目标是找到块的最大和最小范围,因此考虑到这一点,我决定分解块参考将解析可见性状态并丢弃任何不可见的几何图形,然后可以以常规方式对其进行评估。 由于分解方法使原始块不受影响,因此在询问新的分解对象后,可以简单地将其删除。
您可以使用GetBoundingBox方法来查找块的范围,但是您将再次遇到动态块的问题; 如果一个元素具有“移动”,“拉伸”,“缩放”......。等动态属性。每个块参照的边界框将不同,即使它基于相同的块定义。
页:
[1]