明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2913|回复: 8

[符号表] 请大家帮看一下关于块属性的代码问题?[OK]

[复制链接]
发表于 2011-4-7 08:40:13 | 显示全部楼层 |阅读模式
本帖最后由 wolunli 于 2011-4-13 15:59 编辑

请大家帮看一下下面关于块属性问题的代码,问题是这样的,下面的代码是个创建属性块并插入属性块参考的代码,如果块已经创建则直接插入属性块参考,测试发现这段代码可用,但有一个问题无法解决,就是属性块参考插入后块立刻会显示但属性值会过一会都会显示出来,等待的时间不等,在这期间可进行AutoCAD的各种操作,但此时不能移动该块,否则块的属性位置不跟着移动。请各位高手帮看一下是那里出了问题?谢谢大家了!

Public Function addBG(ByVal insPoint As Point3d, ByVal bnameStr As String)
        Dim db As Database = HostApplicationServices.WorkingDatabase
        Dim blockId As ObjectId = ObjectId.Null
        Dim mrecord As New BlockTableRecord()
        mrecord.Name = "JLQBG"
        Dim doc As Document = acadApp1.DocumentManager.MdiActiveDocument
        Using doc.LockDocument
            Using trans As Transaction = db.TransactionManager.StartTransaction()
                Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForWrite)
                If bt.Has("JLQBG") = False Then
                    Dim pt1, pt2 As Point3d
                    Dim h As Integer = 800
                    For I As Integer = 0 To 6
                        If I = 6 Then h = 1500
                        pt1 = New Point3d(0, h * I, 0)
                        pt2 = New Point3d(5000, h * I, 0)
                        Dim kLine As Line = New Line(pt1, pt2)
                        mrecord.AppendEntity(kLine)
                    Next
                    h = 5000
                    Dim y1, y2 As Integer
                    For J As Integer = 0 To 2
                        If J = 0 Then y1 = 0 : y2 = 3200
                        If J = 1 Then y1 = 3200 : y2 = 4000
                        If J = 2 Then y1 = 4000 : y2 = 9000
                        For I As Integer = 0 To 1
                            pt1 = New Point3d(h * I, y1, 0)
                            pt2 = New Point3d(h * I, y2, 0)
                            Dim kLine As Line = New Line(pt1, pt2)
                            mrecord.Origin = insPoint
                            mrecord.AppendEntity(kLine)
                        Next
                    Next


                    Dim bzStr()() As String = {New String() {"3350", "边缘构件编号", "GAZ0", "编号"}, _
                                                            New String() {"2550", "标高范围", "-0.030~4.470", "标高"}, _
                                                            New String() {"1750", "角部钢筋", "8%%13216", "角筋"}, _
                                                            New String() {"950", "中部钢筋", "8%%13212", "中筋"}, _
                                                            New String() {"150", "箍筋直径间距", "8%%13216", "箍筋"}}
                    For I As Integer = 0 To 4
                        Dim attdef As New AttributeDefinition
                        With attdef
                            .Position = New Point3d(2500, bzStr(I)(0), 0)
                            .Height = 450
                            .Rotation = 0
                            .WidthFactor = 0.6
                            .HorizontalMode = TextHorizontalMode.TextCenter
                            .VerticalMode = TextVerticalMode.TextBottom
                            .AlignmentPoint = New Point3d(2500, bzStr(I)(0), 0)
                            .Prompt = bzStr(I)(1)
                            .TextString = bzStr(I)(2)
                            .Tag = bzStr(I)(3)
                            .Invisible = False
                            .Verifiable = False
                            .Preset = False
                            .Constant = False
                            '.IsMTextAttributeDefinition = True
                        End With
                        mrecord.Origin = insPoint
                        mrecord.AppendEntity(attdef)
                    Next
                    blockId = bt.Add(mrecord)
                    trans.AddNewlyCreatedDBObject(mrecord, True)

                End If
                trans.Commit()
            End Using
        
            Using trans As Transaction = db.TransactionManager.StartTransaction()
                Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForWrite)
                Dim blockRef As BlockReference = New BlockReference(insPoint, bt("JLQBG"))
                blockRef.ScaleFactors = New Scale3d(1, 1, 1)
                blockRef.Rotation = 0
                Dim btr As BlockTableRecord = trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite)
                btr.AppendEntity(blockRef)
                trans.AddNewlyCreatedDBObject(blockRef, True)
                mrecord = trans.GetObject(bt("JLQBG"), OpenMode.ForRead)
                Dim iterator As BlockTableRecordEnumerator = mrecord.GetEnumerator()
                If mrecord.HasAttributeDefinitions Then
                    While iterator.MoveNext
                        Dim obj As DBObject = trans.GetObject(iterator.Current, OpenMode.ForRead)
                        Dim att As New AttributeReference()
                        If TypeOf (obj) Is AttributeDefinition Then
                            Dim attdef As AttributeDefinition = obj
                            att.SetAttributeFromBlock(attdef, blockRef.BlockTransform)
                            att.Position = attdef.Position + blockRef.Position.GetAsVector()
                            Select Case attdef.Tag
                                Case "编号"
                                    att.TextString = outStr(0)
                                Case "标高"
                                    att.TextString = outStr(1)
                                Case "角筋"
                                    att.TextString = outStr(2)
                                Case "中筋"
                                    att.TextString = outStr(3)
                                Case "箍筋"
                                    att.TextString = outStr(4)
                            End Select
                            If Not blockRef.IsWriteEnabled Then
                                blockRef.UpgradeOpen()
                            End If
                            blockRef.AttributeCollection.AppendAttribute(att)
                        End If
                    End While
                End If
                trans.Commit()
            End Using
        End Using
        db.Dispose()
        Return blockId
    End Function
发表于 2011-4-7 09:40:17 | 显示全部楼层
沙发......
 楼主| 发表于 2011-4-10 17:44:51 | 显示全部楼层
没有人帮忙看一下啊?
 楼主| 发表于 2011-4-12 15:43:24 | 显示全部楼层
请各位大侠帮看一下呀?
发表于 2011-4-13 12:35:07 | 显示全部楼层
本帖最后由 sailorcwx 于 2011-4-13 12:35 编辑

在blockRef.AttributeCollection.AppendAttribute(att)后面添加trans.AddNewlyCreatedDBObject(att, True)

评分

参与人数 1金钱 +20 收起 理由
wolunli + 20

查看全部评分

 楼主| 发表于 2011-4-13 15:59:00 | 显示全部楼层
回复 sailorcwx 的帖子

感谢sailorcwx兄,试过!立即生效!非常感谢,困扰了好久,太感谢了!
发表于 2011-5-6 10:45:19 | 显示全部楼层
回复 sailorcwx 的帖子

哈哈,我也遇到了这个问题,感谢感谢
发表于 2012-2-22 21:08:44 | 显示全部楼层
学习了多谢
发表于 2012-2-23 10:04:01 | 显示全部楼层
很好,学习了。终于会创建块了。

谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 19:32 , Processed in 0.236184 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表