乐筑天下

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

[求助]多文档打印

[复制链接]

4

主题

8

帖子

1

银币

初来乍到

Rank: 1

铜币
24
发表于 2010-6-2 09:51:00 | 显示全部楼层 |阅读模式
看了kean的打印专栏后。自己想做个多文档打印功能的程序。

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

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

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

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

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

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

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

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

我曾经在google里搜索到这篇文章 。

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

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

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

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 21:18 , Processed in 0.391651 second(s), 54 queries .

© 2020-2025 乐筑天下

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