CAD切地形剖面图

您所在的位置:网站首页 地质剖面图用什么软件 CAD切地形剖面图

CAD切地形剖面图

2023-07-19 03:43| 来源: 网络整理| 查看: 265

2023.06.21 本文最后开放部分源码,供大家交流学习。  简介

1. 支持CAD2008~CAD2023; 

2.命令行输入ap,加载插件。输入 gsp,选择一条或者多条多段线(暂不支持直线)作为剖面线,确定,再根据提示选择与剖面线相交的等高线,确定,再点击选择放置的基点,即可生成剖面图;

3.可设置水平、竖直方向的比例;

4.纯命令操作,无界面,快捷方便;

5.下载链接: https://pan.baidu.com/s/1GM4YV2sy8Fwccge78YJp4w  提取码: kwew ; 或者 加群下载插件,QQ群:1148455637;

注意:

1.等高线所在图层需要设置为“Level 42,DGX,等高线,HC811,HC812,7101010,7101020,

Contour_Line_Minor,Contour_Line_Major,Contour_Line_Intermediate”中任意一个;

2.剖面线可以是折线;

3.插件会忽略高程小于0的等高线;

4.默认水平、竖直比例是1:1000;

5.如果切出来的剖面高程都是0,请把图复制粘贴到新的CAD里。

插件加载:

参数设置:

​​​​​​

操作示例:

2021.8.26日更新:

1.修改了剖面的放置方式。在生成多个剖面时,可选择水平或者竖直排列剖面图,更加整齐美观;

 2.增加了设置背景网格线的选项,可单独设置水平或者竖直的背景网格线;

 2021.8.14日更新:

1.等高线支持多段线、二维多段线、三维多段线及样条曲线;

2021.8.2日更新:

1.修复了当剖面线为折线时,在拐点处高程取值出现双值的错误;

2.拐点处的高程值采用IDW方法插值得到;

