iCAx开思网

标题: Solidworks拼图打印程序(源码公布) [打印本页]

作者: gaowengang    时间: 2013-12-16 22:19
标题: Solidworks拼图打印程序(源码公布)
本帖最后由 gaowengang 于 2014-1-27 16:25 编辑

本人用vb.net编写的,能够对SW2010、2012、2014进行拼图打印。需要拼图打印的朋友去试试吧。
百度网盘地址:https://pan.baidu.com/s/1xPxFM
希望对大家有用。
之前没公布源码是因为写的水平实在不高。{:soso_e120:}现在我把源码公布出来,感兴趣的朋友们来下载吧。开发用的软件是免费版本的visual studio 2013 express for windows desktop , 用VS2013旗舰版应该也是可以的。当前代码引用的是SW2014的运行库,如果你的电脑上安装的是其他版本的SW,需要删除SW2014的引用,然后修改为引用相应的版本。


作者: Francis    时间: 2013-12-17 09:56
感謝樓主無私分享。

看過教程,做得非常精致。
若在源碼加入以下語句(可能要略作修改以作配合),就可以省掉手動調整選項這步驟了。
  1.     swApp.SetUserPreferenceToggle swTiffPrintScaleToFit, False
  2.     swApp.SetUserPreferenceIntegerValue swTiffScreenOrPrintCapture, 1
  3.     swApp.SetUserPreferenceIntegerValue swTiffImageType, 0
  4.     swApp.SetUserPreferenceIntegerValue swTiffCompressionScheme, 2
  5.     swApp.SetUserPreferenceIntegerValue swTiffPrintDPI, 300
  6.     swApp.SetUserPreferenceIntegerValue swTiffPrintPaperSize, 12
  7.     swApp.SetUserPreferenceIntegerValue swTiffPrintScaleFactor, 100
  8.     swApp.SetUserPreferenceDoubleValue swTiffPrintDrawingPaperHeight, DrawingPaperHeight
  9.     swApp.SetUserPreferenceDoubleValue swTiffPrintDrawingPaperWidth, DrawingPaperWidth
复制代码

作者: gaowengang    时间: 2013-12-17 10:33
多谢版主的指导。我将在稍后的改进版本中尝试加入您的代码。
由于程序刚刚完成不久,必然有很多bug,大家试用过程中发现了bug,或者任何的建议,请反馈给我,我们一起来把软件做得更加完善。

作者: langzhi    时间: 2014-2-7 13:00
谢谢分享,能把源代码放出来,值得敬佩。
作者: dreamsboy    时间: 2014-2-9 00:16
一直想找个SW的批量打印小程序,请问下楼主你这程序能自动识别图幅大小自动把A4图幅打印到A4图纸A3图幅自动打印到A3图纸上吗?
作者: gaowengang    时间: 2014-2-9 09:35
dreamsboy 发表于 2014-2-9 00:16
一直想找个SW的批量打印小程序,请问下楼主你这程序能自动识别图幅大小自动把A4图幅打印到A4图纸A3图幅自动 ...

你说的这个功能目前实现不了,但是你问的非常好,这本是我想要实现的一个很重要的功能。试想一下:当你点击一个按钮后,不同尺寸的图纸被发送到不同的打印机,霎时间,你办公室里的A4打印机、A3打印机和绘图仪同时工作起来,将对应型号的图纸源源不断地打印了出来,这难道不是一件非常嗨皮的事情吗?图纸打印工作瞬间从一件烦人的事情变成了乐趣十足的事情,说不定你打完一套图纸还想打印另一套!
但是,在实现的时候遇到了技术难题,A4的图纸能够正常打印出来,横向A3图纸却被打印成纵向A4的大小。参数调试了很多次也没有解决,当然继续调试下去肯定能够解决,不过,要完善这个功能还是需要很大的工作量,比如A2图纸被发送到A3打印机了怎么办,等等等等,于是就退而求其次,这个功能被“退化”到了仅将A3/A4图纸发送到A4打印机。毕竟,这只是个支线任务,实现拼图打印作为主线任务,还有大量的工作要做。
原打算在完善这个功能后,将源码加入一些必要的注释再开源,看到楼上有朋友要求开源,考虑到本程序百分之八九十的内容都是在教材或者网上几乎直接照搬的代码段,自己只是将这些功能段组装了起来,自己的新增的内容很少,算法应该不难理解,就将源码直接公开了。
如果大家群策群力,将本程序逐步完善起来,这对广大的SW爱好者应该是个好消息。

作者: dreamsboy    时间: 2014-2-10 20:37
gaowengang 发表于 2014-2-9 09:35
你说的这个功能目前实现不了,但是你问的非常好,这本是我想要实现的一个很重要的功能。试想一下:当你点 ...

谢谢回复。事情要做得完美,必须付出努力。辛苦楼主了。

作者: gaowengang    时间: 2014-2-13 19:16
Francis 发表于 2014-2-13 18:12
由于悶人電腦殘舊,無法安裝visual studio 2013 express for windows desktop。
朋友可否把代碼轉換為文 ...

