hexagon logo

Alignment from FCF Datum Shift



I think what vpt (and me) were hoping for was a way to create an alignment that uses the Xact fit shift. There are all sorts of applications for this. Using the available options in best-fit alignment is not the same, because they do not attempt to fit within a tolerance zone.

A few years old but I haven't found anything using search.

SPH1       =GENERIC/SPHERE,DEPENDENT,CARTESIAN,OUT,$
            NOM/XYZ,<0,0,0>,$
            MEAS/XYZ,<0,0,0>,$
            NOM/IJK,<0,0,1>,$
            MEAS/IJK,<0,0,1>,$
            DIAMETER/1,1.1
DIM LOC1= LOCATION OF SPHERE SPH1
AX    NOMINAL       +TOL       -TOL       MEAS        DEV     OUTTOL
D       1.0000     0.2500    -0.2500     1.1000     0.1000     0.0000 ------#--
END OF DIMENSION LOC1
            DATDEF/FEATURE=SPH1,A
            DISPLAYPRECISION/6
FCFLOC1 =POSITION : CIR152_1,CIR152_2,CIR152_3,...
            FEATCTRLFRAME/SHOWNOMS=NO,SHOWPARAMS=NO,SHOWEXPANDED=NO
              SIZE TOLERANCES/33,DIAMETER,0.375,0.005,-0.005
              PRIMARY DIMENSION/POSITION,DIAMETER,0.01,MMC,A,MMC,,
              NOTE/FCFLOC1
            FEATURES/CIR152_1,CIR152_2,CIR152_3,CIR152_4,CIR152_5,
                                CIR152_6,CIR152_7,CIR152_8,CIR152_9,CIR152_10,
                                CIR152_11,CIR152_12,CIR152_13,CIR152_14,
                                CIR152_15,CIR152_16,CIR152_17,CIR152_18,
                                CIR152_19,CIR152_20,CIR152_21,CIR152_22,
                                CIR152_23,CIR152_24,CIR152_25,CIR152_26,
                                CIR152_27,CIR152_28,CIR152_29,CIR152_30,
                                CIR152_31,CIR152_32,CIR152_33,,
            ASSIGN/V1=GETTEXT("DRF_SHIFTX",1,{FCFLOC1})
            ASSIGN/V2=GETTEXT("DRF_SHIFTY",1,{FCFLOC1})
            ASSIGN/V3=GETTEXT("DRF_SHIFTZ",1,{FCFLOC1})
            ASSIGN/V4=GETTEXT("DRF_ROTATIONX",1,{FCFLOC1})*-1
            ASSIGN/V5=GETTEXT("DRF_ROTATIONY",1,{FCFLOC1})*-1
            ASSIGN/V6=GETTEXT("DRF_ROTATIONZ",1,{FCFLOC1})*-1
            FORMAT/TEXT, , ,HEADINGS, , ;NOM,MEAS, , , , , 
DIM BEFORE= LOCATION OF CIRCLE CIR152_1
AX     NOMINAL        MEAS
X     10.153721   10.154507
Y    -27.402826  -27.405035
Z     -8.032519   -8.025360
END OF DIMENSION BEFORE
ALIGN1     =ALIGNMENT/START,RECALL:PREVIOUS,LIST=YES
              ALIGNMENT/ROTATE_OFFSET,V4,ABOUT,XPLUS
              ALIGNMENT/ROTATE_OFFSET,V5,ABOUT,YPLUS
              ALIGNMENT/ROTATE_OFFSET,V6,ABOUT,ZPLUS
              ALIGNMENT/TRANS_OFFSET,XAXIS,V1
              ALIGNMENT/TRANS_OFFSET,YAXIS,V2
              ALIGNMENT/TRANS_OFFSET,ZAXIS,V3
            ALIGNMENT/END
DIM AFTER= LOCATION OF CIRCLE CIR152_1
AX     NOMINAL        MEAS
X     10.151373   10.152161
Y    -27.394485  -27.396694
Z     -8.041472   -8.034312
D      0.376500    0.377383
END OF DIMENSION AFTER
            COMMENT/REPT,
            "Xshift:  "+V1
            "Yshift:  "+V2
            "Zshift:  "+V3
            "Rotation X:  "+V4*-1
            "Rotation Y:  "+V5*-1
            "Rotation Z:  "+V6*-1

The FCF output with datum shift is:


Using a sphere as the only datum seems to allow all 6 degrees to float. There is some small round-off error due to the numbers being used limited to the current DISPLAYPRECISION (not much).

Now what? Trying to actually use this has me baffled. I'd like to simulate the FCF output having the transformed measured coordinates evaluated against the model nominal values. The BEFORE dim has the nominals I want but the AFTER dim has the measured I want (like the FCF output). Inserting & Recalling alignments, Updating Dependent Commands (answering both yes and no) leaves me feeling like I've found my way into a rabbit hole. Maybe Profile dims behave differently?

