hexagon logo

VB.NET for PC DMIS

I am new to using PCDMIS.

ASSIGN/V3=SYSTEMDATE("MM'/'dd'/'yy")
ASSIGN/V4=SYSTEMTIME("hh:mm:ss tt")
ASSIGN/V5=DIST1.DEV
ASSIGN/V6=DIST2.DEV
ASSIGN/V7=DIST3.DEV
ASSIGN/V8=DIST4.DEV
ASSIGN/V9=DIST5.DEV
ASSIGN/V10=DIST9.DEV
ASSIGN/V11=DIST10.DEV
ASSIGN/V12=DIST6.DEV
ASSIGN/V13=DIST7.DEV
ASSIGN/V14=DIST11.DEV
ASSIGN/V15=DIST12.DEV
ASSIGN/V16=DIST8.DEV
ASSIGN/V17=DIST19.DEV
ASSIGN/V18=LOC1.X.DEV
ASSIGN/V19=LOC1.Y.DEV
ASSIGN/V20=LOC2.X.DEV
ASSIGN/V21=LOC2.Y.DEV
ASSIGN/V22=LOC3.X.DEV
ASSIGN/V23=LOC3.Y.DEV
ASSIGN/V24=LOC4.X.DEV
ASSIGN/V25=LOC4.Y.DEV
ASSIGN/V26=LOC5.X.DEV
ASSIGN/V27=LOC5.Y.DEV
ASSIGN/V28=LOC6.X.DEV
ASSIGN/V29=LOC6.Y.DEV
ASSIGN/V30=LOC7.X.DEV
ASSIGN/V31=LOC7.Y.DEV
ASSIGN/V32=LOC8.X.DEV
ASSIGN/V33=LOC8.Y.DEV
ASSIGN/V34=LOC9.X.DEV
ASSIGN/V35=LOC9.Y.DEV
ASSIGN/V36=LOC10.X.DEV
ASSIGN/V37=LOC10.Y.DEV
ASSIGN/V38=LOC16.X.DEV
ASSIGN/V39=LOC16.Y.DEV
ASSIGN/V40=LOC11.X.DEV
ASSIGN/V41=LOC11.Y.DEV
ASSIGN/V42=DIST13.DEV
ASSIGN/V43=DIST14.DEV
ASSIGN/V44=DIST15.DEV
ASSIGN/V1=DIST16.DEV
ASSIGN/V45=DIST17.DEV
ASSIGN/V46=DIST18.DEV
ASSIGN/V47=LOC12.X.DEV
ASSIGN/V48=LOC12.Y.DEV
ASSIGN/V49=LOC13.X.DEV
ASSIGN/V50=LOC13.Y.DEV
ASSIGN/V51=LOC14.X.DEV
ASSIGN/V52=LOC14.Y.DEV
ASSIGN/V53=LOC15.X.DEV
ASSIGN/V54=LOC15.Y.DEV
ASSIGN/V97="Date"+","+"Time"+","+"1.60 .190-32"+","+"1.60 5/16-24"+","+"1.00 Spot"+","+".8701 Spool"+","+".8701 5/16-24"
ASSIGN/V98=".8701 .452"+","+".8701 1/2-20"+","+"1.7902 Spool"+","+"1.7902 5/16-24"+","+"1.7902 .750"+","+"1.7902 7/8-14"
ASSIGN/V99=".6496 Spot"+","+"3.7780 Spot"+","+".2165 #1 x"+","+".2165 #1 y"+","+".2165 #2 x"+","+".2165 #2 y"
ASSIGN/V100=".2165 #3 x"+","+".2165 #3 y"+","+".2165 #4 x"+","+".2165 #4 y"+","+".156 #1 x"+","+".156 #1 y"
ASSIGN/V101=".156 #2 x"+","+".156 #2 y"+","+"Spot #6 x"+","+"Spot #6 y"+","+"Spot #5 x"+","+"Spot #5 y"
ASSIGN/V102="Spot #7 x"+","+"Spot #7 y"+","+".1256 x"+","+".1256 y"+","+".272 x"+","+".272 y"+","+"5/16-24 #1 x"
ASSIGN/V103="5/16-24 #1 y"+","+"TP tol (2x)"+","+".8701 7/16-20 #1"+","+".8701 7/16-20 #2"+","+"1.60 7/16-20 #1"+","+"1.60 7/16-20 #2"
ASSIGN/V104=".752 Spot Front"+","+".752 Spot Back"+","+"Spot #1 x"+","+"Spot #1 y"+","+"Spot #2 x"
ASSIGN/V105="Spot #2 y"+","+"Spot #3 x"+","+"Spot #3 y"+","+"Spot #4 x"+","+"Spot #4 y"
ASSIGN/V109=V3+","+V4+","+V5+","+V6+","+V7+","+V8+","+V9+","+V10+","+V11+","+V12+","+V13+","+V14+","+V15
ASSIGN/V110=V16+","+V17+","+V18+","+V19+","+V20+","+V21+","+V22+","+V23+","+V24+","+V25+","+V26+","+V27
ASSIGN/V111=V28+","+V29+","+V30+","+V31+","+V32+","+V33+","+V34+","+V35+","+V36+","+V37+","+V38+","+V39
ASSIGN/V112=V40+","+V41+","+V2+","+V42+","+V43+","+V44+","+V1+","+V45+","+V46+","+V47+","+V48+","+V49+","+V50+","+V51
ASSIGN/V113=V52+","+V53+","+V54

