乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 255|回复: 13

[新手帮助]将块的所有实例的X,Y输入到新表中

[复制链接]

27

主题

242

帖子

18

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
335
发表于 2008-7-17 09:08:36 | 显示全部楼层 |阅读模式
我有一个块。它被放入图纸中,作为我们正在设计的设施的设备布局表的基准点。这种情况经常发生,足以保证自动化,因为我们当前的过程是非常手动的。
我们提供了一个表,其中包含:名称、北向、东向、海拔(手动输入)和描述
我唯一想要自动化的是北向和东向,它与Y和X值相同。
我希望让用户选择一个块来填充表,并创建表。
我还没有创建表,因为我能找到的信息只是如何创建一个基本表...没有关于添加行、设置文本...(setText给我一个错误,见下文)或类似的东西。
我到目前为止:
  1. Sub DatumTable()
  2. Dim Block As AcadBlockReference
  3. Dim DatumObj As AcadObject
  4. Dim TableObj As AcadTable
  5. Dim filterType(0) As Integer
  6. Dim filterData(0) As Variant
  7. Dim selSet As AcadSelectionSet
  8. GetEnt: 'Start loop point
  9.     ThisDrawing.Utility.GetEntity DatumObj, ReturnPnt, "Select a block: "
  10.     If DatumObj.ObjectName  "AcDbBlockReference" Then
  11.     MsgBox "The selected object wasn't a block!", vbExclamation
  12. GoTo GetEnt 'Goto loop point
  13. End If
  14. Set selSet = ThisDrawing.SelectionSets. _
  15.              Add("DatumObj")
  16. 'Create that Table!
  17.     Dim MyPaperSpace As AcadPaperSpace
  18.     Set MyPaperSpace = ThisDrawing.PaperSpace
  19.     Dim pt(2) As Double
  20.     Dim MyTable As AcadTable
  21.     Set MyTable = MyPaperSpace.AddTable(pt, 1, 2, 3, 4)
  22.     MyTable.RegenerateTableSuppressed = True
  23.    
  24.    
  25.     MyTable.RegenerateTableSuppressed = False
  26. End Sub

此外,AutoCAD开发人员指南帮助中的setText显示了这一点:
  1. object.SetText(row, col, pStr)

但是如果我使用
  1. MyTable.SetText(1, 1, Text)

它错误,说它需要一个“=”......我不明白为什么。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2008-7-17 11:44:42 | 显示全部楼层
在VBA中,当您为方法提供参数时,如果您也在使用变量以备将来使用,则使用括号:
  1. Dim OTbl As AcadTable
  2. Dim vInsPt(2) As Double
  3. Set OTbl = ThisDrawing.ModelSpace.AddTable(vInsPt, 1, 1, 5, 10)

但是,当您没有将返回值赋给变量时,不会使用括号。为了使这一点更加混乱,虽然我们将表定义为具有1行1列,但需要在基于零的数组中访问它们。因此,为了在我的表示例中使用SetText,我们使用以下内容:
  1. OTbl.SetText 0, 0, "MyText"

这有帮助吗?
回复

使用道具 举报

27

主题

242

帖子

18

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
335
发表于 2008-7-17 11:54:07 | 显示全部楼层

当然,我的老板来了,回头看看我在实施fixo的一些帮助时所做的事情,然后说:“哇,这与我们在大学时使用FORTRAN时大不相同。”
回复

使用道具 举报

27

主题

242

帖子

18

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
335
发表于 2008-7-17 14:52:48 | 显示全部楼层
我开始怀疑我是否像想象的那样理解你说的话。
  1.     Dim ID As String
  2.     Dim Desc As String
  1.             ID = oBlk.GetAttribute(ID)
  2.             Desc = oBlk.GetAttribute(Desc)

我将这些变量定义为字符串,在那里直接为它们分配一个值,然后通过SetText访问该值并将其放入单元格文本中。
运行例程时,我收到一个错误:
我是否理解,或者我正在寻找错误的地方?
*edit*
块 - 确实 - 具有名为“ID”和“DESC”的属性。
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2008-7-17 17:48:45 | 显示全部楼层
根据你在另一个线程和最后一个线程中的问题,也许这会有所帮助......
如果一个BlockRef有属性,那么你会得到所有的属性,如下所示:
  1. Dim vAtts at Variant
  2. vAtts = oBlk.GetAttributes

