SolidWorks机械工程师网——最大的SolidWorks学习平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

好品数字
好品数字
查看: 1215668|回复: 22
打印 上一主题 下一主题

Solidworks拼图打印程序(源码公布)

  [复制链接]

85

主题

314

帖子

161

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
476
跳转到指定楼层
楼主
发表于 2013-12-16 22:19:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本人用vb.net编写的,能够对SW2010、2012、2014进行拼图打印。需要拼图打印的朋友去试试吧。
希望对大家有用。
之前没公布源码是因为写的水平实在不高。现在我把源码公布出来,感兴趣的朋友们来下载吧。开发用的软件是免费版本的visual studio 2013 express for windows desktop , 用VS2013旗舰版应该也是可以的。当前代码引用的是SW2014的运行库,如果你的电脑上安装的是其他版本的SW,需要删除SW2014的引用,然后修改为引用相应的版本。

WengangPrinter.rar (852.57 KB, 下载次数: 20, 售价: 5 金币)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享教程|习题|模型|技巧 点赞点赞16301 拍砖拍砖985
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复

使用道具 举报

11

主题

238

帖子

36

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
289
QQ
沙发
发表于 2013-12-16 22:19:52 | 只看该作者
感謝樓主無私分享。
看過教程,做得非常精致。
若在源碼加入以下語句(可能要略作修改以作配合),就可以省掉手動調整選項這步驟了。
        swApp.SetUserPreferenceToggle swTiffPrintScaleToFit, False
        swApp.SetUserPreferenceIntegerValue swTiffScreenOrPrintCapture, 1
        swApp.SetUserPreferenceIntegerValue swTiffImageType, 0
        swApp.SetUserPreferenceIntegerValue swTiffCompressionScheme, 2
        swApp.SetUserPreferenceIntegerValue swTiffPrintDPI, 300
        swApp.SetUserPreferenceIntegerValue swTiffPrintPaperSize, 12
        swApp.SetUserPreferenceIntegerValue swTiffPrintScaleFactor, 100
        swApp.SetUserPreferenceDoubleValue swTiffPrintDrawingPaperHeight, DrawingPaperHeight
        swApp.SetUserPreferenceDoubleValue swTiffPrintDrawingPaperWidth, DrawingPaperWidth

复制代码
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复 支持 反对

使用道具 举报

10

主题

239

帖子

24

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
293
QQ
板凳
发表于 2013-12-16 22:20:10 | 只看该作者
多谢版主的指导。我将在稍后的改进版本中尝试加入您的代码。
由于程序刚刚完成不久,必然有很多bug,大家试用过程中发现了bug,或者任何的建议,请反馈给我,我们一起来把软件做得更加完善。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

7

主题

193

帖子

24

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
240
QQ
地板
发表于 2013-12-16 22:22:05 | 只看该作者
谢谢分享,能把源代码放出来,值得敬佩。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

14

主题

224

帖子

28

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
271
QQ
5#
发表于 2013-12-16 22:22:49 | 只看该作者

   经典案例图书
一直想找个SW的批量打印小程序,请问下楼主你这程序能自动识别图幅大小自动把A4图幅打印到A4图纸A3图幅自动打印到A3图纸上吗?
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

15

主题

233

帖子

28

金币

侠客

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

8

主题

227

帖子

20

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
267
QQ
7#
发表于 2013-12-16 22:28:57 | 只看该作者

   经典案例图书
谢谢回复。事情要做得完美,必须付出努力。辛苦楼主了。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

6

主题

237

帖子