//根据选择的剖面线提取剖面 static void GetSectionsFromPlines_ARX_GSP() { CString csDGXlayer = _T("Level 42,DGX,等高线,HC811,HC812,7101010,7101020,Contour_Line_Minor,Contour_Line_Major,Contour_Line_Intermediate"); acutPrintf(_T("\n等高线要设置在以下图层上: %s"), csDGXlayer); //横纵比例 REAL nRatioX = 1000.0; REAL nRatioY = 1000.0; //刻度间距 int delty = 10; //标尺宽度 int nWidth = 1; //标尺最底部高程为5的倍数 int timesOfAltt = 5; //底部标尺刻度线最小间距 REAL nVW = 1.0; //底部高程栏高度、距离栏高度 REAL dH_ad = 8.0; //左侧标尺与剖面线最左侧点的间距 REAL dSeparate = 3.0; //放置方向,竖向、水平放置 bool bSetV = true; //背景网格 int iBox = 0; //用户设置 if (setUserSettings(nRatioX, nRatioY, delty, nWidth, nVW, dH_ad, bSetV, iBox) == 0) return; nRatioX = nRatioX / 1000; nRatioY = nRatioY / 1000; //选择剖面线 ads_name ss; int lengthQX = 0;//切线数量 struct resbuf* pRbList = NULL; TCHAR* promptStr[2]; //获得当前图形窗口中已经选择的实体(PickFirst 选择集) if (RTNORM == acedSSGet(_T("I"), NULL, NULL, NULL, ss)) { if (RTNORM != acedSSLength(ss, (Adesk::Int32*)&lengthQX)) return; } else { pRbList = acutBuildList(RTDXF0, _T("lwpolyline"), RTNONE); promptStr[0] = _T("\n请选择剖面线:"); promptStr[1] = _T(""); if (RTNORM != acedSSGet(_T(":$"), promptStr, NULL, pRbList, ss)) { acutRelRb(pRbList); return; } acutRelRb(pRbList); acedSSLength(ss, (Adesk::Int32*)&lengthQX); //acedSSSetFirst(ss, NULL);//亮显对象 } if (lengthQX == 0L) return; //获取等高线 ads_name ssDGX; pRbList = acutBuildList(RTDXF0, _T("lwpolyline,POLYLINE,SPLINE"), 8, csDGXlayer, RTNONE); promptStr[0] = _T("\n请选择等高线:"); promptStr[1] = _T(""); if (RTNORM != acedSSGet(_T(":$"), promptStr, NULL, pRbList, ssDGX)) { acutRelRb(pRbList); return; } acutRelRb(pRbList); long lengthDGX;//等高线数量 acedSSLength(ssDGX, (Adesk::Int32*)&lengthDGX); if (lengthDGX == 0L) return; //指定绘制剖面的基点 AcGePoint2d ptbase; AcGePoint2d ptbaseTemp; int nReturn = acedGetPoint(NULL, TEXT("\n请选择基点:"), asDblArray(ptbase)); if (nReturn != RTNORM) return; //对多条剖面线进行循环 vectorpl_pt; //需要填充的矩形 AcDbObjectIdArray loopIds; //进度条 //acedSetStatusBarProgressMeter(TEXT("正在计算..:"), 0, lengthQX - 1); CString ARXCurrentDirectory = CAppDirectoryUtil::GetCurrentDirectory(); CString fn = CT2A(ARXCurrentDirectory); fn += "\\GSP-距离与高程.txt"; ofstream fout(fn); fout isKindOf(AcDbSpline::desc())) { pSplineDGX = AcDbSpline::cast(pEntDGX); if (pSplineDGX) pSplineDGX->getStartPoint(pt); } //三维多段线 if (pEntDGX->isKindOf(AcDb3dPolyline::desc())) { pLine3dDGX = AcDb3dPolyline::cast(pEntDGX); if (pLine3dDGX) { AcDbObjectIterator* pItr = pLine3dDGX->vertexIterator(); for (pItr->start(); !pItr->done(); pItr->step()) { AcDb3dPolylineVertex* pVertex = NULL; AcDbObjectId vId = pItr->objectId(); acdbOpenObject(pVertex, vId, AcDb::kForRead); pt = pVertex->position(); break; } } } //二维多段线 if (pEntDGX->isKindOf(AcDb2dPolyline::desc())) { pLine2dDGX = AcDb2dPolyline::cast(pEntDGX); if (pLine2dDGX) { AcDbObjectIterator* pItr = pLine2dDGX->vertexIterator(); for (pItr->start(); !pItr->done(); pItr->step()) { AcDb2dVertex* pVertex = NULL; AcDbObjectId vId = pItr->objectId(); acdbOpenObject(pVertex, vId, AcDb::kForRead); pt = pVertex->position(); break; } } } //多段线 if (pEntDGX->isKindOf(AcDbPolyline::desc())) { pLineDGX = AcDbPolyline::cast(pEntDGX); if (pLineDGX) { for (unsigned j = 0; j < pLineDGX->numVerts(); j++) { pLineDGX->getPointAt(j, pt); break; } } } //if (pt.z < 0.000) continue; pLine->getPlane(plane, flag); pLine->intersectWith(pEntDGX, AcDb::kOnBothOperands, plane, intersectPoints); for (int j = 0; j < intersectPoints.length(); j++) { intersectPoints[j].z = pt.z; polyLine.append(intersectPoints[j]); } intersectPoints.removeAll(); pt.set(0, 0, -1000); } //添加切线上的点 polyLine.append(pLineVerts); pLineVerts.removeAll(); //获取交点在切线上的投影点,计算投影点到起点的距离,并排序 AcGePoint3d ptOnCurve; REAL dist; int numpt = polyLine.length(); pl_pt.resize(numpt); for (int i = 0; i < numpt; i++) { pt = polyLine[i]; pl_pt[i].x0 = pt.x; pl_pt[i].y0 = pt.y; pl_pt[i].z0 = pt.z; if (pLine->getClosestPointTo(pt, ptOnCurve) != Acad::eOk) return; if (pLine->getDistAtPoint(ptOnCurve, dist) != Acad::eOk) return; pl_pt[i].dist = dist; } if (numpt < 1) break; //排序 InsertionSortDIST(pl_pt, numpt); REAL MINZ = pl_pt[0].z0;//三维剖面线最低点 for (int i = 0; i < numpt; i++) { polyLine[i].x = pl_pt[i].x0; polyLine[i].y = pl_pt[i].y0; polyLine[i].z = pl_pt[i].z0; //查找最低点 if (MINZ > pl_pt[i].z0) { MINZ = pl_pt[i].z0; } //给切线的顶点赋高程值 if (pl_pt[i].z0 == 10000 && i > 0 && i < numpt - 1) { REAL dist0 = sqrt((pl_pt[i - 1].x0 - pl_pt[i].x0) * (pl_pt[i - 1].x0 - pl_pt[i].x0) + (pl_pt[i - 1].y0 - pl_pt[i].y0) * (pl_pt[i - 1].y0 - pl_pt[i].y0)); REAL dist1 = sqrt((pl_pt[i + 1].x0 - pl_pt[i].x0) * (pl_pt[i + 1].x0 - pl_pt[i].x0) + (pl_pt[i + 1].y0 - pl_pt[i].y0) * (pl_pt[i + 1].y0 - pl_pt[i].y0)); if (dist0 < 0.001) polyLine[i].z = pl_pt[i - 1].z0; if (dist1 < 0.001) polyLine[i].z = pl_pt[i + 1].z0; //IDW if (dist0 >= 0.001 && dist1 >= 0.001) polyLine[i].z = pl_pt[i - 1].z0 * (1 / dist0) / (1 / dist0 + 1 / dist1) + pl_pt[i + 1].z0 * (1 / dist1) / (1 / dist0 + 1 / dist1); pl_pt[i].z0 = polyLine[i].z; pl_pt[i].JTorZT = -2; } if (pl_pt[i].z0 == 10000 && i == 0) { polyLine[i].z = pl_pt[i + 1].z0; pl_pt[i].z0 = polyLine[i].z; pl_pt[i].JTorZT = 0; } if (pl_pt[i].z0 == 10000 && i == numpt - 1) { polyLine[i].z = pl_pt[i - 1].z0; pl_pt[i].z0 = polyLine[i].z; pl_pt[i].JTorZT = 0; } } //在xy平面绘制 ptbaseTemp = ptbase; pl_pt[0].x = ptbaseTemp.x;//剖面线起点 pl_pt[0].y = ptbaseTemp.y;//剖面线起点 REAL xdist = 0;//水平距离x REAL ydist = 0;//竖直距离y AcGePoint2d ptxy;//存储二维剖面线 REAL xmin, ymin, xmax, ymax; xmin = pl_pt[0].x; ymin = pl_pt[0].y; xmax = pl_pt[0].x; ymax = pl_pt[0].y; polyLinexy.append(ptbaseTemp); for (int i = 1; i < numpt; i++) { xdist += sqrt((polyLine[i].x - polyLine[i - 1].x) * (polyLine[i].x - polyLine[i - 1].x) + (polyLine[i].y - polyLine[i - 1].y) * (polyLine[i].y - polyLine[i - 1].y)); ydist = polyLine[i].z - polyLine[0].z; pl_pt[i].x = xdist / nRatioX + ptbaseTemp.x; pl_pt[i].y = ydist / nRatioY + ptbaseTemp.y; if (xmin > pl_pt[i].x) xmin = pl_pt[i].x; if (ymin > pl_pt[i].y) ymin = pl_pt[i].y; if (xmax < pl_pt[i].x) xmax = pl_pt[i].x; if (ymax < pl_pt[i].y) ymax = pl_pt[i].y; } polyLine.removeAll(); REAL dDeltY = ptbaseTemp.y - ymin; polyLinexy[0].y = polyLinexy[0].y + dDeltY; for (int i = 1; i < numpt; i++) { ptxy.x = pl_pt[i].x; ptxy.y = pl_pt[i].y + dDeltY; polyLinexy.append(ptxy); } ptbaseTemp.y = ptbaseTemp.y + dDeltY; //二维剖面尺寸 ymax = ymax + dDeltY; ymin = ymin + dDeltY; xdist = xmax - xmin; ydist = ymax - ymin; //绘制标尺 //刻度数量 int num = (int)(round(ydist / delty) + 4); //acutPrintf(_T("\nnum:%d"), num); //baseZ为刻度线标尺起点高程 REAL baseZ = round(MINZ / timesOfAltt) * timesOfAltt - 2 * delty; //刻度线标尺起点y坐标,与baseZ对应 REAL baseY = ptbaseTemp.y - (pl_pt[0].z0 - baseZ) / nRatioY; int num0 = 0; while (true) { if ((baseY + num0 * delty) > ymax) { num = num0 + 1; break; } num0++; } AcGePoint3d ptbase3d(0, 0, 0); //“高程” ptbase3d.x = xmin - dSeparate - nWidth * 2; ptbase3d.y = baseY + (num + 0.2) * delty; ptbase3d.z = 0; CString csText = _T("高程(m)"); CTextUtil::AddText(ptbase3d, csText, AcDb::kTextRight, 0.8, AcDbObjectId::kNull, 2.5, 0); //绘制 水平比例尺 竖直比例尺 文字 ptbase3d.x = xmin + xdist / 2; ptbase3d.y = baseY + (num + 1.0) * delty; ptbase3d.z = 0; csText = _T("水平 1:") + CConvertUtil::ToString(nRatioX*1000, 0) + _T(" 竖直 1:") + CConvertUtil::ToString(nRatioY*1000, 0); CTextUtil::AddText(ptbase3d, csText, AcDb::kTextMid, 0.8, AcDbObjectId::kNull, 4.0, 0); //标尺矩形框 AcGePoint2d pt0, pt1; pt0.x = xmin - dSeparate; pt0.y = baseY - delty; pt1.x = pt0.x - 2 * nWidth; pt1.y = baseY + num * delty; CPolylineUtil::AddRectangle(pt0, pt1, 0); //矩形框中线 pt0.x = xmin - dSeparate - nWidth; pt1.x = pt0.x; pt0.y = baseY - delty; pt1.y = baseY + num * delty; CPolylineUtil::Add(pt0, pt1, 0); //竖直刻度线数量 int num5 = (int)((xmax + 2 * nVW - xmin) / nVW) / 10 * 10 + 10; //刻度线及高程 for (int j = 1; j < num + 1; j++) { pt0.x = xmin - dSeparate; pt0.y = baseY - delty + j * delty; pt1.x = pt0.x - 3 * nWidth; pt1.y = pt0.y; CPolylineUtil::Add(pt0, pt1, 0); REAL altitude = (pt0.y - baseY)* nRatioY + baseZ;//刻度线对应的高程 //高程 pt.y = pt1.y - 1.0; pt.x = pt1.x - 2.0; //绘制刻度线左侧的高程 CString csral = CConvertUtil::ToString(altitude, 0); CTextUtil::AddText(pt, csral, AcDb::kTextRight, 0.8, AcDbObjectId::kNull, 2.5, 0); //绘制水平背景网格 if (iBox == 1 || iBox == 3) { pt1.x = pt0.x + dSeparate + num5 * nVW; CPolylineUtil::AddPolylineWithColor(pt0, pt1, 8, 0); } } //需要填充的矩形 for (int j = 0; j < num + 1; j++) { if (j % 2 == 0) { pt0.x = xmin - dSeparate; pt0.y = baseY - delty + j * delty; pt1.x = pt0.x - nWidth; pt1.y = pt0.y + delty; } else { pt0.x = xmin - dSeparate - nWidth; pt0.y = baseY - delty + j * delty; pt1.x = pt0.x - nWidth; pt1.y = pt0.y + delty; } objId = CPolylineUtil::AddRectangle(pt0, pt1, 0); loopIds.append(objId); //填充 CHatchUtil::Add(loopIds, TEXT("SOLID")); loopIds.removeAll(); } //底部距离标尺 pt0.x = xmin - 18 - dSeparate; pt0.y = baseY - delty - dH_ad; pt1.x = xmin + (num5 + 5) * nVW; pt1.y = pt0.y; CPolylineUtil::Add(pt0, pt1, 0); //底部矩形框 pt0.x = xmin - 18 - dSeparate; pt0.y = baseY - delty; pt1.x = xmin + (num5 + 5) * nVW; pt1.y = pt0.y - dH_ad * 2; CPolylineUtil::AddRectangle(pt0, pt1, 0.25); //底部标题栏竖线 pt0.x = xmin- dSeparate; pt0.y = baseY - delty; pt1.x = pt0.x; pt1.y = pt0.y - dH_ad * 2; CPolylineUtil::Add(pt0, pt1, 0); //“距离(m)” csText = _T("距离(m)"); pt.x = xmin - 9- dSeparate; pt.y = baseY - delty - 1.5 * dH_ad; CTextUtil::AddText(pt, csText, AcDb::kTextMid, 0.8, AcDbObjectId::kNull, 2.5, 0); //“地面高程(m)” csText = _T("地面高程(m)"); pt.x = xmin - 9- dSeparate; pt.y = baseY - delty - 0.5 * dH_ad; CTextUtil::AddText(pt, csText, AcDb::kTextMid, 0.8, AcDbObjectId::kNull, 2.5, 0); //底部高程栏, 高程竖向及高程值 for (int j = 0; j < numpt; j++) { pt0.x = pl_pt[j].x; pt0.y = baseY - delty; pt1.x = pl_pt[j].x; pt1.y = pt0.y - dH_ad; CPolylineUtil::Add(pt0, pt1, 0); csText = CConvertUtil::ToString(pl_pt[j].z0, 2); CTextUtil::AddText(AcGePoint3d(pt1.x, pt1.y + dH_ad/2, 0), csText, AcDb::kTextCenter, 0.8, AcDbObjectId::kNull, 1.5, PI/2); } //底部距离标尺-刻度、距离 //每5个刻度标中长线,每10个刻度标长线并标距离 for (int j = 0; j numVerts() > 1) { for (unsigned j = 3; j < numpt; j++) { if (pl_pt[j].JTorZT == -2) { pt0.x = pl_pt[j].x; pt0.y = pl_pt[j].y + dDeltY + ydist / 6; pt1.x = pt0.x; pt1.y = pl_pt[j].y + dDeltY - ydist / 6; CPolylineUtil::Add(pt0, pt1, 0); } } } //绘制二维剖面线 Adesk::UInt16 color = 3; AcDbObjectId polyId = CPolylineUtil::Add(polyLinexy, color, 0); for (unsigned j = 0; j < polyLinexy.length(); j++) { fout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3