HarmonyOS鸿蒙Next中在线CAD实现焊接符号的绘制

HarmonyOS鸿蒙Next中在线CAD实现焊接符号的绘制

前言

在工程制图和制造领域,焊接符号(Welding Symbols)是用于表示焊缝类型、尺寸、位置以及工艺要求的标准化图形语言。广泛应用于机械设计、钢结构、船舶制造、压力容器等行业中,帮助技术人员理解焊接意图。

本文将介绍焊接符号的基本结构、符号、含义,并根据焊接符号的特性通过网页CAD实现焊接符号类,实现绘制焊接符号的功能。

image-20250530143231089.png

焊接符号特性分析

一、焊接符号的基本构成

焊接符号由以下几个基本部分组成:

1.参考线:焊接符号的核心部分,通常是一条水平线,所有其他符号都依附于这条线。参考线分为两部分,箭头上面就是上方区域,箭头下面就是下方区域,如下图:

9d2077076.png

2.箭头:箭头指向要焊接的位置,连接参考线和被焊件的具体部位。

3.基本焊接符号:表示焊缝的类型,如角焊缝、对接焊缝等,绘制在参考线的上方或下方。

4.尾部:可选部分,用于标注焊接方法、工艺编号或其他说明信息(如“GTAW”、“SMAW”等)。

5.补充符号:包括现场焊缝符号、周围焊缝符号、熔透深度符号等。

6.尺寸标注:表示焊缝的具体尺寸,如焊脚高度、坡口角度、根部间隙等。

二、焊接符号的附加元素

1.现场焊缝符号:一个小旗子标志,表示该焊缝需在现场施工时完成,而非在工厂内完成。

2.周围焊缝符号:一个圆圈,表示焊缝应围绕整个接合处进行。

3.熔透符号:表示焊接过程中需要完全熔透母材。

4.打底焊道符号:表示打底焊或衬垫焊。

三、焊接尺寸标注方法

焊接符号中常常包含尺寸信息,以指导焊工操作。以下是常见尺寸标注方式:

3.1.角焊缝尺寸标注

-焊脚尺寸(Leg Size):用数字标注在焊缝符号左侧。 -长度:标注在符号右侧。 -间距(Pitch):标注在长度之后,斜杠后加数字。例如:6/25 表示每25mm间距有一个6mm的角焊缝。

3.2.对接焊缝尺寸标注

-坡口角度:标注在符号旁边。 -根部间隙:标注在角度下方。 -钝边厚度:标注在角度另一侧