12

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
274
QQ
8#
发表于 2013-12-16 22:29:20 | 只看该作者
我试着把代码贴出来,大侠多多指教
    Imports SldWorks
    Imports System.Drawing.Printing
    Module canshu
        Public SwFiles() As String      'SolidWorks  文件列表,可能包含临时文件,故不能直接使用
        Public SwFile As String       'solidworks工程图文件
        Public SwFinalFiles() As String '对swfiles()进行提取,作为最终的文件列表
        Public tmpSaveDir() As String   '临时文件存放目录的集合
        Public tmpSavefile As String   '临时文件存放的目录
        Public workDir As String     '存放solidworksw文件的文件夹
        Public swApp As SldWorks.SldWorks 'solidworks 主程序
        Public swMod As ModelDoc2      'solidworks 模型
        Public swDoc As SldWorks.DrawingDoc  'solidworks 图纸文档
        Public swSheet As SldWorks.Sheet    '文件内的图纸
        Public intSheetCount As Integer    '图纸的数量
        Public mysheet() As Object     'sheet列表
        Public stWidth As Double     'sheet的宽
        Public stHeight As Double    'sheet的高
        Public tmpInt As Integer    '临时变量,
        Public strTmp As String      '临时字符串,具有各种作用
        '设置输出时的DPI,这是sw能输出的列表里抄的
        Public userDPI() As Integer = {50, 72, 100, 150, 200, 240, 300, 360, 400, 600, 720, 800, 1200, 1440, 2880}
        Public intDPI As Integer    '转换时,选择的dpi
        Public swDrawCollecton As New swDrawsAll  '图纸的集合
        Public swSingleDraw As SwDraw      '一张单独的图纸
        Public boolstatus As Boolean   '各种状态,为了便于直接copy vba
        Public myPrinters() As String   '打印机列表
        Public PrintSize() As String = {"A1(880×50米)", "A2(620×50米)"}
        Public poList(7) As Integer     '表示插入位置的数组
        Public CountAsA4 As Integer    '折换成A4的数量
        Public paperPager As Integer = 1   '表示的是拼合后的第几张图纸
        Public checkA2() As Integer       '集合中的那些元素是A2图纸
        Public checkA3() As Integer
        Public checkA4() As Integer
        Public x, y, z, j, k As Integer
        Public A2exist, A3exist, A4exist As Boolean
        Public paperCount As Integer    '最终要打印的图纸的数量
        Public paperLeft As Integer    '剩余图纸的数量
        Public A2Current As Integer   '当前的各种大小图纸是该型图中的第几张
        Public A3Current As Integer
        Public A4Current As Integer
        Public onePaper As ptPaper
        Public FinalPapers As ptPaperAll
        Public newImage As Image
        Public singleImage As Image
        Public newBMape As Bitmap
        Public myImage As Image
        Public g1 As Graphics
        Public theX, theY, theWidth, theHeight As Integer  '填充图片时用到的坐标值
        Public WithEvents PT1 As New PrintDocument
        Public PgSet As PageSettings
        Public PgSize As PaperSize
        Public PTResolution As PrinterResolution
        Private Sub PT1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PT1.PrintPage
            e.Graphics.DrawImage(newBMape, 10, 10)
        End Sub
    End Module

复制代码
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

16

主题

218

帖子