我试着把代码贴出来,闷大多多指教
  1. Imports SldWorks
  2. Imports System.Drawing.Printing

  3. Module canshu

  4.     Public SwFiles() As String      'SolidWorks  文件列表,可能包含临时文件,故不能直接使用
  5.     Public SwFile As String       'solidworks工程图文件
  6.     Public SwFinalFiles() As String '对swfiles()进行提取,作为最终的文件列表

  7.     Public tmpSaveDir() As String   '临时文件存放目录的集合
  8.     Public tmpSavefile As String   '临时文件存放的目录

  9.     Public workDir As String     '存放solidworksw文件的文件夹

  10.     Public swApp As SldWorks.SldWorks 'solidworks 主程序
  11.     Public swMod As ModelDoc2      'solidworks 模型
  12.     Public swDoc As SldWorks.DrawingDoc  'solidworks 图纸文档
  13.     Public swSheet As SldWorks.Sheet    '文件内的图纸
  14.     Public intSheetCount As Integer    '图纸的数量
  15.     Public mysheet() As Object     'sheet列表
  16.     Public stWidth As Double     'sheet的宽
  17.     Public stHeight As Double    'sheet的高

  18.     Public tmpInt As Integer    '临时变量,

  19.     Public strTmp As String      '临时字符串,具有各种作用
  20.     '设置输出时的DPI,这是sw能输出的列表里抄的
  21.     Public userDPI() As Integer = {50, 72, 100, 150, 200, 240, 300, 360, 400, 600, 720, 800, 1200, 1440, 2880}

  22.     Public intDPI As Integer    '转换时,选择的dpi

  23.     Public swDrawCollecton As New swDrawsAll  '图纸的集合
  24.     Public swSingleDraw As SwDraw      '一张单独的图纸

  25.     Public boolstatus As Boolean   '各种状态,为了便于直接copy vba


  26.     Public myPrinters() As String   '打印机列表

  27.     Public PrintSize() As String = {"A1(880×50米)", "A2(620×50米)"}

  28.     Public poList(7) As Integer     '表示插入位置的数组
  29.     Public CountAsA4 As Integer    '折换成A4的数量
  30.     Public paperPager As Integer = 1   '表示的是拼合后的第几张图纸
  31.     Public checkA2() As Integer       '集合中的那些元素是A2图纸
  32.     Public checkA3() As Integer
  33.     Public checkA4() As Integer
  34.     Public x, y, z, j, k As Integer
  35.     Public A2exist, A3exist, A4exist As Boolean
  36.     Public paperCount As Integer    '最终要打印的图纸的数量
  37.     Public paperLeft As Integer    '剩余图纸的数量
  38.     Public A2Current As Integer   '当前的各种大小图纸是该型图中的第几张
  39.     Public A3Current As Integer
  40.     Public A4Current As Integer
  41.     Public onePaper As ptPaper
  42.     Public FinalPapers As ptPaperAll

  43.     Public newImage As Image
  44.     Public singleImage As Image
  45.     Public newBMape As Bitmap
  46.     Public myImage As Image
  47.     Public g1 As Graphics
  48.     Public theX, theY, theWidth, theHeight As Integer  '填充图片时用到的坐标值

  49.     Public WithEvents PT1 As New PrintDocument
  50.     Public PgSet As PageSettings
  51.     Public PgSize As PaperSize
  52.     Public PTResolution As PrinterResolution

  53.     Private Sub PT1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PT1.PrintPage
  54.         e.Graphics.DrawImage(newBMape, 10, 10)
  55.     End Sub
  56. End Module
复制代码