现在vAtts将是一个包含所有定义属性的数组。要找出有多少,请使用UBound(vAtts),它为您提供数组的上限。但是请记住,这是基于0的,所以在总数中添加1(如果您想知道这一点)。现在,要获取每个数据,请遍历数组。
  1. Dim I as Integer
  2. Dim oAtt as AcadAttributereference
  3. For I = 0 to UBound(vAtts)
  4.    Set oAtt = vAtts(I)
  5.    Select Case oAtt.TagString
  6.       Case Is = "ID"
  7.          'fill the correct cell with the oAtt.TextString
  8.       Case Is = "DESC"
  9.          'fill the correct cell with the oAtt.TextString
  10.       Case is = "OTHER"
  11.          'fill the correct cell with the oAtt.TextString
  12.      'etc....
  13.    End Select
  14. Next I

我希望这能澄清一点。
回复

使用道具 举报

27

主题

242

帖子

18

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
335
发表于 2008-7-17 18:46:18 | 显示全部楼层
呜呜呜呜!!!!!!!!!!!!!!!!!!!!呜噢噢噢!!!!!!!!!!!!!!!!!!!!!!!!!!噢
这是我在Autocad中创建过的最辉煌的桌子!
  1. Option Explicit
  2. Sub Blocks_Table()
  3.     Dim oAtt As AcadAttributeReference
  4.     Dim oSset As AcadSelectionSet
  5.     Dim oEnt As AcadEntity
  6.     Dim oBlk As AcadBlockReference
  7.     Dim varPt As Variant
  8.     Dim ftype(0) As Integer
  9.     Dim fdata(0) As Variant
  10.     Dim bName As String
  11.     Dim xStr As String
  12.     Dim yStr As String
  13.     Dim vAtts As Variant
  14.     Dim I As Long, j As Long
  15.     Dim C As Integer
  16.     ftype(0) = 0: fdata(0) = "INSERT"
  17.     Dim dxfCode, dxfValue
  18.     dxfCode = ftype: dxfValue = fdata
  19.     With ThisDrawing.SelectionSets
  20.         While .Count > 0
  21.             .Item(0).Delete
  22.         Wend
  23.         Set oSset = .Add("$Blocks$")
  24.     End With
  25.    
  26.     ThisDrawing.ActivePViewport.Display True
  27.     ThisDrawing.ActiveSpace = acModelSpace
  28.     oSset.SelectOnScreen dxfCode, dxfValue
  29.    
  30.     ThisDrawing.ActiveSpace = acPaperSpace
  31.    
  32.     Dim paSpace As AcadPaperSpace
  33.     Set paSpace = ThisDrawing.PaperSpace
  34.    
  35.     varPt = ThisDrawing.Utility.GetPoint(, vbCrLf & "Specify insertion point: ")
  36.     Dim oTable As AcadTable
  37.     Set oTable = paSpace.AddTable(varPt, oSset.Count + 3, 6, 0.3, 1.5)
  38.     oTable.TitleSuppressed = False
  39.     oTable.HeaderSuppressed = True
  40.    
  41.     ZoomExtents
  42.     With oTable
  43.     .RegenerateTableSuppressed = True
  44.    
  45.         .SetCellTextHeight I, j, 0.15625
  46.         .SetCellAlignment I, j, acMiddleCenter
  47.         .SetCellType I, j, acTextCell
  48.         .SetText 0, 0, "EQUIPMENT LAYOUT SCHEDULE"
  49.    
  50.         .SetText 1, 0, "ITEM"
  51.         .SetCellTextHeight 1, 0, 0.09375
  52.         .SetText 1, 1, "EQUIPMENT DATUM"
  53.         .SetCellTextHeight 1, 1, 0.09375
  54.         .SetText 1, 4, "DATUM LOCATION"
  55.         .SetCellTextHeight 1, 4, 0.09375
  56.         .SetText 1, 5, "DESCRIPTION"
  57.         .SetCellTextHeight 1, 5, 0.09375
  58.         
  59.         .SetText 2, 1, "N"
  60.         .SetCellTextHeight 2, 1, 0.09375
  61.         .SetText 2, 2, "E"
  62.         .SetCellTextHeight 2, 2, 0.09375
  63.         .SetText 2, 3, "EL"
  64.         .SetCellTextHeight 2, 3, 0.09375
  65.         
  66.         For I = 0 To oSset.Count - 1
  67.             Set oEnt = oSset.Item(I)
  68.             Set oBlk = oEnt
  69.             If oBlk.IsDynamicBlock Then
  70.                 bName = oBlk.EffectiveName
  71.             Else
  72.                 bName = oBlk.Name
  73.             End If
  74.             xStr = Format(CStr(Round(oBlk.InsertionPoint(1), 3)), "#0.000")
  75.             yStr = Format(CStr(Round(oBlk.InsertionPoint(0), 3)), "#0.000")
  76.             
  77.             .SetCellTextHeight I + 3, j, 0.09375
  78.             .SetCellAlignment I + 3, j, acMiddleCenter
  79.             .SetText I + 3, j + 1, xStr
  80.             .SetCellTextHeight I + 3, j + 1, 0.09375
  81.             .SetText I + 3, j + 2, yStr
  82.             .SetCellTextHeight I + 3, j + 2, 0.09375
  83.     vAtts = oBlk.GetAttributes
  84.         For C = 0 To UBound(vAtts)
  85.            Set oAtt = vAtts(C)
  86.           Select Case oAtt.TagString
  87.               Case Is = "ID"
  88.             .SetText I + 3, 0, oAtt.TextString
  89.             .SetCellTextHeight I + 3, 0, 0.09375
  90.               Case Is = "DESC"
  91.             .SetText I + 3, 5, oAtt.TextString
  92.             .SetCellTextHeight I + 3, 5, 0.09375
  93.               Case Is = "ELEVATION"
  94.             .SetText I + 3, 3, oAtt.TextString
  95.             .SetCellTextHeight I + 3, 3, 0.09375
  96.               Case Is = "DATUMLOC"
  97.             .SetText I + 3, 4, oAtt.TextString
  98.             .SetCellTextHeight I + 3, 4, 0.09375
  99.            End Select
  100.         Next C
  101.         Next I
  102.    
  103.         oTable.MergeCells 1, 2, 0, 0
  104.         oTable.MergeCells 1, 2, 4, 4
  105.         oTable.MergeCells 1, 2, 5, 5
  106.         oTable.MergeCells 1, 1, 1, 3
  107.    
  108.     .RegenerateTableSuppressed = False
  109.    
  110.     .Update
  111.    
  112.     End With
  113.         
  114.     MsgBox "Yahoooooo!"
  115. End Sub