35

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
281
QQ
9#
发表于 2013-12-16 22:32:25 | 只看该作者
    Imports System.IO
    Imports System.Drawing.Printing
    Public Class Form1
       
        Sub getFiles()
            strTmp = "$"
            If File.Exists(workDir) Then
                If workDir.EndsWith(".slddrw", True, Nothing) And InStr(workDir, strTmp) = 0 Then
                    ListBox1.Items.Add(workDir)
                End If
            Else
                Dim i As Integer = 0
                '临时文件包含此字符,如果文件名包括此字符,应该排除此项
                SwFiles = Directory.GetFiles(workDir, "*.slddrw", SearchOption.AllDirectories)
                For Each myfile As String In SwFiles
                    If InStr(myfile, strTmp) = 0 Then
                        ListBox1.Items.Add(myfile)
                        
                    End If
                Next
            End If
        End Sub
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            FBD1.ShowDialog()
            workDir = FBD1.SelectedPath
            If workDir <> &quot;&quot; Then
                getFiles()
            End If
        End Sub
        Private Sub Form1_DragDrop(sender As Object, e As DragEventArgs) Handles Me.DragDrop
            Dim myfiles() As String
            myfiles = e.Data.GetData(DataFormats.FileDrop)
            For i = 0 To myfiles.GetUpperBound(0)
                workDir = myfiles(i)   '检入文件夹
                getFiles()
            Next
        End Sub

        Private Sub Form1_DragEnter(sender As Object, e As DragEventArgs) Handles Me.DragEnter
            If e.Data.GetDataPresent(DataFormats.FileDrop) Then
                e.Effect = DragDropEffects.All
            End If
        End Sub
        Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
            If Not swApp Is Nothing Then
                If MsgBox(&quot;在退出时是否关闭solidworks程序?&quot;, MsgBoxStyle.YesNo) = MsgBoxResult.Ok Then
                    swApp.ExitApp()
                    swApp = Nothing
                End If
            End If
        End Sub
       
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            CboxShowSW.Checked = True
            For Each ptName As String In PrinterSettings.InstalledPrinters
             
                cbxPtA4.Items.Add(ptName)
                cbxPtOut.Items.Add(ptName)
            Next
            cbxPtA4.SelectedIndex = 0
            cbxPtOut.SelectedIndex = 0
            For i As Integer = 0 To userDPI.GetUpperBound(0)
                cbxDpi.Items.Add(userDPI(i))
            Next
            cbxDpi.SelectedIndex = 6
            intDPI = cbxDpi.Items(cbxDpi.SelectedIndex)
            For i = 0 To PrintSize.GetUpperBound(0)
                CBoxPaperSize.Items.Add(PrintSize(i))
            Next
            CBoxPaperSize.SelectedIndex = 0
            RadioButtonHigh.Checked = True
        End Sub
        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            loadsw()
        End Sub
        Private Sub cbxDpi_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbxDpi.SelectedIndexChanged
            intDPI = cbxDpi.Items(cbxDpi.SelectedIndex)
        End Sub
        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
            ListBox1.Items.Clear()
        End Sub
        Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
            For i = 0 To ListBox1.SelectedItems.Count - 1
                ListBox1.Items.Remove(ListBox1.SelectedItems(0))
            Next
        End Sub
        Private Sub Button2_Click(sender As Object, e As EventArgs)
        End Sub
        Private Sub cbxPtTiff_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbxPtOut.SelectedIndexChanged
            PT1.PrinterSettings.PrinterName = cbxPtOut.SelectedItem
        End Sub
        Private Sub ListLargePapers_DoubleClick(sender As Object, e As EventArgs) Handles ListLargePapers.DoubleClick
            If ListLargePapers.SelectedIndex <> -1 Then
                swApp.OpenDoc(ListLargePapers.SelectedItem, 3)
            End If
        End Sub
       
        Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click
            MsgBox(&quot;本程序完全免费!!&quot; & vbCrLf & &quot;编写此程序一是为了为大家提供便利,二是为了展示我们作为专利代理人,在机械设计方面的实力&quot; & vbCrLf & &quot;如果您想要申请专利,欢迎联系我。 郜文刚,QQ:258453495&quot;)
        End Sub
       
    End Class

复制代码
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

7

主题

242

帖子

