明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3552|回复: 9

CAD快速打印(批量打印)PDF/DWF/JPG/PNG-特色:自适应图纸尺寸

  [复制链接]
发表于 2020-11-1 21:32:16 | 显示全部楼层 |阅读模式
本帖最后由 tieque 于 2020-12-7 19:58 编辑

CAD快速打印(批量打印)PDF/DWF/JPG/PNG-特色:自适应图纸尺寸、纯命令操作

2020.12.7 日更新:增加对CAD2019、CAD2017、CAD2015;
2020.12.5 日更新:增加对CAD2021、CAD2018、CAD2016、CAD2014的支持;
2020.11.24 日更新:1.修复若干问题。2.增加批量打印布局的功能

1.    支持CAD2021、CAD2020、CAD2019、CAD2018、CAD2017、CAD2016、CAD2015、CAD2014;

2.    命令栏输入 qq 启动打印程序;

3.    支持动态块图框、“TK”图层图框、柱状图图框、任意实体组成的范围;

4.    多段线组成的图框:图框位于tk,TK,Tk,tK,图框,DZ图框,*图框*等图层上,多段线顶点数量为4且闭合;

5.    支持批量打印地质柱状图,请先炸开柱状图头部,再进行打印(可使用“zzt”命令可将柱状图从左到右,从上到下排序,每行10个柱状图);

6.    支持任意尺寸的图纸

7.    同一个DWG文件中可批量打印或者单独打印:a.批量打印需提前设置好图框; b.打印单幅不需要设置图框,框选所要打印内容即可;

8.    可打印PDF、DWF、 JPG 、PNG、 TIFF,打印机各项设置可根据提示进行操作,程序能记忆上一次的设置参数;

9.    打印完成的文件与DWG文件放在同一个文件夹内。对于未保存的DWG,与“xllTriangle_ARX.arx”文件放在一处;

10.    目前处于测试阶段,如有问题请反馈至925674203@qq.com、QQ群:1148455637

