AutoCAD 2010版本开始新增了一个发布图纸的功能,可以后台打印图纸,以下是ADN官方博客例子浅析

原文地址 https://adndevblog.typepad.com/autocad/2016/01/create-multi-sheet-pdf-from-arx-using-dsd.html 

先加入相关的头文件和库文件

//添加头文件和库CAD2010及其以上新增
#if _MSC_VER == 1500
#include "acplmisc.h"
#pragma comment(lib,"AcPublish.lib")
#else if _MSC_VER > 1500
#include "acplmisc.h"
#pragma comment(lib,"AcPublish_crx.lib")
#endif

函数主体

//数据可以是后台数据库,但是一定是保存了的数据库,不能是临时数据库
static void plot (AcDbDatabase *pDb)
{
//设置pdf保存路径
CString pdfPath = _T("d:\\myPDF.pdf");
//设置打印机设备名
CString deviceName = _T("DWG To PDF.pc3");
Acad::ErrorStatus es = Acad::eOk; const TCHAR *docName;
//获取数据的路径和文件名,注意pdb如果是当前文件,
//一定要保存后再打印,否者这个路径可能是临时文件
//pDb即使的后台数据库依然能打印
es = pDb->getFilename(docName); //获取ACAD应用程序布局管理器
AcDbLayoutManager *layoutManager = acdbHostApplicationServices()->layoutManager();
AcDbDictionary *layoutDict = NULL;
//获取数据库的布局词典
es = pDb->getLayoutDictionary(layoutDict, AcDb::kForRead); //开始收集DSD数据的信息
// Start collecting info for the DSD data
AcPlDSDEntries dsdEntries; //迭代器遍历布局词典
AcDbDictionaryIterator *layoutIterator = layoutDict->newIterator(); //如果我们只想打印图纸空间而不是模型布局,获取pDb模型空间的ID
// If we only want to plot paper spaces and not the model layout
AcDbObjectId msId = acdbSymUtil()->blockModelSpaceId(pDb); for (; layoutIterator && !layoutIterator->done(); layoutIterator->next())
{
AcDbObjectPointer<AcDbLayout> layout(layoutIterator->objectId(), AcDb::kForRead);
//跳过模型空间
if (layout->getBlockTableRecordId() == msId)
continue; //!!!注意,布局的打印设置要提前设置好,如纸张,打印线型,等
//布局使用的是保存的布局的页面设置,也可以设置窗口打印和区域等
//此处是读模式,是不能修改layout设置
const ACHAR *layoutName;
layout->getLayoutName(layoutName);
//测试,修改输出的标题名加前缀,pdf单页模式会作为文件名
CString strPre=_T("sk_");
strPre+= layoutName ;
const ACHAR *szOutLayoutName = (LPCTSTR)strPre;
//设置DSD条目
AcPlDSDEntry dsdEntry; dsdEntry.setLayout(layoutName);
dsdEntry.setDwgName(docName);
//测试 此处修改dsdEntry.setTitle(layoutName);
//条目标题,单页pdf会使用这个名字来保存文件名
//并且条目的标题如果相同,原有的条目可能会被覆盖
dsdEntry.setTitle(szOutLayoutName);
//添加条目到dsd条目集合
dsdEntries.append(dsdEntry);
}
//删除(释放)布局遍历迭代器
delete layoutIterator;
layoutDict->close(); //将dsd条目添加到dsd数据
AcPlDSDData dsdData;
dsdData.setDSDEntries(dsdEntries); //设置dsd数据项目路径
dsdData.setProjectPath(_T("d:\\"));
//设置dsd数据的日志路径,pdf打印机可能无效,没有生成日志
dsdData.setLogFilePath(_T("d:\\logdwf.log")); //设置单页还是多页,如果是单页,将会使用布局名来保存文件名
//kSinglePDF kMultiPDF
dsdData.setSheetType(AcPlDSDEntry::kMultiPDF);
//设置打印的份数,这个pdf打印机不能设置,始终是1
dsdData.setNoOfCopies(1);
//设置目标名,保存的文件名(单页无效)
dsdData.setDestinationName(pdfPath);
//设置提示输入dwf名,如果为true可能会提示输入文件名
dsdData.setPromptForDwfName(false);
//设置图纸集的名字,这个会显示在打印和发布详细信息中
dsdData.setSheetSetName(_T("PublisherSet")); //设置当前配置和打印设备名
AcPlPlotConfig *plotConfig;
acplPlotConfigManager->setCurrentConfig(plotConfig, deviceName); //后面的acplPublishExecute需要加载AcPublish.arx
// We need this for acplPublishExecute
acedArxLoad(_T("AcPublish.arx")); //可能需要#include "acplmisc.h"
//可能需要2010-2012#pragma comment(lib,"AcPublish.lib")
//可能需要2013及其以上#pragma comment(lib,"AcPublish_crx.lib")
//执行发布程序
acplPublishExecute(dsdData, plotConfig, false);
}

  测试代码

        //如果使用当前数据库,一定要保存文件否则会出错,
//当前数据库有自动保存操作,即使不操作,如果不保存,也会出错。
//plot(acdbHostApplicationServices()->workingDatabase());
AcDbDatabase *pDb=new AcDbDatabase();
pDb->readDwgFile(_T("D:\\TestPublish.dwg"));
plot(pDb);
if (pDb!=NULL)
{
delete pDb;
pDb=NULL;
}