15

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
257
10#
发表于 2013-12-16 22:32:50 | 只看该作者
    Module paperRelated
        '重置列表数组
        Sub reSetpoList()
            For i = 0 To poList.GetUpperBound(0)
                poList(i) = 0
            Next
        End Sub
        Sub getA2s()
            x = 0
            y = 0
            z = 0
            A2exist = False
            A3exist = False
            A4exist = False
            For Each aaa As SwDraw In swDrawCollecton
                If aaa.PaperSize = &quot;A2&quot; Then
                    x += 1
                End If
                If aaa.PaperSize = &quot;A3&quot; Then
                    y += 1
                End If
                If aaa.PaperSize = &quot;A4&quot; Then
                    z += 1
                End If
            Next
            If x <> 0 Then
                A2exist = True
                ReDim checkA2(x - 1)
            End If
            If y <> 0 Then
                A3exist = True
                ReDim checkA3(y - 1)
            End If
            If z <> 0 Then
                A4exist = True
                ReDim checkA4(z - 1)
            End If
            x = 0
            y = 0
            z = 0
            For i = 0 To swDrawCollecton.Count - 1
                If swDrawCollecton.Item(i).PaperSize = &quot;A2&quot; Then
                    checkA2(x) = i
                    x += 1
                End If
                If swDrawCollecton.Item(i).PaperSize = &quot;A3&quot; Then
                    checkA3(y) = i
                    y += 1
                End If
                If swDrawCollecton.Item(i).PaperSize = &quot;A4&quot; Then
                    checkA4(z) = i
                    z += 1
                End If
            Next
            CountAsA4 = x * 4 + y * 2 + z
        End Sub
        Sub fillPaper()
            '将图纸进行排序
            If CountAsA4 Mod 8 <> 0 Then
                paperCount = CountAsA4  8 + 1
            Else : paperCount = CountAsA4  8
            End If
            paperLeft = swDrawCollecton.Count
            A2Current = 0
            A3Current = 0
            A4Current = 0
            j = 0
            FinalPapers = New ptPaperAll
            For i = 0 To paperCount - 1
                '填充图纸
                '清空标志数组
                reSetpoList()
                onePaper = New ptPaper
                onePaper.inNerPapers = New swDrawsAll
                '<>1,说明图纸未填满
                Do While poList(7) <> 1
                    '装填A2
                    If A2exist = True And A2Current <> x Then
                        '往前装填
                        If poList(0) = 0 Then
                            swDrawCollecton.Item(checkA2(A2Current)).insertPosX = 0
                            swDrawCollecton.Item(checkA2(A2Current)).insertPosY = 0
                            onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA2(A2Current)))
                            poList(0) = 1
                            poList(1) = 1
                            poList(4) = 1
                            poList(5) = 1
                            A2Current += 1
                            'A2不存在或者已被填充完毕
                            If A2Current = x Then A2exist = False
                        End If
                        If A2exist = True And poList(0) = 1 And poList(2) = 0 Then
                            '往后装填
                            swDrawCollecton.Item(checkA2(A2Current)).insertPosX = 2
                            swDrawCollecton.Item(checkA2(A2Current)).insertPosY = 0
                            onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA2(A2Current)))
                            poList(2) = 1
                            poList(3) = 1
                            poList(6) = 1
                            poList(7) = 1
                            A2Current += 1
                            'A2不存在或者已被填充完毕
                            If A2Current = x Then A2exist = False
                        End If
                    End If  'A2装填完毕
                    '装填A3
                    If A3exist = True And A3Current <> y And A2exist = False Then
                        '第一个格子
                        If poList(0) = 0 Then
                            swDrawCollecton.Item(checkA3(A3Current)).insertPosX = 0
                            swDrawCollecton.Item(checkA3(A3Current)).insertPosY = 0
                            onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA3(A3Current)))
                            poList(0) = 1
                            poList(1) = 1
                            A3Current += 1
                            'A3不存在或者已被填充完毕
                            If A3Current = y Then A3exist = False
                        End If
                        '第一个格子已填,检查第二个格子
                        If A3exist = True And poList(0) = 1 And poList(2) = 0 Then
                            swDrawCollecton.Item(checkA3(A3Current)).insertPosX = 2
                            swDrawCollecton.Item(checkA3(A3Current)).insertPosY = 0
                            onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA3(A3Current)))
                            poList(2) = 1
                            poList(3) = 1
                            A3Current += 1
                            'A3不存在或者已被填充完毕
                            If A3Current = y Then A3exist = False
                        End If
                        '第二个格子已填,检查第三个格子
                        If A3exist = True And poList(0) = 1 And poList(2) = 1 And poList(4) = 0 Then
                            swDrawCollecton.Item(checkA3(A3Current)).insertPosX = 0
                            swDrawCollecton.Item(checkA3(A3Current)).insertPosY = 1
                            onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA3(A3Current)))
                            poList(4) = 1
                            poList(5) = 1
                            A3Current += 1
                            'A3不存在或者已被填充完毕
                            If A3Current = y Then A3exist = False
                        End If
                        '第三个格子已填,检查第四个格子
                        If A3exist = True And poList(0) = 1 And poList(2) = 1 And poList(4) = 1 And poList(6) = 0 Then
                            swDrawCollecton.Item(checkA3(A3Current)).insertPosX = 2
                            swDrawCollecton.Item(checkA3(A3Current)).insertPosY = 1
                            onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA3(A3Current)))
                            poList(6) = 1
                            poList(7) = 1
                            A3Current += 1
                            'A3不存在或者已被填充完毕
                            If A3Current = y Then A3exist = False
                        End If   'A3检查完毕
                    End If   'A3填装完毕
                    '开始填装A4
                    If A3exist = False And A4Current <> z And A2exist = False And A4exist = True Then
                        '检查A4的第一个格子
                        If poList(0) = 0 Then
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 0
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 0
                            onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
                            poList(0) = 1
                            A4Current += 1
                            'A4不存在或者已被填充完毕
                            If A4Current = z Then A4exist = False
                        End If
                        '检查A4的第二个格子
                        If A4exist = True And poList(0) = 1 And poList(1) = 0 Then
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 1
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 0
                            onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
                            poList(1) = 1
                            A4Current += 1
                            'A4不存在或者已被填充完毕
                            If A4Current = z Then A4exist = False
                        End If
                        '检查A4的第三个格子
                        If A4exist = True And poList(0) = 1 And poList(1) = 1 And poList(2) = 0 Then
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 2
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 0
                            onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
                            poList(2) = 1
                            A4Current += 1
                            'A4不存在或者已被填充完毕
                            If A4Current = z Then A4exist = False
                        End If
                        '检查A4的第四个格子
                        If A4exist = True And poList(0) = 1 And poList(1) = 1 And poList(2) = 1 And poList(3) = 0 Then
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 3
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 0
                            onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
                            poList(3) = 1
                            A4Current += 1
                            'A4不存在或者已被填充完毕
                            If A4Current = z Then A4exist = False
                        End If
                        '检查A4的第五个格子
                        If A4exist = True And poList(0) = 1 And poList(1) = 1 And poList(2) = 1 And poList(3) = 1 And poList(4) = 0 Then
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 0
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 1
                            onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
                            poList(4) = 1
                            A4Current += 1
                            'A4不存在或者已被填充完毕
                            If A4Current = z Then A4exist = False
                        End If
                        '检查A4的第六个格子
                        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
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 1
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 1
                            onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
                            poList(5) = 1
                            A4Current += 1
                            'A4不存在或者已被填充完毕
                            If A4Current = z Then A4exist = False
                        End If
                        '检查A4的第七个格子
                        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 _
                         And poList(6) = 0 Then
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 2
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 1
                            onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
                            poList(6) = 1
                            A4Current += 1
                            'A4不存在或者已被填充完毕
                            If A4Current = z Then A4exist = False
                        End If
                        '检查A4的第八个格子
                        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 _
                         And poList(6) = 1 And poList(7) = 0 Then
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosX = 3
                            swDrawCollecton.Item(checkA4(A4Current)).insertPosY = 1
                            onePaper.inNerPapers.Add(swDrawCollecton.Item(checkA4(A4Current)))
                            poList(7) = 1
                            A4Current += 1
                            'A4不存在或者已被填充完毕
                            If A4Current = z Then A4exist = False
                        End If
                    End If
                    '剩余图纸的数量减一
                    paperLeft -= 1
                    If paperLeft = 0 Then
                        Exit Do
                    End If
                Loop
                FinalPapers.Add(onePaper)
            Next
            onePaper = Nothing
          
        End Sub
    End Module

