frmMain.frm
上传用户:yayuwl
上传日期:2022-03-18
资源大小:8952k
文件大小:10k
源码类别:

CAD

开发平台:

VBA

  1. VERSION 5.00
  2. Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "Comdlg32.ocx"
  3. Begin VB.Form frmMain 
  4.    Caption         =   "批量文字替换"
  5.    ClientHeight    =   3855
  6.    ClientLeft      =   60
  7.    ClientTop       =   345
  8.    ClientWidth     =   4440
  9.    LinkTopic       =   "Form1"
  10.    ScaleHeight     =   3855
  11.    ScaleWidth      =   4440
  12.    StartUpPosition =   3  'Windows Default
  13.    Begin MSComDlg.CommonDialog comDlg 
  14.       Left            =   3840
  15.       Top             =   720
  16.       _ExtentX        =   847
  17.       _ExtentY        =   847
  18.       _Version        =   393216
  19.    End
  20.    Begin VB.CommandButton cmdCancel 
  21.       Caption         =   "取消(&C)"
  22.       Height          =   375
  23.       Left            =   3240
  24.       TabIndex        =   9
  25.       Top             =   3360
  26.       Width           =   1095
  27.    End
  28.    Begin VB.CommandButton cmdOk 
  29.       Caption         =   "确定(&O)"
  30.       Height          =   375
  31.       Left            =   2040
  32.       TabIndex        =   8
  33.       Top             =   3360
  34.       Width           =   1095
  35.    End
  36.    Begin VB.CommandButton cmdDelete 
  37.       Caption         =   "删除(&D)"
  38.       Height          =   375
  39.       Left            =   1080
  40.       TabIndex        =   7
  41.       Top             =   3360
  42.       Width           =   855
  43.    End
  44.    Begin VB.CommandButton cmdOpen 
  45.       Caption         =   "添加(&A)"
  46.       Height          =   375
  47.       Left            =   120
  48.       TabIndex        =   6
  49.       Top             =   3360
  50.       Width           =   855
  51.    End
  52.    Begin VB.ListBox lstFile 
  53.       Height          =   2010
  54.       Left            =   120
  55.       TabIndex        =   5
  56.       Top             =   1200
  57.       Width           =   4215
  58.    End
  59.    Begin VB.TextBox txtReplace 
  60.       Height          =   300
  61.       Left            =   2280
  62.       TabIndex        =   3
  63.       Top             =   480
  64.       Width           =   1335
  65.    End
  66.    Begin VB.TextBox txtFind 
  67.       Height          =   300
  68.       Left            =   120
  69.       TabIndex        =   1
  70.       Top             =   480
  71.       Width           =   1335
  72.    End
  73.    Begin VB.Label Label3 
  74.       Caption         =   "文件列表"
  75.       Height          =   255
  76.       Left            =   120
  77.       TabIndex        =   4
  78.       Top             =   900
  79.       Width           =   1815
  80.    End
  81.    Begin VB.Label Label2 
  82.       Caption         =   "替换为->"
  83.       Height          =   255
  84.       Left            =   1560
  85.       TabIndex        =   2
  86.       Top             =   560
  87.       Width           =   735
  88.    End
  89.    Begin VB.Label Label1 
  90.       Caption         =   "文字替换:"
  91.       Height          =   255
  92.       Left            =   120
  93.       TabIndex        =   0
  94.       Top             =   120
  95.       Width           =   975
  96.    End
  97. End
  98. Attribute VB_Name = "frmMain"
  99. Attribute VB_GlobalNameSpace = False
  100. Attribute VB_Creatable = False
  101. Attribute VB_PredeclaredId = True
  102. Attribute VB_Exposed = False
  103. Option Explicit
  104. Dim acadApp As AcadApplication      ' AutoCAD应用程序对象
  105. Dim acadDoc As AcadDocument         ' 当前活动文档对象
  106. Const LB_ITEMFROMPOINT = &H1A9
  107. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  108.         (ByVal hWnd As Long, ByVal wMsg As Long, _
  109.         ByVal wParam As Long, lParam As Any) As Long
  110. Private Sub cmdCancel_Click()
  111.     acadApp.Quit
  112.     End
  113. End Sub
  114. Private Sub cmdDelete_Click()
  115.     ' 确认列表框包含列表项
  116.     If lstFile.ListCount >= 1 Then
  117.         ' 如果没有选中的内容,用上一次的列表项
  118.         If lstFile.ListIndex = -1 Then
  119.             MsgBox "请选择列表中的图形名称!"
  120.             Exit Sub
  121.         End If
  122.         lstFile.RemoveItem (lstFile.ListIndex)
  123.     End If
  124. End Sub
  125. Private Sub cmdOk_Click()
  126.     Dim adText As AcadText
  127.     Dim adMText As AcadMText
  128.     Dim adSS As AcadSelectionSet
  129.     Dim fType(0 To 1) As Integer, fData(0 To 1)
  130.     Dim i As Integer
  131.     
  132.     If txtFind.Text = "" Or txtReplace.Text = "" Then
  133.         MsgBox "输入所要替换的字符串内容!"
  134.         Exit Sub
  135.     End If
  136.     If lstFile.ListCount = 0 Then
  137.         MsgBox "请添加所要操作的图形!"
  138.         Exit Sub
  139.     End If
  140.     
  141.     ' 获得替换数据
  142.     Dim strFind As String
  143.     Dim strReplace As String
  144.     strFind = txtFind.Text
  145.     strReplace = txtReplace.Text
  146.     ' 打开图形进行操作
  147.     For i = 0 To lstFile.ListCount - 1
  148.         Call ReplaceTextInDwg(lstFile.List(i), strFind, strReplace)
  149.     Next i
  150.     
  151.     ' 在退出应用程序之前关闭AutoCAD
  152.     acadApp.Quit
  153.     End
  154. End Sub
  155. Private Sub cmdOpen_Click()
  156.     On Error GoTo errHandle
  157.     
  158.     Dim i As Integer
  159.     Dim Y As Integer
  160.     Dim Z As Integer
  161.     Dim fileNames() As String
  162.     
  163.     With comDlg
  164.         .CancelError = True
  165.         .MaxFileSize = 32767
  166.         .Flags = cdlOFNHideReadOnly Or cdlOFNAllowMultiselect Or cdlOFNExplorer Or cdlOFNNoDereferenceLinks
  167.         .DialogTitle = "选择图形文件"
  168.         .Filter = "图形文件(*.dwg)|*.dwg|所有文件(*.*)|*.*"
  169.         .FileName = ""
  170.         .ShowOpen
  171.     End With
  172.     
  173.     comDlg.FileName = comDlg.FileName & Chr(0)  '这些文件名是用空字符Chr(0)分隔符,而不是空格分隔符隔开
  174.     
  175.     Z = 1
  176.     For i = 1 To Len(comDlg.FileName)
  177.         'InStr函数,返回 Variant (Long),指定一字符串在另一字符串中最先出现的位置
  178.         '语法 InStr(起点位置, string1, string2)
  179.         i = InStr(Z, comDlg.FileName, Chr(0))
  180.         If i = 0 Then Exit For
  181.         ReDim Preserve fileNames(Y)
  182.         'Mid函数,返回 Variant (String),其中包含字符串中指定数量的字符
  183.         '语法 Mid(string, start[, length])
  184.         fileNames(Y) = Mid(comDlg.FileName, Z, i - Z)
  185.         Z = i + 1
  186.         Y = Y + 1
  187.     Next i
  188.     '向列表框中添加对象
  189.     Dim count As Integer
  190.     count = lstFile.ListCount
  191.     If Y = 1 Then
  192.         If Not HasItem(fileNames(Y - 1)) Then
  193.             lstFile.AddItem fileNames(Y - 1), count
  194.         End If
  195.     Else
  196.         For i = 1 To Y - 1
  197.             If StrComp(Right$(fileNames(0), 1), "") = 0 Then
  198.                 fileNames(i) = fileNames(0) & fileNames(i)
  199.             Else
  200.                 fileNames(i) = fileNames(0) & "" & fileNames(i)
  201.             End If
  202.             
  203.             If Not HasItem(fileNames(i)) Then
  204.                 lstFile.AddItem fileNames(i), i - 1 + count
  205.             End If
  206.         Next i
  207.     End If
  208. errHandle:
  209. End Sub
  210. Private Sub Form_Load()
  211.     On Error Resume Next
  212.     ' 获得正在运行的AutoCAD应用程序对象
  213.     Set acadApp = GetObject(, "AutoCAD.Application.16")
  214.     If Err Then
  215.         Err.Clear
  216.         ' 创建一个新的AutoCAD应用程序对象
  217.         Set acadApp = CreateObject("AutoCAD.Application.16")
  218.         
  219.         If Err Then
  220.             MsgBox Err.Description
  221.             Exit Sub
  222.         End If
  223.     End If
  224.     
  225.     ' 显示AutoCAD应用程序
  226.     acadApp.Visible = True
  227.     
  228.     lstFile.Clear
  229. End Sub
  230. ' 对某个图形进行文字替换
  231. Private Sub ReplaceTextInDwg(ByVal strDwgName As String, ByVal strFind As String, _
  232.                             ByVal strReplace As String)
  233.     ' 打开指定的图形
  234.     acadApp.Documents.Open strDwgName
  235.     Set acadDoc = acadApp.ActiveDocument
  236.     
  237.     Dim ent As AcadEntity
  238.     For Each ent In acadDoc.ModelSpace
  239.         If TypeOf ent Is AcadText Or TypeOf ent Is AcadMText Then
  240.             With ent
  241.                 If InStr(.TextString, strFind) Then .TextString = ReplaceStr(.TextString, strFind, strReplace, False)
  242.             End With
  243.         End If
  244.     Next ent
  245.     
  246.     ' 保存并关闭图形
  247.     acadDoc.Close True
  248. End Sub
  249. ' 对字符串中指定的字符进行替换
  250. Public Function ReplaceStr(ByVal searchStr As String, ByVal oldStr As String, _
  251.         ByVal newStr As String, ByVal firstOnly As Boolean) As String
  252.     '对错误操作的处理
  253.     If searchStr = "" Then Exit Function
  254.     If oldStr = "" Then Exit Function
  255.     ReplaceStr = ""
  256.     Dim i As Integer, oldStrLen As Integer, holdStr As String, StrLoc As Integer
  257.     
  258.     '计算原来字符串的长度
  259.     oldStrLen = Len(oldStr)
  260.     StrLoc = InStr(searchStr, oldStr)
  261.     
  262.     While StrLoc > 0
  263.         '获得图形中文字对象位于查找字符串之前的字符串
  264.         holdStr = holdStr & Left(searchStr, StrLoc - 1) & newStr
  265.         '获得文字对象位于查找字符串之后的字符串
  266.         searchStr = Mid(searchStr, StrLoc + oldStrLen)
  267.         StrLoc = InStr(searchStr, oldStr)
  268.         If firstOnly Then ReplaceStr = holdStr & searchStr: Exit Function
  269.     Wend
  270.     
  271.     ReplaceStr = holdStr & searchStr
  272. End Function
  273. ' 列表框中是否存在指定名称的项目
  274. Private Function HasItem(ByVal strDwgName As String) As Boolean
  275.     HasItem = False
  276.     
  277.     Dim i As Integer
  278.     For i = 0 To lstFile.ListCount - 1
  279.         If StrComp(lstFile.List(i), strDwgName, vbTextCompare) = 0 Then
  280.             HasItem = True
  281.             Exit Function
  282.         End If
  283.     Next i
  284. End Function
  285. Private Sub lstFile_DblClick()
  286.     Dim pt As Variant
  287.     ' 将焦点切换到AutoCAD
  288.     ForceForegroundWindow acadApp.hWnd
  289.     pt = acadApp.ActiveDocument.Utility.GetPoint(, "拾取一点:")
  290.     
  291.     ' 焦点切换回当前的窗体
  292.     ForceForegroundWindow frmMain.hWnd
  293.     
  294.     ' 显示点的坐标
  295.     MsgBox "拾取点的坐标为:(" & pt(0) & "," & pt(1) & "," & pt(2) & ")"
  296. End Sub
  297. Private Sub lstFile_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  298.     Dim lXPoint As Long
  299.     Dim lYPoint As Long
  300.     Dim lIndex As Long
  301.     
  302.     If Button = 0 Then ' 确定在移动鼠标的同时没有按下功能键或者鼠标键
  303.         ' 获得光标的位置,以像素为单位
  304.         lXPoint = CLng(X / Screen.TwipsPerPixelX)
  305.         lYPoint = CLng(Y / Screen.TwipsPerPixelY)
  306.         
  307.         ' 显示列表框中元素的内容
  308.         With lstFile
  309.             ' 获得光标所在的行的索引
  310.             lIndex = SendMessage(.hWnd, LB_ITEMFROMPOINT, 0, _
  311.                             ByVal ((lYPoint * 65536) + lXPoint))
  312.             
  313.             ' 将ListBox的Tooltip属性设置为该行的文本
  314.             If (lIndex >= 0) And (lIndex <= .ListCount) Then
  315.                 .ToolTipText = .List(lIndex)
  316.             Else
  317.                 .ToolTipText = ""
  318.             End If
  319.         End With
  320.     End If
  321. End Sub