Sub Main(FeatureName As String, VarMaxName As String, VarMinName As String) ' 23.02.2022 Henniger ' Dim Something Dim fNominal, fMax, fMin As Double Dim iFeature, iLoop, iGeoLoop As Integer Dim S1, S2, sPuffer As String Dim retval Dim DmisApp As Object Set DmisApp = CreateObject("PCDLRN.Application") Dim DmisPart As Object Set DmisPart = DmisApp.ActivePartProgram Dim DmisCommands As Object Set DmisCommands = DmisPart.Commands Dim DmisCmd As Object Dim DmisCmdLoop As Object Dim VarMaxObj As Object Dim VarMinObj As Object ' search Commands For Each DmisCmd In DmisCommands ' ignore Marked If DmisCmd.Marked = False Then GoTo nextpcDMISCmd If (DmisCmd.HasField(2, 0)) Or (DmisCmd.Type = 1209) Then ' - DIMENSION_TRUE_DIAM_LOCATION 1209 ' - DIMENSION_TRUE_START_POSITION 1200 ' - DIMENSION_TRUE_END_POSITION 1201 ' - ID 2 S1 = DmisCmd.GetText(2, 0) If DmisCmd.Type = 1200 Then S2 = S1 If (DmisCmd.Type = 1200) Or (DmisCmd.Type = 1201) Then GoTo nextpcDMISCmd If DmisCmd.Type = 1209 Then S1 = S2 If InStr(1, S1, FeatureName) <> 0 Then iLoop = 0 nextpcDMISLoopCmd: ' pcDIMS Loop counter iLoop = iLoop + 1 If iLoop > DmisCmd.count Then GoTo nextpcDMISCmd Set DmisCmdLoop = DmisCmd.Item(iLoop) ' feature counter iFeature = iFeature + 1 If iFeature = 1 Then If (DmisCmdLoop.Type = 1303) Or (DmisCmdLoop.Type = 1302) Then ' Geo Tolerance ' - ISO_TOLERANCE_COMMAND 1303 ' - ASME_TOLERANCE_COMMAND 1302 ' - DIM_DEVIATION 340 ' - REF_ID 3 iGeoLoop = 1 sPuffer = DmisCmdLoop.GetText(3, iGeoLoop) fMax = CDbl(DmisCmdLoop.GetTextEx(340, iGeoLoop, "SEG=1")) fMin = CDbl(DmisCmdLoop.GetTextEx(340, iGeoLoop, "SEG=1")) While sPuffer <> "" If CDbl(DmisCmdLoop.GetTextEx(340, iGeoLoop, "SEG=1")) > fMax Then fMax = CDbl(DmisCmdLoop.GetTextEx(340, iGeoLoop, "SEG=1")) If CDbl(DmisCmdLoop.GetTextEx(340, iGeoLoop, "SEG=1")) < fMin Then fMin = CDbl(DmisCmdLoop.GetTextEx(340, iGeoLoop, "SEG=1")) iGeoLoop = iGeoLoop + 1 sPuffer = DmisCmdLoop.GetText(3, iGeoLoop) Wend If iLoop < DmisCmd.count Then GoTo nextpcDMISLoopCmd GoTo nextpcDMISCmd End If If (DmisCmdLoop.Type = 184) Then ' FCF Toleranz ' - FEATURE_CONTROL_FRAME 184 ' - LINE2_FEATNAME 657 ' - LINE2_MEAS 688 iGeoLoop = 1 sPuffer = DmisCmdLoop.GetText(657, iGeoLoop) fMax = CDbl(DmisCmdLoop.GetText(688, iGeoLoop)) fMin = CDbl(DmisCmdLoop.GetText(688, iGeoLoop)) While sPuffer <> "" If CDbl(DmisCmdLoop.GetText(688, iGeoLoop)) > fMax Then fMax = CDbl(DmisCmdLoop.GetText(688, iGeoLoop)) If CDbl(DmisCmdLoop.GetText(688, iGeoLoop)) < fMin Then fMin = CDbl(DmisCmdLoop.GetText(688, iGeoLoop)) iGeoLoop = iGeoLoop + 1 sPuffer = DmisCmdLoop.GetText(657, iGeoLoop) Wend If iLoop < DmisCmd.count Then GoTo nextpcDMISLoopCmd GoTo nextpcDMISCmd End If If DmisCmdLoop.HasField(340, 0) Then ' CIRCULARITY, FLATNESS, ANGULARITY, CIRCULAR_RUNOUT etc Legacy ' - NOMINAL 166 ' - DIM_DEVIATION 340 fNominal = CDbl(DmisCmdLoop.GetText(166, 0)) fMax = CDbl(DmisCmdLoop.GetText(340, 0)) fMin = CDbl(DmisCmdLoop.GetText(340, 0)) If iLoop < DmisCmd.count Then GoTo nextpcDMISLoopCmd GoTo nextpcDMISCmd End If If DmisCmdLoop.HasField(38, 0) Then ' CONE ' - THEO_ANGLE 38 ' - MEAS_ANGLE 30 fNominal = CDbl(DmisCmdLoop.GetText(38, 0)) fMax = CDbl(DmisCmdLoop.GetText(30, 0)) fMin = CDbl(DmisCmdLoop.GetText(30, 0)) If iLoop < DmisCmd.count Then GoTo nextpcDMISLoopCmd GoTo nextpcDMISCmd End If If DmisCmdLoop.HasField(977, 0) Then ' GENERIC_CONSTRUCTION ' - THEO_RADIUS 977 ' - MEAS_RADIUS 978 fNominal = CDbl(DmisCmdLoop.GetText(977, 0)) fMax = CDbl(DmisCmdLoop.GetText(978, 0)) fMin = CDbl(DmisCmdLoop.GetText(978, 0)) If iLoop < DmisCmd.count Then GoTo nextpcDMISLoopCmd GoTo nextpcDMISCmd End If If DmisCmdLoop.HasField(35, 0) Then If (DmisCmdLoop.Type = 618) Or (DmisCmdLoop.Type = 506) Or (DmisCmdLoop.Type = 507) Then ' SLOT_ROUND ' - CONTACT_SLOT_ROUND_FEATURE 618 ' - CONST_BF_SLOT 506 ' - CONST_BFRE_SLOT 507 ' - THEO_LENGTH 36 ' - MEAS_LENGTH 28 fNominal = CDbl(DmisCmdLoop.GetText(36, 0)) fMax = CDbl(DmisCmdLoop.GetText(28, 0)) fMin = CDbl(DmisCmdLoop.GetText(28, 0)) Else ' SLOT, CONTACT_SLOT_SQUARE_FEATURE, CONST_BF_SQSLOT ' - THEO_WIDTH 35 ' - MEAS_WIDTH 316 fNominal = CDbl(DmisCmdLoop.GetText(35, 0)) fMax = CDbl(DmisCmdLoop.GetText(316, 0)) fMin = CDbl(DmisCmdLoop.GetText(316, 0)) End If If iLoop < DmisCmd.count Then GoTo nextpcDMISLoopCmd GoTo nextpcDMISCmd End If If DmisCmdLoop.HasField(34, 0) Then ' CIRCLE CYLINDER SPHERE ' - THEO_DIAM 34 ' - MEAS_DIAM 29 fNominal = CDbl(DmisCmdLoop.GetText(34, 0)) fMax = CDbl(DmisCmdLoop.GetText(29, 0)) fMin = CDbl(DmisCmdLoop.GetText(29, 0)) If iLoop < DmisCmd.count Then GoTo nextpcDMISLoopCmd GoTo nextpcDMISCmd End If Else If (DmisCmdLoop.Type = 1303) Or (DmisCmdLoop.Type = 1302) Then ' Geo Tolerance ' - ISO_TOLERANCE_COMMAND 1303 ' - ASME_TOLERANCE_COMMAND 1302 ' - DIM_DEVIATION 340 ' - REF_ID 3 iGeoLoop = 1 sPuffer = DmisCmdLoop.GetText(3, iGeoLoop) While sPuffer <> "" If CDbl(DmisCmdLoop.GetTextEx(340, iGeoLoop, "SEG=1")) > fMax Then fMax = CDbl(DmisCmdLoop.GetTextEx(340, iGeoLoop, "SEG=1")) If CDbl(DmisCmdLoop.GetTextEx(340, iGeoLoop, "SEG=1")) < fMin Then fMin = CDbl(DmisCmdLoop.GetTextEx(340, iGeoLoop, "SEG=1")) iGeoLoop = iGeoLoop + 1 sPuffer = DmisCmdLoop.GetText(3, iGeoLoop) Wend If iLoop < DmisCmd.count Then GoTo nextpcDMISLoopCmd GoTo nextpcDMISCmd End If If (DmisCmdLoop.Type = 184) Then ' FCF Toleranz ' - FEATURE_CONTROL_FRAME 184 ' - LINE2_FEATNAME 657 ' - LINE2_MEAS 688 iGeoLoop = 1 sPuffer = DmisCmdLoop.GetText(657, iGeoLoop) While sPuffer <> "" If CDbl(DmisCmdLoop.GetText(688, iGeoLoop)) > fMax Then fMax = CDbl(DmisCmdLoop.GetText(688, iGeoLoop)) If CDbl(DmisCmdLoop.GetText(688, iGeoLoop)) < fMin Then fMin = CDbl(DmisCmdLoop.GetText(688, iGeoLoop)) iGeoLoop = iGeoLoop + 1 sPuffer = DmisCmdLoop.GetText(657, iGeoLoop) Wend If iLoop < DmisCmd.count Then GoTo nextpcDMISLoopCmd GoTo nextpcDMISCmd End If If DmisCmdLoop.HasField(340, 0) Then ' CIRCULARITY, FLATNESS, ANGULARITY, CIRCULAR_RUNOUT, Legacy ' - NOMINAL 166 ' - DIM_DEVIATION 340 If fNominal <> CDbl(DmisCmdLoop.GetText(166, 0)) Then GoTo nextpcDMISCmd If CDbl(DmisCmdLoop.GetText(340, 0)) > fMax Then fMax = CDbl(DmisCmdLoop.GetText(340, 0)) If CDbl(DmisCmdLoop.GetText(340, 0)) < fMin Then fMin = CDbl(DmisCmdLoop.GetText(340, 0)) If iLoop < DmisCmd.count Then GoTo nextpcDMISLoopCmd GoTo nextpcDMISCmd End If If DmisCmdLoop.HasField(38, 0) Then ' CONE ' - THEO_ANGLE 38 ' - MEAS_ANGLE 30 If fNominal <> CDbl(DmisCmdLoop.GetText(38, 0)) Then GoTo nextpcDMISCmd If CDbl(DmisCmdLoop.GetText(30, 0)) > fMax Then fMax = CDbl(DmisCmdLoop.GetText(30, 0)) If CDbl(DmisCmdLoop.GetText(30, 0)) < fMin Then fMin = CDbl(DmisCmdLoop.GetText(30, 0)) If iLoop < DmisCmd.count Then GoTo nextpcDMISLoopCmd GoTo nextpcDMISCmd End If If DmisCmdLoop.HasField(977, 0) Then ' GENERIC_CONSTRUCTION ' - THEO_RADIUS 977 ' - MEAS_RADIUS 978 If fNominal <> CDbl(DmisCmdLoop.GetText(977, 0)) Then GoTo nextpcDMISCmd If CDbl(DmisCmdLoop.GetText(978, 0)) > fMax Then fMax = CDbl(DmisCmdLoop.GetText(978, 0)) If CDbl(DmisCmdLoop.GetText(978, 0)) < fMin Then fMin = CDbl(DmisCmdLoop.GetText(978, 0)) If iLoop < DmisCmd.count Then GoTo nextpcDMISLoopCmd GoTo nextpcDMISCmd End If If DmisCmdLoop.HasField(35, 0) Then If (DmisCmdLoop.Type = 618) Or (DmisCmdLoop.Type = 506) Or (DmisCmdLoop.Type = 507) Then ' SLOT_ROUND ' - CONTACT_SLOT_ROUND_FEATURE 618 ' - CONST_BF_SLOT 506 ' - CONST_BFRE_SLOT 507 ' - THEO_LENGTH 36 ' - MEAS_LENGTH 28 If fNominal <> CDbl(DmisCmdLoop.GetText(36, 0)) Then GoTo nextpcDMISCmd If CDbl(DmisCmdLoop.GetText(28, 0)) > fMax Then fMax = CDbl(DmisCmdLoop.GetText(28, 0)) If CDbl(DmisCmdLoop.GetText(28, 0)) < fMin Then fMin = CDbl(DmisCmdLoop.GetText(28, 0)) Else ' SLOT, CONTACT_SLOT_SQUARE_FEATURE, CONST_BF_SQSLOT ' - THEO_WIDTH 35 ' - MEAS_WIDTH 316 If fNominal <> CDbl(DmisCmdLoop.GetText(35, 0)) Then GoTo nextpcDMISCmd If CDbl(DmisCmdLoop.GetText(316, 0)) > fMax Then fMax = CDbl(DmisCmdLoop.GetText(316, 0)) If CDbl(DmisCmdLoop.GetText(316, 0)) < fMin Then fMin = CDbl(DmisCmdLoop.GetText(316, 0)) End If If iLoop < DmisCmd.count Then GoTo nextpcDMISLoopCmd GoTo nextpcDMISCmd End If If DmisCmdLoop.HasField(34, 0) Then ' CIRCLE CYLINDER SPHERE ' - THEO_DIAM 34 ' - MEAS_DIAM 29 If fNominal <> CDbl(DmisCmdLoop.GetText(34, 0)) Then GoTo nextpcDMISCmd If CDbl(DmisCmdLoop.GetText(29, 0)) > fMax Then fMax = CDbl(DmisCmdLoop.GetText(29, 0)) If CDbl(DmisCmdLoop.GetText(29, 0)) < fMin Then fMin = CDbl(DmisCmdLoop.GetText(29, 0)) If iLoop < DmisCmd.count Then GoTo nextpcDMISLoopCmd GoTo nextpcDMISCmd End If End If End If 'If InStr(1, S1, FeatureName) <> 0 Then End If nextpcDMISCmd: Next DmisCmd ' Set pcDMIS Variable Set VarMaxObj = DmisPart.GetVariableValue(VarMaxName) If Not VarMaxObj Is Nothing Then VarMaxObj.StringValue = Format(fMax, "0.000000") retval = DmisPart.SetVariableValue(VarMaxName, VarMaxObj) End If Set VarMinObj = DmisPart.GetVariableValue(VarMinName) If Not VarMinObj Is Nothing Then VarMinObj.StringValue = Format(fMin, "0.000000") retval = DmisPart.SetVariableValue(VarMinName, VarMinObj) End If ' free Something Set VarMaxObj = Nothing Set VarMinObj = Nothing Set DmisCmd = Nothing Set DmisCommands = Nothing Set DmisPart = Nothing Set DmisApp = Nothing End Sub