复制代码
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

6

主题

246

帖子

24

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
285
QQ
11#
发表于 2013-12-16 22:34:45 | 只看该作者
    Imports System.Drawing
    Imports System.Drawing.Graphics
    Module PictureRelated
        Sub joinPicture()
            '每一张大图
            Dim mm As Integer = 1
            For Each ds As ptPaper In FinalPapers
                '图片大小
                newBMape = New Bitmap(CInt(841 * intDPI / 25.4), CInt(594 * intDPI / 25.4))
                '设置分辨率
                newBMape.SetResolution(intDPI, intDPI)
                g1 = Graphics.FromImage(newBMape)
                g1.Clear(Color.White)
                For Each sdraw As SwDraw In ds.inNerPapers
                    myImage = Image.FromFile(sdraw.drawDir)
                   
                    If sdraw.PaperSize = &quot;A2&quot; Then
                        myImage.RotateFlip(RotateFlipType.Rotate90FlipNone)
                        '如果是A2,则宽高翻转,同时将图像进行90度翻转
                        theHeight = CInt(sdraw.drawWidth * intDPI / 25.4)
                        theWidth = CInt(sdraw.drawHeight * intDPI / 25.4)
                      
                    Else
                        theHeight = CInt(sdraw.drawHeight * intDPI / 25.4)
                        theWidth = CInt(sdraw.drawWidth * intDPI / 25.4)
                      
                    End If
                    If sdraw.PaperSize = &quot;A4&quot; Then
                        theX = CInt(sdraw.insertPosX * intDPI * 210 / 25.4)
                        theY = CInt(sdraw.insertPosY * intDPI * 297 / 25.4)
                    End If
                    If sdraw.PaperSize = &quot;A3&quot; Then
                        theX = CInt(sdraw.insertPosX * intDPI * 210 / 25.4)
                        theY = CInt(sdraw.insertPosY * intDPI * 297 / 25.4)
                    End If
                    If sdraw.PaperSize = &quot;A2&quot; Then
                        theX = CInt(sdraw.insertPosX * intDPI * 210 / 25.4)
                        theY = CInt(sdraw.insertPosY * intDPI * 297 / 25.4)
                    End If
                   
                    g1.DrawImage(myImage, theX, theY)
                    myImage.Dispose()
                Next
                If Form1.CBoxPaperSize.SelectedIndex = 1 Then
                    newBMape.RotateFlip(RotateFlipType.Rotate90FlipNone)
                End If
                If Form1.CBoxPrint.Checked = True Then
                    printThepaper()
                End If
                If Form1.CBoxPicSave.Checked = True Then
                    newBMape.Save(Application.StartupPath + &quot;outputimagexx&quot; + mm.ToString + &quot;.jpg&quot;, System.Drawing.Imaging.ImageFormat.Jpeg)
                End If
                mm += 1
                g1.Dispose()
                newBMape.Dispose()
            Next
            
        End Sub
    End Module

