明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1422|回复: 3

Handle更改材料表数据。

[复制链接]
发表于 2008-7-8 15:23:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2008-7-9 14:47:54 编辑
  1. 很多材料表的内容相同,只是更改极个别数据后材料重量又要重新计算。
  2. 利用handle的特性,将材料的内容先移到excel中,经过excel的重新计算,再返回到AutoCAD保持原有其原有的格式。
  3. Function AutoCadConnectExcel(InputSheetName As String) As Object
  4.    Dim xlApp As Object
  5.    On Error Resume Next
  6.    Set xlApp = GetObject(, "Excel.Application")
  7.    Set AutoCadConnectExcel = xlApp.ActiveWorkbook.Sheets(InputSheetName)
  8. End Function
  9. Sub HandleReadText()
  10.   Set gg = AutoCadConnectExcel("Sheet3")
  11.   gg.Range("a:z").ClearContents
  12.   Dim Ent As AcadEntity, textObj As AcadText
  13.   ii = 1: jj = 0
  14.   For Each Ent In ThisDrawing.ModelSpace
  15.     Select Case Ent.ObjectName
  16.       Case "AcDbText"
  17.         Set textObj = Ent
  18.         With textObj
  19.           gg.cells(ii, jj + 1) = .ObjectID
  20.           gg.cells(ii, jj + 2) = "'" & .TextString
  21.           gg.cells(ii, jj + 3) = Round(.insertionPoint(0), 3)
  22.           gg.cells(ii, jj + 4) = Round(.insertionPoint(1), 3)
  23.           gg.cells(ii, jj + 5) = Round(.insertionPoint(2), 3)
  24.           'gg.cells(ii, jj + 2) = .TextString
  25.           ii = ii + 1
  26.         End With
  27.     End Select
  28.   Next Ent
  29.   
  30. End Sub
  31. Function RemoveOverlap(ByRef Ary)
  32.                
  33.              On Error Resume Next
  34.                
  35.              Dim i     As Long
  36.                
  37.              Dim colTmp     As New Collection
  38.              For i = 0 To UBound(Ary) - 1
  39.                      colTmp.Add Ary(i), "K" & Ary(i)
  40.              Next
  41.                
  42.              Dim aryTmp()     As String
  43.              ReDim aryTmp(colTmp.Count - 1) As String
  44.              For i = 0 To colTmp.Count - 1
  45.                      aryTmp(i) = colTmp.Item(i + 1)
  46.              Next
  47.                
  48.              Set colTmp = Nothing
  49.              RemoveOverlap = aryTmp
  50.                
  51.      End Function
  52. '主程序
  53. Sub ll()
  54.       Dim xm(1000) As Double, xm1(1000) As Double, TextArray(10000) As String, TextInsertPoint(10000, 2)
  55.       Dim HandleArray(10000) As String
  56.       Dim tt As AcadText, ll As AcadLine, Ent As AcadEntity
  57.       xm_i = 0: xm1_i = 0: tt_i = 0
  58.       ''
  59.       Dim x1 As Double, y1 As Double
  60.       'ReDim xm(1000) As Double, xm1(1000) As Long
  61.       For Each Ent In ThisDrawing.ModelSpace
  62.         Select Case Ent.ObjectName
  63.           Case "AcDbLine"
  64.             Set ll = Ent
  65.             Select Case ll.Layer
  66.               Case "零件表格竖线"
  67.                 'ReDim xm(xm_i) As Double
  68.                 xm(xm_i) = Round(ll.EndPoint(0), 0)
  69.                 'Debug.Print xm_i, xm(xm_i), Round(ll.EndPoint(0), 3)
  70.                 xm_i = xm_i + 1
  71.               Case "零件表格横线"
  72.                 'ReDim xm1(xm1_i) As Double
  73.                 xm1(xm1_i) = Round(ll.EndPoint(1), 0)
  74.                 xm1_i = xm1_i + 1
  75.             End Select
  76.           Case "AcDbText"
  77.             Set tt = Ent
  78.               If tt.Layer = "零件表格文本" Then
  79.                 TextInsertPoint(tt_i, 0) = tt.insertionPoint(0)
  80.                 TextInsertPoint(tt_i, 1) = tt.insertionPoint(1)
  81.                 TextArray(tt_i) = tt.TextString
  82.                 HandleArray(tt_i) = tt.ObjectID
  83.                 tt_i = tt_i + 1
  84.               End If
  85.          End Select
  86.       Next Ent
  87.       
  88.       MM = RemoveOverlap(xm1)
  89.       xx = Bubble_Sort(MM)
  90.       
  91.       MM = RemoveOverlap(xm)
  92.       yy = Bubble_Sort(MM)
  93.       Dim gg, ggg
  94.       ReDim gg(UBound(xx) - 2, UBound(yy) - 2), ggg(UBound(xx) - 2, UBound(yy) - 2)
  95.       
  96. For kk = 0 To tt_i - 1
  97.      x1 = TextInsertPoint(kk, 1)
  98.      For ii = 1 To UBound(xx) - 1
  99.        If x1 > xx(ii) And x1 < xx(ii + 1) Then
  100.         Exit For
  101.        End If
  102.      Next ii
  103.      y1 = Val(TextInsertPoint(kk, 0))
  104. For jj = 1 To UBound(yy) - 1
  105.        If y1 > yy(jj) And y1 < yy(jj + 1) Then
  106.         Exit For
  107.        End If
  108.      Next jj
  109.      'gg(ii - 1, jj - 1) = TextArray(kk)
  110.      gg(ii - 1, jj - 1) = TextArray(kk)
  111.      ggg(ii - 1, jj - 1) = HandleArray(kk)
  112. Next kk
  113.    Dim xlSheet As Object
  114.    Set xlSheet = AutoCadConnectExcel("Sheet1")
  115.    Set xlSheet1 = AutoCadConnectExcel("Sheet2")
  116.    xlSheet.Range("a:z").ClearContents
  117.    xlSheet1.Range("a:z").ClearContents
  118.    For ii = 0 To UBound(gg)
  119.      For jj = 0 To 7
  120.        With xlSheet
  121.          If jj <= 4 Then
  122.            .cells(ii + 1, jj + 1) = "'" & gg(ii, jj)
  123.          Else
  124.            .cells(ii + 1, jj + 1) = gg(ii, jj)
  125.          End If
  126.        End With
  127.      Next jj
  128.    Next ii
  129.    For ii = 0 To UBound(ggg)
  130.      For jj = 0 To 7
  131.        With xlSheet1
  132.          If jj <= 4 Then
  133.            .cells(ii + 1, jj + 1) = "'" & ggg(ii, jj)
  134.          Else
  135.            .cells(ii + 1, jj + 1) = ggg(ii, jj)
  136.          End If
  137.        End With
  138.      Next jj
  139.    Next ii
  140. End Sub
  141. '冒泡程序
  142. Function Bubble_Sort(Ary)
  143.       Dim aryUBound, i, j
  144.       aryUBound = UBound(Ary)
  145.       For ii = 0 To aryUBound
  146.         Ary(ii) = Val(Round(Ary(ii), 2))
  147.       Next ii
  148.       For i = 0 To aryUBound
  149.         For j = i + 1 To aryUBound
  150.           If Ary(i) > Ary(j) Then
  151.             Swap Ary(i), Ary(j)
  152.           End If
  153.         Next
  154.       Next
  155.       Bubble_Sort = Ary
  156. End Function
  157. Function Swap(a, b)
  158.       Dim tmp
  159.       tmp = a
  160.       a = b
  161.       b = tmp
  162. End Function
  163. --------------------------------------------------------
  164. Function CAdToText(InputFileName)
  165.   Dim LineData As AcadLine, ArcData As AcadArc
  166.   Close #1
  167.   Open InputFileName For Output As #1
  168.   
  169.   Write #1, "m1", "m2", "m3", "m4", "m5", "m6", "m7", "m8", "m9", "m10", "m11", "m12"
  170.   
  171.   Dim Ent As AcadEntity
  172.   Dim lineObj As AcadLine, textObj As AcadText
  173.   For Each Ent In ThisDrawing.ModelSpace
  174.     m1 = Ent.ObjectName
  175.     m2 = Ent.ObjectID
  176.     m3 = Ent.Layer
  177.    
  178.     Select Case Ent.ObjectName
  179.           Case "AcDbLine"
  180.             Set lineObj = Ent
  181.               With lineObj
  182.                 Select Case .Layer
  183.                   Case "零件表格竖线", "零件表格横线"
  184.                     m4 = Round(.StartPoint(0), 2)
  185.                     m5 = Round(.StartPoint(1), 2)
  186.                     m6 = Round(.StartPoint(2), 2)
  187.                     m7 = Round(.EndPoint(0), 2)
  188.                     m8 = Round(.EndPoint(1), 2)
  189.                     m9 = Round(.EndPoint(2), 2)
  190.                 End Select
  191.               End With
  192.           Case "AcDbText"
  193.             Set textObj = Ent
  194.               With textObj
  195.                 If .Layer = "零件表格文本" Then
  196.                   m4 = Round(.InsertionPoint(0), 2)
  197.                   m5 = Round(.InsertionPoint(1), 2)
  198.                   m6 = Round(.InsertionPoint(2), 2)
  199.                   m7 = .TextString
  200.                 End If
  201.               End With
  202.     End Select
  203.     Write #1, m1, m2, m3, m4, m5, m6, m7, m8, m9
  204.    
  205.   Next Ent
  206.   
  207.   Close #1
  208. End Function
  209. Sub Main()
  210.   CAdToText ("D:\Temp.txt")
  211.   Dim rsX As ADODB.Recordset, rsY As ADODB.Recordset, rsText As ADODB.Recordset
  212.   Dim abc As String
  213.   abc = "select  "
  214.   abc = abc & "  val(m4) as mm from temp.txt where m1 = 'AcDbLine'   "
  215.   abc = abc & " union "
  216.   abc = abc & " select val(m7) as mm from temp.txt where m1 = 'AcDbLine'  "
  217.   Set rsX = RecordsetToExcel(abc)
  218.   
  219.   abc = "select  "
  220.   abc = abc & "  m5 as mm from temp.txt where m1 = 'AcDbLine'  "
  221.   abc = abc & " union "
  222.   abc = abc & " select  m8 from temp.txt where m1 = 'AcDbLine' ORDER BY mm DESC "
  223.   Set rsY = RecordsetToExcel(abc)
  224.   
  225.   abc = "select  "
  226.   abc = abc & " m7,m2,m4,m5,m6 from temp.txt where m3 = '零件表格文本' "
  227.   Set rsText = RecordsetToExcel(abc)
  228.   
  229.   Dim xlSheet
  230.   Set xlSheet = ConnectExcel("Sheet1")
  231.   
  232.   rsX.MoveFirst: rsY.MoveFirst: rsText.MoveFirst
  233.   'rsX.Sort = 0
  234.   With xlSheet
  235.     .Range("a:z").ClearContents
  236.     '.Range("A1").CopyFromRecordset rsX
  237.     '.Range("B1").CopyFromRecordset rsY
  238.     For ii = 0 To rsText.RecordCount - 1
  239.       xx = rsText.Fields(2): yy = rsText.Fields(3)
  240.       rsX.MoveFirst
  241.       For n1 = 0 To rsX.RecordCount - 1
  242.         'rsX.Move n1
  243.         a1 = rsX.Fields(0)
  244.         If rsX.EOF Then
  245.           Exit For
  246.         Else
  247.           rsX.MoveNext
  248.         End If
  249.         a2 = rsX.Fields(0)
  250.         If rsX.EOF() Then
  251.           Exit For
  252.         End If
  253.         
  254.         
  255.         
  256.         If xx >= a1 And xx <= a2 Then
  257.           Exit For
  258.         End If
  259.         
  260. '        rsX.MoveNext
  261.       Next n1
  262.       rsY.MoveFirst
  263.       For n2 = 0 To rsY.RecordCount - 1
  264.         a1 = rsY.Fields(0)
  265.           If rsY.EOF Then
  266.             Exit For
  267.           Else
  268.             rsY.MoveNext
  269.           End If
  270.           a2 = rsY.Fields(0)
  271.           If rsY.EOF Then
  272.             Exit For
  273.           End If
  274.         If yy >= a2 And yy <= a1 Then
  275.           Exit For
  276.         End If
  277.       Next n2
  278.       If n1 = 3 Or n1 = 5 Or n1 = 6 Then
  279.         .cells(n2 + 1, n1 + 1) = Val(rsText(0))
  280.       Else
  281.         .cells(n2 + 1, n1 + 1) = rsText(0)
  282.       End If
  283.       If Not rsText.EOF Then
  284.         rsText.MoveNext
  285.       End If
  286.     Next ii
  287.   End With
  288. End Sub
  289. Function RecordsetToExcel(InputFileName As String) As ADODB.Recordset
  290.   Set conn = CreateObject("ADODB.Connection")
  291.   Set rs = CreateObject("adodb.recordset")
  292.   conn.Open "DRIVER={Microsoft Text Driver (*.txt; *.csv)};DBQ=d:", "", ""
  293.   rs.Open " " & InputFileName, conn, 1, 3
  294.   Set RecordsetToExcel = rs
  295.   'Sheet1.Range("A2").CopyFromRecordset rs
  296. End Function
  297. Function ConnectExcel(InputSheetName As String) As Object
  298.    Dim xlApp As Object
  299.    On Error Resume Next
  300.    Set xlApp = GetObject(, "Excel.Application")
  301.    Set ConnectExcel = xlApp.ActiveWorkbook.Sheets(InputSheetName)
  302. End Function
发表于 2008-7-9 20:35:00 | 显示全部楼层

handle每次重新打开cad都不同。

所以,是否只能在一次打开该dwg文件的时候使用?

这样的话,下次修改还是一样要重新做的吧

发表于 2008-7-9 20:37:00 | 显示全部楼层
好像是我理解有点问题~~
 楼主| 发表于 2008-7-11 11:37:00 | 显示全部楼层

打开已有的dwg文件,handle不会变。只是在写实体时是随机变化,如画一条直线,写一个文字 handle是随机变化的。

set ent = ent1.copy() 后,ent的handle会变的

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

本版积分规则

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

GMT+8, 2024-11-26 08:42 , Processed in 0.174352 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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