实现 McDbTestWeldingSymbol 焊接符号自定义实体

  1. 定义符号相关的枚举或接口
 // 符号位置
    enum symbolPos {
        top = 1,
        down
    }
    // 符号名
    enum symbolName {
        // 带垫板符号
        WithPadSymbol,
        // 周围焊接符
        SurroundingWeldSeamSymbol,
        // 现场符号
        OnSiteSymbol,
        // 三面焊缝符号
        ThreeSidedWeldSeamSymbol,
        // 尾部符号
        TailSymbol,
        // 交错断续焊接符号
        ZSymbol,
        // 卷边焊缝
        RolledEdge,
        // I型焊缝
        IWeldSeam,
        // V型焊缝
        VWeldSeam,
        // 单边V型焊缝
        SingleVWeldSeam,
        // 单边陡侧V型坡口堆焊
        SingleSteepVWeldSeam,
        // 倾斜焊缝
        InclinedWeldSeam,
        // 可移除衬垫
        RemovablePadding1,
        RemovablePadding2,
        // 持久衬垫
        DurableLiner,
        // 带顿边V型焊缝
        VFlangedEdgeSeam,
        // 带顿边U型焊缝
        UFlangedEdgeSeam,
        // 带顿边单边V型焊缝
        SingleVFlangedEdgeSeam,
        // 带顿边单边U型焊缝
        SingleUFlangedEdgeSeam,
        // 端接焊缝
        EndWeldSeam,
        // 堆焊接头
        SurfacingJoint,
        // 封底焊缝
        BottomSeamWeld,
        // 角焊缝
        FilletWeld,
        // 塞焊缝或槽焊缝
        GrooveWeldSeam,
        // 点焊缝
        SpotWeldSeam,
        // 折叠接口
        FoldingInterface,
        // 倾斜接口
        InclinedInterface,
        // 点焊缝(偏移中心)
        SpotWeldSeamOffset,
        // 缝焊缝
        SeamWeld,
        // 缝焊缝(偏离中心)
        SeamWeldOffset,
        // 陡侧V型坡口堆焊
        SteepVWeldSeam,
        // 喇叭形焊缝
        BellShapedWeldSeam,
        // 单边喇叭形焊缝
        SingleBellShapedWeldSeam,
        // 堆焊缝
        HeapWeldSeam,
        // 锁边焊缝
        SeamSeam,
        // 锁边坡口
        LockTheSlopeOpening,
        // 第一种平面符号
        FirstPlaneSymbol,
        // 第二种凹面符号
        SecondConcaveSymbol,
        // 第二种凸面符号
        SecondConvexeSymbol,
        // 第二种平面符号
        SecondPlaneSymbol,
        // 第三种平面符号
        ThirdPlaneSymbol,
        // 第一种凸面符号
        FirstConvexeSymbol,
        // 第一种凹面符号
        FirstConcaveSymbol,
        // 削平焊缝
        FlattenWeldSeam,
        // 趾部平滑过渡
        ToeAareaTranSmoothly,
        // 无
        none,
    }
    // 符号类型设置
    interface symbolType {
        typeName: symbolName,
        position?: symbolPos,
        rotation?: number,
        info?: string
    }
    // 符号标注设置
    interface symbolDim {
        position: symbolPos,
        content: string
    }
  1. 基本结构设置
  // 焊接符号自定义实体
    export class McDbTestWeldingSymbol extends McDbCustomEntity {
        // 定义McDbTestWeldingSymbol内部的点对象
        // 标记定位点
        private position: McGePoint3d;
        // 标记转折点
        private turningPt: McGePoint3d;
        // 标记定点
        private fixedPoint: McGePoint3d;
        // 箭头长度
        private size: number = 4;
        // 基本符号
        private baseSymbok: symbolType[] = [];
        // 辅助符号
        private auxiliarySymbol: symbolType[] = [];
        // 特殊符号
        private specialSymbol: symbolType[] = [];
        // 补充符号
        private suppleSymbol: symbolType[] = [];
        // 左尺寸
        private leftDim: symbolDim[] = [];
        // 上尺寸
        private topDim: symbolDim[] = [];
        // 右尺寸
        private rightDim: symbolDim[] = [];
        // 虚线位置:0:无虚线, 1:下虚线,2:上虚线
        private dottedPos: number = 0;
        // 标注内字高
        private height: number = this.size * (7 / 8);
        // 焊接说明
        private weldingInfo: string = '';
        // 交错焊缝
        private interlacedWeldSeam: symbolDim[] = [];

        /** 包围盒最大点 包围盒最小点 */
        private minPt: McGePoint3d = new McGePoint3d();
        private maxPt: McGePoint3d = new McGePoint3d();
    }
  1. 构造函数和创建方法
        // 构造函数
        constructor(imp?: any) {
            super(imp);
        }
        // 创建函数
        public create(imp: any) {
            return new McDbTestWeldingSymbol(imp)
        }
        // 获取类名
        public getTypeName(): string {
            return "McDbTestWeldingSymbol";
        }
  1. 数据持久化
 // 读取自定义实体数据pt1、pt2
        public dwgInFields(filter: IMcDbDwgFiler): boolean {
            this.position = filter.readPoint("position").val;
            this.turningPt = filter.readPoint("turningPt").val;
            this.fixedPoint = filter.readPoint("fixedPoint").val;
            this.size = filter.readDouble("size").val;
            this.dottedPos = filter.readLong("dottedPos").val;
            this.minPt = filter.readPoint("minPt").val;
            this.maxPt = filter.readPoint("maxPt").val;
            const _baseSymbok = filter.readString('baseSymbok').val;
            this.baseSymbok = JSON.parse(_baseSymbok)
            const _AuxiliarySymbol = filter.readString('AuxiliarySymbol').val;
            this.auxiliarySymbol = JSON.parse(_AuxiliarySymbol)
            const _specialSymbol = filter.readString('specialSymbol').val;
            this.specialSymbol = JSON.parse(_specialSymbol)
            const _suppleSymbol = filter.readString('suppleSymbol').val;
            this.suppleSymbol = JSON.parse(_suppleSymbol)
            const _leftDim = filter.readString('leftDim').val;
            this.leftDim = JSON.parse(_leftDim);
            const _topDim = filter.readString('topDim').val;
            this.topDim = JSON.parse(_topDim);
            const _rightDim = filter.readString('rightDim').val;
            this.rightDim = JSON.parse(_rightDim);
            const _interlacedWeldSeam = filter.readString('interlacedWeldSeam').val;
            this.interlacedWeldSeam = JSON.parse(_interlacedWeldSeam);
            this.weldingInfo = filter.readString('weldingInfo').val;
            return true;
        }
        // 写入自定义实体数据pt1、pt2
        public dwgOutFields(filter: IMcDbDwgFiler): boolean {
            filter.writePoint("turningPt", this.turningPt);
            filter.writePoint("position", this.position);
            filter.writePoint("fixedPoint", this.fixedPoint);
            filter.writeDouble("size", this.size);
            filter.writeLong("dottedPos", this.dottedPos);
            filter.writePoint("minPt", this.minPt);
            filter.writePoint("maxPt", this.maxPt);
            filter.writeString('baseSymbok', JSON.stringify(this.baseSymbok));
            filter.writeString('AuxiliarySymbol', JSON.stringify(this.auxiliarySymbol));
            filter.writeString('specialSymbol', JSON.stringify(this.specialSymbol));
            filter.writeString('suppleSymbol', JSON.stringify(this.suppleSymbol));
            filter.writeString('leftDim', JSON.stringify(this.leftDim));
            filter.writeString('topDim', JSON.stringify(this.topDim));
            filter.writeString('rightDim', JSON.stringify(this.rightDim));
            filter.writeString('interlacedWeldSeam', JSON.stringify(this.interlacedWeldSeam));
            filter.writeString('weldingInfo', this.weldingInfo);
            return true;
        }
  1. 设置标注夹点及夹点移动规则
  // 移动自定义对象的夹点
        public moveGripPointsAt(iIndex: number, dXOffset: number, dYOffset: number, dZOffset: number) {
            this.assertWrite();
            if (iIndex === 0) {
                this.position.x += dXOffset;
                this.position.y += dYOffset;
                this.position.z += dZOffset;
            } else if (iIndex === 1) {
                this.turningPt.x += dXOffset;
                this.turningPt.y += dYOffset;
                this.turningPt.z += dZOffset;
            } else if (iIndex === 2) {
                this.fixedPoint.x += dXOffset;
                this.fixedPoint.y += dYOffset;
                this.fixedPoint.z += dZOffset;
            }
        };
        // 获取自定义对象的夹点
        public getGripPoints(): McGePoint3dArray {
            let ret = new McGePoint3dArray()
            ret.append(this.position);
            ret.append(this.turningPt);
            ret.append(this.fixedPoint);
            return ret;
        };
  1. 绘制标注实体