感谢诸多技术大神给与的支持!





  1. 以下为部分代码:

  2. static void QuickPlot_ARX_QQ()
  3.   {  
  4.     acutPrintf(_T("\n  功能:QQ-快速打印等.\n"));
  5.     acutPrintf(_T("\n  感谢诸多技术大神给与的支持!\n"));
  6.     acutPrintf(_T("\n  作者:徐二亮,如有问题请反馈至925674203@qq.com、QQ群:1148455637.\n"));   

  7.     //获得当前dwg文件所在路径
  8.     CString dwgfullpath, dwgfilename;
  9.     GetcurDocumentfilePathName(dwgfullpath, dwgfilename);

  10.     //获取选择集的包围盒
  11.     long length;
  12.     ads_name ss0;

  13.     //获得当前图形窗口中已经选择的实体(PickFirst 选择集)
  14.     if (RTNORM == acedSSGet(_T("I"), NULL, NULL, NULL, ss0))
  15.     {  
  16.       if (RTNORM != acedSSLength(ss0, (Adesk::Int32*)&length)) return;      
  17.     }
  18.     else
  19.     {
  20.       TCHAR *promptStr[2];
  21.       promptStr[0] = _T("请选择打印范围:");
  22.       promptStr[1] = _T("");
  23.       if (RTNORM != acedSSGet(_T(""), promptStr, NULL, NULL, ss0))
  24.       {
  25.         acutPrintf(_T("\n神马都没有选中...,已退出。"));
  26.         return;
  27.       }
  28.       if (RTNORM != acedSSLength(ss0, (Adesk::Int32*)&length)) return;
  29.       
  30.       acedSSSetFirst(ss0, NULL);//亮显对象
  31.     }
  32.     //acutPrintf(_T("\n已选择实体数量: %d"), length);   

  33.     //打印参数
  34.     int nPX = 1;
  35.     int plotDeviceName = 0;//打印机名称
  36.     PlotRotation rotationType = AcDbPlotSettings::k0degrees;//旋转方向
  37.     ACHAR * styleSheetName = _T("monochrome.ctb");//样式表
  38.     REAL scale = 1.0;//打印比例
  39.     //设置打印参数
  40.     if (PlotSettings(plotDeviceName, rotationType, styleSheetName, scale) == 0) return;   

  41.     //开始计时
  42.     clock_t start(clock()), end;
  43.     start = clock();

  44.     AcDbObjectId objId;
  45.     AcDbExtents extent;
  46.     AcDbExtents extentsel;//选择集的包围盒,选择用
  47.     for (int i = 0; i < length; i++)
  48.     {
  49.       ads_name ent;
  50.       acedSSName(ss0, i, ent);
  51.       acdbGetObjectId(objId, ent);//获得指定元素的ObjectId

  52.       AcDbEntity *pEnt = NULL;
  53.       if (acdbOpenObject(pEnt, objId, AcDb::kForRead) == Acad::eOk)
  54.       {
  55.         pEnt->getGeomExtents(extent);
  56.         extentsel.addExt(extent);
  57.       }
  58.       pEnt->close();
  59.     }
  60.     acedSSFree(ss0); // 删除选择集

  61.     AcGePoint3d ptmin, ptmax;
  62.     ptmin = extentsel.minPoint();
  63.     ptmax = extentsel.maxPoint();

  64.     ads_point adsptmin, adsptmax;
  65.     adsptmin[X] = ptmin.x - 0.1;
  66.     adsptmin[Y] = ptmin.y - 0.1;
  67.     adsptmax[X] = ptmax.x + 0.1;
  68.     adsptmax[Y] = ptmax.y + 0.1;

  69.     //acutPrintf(_T("\n选择集范围: "));
  70.     //acutPrintf(_T("\nminx: %f"), ptmin.x);
  71.     //acutPrintf(_T("\tminy: %f"), ptmin.y);
  72.     //acutPrintf(_T("\nmaxx: %f"), ptmax.x);
  73.     //acutPrintf(_T("\tmaxy: %f"), ptmax.y);

  74.     vector<CString> pdfname;//存储文件名称
  75.     vector<AcDbExtents> extentvec;//存储图框范围
  76.     vector<AcDbExtents> extentvecsort;
  77.     vector<AcDbExtents> extentvectmp;

  78.     //选择柱状图
  79.     long lengthZZT = 1;
  80.     lengthZZT = SelectZZT(adsptmin, adsptmax, extentvec, pdfname);
  81.   
  82.     //选择动态块图框
  83.     long lengthDTK = 1;
  84.     lengthDTK = SelectDynamicBlockTK(adsptmin, adsptmax, extentvecsort, extentvectmp);   
  85.    
  86.     //选择图层"tk"上的闭合多段线
  87.     long lengthYTK = 1;
  88.     lengthYTK= SelectLayerTKPolyLineTK(adsptmin, adsptmax, extentvecsort, extentvectmp);
  89.    
  90.     //去除重复图框、大图框里的小图框
  91.     long lengthDTKYKR = 0;   
  92.     if (lengthDTK + lengthYTK > 0)//判断“回”形图框情况:删除大图框里的小图框,只保留最大的图框
  93.     {
  94.       lengthDTKYKR = RemoveOverLayandsmallInBigTK(extentvecsort, extentvectmp, extentvec, pdfname);
  95.     }
  96.     extentvecsort.clear();
  97.     extentvecsort.shrink_to_fit();
  98.     extentvectmp.clear();
  99.     extentvectmp.shrink_to_fit();

  100.     //如果没有上述任何一种情况,则按照选择集范围打印
  101.     if (extentvec.size() == 0)
  102.     {
  103.       extentvec.push_back(extentsel);
  104.       pdfname.push_back("");

  105.       acutPrintf(_T("\n未识别到任何图框,正在使用选择集范围进行打印!"));
  106.     }
  107.     acutPrintf(_T("\n识别柱状图  %d 个,动态块图框+多段线图框 %d 个,共 %d 个。"), lengthZZT, lengthDTKYKR, extentvec.size());

  108.     //设置打印纸张   
  109.     vector<string> vecMediaName;//存储所有纸张
  110.     vector<AcDbExtents>extentPiaNode;//存储所有需要加入PMP的打印范围

  111.     //优先使用系统纸张,以加快打印速度
  112.     //确定打印所需的系统内置纸张
  113.     //确定需要向PMP添加的纸张及其数量
  114.     GetcanonicalMediaNames(plotDeviceName ,extentvec, vecMediaName, extentPiaNode);

  115.     //用自定义纸张替换上一步中名称为-1的纸张
  116.     string spixelormm = "_毫米)";
  117.     string sudmMetricRaster = "UserDefinedMetric_(";

  118.     //TIFF Version 6 (不压缩).pc3、PublishToWeb JPG.pc3、PublishToWeb PNG.pc3
  119.     PlotPaperUnits units = AcDbPlotSettings::kMillimeters;
  120.     if (plotDeviceName == 2 || plotDeviceName == 3 || plotDeviceName == 4)
  121.     {
  122.       spixelormm = "_像素)";//像素
  123.       sudmMetricRaster = "UserDefinedRaster_(";
  124.       units = AcDbPlotSettings::kPixels;
  125.       nPX = 30;
  126.     }

  127.     for (int i = 0; i < extentvec.size(); i++)
  128.     {
  129.       if (vecMediaName != "-1") continue;

  130.       extent = extentvec;
  131.       ptmin = extent.minPoint();
  132.       ptmax = extent.maxPoint();

  133.       int PaperX = (int)(ptmax.x - ptmin.x)*nPX;
  134.       int PaperY = (int)(ptmax.y - ptmin.y)*nPX;

  135.       string sPaperX = to_string(PaperX) + ".00";
  136.       string sPaperY = to_string(PaperY) + ".00";

  137.       vecMediaName= sudmMetricRaster + sPaperX + "_x_" + sPaperY + spixelormm;
  138.     }
  139.    
  140.     //根据PC3文件生成PMP文件,将自定义图纸vecPiaNode加入其中
  141.     //将pc3文件中user_defined_model_pathname修改为新PMP的路径
  142.     if (readPC3andCreatePMP(extentPiaNode, plotDeviceName, nPX) == "err")
  143.     {
  144.       acutPrintf(_T("readPC3andCreatePMP() err!\n"));
  145.       return;
  146.     }


  147.     //每当通过 plot API 访问绘图引擎时,如果将 BACKGROUNDPLOT 系统变量设置为0,则系统将在前台进行绘制;
  148.     //如果将 BACKGROUNDPLOT 系统变量设置为1,2或3,则系统将在后台进行绘制。
  149.     //acedSetEnv(L"BACKGROUNDPLOT", L"0");
  150.     acutPrintf(_T("\n"));
  151.     acedCommandS(RTSTR, L"BACKGROUNDPLOT", RTSTR, L"0", RTNONE);
  152.     acutPrintf(_T("\n"));
  153.   
  154.     //设置当前图形的图形单位(英制或公制),0为英制,1为公制
  155.     //acedSetEnv(L"MEASUREMENT", L"1");
  156.     acutPrintf(_T("\n"));
  157.     acedCommandS(RTSTR, L"MEASUREMENT", RTSTR, L"1", RTNONE);
  158.     acutPrintf(_T("\n"));
  159.    
  160.     ACHAR* sDevice;
  161.     CString CSext = ".pdf";

  162.     if (plotDeviceName == 0) {
  163.       sDevice = _T("DWG To PDF.pc3");
  164.       CSext = ".pdf";
  165.     }
  166.     if (plotDeviceName == 1){
  167.       CSext = ".dwf";
  168.       sDevice = _T("DWF6 ePlot.pc3");
  169.     }  
  170.     if (plotDeviceName == 2){
  171.       CSext = "";
  172.       sDevice = _T("TIFF Version 6 (不压缩).pc3");
  173.     }
  174.     if (plotDeviceName == 3){
  175.       CSext = "";
  176.       sDevice = _T("ublishToWeb JPG.pc3");
  177.     }
  178.     if (plotDeviceName == 4){
  179.       CSext = "";
  180.       sDevice = _T("ublishToWeb PNG.pc3");
  181.     }

  182.     //打印        
  183.     acedSetStatusBarProgressMeter(TEXT("正在打印..:"), 0, (int)extentvec.size() - 1);//进度条
  184.     for (int i = 0; i < extentvec.size(); i++)
  185.     {
  186.       //按esc,停止打印
  187.       if (acedUsrBrk())  break;

  188.       CString snum;
  189.       snum.Format(_T("%d"), i+1);

  190.       CString fullpathPDFname = dwgfullpath+"_"+ snum + pdfname + CSext;

  191.       extent = extentvec;
  192.       ptmin = extent.minPoint();
  193.       ptmax = extent.maxPoint();

  194.       REAL paperWidth = ptmax.x - ptmin.x;
  195.       REAL paperHeight = ptmax.y - ptmin.y;
  196.       
  197.       ACHAR * MediaName;
  198.       CConvertUtil::StringToWchar_t(MediaName, vecMediaName);

  199.       Acad::ErrorStatus es = PlottoFile(sDevice, MediaName, rotationType, styleSheetName,
  200.         scale, units, ptmin, ptmax, fullpathPDFname);

  201.       if (es != Acad::eOk)
  202.       {  
  203.         continue;
  204.       }

  205.       acutPrintf(_T("\n已完成打印:%s\n"), fullpathPDFname);

  206.       // 控制进度条当前进度位置   
  207.       acedSetStatusBarProgressMeterPos(i);
  208.     }   
  209.     acedRestoreStatusBar();// 还原状态栏之前的样子

  210.     extentvec.clear();
  211.     extentvec.shrink_to_fit();

  212.     pdfname.clear();
  213.     pdfname.shrink_to_fit();
  214.     vecMediaName.clear();
  215.     vecMediaName.shrink_to_fit();
  216.     extentPiaNode.clear();
  217.     extentPiaNode.shrink_to_fit();

  218.     //结束计时
  219.     end = clock();
  220.     acutPrintf(_T("\n打印时间:%.5f"), (((REAL)(end - start)) / CLOCKS_PER_SEC));

  221.     acutPrintf(_T("\n  作者:徐二亮,如有问题请反馈至925674203@qq.com、QQ群:1148455637.\n"));
  222.   }


  223. 其他功能如下:

  224. //三角剖分+插值
  225. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, Triangle_ARX, _tri, tri, ACRX_CMD_MODAL, NULL)

  226. //观测点、地层产状及节理产状上图
  227. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, InsertBlk_ARX, _DZ, DZ, ACRX_CMD_MODAL, NULL)

  228. //钻探孔及静探孔上图
  229. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, InsertBlk_ARX, _ZT, ZT, ACRX_CMD_MODAL, NULL)

  230. //危岩点上图
  231. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, InsertBlk_ARX, _WY, WY, ACRX_CMD_MODAL, NULL)

  232. //打开观测点图片
  233. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, CheckGCD_ARX, _CG, CG, ACRX_CMD_MODAL, NULL)

  234. //打开危岩落石图片
  235. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, CheckGCD_ARX, _CW, CW, ACRX_CMD_MODAL, NULL)

  236. //在布局视图中旋转地质块,使之与布局扭转角度一致
  237. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, RotateBlock_ARX, _RB, RB, ACRX_CMD_MODAL, NULL)

  238. //根据路基断面里程,在平面图中绘制垂直线路的断面线
  239. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, Drawverticalline_ARX, _DVL, DVL, ACRX_CMD_MODAL, NULL)

  240. //根据路基横断面里程,在纵断上卡出横断面位置
  241. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, Drawverticalline_ARX, _DVH, DVH, ACRX_CMD_MODAL, NULL)

  242. //获取钻孔的里程及偏距
  243. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, GetMileageOffset_ARX, _MO, MOB, ACRX_CMD_MODAL, NULL)


  244. //重新排列地质柱状图
  245. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, ReRrrangeZZT_ARX, _RRZZT, RRZZT, ACRX_CMD_USEPICKSET | ACRX_CMD_REDRAW | ACRX_CMD_MODAL, NULL)

  246. //获取地质柱状图信息
  247. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, GetZZTInformation_ARX, _ZZTI, ZZTI, ACRX_CMD_MODAL, NULL)

  248. //清理线位:只保留里程、刻度线及中线
  249. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, ClearTherailway_ARX, _CLRW, CLRW, ACRX_CMD_MODAL, NULL)

  250. //快速打印
  251. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, QuickPlot_ARX, _QQ, QQ, ACRX_CMD_USEPICKSET | ACRX_CMD_REDRAW | ACRX_CMD_MODAL, NULL)

  252. //快速打印:解压与压缩测试 zlib
  253. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, QuickPlot_zlib_ARX, _zlib, zlib, ACRX_CMD_MODAL, NULL)

  254. //根据地形图及剖面线提取剖面
  255. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, GetSingleComlexPouMian_ARX, _PM, PM, ACRX_CMD_MODAL, NULL)

  256. //线路折图  
  257. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, GetFoldedDrawings_ARX, _FD, FD, ACRX_CMD_MODAL, NULL)

  258. //根据路基段落里程,筛选出范围内中桩高程及轨面高程
  259. ACED_ARXCOMMAND_ENTRY_AUTO(CTriangle_ARXApp, DivideHeight_ARX, _DH, DH, ACRX_CMD_MODAL, NULL)




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 金钱 +6 收起 理由
shenlongzi + 1 + 6 很给力!