I'm aware that some settings may influence the results: Update Dependent Commands (warning), UpdateBelowChangedAlignmentDuringExecution (registry), Ignore CAD to part (F5 settings), Allow Fine Tuning of Alignment (F5 settings). I'd really like to get this working inline without resorting to any type of external automation if possible. Can someone throw me a bone here? There's gotta be a way to get some mileage out of this.
Parents
  • Kevo - I put this together as something you might be able to use as a skeleton to build on. I'm sure you will want to format the output for your upstream app. I first tried explaining it and gave up (it was easier to just code it). Diameters would need to be added if desired along with the actual TP's. I'm not very familiar with Cypress Enable but it seems to be working fine when inserted as a script command at the end of the program. It saves to the current part program folder then opens in Notepad (remove or comment out as needed). I don't know how you intend on plugging this in so stopped after extracting the coordinate values. Can you outline the data & format needed?


    Gomo, you are very thoughtful & helpful, thank you!
    I already have the part about getting the data to our external app taken care of. I don't know basic well enough to grasp much what your above code does. We assign the data to variables and then create a text file (different than the one you made) that our app can accept for import, using pcdmis I/O commands. I could send you a sample file sometime if you'd like to see our methods.

    The expression builder meets our needs except when it comes to getting data out of Xact re supporting data for ⌖ using MMB on datum's and composite ⌖.
    So what I really needed to know were "the magic words" for asking for that sort of data.
    This is what the GETTEXT("DRF_ROTATIONX",1,{FCFLOC1}) sort of code provides for me.

    Please confirm if I have come to the correct understanding of what these codes are providing:
    These are the XYZ locations AFTER DRF Shift and Rotation to achieve "best fit"
    (Note, these are also accessible through the expression Builder, so I'll probably use EXPBLDR to access them):

    ASSIGN/BF1_X=GETTEXT("SUMMARY_MEAS",1,{FCFLOC1}) or EXPBLDR: ASSIGN/V2=FCF_IT14TOP.X.MEAS
    ASSIGN/BF1_Y=GETTEXT("SUMMARY_MEAS",2,{FCFLOC1}) or EXPBLDR: ASSIGN/V2=FCF_IT14TOP.Y.MEAS
    ASSIGN/BF1_Z=GETTEXT("SUMMARY_MEAS",3,{FCFLOC1}) or EXPBLDR: ASSIGN/V2=FCF_IT14TOP.Z.MEAS
    These are the AMOUNTS of Lateral shift done to XYZ locations to achieve "best fit":
    ASSIGN/V1=GETTEXT("DRF_SHIFTX",1,{FCFLOC1})
    ASSIGN/V2=GETTEXT("DRF_SHIFTY",1,{FCFLOC1})
    ASSIGN/V3=GETTEXT("DRF_SHIFTZ",1,{FCFLOC1})
    These are the AMOUNTS of Rotational shift done to the DRF to achieve "best fit":
    ASSIGN/BF1ROTX=GETTEXT("DRF_ROTATIONX",1,{FCF_IT14TOP})
    ASSIGN/BF1ROTY=GETTEXT("DRF_ROTATIONY",1,{FCF_IT14TOP})
    ASSIGN/BF1ROTZ=GETTEXT("DRF_ROTATIONZ",1,{FCF_IT14TOP})
    In regards to the last group, I presume that these rotated values are in decimals of degrees relative to the original DRF?

    Thanks again for all your help!Smiley
Reply
  • Kevo - I put this together as something you might be able to use as a skeleton to build on. I'm sure you will want to format the output for your upstream app. I first tried explaining it and gave up (it was easier to just code it). Diameters would need to be added if desired along with the actual TP's. I'm not very familiar with Cypress Enable but it seems to be working fine when inserted as a script command at the end of the program. It saves to the current part program folder then opens in Notepad (remove or comment out as needed). I don't know how you intend on plugging this in so stopped after extracting the coordinate values. Can you outline the data & format needed?


    Gomo, you are very thoughtful & helpful, thank you!
    I already have the part about getting the data to our external app taken care of. I don't know basic well enough to grasp much what your above code does. We assign the data to variables and then create a text file (different than the one you made) that our app can accept for import, using pcdmis I/O commands. I could send you a sample file sometime if you'd like to see our methods.

    The expression builder meets our needs except when it comes to getting data out of Xact re supporting data for ⌖ using MMB on datum's and composite ⌖.
    So what I really needed to know were "the magic words" for asking for that sort of data.
    This is what the GETTEXT("DRF_ROTATIONX",1,{FCFLOC1}) sort of code provides for me.

    Please confirm if I have come to the correct understanding of what these codes are providing:
    These are the XYZ locations AFTER DRF Shift and Rotation to achieve "best fit"
    (Note, these are also accessible through the expression Builder, so I'll probably use EXPBLDR to access them):

    ASSIGN/BF1_X=GETTEXT("SUMMARY_MEAS",1,{FCFLOC1}) or EXPBLDR: ASSIGN/V2=FCF_IT14TOP.X.MEAS
    ASSIGN/BF1_Y=GETTEXT("SUMMARY_MEAS",2,{FCFLOC1}) or EXPBLDR: ASSIGN/V2=FCF_IT14TOP.Y.MEAS
    ASSIGN/BF1_Z=GETTEXT("SUMMARY_MEAS",3,{FCFLOC1}) or EXPBLDR: ASSIGN/V2=FCF_IT14TOP.Z.MEAS
    These are the AMOUNTS of Lateral shift done to XYZ locations to achieve "best fit":
    ASSIGN/V1=GETTEXT("DRF_SHIFTX",1,{FCFLOC1})
    ASSIGN/V2=GETTEXT("DRF_SHIFTY",1,{FCFLOC1})
    ASSIGN/V3=GETTEXT("DRF_SHIFTZ",1,{FCFLOC1})
    These are the AMOUNTS of Rotational shift done to the DRF to achieve "best fit":
    ASSIGN/BF1ROTX=GETTEXT("DRF_ROTATIONX",1,{FCF_IT14TOP})
    ASSIGN/BF1ROTY=GETTEXT("DRF_ROTATIONY",1,{FCF_IT14TOP})
    ASSIGN/BF1ROTZ=GETTEXT("DRF_ROTATIONZ",1,{FCF_IT14TOP})
    In regards to the last group, I presume that these rotated values are in decimals of degrees relative to the original DRF?

    Thanks again for all your help!Smiley
Children
No Data