vue2-tunnel-lining
Version:
A Vue2 component for tunnel lining design with MxCAD integration
159 lines (134 loc) • 8.69 kB
text/typescript
// 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", "提示");
}
}
}