above is a portion of code.

Dim app As PCDLRN.Application
Dim cmds As Object
Dim cmd As PCDLRN.Command
Dim part As PCDLRN.PartProgram
Dim data As PCDLRN.ReportData
Dim rWin As PCDLRN.ReportWindow

Dim s As String = ""

app = GetObject("", "PCDLRN.Application.12.1")
app.Visible = True
part = app.ActivePartProgram
cmds = part.Commands

Dim nCommands As String = part.Commands.Count.ToString
Dim val As String = part.GetVariableValue("PLN1").StringValue.ToString

MessageBox.Show("Value is -- " & val & "--" & nCommands)

For Each cmd In cmds
'Dim assignName As Object = cmd.GetText(PCDLRN.ENUM_FIELD_TYPES.DEST_EXPR, 0)
'Console.WriteLine(assignName.ToString)
Console.WriteLine(cmd.TypeDescription.ToString & " " & cmd.Type & " " & cmd.GetFieldValue())
'Console.WriteLine(part.GetVariableValue(assignName).CommandValue.ToString)
Next

'rWin = part.ReportWindow
'data = rWin.Pages

'Dim dat As String = data.GetValue(PCDLRN.ENUM_FIELD_TYPES.AXIS_NOMINAL, 1107)
'MessageBox.Show(dat)