作者: gaowengang    时间: 2014-2-13 19:17
  1. Imports System.IO
  2. Imports System.Drawing.Printing



  3. Public Class Form1

  4.    


  5.     Sub getFiles()
  6.         strTmp = "$"
  7.         If File.Exists(workDir) Then
  8.             If workDir.EndsWith(".slddrw", True, Nothing) And InStr(workDir, strTmp) = 0 Then
  9.                 ListBox1.Items.Add(workDir)
  10.             End If
  11.         Else



  12.             Dim i As Integer = 0

  13.             '临时文件包含此字符,如果文件名包括此字符,应该排除此项
  14.             SwFiles = Directory.GetFiles(workDir, "*.slddrw", SearchOption.AllDirectories)


  15.             For Each myfile As String In SwFiles
  16.                 If InStr(myfile, strTmp) = 0 Then
  17.                     ListBox1.Items.Add(myfile)

  18.                     



  19.                 End If

  20.             Next
  21.         End If
  22.     End Sub

  23.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  24.         FBD1.ShowDialog()
  25.         workDir = FBD1.SelectedPath
  26.         If workDir <> "" Then

  27.             getFiles()
  28.         End If
  29.     End Sub

  30.     Private Sub Form1_DragDrop(sender As Object, e As DragEventArgs) Handles Me.DragDrop
  31.         Dim myfiles() As String
  32.         myfiles = e.Data.GetData(DataFormats.FileDrop)

  33.         For i = 0 To myfiles.GetUpperBound(0)
  34.             workDir = myfiles(i)   '检入文件夹

  35.             getFiles()
  36.         Next

  37.     End Sub


  38.     Private Sub Form1_DragEnter(sender As Object, e As DragEventArgs) Handles Me.DragEnter
  39.         If e.Data.GetDataPresent(DataFormats.FileDrop) Then
  40.             e.Effect = DragDropEffects.All
  41.         End If
  42.     End Sub

  43.     Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
  44.         If Not swApp Is Nothing Then
  45.             If MsgBox("在退出时是否关闭solidworks程序?", MsgBoxStyle.YesNo) = MsgBoxResult.Ok Then
  46.                 swApp.ExitApp()
  47.                 swApp = Nothing
  48.             End If
  49.         End If
  50.     End Sub

  51.    

  52.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  53.         CboxShowSW.Checked = True
  54.         For Each ptName As String In PrinterSettings.InstalledPrinters
  55.          
  56.             cbxPtA4.Items.Add(ptName)
  57.             cbxPtOut.Items.Add(ptName)
  58.         Next

  59.         cbxPtA4.SelectedIndex = 0
  60.         cbxPtOut.SelectedIndex = 0

  61.         For i As Integer = 0 To userDPI.GetUpperBound(0)
  62.             cbxDpi.Items.Add(userDPI(i))
  63.         Next
  64.         cbxDpi.SelectedIndex = 6
  65.         intDPI = cbxDpi.Items(cbxDpi.SelectedIndex)

  66.         For i = 0 To PrintSize.GetUpperBound(0)
  67.             CBoxPaperSize.Items.Add(PrintSize(i))
  68.         Next
  69.         CBoxPaperSize.SelectedIndex = 0
  70.         RadioButtonHigh.Checked = True

  71.     End Sub

  72.     Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
  73.         loadsw()
  74.     End Sub

  75.     Private Sub cbxDpi_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbxDpi.SelectedIndexChanged
  76.         intDPI = cbxDpi.Items(cbxDpi.SelectedIndex)

  77.     End Sub

  78.     Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
  79.         ListBox1.Items.Clear()
  80.     End Sub

  81.     Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
  82.         For i = 0 To ListBox1.SelectedItems.Count - 1
  83.             ListBox1.Items.Remove(ListBox1.SelectedItems(0))
  84.         Next
  85.     End Sub





  86.     Private Sub Button2_Click(sender As Object, e As EventArgs)

  87.     End Sub

  88.     Private Sub cbxPtTiff_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbxPtOut.SelectedIndexChanged

  89.         PT1.PrinterSettings.PrinterName = cbxPtOut.SelectedItem


  90.     End Sub

  91.     Private Sub ListLargePapers_DoubleClick(sender As Object, e As EventArgs) Handles ListLargePapers.DoubleClick
  92.         If ListLargePapers.SelectedIndex <> -1 Then
  93.             swApp.OpenDoc(ListLargePapers.SelectedItem, 3)
  94.         End If
  95.     End Sub

  96.    

  97.     Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click
  98.         MsgBox("本程序完全免费!!" & vbCrLf & "编写此程序一是为了为大家提供便利,二是为了展示我们作为专利代理人,在机械设计方面的实力" & vbCrLf & "如果您想要申请专利,欢迎联系我。 郜文刚,QQ:258453495")
  99.     End Sub

  100.    
  101. End Class
复制代码

