乐筑天下

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

Excel和AutoCad之间的双向链接

[复制链接]

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2012-1-24 06:07:50 | 显示全部楼层 |阅读模式
大家好
我是这里的新成员,我一直在努力寻找问题的答案。我是一名学生,现在正在写论文。我这里有个问题。如何在Excel和AutoCad之间建立双向链接。我的意思是,如果我在AutoCad绘图中移动一个块,如果Excel可以将新坐标更新到Excel工作表中,那就太好了。反过来说,如果我在Excel中更改块坐标,它会移动AutoCad绘图中的块。我知道这可以由VBA完成,但我不#039;我不知道怎么做 你能帮我做这个吗?已经谢谢你了。(我对可能出现的拼写错误表示歉意)致以最诚挚的问候
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2012-1-24 13:20:05 | 显示全部楼层
您需要2个VBA应用程序:1.从AutoCAD打开并更新Excel或直接更新csv文件。2.从Excel打开并更新AutoCAD或使用开放式设计软件
如果只是块引用,如果块名称是唯一的,或者将对象句柄保存在excel中,那么这应该相当容易。警告:如果必须恢复图形,则句柄可能会更改或块名称可能会更改
这就是为什么我的块有一个记录编号属性,该属性对于每个块插入都是唯一的
希望这能帮助你开始。
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2012-1-25 07:20:11 | 显示全部楼层
您好,Chuck,因此在属性数据中为每个块指定不同的数字。你用这个数字来识别每个区块。正当使用两个不同的VBA应用程序是什么意思?
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2012-1-25 09:40:32 | 显示全部楼层
AutoCAD中的每个对象都有一个唯一的ID号-a“;处理 您可以使用它来更新电子表格
你不'不需要两个应用程序 我想他是在指出,可以从AutoCAD到Excel,或者从Excel到AutoCAD 从Excel到AutoCAD的代码可能要长一点,但不会太长
我可能在某个地方有一个旧的示例应用程序 如果我找到它,我'我会贴出来的。
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2012-1-25 10:00:05 | 显示全部楼层
好的,谢谢你的信息,但不是't the“;“处理”;仅当您将阻止信息导出到某个位置时才变大?如果再次发送该信息,即使是同一块,AutoCad也会将新句柄变大?一个示例应用程序将是非常好的谢谢你。
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2012-1-25 17:01:06 | 显示全部楼层
如果恢复dwg,我注意到有时它会重新创建块引用,并给它一个与我第一篇文章不同的句柄
至于两个VBA应用程序:
假设我在不打开AutoCAD的情况下打开excel电子表格,对插入点进行更改保存并关闭,然后我将dwg作为附件发送给其他人
如果VBA应用程序仅在dwg中,是否在excel中进行了更改?是否在dwg内进行了更改
如果我打开dwg,请使用移动命令或抓取夹点并移动块保存并关闭
如果我在excel中只有一个VBA应用程序,并且我通过电子邮件发送excel文件而不打开它,那么它不会#039;它没有变化
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2012-1-25 17:08:15 | 显示全部楼层
关于处理的更多信息:我有一个用AutoCAD 2004编写的自定义GIS系统(不是地图)
我使用句柄和属性来实现双向连接和冗余
在数据库中,我存储句柄和递增的long值(Rec\u Num)
然后,在恢复dwg文件后,我们可以运行数据库重新连接功能,该功能为
1。为每个对象创建一个带有Rec Num att的块选择集,搜索数据库并保存正确的句柄(如果没有't匹配
在每次恢复中,我们已经看到多达150个句柄在映射中发生变化
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2012-1-25 18:30:37 | 显示全部楼层
以下是一些AutoCAD代码(在AutoCAD 2004中)供您入门。您需要在VBA项目中添加对Microsoft Excel的引用。所有代码都在ThisDrawing模块中
  1. Option Explicit
  2. Private ExcelApp As Excel.Application
  3. Private Sub AcadDocument_ObjectAdded(ByVal Object As Object)
  4. Dim objBlkRef As AcadBlockReference
  5. Dim varInsPnt As Variant
  6. Dim strHandle As String
  7. 'New Entity
  8. 'Add to Excel File
  9. If TypeOf Object Is AcadBlockReference Then
  10.       Set objBlkRef = Object
  11.       varInsPnt = objBlkRef.InsertionPoint
  12.       strHandle = objBlkRef.Handle
  13.       If UpdateExcel(strHandle, varInsPnt, "New") = False Then
  14.            Debug.Print "There was an Error Updating Excel"
  15.       End If
  16. End If
  17. End Sub
  18. Private Sub AcadDocument_ObjectModified(ByVal Object As Object)
  19. Dim objBlkRef As AcadBlockReference
  20. Dim varInsPnt As Variant
  21. Dim strHandle As String
  22. 'Existing Entity
  23. 'Should be in Excel File
  24. If TypeOf Object Is AcadBlockReference Then
  25.       Set objBlkRef = Object
  26.       varInsPnt = objBlkRef.InsertionPoint
  27.       strHandle = objBlkRef.Handle
  28.       If UpdateExcel(strHandle, varInsPnt, "Existing") = False Then
  29.            Debug.Print "There was an Error Updating Excel"
  30.       End If
  31. End If
  32. End Sub
  33. Private Function UpdateExcel(sHandle As String, varpnt As Variant, sAction As String) As Boolean
  34. Dim objWorkBook As Workbook
  35. Dim objSheet As Worksheet
  36. Dim objUsedRange As Range
  37. Dim lngRows, lngRow As Long
  38. Dim strFile As String
  39. Dim blnFound As Boolean
  40. Dim intcnt As Integer
  41. On Error GoTo Err_Control
  42. strFile = Replace(ThisDrawing.FullName, ".dwg", ".xlsx")
  43. If ConnectToExcel = True Then
  44. Set objWorkBook = ExcelApp.Workbooks.Open(strFile)
  45. Set objSheet = objWorkBook.Worksheets(1)
  46. Set objUsedRange = objSheet.UsedRange
  47. 'Get Last used row
  48. lngRows = objUsedRange.Rows.Count + 1
  49. Select Case sAction
  50.       Case "New"
  51.            'Add new blocks info
  52.            objSheet.Cells(lngRows, 1) = sHandle
  53.            For intcnt = LBound(varpnt) To UBound(varpnt)
  54.                  objSheet.Cells(lngRows, intcnt + 2) = varpnt(intcnt)
  55.            Next
  56.       Case "Existing"
  57.            'Find Handle in Used Rows
  58.            For lngRow = 1 To lngRows - 1
  59.                 If sHandle = objSheet.Cells(lngRow, 1) Then
  60.                      For intcnt = LBound(varpnt) To UBound(varpnt)
  61.                           objSheet.Cells(lngRow, intcnt + 2) = varpnt(intcnt)
  62.                      Next
  63.                      blnFound = True
  64.                 End If
  65.            Next
  66.            If blnFound = False Then 'Didn't find it add it
  67.                 objSheet.Cells(lngRows, 1) = sHandle
  68.                 For intcnt = LBound(varpnt) To UBound(varpnt)
  69.                      objSheet.Cells(lngRows, intcnt + 2) = varpnt(intcnt)
  70.                 Next
  71.            End If
  72.       Case Else 'this should not happen unless you mistype the action name
  73. End Select
  74. objWorkBook.Save
  75. objWorkBook.Close
  76. Set ExcelApp = Nothing
  77. UpdateExcel = True
  78. End If
  79. Exit_Here:
  80. Exit Function
  81. Err_Control:
  82. Select Case Err.Number
  83.       Case 1004 'File doesn't exist  (Not sure if anything else causes this error)
  84.            'create a new workbook and save as         
  85.            Set objWorkBook = ExcelApp.Workbooks.Add
  86.            objWorkBook.SaveAs strFile
  87.            Resume
  88.       Case Else
  89.            Debug.Print Err.Number & ": " & Err.Description
  90.            Resume Exit_Here
  91. End Select
  92. End Function
  93. Private Function ConnectToExcel() As Boolean
  94. On Error GoTo Err_Control
  95. Set ExcelApp = GetObject("Excel.Application")
  96. ConnectToExcel = True
  97. Exit_Here:
  98. ExcelApp.AlertBeforeOverwriting = False
  99. Exit Function
  100. Err_Control:
  101. Select Case Err.Number
  102.       Case Else
  103.            Set ExcelApp = CreateObject("Excel.Application")
  104.            ConnectToExcel = True
  105.            Resume Exit_Here
  106. End Select
  107. End Function

回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2012-1-26 01:42:50 | 显示全部楼层
好的。我得仔细看看你写的东西。我自己并不熟悉VBA,但我可以在这方面得到帮助。非常感谢你的帮助。
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2012-1-26 01:51:30 | 显示全部楼层
我们可以在这里帮助你,但我们需要更多信息
也就是说,你对编码了解多少,AutoCAD和Excel的版本是什么,这个项目的全部内容是什么,你的电脑上有这两个版本的运行副本吗?还有,这个项目是做什么的,你要交什么
我不想只给你代码让你打分。我想帮助你理解代码以及如何思考。我不知道其他人对此有何感受,这只是我的感受。帮助别人获得代码来完成他们的工作是一回事,但给别人一个等级的代码是完全不同的IMHO。这就是说,坚持住,我们可以散列代码,直到你理解它,可以写你需要的,只要一点帮助这里和F1键。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-6-30 11:03 , Processed in 1.350736 second(s), 73 queries .

© 2020-2025 乐筑天下

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