// 绘制实体
        public worldDraw(draw: MxCADWorldDraw): void {
            const allEntityArr = this.getAllEntity();
            allEntityArr.forEach((ent, index) => {
                if(index === allEntityArr.length-1) draw.setupForEntity(ent);
                draw.drawEntity(ent)
            });
        }
        private getAllEntity(): McDbEntity[] {
            const allEntityArr: McDbEntity[] = [];
            const noChangeEntityArr: McDbEntity[] = [];
            // 是否反向
            let isReverse = this.fixedPoint.x < this.position.x ? true : false;
            // 引线结束点
            let lastPt = this.fixedPoint.clone();
            lastPt.addvec(McGeVector3d.kXAxis.clone().mult(this.size * (1 / 8)));
            // 绘制标注线
            const pl = new McDbPolyline();
            pl.addVertexAt(this.position);
            pl.addVertexAt(this.turningPt);
            pl.addVertexAt(this.fixedPoint);
            noChangeEntityArr.push(pl);
            // 绘制标注箭头
            const v = this.turningPoint.sub(this.position).normalize();
            const midPt = this.position.clone().addvec(v.mult(this.size));
            const _v = v.clone().perpVector().mult(this.size * (1 / 8));
            const pt1 = midPt.clone().addvec(_v);
            const pt2 = midPt.clone().addvec(_v.clone().negate());
            const hatch = new McDbHatch();
            hatch.appendLoop(new McGePoint3dArray([pt1, pt2, this.position]));
            noChangeEntityArr.push(hatch);
            // 绘制补充符号
            if (this.suppleSymbol.length) {
                const { entityArr, noChangeArr, v } = this.drawSuppleSymbol(isReverse);
                lastPt.addvec(v);
                allEntityArr.push(...entityArr);
                noChangeEntityArr.push(...noChangeArr);
            }
            // 绘制左尺寸
            if (this.leftDim.length) {
                const { entityArr, v } = this.drawLeftDim(lastPt);
                lastPt.addvec(v);
                allEntityArr.push(...entityArr)
            }
            // 绘制特殊符号
            if (this.specialSymbol.length) {
                const { entityArr } = this.drawSpecialSymbol(lastPt);
                allEntityArr.push(...entityArr);
                    lastPt.addvec(McGeVector3d.kXAxis.clone().mult(this.size / 2))
            }
            if (this.suppleSymbol.length && this.suppleSymbol.filter(item => item.typeName === symbolName.WithPadSymbol).length) {
                const entityArr = this.drawWidth(lastPt);
                allEntityArr.push(...entityArr);
            }
            // 绘制基本符号
            if (this.baseSymbok.length) {
                const { entityArr } = this.drawBasicSymbol(lastPt);
                allEntityArr.push(...entityArr);
            }
            // 绘制辅助符号
            if (this.auxiliarySymbol.length) {
                const { entityArr } = this.drawAuxiliarySymbol(lastPt);
                allEntityArr.push(...entityArr);
            }
            // 绘制上尺寸
            if (this.topDim.length) {
                const { entityArr } = this.drawTopDim(lastPt);
                allEntityArr.push(...entityArr)
            }
            lastPt.addvec(McGeVector3d.kXAxis.clone().mult(this.size * (7 / 4)));
            // 绘制右尺寸
            if (this.rightDim.length) {
                const { entityArr, v } = this.drawRightDim(lastPt);
                lastPt.addvec(v);
                allEntityArr.push(...entityArr)
            }
            lastPt.addvec(McGeVector3d.kXAxis.clone().mult(this.size * (4 / 8)));
            // 绘制交错断续焊接符号
            if (this.suppleSymbol.length && this.suppleSymbol.filter(item => item.typeName === symbolName.ZSymbol).length) {
                if (this.baseSymbok.length || this.suppleSymbol.filter(item => item.typeName === symbolName.WithPadSymbol)) lastPt.addvec(McGeVector3d.kXAxis.clone().mult(this.size / 2));
                const distanceVec = McGeVector3d.kXAxis.clone().mult(this.size * (1 / 16));
                const v_y = McGeVector3d.kYAxis.clone().mult(this.size * (17 / 16));
                const v_x = McGeVector3d.kXAxis.clone().mult(this.height).negate();
                const pt2 = lastPt.clone().addvec(v_y);
                const pt4 = lastPt.clone().addvec(v_y.clone().negate());
                const pt1 = pt2.clone().addvec(v_x);
                const pt3 = pt4.clone().addvec(v_x);
                const pl = new McDbPolyline();
                pl.addVertexAt(pt1);
                pl.addVertexAt(pt2);
                pl.addVertexAt(pt3);
                pl.addVertexAt(pt4);
                allEntityArr.push(pl);
                if (this.interlacedWeldSeam.length) {
                    let maxPt_x = null;
                    this.interlacedWeldSeam.forEach(item => {
                        const text = new McDbMText();
                        text.contents = item.content;
                        text.textHeight = this.height;
                        text.attachment = McDb

更多关于HarmonyOS鸿蒙Next中在线CAD实现焊接符号的绘制的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中,在线CAD实现焊接符号绘制主要依赖ArkUI框架和Canvas组件。通过声明式UI描述焊接符号的几何结构,利用Canvas的2D绘图API(如moveTo、lineTo、arc)绘制基本形状。可结合Path2D定义复杂符号路径,使用属性动画实现动态效果。数据驱动更新通过状态管理(如@State)响应符号参数变化。最终在自定义组件中集成Canvas,完成符号的渲染与交互。

更多关于HarmonyOS鸿蒙Next中在线CAD实现焊接符号的绘制的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个非常专业且完整的HarmonyOS Next在线CAD焊接符号实现方案。您对焊接符号的标准化结构分析得很透彻,并且基于MxCAD库的McDbCustomEntity自定义实体实现思路清晰。

从技术实现角度看,您的方案有几个关键亮点:

  1. 结构设计合理:将焊接符号分解为基本符号、辅助符号、补充符号等组件,通过枚举和接口定义,符合工程制图标准。

  2. 数据持久化完善dwgInFieldsdwgOutFields方法确保了自定义实体在HarmonyOS Next环境中的序列化和反序列化能力。

  3. 交互体验良好:夹点编辑功能(getGripPointsmoveGripPointsAt)让用户可以直接操作符号的关键控制点。

  4. 绘制逻辑清晰worldDraw方法中的分层绘制策略(引线、箭头、符号、尺寸标注)逻辑清晰,维护性好。

在HarmonyOS Next环境下,这种基于Web的CAD方案能够充分利用ArkTS/ArkUI的图形能力。您提到的与圆弧、直线等几何实体自动对齐的功能,通过计算切线方向确定标注角度,这是工程CAD应用的典型需求。

对于实际部署,建议关注HarmonyOS Next的渲染性能优化,特别是在移动设备上绘制复杂焊接符号时的流畅性。可以考虑:

  • 利用HarmonyOS的图形引擎进行硬件加速
  • 对频繁绘制的符号元素进行缓存
  • getBoundingBox中精确计算包围盒,避免不必要的重绘

这个实现方案已经具备了生产环境使用的基础,后续可以根据具体行业标准(如ISO 2553、AWS A2.4等)进一步扩展符号库和标注规则。

回到顶部