明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4148|回复: 6

[图元] vb.net将外部带属性的块参照插入当前文件

[复制链接]
发表于 2011-8-18 19:40:33 | 显示全部楼层 |阅读模式
本帖最后由 fullwolf 于 2011-8-18 19:55 编辑

这是根据坐标文件格式将数据读出并展绘在图上,点位可以是圆和块。
     在论坛上找了好久也没有关于vb.net的外部块插入代码,自己试了好多次,试出来了,第一次用netapi,是引用的2011的dll,在2006上不能运行,不知怎么回事,我是个新手。

代码如下:恳请老师们指正,我总感觉代码有问题。最好给提些意见,将非常感谢。
发现了一个问题。我将块插入到图中以后,发现属性的确是按照我设定的textstring和alighpoint显示。但是我用cad自带的插入块后,怎么也改变了。比如:没运行程序时,用插入块会显示一个属性输入的框,提示输入属性【height】值,此时的默许值是空的,并且插入以后,属性字与点位的距离也是默认的。但是运行程序后,再插入块,也提示输入属性,但是默许值是一个数字,好像程序运行的最后一个数据的值,而且属性对齐点也变成我设定的值了。
难道改块的属性连系统里面的块也改了?

不知我说没说明白,请老师帮帮我,谢谢。




  
  1. Private Sub b1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles b1.Click
  2.         Dim blockpath As String = IO.Path.GetDirectoryName(Reflection.Assembly.GetExecutingAssembly.Location) & "\" & TextBox2.Text & ".dwg"
  3.         MsgBox(blockpath)
  4.         Dim blockname As String = TextBox2.Text
  5.         Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  6.         Dim db As Database = doc.Database
  7.         Using trans As Transaction = db.TransactionManager.StartTransaction
  8.             Dim ldoc As DocumentLock
  9.             ldoc = doc.LockDocument()
  10.             '添加扩展程序名
  11.             Dim acRegAppTbl As RegAppTable
  12.             acRegAppTbl = trans.GetObject(db.RegAppTableId, OpenMode.ForWrite)
  13.             '' Check to see if the app "PointInfo" is
  14.             '' registered and if not add it to the RegApp table
  15.             If acRegAppTbl.Has("PointInfo") = False Then
  16.                 Dim acRegAppTblRec As RegAppTableRecord = New RegAppTableRecord()
  17.                 acRegAppTblRec.Name = "PointInfo"
  18.                 'acRegAppTbl.UpgradeOpen()
  19.                 acRegAppTbl.Add(acRegAppTblRec)
  20.                 trans.AddNewlyCreatedDBObject(acRegAppTblRec, True)
  21.                 ' trans.Commit()
  22.             End If
  23.             '添加结束
  24.             pan.KeepFocus = False
  25.             Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead)
  26.             Dim btr As BlockTableRecord = trans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False)
  27.             Dim str() As String = Nothing
  28.             Dim sr As String
  29.             If lab2.Text = "" Or lab2.Text = "文件名" Then Exit Sub
  30.             Dim fr As New IO.StreamReader(lab2.Text)
  31.             Do Until fr.EndOfStream
  32.                 sr = fr.ReadLine
  33.                 If Not sr Is Nothing Then
  34.                     str = sr.Split(",")
  35.                 End If
  36.                 '读出变量
  37.                 Dim pnt As Point3d
  38.                 Dim tpnt As Point3d
  39.                 Dim tpntalign As Point3d
  40.                 Dim name As String = ""
  41.                 Dim code As String = ""
  42.                 If rb1.Checked = True Then
  43.                     name = str(0)
  44.                     code = ""
  45.                     pnt = New Point3d(Val(str(2)), Val(str(1)), Val(str(3)))
  46.                 End If
  47.                 If rb2.Checked = True Then
  48.                     name = str(0)
  49.                     code = str(4)
  50.                     pnt = New Point3d(Val(str(2)), Val(str(1)), Val(str(3)))
  51.                 End If
  52.                 If rb3.Checked = True Then
  53.                     name = str(6)
  54.                     code = str(0)
  55.                     pnt = New Point3d(Val(str(1)), Val(str(2)), Val(str(3)))
  56.                 End If
  57.                 If rb4.Checked = True Then
  58.                     name = str(0)
  59.                     code = ""
  60.                     pnt = New Point3d(Val(str(1)), Val(str(2)), Val(str(3)))
  61.                 End If
  62.                 '画圆
  63.                 tpnt = New Point3d(pnt.X + Val(TextBox4.Text), pnt.Y + Val(TextBox5.Text), 0)
  64.                 tpntalign = New Point3d(pnt.X + Val(TextBox4.Text), pnt.Y, 0)
  65.                 If rb5.Checked = True Then
  66.                     Dim cir As New Circle(pnt, Vector3d.ZAxis, Val(TextBox1.Text))
  67.                     Dim distext As New DBText
  68.                     distext.HorizontalMode = TextHorizontalMode.TextLeft
  69.                     distext.VerticalMode = TextVerticalMode.TextVerticalMid
  70.                     distext.AlignmentPoint = tpntalign
  71.                     If rb7.Checked = True Then
  72.                         distext.TextString = name
  73.                     End If
  74.                     If rb8.Checked = True Then
  75.                         distext.TextString = Format(pnt.Z.ToString, TextBox7.Text)
  76.                     End If
  77.                   
  78.                     distext.Height = Double.Parse(TextBox6.Text)
  79.                     distext.Position = tpnt
  80.                     btr.AppendEntity(distext)
  81.                     trans.AddNewlyCreatedDBObject(distext, True)
  82.                     Dim df As New ResultBuffer
  83.                     df.Add(New TypedValue(DxfCode.ExtendedDataRegAppName, "PointInfo"))
  84.                     df.Add(New TypedValue(DxfCode.ExtendedDataAsciiString, name))
  85.                     df.Add(New TypedValue(DxfCode.ExtendedDataAsciiString, code))
  86.                     cir.XData = df
  87.                     df.Dispose()
  88.                     btr.AppendEntity(cir)
  89.                     trans.AddNewlyCreatedDBObject(cir, True)
  90.                     'trans.Commit()
  91.                     cir.Dispose()
  92.                 End If
  93.                 '画块
  94.                 If rb6.Checked = True Then
  95.                     ' Dim btnew As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForWrite)
  96.                     If bt.Has(blockname) = False Then
  97.                         Dim ndb As New Database(False, False)
  98.                         ndb.ReadDwgFile(blockpath, IO.FileShare.Read, False, "")
  99.                         'bt.UpgradeOpen()
  100.                         db.Insert(blockname, ndb, False)
  101.                         ' bt.Add(bb)
  102.                     End If
  103.                     Dim bb As New BlockReference(pnt, bt(blockname))
  104.                     bb.ScaleFactors = New Scale3d(Val(TextBox3.Text), Val(TextBox3.Text), 1)
  105.                     'Dim bref As New AttributeReference(pnt, pnt.Z.ToString, "height", bt(blockname))
  106.                     Dim dfb As New ResultBuffer
  107.                     dfb.Add(New TypedValue(DxfCode.ExtendedDataRegAppName, "PointInfo"))
  108.                     dfb.Add(New TypedValue(DxfCode.ExtendedDataAsciiString, name))
  109.                     dfb.Add(New TypedValue(DxfCode.ExtendedDataAsciiString, code))
  110.                     bb.XData = dfb
  111.                     dfb.Dispose()
  112.                     btr.AppendEntity(bb)
  113.                     trans.AddNewlyCreatedDBObject(bb, True)
  114.                     Dim bdef As BlockTableRecord = trans.GetObject(bt(blockname), OpenMode.ForRead)‘怎么样才能不改动(bt(name))的属性
  115.                     Dim id As ObjectId
  116.                     Dim isatt As Boolean = False
  117.                     For Each id In bdef
  118.                         Dim dbref As DBObject = trans.GetObject(id, OpenMode.ForRead)
  119.                         If TypeOf (dbref) Is AttributeDefinition Then
  120.                             Dim bref As AttributeDefinition = dbref
  121.                             If bref.IsWriteEnabled = False Then
  122.                                 bref.UpgradeOpen()
  123.                             End If
  124.                             Dim att As New AttributeReference()
  125.                             'att.SetAttributeFromBlock(bref, bb.BlockTransform)
  126.                             If bref.Tag = "HEIGHT" Then
  127.                                 bref.Height = Val(TextBox6.Text)
  128.                                 bref.AlignmentPoint = New Point3d(Val(TextBox4.Text), 0, 0)
  129.                                 bref.TextString = Format(pnt.Z, TextBox7.Text)
  130.                                 isatt = True
  131.                             End If
  132.                             att.SetAttributeFromBlock(bref, bb.BlockTransform)
  133.                             bb.AttributeCollection.AppendAttribute(att)
  134.                             'bref.TextString = ""
  135.                             ' trans.AddNewlyCreatedDBObject(att, True)
  136.                             att.Dispose()
  137.                             doc.Editor.UpdateScreen()
  138.                         End If
  139.                     Next
  140.                     '如果不是属性块,写文字
  141.                     If isatt = False Then
  142.                         tpnt = New Point3d(pnt.X + Val(TextBox4.Text), pnt.Y + Val(TextBox5.Text), 0)
  143.                         tpntalign = New Point3d(pnt.X + Val(TextBox4.Text), pnt.Y, 0)
  144.                         Dim distext1 As New DBText
  145.                         distext1.HorizontalMode = TextHorizontalMode.TextLeft
  146.                         distext1.VerticalMode = TextVerticalMode.TextVerticalMid
  147.                         distext1.AlignmentPoint = tpntalign
  148.                         If rb7.Checked = True Then
  149.                             distext1.TextString = name
  150.                         End If
  151.                         If rb8.Checked = True Then
  152.                             distext1.TextString = Format(pnt.Z.ToString, TextBox7.Text)
  153.                         End If
  154.                         distext1.Height = Double.Parse(TextBox6.Text)
  155.                         distext1.Position = tpnt
  156.                         btr.AppendEntity(distext1)
  157.                         trans.AddNewlyCreatedDBObject(distext1, True)
  158.                     End If
  159.                 End If
  160.                 'ldoc.Dispose()
  161.             Loop
  162.             'doc.SendStringToExecute("zoom e ", True, False, False)
  163.             trans.Commit()
  164.             fr.Close()
  165.             pan.KeepFocus = True
  166.         End Using
  167.     End Sub
 楼主| 发表于 2011-8-18 21:01:21 | 显示全部楼层
高手都不在啊,是不是用vb.net的人少啊。看到好多代码都是C的。
 楼主| 发表于 2011-8-19 17:11:07 | 显示全部楼层
怎么没人帮我,快沉底了都。请大侠帮我看看代码哪里把块定义给改了呢。
发表于 2012-4-14 10:25:55 | 显示全部楼层
我想找.net 插入块的代码,与楼主一起求索
发表于 2012-4-14 23:09:50 | 显示全部楼层
kean博客是个百宝箱,大多数问题都能找到答案:
http://through-the-interface.typepad.com/

然后用这个网站把C#代码转成VB.NET:
http://www.developerfusion.com/tools/convert/csharp-to-vb/
发表于 2012-4-17 15:20:32 | 显示全部楼层
o,     好难.........
发表于 2012-4-25 19:18:16 | 显示全部楼层
2011年的帖子,没人回答。.net是从底层直接引用CAD的类的,你创建了块表的实例,就已经给块表类赋值即初始值就改变了Dim bref As New AttributeReference(pnt, pnt.Z.ToString, "height", bt(blockname)) 插入完后 加入 bref = nothing 试试,虽然说 End Using 自动释放资源。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 18:17 , Processed in 0.195586 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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