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?

    Sub Main()
    	Dim oApp As Object
    	Dim oPart As Object
    	Dim oCmds As Object
    	Dim oCmd As Object
    	Dim oShell As Object
    	dim iNumCmds as Integer
    	Dim i As Integer, j As Integer
    	Dim iFeats As Integer, iVals As Integer, iSegs As Integer
    	Dim sOut As String
    	Dim sFile As String
    	Dim FF As Long
    
    	Set oApp = CreateObject("PCDLRN.Application")
    	Set oPart = oApp.ActivePartProgram
    	Set oCmds = oPart.Commands
    
    	sFile = Left(oPart.FullName, Len(oPart.FullName) - 4) & "_" & oPart.SerialNumber & "_FcfDims.txt"
    	FF = FreeFile
    	Open sFile For Output As #FF
    
    	For each oCmd in oCmds
    		If oCmd.TypeDescription = "FCF Position" And oCmd.Marked And oCmd.GetText(OUTPUT_TYPE, 1) <> "NONE" Then
    			iFeats = oCmd.GetDataTypeCount(REF_ID)  '# of features
    			iSegs = oCmd.GetDataTypeCount(DRF_SEGNAME)  '1 or 2 tier FCF
    			iVals = oCmd.GetDataTypeCount(SUMMARY_MEAS) / iFeats / iSegs  '# values per feature
    
    			sOut = oCmd.ID
    			For i = 1 To iVals
    			  sOut = sOut & "," & oCmd.GetText(SUMMARY_AXIS, i)  'X,Y,Z,PR,PA from FCF Advanced Tab
    			Next i
    			Print #FF, sOut  'output header line for dimension
    			For i = 1 To iVals * iFeats * iSegs - iVals + 1 Step iVals
    				sOut = oCmd.GetText(SUMMARY_FEAT, i)  'segment & feature name
    				For j = 0 To iVals - 1
    					sOut = sOut & "," & oCmd.GetText(SUMMARY_MEAS, i + j)  'all values for this segment of this feature
    				Next j
    				Print #FF, sOut  'output all values for each feature in each segment
    			Next i
    		End If
    	Next oCmd
    	Close #FF
    
    	Set oShell = CreateObject("WScript.Shell")
    	oShell.Run "notepad.exe " & sFile
    
    	Set oShell = Nothing
    	Set oCmd = Nothing
    	Set oCmds = Nothing
    	Set oPart = Nothing
    	Set oApp = Nothing
    End Sub


    The output would look something like:
    FCFLOC2,X,Y,Z,PR,PA
    Segment 1:CIR3,3.6689,0.7566,0,3.7461,11.6516
    Segment 1:CIR4,6.0651,0.756,0,6.1121,7.1055
    Segment 1:CIR5,6.0596,3.1535,0,6.8311,27.4931
    Segment 1:CIR6,3.6607,3.1513,0,4.8303,40.7229
    Segment 2:CIR3,3.685,0.7716,0,3.7649,11.8259
    Segment 2:CIR4,6.0812,0.7679,0,6.1295,7.1973
    Segment 2:CIR5,6.0788,3.1654,0,6.8536,27.5074
    Segment 2:CIR6,3.6799,3.1663,0,4.8546,40.7096
    


    (working in 2015.1)
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?

    Sub Main()
    	Dim oApp As Object
    	Dim oPart As Object
    	Dim oCmds As Object
    	Dim oCmd As Object
    	Dim oShell As Object
    	dim iNumCmds as Integer
    	Dim i As Integer, j As Integer
    	Dim iFeats As Integer, iVals As Integer, iSegs As Integer
    	Dim sOut As String
    	Dim sFile As String
    	Dim FF As Long
    
    	Set oApp = CreateObject("PCDLRN.Application")
    	Set oPart = oApp.ActivePartProgram
    	Set oCmds = oPart.Commands
    
    	sFile = Left(oPart.FullName, Len(oPart.FullName) - 4) & "_" & oPart.SerialNumber & "_FcfDims.txt"
    	FF = FreeFile
    	Open sFile For Output As #FF
    
    	For each oCmd in oCmds
    		If oCmd.TypeDescription = "FCF Position" And oCmd.Marked And oCmd.GetText(OUTPUT_TYPE, 1) <> "NONE" Then
    			iFeats = oCmd.GetDataTypeCount(REF_ID)  '# of features
    			iSegs = oCmd.GetDataTypeCount(DRF_SEGNAME)  '1 or 2 tier FCF
    			iVals = oCmd.GetDataTypeCount(SUMMARY_MEAS) / iFeats / iSegs  '# values per feature
    
    			sOut = oCmd.ID
    			For i = 1 To iVals
    			  sOut = sOut & "," & oCmd.GetText(SUMMARY_AXIS, i)  'X,Y,Z,PR,PA from FCF Advanced Tab
    			Next i
    			Print #FF, sOut  'output header line for dimension
    			For i = 1 To iVals * iFeats * iSegs - iVals + 1 Step iVals
    				sOut = oCmd.GetText(SUMMARY_FEAT, i)  'segment & feature name
    				For j = 0 To iVals - 1
    					sOut = sOut & "," & oCmd.GetText(SUMMARY_MEAS, i + j)  'all values for this segment of this feature
    				Next j
    				Print #FF, sOut  'output all values for each feature in each segment
    			Next i
    		End If
    	Next oCmd
    	Close #FF
    
    	Set oShell = CreateObject("WScript.Shell")
    	oShell.Run "notepad.exe " & sFile
    
    	Set oShell = Nothing
    	Set oCmd = Nothing
    	Set oCmds = Nothing
    	Set oPart = Nothing
    	Set oApp = Nothing
    End Sub


    The output would look something like:
    FCFLOC2,X,Y,Z,PR,PA
    Segment 1:CIR3,3.6689,0.7566,0,3.7461,11.6516
    Segment 1:CIR4,6.0651,0.756,0,6.1121,7.1055
    Segment 1:CIR5,6.0596,3.1535,0,6.8311,27.4931
    Segment 1:CIR6,3.6607,3.1513,0,4.8303,40.7229
    Segment 2:CIR3,3.685,0.7716,0,3.7649,11.8259
    Segment 2:CIR4,6.0812,0.7679,0,6.1295,7.1973
    Segment 2:CIR5,6.0788,3.1654,0,6.8536,27.5074
    Segment 2:CIR6,3.6799,3.1663,0,4.8546,40.7096
    


    (working in 2015.1)
Children
No Data