自己用VBA编的批量打印程序(原创)
本帖最后由 作者 于 2009-7-22 0:32:30 编辑 <br /><br /> <p> 源码共享,回报明经! </p><p></p><p>注:58楼已更新。</p><p>2009.7.23</p> <P>Option Explicit<BR>'图形集合<BR>Private colDwgs As New Collection<BR>'文档对象<BR>Dim objDoc As AcadDocument<BR>'布局对象<BR>Dim objLayout As AcadLayout<BR>'打印对象<BR>Dim objPlot As AcadPlot</P><P>Private Type BrowseInfo<BR> hOwner As Long<BR> pidlRoot As Long<BR> pszDisplayName As String<BR> lpszTitle As String<BR> ulFlags As Long<BR> lpfn As Long<BR> lParam As Long<BR> iImage As Long<BR>End Type<BR>Private Const MAX_PATH = 260<BR>'代表ESC键<BR>Private Const VK_ESCAPE = &H1B</P>
<P>'API函数的声明<BR>Private Declare Function SHBrowseForFolder Lib "shell32.dll" _<BR> Alias "SHBrowseForFolderA" (lpBrowseInfo As BrowseInfo) As Long<BR>Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _<BR> ByVal lpWindowName As String) As Long<BR>Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal _<BR> pidl As Long, ByVal pszPath As String) As Long<BR>Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer</P>
<P>' 功能:判断用户是否按下某一个键<BR>' 输入:代表键的常量(从API Viewer中获得)<BR>' 调用:API函数GetAsyncKeyState<BR>' 返回:如果用户按下了指定的键,返回True;否则返回False<BR>' 示例:<BR>' If CheckKey(&H1B) = True Then do sth<BR>Private Function CheckKey(lngKey As Long) As Boolean<BR> If GetAsyncKeyState(lngKey) Then<BR> CheckKey = True<BR> Else<BR> CheckKey = False<BR> End If<BR>End Function</P>
<P>Private Sub cboPaperSize_Change()<BR> '若组合框非空<BR> If cboPaperSize.Text <> "" Then<BR> ' 设置图纸尺寸<BR> objLayout.CanonicalMediaName = cboPaperSize.Text<BR> ' 显示图纸尺寸<BR> Call SetPlotZone<BR> End If<BR>End Sub</P>
<P>Private Sub cboPlotScale_Click()<BR> If cboPlotScale.Value Then<BR> objLayout.UseStandardScale = True '使用标准打印比例<BR> Else<BR> objLayout.UseStandardScale = False '使用自定义打印比例<BR> End If</P>
<P> Select Case cboPlotScale.Value<BR> Case 0<BR> 'txtNumerator = 1<BR> 'txtDenominator = 1<BR> Case 1<BR> objLayout.StandardScale = acScaleToFit<BR> txtNumerator = 1<BR> txtDenominator = ""<BR> Case 2<BR> objLayout.StandardScale = ac1_1<BR> txtNumerator = 1<BR> txtDenominator = 1<BR> Case 3<BR> objLayout.StandardScale = ac1_2<BR> txtNumerator = 1<BR> txtDenominator = 2<BR> Case 4<BR> objLayout.StandardScale = ac1_4<BR> txtNumerator = 1<BR> txtDenominator = 4<BR> Case 5<BR> objLayout.StandardScale = ac1_8<BR> txtNumerator = 1<BR> txtDenominator = 8<BR> Case 6<BR> objLayout.StandardScale = ac1_10<BR> txtNumerator = 1<BR> txtDenominator = 10<BR> Case 7<BR> objLayout.StandardScale = ac1_16<BR> txtNumerator = 1<BR> txtDenominator = 16<BR> Case 8<BR> objLayout.StandardScale = ac1_20<BR> txtNumerator = 1<BR> txtDenominator = 20<BR> Case 9<BR> objLayout.StandardScale = ac1_30<BR> txtNumerator = 1<BR> txtDenominator = 30<BR> Case 10<BR> objLayout.StandardScale = ac1_40<BR> txtNumerator = 1<BR> txtDenominator = 40<BR> Case 11<BR> objLayout.StandardScale = ac1_50<BR> txtNumerator = 1<BR> txtDenominator = 50<BR> Case 12<BR> objLayout.StandardScale = ac1_100<BR> txtNumerator = 1<BR> txtDenominator = 100<BR> Case 13<BR> objLayout.StandardScale = ac2_1<BR> txtNumerator = 2<BR> txtDenominator = 1<BR> Case 14<BR> objLayout.StandardScale = ac4_1<BR> txtNumerator = 4<BR> txtDenominator = 1<BR> Case 15<BR> objLayout.StandardScale = ac8_1<BR> txtNumerator = 8<BR> txtDenominator = 1<BR> Case 16<BR> objLayout.StandardScale = ac10_1<BR> txtNumerator = 10<BR> txtDenominator = 1<BR> Case 17<BR> objLayout.StandardScale = ac100_1<BR> txtNumerator = 100<BR> txtDenominator = 1<BR> End Select<BR>End Sub</P>
<P>Private Sub cboPlotStyleTableNames_Change()<BR> ' 设置打印样式表<BR> objLayout.StyleSheet = cboPlotStyleTableNames.Text<BR>End Sub</P>
<P>Private Sub cboPrintersName_Change()<BR> On Error Resume Next<BR> ' 设置打印机配置(对应AutoCAD中:打印>打印设备>打印机配置>"DWF6 ePlot.pc3")<BR> objLayout.ConfigName = cboPrintersName.Text<BR> ' 更新显示AutoCAD中当前可用的所有图纸尺寸<BR> Call ListPaperSize<BR> ' 更新显示AutoCAD中当前可用的所有打印样式表<BR> Call ListPlotStyleTableNames<BR>End Sub</P>
<P>Private Sub chkCenterPlot_Change()<BR> Dim PtOffset(0 To 1) As Double<BR> ' 设置图纸是否居中打印<BR> If chkCenterPlot.Value Then<BR> PtOffset(0) = 0<BR> PtOffset(1) = 0<BR> Else<BR> PtOffset(0) = -5<BR> PtOffset(1) = -5<BR> End If<BR> txtOffsetX.Value = PtOffset(0)<BR> txtOffsetY.Value = PtOffset(1)<BR>End Sub</P>
<P>Private Sub chkPlotHidden_Change()<BR> '设置是否隐藏图纸空间对象<BR> If chkPlotHidden.Value Then<BR> '打印时隐藏图纸空间对象<BR> objLayout.PlotHidden = True<BR> Else<BR> '打印时不隐藏图纸空间对象<BR> objLayout.PlotHidden = False<BR> End If<BR>End Sub</P>
<P>Private Sub chkPlotToFile_Change()<BR> '设置“打印到文件”组各控件激活状态<BR> If chkPlotToFile.Value Then<BR> lbPlotPath.Enabled = True<BR> cboPlotPath.Enabled = True<BR> cmdBrowse2.Enabled = True<BR> Else<BR> lbPlotPath.Enabled = False<BR> cboPlotPath.Enabled = False<BR> cmdBrowse2.Enabled = False<BR> End If<BR>End Sub</P>
<P>Private Sub chkPlotWithLineweights_Change()<BR> '设置是否打印对象线宽<BR> If chkPlotWithLineweights.Value Then<BR> '打印时使用图形文件中的线宽<BR> objLayout.PlotWithLineweights = True<BR> Else<BR> '打印时使用打印样式中的线宽<BR> objLayout.PlotWithLineweights = False<BR> End If<BR>End Sub</P>
<P>Private Sub chkPlotWithPlotStyles_Change()<BR> '设置是否应用打印样式<BR> If chkPlotWithPlotStyles.Value Then<BR> '打印时在对象中使用打印样式<BR> objLayout.PlotWithPlotStyles = True<BR> chkPlotWithLineweights.Enabled = False<BR> Else<BR> '打印时在对象中不使用打印样式<BR> objLayout.PlotWithPlotStyles = False<BR> chkPlotWithLineweights.Enabled = True<BR> End If<BR>End Sub</P>
<P>Private Sub chkReverse_Click()<BR> ' 设置图纸打印方向<BR> Call PaperRotationChange<BR>End Sub</P>
<P>Private Sub cmdAdd_Click()<BR> '如果列表框中未存在任何元素<BR> If lstCurFiles.ListCount = 0 Then<BR> MsgBox "请先向列表框中添加文件!", vbCritical<BR> Exit Sub<BR> End If</P>
<P> Dim strFlies As String<BR> Dim i As Integer<BR> Dim n As Integer<BR> n = 0<BR> '将上面列表框中选中的对象添加到下面的列表框中<BR> For i = 0 To lstCurFiles.ListCount - 1<BR> If lstCurFiles.Selected(i) Then<BR> strFlies = lstCurFiles.List(i)<BR> n = n + 1<BR> If Not HasItem(lstPlotFiles, strFlies) Then<BR> lstPlotFiles.AddItem lstCurFiles.List(i) '<BR> End If<BR> End If<BR> Next i<BR> '如果列表框中未存在被选择的元素<BR> If n = 0 Then<BR> MsgBox "请选择要从列表中添加的元素!", vbCritical<BR> Exit Sub<BR> End If<BR>End Sub</P>
<P>Private Sub cmdAddAll_Click()<BR> '如果列表框中未存在任何元素<BR> If lstCurFiles.ListCount = 0 Then<BR> MsgBox "请先向列表框中添加文件!", vbCritical<BR> Exit Sub<BR> End If<BR> <BR> Dim strFlies As String<BR> Dim i As Integer<BR> '将上面列表框中选中的对象添加到下面的列表框中<BR> For i = 0 To lstCurFiles.ListCount - 1<BR> strFlies = lstCurFiles.List(i)<BR> If Not HasItem(lstPlotFiles, strFlies) Then<BR> lstPlotFiles.AddItem lstCurFiles.List(i)<BR> End If<BR> Next i<BR>End Sub</P>
<P>Private Sub cmdBrowse_Click()<BR> '在文本框中显示获得的路径<BR> txtCurPath.Text = ReturnFolder(0)<BR>End Sub</P>
<P>Private Sub cmdBrowse2_Click()<BR> Dim strPath As String<BR> strPath = ReturnFolder(0)<BR> '若返回文件夹路径非空<BR> If strPath <> "" Then<BR> '若组合框中未存在返回文件夹路径,则将其添加到组合框中<BR> If HasItem2(strPath) < 0 Then<BR> '在组合框中显示获得的路径<BR> With cboPlotPath<BR> .AddItem strPath, 0<BR> '使用下拉列表的形式<BR> .Style = fmStyleDropDownList<BR> '设置下拉列表的下标下限<BR> .BoundColumn = 0<BR> '设置默认的显示项目<BR> .ListIndex = 0<BR> End With<BR> '若组合框中已存在返回文件夹路径,则将返回文件夹路径置为选中<BR> Else<BR> With cboPlotPath<BR> '设置默认的显示项目<BR> .ListIndex = HasItem2(strPath)<BR> End With<BR> End If<BR> End If<BR>End Sub</P>
<P>Private Sub cmdClear_Click()<BR> '如果列表框中未存在任何元素<BR> If lstPlotFiles.ListCount = 0 Then<BR> MsgBox "请先向列表框中添加文件!", vbCritical<BR> Exit Sub<BR> End If<BR> <BR> Dim i As Integer, n As Integer, count As Integer<BR> '列表框中元素的数量<BR> count = lstPlotFiles.ListCount<BR> n = 0<BR> '将列表框中选中的对象删除<BR> For i = 0 To count - 1<BR> If lstPlotFiles.Selected(i) Then<BR> n = n + 1<BR> Else<BR> '移动列表框中的元素<BR> lstPlotFiles.List(i - n) = lstPlotFiles.List(i)<BR> End If<BR> Next i<BR> <BR> '如果列表框中未存在被选择的元素<BR> If n = 0 Then<BR> MsgBox "请选择要从列表中清除的元素!", vbCritical<BR> Exit Sub<BR> End If<BR> <BR> '删除最后n行的元素<BR> For i = 1 To n<BR> lstPlotFiles.RemoveItem (count - i)<BR> Next i<BR> <BR> </P>
<P>End Sub</P>
<P>Private Sub cmdClearAll_Click()<BR> '如果列表框中未存在任何元素<BR> If lstPlotFiles.ListCount = 0 Then<BR> MsgBox "请先向列表框中添加文件!", vbCritical<BR> Exit Sub<BR> End If<BR> <BR> Dim Msg, Style, Title, Help, Ctxt, Response, MyString<BR> Msg = "清除整个图形列表?"<BR> Style = vbOKCancel + vbQuestion + vbDefaultButton2<BR> Title = "Clear Files"<BR> <BR> Response = MsgBox(Msg, Style, Title)<BR> If Response = vbOK Then<BR> txtCurPath.Text = ""<BR> '清除列表框中所有元素<BR> lstPlotFiles.Clear<BR> End If<BR> <BR> <BR>End Sub</P>
<P>Private Sub cmdExit_Click()<BR> '退出<BR> End<BR>End Sub</P>
<P><BR>Private Sub cmdInput_Click()<BR> '导入打印设置<BR> '设置标准对话框<BR> With comDlg<BR> '设置标准对话框标题<BR> .DialogTitle = "导入打印设置"<BR> '设置标准对话框类型列表中所显示的过滤器<BR> .Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*"<BR> '设置标准对话框的起始目录<BR> '.InDir = "C:\"<BR> '显示[打开]对话框<BR> .ShowOpen<BR> End With<BR> <BR> Dim strFileName As String<BR> strFileName = comDlg.fileName<BR> 'strFileName = "F:\AutoCAD\丹通施工图\打印设置.txt"<BR> '若返回文件名为空,不进行操作<BR> If strFileName = "" Then<BR> MsgBox "请重新选择文件位置!"<BR> Exit Sub<BR> End If<BR> <BR> '读入文件的操作<BR> Dim i As Integer, nFile As Integer<BR> Dim x As Double, y As Double<BR> Dim count As Integer, index As Integer<BR> Dim strTemp As String<BR> '获得下一个可供Open语句使用的文件号<BR> nFile = FreeFile<BR> '打开文件<BR> Open strFileName For Input As #nFile<BR> <BR> '读入当前路径<BR> '读入一行文本并存储在变量中<BR> Line Input #nFile, strTemp<BR> '读入当前路径并设置文本框文字<BR> Input #nFile, strTemp<BR> txtCurPath.Text = strTemp<BR> <BR> '读入打印文件列表并添加到列表框中<BR> Call InputData3(lstPlotFiles, nFile)<BR> <BR> '读入打印机配置列表并添加到组合框中<BR> Call InputData(cboPrintersName, nFile)<BR> <BR> '读入打印样式表并添加到组合框中<BR> Call InputData(cboPlotStyleTableNames, nFile)<BR> <BR> '读入图纸尺寸列表并添加到组合框中<BR> Call InputData(cboPaperSize, nFile)<BR> <BR> '读入图纸单位并设置单选按钮选择状态<BR> '读入一行文本并存储在变量中<BR> Line Input #nFile, strTemp<BR> '读入图纸单位<BR> Input #nFile, strTemp<BR> '设置单选按钮选择状态<BR> If strTemp = "毫米" Then<BR> optMillimeters.Value = True<BR> Else<BR> optInches.Value = True<BR> End If<BR> <BR> '读入图纸方向并设置单选按钮选择状态<BR> '读入一行文本并存储在变量中<BR> Line Input #nFile, strTemp<BR> '读入图纸方向<BR> Input #nFile, strTemp<BR> '设置单选按钮选择状态<BR> If strTemp = "纵向" Then<BR> optVertical.Value = True<BR> Else<BR> optHorizontal.Value = True<BR> End If<BR> <BR> '读入是否反向打印并设置复选按钮选择状态<BR> Call InputData2(chkReverse, nFile)<BR> <BR> '读入打印份数<BR> '读入一行文本并存储在变量中<BR> Line Input #nFile, strTemp<BR> '读入打印份数<BR> Input #nFile, count<BR> '设置文本框文字<BR> txtNumber.Text = count<BR> <BR> '读入是否打印到文件并设置复选按钮选择状态<BR> Call InputData2(chkPlotToFile, nFile)<BR> <BR> '读入打印路径列表并添加到组合框中<BR> Call InputData(cboPlotPath, nFile)<BR> <BR> '读入打印比例列表并添加到组合框中<BR> Call InputData(cboPlotScale, nFile)<BR> <BR> '读入一行文本并存储在变量中<BR> Line Input #nFile, strTemp<BR> '读入当前打印比例并设置文本框文字<BR> Input #nFile, x<BR> Input #nFile, y<BR> txtNumerator.Text = x<BR> txtDenominator.Text = y<BR> <BR> '读入是否居中打印并设置复选按钮选择状态<BR> Call InputData2(chkCenterPlot, nFile)<BR> <BR> '读入打印偏移<BR> '读入一行文本并存储在变量中<BR> Line Input #nFile, strTemp<BR> '读入打印偏移并设置文本框文字<BR> Input #nFile, x<BR> Input #nFile, y<BR> txtOffsetX.Text = x<BR> txtOffsetY.Text = y<BR> <BR> '读入是否打印对象线宽并设置复选按钮选择状态<BR> Call InputData2(chkPlotWithLineweights, nFile)<BR> '读入是否采用打印样式并设置复选按钮选择状态<BR> Call InputData2(chkPlotWithPlotStyles, nFile)<BR> '读入是否隐藏图纸空间对象并设置复选按钮选择状态<BR> Call InputData2(chkPlotHidden, nFile)<BR> <BR> '读入图框形式并设置单选按钮选择状态<BR> '读入一行文本并存储在变量中<BR> Line Input #nFile, strTemp<BR> '读入图框形式<BR> Input #nFile, strTemp<BR> '设置单选按钮选择状态<BR> If strTemp = "图块" Then<BR> optBlock.Value = True<BR> Else<BR> optLayer.Value = True<BR> End If<BR> <BR> '读入图块名列表并添加到组合框中<BR> Call InputData(cboBlockName, nFile)<BR> <BR> '读入图层名列表并添加到组合框中<BR> Call InputData(cboLayerName, nFile)<BR> <BR> '关闭文件<BR> Close #nFile</P>
<P>End Sub</P>
<P>Private Sub cmdListPrints_Click()<BR> ' 显示AutoCAD中当前可用的打印机列表<BR> Call ListPrinters<BR>End Sub</P>
<P>Private Sub cmdOutput_Click()<BR> '导出打印设置<BR> '设置标准对话框<BR> With comDlg<BR> '设置标准对话框标题<BR> .DialogTitle = "导出打印设置"<BR> '设置标准对话框类型列表中所显示的过滤器<BR> .Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*"<BR> '设置标准对话框的起始目录<BR> '.InDir = "C:\"<BR> '设置[另存为]对话框的缺省扩展名<BR> .DefaultExt = "txt"<BR> '显示[另存为]对话框<BR> .ShowSave<BR> End With<BR> <BR> Dim strFileName As String, strTemp As String<BR> strFileName = comDlg.fileName<BR> 'strFileName = "F:\AutoCAD\丹通施工图\打印设置.txt"<BR> '若返回文件名为空,不进行操作<BR> If strFileName = "" Then<BR> MsgBox "请重新选择保存位置!"<BR> Exit Sub<BR> End If<BR> <BR> '保存文件的操作<BR> Dim i As Integer<BR> '打开文件<BR> Open strFileName For Output As #1<BR> <BR> '输出当前路径<BR> Print #1, "当前路径:"<BR> Print #1, txtCurPath.Text<BR> <BR> '输出打印文件列表<BR> Print #1, "打印文件列表:"<BR> '输出打印机配置列表的信息<BR> Call OutputData3(lstPlotFiles, 1)<BR> <BR> '输出打印机配置<BR> Print #1, "打印机配置:"<BR> '输出打印机配置列表的信息<BR> Call OutputData(cboPrintersName, 1)<BR> <BR> '输出打印样式表<BR> Print #1, "打印样式表:"<BR> '输出打印样式表的信息<BR> Call OutputData(cboPlotStyleTableNames, 1)<BR> <BR> '输出图纸尺寸列表<BR> Print #1, "图纸尺寸列表:"<BR> '输出图纸尺寸列表的信息<BR> Call OutputData(cboPaperSize, 1)<BR> <BR> '输出图纸单位<BR> Print #1, "图纸单位:"<BR> '输出图纸单位信息<BR> If optMillimeters.Value = True Then<BR> strTemp = "毫米"<BR> Else<BR> strTemp = "英寸"<BR> End If<BR> Print #1, strTemp<BR> <BR> '输出图纸方向<BR> Print #1, "图纸方向:"<BR> '输出图纸方向信息<BR> If optVertical.Value = True Then<BR> strTemp = "纵向"<BR> Else<BR> strTemp = "横向"<BR> End If<BR> Print #1, strTemp<BR> <BR> '输出是否反向打印<BR> Print #1, "是否反向打印:"<BR> Call OutputData2(chkReverse, 1)<BR> <BR> '输出打印份数<BR> Print #1, "打印份数:"<BR> Print #1, txtNumber.Text<BR> <BR> '输出是否打印到文件<BR> Print #1, "是否打印到文件:"<BR> Call OutputData2(chkPlotToFile, 1)<BR> <BR> '输出打印路径<BR> Print #1, "打印路径:"<BR> '输出打印路径列表的信息<BR> Call OutputData(cboPlotPath, 1)<BR> <BR> '输出打印比例<BR> Print #1, "打印比例:"<BR> '输出打印比例列表的信息<BR> Call OutputData(cboPlotScale, 1)<BR> <BR> '输出当前打印比例<BR> Print #1, "当前打印比例:"<BR> Print #1, txtNumerator.Text<BR> Print #1, txtDenominator.Text<BR> <BR> '输出是否居中打印<BR> Print #1, "是否居中打印:"<BR> Call OutputData2(chkCenterPlot, 1)<BR> <BR> '输出打印偏移<BR> Print #1, "打印偏移:"<BR> Print #1, txtOffsetX.Text<BR> Print #1, txtOffsetY.Text<BR> <BR> '输出是否打印对象线宽<BR> Print #1, "是否打印对象线宽:"<BR> Call OutputData2(chkPlotWithLineweights, 1)<BR> '输出是否采用打印样式<BR> Print #1, "是否采用打印样式:"<BR> Call OutputData2(chkPlotWithPlotStyles, 1)<BR> '输出是否隐藏图纸空间对象<BR> Print #1, "是否隐藏图纸空间对象:"<BR> Call OutputData2(chkPlotHidden, 1)<BR> <BR> '输出图框形式<BR> Print #1, "图框形式:"<BR> '输出图框形式信息<BR> If optBlock.Value = True Then<BR> strTemp = "图块"<BR> Else<BR> strTemp = "图层"<BR> End If<BR> Print #1, strTemp<BR> <BR> '输出图块名列表<BR> Print #1, "图块名列表:"<BR> '输出图块名列表的信息<BR> Call OutputData(cboBlockName, 1)<BR> <BR> '输出图层名列表<BR> Print #1, "图块名列表:"<BR> '输出图层名列表的信息<BR> Call OutputData(cboLayerName, 1)<BR> <BR> '关闭文件<BR> Close 1</P>
<P>End Sub</P>
<P>Private Sub cmdPick_Click()<BR> On Error Resume Next<BR> Dim objSelect As AcadEntity<BR> Dim ptPick As Variant<BR> Dim strTemp As String<BR> <BR> Set objDoc = ThisDrawing.Application.ActiveDocument<BR> '将控制权交给AutoCAD<BR> frmBatchPlot.Hide<BR> '在AutoCAD中选择实体并判断类型<BR>Retry:<BR> objDoc.Utility.GetEntity objSelect, ptPick, vbCrLf & "请选择实体:"<BR> ' 处理按下Esc键的错误<BR> If objSelect Is Nothing Then<BR> If CheckKey(VK_ESCAPE) = True Then<BR> '显示对话框<BR> frmBatchPlot.Show<BR> Exit Sub<BR> Else<BR> GoTo Retry<BR> End If<BR> End If<BR> ' 处理未选择到实体的错误<BR> If Err <> 0 Then<BR> Err.Clear<BR> GoTo Retry<BR> End If<BR> <BR> '若为指定图块<BR> If optBlock.Value = True Then<BR> '判断实体是否块参照<BR> If TypeOf objSelect Is AcadBlockReference Then<BR> '判断实体是否模型空间、图纸空间和匿名块<BR> If StrComp(Left(objSelect.Name, 1), "*") <> 0 Then<BR> '获得块参照名<BR> strTemp = objSelect.Name<BR> Else<BR> MsgBox "您选择的是匿名块,请重新选择块参照!", vbCritical<BR> '显示对话框<BR> frmBatchPlot.Show<BR> Exit Sub<BR> End If<BR> Else<BR> MsgBox "您选择的不是块参照,请重新选择块参照!", vbCritical<BR> '显示对话框<BR> frmBatchPlot.Show<BR> Exit Sub<BR> End If<BR> '刷新块参照列表<BR> Call ListBlock<BR> '将所选块参照在组合框中置为当前<BR> Call SetSelected(cboBlockName, strTemp)<BR> Else<BR> '判断实体是否多段线<BR> If TypeOf objSelect Is AcadLWPolyline Then<BR> '获得多段线所在图层名<BR> strTemp = objSelect.Layer<BR> Else<BR> MsgBox "您选择的不是轻量多段线,请重新选择轻量多段线!", vbCritical<BR> '显示对话框<BR> frmBatchPlot.Show<BR> Exit Sub<BR> End If<BR> ' 刷新图层列表<BR> Call ListLayer<BR> '将所选实体所在图层在组合框中置为当前<BR> Call SetSelected(cboLayerName, strTemp)<BR> End If<BR> '显示对话框<BR> frmBatchPlot.Show</P>
<P>End Sub</P>
<P>Private Sub SetSelected(ListObject As Object, SItem As String)<BR> '将该元素在组合框中置为当前<BR> Dim i As Long<BR> <BR> '通过比较确定该元素的位置<BR> For i = 0 To (ListObject.ListCount - 1)<BR> If StrComp(ListObject.List(i), SItem, vbTextCompare) = 0 Then<BR> ListObject.ListIndex = i<BR> Exit Sub<BR> End If<BR> Next</P>
<P>End Sub</P>
<P>Private Sub cmdPreview_Click()<BR> '若按图块进行批量打印<BR> If optBlock.Value = True Then<BR> If cboBlockName.ListCount = 0 Or cboBlockName.Text = "" Then<BR> MsgBox "请先选择块参照!", vbCritical<BR> Exit Sub<BR> End If<BR> Call PreviewByBlock(cboBlockName.Text)<BR> '若按图层进行批量打印<BR> Else<BR> If cboLayerName.ListCount = 0 Or cboLayerName.Text = "" Then<BR> MsgBox "请先选择块参照!", vbCritical<BR> Exit Sub<BR> End If<BR> Call PreviewByLayer(cboLayerName.Text)<BR> End If<BR> <BR>End Sub</P>
<P>Private Sub cmdRefresh_Click()<BR> '刷新块参照列表<BR> Call ListBlock<BR> ' 刷新图层列表<BR> Call ListLayer<BR>End Sub</P>
<P>Private Sub cmdPlot_Click()<BR> '若按图块进行批量打印<BR> If optBlock.Value = True Then<BR> If cboBlockName.ListCount = 0 Or cboBlockName.Text = "" Then<BR> MsgBox "请先选择块参照!", vbCritical<BR> Exit Sub<BR> End If<BR> Call BatchPlotByBlock(cboBlockName.Text)<BR> '若按图层进行批量打印<BR> Else<BR> If cboLayerName.ListCount = 0 Or cboLayerName.Text = "" Then<BR> MsgBox "请先选择块参照!", vbCritical<BR> Exit Sub<BR> End If<BR> Call BatchPlotByLayer(cboLayerName.Text)<BR> End If<BR> <BR>End Sub</P>
<P>Private Sub cmdAbout_Click()<BR> '显示关于对话框<BR> frmAbout.Show<BR>End Sub</P>
<P>Private Sub optBlock_Change()<BR> '设置“图块与图层”组各控件激活状态<BR> If optBlock.Value = True Then<BR> lbBlockName.Enabled = True<BR> cboBlockName.Enabled = True<BR> lbLayerName.Enabled = False<BR> cboLayerName.Enabled = False<BR> Else<BR> lbBlockName.Enabled = False<BR> cboBlockName.Enabled = False<BR> lbLayerName.Enabled = True<BR> cboLayerName.Enabled = True<BR> End If<BR>End Sub</P>
<P>Private Sub optLayer_Change()<BR> '设置“图块与图层”组各控件激活状态<BR> If optBlock.Value = True Then<BR> lbBlockName.Enabled = True<BR> cboBlockName.Enabled = True<BR> lbLayerName.Enabled = False<BR> cboLayerName.Enabled = False<BR> Else<BR> lbBlockName.Enabled = False<BR> cboBlockName.Enabled = False<BR> lbLayerName.Enabled = True<BR> cboLayerName.Enabled = True<BR> End If<BR>End Sub</P>
<P>Private Sub optMillimeters_Change()<BR> ' 设置图纸单位<BR> If optMillimeters.Value = True Then<BR> objLayout.PaperUnits = acMillimeters<BR> lbUnit.Caption = "毫米 ="<BR> lbUnitX.Caption = "毫米"<BR> lbUnitY.Caption = "毫米"<BR> lbPaperUnit.Caption = "毫米"<BR> Else<BR> objLayout.PaperUnits = acInches<BR> lbUnit.Caption = "英寸 ="<BR> lbUnitX.Caption = "英寸"<BR> lbUnitY.Caption = "英寸"<BR> lbPaperUnit.Caption = "英寸"<BR> End If<BR> ' 显示图纸尺寸<BR> Call SetPlotZone<BR> <BR>End Sub</P>
<P>Private Sub OptVertical_Change()<BR> ' 设置图纸打印方向<BR> Call PaperRotationChange<BR>End Sub</P>
<P>Private Sub spnAngle_SpinDown()<BR> If CInt(txtNumber.Text) > 1 Then<BR> txtNumber.Text = CInt(txtNumber.Text) - 1<BR> End If<BR>End Sub</P>
<P>Private Sub spnAngle_SpinUp()<BR> txtNumber.Text = CInt(txtNumber.Text) + 1<BR>End Sub</P>
<P>Private Sub txtCurPath_Change()<BR> '查找文件,向列表框中添加<BR> If Len(Dir(txtCurPath.Text)) > 0 Then<BR> FindFile colDwgs, txtCurPath.Text, "dwg"<BR> If AddToList(lstCurFiles, colDwgs) Then<BR> End If<BR> End If<BR>End Sub</P>
<P>Private Sub txtDenominator_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)<BR> ' 设置自定义图纸尺寸<BR> If IsNumeric(txtDenominator) Then<BR> '设置组合框显示项目为“自定义”<BR> cboPlotScale.ListIndex = 0<BR> Else<BR> MsgBox "请输入数字!", vbCritical<BR> End If<BR>End Sub</P>
<P>Private Sub txtNumber_Change()<BR> ' 设置图纸打印份数<BR> 'objPlot.NumberOfCopies = CDbl(txtNumber.Text)<BR> 'objPlot.NumberOfCopies = CInt(txtNumber.Text)<BR> objPlot.NumberOfCopies = txtNumber.Value<BR>End Sub</P>
<P>Private Sub txtNumerator_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)<BR> ' 设置自定义图纸尺寸<BR> If IsNumeric(txtNumerator) Then<BR> '设置组合框显示项目为“自定义”<BR> cboPlotScale.ListIndex = 0<BR> Else<BR> MsgBox "请输入数字!", vbCritical<BR> End If<BR>End Sub</P>
<P>Private Sub txtOffsetX_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)<BR> ' 设置自定义图纸尺寸<BR> If (KeyAscii >= Asc("0") And KeyAscii <= Asc("9")) Or KeyAscii = Asc(".") Or KeyAscii = Asc("-") Then<BR> '取消“居中打印”复选框<BR> chkCenterPlot.Value = False<BR> Else<BR> MsgBox "请输入数字!", vbCritical<BR> End If<BR>End Sub</P>
<P>Private Sub txtOffsetY_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)<BR> ' 设置自定义图纸尺寸<BR> If (KeyAscii >= Asc("0") And KeyAscii <= Asc("9")) Or KeyAscii = Asc(".") Or KeyAscii = Asc("-") Then<BR> '取消“居中打印”复选框<BR> chkCenterPlot.Value = False<BR> Else<BR> MsgBox "请输入数字!", vbCritical<BR> End If<BR>End Sub</P>
<P>Private Sub UserForm_Initialize()<BR> Set objDoc = ThisDrawing.Application.ActiveDocument<BR> Set objLayout = ThisDrawing.ActiveLayout<BR> Set objPlot = ThisDrawing.Plot<BR> '禁用“当前路径”文本框<BR> txtCurPath.Enabled = False<BR> '列出当前所有打印机<BR> Call ListPrinters<BR> ' 显示AutoCAD中当前可用的打印比例列表<BR> Call ListPlotScale<BR> <BR> '设置“打印到文件”是否选中<BR> chkPlotToFile.Value = False<BR> '禁用“打印到文件”组各控件<BR> lbPlotPath.Enabled = False<BR> cboPlotPath.Enabled = False<BR> cmdBrowse2.Enabled = False<BR> <BR> ' 显示AutoCAD中当前可用的图块<BR> Call ListBlock<BR> ' 显示AutoCAD中当前可用的图层<BR> Call ListLayer<BR> <BR> <BR> <BR> <BR>End Sub</P>
<P>Public Function ReturnFolder(lngHwnd As Long) As String<BR> Dim Browser As BrowseInfo<BR> Dim lngFolder As Long<BR> Dim strPath As String<BR> Dim strTemp As String<BR> <BR> With Browser<BR> .hOwner = lngHwnd<BR> .lpszTitle = "选择工作路径"<BR> .pszDisplayName = String(MAX_PATH, 0)<BR> End With<BR> <BR> '用空格填充字符串<BR> strPath = String(MAX_PATH, 0)<BR> '调用API函数显示文件夹列表<BR> lngFolder = SHBrowseForFolder(Browser)<BR> <BR> '使用API函数获取返回的路径<BR> If lngFolder Then<BR> SHGetPathFromIDList lngFolder, strPath<BR> strTemp = Left(strPath, InStr(strPath, vbNullChar) - 1)<BR> <BR> If (Right(strTemp, 1) <> "\") Then<BR> strTemp = strTemp & "\"<BR> End If<BR> <BR> ReturnFolder = strTemp<BR> End If<BR>End Function</P>
<P>Public Sub FindFile(ByRef files As Collection, strDir, strExt)<BR> '删除集合中所有的对象<BR> Dim i As Integer<BR> For i = 1 To files.count<BR> files.Remove 1<BR> Next i<BR> <BR> '查找dwg文件,并将其添加到集合中<BR> Dim strFileName As String<BR> <BR> If (Right(strDir, 1) <> "\") Then<BR> strDir = strDir & "\"<BR> End If<BR> strFileName = Dir(strDir & "*.*", vbDirectory)<BR> <BR> Do While (strFileName <> "")<BR> If (UCase(Right(strFileName, 3)) = UCase(strExt)) Then<BR> files.Add strDir & strFileName<BR> End If<BR> strFileName = Dir '返回下一个符合条件的文件<BR> Loop<BR>End Sub</P>
<P>Public Function AddToList(objBox As ListBox, Names As Collection) As Boolean<BR> Dim i As Integer<BR> On Error GoTo Error_Control<BR> <BR> objBox.Clear<BR> '将集合中的对象添加到列表框中<BR> For i = 1 To Names.count<BR> objBox.AddItem Names(i)<BR> Next i<BR> <BR>Exit_Here:<BR> AddToList = True<BR> Exit Function<BR> <BR>Error_Control:<BR> MsgBox "发生下面的错误:" & Err.Number<BR> AddToList = False<BR>End Function</P>
<P>Private Function HasItem(objBox As ListBox, strFlies As String) As Boolean<BR> <BR> '检查路径是否已经存在<BR> HasItem = False<BR> <BR> Dim i As Integer<BR> If objBox.ListCount > 0 Then<BR> For i = 0 To objBox.ListCount - 1<BR> If StrComp(objBox.List(i), strFlies, vbTextCompare) = 0 Then<BR> HasItem = True<BR> Exit Function<BR> End If<BR> Next i<BR> End If<BR>End Function</P>
<P>Private Function HasItem2(ByVal strPath As String) As Integer<BR> <BR> '检查路径是否已经存在<BR> HasItem2 = -1<BR> <BR> Dim i As Integer<BR> If cboPlotPath.ListCount > 0 Then<BR> For i = 0 To cboPlotPath.ListCount - 1<BR> If StrComp(cboPlotPath.List(i), strPath, vbTextCompare) = 0 Then<BR> HasItem2 = i<BR> Exit Function<BR> End If<BR> Next i<BR> End If<BR>End Function</P>
<P>'打开或激活文件<BR>Private Sub OpenFile(fileName As String)<BR> Dim dwgFile As AcadDocument<BR> Dim strFile As String<BR> For Each dwgFile In ThisDrawing.Application.Documents<BR> strFile = dwgFile.Path & "\" & dwgFile.Name<BR> '若第i个图形文件已经被打开,则将其激活<BR> If strFile = fileName Then<BR> '若dwgFile尚未激活,则将其激活<BR> If dwgFile.Active = False Then<BR> ThisDrawing.Application.ActiveDocument = dwgFile<BR> End If<BR> Exit Sub<BR> End If<BR> Next<BR> '若第i个图形文件尚未被打开,则将其打开<BR> ThisDrawing.Application.Documents.Open fileName<BR> <BR>End Sub</P>
<P>' 显示AutoCAD中当前可用的打印机列表<BR>Public Sub ListPrinters()<BR> objLayout.RefreshPlotDeviceInfo<BR> <BR> ' 获得所有的可用打印机<BR> Dim plotDevices As Variant<BR> plotDevices = objLayout.GetPlotDeviceNames<BR> <BR> ' 删除以前的打印机列表<BR> cboPrintersName.Clear<BR> ' 显示打印机列表<BR> Dim i As Integer<BR> For i = 0 To UBound(plotDevices)<BR> cboPrintersName.AddItem (plotDevices(i))<BR> Next i<BR> ' 设置组合框初始选项<BR> With cboPrintersName<BR> '使用下拉列表的形式<BR> .Style = fmStyleDropDownList<BR> '设置下拉列表的下标下限<BR> .BoundColumn = 0<BR> '设置默认的显示项目<BR> .ListIndex = 1<BR> End With<BR> <BR>End Sub</P>
<P>' 显示AutoCAD中当前可用的打印样式<BR>Public Sub ListPlotStyleTableNames()<BR> Set objLayout = ThisDrawing.ActiveLayout<BR> objLayout.RefreshPlotDeviceInfo<BR> <BR> ' 获得所有的可用打印样式<BR> Dim plotStyleTables As Variant<BR> plotStyleTables = objLayout.GetPlotStyleTableNames<BR> <BR> ' 删除以前的打印样式列表<BR> cboPlotStyleTableNames.Clear<BR> ' 显打印样式列表<BR> Dim i As Integer<BR> For i = 0 To UBound(plotStyleTables)<BR> cboPlotStyleTableNames.AddItem (plotStyleTables(i))<BR> Next i<BR> ' 设置组合框初始选项<BR> With cboPlotStyleTableNames<BR> '使用下拉列表的形式<BR> .Style = fmStyleDropDownList<BR> '设置下拉列表的下标下限<BR> .BoundColumn = 0<BR> '设置默认的显示项目<BR> .ListIndex = 0<BR> End With<BR> <BR>End Sub</P>
<P>' 显示AutoCAD中当前可用的图纸尺寸<BR>Public Sub ListPaperSize()<BR> objLayout.RefreshPlotDeviceInfo<BR> <BR> ' 获得所有当前可用可用图纸尺寸列表<BR> Dim paperSizes As Variant<BR> paperSizes = objLayout.GetCanonicalMediaNames<BR> <BR> ' 删除以前的图纸尺寸列表<BR> cboPaperSize.Clear<BR> ' 显示图纸尺寸列表<BR> Dim i As Integer<BR> For i = 0 To UBound(paperSizes)<BR> cboPaperSize.AddItem (paperSizes(i))<BR> Next i<BR> ' 设置组合框初始选项<BR> With cboPaperSize<BR> '使用下拉列表的形式<BR> .Style = fmStyleDropDownList<BR> '设置下拉列表的下标下限<BR> .BoundColumn = 0<BR> '设置默认的显示项目<BR> .ListIndex = 0<BR> End With<BR> <BR>End Sub</P>
<P>' 显示AutoCAD中可以使用的打印比例<BR>Public Sub ListPlotScale()<BR>' 显打印比例列表<BR>With cboPlotScale<BR> .AddItem ("自定义"), 0<BR> .AddItem ("按图纸空间缩放"), 1<BR> .AddItem ("1:1"), 2<BR> .AddItem ("1:2"), 3<BR> .AddItem ("1:4"), 4<BR> .AddItem ("1:8"), 5<BR> .AddItem ("1:10"), 6<BR> .AddItem ("1:16"), 7<BR> .AddItem ("1:20"), 8<BR> .AddItem ("1:30"), 9<BR> .AddItem ("1:40"), 10<BR> .AddItem ("1:50"), 11<BR> .AddItem ("1:100"), 12<BR> .AddItem ("2:1"), 13<BR> .AddItem ("4:1"), 14<BR> .AddItem ("8:1"), 15<BR> .AddItem ("10:1"), 16<BR> .AddItem ("100:1"), 17<BR> <BR> '使用下拉列表的形式<BR> .Style = fmStyleDropDownList<BR> '设置下拉列表的下标下限<BR> .BoundColumn = 0<BR> '设置默认的显示项目<BR> .ListIndex = 2<BR> End With<BR> txtNumerator = 1<BR> txtDenominator = 1<BR> <BR>End Sub</P>
<P>' 显示AutoCAD中当前可用的图层<BR>Public Sub ListLayer()<BR> Dim LayerList As Collection<BR> '获得图形中存在的图层列表<BR> Set LayerList = GetLayerList()<BR> <BR> '刷新图层列表<BR> Call RefreshList(cboLayerName, LayerList)<BR> <BR> '选择图层列表中的第一个实体<BR> If cboLayerName.ListIndex = -1 Then<BR> cboLayerName.ListIndex = 0<BR> End If<BR> <BR>End Sub</P>
<P>'获得图形中存在的图层列表<BR>Private Function GetLayerList() As Collection<BR> Dim objLayer As AcadLayer<BR> Dim LayerList As New Collection<BR> <BR> Set objDoc = ThisDrawing.Application.ActiveDocument<BR> '获得可用的图层<BR> For Each objLayer In objDoc.Layers<BR> LayerList.Add objLayer.Name, objLayer.Name<BR> Next<BR> <BR> '返回图形中块参照的列表<BR> Set GetLayerList = LayerList<BR> <BR>End Function</P>
<P>' 显示AutoCAD中当前可用的图块<BR>Public Sub ListBlock()<BR> Dim BlockReferenceList As Collection<BR> '获得图形中存在的块参照列表<BR> Set BlockReferenceList = GetBlockReferences()<BR> <BR> '判断是否存在块参照<BR> If BlockReferenceList Is Nothing Then<BR> MsgBox "当前图形中不存在任何的块!", vbExclamation<BR> Exit Sub<BR> End If<BR> <BR> '刷新块参照列表<BR> Call RefreshList(cboBlockName, BlockReferenceList)<BR> <BR> '选择块参照列表中的第一个实体<BR> If cboBlockName.ListIndex = -1 Then<BR> cboBlockName.ListIndex = 0<BR> End If<BR> <BR>End Sub</P>
<P>'获得图形中存在的块参照列表<BR>Private Function GetBlockReferences() As Collection<BR> Dim BlockList As New Collection<BR> Dim AcadObject As AcadEntity<BR> <BR> Set objDoc = ThisDrawing.Application.ActiveDocument<BR> '获得可用的块参照<BR> For Each AcadObject In objDoc.ModelSpace<BR> If AcadObject.ObjectName = "AcDbBlockReference" Then<BR> '不将模型空间、图纸空间和匿名块添加到组合框中<BR> If StrComp(Left(AcadObject.Name, 1), "*") <> 0 Then<BR> On Error Resume Next<BR> BlockList.Add AcadObject.Name, AcadObject.Name<BR> End If<BR> End If<BR> Next<BR> <BR> '返回图形中块参照的列表<BR> If BlockList.count > 0 Then<BR> Set GetBlockReferences = BlockList<BR> Else<BR> Set GetBlockReferences = Nothing<BR> End If<BR>End Function</P>
<P>'将组合对象中的元素写入列表框或组合框中<BR>Private Sub RefreshList(ByRef ListObject As Object, ByRef BlockList As Collection)<BR> Dim i As Long<BR> '清空列表框<BR> ListObject.Clear<BR> '向列表框中添加新的元素<BR> For i = 1 To BlockList.count<BR> AddSorted ListObject, BlockList(i)<BR> Next<BR> <BR>End Sub</P>
<P>Private Sub AddSorted(ListObject As Object, SItem As String)<BR> '将元素添加到组合框或列表框中,并且排序<BR> Dim i As Long<BR> <BR> '元素数目小于1,不进行排序<BR> If ListObject.ListCount = 0 Then<BR> ListObject.AddItem SItem<BR> Exit Sub<BR> End If<BR> <BR> '通过比较确定该元素的位置,类似于插入排序法<BR> For i = 0 To (ListObject.ListCount - 1)<BR> If StrComp(ListObject.List(i), SItem, vbTextCompare) = 1 Then<BR> ListObject.AddItem SItem, i<BR> Exit Sub<BR> End If<BR> Next<BR> <BR> '添加到列表框的最后<BR> ListObject.AddItem SItem</P>
<P>End Sub</P>
<P>Public Sub PaperRotationChange()<BR> ' 设置图纸打印方向<BR> If optVertical.Value = True Then<BR> If chkReverse.Value = False Then<BR> objLayout.PlotRotation = ac0degrees<BR> Else<BR> objLayout.PlotRotation = ac180degrees<BR> End If<BR> Else<BR> If chkReverse.Value = False Then<BR> objLayout.PlotRotation = ac90degrees<BR> Else<BR> objLayout.PlotRotation = ac270degrees<BR> End If<BR> End If<BR> ' 显示图纸大小<BR> Call SetPlotZone<BR>End Sub</P>
<P>' 设置图纸可打印区域大小<BR>Public Sub SetPlotZone()<BR> Dim Width As Double, Height As Double, t As Double<BR> ' 获得图纸大小<BR> objLayout.GetPaperSize Width, Height<BR> '图形方向为“横向”时宽高互调<BR> If optVertical.Value = False Then<BR> t = Width<BR> Width = Height<BR> Height = t<BR> End If<BR> '单位由“毫米”转换为“英寸”<BR> If optMillimeters.Value = False Then<BR> Width = Width / 25.393<BR> Height = Height / 25.393<BR> End If<BR> ' 显示图纸大小<BR> lbPaperSize.Caption = Round(Width, 2) & " × " & Round(Height, 2)<BR>End Sub</P>
<P>Private Sub OutputData(objBox As ComboBox, nFile As Integer)<BR> Dim i As Integer, count As Integer, index As Integer<BR> '获得组合框列表数目<BR> count = objBox.ListCount<BR> '获得组合框当前选项的的索引号<BR> index = objBox.ListIndex<BR> '输出组合框列表数目<BR> Write #nFile, count<BR> '输出组合框当前选项的的索引号<BR> Write #nFile, index<BR> '输出所有的组合框选项<BR> For i = 0 To count - 1<BR> Print #nFile, objBox.List(i)<BR> Next<BR> <BR>End Sub</P>
<P>Private Sub OutputData2(objBox As CheckBox, nFile As Integer)<BR> Dim strTemp As String<BR> '输出复选框选中状态<BR> If objBox.Value = True Then<BR> strTemp = "是"<BR> Else<BR> strTemp = "否"<BR> End If<BR> Print #nFile, strTemp<BR>End Sub</P>
<P>Private Sub OutputData3(objBox As ListBox, nFile As Integer)<BR> Dim i As Integer, count As Integer, index As Integer<BR> '获得列表框列表数目<BR> count = objBox.ListCount<BR> '获得列表框当前选项的的索引号<BR> index = objBox.ListIndex<BR> '输出列表框列表数目<BR> Write #nFile, count<BR> '输出列表框当前选项的的索引号<BR> Write #nFile, index<BR> '输出所有的列表框选项<BR> For i = 0 To count - 1<BR> Print #nFile, objBox.List(i)<BR> Next<BR> <BR>End Sub</P>
<P>Private Sub InputData(objBox As ComboBox, nFile As Integer)<BR> Dim i As Integer, count As Integer, index As Integer<BR> Dim strTemp As String<BR> '读入一行文本并存储在变量中<BR> Line Input #nFile, strTemp<BR> '读入组合框列表数目<BR> Input #nFile, count<BR> '读入组合框当前元素的的索引号<BR> Input #nFile, index<BR> '清空组合框所有元素<BR> objBox.Clear<BR> '读入组合框元素<BR> For i = 0 To count - 1<BR> Line Input #nFile, strTemp<BR> '将读入的列表添加到组合框中<BR> objBox.AddItem strTemp<BR> Next<BR> ' 设置组合框初始选项<BR> With objBox<BR> '使用下拉列表的形式<BR> .Style = fmStyleDropDownList<BR> '设置下拉列表的下标下限<BR> .BoundColumn = 0<BR> '设置默认的显示项目<BR> .ListIndex = index<BR> End With<BR> <BR>End Sub</P>
<P>Private Sub InputData2(objBox As CheckBox, nFile As Integer)<BR> Dim strTemp As String<BR> '读入一行文本并存储在变量中<BR> Line Input #nFile, strTemp<BR> '读入复选框选中状态<BR> Input #nFile, strTemp<BR> '设置复选按钮选择状态<BR> If strTemp = "是" Then<BR> objBox.Value = True<BR> Else<BR> objBox.Value = False<BR> End If<BR>End Sub</P>
<P>Private Sub InputData3(objBox As ListBox, nFile As Integer)<BR> Dim i As Integer, count As Integer, index As Integer<BR> Dim strTemp As String<BR> '读入一行文本并存储在变量中<BR> Line Input #nFile, strTemp<BR> '读入列表框列表数目<BR> Input #nFile, count<BR> '读入列表框当前元素的的索引号<BR> Input #nFile, index<BR> '清空列表框所有元素<BR> objBox.Clear<BR> '读入列表框元素<BR> For i = 0 To count - 1<BR> Line Input #nFile, strTemp<BR> '将读入的列表添加到列表框中<BR> objBox.AddItem strTemp<BR> Next<BR> ' 设置组合框初始选项<BR> With objBox<BR> '设置下拉列表的下标下限<BR> .BoundColumn = 0<BR> '设置默认的显示项目<BR> .ListIndex = index<BR> End With<BR> <BR>End Sub</P>
<P>Public Sub SetPrinter()<BR> ' 设置打印机配置<BR> objLayout.ConfigName = cboPrintersName.Text<BR> ' 设置打印样式表<BR> objLayout.StyleSheet = cboPlotStyleTableNames.Text<BR> ' 设置图纸尺寸<BR> objLayout.CanonicalMediaName = cboPaperSize.Text<BR> ' 设置图纸单位<BR> If optMillimeters.Value = True Then<BR> objLayout.PaperUnits = acMillimeters<BR> Else<BR> objLayout.PaperUnits = acInches<BR> End If<BR> ' 设置图纸打印方向<BR> If optVertical.Value = True Then<BR> If chkReverse.Value = False Then<BR> objLayout.PlotRotation = ac0degrees<BR> Else<BR> objLayout.PlotRotation = ac180degrees<BR> End If<BR> Else<BR> If chkReverse.Value = False Then<BR> objLayout.PlotRotation = ac90degrees<BR> Else<BR> objLayout.PlotRotation = ac270degrees<BR> End If<BR> End If<BR> ' 设置图纸打印比例<BR> If cboPlotScale.Value Then<BR> objLayout.UseStandardScale = True '使用标准打印比例<BR> Else<BR> objLayout.UseStandardScale = False '使用自定义打印比例<BR> End If<BR> Select Case cboPlotScale.Value<BR> Case 0<BR> '设置自定义打印比例<BR> objLayout.SetCustomScale txtNumerator.Value, txtDenominator.Value<BR> Case 1<BR> objLayout.StandardScale = acScaleToFit<BR> Case 2<BR> objLayout.StandardScale = ac1_1<BR> Case 3<BR> objLayout.StandardScale = ac1_2<BR> Case 4<BR> objLayout.StandardScale = ac1_4<BR> Case 5<BR> objLayout.StandardScale = ac1_8<BR> Case 6<BR> objLayout.StandardScale = ac1_10<BR> Case 7<BR> objLayout.StandardScale = ac1_16<BR> Case 8<BR> objLayout.StandardScale = ac1_20<BR> Case 9<BR> objLayout.StandardScale = ac1_30<BR> Case 10<BR> objLayout.StandardScale = ac1_40<BR> Case 11<BR> objLayout.StandardScale = ac1_50<BR> Case 12<BR> objLayout.StandardScale = ac1_100<BR> Case 13<BR> objLayout.StandardScale = ac2_1<BR> Case 14<BR> objLayout.StandardScale = ac4_1<BR> Case 15<BR> objLayout.StandardScale = ac8_1<BR> Case 16<BR> objLayout.StandardScale = ac10_1<BR> Case 17<BR> objLayout.StandardScale = ac100_1<BR> End Select<BR> ' 设置图纸是否居中打印<BR> If chkCenterPlot.Value Then<BR> objLayout.CenterPlot = True<BR> Else<BR> ' 设置自定义打印偏移<BR> Dim PtOffset(0 To 1) As Double<BR> PtOffset(0) = txtOffsetX.Value<BR> PtOffset(1) = txtOffsetY.Value<BR> objLayout.CenterPlot = False<BR> objLayout.PlotOrigin = PtOffset<BR> End If<BR> <BR> '设置是否打印对象线宽<BR> If chkPlotWithLineweights.Enabled = True Then<BR> If chkPlotWithLineweights.Value Then<BR> '打印时使用图形文件中的线宽<BR> objLayout.PlotWithLineweights = True<BR> Else<BR> '打印时使用打印样式中的线宽<BR> objLayout.PlotWithLineweights = False<BR> End If<BR> End If<BR> '设置是否应用打印样式<BR> If chkPlotWithPlotStyles.Value Then<BR> '打印时在对象中使用打印样式<BR> objLayout.PlotWithPlotStyles = True<BR> chkPlotWithLineweights.Enabled = False<BR> Else<BR> '打印时在对象中不使用打印样式<BR> objLayout.PlotWithPlotStyles = False<BR> chkPlotWithLineweights.Enabled = True<BR> End If<BR> If chkPlotHidden.Enabled = True Then<BR> '设置是否隐藏图纸空间对象<BR> If chkPlotHidden.Value Then<BR> '打印时隐藏图纸空间对象<BR> objLayout.PlotHidden = True<BR> Else<BR> '打印时不隐藏图纸空间对象<BR> objLayout.PlotHidden = False<BR> End If<BR> End If<BR> ' 设置打印类型(对应AutoCAD中:打印>打印设置>打印区域>窗口)<BR> objLayout.PlotType = acWindow<BR> <BR> ' 设置图纸打印份数<BR> objPlot.NumberOfCopies = txtNumber.Value<BR> ' 将打印错误报告切换为静默错误模式,以便不间断地执行打印任务<BR> objPlot.QuietErrorMode = True</P>
<P>End Sub</P>
<P>Private Sub BatchPlotByBlock(strBlockReferenceName As String)<BR> On Error Resume Next<BR> '如果列表框中未存在任何元素<BR> If lstPlotFiles.ListCount = 0 Then<BR> MsgBox "请先向列表框中添加文件!", vbCritical<BR> Exit Sub<BR> End If<BR> <BR> '将控制权交给AutoCAD<BR> frmBatchPlot.Hide<BR> ' 对第i个图形的每一个打印区域进行打印<BR> Dim ptMin As Variant, ptMax As Variant<BR> Dim ent As AcadEntity<BR> Dim i As Integer, n As Integer<BR> For i = 0 To lstPlotFiles.ListCount - 1<BR> n = 1<BR> '检查文件是否存在<BR> If Len(Dir(lstPlotFiles.List(i))) = 0 Then<BR> MsgBox "文件" & lstPlotFiles.List(i) & "不存在!"<BR> End If<BR> '打开或激活第i个图形文件<BR> Call OpenFile(lstPlotFiles.List(i))<BR> Set objDoc = ThisDrawing.Application.ActiveDocument<BR> '实现范围缩放<BR> ThisDrawing.Application.ZoomExtents<BR> ' 确保当前布局是模型空间<BR> Set objLayout = objDoc.Layouts.Item("Model")<BR> Set objPlot = objDoc.Plot<BR> ' 设置打印选项<BR> Call SetPrinter<BR> '重新生成当前图形<BR> objDoc.Regen acAllViewports<BR> ' 确保AutoCAD在前台进行打印,这样后一次打印会在前一次打印完成之后才开始<BR> ' 避免出现错误<BR> objDoc.SetVariable "BACKGROUNDPLOT", 0<BR> '对当前图形模型空间中的所有打印区域进行打印<BR> For Each ent In objDoc.ModelSpace<BR> If TypeOf ent Is AcadBlockReference Then<BR> If StrComp(ent.Name, strBlockReferenceName, vbTextCompare) = 0 Then<BR> ent.GetBoundingBox ptMin, ptMax<BR> <BR> ' 将三维点转化为二维点坐标<BR> ReDim Preserve ptMin(0 To 1)<BR> ReDim Preserve ptMax(0 To 1)<BR> <BR> ' 设置打印窗口<BR> objLayout.SetWindowToPlot ptMin, ptMax<BR> <BR> ' 打印当前的区域<BR> '若选中“打印到文件”<BR> If chkPlotToFile.Value Then<BR> objPlot.PlotToFile cboPlotPath.Text & objDoc.Name & "-" & n & ".dwf"<BR> n = n + 1<BR> Else<BR> objPlot.PlotToDevice objLayout.ConfigName<BR> End If<BR> End If<BR> End If<BR> Next ent<BR> ' 恢复系统变量的值<BR> objDoc.SetVariable "BACKGROUNDPLOT", 2<BR> '保存当前图形<BR> 'objDoc.Save<BR> '关闭但不保存当前图形<BR> '保证至少一个文件打开<BR> If ThisDrawing.Application.Documents.count > 1 Then<BR> objDoc.Close False<BR> End If<BR> Next i<BR> '显示对话框<BR> frmBatchPlot.Show<BR>End Sub</P>
<P>Private Sub BatchPlotByLayer(strLayerName As String)<BR> On Error Resume Next<BR> '如果列表框中未存在任何元素<BR> If lstPlotFiles.ListCount = 0 Then<BR> MsgBox "请先向列表框中添加文件!", vbCritical<BR> Exit Sub<BR> End If<BR> <BR> '将控制权交给AutoCAD<BR> frmBatchPlot.Hide<BR> ' 对第i个图形的每一个打印区域进行打印<BR> Dim ptMin As Variant, ptMax As Variant<BR> Dim ent As AcadEntity<BR> Dim i As Integer, n As Integer<BR> For i = 0 To lstPlotFiles.ListCount - 1<BR> n = 1<BR> '检查文件是否存在<BR> If Len(Dir(lstPlotFiles.List(i))) = 0 Then<BR> MsgBox "文件" & lstPlotFiles.List(i) & "不存在!"<BR> End If<BR> '打开或激活第i个图形文件<BR> Call OpenFile(lstPlotFiles.List(i))<BR> Set objDoc = ThisDrawing.Application.ActiveDocument<BR> '实现范围缩放<BR> ThisDrawing.Application.ZoomExtents<BR> ' 确保当前布局是模型空间<BR> Set objLayout = objDoc.Layouts.Item("Model")<BR> Set objPlot = objDoc.Plot<BR> ' 设置打印选项<BR> Call SetPrinter<BR> '重新生成当前图形<BR> objDoc.Regen acAllViewports<BR> ' 确保AutoCAD在前台进行打印,这样后一次打印会在前一次打印完成之后才开始<BR> ' 避免出现错误<BR> objDoc.SetVariable "BACKGROUNDPLOT", 0<BR> '对当前图形模型空间中的所有打印区域进行打印<BR> For Each ent In objDoc.ModelSpace<BR> If StrComp(ent.Layer, strLayerName, vbTextCompare) = 0 Then<BR> If TypeOf ent Is AcadLWPolyline Then<BR> ent.GetBoundingBox ptMin, ptMax<BR> <BR> ' 将三维点转化为二维点坐标<BR> ReDim Preserve ptMin(0 To 1)<BR> ReDim Preserve ptMax(0 To 1)<BR> <BR> ' 设置打印窗口<BR> objLayout.SetWindowToPlot ptMin, ptMax<BR> <BR> ' 打印当前的区域<BR> '若选中“打印到文件”<BR> If chkPlotToFile.Value Then<BR> objPlot.PlotToFile cboPlotPath.Text & objDoc.Name & "-" & n & ".dwf"<BR> n = n + 1<BR> Else<BR> objPlot.PlotToDevice objLayout.ConfigName<BR> End If<BR> End If<BR> End If<BR> Next ent<BR> ' 恢复系统变量的值<BR> objDoc.SetVariable "BACKGROUNDPLOT", 2<BR> '保存当前图形<BR> 'objDoc.Save<BR> '关闭但不保存当前图形<BR> '保证至少一个文件打开<BR> If ThisDrawing.Application.Documents.count > 1 Then<BR> objDoc.Close False<BR> End If<BR> Next i<BR> '显示对话框<BR> frmBatchPlot.Show<BR>End Sub</P>
<P>Private Sub PreviewByBlock(strBlockReferenceName As String)<BR> '如果列表框中未存在任何元素<BR> If lstPlotFiles.ListCount = 0 Then<BR> MsgBox "请先向列表框中添加文件!", vbCritical<BR> Exit Sub<BR> End If<BR> <BR> '将控制权交给AutoCAD<BR> frmBatchPlot.Hide<BR> ' 对第一个图形的第一个打印区域进行完全预览<BR> Dim ptMin As Variant, ptMax As Variant<BR> Dim ent As AcadEntity<BR> Dim i As Integer, n As Integer<BR> For i = 0 To lstPlotFiles.ListCount - 1<BR> n = 1<BR> '检查文件是否存在<BR> If Len(Dir(lstPlotFiles.List(i))) = 0 Then<BR> MsgBox "文件" & lstPlotFiles.List(i) & "不存在!"<BR> End If<BR> '打开或激活第i个图形文件<BR> Call OpenFile(lstPlotFiles.List(i))<BR> Set objDoc = ThisDrawing.Application.ActiveDocument<BR> '实现范围缩放<BR> ThisDrawing.Application.ZoomExtents<BR> ' 确保当前布局是模型空间<BR> Set objLayout = objDoc.Layouts.Item("Model")<BR> Set objPlot = objDoc.Plot<BR> ' 设置打印选项<BR> Call SetPrinter<BR> '重新生成当前图形<BR> objDoc.Regen acAllViewports<BR> ' 确保AutoCAD在前台进行打印,这样后一次打印会在前一次打印完成之后才开始<BR> ' 避免出现错误<BR> 'ThisDrawing.SetVariable "BACKGROUNDPLOT", 0<BR> '对当前图形模型空间中的所有打印区域进行打印<BR> For Each ent In objDoc.ModelSpace<BR> If TypeOf ent Is AcadBlockReference Then<BR> If StrComp(ent.Name, strBlockReferenceName, vbTextCompare) = 0 Then<BR> ent.GetBoundingBox ptMin, ptMax<BR> <BR> ' 将三维点转化为二维点坐标<BR> ReDim Preserve ptMin(0 To 1)<BR> ReDim Preserve ptMax(0 To 1)<BR> <BR> ' 设置打印窗口<BR> ThisDrawing.ActiveLayout.SetWindowToPlot ptMin, ptMax<BR> <BR> '完全预览当前的区域<BR> objPlot.DisplayPlotPreview acFullPreview<BR> n = n + 1<BR> If n > 1 Then<BR> '显示对话框<BR> frmBatchPlot.Show<BR> Exit Sub<BR> End If<BR> <BR> End If<BR> End If<BR> Next ent<BR> <BR> '保存当前图形<BR> 'objDoc.Save<BR> '关闭但不保存当前图形<BR> '保证至少一个文件打开<BR> If ThisDrawing.Application.Documents.count > 1 Then<BR> objDoc.Close False<BR> End If<BR> Next i</P>
<P>End Sub</P>
<P>Private Sub PreviewByLayer(strLayerName As String)<BR> '如果列表框中未存在任何元素<BR> If lstPlotFiles.ListCount = 0 Then<BR> MsgBox "请先向列表框中添加文件!", vbCritical<BR> Exit Sub<BR> End If<BR> <BR> '将控制权交给AutoCAD<BR> frmBatchPlot.Hide<BR> ' 对第一个图形的第一个打印区域进行完全预览<BR> Dim ptMin As Variant, ptMax As Variant<BR> Dim ent As AcadEntity<BR> Dim i As Integer, n As Integer<BR> For i = 0 To lstPlotFiles.ListCount - 1<BR> n = 1<BR> '检查文件是否存在<BR> If Len(Dir(lstPlotFiles.List(i))) = 0 Then<BR> MsgBox "文件" & lstPlotFiles.List(i) & "不存在!"<BR> End If<BR> '打开或激活第i个图形文件<BR> Call OpenFile(lstPlotFiles.List(i))<BR> Set objDoc = ThisDrawing.Application.ActiveDocument<BR> '实现范围缩放<BR> ThisDrawing.Application.ZoomExtents<BR> ' 确保当前布局是模型空间<BR> Set objLayout = objDoc.Layouts.Item("Model")<BR> Set objPlot = objDoc.Plot<BR> ' 设置打印选项<BR> Call SetPrinter<BR> '重新生成当前图形<BR> objDoc.Regen acAllViewports<BR> ' 确保AutoCAD在前台进行打印,这样后一次打印会在前一次打印完成之后才开始<BR> ' 避免出现错误<BR> 'ThisDrawing.SetVariable "BACKGROUNDPLOT", 0<BR> '对当前图形模型空间中的所有打印区域进行完全预览<BR> For Each ent In ThisDrawing.ModelSpace<BR> If StrComp(ent.Layer, strLayerName, vbTextCompare) = 0 Then<BR> If TypeOf ent Is AcadLWPolyline Then<BR> ent.GetBoundingBox ptMin, ptMax<BR> <BR> ' 将三维点转化为二维点坐标<BR> ReDim Preserve ptMin(0 To 1)<BR> ReDim Preserve ptMax(0 To 1)<BR> <BR> ' 设置打印窗口<BR> ThisDrawing.ActiveLayout.SetWindowToPlot ptMin, ptMax<BR> <BR> '完全预览当前的区域<BR> objPlot.DisplayPlotPreview acFullPreview<BR> n = n + 1<BR> If n > 1 Then<BR> '显示对话框<BR> frmBatchPlot.Show<BR> Exit Sub<BR> End If<BR> <BR> End If<BR> End If<BR> Next ent<BR> <BR> '保存当前图形<BR> 'objDoc.Save<BR> '关闭但不保存当前图形<BR> '保证至少一个文件打开<BR> If ThisDrawing.Application.Documents.count > 1 Then<BR> objDoc.Close False<BR> End If<BR> Next i<BR> <BR>End Sub</P>
<P><BR> </P> 楼主你好 你的代码好像只能打印“模型”窗口的图纸,布局空间的该如何打印,简单说 我想打印包括模型、所有布局空间中的图纸 该如何实现 期待您的回复 我最近是想做个打印集合 很想实现这个功能 还望您能给指导一下 本帖最后由 作者 于 2006-11-28 22:45:07 编辑 <br /><br /> <P>整整花了一周时间,总算能用了。虽然不是很完美,以后就考大家完善了。<BR></P>
<P>使用方法:解压到*:\Program Files\AutoCAD 2004\Support下,在工具->自定义->菜单中加载CADBatchPlot.mns即可。</P> <P>Public Sub BatchPlot()<BR> '显示主对话框<BR> frmBatchPlot.Show<BR>End Sub</P>
<P>Public Sub ShowAbout()<BR> '显示关于对话框<BR> frmAbout.Show<BR>End Sub<BR></P> <P>粗粗看了以下,程序写的相当精彩,相当高手。<BR>我调试了以下,没有问题。<BR>题几个建议:<BR>1、横向、纵向纸张的打印可以自动识别(根据矩形的长宽)<BR>2、A3、A4自动识别,有两种实现方法,推荐方案2<BR>方法1、根据不同的块名;<BR>方法2:由于一般工程的出图,一般框的长宽比例都是一定的,且A3、A4的比例不会一样,所以,可以这样:长宽比例为a值附近的打印成A4,长宽比例为b值附近的的、打印成A3,分界点由用户设置。<BR>其实1、2两点总结一下就是根据图框的长宽比例,采用不同的打印样式打印<BR>3、分图层打印:如共1、2、3图层,1、2图层打一张,2、3图层打一张<BR>(根据打印图框名或图框的图层来判断是否分层打印)<BR>4、打印设置的默认值由用户设置<BR>5、我现在仅对当前图纸进行批量打印,如果用你的程序就必须再添加一次该图纸,<BR>这样好像不大方便。<BR>6、方面起见,选择文件路径的这个框,每次显示初始位置,应该为上次打印的路径,而不是“我的电脑”<BR>7、举例:10个文件,每个文件2张图纸,现在只要求打印第一张,你的程序是不能实现的<BR>,建议可以设置,比如只打印左上角这一张。</P> 确实很好,慢慢研究一下... <P>看到高手的代码,忍不禁下载下来,慢慢研究一下!明经是我的启蒙老师,亦是我现在和将来的老师!</P> <P>程序好长,功夫不错。</P>
<P>我也有一个类似的程序,是用VL写的,设置了几个命令,设置打印区、删除打印区、单文件打印和批量打印。</P>
<P>大致思路是设置打印区时,将文件名和打印区域的坐标自动写入一个文本文件(打印配置文件),打印时,从配置文件中找出打印数据即可。</P> 不错不错 相当赞啊