赞
踩
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里。
1.修改了剖面的放置方式。在生成多个剖面时,可选择水平或者竖直排列剖面图,更加整齐美观;
2.增加了设置背景网格线的选项,可单独设置水平或者竖直的背景网格线;
1.等高线支持多段线、二维多段线、三维多段线及样条曲线;
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;
-
- //对多条剖面线进行循环
- vector<CVert>pl_pt;
- //需要填充的矩形
- AcDbObjectIdArray loopIds;
-
- //进度条
- //acedSetStatusBarProgressMeter(TEXT("正在计算..:"), 0, lengthQX - 1);
-
- CString ARXCurrentDirectory = CAppDirectoryUtil::GetCurrentDirectory();
- CString fn = CT2A(ARXCurrentDirectory);
- fn += "\\GSP-距离与高程.txt";
-
- ofstream fout(fn);
- fout << "切线号\t"<< "累计距离\t" << "实际高程" << endl;
-
- for (int ii = 0; ii < lengthQX; ii++)
- {
- //acedSetStatusBarProgressMeterPos(ii);
-
- AcGePoint3dArray polyLine;//所有交点的数组
- AcGePoint2dArray polyLinexy;
- AcGePoint3dArray intersectPoints;//切线与某条等高线交点的数组
-
- ads_name ent;
- acedSSName(ss, ii, ent);
-
- AcDbObjectId objId;
- acdbGetObjectId(objId, ent);
-
- //使用ARX智能指针打开对象,实体类对象可以使用这种方式直接打开.
- AcDbObjectPointer<AcDbPolyline> pLine(objId, AcDb::kForRead);
- //判断是否打开成功
- //注意ARX智能指针使用智能指针成员函数的时候是点符号"."不是指针符号"->"
- if (Acad::eOk != pLine.openStatus())
- {
- //根据情况做打开失败处理
- acutPrintf(_T("\n(c)打开剖面线对象失败! 错误码: %s"), acadErrorStatusText(pLine.openStatus()));
- return;
- }
-
- //获取切线上的顶点
- AcGePoint3dArray pLineVerts;
- AcGePoint2d ptV;
- for (unsigned j = 0; j < pLine->numVerts(); j++)
- {
- pLine->getPointAt(j, ptV);
- pLineVerts.append(AcGePoint3d(ptV.x, ptV.y, 10000));
- }
-
- //设定投影面
- AcGePlane plane;
- AcDb::Planarity flag;
- //获得交点
- AcGePoint3d pt(0,0,-1000);//记录等高线标高
-
- AcDbObjectId objIdDGX;
- AcDbPolyline* pLineDGX = NULL;
- AcDb3dPolyline* pLine3dDGX = NULL;
- AcDb2dPolyline* pLine2dDGX = NULL;
- AcDbSpline* pSplineDGX = NULL;
-
- //acutPrintf(_T("\nlengthDGX: %d"), lengthDGX);
-
- for (long i = 0; i < lengthDGX; i++)
- {
- // 获得指定元素的ObjectId
- ads_name entDGX;
- acedSSName(ssDGX, i, entDGX);
- acdbGetObjectId(objIdDGX, entDGX);
-
- //使用ARX智能指针打开对象,实体类对象可以使用这种方式直接打开.
- AcDbObjectPointer<AcDbEntity> pEntDGX(objIdDGX, AcDb::kForRead);
- //判断是否打开成功
- //注意ARX智能指针使用智能指针成员函数的时候是点符号"."不是指针符号"->"
- if (Acad::eOk != pEntDGX.openStatus())
- {
- //根据情况做打开失败处理
- acutPrintf(_T("\n(c)打开等高线对象失败! 错误码: %s"), acadErrorStatusText(pEntDGX.openStatus()));
- continue;
- }
- //样条曲线
- if (pEntDGX->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 <= num5; j++)
- {
- pt0.x = xmin + j * nVW;
- pt0.y = baseY - delty - dH_ad;
- pt1.x = pt0.x;
-
- pt1.y = pt0.y - 1.0;
- CPolylineUtil::Add(pt0, pt1, 0);
-
- if (j % 5 == 0)
- {
- pt1.y = pt0.y - 2.0;
- CPolylineUtil::Add(pt0, pt1, 0);
- }
- if ((j % 10) == 0)
- {
- pt1.y = pt0.y - 3.0;
- CPolylineUtil::Add(pt0, pt1, 0);
-
- csText = CConvertUtil::ToString(j * nVW * nRatioX, 0);
- CTextUtil::AddText(AcGePoint3d(pt0.x, pt0.y - 5.0, 0), csText, AcDb::kTextMid, 0.8, AcDbObjectId::kNull, 2.0, 0);
-
- //绘制竖直背景网格
- if (iBox == 2 || iBox == 3)
- {
- pt0.y = baseY - delty;
- pt1.y = baseY + (num - 1) * delty;
- CPolylineUtil::AddPolylineWithColor(pt0, pt1, 8, 0);
- }
- }
-
- }
- //当切线为折线时,在剖面中折线结点处绘制竖线
- if (pLine->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 << ii << "\t" << polyLinexy[j].x - polyLinexy[0].x << "\t" << pl_pt[j].z0 << endl;
- }
-
- //确定下一个剖面基点坐标
- if (bSetV)
- {
- ptbase.y += ydist + 100;//竖向放置剖面
- }
- else
- {
- ptbase.x += xdist + 100;//横向放置剖面
- }
-
- pl_pt.clear();
-
- #if ACADV_RELMAJOR > 18
- pl_pt.shrink_to_fit();
- #endif
- polyLinexy.removeAll();
- }
- fout.close();
-
- ShellExecute(NULL, _T("open"), fn, NULL, NULL, SW_SHOWNORMAL);
-
- // 释放内存
- acedSSFree(ss); // 删除选择集
- // 释放内存
- acedSSFree(ssDGX); // 删除选择集
-
- // 还原状态栏之前的样子
- //acedRestoreStatusBar();
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。