作者: gaowengang    时间: 2014-2-13 19:18
  1. Module paperRelated
  2.     '重置列表数组
  3.     Sub reSetpoList()
  4.         For i = 0 To poList.GetUpperBound(0)
  5.             poList(i) = 0
  6.         Next

  7.     End Sub
  8.     Sub getA2s()
  9.         x = 0
  10.         y = 0
  11.         z = 0
  12.         A2exist = False
  13.         A3exist = False
  14.         A4exist = False

  15.         For Each aaa As SwDraw In swDrawCollecton
  16.             If aaa.PaperSize = "A2" Then
  17.                 x += 1
  18.             End If
  19.             If aaa.PaperSize = "A3" Then
  20.                 y += 1
  21.             End If
  22.             If aaa.PaperSize = "A4" Then
  23.                 z += 1
  24.             End If
  25.         Next
  26.         If x <> 0 Then
  27.             A2exist = True
  28.             ReDim checkA2(x - 1)
  29.         End If

  30.         If y <> 0 Then
  31.             A3exist = True
  32.             ReDim checkA3(y - 1)
  33.         End If
  34.         If z <> 0 Then
  35.             A4exist = True
  36.             ReDim checkA4(z - 1)
  37.         End If


  38.         x = 0
  39.         y = 0
  40.         z = 0

  41.         For i = 0 To swDrawCollecton.Count - 1
  42.             If swDrawCollecton.Item(i).PaperSize = "A2" Then
  43.                 checkA2(x) = i

  44.                 x += 1
  45.             End If
  46.             If swDrawCollecton.Item(i).PaperSize = "A3" Then
  47.                 checkA3(y) = i

  48.                 y += 1
  49.             End If
  50.             If swDrawCollecton.Item(i).PaperSize = "A4" Then
  51.                 checkA4(z) = i

  52.                 z += 1
  53.             End If
  54.         Next

  55.         CountAsA4 = x * 4 + y * 2 + z
  56.     End Sub
  57.     Sub fillPaper()
  58.         '将图纸进行排序
  59.         If CountAsA4 Mod 8 <> 0 Then
  60.             paperCount = CountAsA4 \ 8 + 1
  61.         Else : paperCount = CountAsA4 \ 8
  62.         End If
  63.         paperLeft = swDrawCollecton.Count
  64.         A2Current = 0
  65.         A3Current = 0
  66.         A4Current = 0
  67.         j = 0
  68.         FinalPapers = New ptPaperAll
  69.         For i = 0 To paperCount - 1
  70.             '填充图纸
  71.             '清空标志数组
  72.             reSetpoList()
  73.             onePaper = New ptPaper
  74.             onePaper.inNerPapers = New swDrawsAll
  75.             '<>1,说明图纸未填满

  76.             Do While poList(7) <> 1

  77.                 '装填A2
  78.                 If A2exist = True And A2Current <> x Then
  79.                     '往前装填
  80.                     If poList(0) = 0 Then
  81.                         swDrawCollecton.Item(checkA2(A2Current)).insertPosX = 0
  82.                         swDrawCollecton.Item(checkA2(A2Current)).insertPosY = 0
  83.                         onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA2(A2Current)))
  84.                         poList(0) = 1
  85.                         poList(1) = 1
  86.                         poList(4) = 1
  87.                         poList(5) = 1
  88.                         A2Current += 1
  89.                         'A2不存在或者已被填充完毕
  90.                         If A2Current = x Then A2exist = False
  91.                     End If
  92.                     If A2exist = True And poList(0) = 1 And poList(2) = 0 Then
  93.                         '往后装填
  94.                         swDrawCollecton.Item(checkA2(A2Current)).insertPosX = 2
  95.                         swDrawCollecton.Item(checkA2(A2Current)).insertPosY = 0
  96.                         onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA2(A2Current)))
  97.                         poList(2) = 1
  98.                         poList(3) = 1
  99.                         poList(6) = 1
  100.                         poList(7) = 1
  101.                         A2Current += 1
  102.                         'A2不存在或者已被填充完毕
  103.                         If A2Current = x Then A2exist = False
  104.                     End If
  105.                 End If  'A2装填完毕


  106.                 '装填A3
  107.                 If A3exist = True And A3Current <> y And A2exist = False Then
  108.                     '第一个格子
  109.                     If poList(0) = 0 Then
  110.                         swDrawCollecton.Item(checkA3(A3Current)).insertPosX = 0
  111.                         swDrawCollecton.Item(checkA3(A3Current)).insertPosY = 0
  112.                         onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA3(A3Current)))
  113.                         poList(0) = 1
  114.                         poList(1) = 1

  115.                         A3Current += 1
  116.                         'A3不存在或者已被填充完毕
  117.                         If A3Current = y Then A3exist = False
  118.                     End If
  119.                     '第一个格子已填,检查第二个格子
  120.                     If A3exist = True And poList(0) = 1 And poList(2) = 0 Then
  121.                         swDrawCollecton.Item(checkA3(A3Current)).insertPosX = 2
  122.                         swDrawCollecton.Item(checkA3(A3Current)).insertPosY = 0
  123.                         onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA3(A3Current)))
  124.                         poList(2) = 1
  125.                         poList(3) = 1

  126.                         A3Current += 1
  127.                         'A3不存在或者已被填充完毕
  128.                         If A3Current = y Then A3exist = False
  129.                     End If
  130.                     '第二个格子已填,检查第三个格子
  131.                     If A3exist = True And poList(0) = 1 And poList(2) = 1 And poList(4) = 0 Then
  132.                         swDrawCollecton.Item(checkA3(A3Current)).insertPosX = 0
  133.                         swDrawCollecton.Item(checkA3(A3Current)).insertPosY = 1
  134.                         onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA3(A3Current)))
  135.                         poList(4) = 1
  136.                         poList(5) = 1

  137.                         A3Current += 1
  138.                         'A3不存在或者已被填充完毕
  139.                         If A3Current = y Then A3exist = False
  140.                     End If
  141.                     '第三个格子已填,检查第四个格子
  142.                     If A3exist = True And poList(0) = 1 And poList(2) = 1 And poList(4) = 1 And poList(6) = 0 Then
  143.                         swDrawCollecton.Item(checkA3(A3Current)).insertPosX = 2
  144.                         swDrawCollecton.Item(checkA3(A3Current)).insertPosY = 1
  145.                         onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA3(A3Current)))
  146.                         poList(6) = 1
  147.                         poList(7) = 1

  148.                         A3Current += 1
  149.                         'A3不存在或者已被填充完毕
  150.                         If A3Current = y Then A3exist = False
  151.                     End If   'A3检查完毕
  152.                 End If   'A3填装完毕
  153.                 '开始填装A4
  154.                 If A3exist = False And A4Current <> z And A2exist = False And A4exist = True Then
  155.                     '检查A4的第一个格子
  156.                     If poList(0) = 0 Then
  157.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 0
  158.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 0
  159.                         onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
  160.                         poList(0) = 1
  161.                         A4Current += 1
  162.                         'A4不存在或者已被填充完毕
  163.                         If A4Current = z Then A4exist = False
  164.                     End If
  165.                     '检查A4的第二个格子
  166.                     If A4exist = True And poList(0) = 1 And poList(1) = 0 Then
  167.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 1
  168.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 0
  169.                         onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
  170.                         poList(1) = 1
  171.                         A4Current += 1
  172.                         'A4不存在或者已被填充完毕
  173.                         If A4Current = z Then A4exist = False
  174.                     End If
  175.                     '检查A4的第三个格子
  176.                     If A4exist = True And poList(0) = 1 And poList(1) = 1 And poList(2) = 0 Then
  177.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 2
  178.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 0
  179.                         onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
  180.                         poList(2) = 1
  181.                         A4Current += 1
  182.                         'A4不存在或者已被填充完毕
  183.                         If A4Current = z Then A4exist = False
  184.                     End If
  185.                     '检查A4的第四个格子
  186.                     If A4exist = True And poList(0) = 1 And poList(1) = 1 And poList(2) = 1 And poList(3) = 0 Then
  187.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 3
  188.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 0
  189.                         onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
  190.                         poList(3) = 1
  191.                         A4Current += 1
  192.                         'A4不存在或者已被填充完毕
  193.                         If A4Current = z Then A4exist = False
  194.                     End If
  195.                     '检查A4的第五个格子
  196.                     If A4exist = True And poList(0) = 1 And poList(1) = 1 And poList(2) = 1 And poList(3) = 1 And poList(4) = 0 Then
  197.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 0
  198.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 1
  199.                         onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
  200.                         poList(4) = 1
  201.                         A4Current += 1
  202.                         'A4不存在或者已被填充完毕
  203.                         If A4Current = z Then A4exist = False
  204.                     End If
  205.                     '检查A4的第六个格子
  206.                     If A4exist = True And poList(0) = 1 And poList(1) = 1 And poList(2) = 1 And poList(3) = 1 And poList(4) = 1 And poList(5) = 0 Then
  207.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 1
  208.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 1
  209.                         onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
  210.                         poList(5) = 1
  211.                         A4Current += 1
  212.                         'A4不存在或者已被填充完毕
  213.                         If A4Current = z Then A4exist = False
  214.                     End If
  215.                     '检查A4的第七个格子
  216.                     If A4exist = True And poList(0) = 1 And poList(1) = 1 And poList(2) = 1 And poList(3) = 1 And poList(4) = 1 And poList(5) = 1 _
  217.                      And poList(6) = 0 Then
  218.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 2
  219.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 1
  220.                         onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
  221.                         poList(6) = 1
  222.                         A4Current += 1
  223.                         'A4不存在或者已被填充完毕
  224.                         If A4Current = z Then A4exist = False
  225.                     End If
  226.                     '检查A4的第八个格子
  227.                     If A4exist = True And poList(0) = 1 And poList(1) = 1 And poList(2) = 1 And poList(3) = 1 And poList(4) = 1 And poList(5) = 1 _
  228.                      And poList(6) = 1 And poList(7) = 0 Then
  229.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 3
  230.                         swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 1
  231.                         onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
  232.                         poList(7) = 1
  233.                         A4Current += 1
  234.                         'A4不存在或者已被填充完毕
  235.                         If A4Current = z Then A4exist = False
  236.                     End If
  237.                 End If



  238.                 '剩余图纸的数量减一
  239.                 paperLeft -= 1
  240.                 If paperLeft = 0 Then
  241.                     Exit Do
  242.                 End If


  243.             Loop


  244.             FinalPapers.Add(onePaper)

  245.         Next

  246.         onePaper = Nothing
  247.       
  248.     End Sub

  249. End Module