复制代码
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

7

主题

222

帖子

19

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
266
QQ
12#
发表于 2013-12-16 22:35:07 | 只看该作者
    Imports System.IO
    Imports System.Drawing.Printing
    Module printRelated
        Sub printThepaper()
            If Form1.CBoxPaperSize.SelectedIndex = 0 Then
                PgSize = New PaperSize(&quot;myA1&quot;, 3311, 2339)
               
            Else
                PgSize = New PaperSize(&quot;myA2&quot;, 2339, 3311)
             
            End If
            PTResolution = New PrinterResolution
            If Form1.RadioButtonHigh.Checked Then
                PTResolution.Kind = PrinterResolutionKind.High
            End If
            If Form1.RadioButtonFollowDpi.Checked Then
                PTResolution.Kind = PrinterResolutionKind.Custom
                PTResolution.X = intDPI
                PTResolution.Y = intDPI
            End If
            PT1.DefaultPageSettings.PaperSize = PgSize
            PT1.DefaultPageSettings.PrinterResolution = PTResolution
            PT1.Print()
        End Sub
    End Module

复制代码
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

8

主题

233

帖子

25

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
274
QQ
13#
发表于 2013-12-16 22:36:08 | 只看该作者
    Public Class ptPaper
       
        '每个图纸里的小图纸
        Public inNerPapers As swDrawsAll
    End Class

复制代码
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

18

主题

241

帖子

36

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
305
QQ
14#
发表于 2013-12-16 22:37:10 | 只看该作者
    Public Class ptPaperAll
        Inherits CollectionBase
        Public Sub Add(ByVal newPaper As ptPaper)
            Me.List.Add(newPaper)
        End Sub
        Public Sub Remove(ByVal oldPaper As ptPaper)
            Me.List.Remove(oldPaper)
        End Sub
        Default Public Property Item(ByVal index As Integer) As ptPaper
            Get
                Return CType(Me.List(index), ptPaper)
            End Get
            Set(value As ptPaper)
                Me.List.Item(index) = value
            End Set
        End Property
    End Class

