Once again, I received a good technical question about one of my codes on the GTWiki. This time, the user found a bug when they ran the script on a series of objects. Here’s their question:
I ran the code. After selecting geometrical set and Axis system and clicking on run, the macro throws up an error It stops at
Set ZMeas = TheSPAWorkbench.GetMeasurable(MySel.Item(1).Value)
I do not know the problem.
paramathma,
I looked into the question, and my first concern that both parts have Axis Systems. In most cases, DP/CATIA CAD managers set Axis Systems in CATParts as a company standard. However, if you are working with IT support or a set of unconventional standards, your settings may be missing Axis Systems per part. You’ll receive a VB error if your Axis Systems are not in the Axis System Set at the top of the specifications tree. If they are in Geometrical Sets, then you may get this error. User’s can fix this setting by creating a new Axis System and unchecking the option at the bottom of the dialog that places it in a Geometrical Set. (I find this setting to be poorly placed: I believe DS should put this command in the Tools > Options, but for now, it’s there). From then on, all new CATParts will have an Axis at the top of the tree.
'****************************************************************************************************** '***** Measure XYZ from other Axis Sys '***** Author: Nick Pisca '***** Support: nicholas.pisca@gehrytechnologies.com & nickpisca@gmail.com '***** Date: Halloween...., 2008 Boooo wahh wahhh '***** Description: '***** '***** Status: In-Prog. and Working '***** Advancements: '***** Requirements: '***** Compatibility: V1R3 SP8.2.2 '****************************************************************************************************** '***** Declarations Dim ActDoc As Document Dim ActProds As Products Dim AvailDocs As Documents Dim MySel As Selection Dim MyPart As Part Dim TheSPAWorkbench Dim MyHSFactory As HybridShapeFactory Dim ShapeFactory As ShapeFactory Dim Zaxis As HybridShapeDirection Dim MyRels As Relations Dim MyParms As Parameters Dim XYPl Dim FS 'as FileSystem Dim OriginPt 'As HybridShapePointCoord Dim LouvreSK 'As Sketch Dim LouvreSKREF As Reference Dim MainAxisSys As AxisSystem Dim DriverSrf Dim randAxis As HybridShapeDirection Dim SolBody As Body Dim SelArr() Sub catmain() AUserForm1.Show End Sub Sub CATStart() Track Set MyPart = CATIA.ActiveDocument.Part Set MySel = CATIA.ActiveDocument.Selection If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "Open your model in a Part or in a new window. " Exit Sub End If Set MyHSFactory = MyPart.HybridShapeFactory Set ShapeFactory = MyPart.ShapeFactory Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench") Set Zaxis = MyHSFactory.AddNewDirectionByCoord(0, 0, 1) Set randAxis = MyHSFactory.AddNewDirectionByCoord(0.7777, 0.822, 0.921) Set MainAxisSys = MyPart.AxisSystems.Item(1) If MySel.Count <> 0 Then MySel.Clear End If Dim MyAxis As AxisSystem Set MyAxis = AUserForm1.SelAxis ' MyPart.FindObjectByName("Axis System.2") Dim PtSet As HybridBody Set PtSet = AUserForm1.SelPtSet 'MyPart.FindObjectByName("Geometrical Set.1") MySel.Add MyAxis MySel.Search ("Type=Topology.face,sel") 'Dim FaceArr() 'ReDim FaceArr(2) 'For X = 0 To 2 ' Set facarr(X) = MySel.Item(X + 1).Value 'Next X Dim ZMeas Set ZMeas = TheSPAWorkbench.GetMeasurable(MySel.Item(1).Value) Dim XMeas Set XMeas = TheSPAWorkbench.GetMeasurable(MySel.Item(2).Value) Dim YMeas Set YMeas = TheSPAWorkbench.GetMeasurable(MySel.Item(3).Value) Dim TempSet As HybridBody Set TempSet = MyPart.HybridBodies.Add TempSet.Name = "Temp_SET" Dim TextXYOff As HybridShapePlaneOffset Set TextXYOff = MyHSFactory.AddNewPlaneOffset(MySel.Item(1).Value, 1, False) TempSet.AppendHybridShape TextXYOff IsUpdatable TextXYOff Dim ZMeasOff Set ZMeasOff = TheSPAWorkbench.GetMeasurable(TextXYOff) Dim TextZYOff As HybridShapePlaneOffset Set TextZYOff = MyHSFactory.AddNewPlaneOffset(MySel.Item(2).Value, 1, False) TempSet.AppendHybridShape TextZYOff IsUpdatable TextZYOff Dim XMeasOff Set XMeasOff = TheSPAWorkbench.GetMeasurable(TextZYOff) Dim TextZXOff As HybridShapePlaneOffset Set TextZXOff = MyHSFactory.AddNewPlaneOffset(MySel.Item(3).Value, 1, False) TempSet.AppendHybridShape TextZXOff IsUpdatable TextZXOff Dim YMeasOff Set YMeasOff = TheSPAWorkbench.GetMeasurable(TextZXOff) For ptcounter = 1 To PtSet.HybridShapes.Count StatusBarShort ptcounter - 1, PtSet.HybridShapes.Count, "Measuring Coords against selected axis... " Dim CurPt Set CurPt = PtSet.HybridShapes.Item(ptcounter) If IsUpdatable(CurPt) Then Dim xDist As Double xDist = XMeas.GetMinimumDistance(CurPt) Dim xDistOff As Double xDistOff = XMeasOff.GetMinimumDistance(CurPt) If xDistOff > xDist Then xDist = (-1) * xDist End If AppendLengthParm CurPt, (MyAxis.Name & "_LOCALX"), xDist, MyPart Dim zDist As Double zDist = ZMeas.GetMinimumDistance(CurPt) Dim zDistOff As Double zDistOff = ZMeasOff.GetMinimumDistance(CurPt) If zDistOff > zDist Then zDist = (-1) * zDist End If AppendLengthParm CurPt, (MyAxis.Name & "_LOCALY"), zDist, MyPart Dim yDist As Double yDist = YMeas.GetMinimumDistance(CurPt) Dim yDistOff As Double yDistOff = YMeasOff.GetMinimumDistance(CurPt) If yDistOff > yDist Then yDist = (-1) * yDist End If AppendLengthParm CurPt, (MyAxis.Name & "_LOCALZ"), yDist, MyPart End If Next ptcounter MyHSFactory.DeleteObjectForDatum TextZYOff MyHSFactory.DeleteObjectForDatum TextZXOff MyHSFactory.DeleteObjectForDatum TextXYOff End Sub Sub AppendLengthParm(CurObj As Variant, ParmName As String, ParmValue As Double, CurPart As Part) Dim CFParms As Parameters Set CFParms = CurPart.Parameters.SubList(CurObj, True) Dim CFStrParm As Parameter Set CFStrParm = CFParms.CreateDimension(ParmName, "LENGTH", ParmValue) '.CreateString(ParmName, ParmValue) End Sub
If one wanted to debug the aforementioned problem at the line:
Set ZMeas = TheSPAWorkbench.GetMeasurable(MySel.Item(1).Value)
it usually means that either you don’t have a selection or the object selected doesn’t exist. Immediately prior to this line, there is a selection query (the worst f-ing command in all of CATIA VB) and this command regularly changes for each build number. BN 17-19 usually look like this:
MySel.Search ("Type=Topology.face,sel")
while, pre-BN 17 searches sometimes looks like this:
MySel.Search ("Topology.face,sel")
These changes are not expressed in DS’s release notes, nor are they formally documented. At best, you’ll find these string references on forums or sites like by awesome blog. 🙂
Lastly, if this line doesn’t work, sometimes your SPAWorkbench reference isn’t loaded. Check this out of your Visual Basic Editor libraries list.
Set ZMeas = TheSPAWorkbench.GetMeasurable(MySel.Item(1).Value)
Debugging…awesome.
Recent Comments