查看全部评分

本帖被以下淘专辑推荐:

发表于 2020-11-2 17:16:58 | 显示全部楼层

,可以和MSTEEL批量打印对比一下
回复 支持 1 反对 0

使用道具 举报

发表于 2020-11-2 12:36:31 | 显示全部楼层
,可以和MSTEEL批量打印对比一下
发表于 2020-11-6 22:19:19 | 显示全部楼层
感谢,先收藏,过几天闲了测试
发表于 2020-11-18 14:31:43 | 显示全部楼层
本帖最后由 KMCM_JET 于 2020-11-18 14:49 编辑

测试一下,谢谢分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2020-11-18 15:48:53 | 显示全部楼层
KMCM_JET 发表于 2020-11-18 14:31
测试一下,谢谢分享

..... 一直是致命错误?  
 楼主| 发表于 2020-11-18 15:50:51 | 显示全部楼层
有问题请加群反馈啊 QQ群:1148455637
发表于 2020-11-20 14:11:30 | 显示全部楼层
tieque 发表于 2020-11-18 15:48
..... 一直是致命错误?

除了你的测试例子外,都是致命错误,不知是我用天正打开的过还是其他操作不当
 楼主| 发表于 2020-11-21 11:50:18 | 显示全部楼层
KMCM_JET 发表于 2020-11-20 14:11
除了你的测试例子外,都是致命错误,不知是我用天正打开的过还是其他操作不当

发我一个看看吧 925674203@qq.com
发表于 2021-3-8 11:34:51 | 显示全部楼层
希望支持  PdfFactory  虚拟打印机
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 19:24 , Processed in 0.221349 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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