明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2952|回复: 0

[打印] [求助]多文档打印

[复制链接]
发表于 2010-6-2 09:51 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2010-6-3 10:42:04 编辑

看了kean的打印专栏后。自己想做个多文档打印功能的程序。

首先介绍下我自己想处理的图纸是那种一个文件中有好几张图形的文件。我的程序希望能够自动搜索到每个图形的窗体范围然后按照一定的顺序依次将每个图形打印出来。这个功能已经可以实现了。

现在的问题是希望能够处理多文档打印的功能,也就是依次处理多个文件中的每张图形。

目前的想法是最好通过database直接处理,不打开每个文档来操作。

然后自己写了如下代码,可是问题是代码在执行中会在某句话后就会停止。“acPlInfoVdr.Validate(acPlInfo)”在当前文档打印中这句话是没问题的,不知道为什么到了多文档就不可以了。

希望有高手能够帮忙解决这个问题。我目前没有什么好的思路,觉得唯一可能就是因为我处理的打印类型是窗体,所以不适合在database里直接处理。 希望版主们能给我一些思路。

我以前写过一个程序,是删除在特定范围内的实体。在单文档中这个功能可以用selectwindow实现,而我想把这个功能推广到多文档中的时候,也就是希望在database中依次处理每个窗体,发现selectwindow无法使用。后来采用了遍历实体然后判断实体的范围才解决了这个问题。

这次的多文档打印也是处理窗体中的内容,我想这个会不会是与以前做过的那个程序的错误有所关联呢?

希望版主大人可以提供一些资料或方向可供学习,钻研。

我曾经在google里搜索到这篇文章 http://bbs.mjtd.com/forum.php?mod=viewthread&tid=78531

其实现在的问题就是当时作者用红字所写的如何在database里处理每个文档的打印而不需要打开它?