是最终代码。
我会做一些调整,也许添加一些条件错误捕获,或命令行指令,以便用户知道他/她需要做什么,但现在我是使用它的人,所以现在这让我过去了。
所示的例子是三辆坦克...我有许多不同类型的储罐,泵,通风机,除尘器,集水坑,等等......我需要填写...
这肯定是天赐之物,因为我们这样做......直到现在,设备布局对我来说是最大的刺。 所以卑微地手工填写那个时间表!
我非常感谢你(和fixo)为此。
一路走来,我学到了很多东西.这么多。。。我认为,如果我现在不把它称为一天,我的头可能会爆炸。
再次感谢你。
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2008-7-17 19:09:40 | 显示全部楼层
恭喜你!你最受欢迎的小花絮我能够折腾你的方式。
回复

使用道具 举报

27

主题

242

帖子

18

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
335
发表于 2008-7-17 20:15:56 | 显示全部楼层
现在想象一下用手填写大约100多个对象的表格...选择一个块...点击“LI”读取坐标...在表格中输入它们...输入复杂的信息...做了100次...哦...然后修改!
*乔希,更新了场地计划,县政府要求我们在西端的公用事业地役权上增加5',所以我们把整个罐区转移了过来,我能尽快更新吗?*
*穿过每个单元格,在东部的每个条目上再增加5.0次*
是的...我很高兴有这个。
回复

使用道具 举报

2

主题

17

帖子

1

银币

初来乍到

Rank: 1

铜币
25
发表于 2008-7-21 03:48:55 | 显示全部楼层
不,对我来说是香草Autocad
对我来说是愚蠢的X和Y...我只是称之为北方和东方
回复

使用道具 举报

27

主题

242

帖子

18

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
335
发表于 2008-7-21 08:45:58 | 显示全部楼层

哦,哈哈
上帝,我已经在ACAD工作了将近15年,直到我在一家土木设计公司工作,我才听说过诺辛和伊斯特。
幸运和不幸的是,我在香草也做得更好。
我在那里确实做了任何设计,但我需要在某种程度上了解陆地桌面才能做自动化项目
Cadr
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-4 08:49 , Processed in 0.637878 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表