UNPKG

vue2-tunnel-lining

Version:

A Vue2 component for tunnel lining design with MxCAD integration

159 lines (134 loc) 8.69 kB
// src/Cq/LinDrawLK.ts import { McObjectId, MxCpp, McDb, McGePoint3d, McDbPolyline, McDbLine } from "mxcad"; import { MxCADUiPrPoint } from "mxcad" import { LinData } from './LinData'; import { LinDataHelper } from './LInDataHelper'; import { Setting } from '../../Setting/Setting'; import { MxFun } from "mxdraw"; import { CxwDraw } from "../../TunnelCADFns/CxwDraw"; import { Maths } from "../../TunnelCADFns/Maths"; /** * 锚杆绘制类 */ export class LinDrawMg { /** * 绘制锚杆 * @param data 数据对象 * @param set 设置对象 */ public static drawMg(set: Setting.Setting): void { try { const IdCol: McObjectId[] = []; // 获取衬砌内轮廓多段线 const plForthId = set.ChenQi.LT.DicIdCol.get("ForthId_Gq")[0]; const entFor = plForthId.getMcDbEntity() as McDbPolyline const ptForth2 = set.ChenQi.LT.DicForth_Gq.get("ptForth2"); const lts = 1; let ptStartPointOfRockBolt = ptForth2; let ptEndPointOfRockBolt = new McGePoint3d(-ptForth2.x, ptForth2.y, 0); // 拱部锚杆的范围点 let pt_Gb_Y = new McGePoint3d(); // 拱部范围右侧起点 let pt_Gb_Z = new McGePoint3d(); // 拱部范围左侧终点 if (LinData.AngleGb >= LinData.Angle1 * 2) { // 拱部大于90度,则拱部起点在r2范围 pt_Gb_Y = CxwDraw.polarPoint(LinData.O2_y, Math.PI / 2 - (LinData.AngleGb / 2 / 180.0 * Math.PI), LinData.RadiusFourth2); pt_Gb_Z = new McGePoint3d(-pt_Gb_Y.x, pt_Gb_Y.y, 0); } else { // 在r1范围 pt_Gb_Y = CxwDraw.polarPoint(LinData.O1, Math.PI / 2 - (LinData.AngleGb / 2 / 180.0 * Math.PI), LinData.RadiusFourth1); pt_Gb_Z = new McGePoint3d(-pt_Gb_Y.x, pt_Gb_Y.y, 0); } //这里要分区域,修改为:先分别求出各区域的距离范围,再分别取参数画图,但要注意各区域之间间距不同时的顺接问题 ptStartPointOfRockBolt = entFor.getClosestPointTo(ptStartPointOfRockBolt, false).val; // 取得线上最近点 ptEndPointOfRockBolt = entFor.getClosestPointTo(ptEndPointOfRockBolt, false).val; let distStart = entFor.getDistAtPoint(ptStartPointOfRockBolt).val;//布置锚杆范围的右侧起点 let distRightArch = entFor.getDistAtPoint(pt_Gb_Y).val;//拱部右侧距离 let distLeftArch = entFor.getDistAtPoint(pt_Gb_Z).val;//拱部左侧距离 let distLeftEnd = entFor.getDistAtPoint(ptEndPointOfRockBolt).val;//布置锚杆范围的左侧终点 const ptDingDian = entFor.getClosestPointTo(new McGePoint3d(0, LinData.H_ngToO2 + LinData.RadiusFourth1, 0), false).val; // 开挖轮廓中心顶点 let distDingDian = entFor.getDistAtPoint(ptDingDian).val; const len = entFor.getDistAtPoint(ptEndPointOfRockBolt).val - entFor.getDistAtPoint(ptStartPointOfRockBolt).val; // 布置锚杆的长度 const numberOfRockBolt = Math.floor(len / LinData.Dh_leftArch) * 2 + 1; //绘图思路:绘图顺序,右拱部→右边墙→左拱部→左边墙 //若取消某个拱部,绘图会出错 //右拱部,从拱顶点开始画。计算中拱部不+1,边墙+1 const numberOfrightArch = Math.floor((distDingDian - distRightArch) / LinData.Dh_rightArch) * 2; const numberOfrightWall = Math.floor((distRightArch - distStart) / LinData.Dh_rightArch) * 2 + 1 let distOfAnyPointRight = entFor.getDistAtPoint(ptDingDian).val - 1 * (LinData.Dh_rightWall * 0.5); // 锚杆起点距离 //右拱部 if (LinData.Dh_rightArch != 0 && LinData.Dz_rightArch != 0 && LinData.Lm_rightArch) { for (let i = 0; i < numberOfrightArch; i++) { const ptn = entFor.getPointAtDist(distOfAnyPointRight).val; const angleN = Maths.getNormalAngleOfPoint(ptn, plForthId); const pt3dCol: McGePoint3d[] = [ptn, CxwDraw.polarPoint(ptn, angleN, LinData.Lm_rightArch)]; IdCol.push(CxwDraw.addPline(pt3dCol, 0.7, 0.7, 2, true, true)) distOfAnyPointRight = distOfAnyPointRight - (LinData.Dh_leftArch * 0.5); } } //右边墙 if (LinData.Dh_rightWall != 0 && LinData.Dz_rightWall != 0 && LinData.Lm_rightWall) { for (let i = 0; i < numberOfrightWall; i++) { const ptn = entFor.getPointAtDist(distOfAnyPointRight).val; const angleN = Maths.getNormalAngleOfPoint(ptn, plForthId); const pt3dCol: McGePoint3d[] = [ptn, CxwDraw.polarPoint(ptn, angleN, LinData.Lm_rightWall)]; IdCol.push(CxwDraw.addPline(pt3dCol, 0.7, 0.7, 3, true, true)) distOfAnyPointRight = distOfAnyPointRight - (LinData.Dh_rightWall * 0.5); } } const numberOfleftArch = Math.floor((distLeftArch - distDingDian) / LinData.Dh_leftArch) * 2; const numberOfleftWall = Math.floor((distLeftEnd - distLeftArch) / LinData.Dh_leftArch) * 2 + 1 let distOfAnyPointLeft = entFor.getDistAtPoint(ptDingDian).val; // 锚杆起点距离 //左拱部。拱顶正中一根画在左拱部范围 if (LinData.Dh_leftArch != 0 && LinData.Dz_leftArch != 0 && LinData.Lm_leftArch) { for (let i = 0; i < numberOfleftArch + 1; i++) { const ptn = entFor.getPointAtDist(distOfAnyPointLeft).val; const angleN = Maths.getNormalAngleOfPoint(ptn, plForthId); const pt3dCol: McGePoint3d[] = [ptn, CxwDraw.polarPoint(ptn, angleN, LinData.Lm_leftArch)]; IdCol.push(CxwDraw.addPline(pt3dCol, 0.7, 0.7, 1, true, true)) distOfAnyPointLeft = distOfAnyPointLeft + (LinData.Dh_leftArch * 0.5); } } //左边墙 if (LinData.Dh_leftWall != 0 && LinData.Dz_leftWall != 0 && LinData.Lm_leftWall) { for (let i = 0; i < numberOfleftWall; i++) { const ptn = entFor.getPointAtDist(distOfAnyPointLeft).val; const angleN = Maths.getNormalAngleOfPoint(ptn, plForthId); const pt3dCol: McGePoint3d[] = [ptn, CxwDraw.polarPoint(ptn, angleN, LinData.Lm_leftWall)]; IdCol.push(CxwDraw.addPline1(pt3dCol, 0.7, 5, "DASHED", 0.01, true, true)) distOfAnyPointLeft = distOfAnyPointLeft + (LinData.Dh_leftWall * 0.5); } } // if (numberOfRockBolt > 1) { // // 考虑梅花型布置,拱顶处必须有一根锚杆 // let distOfPoint = entFor.getDistAtPoint(ptDingDian).val - (numberOfRockBolt - 1) / 2 * (LinData.Dh_rightWall * 0.5); // 锚杆起点距离 // for (let i = 0; i < numberOfRockBolt; i++) { // const ptn = entFor.getPointAtDist(distOfPoint).val; // const angleN = Maths.getNormalAngleOfPoint(ptn, plForthId); // let lineType: string; // let color: number; // if (i % 2 === 1) { // lineType = "DASHED"; // color = 2; // } else { // lineType = "CONTINUOUS"; // color = 3; // } // // 判断是否在拱部 // const pt3dCol: McGePoint3d[] = [ptn, CxwDraw.polarPoint(ptn, angleN, LinData.Lm_rightWall)]; // if (entFor.getDistAtPoint(ptn) < entFor.getDistAtPoint(pt_Gb_Y) || // entFor.getDistAtPoint(ptn) > entFor.getDistAtPoint(pt_Gb_Z)) { // // 边墙 // CxwDraw.addPline(pt3dCol, 0.4, 1, 2, true, true) // } else { // // 拱部 // CxwDraw.addPline(pt3dCol, 0.4, 1, 3, true, true) // } // distOfPoint = distOfPoint + (LinData.Dh_leftArch * 0.5); // } // } set.ChenQi.LT.DicIdCol.set("MgIdCol", IdCol); } catch (error) { console.log("错误代码 1105", "提示"); } } }