复制代码

作者: gaowengang    时间: 2014-2-13 19:19
  1. Imports System.Drawing
  2. Imports System.Drawing.Graphics

  3. Module PictureRelated
  4.     Sub joinPicture()
  5.         '每一张大图
  6.         Dim mm As Integer = 1
  7.         For Each ds As ptPaper In FinalPapers
  8.             '图片大小
  9.             newBMape = New Bitmap(CInt(841 * intDPI / 25.4), CInt(594 * intDPI / 25.4))

  10.             '设置分辨率
  11.             newBMape.SetResolution(intDPI, intDPI)
  12.             g1 = Graphics.FromImage(newBMape)
  13.             g1.Clear(Color.White)
  14.             For Each sdraw As SwDraw In ds.inNerPapers
  15.                 myImage = Image.FromFile(sdraw.drawDir)
  16.                
  17.                 If sdraw.PaperSize = "A2" Then
  18.                     myImage.RotateFlip(RotateFlipType.Rotate90FlipNone)
  19.                     '如果是A2,则宽高翻转,同时将图像进行90度翻转
  20.                     theHeight = CInt(sdraw.drawWidth * intDPI / 25.4)
  21.                     theWidth = CInt(sdraw.drawHeight * intDPI / 25.4)
  22.                   
  23.                 Else
  24.                     theHeight = CInt(sdraw.drawHeight * intDPI / 25.4)
  25.                     theWidth = CInt(sdraw.drawWidth * intDPI / 25.4)
  26.                   
  27.                 End If


  28.                 If sdraw.PaperSize = "A4" Then
  29.                     theX = CInt(sdraw.insertPosX * intDPI * 210 / 25.4)
  30.                     theY = CInt(sdraw.insertPosY * intDPI * 297 / 25.4)
  31.                 End If
  32.                 If sdraw.PaperSize = "A3" Then

  33.                     theX = CInt(sdraw.insertPosX * intDPI * 210 / 25.4)
  34.                     theY = CInt(sdraw.insertPosY * intDPI * 297 / 25.4)

  35.                 End If
  36.                 If sdraw.PaperSize = "A2" Then
  37.                     theX = CInt(sdraw.insertPosX * intDPI * 210 / 25.4)
  38.                     theY = CInt(sdraw.insertPosY * intDPI * 297 / 25.4)
  39.                 End If
  40.                
  41.                 g1.DrawImage(myImage, theX, theY)
  42.                 myImage.Dispose()
  43.             Next
  44.             If Form1.CBoxPaperSize.SelectedIndex = 1 Then
  45.                 newBMape.RotateFlip(RotateFlipType.Rotate90FlipNone)
  46.             End If
  47.             If Form1.CBoxPrint.Checked = True Then
  48.                 printThepaper()
  49.             End If
  50.             If Form1.CBoxPicSave.Checked = True Then
  51.                 newBMape.Save(Application.StartupPath + "\outputimage\xx" + mm.ToString + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
  52.             End If
  53.             mm += 1
  54.             g1.Dispose()
  55.             newBMape.Dispose()
  56.         Next
  57.         

  58.     End Sub



  59. End Module
复制代码

作者: gaowengang    时间: 2014-2-13 19:19
  1. Imports System.IO
  2. Imports System.Drawing.Printing

  3. Module printRelated
  4.     Sub printThepaper()
  5.         If Form1.CBoxPaperSize.SelectedIndex = 0 Then
  6.             PgSize = New PaperSize("myA1", 3311, 2339)
  7.            
  8.         Else
  9.             PgSize = New PaperSize("myA2", 2339, 3311)
  10.          
  11.         End If

  12.         PTResolution = New PrinterResolution
  13.         If Form1.RadioButtonHigh.Checked Then
  14.             PTResolution.Kind = PrinterResolutionKind.High
  15.         End If
  16.         If Form1.RadioButtonFollowDpi.Checked Then
  17.             PTResolution.Kind = PrinterResolutionKind.Custom
  18.             PTResolution.X = intDPI
  19.             PTResolution.Y = intDPI
  20.         End If


  21.         PT1.DefaultPageSettings.PaperSize = PgSize

  22.         PT1.DefaultPageSettings.PrinterResolution = PTResolution

  23.         PT1.Print()

  24.     End Sub


  25. End Module
复制代码

作者: gaowengang    时间: 2014-2-13 19:20
  1. Public Class ptPaper
  2.    
  3.     '每个图纸里的小图纸
  4.     Public inNerPapers As swDrawsAll


  5. End Class
复制代码

作者: gaowengang    时间: 2014-2-13 19:20
  1. Public Class ptPaperAll
  2.     Inherits CollectionBase

  3.     Public Sub Add(ByVal newPaper As ptPaper)
  4.         Me.List.Add(newPaper)
  5.     End Sub

  6.     Public Sub Remove(ByVal oldPaper As ptPaper)
  7.         Me.List.Remove(oldPaper)
  8.     End Sub

  9.     Default Public Property Item(ByVal index As Integer) As ptPaper
  10.         Get
  11.             Return CType(Me.List(index), ptPaper)
  12.         End Get
  13.         Set(value As ptPaper)
  14.             Me.List.Item(index) = value
  15.         End Set
  16.     End Property
  17. End Class
复制代码

作者: gaowengang    时间: 2014-2-13 19:21
  1. Public Class SwDraw

  2.     Public drawDir As String   'directory of a drawing
  3.     Public drawSheetName As String   'sheet of a drawing  工程图文件中的图纸1,图纸2,等等


  4.     Public drawHeight As Single     '图纸的大小
  5.     Public drawWidth As Single

  6.     Public PaperSize As String

  7.     Public mysheet As SldWorks.Sheet
  8.     Public sheetCount As Integer
  9.     Public paperNumber As Integer      '位于第几张图纸
  10.     Public insertPosX As Integer        '在图纸中插入时的位置编号
  11.     Public insertPosY As Integer        '在图纸中插入时的位置编号



  12. End Class
复制代码

作者: gaowengang    时间: 2014-2-13 19:21
  1. Public Class swDrawsAll
  2.     Inherits CollectionBase
  3.     Public Sub Add(ByVal newDraw As SwDraw)
  4.         Me.List.Add(newDraw)
  5.     End Sub

  6.     Public Sub Remove(ByVal oldDraw As SwDraw)
  7.         Me.List.Remove(oldDraw)
  8.     End Sub

  9.     Default Public Property Item(ByVal index As Integer) As SwDraw
  10.         Get
  11.             Return CType(Me.List(index), SwDraw)
  12.         End Get
  13.         Set(value As SwDraw)
  14.             Me.List.Item(index) = value
  15.         End Set

  16.     End Property


  17. End Class
复制代码

作者: gaowengang    时间: 2014-2-13 19:22
  1. Imports SwConst
  2. Imports System.Drawing.Printing
  3. Imports SldWorks
  4. Imports System.IO


  5. Module swRelated
  6.     Public Sub loadsw()

  7.         ReDim SwFinalFiles(Form1.ListBox1.Items.Count - 1)
  8.         '将列表装入数组
  9.         For ix As Integer = 0 To SwFinalFiles.GetUpperBound(0)
  10.             SwFinalFiles(ix) = Form1.ListBox1.Items(ix)

  11.         Next
  12.         If SwFinalFiles.Length <> 0 Then

  13.             Form1.PSbar1.Maximum = SwFinalFiles.GetUpperBound(0)
  14.             Form1.PSbar1.Minimum = 0
  15.             swApp = New SldWorks.SldWorks
  16.             If Form1.CboxShowSW.Checked = True Then
  17.                 swApp.Visible = True
  18.             Else : swApp.Visible = False
  19.             End If
  20.             MsgBox("即将开始,建议关闭所有程序以保证足够内存")
  21.             Dim i As Integer
  22.             For i = 0 To SwFinalFiles.GetUpperBound(0)
  23.                 Try
  24.                     Form1.PSbar1.Value = i
  25.                     swMod = swApp.OpenDoc(SwFinalFiles(i), 3)
  26.                     swDoc = swMod
  27.                     '图片颜色变成黑白
  28.                     boolstatus = swApp.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swTiffImageType, swTiffImageType_e.swTiffImageBlackAndWhite)
  29.                     '图片分辨率设为选定值
  30.                     boolstatus = swApp.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swTiffPrintDPI, intDPI)
  31.                     '图片存放的目录全名

  32.                     intSheetCount = swDoc.GetSheetCount   '文件中图纸数量
  33.                     mysheet = swDoc.GetSheetNames     '图纸名称列表      
  34.                     For j As Integer = 0 To intSheetCount - 1
  35.                         '获取图纸的大小尺寸
  36.                         tmpInt = swDoc.Sheet(mysheet(j).ToString).GetSize(stWidth, stHeight)
  37.                         stWidth = stWidth * 1000
  38.                         stHeight = stHeight * 1000
  39.                         If stHeight = 594 Or stHeight = 841 Then
  40.                             Form1.ListLargePapers.Items.Add(SwFinalFiles(i))
  41.                             Exit For
  42.                         End If
  43.                         If stHeight = 210 Or stHeight = 297 Then
  44.                             '选择了直接出图,并且选择的是A4和A3的图纸,
  45.                             If Form1.CBoxEnable.Checked = True Then

  46.                                 '选择打印机
  47.                                 swMod.Printer = Form1.cbxPtA4.SelectedItem
  48.                                 '设置页面参数
  49.                                 Dim a As PageSetup
  50.                                 a = swMod.PageSetup
  51.                                 a.HighQuality = True
  52.                                 a.ScaleToFit = True

  53.                                 Dim tt As Boolean
  54.                                 a.DrawingColor = swPageSetupDrawingColor_e.swPageSetup_BlackAndWhite
  55.                                 a.PrinterPaperSize = PaperKind.A4
  56.                                 tt = a.UsePageSetupOnSheets()

  57.                                 If stWidth = 297 Or stWidth = 210 Then  'A4图纸
  58.                                     swMod.PrintDirect()
  59.                                 End If
  60.                                 If stWidth = 420 Then  'A3图纸
  61.                                     swMod.PrintOut(j + 1, j + 1, 1, False, swMod.Printer, 0.67, False)
  62.                                 End If

  63.                             Else




  64.                                 '将图纸录入集合
  65.                                 swSingleDraw = New SwDraw
  66.                                 tmpSavefile = Application.StartupPath & "\OutputImage" & i.ToString & _
  67.                              mysheet(j).ToString & ".tif"
  68.                                 swMod.SaveAs(tmpSavefile)   '保存成jpg文件
  69.                                 With swSingleDraw
  70.                                     .drawDir = tmpSavefile
  71.                                     .drawHeight = stHeight
  72.                                     .drawWidth = stWidth
  73.                                 End With
  74.                                 If stWidth = 210 Then
  75.                                     swSingleDraw.PaperSize = "A4"

  76.                                 End If
  77.                                 If stWidth = 420 Then
  78.                                     swSingleDraw.PaperSize = "A3"

  79.                                 End If



  80.                             End If
  81.                         End If
  82.                         '如果是A2的尺寸,处理同上。
  83.                         If stHeight = 420 Then
  84.                             '将图纸录入集合

  85.                             swSingleDraw = New SwDraw
  86.                             tmpSavefile = Application.StartupPath & "\OutputImage" & i.ToString & _
  87.                         mysheet(j).ToString & ".tif"
  88.                             swMod.SaveAs(tmpSavefile)   '保存成TIF文件
  89.                             With swSingleDraw
  90.                                 .drawDir = tmpSavefile
  91.                                 .drawHeight = stHeight
  92.                                 .drawWidth = stWidth
  93.                             End With

  94.                             If stWidth = 594 Then
  95.                                 swSingleDraw.PaperSize = "A2"

  96.                             End If


  97.                         End If

  98.                         '录入完毕,图纸尺寸全部放入到了对象swSingleDraw中

  99.                         swDrawCollecton.Add(swSingleDraw)


  100.                         swDoc.SheetNext()
  101.                     Next
  102.                     swApp.CloseDoc(SwFinalFiles(i))
  103.                     swDoc = Nothing
  104.                     swMod = Nothing

  105.                 Catch ex As Exception
  106.                 End Try
  107.             Next
  108.             
  109.             getA2s()
  110.             fillPaper()
  111.             joinPicture()
  112.             MsgBox("successed!")

  113.         Else : MsgBox("list not exist")
  114.         End If




  115.     End Sub





  116. End Module
