ObjectARX CAD批量打印

这段代码是用C++编写的一个ObjectARX插件,用于批量处理CAD文件的打印。它会根据用户输入的输出格式(如JPG或PDF),调整打印设置,包括纸张大小、分辨率等,并通过AutoCAD的API进行打印操作。在打印过程中,它还会检查并修改背景设置,确保打印质量,并提供进度对话框供用户跟踪打印进度。
摘要由CSDN通过智能技术生成

c++ ObjectARX CAD批量打印

struct resbuf rbBackGroundPlot;
				acedGetVar(_T("BACKGROUNDPLOT"), &rbBackGroundPlot);
				if (rbBackGroundPlot.restype == RTSHORT && rbBackGroundPlot.resval.rint != 0)
				{
					int nOld = rbBackGroundPlot.resval.rint;
					rbBackGroundPlot.resval.rint = 0;
					acedSetVar(_T("BACKGROUNDPLOT"), &rbBackGroundPlot);
					rbBackGroundPlot.resval.rint = nOld;
				}

				AcDbLayoutManager* pLayMan = acdbHostApplicationServices()->layoutManager();
				if (NULL != pLayMan)
				{
					//get the active layout
					AcDbLayout* pLayout = pLayMan->findLayoutNamed(pLayMan->findActiveLayout(TRUE), TRUE);//获得当前布局
					AcDbObjectId  m_layoutId = pLayout->objectId();//获得布局的Id
					AcPlPlotInfo plotInfo;
					AcDbPlotSettingsValidator* pPSV = acdbHostApplicationServices()->plotSettingsValidator();

					plotInfo.setLayout(pLayout->objectId());//必须设置

					AcDbPlotSettings* m_pSetting = new AcDbPlotSettings(pLayout->modelType());

					m_pSetting->copyFrom(pLayout);
					pPSV->refreshLists(m_pSetting);

					m_pSetting->setShadePlot(AcDbPlotSettings::kAsDisplayed);
					m_pSetting->setShadePlotResLevel(AcDbPlotSettings::kNormal);
					m_pSetting->setScaleLineweights(false);
					m_pSetting->setPrintLineweights(true);
					m_pSetting->setPlotTransparency(false);
					m_pSetting->setPlotPlotStyles(true);
					m_pSetting->setDrawViewportsFirst(true);
					m_pSetting->setShowPlotStyles(true);

					if (suffix == ".pdf")
					{
						es = pPSV->setPlotCfgName(m_pSetting, L"DWG to PDF.pc3", L"ISO_FULL_BLEED_A4_(210.00_x_297.00_MM)");//"ISO_FULL_BLEED_A4_(297.00_x_210.00_MM)"
						es = pPSV->setPlotPaperUnits(m_pSetting, AcDbPlotSettings::kMillimeters);
						pPSV->setPlotWindowArea(m_pSetting, extent.minPoint().x, extent.minPoint().y, extent.maxPoint().x, extent.maxPoint().y);
						pPSV->setPlotOrigin(m_pSetting, (extent.minPoint().x + extent.maxPoint().x) / 2, (extent.minPoint().y + extent.maxPoint().y) / 2);
						pPSV->setPlotType(m_pSetting, AcDbPlotSettings::kWindow);
						es = pPSV->setCustomPrintScale(m_pSetting, 1.0, _ttof(bl) / 1000.0);//PDF
					}
					else
					{
						es = pPSV->setPlotCfgName(m_pSetting, L"CASS_RASTER_JPG.pc3", L"UserDefinedRaster (1200.00 x 1600.00像素)");//"UserDefinedRaster (1782.00 x 1260.00像素)"
						es = pPSV->setPlotPaperUnits(m_pSetting, AcDbPlotSettings::kPixels);
						es = pPSV->setPlotType(m_pSetting, AcDbPlotSettings::kExtents);
						es = pPSV->setCustomPrintScale(m_pSetting, 1.0, _ttof(bl) / 18000.0);//JPG
					}
					es = pPSV->setPlotRotation(m_pSetting, AcDbPlotSettings::k0degrees);										
					es = pPSV->setCurrentStyleSheet(m_pSetting, L"acad.ctb");
										
					//全部配置名称 
					/*AcArray<const ACHAR*> mMediaList;
					pPSV->plotDeviceList(mMediaList);
					std::vector<CString> arrMediaNames;
					pPSV->canonicalMediaNameList(m_pSetting, mMediaList);
					for (int nIndex = 0; nIndex < mMediaList.length(); ++nIndex)
						arrMediaNames.push_back(mMediaList[nIndex]);*/

						// Specify that we want our plot centered by AutoCAD...
					es = pPSV->setPlotCentered(m_pSetting, true);
					es = pPSV->setUseStandardScale(m_pSetting, FALSE);
										
					pPSV->setZoomToPaperOnUpdate(m_pSetting, true);
					plotInfo.setOverrideSettings(m_pSetting);
					// 验证这些设置。
					AcPlPlotInfoValidator validator;
					validator.setMediaMatchingPolicy(AcPlPlotInfoValidator::kMatchEnabled);
					es = validator.validate(plotInfo);

					AcPlPlotEngine* pEngine = NULL;
					if (Acad::eOk == AcPlPlotFactory::createPublishEngine(pEngine))
					{
						// Here is the progress dialog for the current plot process...
						AcPlPlotProgressDialog* pPlotProgDlg = acplCreatePlotProgressDialog(acedGetAcadFrame()->m_hWnd, false, 1);
						pPlotProgDlg->setPlotMsgString(AcPlPlotProgressDialog::kDialogTitle, _T("Plot 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);
						es = pEngine->beginPlot(pPlotProgDlg);
						AcPlPlotPageInfo pageInfo;
						// Used to describe how the plot is to be made.
						//AcPlPlotInfo plotInfo;
						// First, set the layout to the specified layout 
						// (which is the current layout in this sample).
						//plotInfo.setLayout(layoutId);// This is required.
						// Now, override the layout settings with the plot settings 
						// we have been populating.
						//plotInfo.setOverrideSettings(pPlotSettings);
						// We need to validate these settings.
						//AcPlPlotInfoValidator validator;
						//validator.setMediaMatchingPolicy(AcPlPlotInfoValidator::kMatchEnabled);
						//es = validator.validate(plotInfo);
						// Begin document.  The version we call is dependent 
						// on the plot-to-file status.
						//const TCHAR* szDocName = acDocManager->curDocument()->fileName();
						CString szDocName = acDocManager->curDocument()->fileName();
						CString outPutFilePath = szDocName;
						int n = outPutFilePath.ReverseFind('.');
						outPutFilePath = outPutFilePath.Left(n);
						//outPutFilePath +=  ".jpg";
						outPutFilePath += suffix;
						//if (m_bPlotToFile)
						es = pEngine->beginDocument(plotInfo, szDocName, NULL, 1, true, outPutFilePath);
						//else
							//es = pEngine->beginDocument(plotInfo, szDocName);
						// Follow through sending commands to the engine, 
						// and notifications to the progress dialog.
						pPlotProgDlg->onBeginSheet();
						pPlotProgDlg->setSheetProgressRange(0, 100);
						pPlotProgDlg->setSheetProgressPos(0);
						es = pEngine->beginPage(pageInfo, plotInfo, true);
						es = pEngine->beginGenerateGraphics();
						es = pEngine->endGenerateGraphics();
						es = pEngine->endPage();
						pPlotProgDlg->setSheetProgressPos(100);
						pPlotProgDlg->onEndSheet();
						pPlotProgDlg->setPlotProgressPos(100);
						es = pEngine->endDocument();
						es = pEngine->endPlot();
						// Destroy the engine 
						pEngine->destroy();
						pEngine = NULL;
						// and the progress dialog.
						pPlotProgDlg->destroy();
					}
					else
					{
						// Ensure the engine is not already busy...
						AfxMessageBox(L"Plot Engine is Busy...");
					}
					pLayout->close();
					m_pSetting->close();

				}

使用

void CMyPalette1ChildDlg::OnBnClickedButton15()
{
	// TODO: 在此添加控件通知处理程序代码
	AcApDocument* pDoc = acDocManager->curDocument();
	if (pDoc == nullptr)
	{
		return;
	}
	string filePath = CW2A(pDoc->fileName());
	//LPITEMIDLIST pidl=ParsePidlFromPath(filePath);
	ACHAR szPath[MAX_PATH];     //存放选择的目录路径 
	string path;

	ZeroMemory(szPath, sizeof(szPath));

	BROWSEINFO bi;
	bi.hwndOwner = m_hWnd;// 父窗口句柄
	bi.pidlRoot = CSIDL_DESKTOP;// 要显示的文件夾的根(Root) CSIDL_DESKTOP
	bi.pszDisplayName = szPath;// 保存被选取的文件夾路径的缓冲区
	bi.lpszTitle = L"请选择文件夹的目录:";// 显示位于对话框左上部的标题
	bi.ulFlags = BIF_RETURNONLYFSDIRS;// 指定对话框的外观和功能的標志
	bi.lpfn = NULL;// 处理事件的回调函数
	bi.lParam = 0;// 应用程序传给回调函数的参数
	bi.iImage = 0;// 保存被选取的文件夾的图片索引
	//弹出选择目录对话框
	LPITEMIDLIST lp = SHBrowseForFolder(&bi);
	if (lp == NULL)
	{
		AfxMessageBox(L"无效的目录,请重新选择");
		return;
	}
	SHGetPathFromIDList(lp, szPath);
	LPMALLOC lpMalloc;
	if (FAILED(SHGetMalloc(&lpMalloc)))
		return;
	lpMalloc->Free(lp);
	lpMalloc->Release();

	path = CW2A(szPath);
	std::vector<std::string> files;
	CGeometryOper::getAllFiles(path, files, "", ".dwg");
	files.erase(std::remove(files.begin(), files.end(), filePath), files.end());

	//acDocManager->lockDocument(pDoc, AcAp::kWrite, NULL, NULL, true);
	//AcTransaction* pTrans = actrTransactionManager->startTransaction();

	Acad::ErrorStatus es;
	AutoCAD::IAcadApplication* pAcad = nullptr;
	HRESULT hr = NOERROR;

	LPDISPATCH pAcadDisp = acedGetIDispatch(TRUE);
	hr = pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication, (void**)&pAcad);
	if (SUCCEEDED(hr)) {
		pAcadDisp->Release();
	}
	/*AutoCAD::IAcadPreferences* pPreferences;
	AutoCAD::IAcadPreferencesFiles* pPreferFiles;
	BSTR Path;
	pAcad->get_Preferences(&pPreferences);
	pPreferences->get_Files(&pPreferFiles);
	pPreferFiles->get_PrinterConfigPath(&Path);
	CString CPath = Path;
	SysFreeString(Path);
	pPreferFiles->Release();
	pPreferences->Release();*/

	CString suffix = ".jpg";
	acedInitGet(NULL, _T("J P"));
	ACHAR szKeyword[128] = { 0 };
	int nRet = acedGetKword(_T("\n请输入关键字确定打印方式[(J)JPG/(P)PDF]<J>:"), szKeyword);
	if (RTCAN == nRet)
	{
		acutPrintf(_T("\n取消打印"));
		return;
	}
	else if (RTNONE == nRet)
	{
		//acutPrintf(_T("\n使用默认值"));
	}
	else if (RTNORM == nRet)
	{
		if (_tcscmp(szKeyword, _T("J")) == 0)
		{

		}
		else if (_tcscmp(szKeyword, _T("P")) == 0)
		{
			suffix = ".pdf";
		}
	}

	for (int i = 0; i < files.size(); i++)
	{
		CString sfile = files[i].c_str();
		es = acDocManager->appContextOpenDocument(sfile);
		if (eOk == es)
		{
			AcApDocument* tmpDoc = acDocManager->curDocument();
			AcDbDatabase* pDb = tmpDoc->database();
			pDb->closeInput();
			pAcad->ZoomExtents();
			pDb->updateExt(TRUE);

			acDocManager->lockDocument(tmpDoc, AcAp::kRead, NULL, NULL, true);
			AcTransactionManager* pTrans = tmpDoc->transactionManager();
			//tmpDoc->pushDbmod();
			CString bl;
			AcDbExtents extent;
			//获得模型空间的块表记录
			AcDbBlockTableRecord* pBlkTblRcd = NULL;
			AcDbBlockTableRecordPointer pBlkRcd(ACDB_MODEL_SPACE, pDb, AcDb::kForRead);
			AcDbBlockTableRecordIterator* iter;
			extent.addBlockExt(pBlkRcd);
			pBlkRcd->newIterator(iter);
			for (iter->start(); !iter->done(); iter->step())
			{
				AcDbObjectId id;
				es = iter->getEntityId(id);
				if (es != Acad::eOk || !id.isValid())
					continue;
				// TODO 处理实体
				AcDbObjectPointer<AcDbEntity> jzdEnt(id, AcDb::kForRead);
				if (Acad::eOk != jzdEnt.openStatus())
				{
					continue;
				}
				if (jzdEnt->isKindOf(AcDbText::desc())) {

					AcDbText* pText = AcDbText::cast(jzdEnt);
					CString text = pText->textString();
					if (text.Find(L"1:") == 0 || text.Find(L"比例尺 1:") == 0)
					{
						int pos = text.Find(L":");
						bl = text.Mid(pos + 1);
						break;
					}
				}
				else if (jzdEnt->isKindOf(AcDbBlockReference::desc()))
				{
					AcDbBlockReference* pBlkRef = AcDbBlockReference::cast(jzdEnt);
					AcDbObjectId idBlkDef = pBlkRef->blockTableRecord();
					AcDbBlockTableRecordPointer pBlkTblRcdp(idBlkDef, AcDb::kForRead);
					if (Acad::eOk != pBlkTblRcdp.openStatus()) continue;

					ACHAR* name;
					pBlkTblRcdp->getName(name);
					CString blockname = name;
					if (name != NULL)acutDelString(name);
					if (blockname.MakeLower().Find(L"gddjtk") == 0)
					{
						AcDbVoidPtrArray entitySet;
						es = pBlkRef->explode(entitySet);
						if (es != Acad::eOk)
						{
							acutPrintf(_T("\n炸开块失败"));
						}
						else
						{
							for (int i = 0; i < entitySet.length(); i++)
							{
								AcDbEntity* pEnty = (AcDbEntity*)entitySet.at(i);
								if (pEnty != NULL)
								{
									if (pEnty->isKindOf(AcDbText::desc())) {

										AcDbText* pText = AcDbText::cast(pEnty);
										CString text = pText->textString();
										if (text.Find(L"1:") == 0 || text.Find(L"比例尺 1:") == 0)
										{
											int pos = text.Find(L":");
											bl = text.Mid(pos + 1);
											pEnty->close();
											break;
										}
									}
									pEnty->close();
								}
							}
						}
						entitySet.removeAll();
						entitySet.setLogicalLength(0);
						break;
					}
					//判断指定的块表记录是否包含属性定义
					if (!pBlkTblRcdp->hasAttributeDefinitions())
					{
						continue;
					}

					//直接获取图块的属性迭代器
					AcDbObjectIterator* pIter = pBlkRef->attributeIterator();
					//无论图块是否有属性,迭代器一般不会为NULL
					if (NULL == pIter)
					{
						acutPrintf(_T("\n获取属性迭代器失败!"));
						continue;
					}
					//设置判断是否能获取到属性
					for (pIter->start(); !pIter->done(); pIter->step())
					{
						AcDbObjectId attribId = pIter->objectId();
						AcDbObjectPointer<AcDbAttribute> pAttrib(attribId, AcDb::kForRead);
						if (Acad::eOk != pAttrib.openStatus())
						{
							continue;
						}
						//方式一

						CString strTag;
						strTag = pAttrib->tag();
						if (strTag == "比例尺" || strTag == "BLC")
						{
							CString strValue;
							strValue = pAttrib->textString();
							int pos = strValue.Find(L":");
							bl = strValue.Mid(pos + 1);
							break;
						}

						//方式二
						/*ACHAR* szTag = pAttrib->tag();
						ACHAR* szValue = pAttrib->textString();
						if (szTag != NULL && szValue != NULL)
						{
							acutPrintf(_T("\n属性名: %s 属性值: %s"), szTag, szValue);
						}
						else
						{
							acutPrintf(_T("\n获取属性值失败!"), szTag, szValue);
						}
						if (szTag != NULL)
						{
							acutDelString(szTag);
						}
						if (szValue != NULL)
						{
							acutDelString(szValue);
						}*/
					}
					//释放迭代器
					delete pIter;
					if (!bl.IsEmpty())
					{
						break;
					}
				}
			}
			// 释放迭代器对象,关闭快表记录
			delete iter;
			pBlkRcd.release(pBlkTblRcd);//智能指针变普通指针
			pBlkTblRcd->close();
			acDocManager->unlockDocument(tmpDoc);
			pTrans->abortTransaction();
			//pDb->saveAs(sfile); 
			//pDb->save();
			//tmpDoc->formatForSave();
			//tmpDoc->popDbmod();
			if (!bl.IsEmpty())
			{
				struct resbuf rbBackGroundPlot;
				acedGetVar(_T("BACKGROUNDPLOT"), &rbBackGroundPlot);
				if (rbBackGroundPlot.restype == RTSHORT && rbBackGroundPlot.resval.rint != 0)
				{
					int nOld = rbBackGroundPlot.resval.rint;
					rbBackGroundPlot.resval.rint = 0;
					acedSetVar(_T("BACKGROUNDPLOT"), &rbBackGroundPlot);
					rbBackGroundPlot.resval.rint = nOld;
				}

				AcDbLayoutManager* pLayMan = acdbHostApplicationServices()->layoutManager();
				if (NULL != pLayMan)
				{
					//get the active layout
					AcDbLayout* pLayout = pLayMan->findLayoutNamed(pLayMan->findActiveLayout(TRUE), TRUE);//获得当前布局
					AcDbObjectId  m_layoutId = pLayout->objectId();//获得布局的Id
					AcPlPlotInfo plotInfo;
					AcDbPlotSettingsValidator* pPSV = acdbHostApplicationServices()->plotSettingsValidator();

					plotInfo.setLayout(pLayout->objectId());//必须设置

					AcDbPlotSettings* m_pSetting = new AcDbPlotSettings(pLayout->modelType());

					m_pSetting->copyFrom(pLayout);
					pPSV->refreshLists(m_pSetting);

					m_pSetting->setShadePlot(AcDbPlotSettings::kAsDisplayed);
					m_pSetting->setShadePlotResLevel(AcDbPlotSettings::kNormal);
					m_pSetting->setScaleLineweights(false);
					m_pSetting->setPrintLineweights(true);
					m_pSetting->setPlotTransparency(false);
					m_pSetting->setPlotPlotStyles(true);
					m_pSetting->setDrawViewportsFirst(true);
					m_pSetting->setShowPlotStyles(true);

					if (suffix == ".pdf")
					{
						es = pPSV->setPlotCfgName(m_pSetting, L"DWG to PDF.pc3", L"ISO_FULL_BLEED_A4_(210.00_x_297.00_MM)");//"ISO_FULL_BLEED_A4_(297.00_x_210.00_MM)"
						es = pPSV->setPlotPaperUnits(m_pSetting, AcDbPlotSettings::kMillimeters);
						pPSV->setPlotWindowArea(m_pSetting, extent.minPoint().x, extent.minPoint().y, extent.maxPoint().x, extent.maxPoint().y);
						pPSV->setPlotOrigin(m_pSetting, (extent.minPoint().x + extent.maxPoint().x) / 2, (extent.minPoint().y + extent.maxPoint().y) / 2);
						pPSV->setPlotType(m_pSetting, AcDbPlotSettings::kWindow);
						es = pPSV->setCustomPrintScale(m_pSetting, 1.0, _ttof(bl) / 1000.0);//PDF
					}
					else
					{
						es = pPSV->setPlotCfgName(m_pSetting, L"CASS_RASTER_JPG.pc3", L"UserDefinedRaster (1200.00 x 1600.00像素)");//"UserDefinedRaster (1782.00 x 1260.00像素)"
						es = pPSV->setPlotPaperUnits(m_pSetting, AcDbPlotSettings::kPixels);
						es = pPSV->setPlotType(m_pSetting, AcDbPlotSettings::kExtents);
						es = pPSV->setCustomPrintScale(m_pSetting, 1.0, _ttof(bl) / 18000.0);//JPG
					}
					es = pPSV->setPlotRotation(m_pSetting, AcDbPlotSettings::k0degrees);
					es = pPSV->setCurrentStyleSheet(m_pSetting, L"acad.ctb");

					//全部配置名称 
					/*AcArray<const ACHAR*> mMediaList;
					pPSV->plotDeviceList(mMediaList);
					std::vector<CString> arrMediaNames;
					pPSV->canonicalMediaNameList(m_pSetting, mMediaList);
					for (int nIndex = 0; nIndex < mMediaList.length(); ++nIndex)
						arrMediaNames.push_back(mMediaList[nIndex]);*/

						// Specify that we want our plot centered by AutoCAD...
					es = pPSV->setPlotCentered(m_pSetting, true);
					es = pPSV->setUseStandardScale(m_pSetting, FALSE);

					pPSV->setZoomToPaperOnUpdate(m_pSetting, true);
					plotInfo.setOverrideSettings(m_pSetting);
					// 验证这些设置。
					AcPlPlotInfoValidator validator;
					validator.setMediaMatchingPolicy(AcPlPlotInfoValidator::kMatchEnabled);
					es = validator.validate(plotInfo);

					AcPlPlotEngine* pEngine = NULL;
					if (Acad::eOk == AcPlPlotFactory::createPublishEngine(pEngine))
					{
						// Here is the progress dialog for the current plot process...
						AcPlPlotProgressDialog* pPlotProgDlg = acplCreatePlotProgressDialog(acedGetAcadFrame()->m_hWnd, false, 1);
						pPlotProgDlg->setPlotMsgString(AcPlPlotProgressDialog::kDialogTitle, _T("Plot 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);
						es = pEngine->beginPlot(pPlotProgDlg);
						AcPlPlotPageInfo pageInfo;
						// Used to describe how the plot is to be made.
						//AcPlPlotInfo plotInfo;
						// First, set the layout to the specified layout 
						// (which is the current layout in this sample).
						//plotInfo.setLayout(layoutId);// This is required.
						// Now, override the layout settings with the plot settings 
						// we have been populating.
						//plotInfo.setOverrideSettings(pPlotSettings);
						// We need to validate these settings.
						//AcPlPlotInfoValidator validator;
						//validator.setMediaMatchingPolicy(AcPlPlotInfoValidator::kMatchEnabled);
						//es = validator.validate(plotInfo);
						// Begin document.  The version we call is dependent 
						// on the plot-to-file status.
						//const TCHAR* szDocName = acDocManager->curDocument()->fileName();
						CString szDocName = acDocManager->curDocument()->fileName();
						CString outPutFilePath = szDocName;
						int n = outPutFilePath.ReverseFind('.');
						outPutFilePath = outPutFilePath.Left(n);
						//outPutFilePath +=  ".jpg";
						outPutFilePath += suffix;
						//if (m_bPlotToFile)
						es = pEngine->beginDocument(plotInfo, szDocName, NULL, 1, true, outPutFilePath);
						//else
							//es = pEngine->beginDocument(plotInfo, szDocName);
						// Follow through sending commands to the engine, 
						// and notifications to the progress dialog.
						pPlotProgDlg->onBeginSheet();
						pPlotProgDlg->setSheetProgressRange(0, 100);
						pPlotProgDlg->setSheetProgressPos(0);
						es = pEngine->beginPage(pageInfo, plotInfo, true);
						es = pEngine->beginGenerateGraphics();
						es = pEngine->endGenerateGraphics();
						es = pEngine->endPage();
						pPlotProgDlg->setSheetProgressPos(100);
						pPlotProgDlg->onEndSheet();
						pPlotProgDlg->setPlotProgressPos(100);
						es = pEngine->endDocument();
						es = pEngine->endPlot();
						// Destroy the engine 
						pEngine->destroy();
						pEngine = NULL;
						// and the progress dialog.
						pPlotProgDlg->destroy();
					}
					else
					{
						// Ensure the engine is not already busy...
						AfxMessageBox(L"Plot Engine is Busy...");
					}
					pLayout->close();
					m_pSetting->close();

				}
			}

			acDocManager->appContextCloseDocument(tmpDoc);
			tmpDoc = nullptr;
		}
		sfile.ReleaseBuffer();
	}
	if (SUCCEEDED(hr)) {
		pAcad->Release();
	}
	files.clear();
	//actrTransactionManager->abortTransaction();
	//acDocManager->unlockDocument(pDoc);
	acutPrintf(_T("\n完成!\n"));
}
void CGeometryOper::getAllFiles(const std::string& path, std::vector<std::string>& files, const string& fileName, const string& fileType, bool recursive)
{
	//文件句柄
	long long hFile = 0;
	//文件信息
	struct _finddata_t fileinfo;
	string p;
	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) {
		do {
			if ((fileinfo.attrib & _A_SUBDIR)) {  //比较文件类型是否是文件夹
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) {
					//files.push_back(p.assign(path).append("\\").append(fileinfo.name));
					//递归搜索
					if (recursive)
					{
						getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files, fileName, fileType);
					}
				}
			}
			else {
				string name = fileinfo.name;
				string ImgNameNoTag = name.substr(0, name.rfind("."));//获取不带后缀的文件名
				string ImgNameTag = name.substr(name.rfind("."), name.length());//获取后缀名
				if (fileType.empty())
				{
					if (fileName.empty())
					{
						files.push_back(p.assign(path).append("\\").append(fileinfo.name));
					}
					else
					{
						if (ImgNameNoTag.find(fileName) != string::npos)
						{
							files.push_back(p.assign(path).append("\\").append(fileinfo.name));
						}
					}
				}
				else
				{
					transform(ImgNameTag.begin(), ImgNameTag.end(), ImgNameTag.begin(), ::tolower);
					if (ImgNameTag.find(fileType) != string::npos)
					{
						if (fileName.empty())
						{
							files.push_back(p.assign(path).append("\\").append(fileinfo.name));
						}
						else
						{
							if (ImgNameNoTag.find(fileName) != string::npos)
							{
								files.push_back(p.assign(path).append("\\").append(fileinfo.name));
							}
						}
					}
				}
			}
		} while (_findnext(hFile, &fileinfo) == 0);  //寻找下一个,成功返回0,否则-1
		_findclose(hFile);
	}
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值