hexagon logo

Pull actual dimension from FEATURE_CONTROL_FRAME object

While using the pcdmis automation library I am running into difficulty obtaining the actual dimension from a feature control frame object.

When a CommandObject is passed by the OnObjectExecuted event I was assuming that I would use the FCFCommand object to drill down and extract the information I needed.

I can tell that a FEATURE_CONTROL_FRAME object has been passed, but that is as far as I have gotten.

Unfortunately I do not get a lot of time on the computer with PCDMIS to trial and error my way through which members of the CommandObject to use.

For example how would I get to the actual flatness that is output to the report by the pcdmis code when the FEATURE_CONTROL_FRAME object type is passed.
Below is an example of the pcdmis code that I am trying to pull the information from.



PLN3 =FEAT/PLANE,CARTESIAN,TRIANGLE,NO
THEO/<-0.1126,-0.0558,0>,<0,0,1>
ACTL/<-0.1045,-0.0643,-0.0003>,<-0.0006457,0.0011379,0.9999991>
CONSTR/PLANE,BF,PNT1,PNT2,PNT3,PNT4,PNT13,PNT14,PNT15,PNT 16,PNT17,PNT18,PNT19,PNT20,,
OUTLIER_REMOVAL/OFF,3
FILTER/OFF,WAVELENGTH=0


M_105 =FLATNESS : PLN3
FEATCTRLFRAME/SHOWPARAMS=YES,SHOWEXPANDED=YES
CADGRAPH=OFF,REPORTGRAPH=OFF,TEXT=ON,MULT=10.00,AR ROWDENSITY=100,OUTPUT=BOTH,UNITS=IN
PER UNIT=NO,
STANDARDTYPE=ASME_Y14_5
DIMENSION/FLATNESS,0.05
NOTE/M_105
FEATURES/PLN3,,

Thank you in advance if anyone is able to point me in the right direction.