复制代码

作者: gaowengang    时间: 2014-2-13 19:34
各个控件的名称。

作者: dreamsboy    时间: 2014-2-13 20:47
最好版主研究下能解决A3 A4自动识别图幅自动打印成需要的图幅的问题那就完美了
作者: dreamsboy    时间: 2015-3-27 20:55
请问楼主,您发的附件是已经进行了更新的吗?
作者: gaowengang    时间: 2015-4-2 14:33
dreamsboy 发表于 2015-3-27 20:55
请问楼主,您发的附件是已经进行了更新的吗?

不好意思,工作太忙了,到目前还没有更新过。我建议你参考这些代码来自己实现一些更实用的功能,体验编程的乐趣!如果不会VB,也不要紧,入门非常简单的。我写这些代码的时候,也只是看过一本书《visual basic2010 入门经典》,https://yuedu.baidu.com/ebook/4be321fff705cc1755270937.html  建议你找来看一看,现在应该更新为VB2012或者VB2013版的了,任何一家新华书店都可以买到。如果有什么问题可以加我Q,一起研究~~

作者: kimtuyendcn    时间: 2015-7-29 16:27
Thank for share, It's very useful
作者: baiqvcel    时间: 2016-7-28 14:31
楼主,是将solidworks工程图进行转化成图片,再进行拼图的么?
能不能直接拼solidworks工程图呢?
作者: dreamsboy    时间: 2016-8-2 18:37
拷了楼主的代码下来学习了。

