夜雨聆风学习资料网

ARTICLE · 1342937

[源码]输入管道数据批量修改

[源码]输入管道数据批量修改
2年前编写的一个管道数据的批量修改功能,因为测试用例丢失,无法展示程序效果了。根据程序的代码,结合之前的图片,重新制作了一个模板,目前可以正常使用本功能了。
程序的功能是根据Excel中的信息,查找相应扩展数据的标题、起点文字、终点文字(只在给定的范围内查找),避免出错。

读取剪贴板里从 Excel 复制的表格数据,按换行、制表符自动拆分单元格内容。程序自动筛选带专属扩展数据标识WeldjointMarkPoly的多段线框,利用四叉树算法对图框进行空间分组、按坐标排序,保证处理顺序和 Excel 行顺序一一对应,避免文字错位。

遍历分组图框时,程序自动提取每个焊缝模板框的包围盒范围,在框内检索绑定不同标识(标题、起点、终点)的文字、多行文字。再依次读取 Excel 里每一行数据,按预设列映射关系,自动替换对应位置文本。同时内置进度条,CAD 状态栏 + 无模态ProgressBarDlg双进度展示,实时看到处理进度,还加入边界判断:图元异常、Excel 行数不足时,控制台输出提示,方便快速排查问题。

整套流程省去人工点选、文字编辑操作。只要在 Excel 整理好焊缝标题、起点、终点数据,复制表格,在 CAD 内执行命令,程序自动匹配图框、回填文字。适合大批量焊缝详图、焊接节点图纸批量出标识。

在钢结构绘图场景,这类小 ARX 工具价值很实在:减少重复劳动,降低人为录入错误。代码中四叉树空间分组、扩展数据筛选图元、剪贴板读取表格这套方案,也可以复用在零件编号、表格注释、构件标签等其他批量文字填充场景。

输油管道图纸批量生成,操作方式见下面视频。

关注
重播 分享 赞
void YJDraw::YJWeldjointMarkTemplate(){if(!YJLogin::CheckPower(_T("YJWELDJOINTMARK")))return;CString sInput;if(!YJArxUtil::CIOUtiliy::YTMGetClipString(sInput) || _T("")==sInput)	{		acutPrintf(_T("\n请在Excel中复制数据后再执行本功能!"));return;	}std::vector<std::vector<CString> > arrStr = YJArxUtil::TextUtil::SplitCString(sInput,_T("\n"),_T("\t"),true,false);std::vector<AcDbObjectId> arrPoly;	{		struct resbuf *rb=NULL;//结果缓冲表		rb=acutBuildList(RTDXF0,_T("LWPOLYLINE"),-3,1001,_T("WeldjointMarkPoly"),RTNONE);		ads_name sset;		acedSSGet(_T("X"),NULL,NULL,rb,sset);		arrPoly = YJArxUtil::SelectUtil::SSToIds(sset);		acutRelRb(rb);acedSSFree(sset);	}MathGeometry::SetToWCS();std::vector<YJArxUtil::RectIds> arrRect = YJArxUtil::QuadTree::Group(arrPoly,-2.0,false);std::vector<RectIds_Group> arrGroup =  YJArxUtil::QuadTree::SortRectIds(arrRect,YJArxUtil::e_Row_x_Y,0.1);	int count = 0;int progressIndex = 1;for(size_t i=0;i<arrGroup.size();++i)	{for(size_t j=0;j<arrGroup.at(i).arrRectIds.size();++j)		{			count++;		}	}if (count < 1)	{		acutPrintf(_T("\n未查找到合适的数据,程序退出!")); return;	}ProgressBarDlgCallBack cb = &ShowProgressBar2;ProgressBarDlg::maxVal=count;ProgressBarDlg::ShowProgressBarDlg(cb);CString strProgress;	strProgress.Format(_T("开始批量生成,%d个文件...:"),count);	acedSetStatusBarProgressMeter(strProgress, 0, count);	int index = 0;for(size_t i=0;i<arrGroup.size();++i)	{for(size_t j=0;j<arrGroup.at(i).arrRectIds.size();++j)		{if(arrGroup.at(i).arrRectIds.at(j).arrId.size()!=1)			{				acutPrintf(_T("\n分组内图元个数不为1!"));continue;			}YJArxUtil::YJPolylinePtr pPoly(arrGroup.at(i).arrRectIds.at(j).arrId.at(0),AcDb::kForRead);if(!pPoly.IsOpenCorrectly())continue;AcDbExtents ext;			pPoly->getGeomExtents(ext);std::vector<AcDbObjectId> arrPoly,arrTitle,arrStart,arrEnd;WeldjointMarkTemplateCount(_T("TEXT,MTEXT"),_T("WeldjointMarkTitle"),ext,arrTitle);WeldjointMarkTemplateCount(_T("TEXT,MTEXT"),_T("WeldjointMarkStart"),ext,arrStart);WeldjointMarkTemplateCount(_T("TEXT,MTEXT"),_T("WeldjointMarkEnd"),ext,arrEnd);if(index>arrStr.size()-1)			{				acutPrintf(_T("\n模板太多了,Excel中没有那么多行!"));continue;			}WeldjointMarkPutText(arrTitle,arrStr.at(index),m_WMData.titleCol,_T("标题"));WeldjointMarkPutText(arrStart,arrStr.at(index),m_WMData.sCol,_T("起点"));WeldjointMarkPutText(arrEnd,arrStr.at(index),m_WMData.eCol,_T("终点"));			index++;			acedSetStatusBarProgressMeterPos(progressIndex);if(pProgressBarDlg)			{				pProgressBarDlg->GetSouiDlg()->SetPos(progressIndex,_T("模板生成中……"),SOUI::SStringT().Format(_T("模板生成进度%d/%d"),progressIndex,count));			}ProgressBarDlg::DoEvents();			progressIndex++;		}	}	acedRestoreStatusBar();	acutPrintf(_T("\n处理完毕!共处理了%d个模板!"),count);MathGeometry::SetToUCS();}

只要绘图时使用此模板,后续都可以实现一键完成修改。

模板通过回复关键字“输油管道图纸批量生成”来获取。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料