This is for version 2015.1 of the INTEROP.PCDLRN.DLL

  • Maybe Try this in the edit screen.

    ASSIGN/V1 = GETTEXT(647,1,{FCFLOC1})

    ASSIGN/V2 = GETTEXT(688,1,{FCFLOC1})
  • We don't use FCF dimensions, so I don't have to deal with this. However, the topic comes up frequently and the best answer I've seen is to review the PCD2Excel source code.

    There is a recent post where a download link was provided. A search for PCD2Excel should find the post
  • Unfortunately the FCF dimensions are not organized/coded like the other commands, they do not even have .IsDimension TRUE! There's not much help to get from the type library, as there are no obvious subvalues to reference.

    The following is (part of) the FCF handling code in my FEATURE_EXPORT_FCF.BAS file, originally taken from PCD2EXCEL source code, modified and enlarged by me - maybe it can give you some ideas:

    
    Sub HandleFCFdimension(cmd As Object)
    Dim i As Integer
    ' Definitely Not handling composite FCF dimensions yet
    
      elType = cmd.TypeDescription
      elName = cmd.ID
      elComment = CreateDescriptionString(cmd)
    
    ' LINE1_SIZE_TABLE --> general size info On TP (And other?) evaluations - Do Nothing
    '
      ' Do Nothing For the moment, this has To be exported As separate dimensions
      ' If cmd.GetFieldValue(RPT_DIMENSION_TABLES, LINE1_SIZE_TABLE) = 1 Then
      '
      '   For i = 1 To cmd.GetDataTypeCount(LINE1_FEATNAME)
      '     elName = cmd.GetFieldValue(LINE1_FEATNAME, i)
      '     elValueType = cmd.GetFieldValue(LINE1_FEATNAME, i)
      '     elAct = cmd.GetFieldValue(LINE1_MEAS, i)
      '     elNom = cmd.GetFieldValue(LINE1_NOMINAL, i)
      '     elDev = cmd.GetFieldValue(LINE1_DEV, i)
      '     elMtol = cmd.GetFieldValue(LINE1_MINUSTOL, i)
      '     elPtol = cmd.GetFieldValue(LINE1_PLUSTOL, i)
      '     elOutTol = cmd.GetFieldValue(LINE1_OUTTOL, i)
      '     elStarted = 1
      '     PrintLine(fNum)
      '   Next i
      ' End If
    '
    ' LINE2_BASIC_DIMENSION_TABLE --> most simple FCF dimensions, one Or more features
    '
      If cmd.GetFieldValue(RPT_DIMENSION_TABLES, LINE2_BASIC_DIMENSION_TABLE) = 1 Then
    
        For i = 1 To cmd.GetDataTypeCount(LINE2_FEATNAME)
          elValueType = cmd.GetFieldValue(LINE2_FEATNAME, i)
          elAct = cmd.GetFieldValue(LINE2_MEAS, i)
          elNom = cmd.GetFieldValue(LINE2_NOMINAL, i)
          elDev = cmd.GetFieldValue(LINE2_DEV, i)
          elMtol = cmd.GetFieldValue(LINE2_MINUSTOL, i)
          elPtol = cmd.GetFieldValue(LINE2_PLUSTOL, i)
          elOutTol = cmd.GetFieldValue(LINE2_OUTTOL, i)
          elStarted = 1
          PrintLine(fNum)
        Next i
      End If
    '
    ' LINE2_POSITION_TABLE --> True position, one Or more features
    '
      If cmd.GetFieldValue(RPT_DIMENSION_TABLES, LINE2_POSITION_TABLE) = 1 Then
    
        For i = 1 To cmd.GetDataTypeCount(LINE2_FEATNAME)
          elValueType = cmd.GetFieldValue(LINE2_FEATNAME, i)
          If InStr(1, elValueType, ":") = 0 Then
            elAct = cmd.GetFieldValue(LINE2_MEAS, i)
            elNom = "0"
            elDev = cmd.GetFieldValue(LINE2_DEV, i)
            elMtol = "0"
            elPtol = cmd.GetFieldValue(LINE2_TOL, i)
            elOutTol = cmd.GetFieldValue(LINE2_OUTTOL, i)
            elStarted = 1
            PrintLine(fNum)
          End If
        Next i
      End If
    '
    ' LINE2_ORIENTATION_TABLE --> orientation FCF:s
    '
      If cmd.GetFieldValue(RPT_DIMENSION_TABLES, LINE2_ORIENTATION_TABLE) = 1 Then
    
        For i = 1 To cmd.GetDataTypeCount(LINE2_FEATNAME)
          elValueType = cmd.GetFieldValue(LINE2_FEATNAME, i)
          If InStr(1, elValueType, ":") = 0 Then
            elAct = cmd.GetFieldValue(LINE2_MEAS, i)
            elNom = cmd.GetFieldValue(LINE2_NOMINAL, i)
            elDev = cmd.GetFieldValue(LINE2_DEV, i)
            elMtol = "0"
            elPtol = cmd.GetFieldValue(LINE2_TOL, i)
            elOutTol = cmd.GetFieldValue(LINE2_OUTTOL, i)
            elStarted = 1
            PrintLine(fNum)
          End If
        Next i
      End If
    '
    ' LINE3_POSITION_TABLE --> secondary FCF In composite tolerance?
    '
      If cmd.GetFieldValue(RPT_DIMENSION_TABLES, LINE3_POSITION_TABLE) = 1 Then
    
        For i = 1 To cmd.GetDataTypeCount(LINE3_FEATNAME)
          elValueType = cmd.GetFieldValue(LINE3_FEATNAME, i)
          If InStr(1, elValueType, ":") = 0 Then
            elAct = cmd.GetFieldValue(LINE3_MEAS, i)
            elNom = "0"
            elDev = cmd.GetFieldValue(LINE3_DEV, i)
            elMtol = "0"
            elPtol = cmd.GetFieldValue(LINE3_TOL, i)
            elOutTol = cmd.GetFieldValue(LINE3_OUTTOL, i)
            elStarted = 1
            PrintLine(fNum)
          End If
        Next i
      End If
    '
    ' LINE3_ORIENTATION_TABLE --> orientation FCF:s
    '
      If cmd.GetFieldValue(RPT_DIMENSION_TABLES, LINE3_ORIENTATION_TABLE) = 1 Then
    
        For i = 1 To cmd.GetDataTypeCount(LINE3_FEATNAME)
          elValueType = cmd.GetFieldValue(LINE3_FEATNAME, i)
          If InStr(1, elValueType, ":") = 0 Then
            elAct = cmd.GetFieldValue(LINE3_MEAS, i)
            elNom = cmd.GetFieldValue(LINE3_NOMINAL, i)
            elDev = cmd.GetFieldValue(LINE3_DEV, i)
            elMtol = "0"
            elPtol = cmd.GetFieldValue(LINE3_TOL, i)
            elOutTol = cmd.GetFieldValue(LINE3_OUTTOL, i)
            elStarted = 1
            PrintLine(fNum)
          End If
        Next i
      End If
    '
    ' DATUM_SHIFT_TABLE --> translation And rotation of FCF datums when 'Fit To Datums' checked - Do Nothing
    '
      ' If cmd.GetFieldValue(RPT_DIMENSION_TABLES, DATUM_SHIFT_TABLE) = 1 Then
      '   Do Nothing For the moment, this has To be exported In some other way conforming To the JoWin format
      '   For i = 1 To cmd.GetDataTypeCount(DRF_SEGNAME)
      '     elValueType = cmd.GetFieldValue(DRF_SEGNAME, i)
      '     If InStr(1, elValueType, ":") = 0 Then
      '       elAct = cmd.GetFieldValue(DRF_SHIFTX, i)
      '       elNom = cmd.GetFieldValue(DRF_SHIFTY, i)
      '       elDev = cmd.GetFieldValue(DRF_SHIFTZ, i)
      '       elMtol = cmd.GetFieldValue(DRF_ROTATIONX, i)
      '       elPtol = cmd.GetFieldValue(DRF_ROTATIONY, i)
      '       elOutTol = cmd.GetFieldValue(DRF_ROTATIONZ, i)
      '       elStarted = 1
      '       PrintLine(fNum)
      '     End If
      '   Next i
      ' End If
    '
    ' SUMMARY_TABLE --> summary of TP - Do Nothing
    '
      ' If cmd.GetFieldValue(RPT_DIMENSION_TABLES, SUMMARY_TABLE) = 1 Then
      '   Do Nothing For the moment, this has To be exported As separate dimensions
      '   For i = 1 To cmd.GetDataTypeCount(SUMMARY_FEAT)
      '     elName = cmd.GetFieldValue(SUMMARY_FEAT, i)
      '     elValueType = cmd.GetFieldValue(SUMMARY_AXIS, i)
      '     If InStr(1, elName, ":") = 0 Then
      '       elAct = cmd.GetFieldValue(SUMMARY_MEAS, i)
      '       elNom = cmd.GetFieldValue(SUMMARY_NOMINAL, i)
      '       elDev = cmd.GetFieldValue(SUMMARY_DEV, i)
      '       elMtol = "0"
      '       elPtol = "0"
      '       elOutTol = "0"
      '       elStarted = 1
      '       PrintLine(fNum)
      '     End If
      '   Next i
      ' End If
    
    End Sub
    
    
    


    and if you're after information about referenced features and datums, here's another sub:

    
    Function CreateDescriptionString(DmisCmd As Object) As String
    Dim tmp As String
    Dim cnt As Integer
    Dim i As Integer
    
    tmp = DmisCmd.TypeDescription + " ("
    Select Case DmisCmd.Type
      Case DIMENSION_TRUE_START_POSITION, DIMENSION_START_LOCATION, _
           DIMENSION_PROFILE, DIMENSION_PROFILE_LINE, _
           DIMENSION_STRAIGHTNESS, DIMENSION_ROUNDNESS
          tmp = tmp + DmisCmd.GetFieldValue(REF_ID, 0) + ")"
    
      Case DIMENSION_FLATNESS, DIMENSION_RUNOUT
          tmp = tmp + DmisCmd.GetFieldValue(REF_ID, 1) + ")"
    
      Case DIMENSION_3D_ANGLE, DIMENSION_2D_ANGLE, DIMENSION_ANGULARITY, DIMENSION_COAXIALITY, _
           DIMENSION_CONCENTRICITY, DIMENSION_2D_DISTANCE, DIMENSION_3D_DISTANCE, _
           DIMENSION_PARALLELISM, DIMENSION_PERPENDICULARITY, DIMENSION_SYMMETRY
        tmp = tmp + DmisCmd.GetFieldValue(REF_ID, 1) + "," + DmisCmd.GetFieldValue(REF_ID, 2) + ")"
    
      Case FEATURE_CONTROL_FRAME
        cnt = DmisCmd.GetDataTypeCount(REF_ID)
        For i = 1 To cnt
          If i > 1 Then tmp = tmp + ","
          tmp = tmp + DmisCmd.GetFieldValue(REF_ID, i)
        Next
        tmp = tmp + ")"
      Case Else
      tmp = ""
    End Select
    CreateDescriptionString = tmp
    End Function
    
    
  • Happy I found this. I was in the process of figuring this out last night, almost quit. Thanks dph51 now I can continue writing my subroutine.
  • I am probably just overlooking it however I do not see a post that points me at the source code for PCD2Excel.