使用DMIS来给出点轮廓公差的算法实现_html


    在车身及薄壁件的测量当中,经常需要评价点轮廓公差并给出报告,但是点轮廓的具体意义是什么呢?

 

     很多人误以为是理论点和实际点的距离,这个理解是错误的;比较常用的一个说法将点轮廓公差叫做点的综合误差,也就是在法矢方向的误差,这个误差值有正负区分;当实际点相对于理论点及理论法矢在正方向,点轮廓为正;否则为负;


     如下图:黑色原点及箭头为理论点和理论法矢,红色原点和蓝色原点分别为在正方向和负方向的2个实测点,那么点轮廓绝对值就是将实测点投影到过理论点以理论法矢为方向的直线上得到的投影点和理论点之间的距离;

使用DMIS来给出点轮廓公差的算法实现_出点_02

 

 

在DMIS标准中点轮廓公差的定义说明如下:

TOL/PROFP: Specifies a profile tolerance applied to a point along the normal of the point's corresponding line(curve) or surface

 

算法原型基于高中数学,空间向量的夹角和距离公式,可参考以下网址的材料辅助理解:

 https://wenku.baidu.com/view/0dc0a1dc7f1922791688e8e4.html

以下给出演示算法的DMIS程序: 

 

$$ Calc point profile

$$ By FuHaixin,  Ver:20170511

M(PtProfile)=MACRO/'PtLabel'

 DECL/COMMON,DOUBLE,NOMX, NOMY, NOMZ, NOMI, NOMJ, NOMK

 DECL/COMMON,DOUBLE,ACTX, ACTY, ACTZ

 DECL/COMMON,DOUBLE,PtDist

 

 NOMX = OBTAIN/F(@PtLabel),3

 NOMY = OBTAIN/F(@PtLabel),4

 NOMZ = OBTAIN/F(@PtLabel),5

 NOMI = OBTAIN/F(@PtLabel),6

 NOMJ = OBTAIN/F(@PtLabel),7

 NOMK = OBTAIN/F(@PtLabel),8

 ACTX = OBTAIN/FA(@PtLabel),3

 ACTY = OBTAIN/FA(@PtLabel),4

 ACTZ = OBTAIN/FA(@PtLabel),5

 

 $$ 计算理论点实际点距离

 PtDist = ASSIGN/ SQRT( (NOMX-ACTX)*(NOMX-ACTX) + (NOMY-ACTY)*(NOMY-ACTY) + (NOMZ-ACTZ)*(NOMZ-ACTZ) )

 

 

 

 DECL/COMMON,VECTOR,VcAct2Nom 

 DECL/COMMON,DOUBLE, VcAct2NomI, VcAct2NomJ, VcAct2NomK

 $$ 得到实际点和理论点连线的向量,并将向量单位化;

 VcAct2Nom = ASSIGN/ VCART( NOMX-ACTX, NOMY-ACTY, NOMZ-ACTZ )

 VcAct2Nom = ASSIGN/ VUNIT( VcAct2Nom )

 VcAct2NomI = ASSIGN/ VECX( VcAct2Nom )

 VcAct2NomJ = ASSIGN/ VECY( VcAct2Nom ) 

 VcAct2NomK = ASSIGN/ VECZ( VcAct2Nom ) 

 

 $$ 计算点轮廓结果;

 DECL/COMMON,DOUBLE,COSAngle , PtProf

 COSAngle = ASSIGN/ (NOMI*VcAct2NomI +NOMJ*VcAct2NomJ +NOMK*VcAct2NomK) / SQRT( NOMI*NOMI+ NOMJ*NOMJ+ NOMK*NOMK ) / SQRT( VcAct2NomI*VcAct2NomI+ VcAct2NomJ*VcAct2NomJ+ VcAct2NomK*VcAct2NomK )

 PtProf = ASSIGN/ COSAngle * PtDist * -1

 

 $$ WRITE/DID(DefaultScreen),PtProf

 

ENDMAC

 

CALL/M(PtProfile),'PT1'

CALL/M(PtProfile),'PT2'

CALL/M(PtProfile),'PT3'

CALL/M(PtProfile),'PT4'

CALL/M(PtProfile),'PT5'

CALL/M(PtProfile),'PT6'

CALL/M(PtProfile),'PT7'

CALL/M(PtProfile),'PT8'

CALL/M(PtProfile),'PT9'

CALL/M(PtProfile),'PT10'