多行属性绘制顺序
好的,我一直在考虑设置我们的大部分块,以便在有意义的块中使用多行属性。我遇到的问题是,当我通过. net插入块时,多行属性会出现在ALL linework之上。这根本不适合我。所以我开始四处挖掘,发现这是一个相当常见的问题。Kean Walmsley在C中有一个不错的帖子,我能够将其全部转换并使其大部分工作,但多行属性无论如何都不会改变Draworder。下面是我正在使用的函数的当前迭代,我将线条放在顶部,而不是将属性发送到后面。起初,我认为我错过了一些东西,因为我正在尝试“修复”它是一个动态块,但是,它工作得很好,除非尝试将线条放在多行属性的顶部。我已经验证了该块设置正确。你们中有人对您的任何块这样做吗?或者有没有一种方法可以创建一个不断变化的wipeout,根据多行属性调整高度和宽度?我试图副歌从标题孵化背景路线,我不认为我想开始在所有属性周围设置边界。不过,开放的建议和想法。Private Shared Function _MoveLineTop(_Trans As Transaction, _IDColl As ObjectIdCollection) As ObjectIdCollection
Dim _BlkRecIDColl = New ObjectIdCollection()
Dim _SpecClass = RXClass.GetClass(GetType(Line))
Dim _BTRIDs = New ObjectId(_IDColl.Count - 1) {}
_IDColl.CopyTo(_BTRIDs, 0)
For Each _BlkTblRecID As ObjectId In _BTRIDs
Dim _BlkTblRec = DirectCast(_Trans.GetObject(_BlkTblRecID, OpenMode.ForWrite), BlockTableRecord)
Dim _Line = New ObjectIdCollection()
For Each _ID As ObjectId In _BlkTblRec
Dim _AttEnt = DirectCast(_Trans.GetObject(_ID, OpenMode.ForRead), Autodesk.AutoCAD.DatabaseServices.Entity)
If _AttEnt.GetRXClass().IsDerivedFrom(_SpecClass) Then
_Line.Add(_ID)
End If
Next
If _Line.Count > 0 Then
Dim _DOTbl = DirectCast(_Trans.GetObject(_BlkTblRec.DrawOrderTableId, OpenMode.ForWrite), DrawOrderTable)
_DOTbl.MoveToTop(_Line)
Dim _BlkRefIDs = _BlkTblRec.GetBlockReferenceIds(False, False)
For Each btrBrId As ObjectId In _BlkRefIDs
_BlkRecIDColl.Add(btrBrId)
Next
Else
_IDColl.Remove(_BlkTblRecID)
End If
Next
Return _BlkRecIDColl
End Function
**** Hidden Message ***** 如果您感兴趣的块是动态块,您可能会遇到与我相同的问题,我在这里写道:
http://drive-cad-with-code.blogspot.ca/2013/11/draw-order-problem-with-dynamic-block.html
正如我在文章中所猜测的,当动态属性更改导致AutoCAD创建新的匿名块定义时,块创建逻辑可能遵循AutoCAD的所有者建议手动创建块:首先选择非属性实体,并按属性编辑对话框中列出的属性的倒序选择属性。因此,在创建新的匿名块定义时,属性(无论是否为MText)很可能是添加到块定义中的最后一个(或最后一个,如果有多个属性),因此,该属性将位于块定义的Draworder表的顶部。
也就是说,即使您在动态块定义中设置了正确的Draworder,属性draworder也可以被AutoCAD重置为“Top”,因为动态属性更改。我在文章中再次声称,这纯粹是我的猜测,但似乎有道理。 我明白你的意思,事实上我在寻找如何处理这个问题的时候偶然看到了你的文章...让我困惑的是,假设我选择将所有行都放在前面,这是可行的,只要它们不在我的multiline属性的“后面”,该属性在插入所需块的代码中内置了屏蔽。我很好奇这是否是由于块在插入时改变可见性状态后变成匿名的。如果是这种情况,那么我需要“编辑”匿名块而不是原始块吗?让我感到沮丧的是,如果我以“老式”的方式插入动态块,那么包括绘制顺序在内的一切都会正常工作,即使是在插入并更改可见性状态之后。考虑到目前只定义了两个状态,我可能需要重做我的块,从有问题的显示状态开始。稍后我会再多逛逛,看看我还能破坏些什么。 好了,我现在放弃了,至少对于带有背景遮罩的多行属性...因此,我决定使用标准的遮蔽,然后使用线性拉伸参数集,我可以在通过. Net插入块时相应地更改这些参数集。
由于我的设置方式,我对其他一些东西感到好奇。目前,我正在隐藏我正在使用的块中的遮蔽的线性拉伸参数的属性和夹点,但是我想知道,对于像这样的项目,关于隐藏像这样的东西有什么普遍的共识?我明白,如果用户覆盖了程序中输入的内容,他们“可能”需要对此进行调整,但是在手动编辑时,可以使用我的自定义命令来自动调整大小...谢谢!
页:
[1]