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. MyBatis框架之注解开发

    MyBatis注解开发 @Insert注解注解属性value:写入SQL语句 @Options注解实现添加新数据的主键封装注解属性useGeneratedKeys:使用生成的主键,配置为truekey ...

  2. python 根据字符串语句进行操作再造函数(evec和eval方法)

    例: #coding:utf-8 ''' Created on 2017年9月9日 @author: Bss ''' test_list=['def','a',''] test_list1=['pri ...

  3. dt框架自定义url规则

    destoon的列表的地址规则是定义在/api/url.inc.php,然后又是在include/global.func.php中进行的listpages这个函数调用实现 if($page < ...

  4. zabbix-agent主动模式和proxy

    一.zabbix代理模式,缓解服务端压力zabbix_proxy.conf配置如下 more zabbix_proxy.conf | grep -v ^# | grep -v ^$ Server=za ...

  5. 【Selenium-WebDriver实战篇】ScreenRecorder的实际输出路径设置(转)

    参考:https://www.cnblogs.com/yongfeiuall/p/4134139.html 我们可以用以下方式在Selenium Webdriver中capture video. 基本 ...

  6. 洛谷 P2858 [USACO06FEB]奶牛零食Treats for the Cows 题解

    P2858 [USACO06FEB]奶牛零食Treats for the Cows 题目描述 FJ has purchased N (1 <= N <= 2000) yummy treat ...

  7. 守护进程daemon.c

    它的特点是:•不占用控制终端(后台运行)•独立于控制终端•周期性运行 #include<stdio.h>#include<unistd.h>#include<fcntl. ...

  8. nodejs+nvm历史版本

    官网:http://nodejs.org/dist/ 淘宝镜像:https://npm.taobao.org/mirrors/node/ nvm历史版本:https://github.com/core ...

  9. Web前端开发工具和环境清单

    初级 浏览器 Google Chrome 75.0.3770.100www.google.cn/intl/zh-CN/chrome初级 移动端模拟器 Genymotion 6.0.6www.genym ...

  10. pycharm无法识别自己的文件夹的程序

    网上找教程折腾了半天也没解决,然后我换了一下文件夹名称…… 文件夹名称不能用数字开头,否则识别不出来.