找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 522|回复: 1

[求助] 求助!ARX2020打印问题

[复制链接]
发表于 2020-2-28 11:04:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
static void test(void)
        {
                //////////////////////////////////////////////////////////////////////////
                //批量打印
            // 取得当前布局layoutId
                AcDbLayoutManager *pLayoutManager = acdbHostApplicationServices()->layoutManager(); //取得布局管理器对象
                AcDbObjectId m_layoutId = pLayoutManager->findLayoutNamed(pLayoutManager->findActiveLayout(TRUE), NULL);////获得布局的Id
                //打开布局
                AcDbObjectPointer<AcDbLayout> pLayout(m_layoutId, AcDb::kForRead);
                //获得打印机验证器对象
                AcDbPlotSettingsValidator *pPSV = acdbHostApplicationServices()->plotSettingsValidator();
                //更新打印设备列表
                AcDbPlotSettings* pPlotSet = new AcDbPlotSettings;
                pPSV->refreshLists(pPlotSet);
                //delete pPlotSet;
                //打印机设置
                ACHAR* m_strDevice = _T("pdfFactory Pro");//打印机名字
                pPSV->setPlotCfgName(pLayout, m_strDevice);//设置打印设备
                ACHAR* m_mediaName = _T("ISO A4");//图纸名称
                pPSV->setCanonicalMediaName(pLayout, m_mediaName);//设置图纸尺寸
                pPSV->setPlotType(pLayout, AcDbPlotSettings::kWindow);//设置打印范围为窗口
                pPSV->setPlotWindowArea(pLayout, 0, 0, 210, 297);//设置打印范围,超出给范围的将打不出来
               

                pPSV->setCurrentStyleSheet(pLayout, _T("acad.ctb"));//设置打印样式表
                pPSV->setPlotCentered(pLayout, true);//是否居中打印
                pPSV->setUseStandardScale(pLayout, true);//设置是否采用标准比例
                pPSV->setStdScaleType(pLayout, AcDbPlotSettings::kScaleToFit);//布满图纸               
                pPSV->setPlotRotation(pLayout, AcDbPlotSettings::k90degrees);//设置打印方向


                //pPSV->setPlotViewName(pLayout, _T("打印1"));

                //准备打印/////////////////////////////////////////////////////////////////////////
                AcPlPlotEngine* pEngine = NULL;//创建打印引擎
                if (AcPlPlotFactory::createPublishEngine(pEngine) != Acad::eOk)
                {
                        acedAlert(_T("打印失败!"));
                        return;
                }
                Acad::ErrorStatus es;
                // 打印进度对话框
                AcPlPlotProgressDialog *pPlotProgDlg = acplCreatePlotProgressDialog(acedGetAcadFrame()->m_hWnd, false, 1);
                pPlotProgDlg->setPlotMsgString(AcPlPlotProgressDialog::kDialogTitle, _T("lot API Progress"));
                pPlotProgDlg->setPlotMsgString(AcPlPlotProgressDialog::kCancelJobBtnMsg, _T("Cancel Job"));
                pPlotProgDlg->setPlotMsgString(AcPlPlotProgressDialog::kCancelSheetBtnMsg, _T("Cancel Sheet"));
                pPlotProgDlg->setPlotMsgString(AcPlPlotProgressDialog::kSheetSetProgressCaption, _T("Job Progress"));
                pPlotProgDlg->setPlotMsgString(AcPlPlotProgressDialog::kSheetProgressCaption, _T("Sheet Progress"));
                pPlotProgDlg->setPlotProgressRange(0, 100);
                pPlotProgDlg->onBeginPlot();
                pPlotProgDlg->setIsVisible(true);
                //begin plot
                es = pEngine->beginPlot(pPlotProgDlg);
                AcPlPlotPageInfo pageInfo;//打印页信息
                AcPlPlotInfo plotInfo; //打印信息
                // 设置布局
                plotInfo.setLayout(m_layoutId);
                // 重置参数
                plotInfo.setOverrideSettings(pLayout);
                AcPlPlotInfoValidator validator;//创建打印信息验证器
                validator.setMediaMatchingPolicy(AcPlPlotInfoValidator::kMatchEnabled);
                es = validator.validate(plotInfo);
                // begin document
                const TCHAR *szDocName = acDocManager->curDocument()->fileName();//获得当前的文件名

                //最后一个参数需要传入文件名
                es = pEngine->beginDocument(plotInfo, szDocName, NULL, 1, true, _T("D:\\test_result.pdf"));
                //给打印机和进度对话框发送消息
                pPlotProgDlg->onBeginSheet();
                pPlotProgDlg->setSheetProgressRange(0, 100);
                pPlotProgDlg->setSheetProgressPos(0);
                //begin page
                es = pEngine->beginPage(pageInfo, plotInfo, true);
                es = pEngine->beginGenerateGraphics();
                es = pEngine->endGenerateGraphics();
                //end page
                es = pEngine->endPage();
                pPlotProgDlg->setSheetProgressPos(100);
                pPlotProgDlg->onEndSheet();
                pPlotProgDlg->setPlotProgressPos(100);
                //end document
                es = pEngine->endDocument();
                //end plot
                es = pEngine->endPlot();
                //返回资源
                pEngine->destroy();
                pEngine = NULL;
                pPlotProgDlg->destroy();
                //////////////////////////////////////////////////////////////////////////
        }
这是网上的一个打印例子,我修改了一下可以在ARX2020里编译运行,但必须要自己先打印一次,程序才运行出结果。否则程序一闪而过打印不出来,而且并不报错。我猜测可能是一些必要的参数我程序里没有设置到,所以要手动先打印一次,CAD系统里把必要参数都设置了,然后我程序就能正常运行了,但找了几天都没找到哪些参数是非设不可的,故发贴求助,请各位大神帮忙,先谢谢啦!
另外,我发现一个很奇怪的地方
箭头所指的地方,ARX2020版的帮助说明里应该传入AcDbPlotSettings* pPlotSet才对,如果传入AcDbPlotSettings* pPlotSet,即使手动先打印一次程序也是一闪而过,而且不报错。何解????

                               
登录/注册后可看大图

                               
登录/注册后可看大图
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 3个

财富等级: 恭喜发财

发表于 2020-2-28 19:48:39 | 显示全部楼层
来看看,帮楼主顶贴
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-2 08:50 , Processed in 0.455571 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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