objectARX2010及其以上版本使用publish打印(发布)图纸,后台布局打印图纸例子浅析的更多相关文章

  1. 译: 3. RabbitMQ Spring AMQP 之 Publish/Subscribe 发布和订阅

    在第一篇教程中,我们展示了如何使用start.spring.io来利用Spring Initializr创建一个具有RabbitMQ starter dependency的项目来创建spring-am ...

  2. php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用

    一.场景介绍 最近的一个项目需要用到发布/订阅的信息系统,以做到最新实时消息的通知.经查找后发现了redis pub/sub(发布/订阅的信息系统)可以满足我的开发需求,而且学习成本和使用成本也比较低 ...

  3. 各个 C# 版本的主要特性、发布日期和发布方式(C# 1.0 - 7.3)

    原文 各个 C# 版本的主要特性.发布日期和发布方式(C# 1.0 - 7.3) 本文收集各个 C# 版本的主要特性.发布日期和发布方式. C# 8.0 尚在预览版本 C# 7.3 2018 年 5 ...

  4. 阿里巴巴开源 Dragonwell JDK 最新版本 8.1.1-GA 发布

    导读:新版本主要有三大变化:同步了 OpenJDK 上游社区 jdk8u222-ga 的最新更新:带来了正式的 feature:G1ElasticHeap:发布了用户期待的 Windows 实验版本 ...

  5. 【原创】我所理解的自动更新-APP发布与后台发布

    发布后台 创建渠道:添加新的渠道,设置渠道名称,自动生成渠道id.    查看渠道:查看渠道基本信息,渠道app版本号,资源版本号,是否开启更新.    创建/更新APP:选择打包ios,androi ...

  6. Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子

    Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子         一个同事的台式机,BIOS启动,500GB硬盘,分了四个MBR分区,C盘是激活的主分区,第二个分区50 ...

  7. iOS release版本去除NSLog打印信息

    因为NSLog的输出还是比较消耗系统资源的,而且输出的数据也可能会暴露出App里的保密数据,所以发布正式版时需要把这些输出全部屏蔽掉. 我们可以在发布版本前先把所有NSLog语句注释掉,等以后要调试时 ...

  8. .net的mvc的fw版本为4.5发布到阿里云【云虚拟主机】上.

    注意:云虚拟主机和云服务器(ECS)不是同一个产品,请注意分别. 云服务器ECS: 云虚拟主机: 我用的是云虚拟主机也是第二个,版本是window server  声明:默认,已经把域名[已备案]绑定 ...

  9. 解决php -v查看到版本于phpinfo()打印的版本不一致问题

    https://blog.csdn.net/haif_city/article/details/81315372 整个事件的起因是这样的 通过git拉取laraevl项目发现缺少.env文件,打算使用 ...

随机推荐

  1. PHP CGI 进程占用CPU过高导致CPU使用达到100%的另类原因

    由于使用的华为云的CDN加速,结果发现我的阿里云服务器突然卡顿,网页打开极慢.登陆华为云CDN管理后台发现最高带宽占用30M,流量短时间内达到10GB以上,这么大的流量我的服务器肯定扛不住啊.于是还跟 ...

  2. 深度学习Keras框架笔记之AutoEncoder类

    深度学习Keras框架笔记之AutoEncoder类使用笔记 keras.layers.core.AutoEncoder(encoder, decoder,output_reconstruction= ...

  3. sql null+字符=null

    哦,谢谢你,我还想问一个declare @temp varchar(10),@identity varchar(10),@sura varchar(10),@p int,@len int,@nod1  ...

  4. CF938G Shortest Path Queries 和 CF576E Painting Edges

    这两道都用到了线段树分治和按秩合并可撤销并查集. Shortest Path Queries 给出一个连通带权无向图,边有边权,要求支持 q 个操作: x y d 在原图中加入一条 x 到 y 权值为 ...

  5. Spring源码窥探之:注解方式的AOP原理

    AOP入口代码分析 通过注解的方式来实现AOP1. @EnableAspectJAutoProxy通过@Import注解向容器中注入了AspectJAutoProxyRegistrar这个类,而它在容 ...

  6. GSM/GPRS模块 AT指令集C语言编程——基于有方M660+和MSP430单片机

    GSM/GPRS芯片是手机中负责收发短信.拨打电话以及访问GPRS网络的核心器件.有方M660+为深圳有方公司生产的一款超小封装的GSM/GPRS工业无线模块,可以提供高品质的语音.短信.数据业务等功 ...

  7. HDU 2887 Watering Hole(MST + 倍增LCA)

    传送门 总算是做上一道LCA的应用题了... 题意:有$n$个牧场, $m$根管道分别连接编号为$u,v$的牧场花费$p_{i}$,在第$i$个牧场挖口井需要花费$w_{i}$,有$P$根管道直接连通 ...

  8. Python 3.6 抓取微博m站数据

    Python 3.6 抓取微博m站数据 2019.05.01 更新内容 containerid 可以通过 "107603" + user_id 组装得到,无需请求个人信息获取: 优 ...

  9. Xamarin.Forms 入门

    介绍 Xamarin.Forms是一个开源UI框架,Xamarin.Forms允许开发人员从单个共享代码库构建Android,iOS和Windows应用程序. Xamarin.Forms允许开发人员使 ...

  10. codevs 2780 ZZWYYQWZHZ

    2780 ZZWYYQWZHZ  时间限制: 1 s  空间限制: 32000 KB  题目等级: 青铜 Bronze       题目描述 Description 可爱的小管在玩吹泡泡.忽然,他想到 ...