希望有高手能够指点,共同探讨!

  1. ' 对指定的文件进行插入操作过程
  2.     Public Function ReadDwgFromFile(ByVal filename As String) As Boolean
  3.         ' 创建集合,定义设计的objectID与点坐标的X与Y值
  4.         Dim ids As New ObjectIdCollection
  5.         Dim idsLine As New ObjectIdCollection
  6.         ' 用来判断是否是A3或A4的左下点坐标
  7.         Dim minX As List(Of Double)
  8.         Dim minY As List(Of Double)
  9.         ' 新建一个数据库对象以读取Dwg文件
  10.         Dim db As New Database()
  11.         Dim ex As Autodesk.AutoCAD.Runtime.Exception
  12.         Try
  13.             ' 如果指定文件名的文件存在,则
  14.             If System.IO.File.Exists(filename) Then
  15.                 ' 把文件读入到数据库中
  16.                 db.ReadDwgFile(filename, System.IO.FileShare.ReadWrite, True, Nothing)
  17.                 Dim pMins As New Point3dCollection
  18.                 Dim pMaxs As New Point3dCollection
  19.                 minX = New List(Of Double)
  20.                 minY = New List(Of Double)
  21.                 ' 开始事务处理
  22.                 Using trans As Transaction = db.TransactionManager.StartTransaction()
  23.                     ' 获取数据库的块表对象
  24.                     Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead)
  25.                     ' 打开数据库的模型空间块表记录对象
  26.                     Dim btr As BlockTableRecord = trans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForRead)
  27.                     ' 循环遍历模型空间中的实体
  28.                     For Each id As ObjectId In btr
  29.                         Dim obj As DBObject = trans.GetObject(id, OpenMode.ForRead)
  30.                         If TypeOf (obj) Is DBText Then
  31.                             Dim st As DBText = DirectCast(obj, DBText)
  32.                             Dim s As String = st.TextString
  33.                             If s = "设    计" Then
  34.                                 ' 将符合条件的文字id加入ids集合中
  35.                                 ids.Add(id)
  36.                             End If
  37.                         End If
  38.                         If TypeOf (obj) Is Line Then
  39.                             Dim ln As Line = DirectCast(obj, Line)
  40.                             If ln.StartPoint.X = ln.EndPoint.X Then
  41.                                 minX.Add(ln.StartPoint.X)
  42.                                 If ln.StartPoint.Y > ln.EndPoint.Y Then
  43.                                     minY.Add(ln.EndPoint.Y)
  44.                                 Else
  45.                                     minY.Add(ln.StartPoint.Y)
  46.                                 End If
  47.                             End If
  48.                         End If
  49.                         If TypeOf (obj) Is Polyline Then
  50.                             Dim pl As Polyline = DirectCast(obj, Polyline)
  51.                             If pl.StartPoint = pl.EndPoint Then
  52.                                 minX.Add(pl.GeometricExtents.MinPoint.X)
  53.                                 minY.Add(pl.GeometricExtents.MinPoint.Y)
  54.                             End If
  55.                         End If
  56.                     Next
  57.                     ' 根据文件中图的坐标位置排序
  58.                     Dim resultIds As ObjectIdCollection = SortImageForTwoV(ids, db)
  59.                     Dim num As Integer = 1
  60.                     For Each id As ObjectId In resultIds
  61.                         Dim obj As DBObject = trans.GetObject(id, OpenMode.ForRead)
  62.                         If TypeOf (obj) Is DBText Then
  63.                             Dim st As DBText = DirectCast(obj, DBText)
  64.                             Dim s As String = st.TextString
  65.                             If s = "设    计" Then
  66.                                 Dim x As Double = st.Position.X
  67.                                 Dim y As Double = st.Position.Y
  68.                                 Dim z As Double = st.Position.Z
  69.                                 Dim h As Double = st.Height
  70.                                 Dim pointMin As New Point3d(x + h * minX_A3, y + h * minY_A3, z)
  71.                                 Dim pointMax As New Point3d(x + h * maxX_A3, y + h * maxY_A3, z)
  72.                                 Dim DwgType As String = "A3"
  73.                                 For i = 0 To minX.Count - 1
  74.                                     Dim leftX As Double = minX(i)
  75.                                     Dim leftY As Double = minY(i)
  76.                                     If leftX - pointMin.X < 0.2 * h And pointMin.X - leftX < 0.2 * h Then
  77.                                         If leftY - pointMin.Y < 0.2 * h And pointMin.Y - leftY < 0.2 * h Then
  78.                                             Exit For
  79.                                         End If
  80.                                     End If
  81.                                     If i = minX.Count - 1 Then
  82.                                         DwgType = "A4"
  83.                                         Dim pointMinA4 As New Point3d(x + h * minX_A4, y + h * minY_A4, z)
  84.                                         Dim pointMaxA4 As New Point3d(x + h * maxX_A4, y + h * maxY_A4, z)
  85.                                         pointMin = pointMinA4
  86.                                         pointMax = pointMaxA4
  87.                                     End If
  88.                                 Next
  89.                                 PlotTest(pointMin, pointMax, num, db, filename, DwgType)
  90.                                 num = num + 1
  91.                             End If
  92.                         End If
  93.                     Next
  94.                     While PlotFactory.ProcessPlotState = ProcessPlotState.BackgroundPlotting Or _
  95.                         PlotFactory.ProcessPlotState = ProcessPlotState.ForegroundPlotting
  96.                         Threading.Thread.Sleep(10)
  97.                         Windows.Forms.Application.DoEvents()
  98.                     End While
  99.                     trans.Commit()
  100.                     btr.Dispose()
  101.                     bt.Dispose()
  102.                     trans.Dispose()
  103.                 End Using
  104.             End If
  105.             db.SaveAs(filename, DwgVersion.Current)
  106.         Catch ex
  107.             ' 销毁数据库对象
  108.             db.Dispose()
  109.             Return False
  110.         End Try
  111.         ' 销毁数据库对象
  112.         db.Dispose()
  113.         Return True
  114.     End Function
  115.     Public Sub PlotTest(ByVal pMin As Point3d, ByVal pMax As Point3d, ByVal num As Integer, ByVal db As Database, ByVal filename As String, ByVal DwgType As String)
  116.         Dim ex As Autodesk.AutoCAD.Runtime.Exception
  117.         Dim acCurDb As Database = db
  118.         Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  119.             Dim acLayout As Layout
  120.             ' 获取数据库的块表对象
  121.             Dim bt As BlockTable = acTrans.GetObject(db.BlockTableId, OpenMode.ForRead)
  122.             ' 打开数据库的模型空间块表记录对象
  123.             Dim btr As BlockTableRecord = acTrans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForRead)
  124.             acLayout = acTrans.GetObject(btr.LayoutId, OpenMode.ForRead)
  125.             Dim acPlInfo As PlotInfo = New PlotInfo()
  126.             acPlInfo.Layout = acLayout.ObjectId
  127.             Dim acPlSet As PlotSettings = New PlotSettings(True)
  128.             acPlSet.CopyFrom(acLayout)
  129.             Dim acPlSetVdr As PlotSettingsValidator = PlotSettingsValidator.Current
  130.             acPlSetVdr.SetUseStandardScale(acPlSet, True)
  131.             acPlSetVdr.SetStdScaleType(acPlSet, StdScaleType.ScaleToFit) '充满图纸
  132.             acPlSetVdr.SetPlotRotation(acPlSet, PlotRotation.Degrees090) '纵向打印
  133.             ' 居中打印
  134.             acPlSetVdr.SetPlotCentered(acPlSet, True)
  135.             ' 打印设备和图纸
  136.             acPlSetVdr.SetPlotConfigurationName(acPlSet, "pdfFactory pro", DwgType)
  137.             '先GetPoint然后再GetCorner
  138.             'Dim pPtRes As PromptPointResult
  139.             'Dim pPtOpts As PromptPointOptions = New PromptPointOptions("")
  140.             'pPtOpts.Message = vbLf & "请选择其中一个角点: "
  141.             'pPtRes = acDoc.Editor.GetPoint(pPtOpts)
  142.             'Dim PT1 As Point3d = pPtRes.Value
  143.             'Dim pCnOpts As PromptCornerOptions = New PromptCornerOptions("请选择一个对角点:", PT1)
  144.             'pPtRes = acDoc.Editor.GetCorner(pCnOpts)
  145.             'Dim PT2 As Point3d = pPtRes.Value
  146.             Dim PT1 As Point3d = pMin
  147.             Dim PT2 As Point3d = pMax
  148.             '设置打印窗口
  149.             Dim minX As Double = System.Math.Min(PT1.X, PT2.X)
  150.             Dim minY As Double = System.Math.Min(PT1.Y, PT2.Y)
  151.             Dim maxX As Double = System.Math.Max(PT1.X, PT2.X)
  152.             Dim maxY As Double = System.Math.Max(PT1.Y, PT2.Y)
  153.             Dim E2d As Extents2d = New Extents2d(minX, minY, maxX, maxY)
  154.             acPlSetVdr.SetPlotWindowArea(acPlSet, E2d)
  155.             acPlSetVdr.SetPlotType(acPlSet, Autodesk.AutoCAD.DatabaseServices.PlotType.Window)
  156.             acPlInfo.OverrideSettings = acPlSet
  157.             Dim acPlInfoVdr As PlotInfoValidator = New PlotInfoValidator()
  158.             acPlInfoVdr.MediaMatchingPolicy = MatchingPolicy.MatchEnabled
  159.             acPlInfoVdr.Validate(acPlInfo)
  160.             Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", 0)
  161.             While PlotFactory.ProcessPlotState = ProcessPlotState.ForegroundPlotting
  162.                 Threading.Thread.Sleep(10)
  163.             End While
  164.             If PlotFactory.ProcessPlotState = Autodesk.AutoCAD.PlottingServices.ProcessPlotState.NotPlotting Then
  165.                 Using acPlEng As PlotEngine = PlotFactory.CreatePublishEngine()
  166.                     Dim acPlProgDlg As PlotProgressDialog = New PlotProgressDialog(False, 1, True)
  167.                     Using (acPlProgDlg)
  168.                         acPlProgDlg.PlotMsgString(PlotMessageIndex.DialogTitle) = "打印进度"
  169.                         acPlProgDlg.PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage) = "取消打印"
  170.                         acPlProgDlg.PlotMsgString(PlotMessageIndex.SheetProgressCaption) = "打印进度"
  171.                         acPlProgDlg.LowerPlotProgressRange = 0
  172.                         acPlProgDlg.UpperPlotProgressRange = 100
  173.                         acPlProgDlg.PlotProgressPos = 0
  174.                         acPlProgDlg.OnBeginPlot()
  175.                         acPlProgDlg.IsVisible = True
  176.                         acPlEng.BeginPlot(acPlProgDlg, Nothing)
  177.                         acPlEng.BeginDocument(acPlInfo, filename, Nothing, 1, True, "c:\Pl" + num.ToString + "")
  178.                         'acPlProgDlg.PlotMsgString(PlotMessageIndex.Status) = "正在打印 " & acDoc.Name & " - " & acLayout.LayoutName
  179.                         acPlProgDlg.OnBeginSheet()
  180.                         acPlProgDlg.LowerSheetProgressRange = 0
  181.                         acPlProgDlg.UpperSheetProgressRange = 100
  182.                         acPlProgDlg.SheetProgressPos = 0
  183.                         Dim acPlPageInfo As PlotPageInfo = New PlotPageInfo()
  184.                         acPlEng.BeginPage(acPlPageInfo, acPlInfo, True, Nothing)
  185.                         acPlEng.BeginGenerateGraphics(Nothing)
  186.                         acPlEng.EndGenerateGraphics(Nothing)
  187.                         acPlEng.EndPage(Nothing)
  188.                         acPlProgDlg.SheetProgressPos = 100
  189.                         acPlProgDlg.OnEndSheet()
  190.                         acPlEng.EndDocument(Nothing)
  191.                         acPlProgDlg.PlotProgressPos = 100
  192.                         acPlProgDlg.OnEndPlot()
  193.                         acPlEng.EndPlot(Nothing)
  194.                     End Using
  195.                 End Using
  196.             End If
  197.             Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", 2)
  198.         End Using
  199.     End Sub
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 01:12 , Processed in 0.274385 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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