复制代码
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

9

主题

227

帖子

31

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
277
QQ
15#
发表于 2013-12-16 22:37:54 | 只看该作者
加入QQ群
参与讨论和学习

SolidWorks技术交流群

或扫描二维码加入

    Public Class SwDraw
        Public drawDir As String   'directory of a drawing
        Public drawSheetName As String   'sheet of a drawing  工程图文件中的图纸1,图纸2,等等
        Public drawHeight As Single     '图纸的大小
        Public drawWidth As Single
        Public PaperSize As String
        Public mysheet As SldWorks.Sheet
        Public sheetCount As Integer
        Public paperNumber As Integer      '位于第几张图纸
        Public insertPosX As Integer        '在图纸中插入时的位置编号
        Public insertPosY As Integer        '在图纸中插入时的位置编号
    End Class

复制代码
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

11

主题

225

帖子

25

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
270
QQ
16#
发表于 2013-12-16 22:40:04 | 只看该作者

   经典案例图书
    Public Class swDrawsAll
        Inherits CollectionBase
        Public Sub Add(ByVal newDraw As SwDraw)
            Me.List.Add(newDraw)
        End Sub
        Public Sub Remove(ByVal oldDraw As SwDraw)
            Me.List.Remove(oldDraw)
        End Sub
        Default Public Property Item(ByVal index As Integer) As SwDraw
            Get
                Return CType(Me.List(index), SwDraw)
            End Get
            Set(value As SwDraw)
                Me.List.Item(index) = value
            End Set
        End Property
    End Class

复制代码
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

13

主题

196

帖子

33

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
243
QQ
17#
发表于 2013-12-16 22:40:36 | 只看该作者
加入QQ群
参与讨论和学习

SolidWorks技术交流群