and above is the VB.NET code I am using to access CMM code. I want to get all the values inside ASSIGN/x=y commands eg: ASSIGN/V113=V52+","+V53+","+V54. Can anyone share code to get these values ? I am trying to use Command.GetFieldValue(PCDLRN ENUM FIELD TYPE, TYPE INDEX ) , I do not understand what are these two parameters inside the GetFieldValue method ? Any help will be appreciated.
  • cmd.GetText is a bad choice for determining things, as it depends on the language you're running PC-DMIS in. There are lots of helper functions on the CMD class. Here's a part of my FEATURE_EXPORT.BAS script:

    
      For ix = 1 To DmisCommands.Count
        Set DmisCommand = DmisCommands(ix)
    
        If DmisCommand.IsDimension Then
          Set DmisDimension = DmisCommand.DimensionCommand
    
          Select Case State
            Case 1 '  Normal Case
    
              If (DmisDimension.OutputMode <> DIMOUTPUT_NONE) And (DmisDimension.OutputMode <> DIMOUTPUT_REPORT) Then
                DoOutput = 1
              Else
                DoOutput = 0
              End If
    
              If (DmisDimension.Feat2 <> "") Then
                temp_STR = DmisCommand.TypeDescription
                ID = DmisDimension.ID + "=" + right(temp_STR, len(temp_STR) - instr(1, temp_STR, " ")) + " from " + _
                  DmisDimension.Feat1 + " to " + DmisDimension.Feat2
              Else
                temp_STR = DmisCommand.TypeDescription
                ID = DmisDimension.ID + "=" + right(temp_STR, len(temp_STR) - instr(1, temp_STR, " ")) + " of " + _
                  DmisDimension.Feat1
              End If
    
              If (DmisCommand.Type = DIMENSION_TRUE_START_POSITION) Then
                State = 2
              elseif (DmisCommand.Type = DIMENSION_START_LOCATION) Then
                State = 2
              End If
    
              If (DoOutput = 1) And (State = 1) Then
                PrintLine(fNum)
                ClearRecord
                elType = DmisCommand.TypeDescription
                elName = ID
                elValueType = DmisDimension.AxisLetter
                elNom = DmisDimension.Nominal
                elAct = DmisDimension.Measured
                elDev = DmisDimension.Deviation
                elMtol = -DmisDimension.Minus
                elPtol = DmisDimension.Plus
                elOutTol = DmisDimension.OutTol
    
             ...
    
    


    By casting the DmisCommand to the right subclass (DimensionCommand), you get direct access to the internal data instead of picking out things with GetText(). Note that you first must check that the command really is a dimension command (with .IsDimension)!

    The same technique can be used for any other subclass that has a .IsXxxxx function in the main class. From the type library:

    
      ICommand = dispinterface
        property IsLoadMachine: WordBool dispid 68;
        property IsDimInfo: WordBool dispid 66;
        property IsOptMotion: WordBool dispid 44;
        property IsDCCFeature: WordBool dispid 74;
        property IsDimFormat: WordBool dispid 64;
        property IsLoadProbe: WordBool dispid 62;
        property IsFeature: WordBool dispid 15;
        property IsAlignment: WordBool dispid 14;
        property IsTraceField: WordBool dispid 58;
        property IsFileIOCommand: WordBool dispid 48;
        property IsActiveTip: WordBool dispid 60;
        property IsStatistic: WordBool dispid 56;
        property IsComment: WordBool dispid 54;
        property IsArrayIndex: WordBool dispid 46;
        property IsScan: WordBool dispid 70;
        property IsConstructedFeature: WordBool dispid 73;
        property IsHit: WordBool dispid 71;
        property IsMeasuredFeature: WordBool dispid 72;
        property IsDisplayMetaFile: WordBool dispid 52;
        property IsTempComp: WordBool dispid 50;
        property IsFCFCommand: WordBool dispid 130;
        property IsToolkitCommand: WordBool dispid 116;
        property IsAttach: WordBool dispid 36;
        property IsLeapfrog: WordBool dispid 42;
        property IsExternalCommand: WordBool dispid 38;
        property IsBasicScan: WordBool dispid 16;
        property IsOptionProbe: WordBool dispid 40;
        property IsCalibration: WordBool dispid 34;
        property IsModal: WordBool dispid 19;
        property IsMove: WordBool dispid 20;
        property IsFlowControl: WordBool dispid 18;
        property IsDimension: WordBool dispid 17;
      end;
    
    
  • How to track if a partprogram is closed through vb.net, I have wriiten a vb.net program where all the pcdmis program file is accessed and executed through the vb.net program itself. Hence if operator accidentally closes an active partprogram making another open partprogram active. We want to prevent an operator accidentally executing a wrong partprogram.

    An idea is to track which partprograms are currently open and check which ones are closed. and to compare which program is active and which is not ?

    I saw few IApplication events such as OnPartprogramClose , I am not too sure how to use it
  • Iterate through the PartPrograms collection to find out how many programs are open?
    Use ActivePartProgram.Name and match it to whatever program the operator selected to know that the operatorselected program is the active one?
  • Thanks. Yes I am able to iterate through partprograms collection and track it. I was thinking to find a way to throw an alert when a program gets closed so was trying to check for any event for a partprogram being closed. But it makes sense to track it through matching activepartprogram name againt a collection of open programs.
  • There are Application events available for ClosePartProgram, SavePartProgram and OpenPartProgram. It doesn't look like you can do anything about it in the events (no obvious way to stop them from closing), but throwing an alert should be easy.
  • Private Function getPCDMISAppObject()
            Dim app As PCDLRN.Application
    
            Try
                app = CreateObject("PCDLRN.Application.12.1") 'Using PCD version 2015.1
            Catch ex As Exception
                Try
                    app = CreateObject("PCDLRN.Application.10.1")
                Catch exA As Exception
                    Try
                        app = CreateObject("PCDLRN.Application")
                    Catch exB As Exception
                        MsgBox("PcDmis cannot connect. " & vbNewLine & "(Error - " & ex.Message & ")" & vbNewLine & ex.ToString & vbNewLine & "PcDmis cannot connect. " & vbNewLine & "(Error - " & exA.Message & ")" & vbNewLine & exA.ToString & vbNewLine & "PcDmis cannot connect. " & vbNewLine & "(Error - " & exB.Message & ")" & vbNewLine & exB.ToString, MsgBoxStyle.Critical)
                    End Try
                End Try
            End Try
            Return app
        End Function


    I have two cmms with different PCDMIS software version. In my code I used to create app object for PCDLRN.Application.12.1 and it worked fine. The same program run on CMM with PCDMIS 2011 release throws error saying ActiveX object cannot be created.

    How do I write code so that my program can llaunch the software available in the CMM. The code that I have wrote above throws error once the first try fails and in catch when it exectes the second try it throws COM Exception not handled.

    Attached Files
  • It "should" work by only using the "PCDLRN.Application" without the specific version.

    Try changing

    Dim app As PCDLRN.Application


    to

    Dim app As Object


  • Do note that using PCDLRN.Application will start the version that's stored in the Registry at HKEY_CLASSES_ROOT\PCDLRN.Application. If you have more than one installation of PC-DMIS on the computer, this Registry key will reflect the version that most lately was run with Administrator privileges, as this Registry key can't [normally] be written to by a 'normal' user. PC-DMIS tries to write this entry each time it is run, but only succeeds when having the Administrator privileges.

  • Private Sub openCMMFile(ByVal index As String)
    
            // some sql code goes here
             .
             .
            //
    
            Dim tempfiledirectory As String = ""
            tempfiledirectory = Path.Combine(Application.StartupPath, "TempFolder")
            tempfiledirectory = Path.Combine(tempfiledirectory, tbl.Rows(0)("filename"))
    
            Dim fs As FileStream = New FileStream(tempfiledirectory, FileMode.Create)
            Dim bytes As Byte() = CType(tbl.Rows(0)("Blob_Data"), Byte())
            fs.Write(bytes, 0, bytes.Length)
            fs.Close()
    
            Dim app As PCDLRN.Application
            Dim partPrograms As PCDLRN.PartPrograms
            Try
                app = CreateObject("PCDLRN.Application")
                app.OperatorMode = True
                app.Visible = True
                partPrograms = app.PartPrograms
                partPrograms.Open(tempfiledirectory, "")
                app.ActivePartProgram.EXECUTE()
                app.ActivePartProgram.Close()
                File.Delete(tempfiledirectory)
            Catch ex As Exception
                MsgBox("PcDmis cannot connect. " & vbNewLine & "(Error - " & ex.Message & ")" & vbNewLine & ex.ToString, MsgBoxStyle.Critical)
            End Try
        End Sub


    I use the above code to get CMM prg file from sql and launch PCDMIS in operator mode and execute the program. This runs fine on simulation but on actual system connect to CMM it thorws error on setting PCDMIS to operator mode. Is my code correct ? I am not sure if it is my code or some computer settings that i should fix
  • Would you not need to specify the machine here partPrograms.Open(tempfiledirectory, "")?