现在开思的楼层好乱呀,有的不是按发帖时间排序的了,有的楼层又无源无故消失了,楼层乱了,不知道会不会把楼主的代码先后顺序复制错了。没接触过VS,不知道是不是把代码顺序搞错了,如果搞错顺序的话,会不会设定变量的部分反而搞到后面去了?不VS编程语句顺序颠倒顺序的话会不会有问题?反正我现在就知道VB对变量等位置要求比较严格,稍微把一句代码错过位就有可能引起宏运行错误了。
作者: qiminger    时间: 2016-8-4 07:24
感觉很强大 ,感谢楼主开源,提供学习~~
作者: gaowengang    时间: 2016-8-4 15:04
baiqvcel 发表于 2016-7-28 14:31
楼主,是将solidworks工程图进行转化成图片,再进行拼图的么?
能不能直接拼solidworks工程图呢?

是这样的,转化成图片,再把图拼成A1图幅,如果图纸本来就是A1或者A0,则不作处理。直接拼SW工程图我不会~~~先找到A2图纸,将两张A2拼成A1,A2图纸拼完后,找到A3图纸,4张A3拼A1,最后是用8张A4图纸拼A1。



作者: gaowengang    时间: 2016-8-4 15:10
dreamsboy 发表于 2016-8-2 18:37
拷了楼主的代码下来学习了。

现在开思的楼层好乱呀,有的不是按发帖时间排序的了,有的楼层又无源无故消 ...

我在1楼最下方已经公开 源代码 的压缩文件了,直接下载解压然后在visual studio里打开就一目了然了。每段代码都分别存在于一个单独的文件里,相互之间不存在前后关系。

作者: dreamsboy    时间: 2016-8-4 23:06
gaowengang 发表于 2016-8-4 15:10
我在1楼最下方已经公开 源代码 的压缩文件了,直接下载解压然后在visual studio里打开就一目了然了。每段 ...

哦哦,我知道了,谢谢了。
我还没接触过VS,还以为VS是和VB一样是把所有的代码写在一个宏里呢。

作者: 83038113    时间: 2016-12-18 21:12
一个打印的要这么多代码?




欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3