或扫描二维码加入

    Imports SwConst
    Imports System.Drawing.Printing
    Imports SldWorks
    Imports System.IO
    Module swRelated
        Public Sub loadsw()
            ReDim SwFinalFiles(Form1.ListBox1.Items.Count - 1)
            '将列表装入数组
            For ix As Integer = 0 To SwFinalFiles.GetUpperBound(0)
                SwFinalFiles(ix) = Form1.ListBox1.Items(ix)
            Next
            If SwFinalFiles.Length <> 0 Then
                Form1.PSbar1.Maximum = SwFinalFiles.GetUpperBound(0)
                Form1.PSbar1.Minimum = 0
                swApp = New SldWorks.SldWorks
                If Form1.CboxShowSW.Checked = True Then
                    swApp.Visible = True
                Else : swApp.Visible = False
                End If
                MsgBox(&quot;即将开始,建议关闭所有程序以保证足够内存&quot;)
                Dim i As Integer
                For i = 0 To SwFinalFiles.GetUpperBound(0)
                    Try
                        Form1.PSbar1.Value = i
                        swMod = swApp.OpenDoc(SwFinalFiles(i), 3)
                        swDoc = swMod
                        '图片颜色变成黑白
                        boolstatus = swApp.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swTiffImageType, swTiffImageType_e.swTiffImageBlackAndWhite)
                        '图片分辨率设为选定值
                        boolstatus = swApp.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swTiffPrintDPI, intDPI)
                        '图片存放的目录全名
                        intSheetCount = swDoc.GetSheetCount   '文件中图纸数量
                        mysheet = swDoc.GetSheetNames     '图纸名称列表      
                        For j As Integer = 0 To intSheetCount - 1
                            '获取图纸的大小尺寸
                            tmpInt = swDoc.Sheet(mysheet(j).ToString).GetSize(stWidth, stHeight)
                            stWidth = stWidth * 1000
                            stHeight = stHeight * 1000
                            If stHeight = 594 Or stHeight = 841 Then
                                Form1.ListLargePapers.Items.Add(SwFinalFiles(i))
                                Exit For
                            End If
                            If stHeight = 210 Or stHeight = 297 Then
                                '选择了直接出图,并且选择的是A4和A3的图纸,
                                If Form1.CBoxEnable.Checked = True Then
                                    '选择打印机
                                    swMod.Printer = Form1.cbxPtA4.SelectedItem
                                    '设置页面参数
                                    Dim a As PageSetup
                                    a = swMod.PageSetup
                                    a.HighQuality = True
                                    a.ScaleToFit = True
                                    Dim tt As Boolean
                                    a.DrawingColor = swPageSetupDrawingColor_e.swPageSetup_BlackAndWhite
                                    a.PrinterPaperSize = PaperKind.A4
                                    tt = a.UsePageSetupOnSheets()
                                    If stWidth = 297 Or stWidth = 210 Then  'A4图纸
                                        swMod.PrintDirect()
                                    End If
                                    If stWidth = 420 Then  'A3图纸
                                        swMod.PrintOut(j + 1, j + 1, 1, False, swMod.Printer, 0.67, False)
                                    End If
                                Else
                                    '将图纸录入集合
                                    swSingleDraw = New SwDraw
                                    tmpSavefile = Application.StartupPath & &quot;OutputImage&quot; & i.ToString & _
                                 mysheet(j).ToString & &quot;.tif&quot;
                                    swMod.SaveAs(tmpSavefile)   '保存成jpg文件
                                    With swSingleDraw
                                        .drawDir = tmpSavefile
                                        .drawHeight = stHeight
                                        .drawWidth = stWidth
                                    End With
                                    If stWidth = 210 Then
                                        swSingleDraw.PaperSize = &quot;A4&quot;
                                    End If
                                    If stWidth = 420 Then
                                        swSingleDraw.PaperSize = &quot;A3&quot;
                                    End If
                                End If
                            End If
                            '如果是A2的尺寸,处理同上。
                            If stHeight = 420 Then
                                '将图纸录入集合
                                swSingleDraw = New SwDraw
                                tmpSavefile = Application.StartupPath & &quot;OutputImage&quot; & i.ToString & _
                            mysheet(j).ToString & &quot;.tif&quot;
                                swMod.SaveAs(tmpSavefile)   '保存成TIF文件
                                With swSingleDraw
                                    .drawDir = tmpSavefile
                                    .drawHeight = stHeight
                                    .drawWidth = stWidth
                                End With
                                If stWidth = 594 Then
                                    swSingleDraw.PaperSize = &quot;A2&quot;
                                End If
                            End If
                            '录入完毕,图纸尺寸全部放入到了对象swSingleDraw中
                            swDrawCollecton.Add(swSingleDraw)
                            swDoc.SheetNext()
                        Next
                        swApp.CloseDoc(SwFinalFiles(i))
                        swDoc = Nothing
                        swMod = Nothing
                    Catch ex As Exception
                    End Try
                Next
                
                getA2s()
                fillPaper()
                joinPicture()
                MsgBox(&quot;successed!&quot;)
            Else : MsgBox(&quot;list not exist&quot;)
            End If
        End Sub
    End Module

复制代码
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

4

主题

230

帖子

16

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
262
QQ
18#
发表于 2013-12-16 22:41:36 | 只看该作者

   经典案例图书
各个控件的名称。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

11

主题

232

帖子

21

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
253
19#
发表于 2013-12-16 22:43:33 | 只看该作者
最好版主研究下能解决A3 A4自动识别图幅自动打印成需要的图幅的问题那就完美了
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

3

主题

100

帖子

138

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
480

最佳新人活跃会员热心会员宣传达人

20#
发表于 2017-8-25 11:49:06 | 只看该作者
楼主太有才了,膜拜中……
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭 卷起
关闭 卷起

手机版|小黑屋| GMT+8, 2024-4-30 01:39 , Processed in 0.332124 second(s), 41 queries .

SolidWorks机械工程师网 ( 鲁ICP备14025122号-2 ) 鲁公网安备 37028502190335号

声明:本网言论纯属发表者个人意见,与本网立场无关。
如涉版权,可发邮件: admin@swbbsc.com

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