hexagon logo

creating a cylinder in a V-Block : analytical solution

In the code below, PL1 and PL2 should be measured planes :
"Radius" is the radius of cylinder to create.
Except for the planes, all the features are constructed from assignments.

PL1 =GENERIC/PLANE,DEPENDENT,CARTESIAN,$
NOM/XYZ,<20,0,0>,$
MEAS/XYZ,<20,0,0>,$
NOM/IJK,<0.5,0.7071068,0.5>,$
MEAS/IJK,<0.5,0.7071068,0.5>

PL2 =GENERIC/PLANE,DEPENDENT,CARTESIAN,$
NOM/XYZ,<0,0,5>,$
MEAS/XYZ,<0,0,5>,$
NOM/IJK,<0.4472136,0,0.8944272>,$
MEAS/IJK,<0.4472136,0,0.8944272>

ASSIGN/RADIUS=10

PL1BIS =GENERIC/PLANE,DEPENDENT,CARTESIAN,$ (offset plane from PL1)
NOM/XYZ,<PL1.X+RADIUS*PL1.I,PL1.Y+RADIUS*PL1.J,PL1.Z+RADIUS*PL1.K>,$
MEAS/XYZ,<PL1.X+RADIUS*PL1.I,PL1.Y+RADIUS*PL1.J,PL1.Z+RADIUS*PL1.K>,$
NOM/IJK,<PL1.I,PL1.J,PL1.K>,$
MEAS/IJK,<PL1.I,PL1.J,PL1.K>

PL2BIS =GENERIC/PLANE,DEPENDENT,CARTESIAN,$ (offset plane from PL2)
NOM/XYZ,<PL2.X+RADIUS*PL2.I,PL2.Y+RADIUS*PL2.J,PL2.Z+RADIUS*PL2.K>,$
MEAS/XYZ,<PL2.X+RADIUS*PL2.I,PL2.Y+RADIUS*PL2.J,PL2.Z+RADIUS*PL2.K>,$
NOM/IJK,<PL2.I,PL2.J,PL2.K>,$
MEAS/IJK,<PL2.I,PL2.J,PL2.K>

ASSIGN/AXE_CYL=CROSS(PL1BIS.IJK,PL2BIS.IJK)

ASSIGN/ANGLE=RAD2DEG(ACOS((DOT(PL1BIS.IJK,PL2BIS.IJK)))) (angle between PL1BIS and PL2BIS)
(here, you can assign ANGLE=ANGLEBETWEEN(PL1BIS.IJK,PL2BIS.IJK), it's exactly the same !)
ASSIGN/DIST_P1_PL2BIS=DOT(PL2BIS.XYZ-PL1BIS.XYZ,PL2BIS.IJK) (distance between barycenter of PL1BIS and PL2BIS)

ASSIGN/PI=ACOS(-1) (calculation of pi)

ASSIGN/DIST_PROJ_INTER=DIST_P1_PL2BIS*TAN(DEG2RAD(ANGLE)-PI/2) (distance between projected point of barycenter on PL2BIS and point of intersection between 2 planes)

ASSIGN/M1=CROSS(AXE_CYL.IJK,PL1BIS.IJK) (vector from barycenter of PL1bis to the intersection line)

ASSIGN/P1I=SQRT(DIST_PROJ_INTER^2+DIST_P1_PL2BIS^2) (distance between barycenter PL1BIS and intersection line)

IF/DIST_P1_PL2BIS<0
ASSIGN/DEC=-P1I*M1
END_IF/

IF/DIST_P1_PL2BIS>0
ASSIGN/DEC=P1I*M1
END_IF/

PT_AXE =GENERIC/POINT,DEPENDENT,CARTESIAN,$ (create a point of cylinder axis)
NOM/XYZ,<PL1BIS.X+DEC.X,PL1BIS.Y+DEC.Y,PL1BIS.Z+DEC.Z>,$
MEAS/XYZ,<PL1BIS.X+DEC.X,PL1BIS.Y+DEC.Y,PL1BIS.Z+DEC.Z>,$
NOM/IJK,<AXE_CYL.I,AXE_CYL.J,AXE_CYL.K>,$
MEAS/IJK,<AXE_CYL.I,AXE_CYL.J,AXE_CYL.K>

CYL1 =GENERIC/CYLINDER,DEPENDENT,CARTESIAN,OUT,$ (create cylinder tangent to 2 planes)
NOM/XYZ,<PT_AXE.X,PT_AXE.Y,PT_AXE.Z>,$
MEAS/XYZ,<PT_AXE.X,PT_AXE.Y,PT_AXE.Z>,$
NOM/IJK,<AXE_CYL.I,AXE_CYL.J,AXE_CYL.K>,$
MEAS/IJK,<AXE_CYL.I,AXE_CYL.J,AXE_CYL.K>,$
RADIUS/RADIUS,RADIUS,$
DISTANCE/20,20

ASSIGN/CHECK_1=DIST3D({CYL1},{PL1})-RADIUS (checking calculation is OK or not !)
ASSIGN/CHECK_2=DIST3D({CYL1},{PL2})-RADIUS

IF/CHECK_1<>0 OR CHECK_2<>0
COMMENT/OPER,NO,FULL SCREEN=YES,AUTO-CONTINUE=NO,
You are wrong !
END_IF/

ELSE/
COMMENT/OPER,NO,FULL SCREEN=YES,AUTO-CONTINUE=NO,
It's OK...
END_ELSE/

If you have enough time to play with it, good luck !