Search code examples
excelvbamacroscatia

Design a Part in Catia by clicking an Excel Button


I already wrote some Macros in Catia V5 built in Macro Editor, but i can't figure out how to access Catia commands from Excel.

I would like to know how can I create for instance a simple straight cylinder by only having in the excel file cylinder's radius and length.

I want to make different pressure vessels in Catia by entering their diameter and height in Excel and after clicking on a button in that excel sheet the vessel should appear in Catia. I have no problem if I already need to have an open empty part in Catia, but would be best just to have Catia Opened with nothing loaded in it.

If i have the start and see how can I access Catia Methods from Excel I think I can figure out the rest methods needed to complete the vessel, like neck, cap, etc.

Thank you.

Edit: I managed to test some stuff, I got stuck on one problem, I don't know how to set up constraints in Excel vba. I moved the code from Catia vb to Visual Express and managed to make it work there but in excel I don't find a link on how to use a driving dimension.

Here is my code:

Sub Main()

    Dim CATIA As Object
    Set CATIA = GetObject(, "CATIA.Application")

    Set openDocument = CATIA.ActiveDocument

    Set currentPart = openDocument.Part

    Set currentHybridBodies = currentPart.HybridBodies

    Set currentHybridBody = currentHybridBodies.Add()

    Set referenceHybridBody = currentPart.CreateReferenceFromObject(currentHybridBody)

    currentPart.HybridShapeFactory.ChangeFeatureName referenceHybridBody, "GeometricalSet"

    Set partOriginElements = currentPart.OriginElements

    Set plnYZ = currentPart.OriginElements.PlaneYZ

    Set currentGeometricalSet = currentPart.HybridShapeFactory

    Dim currentOffset As Integer
    Dim circleDiameter As Integer
    Dim cylinderLength As Integer

    currentOffset = 0

    circleDiameter = Range("B2").Value

    cylinderLength = Range("B3").Value

    Call CreateCylinder(0, 0, circleDiameter, cylinderLength, currentOffset)

    currentPart.Update

    currentOffset = currentOffset + cylinderLength

    circleDiameter = Range("B5").Value

    cylinderLength = Range("B6").Value


    Call CreateCylinder(0, 0, circleDiameter, cylinderLength, currentOffset)

    openDocument.Part.Update

    currentOffset = currentOffset + cylinderLength

    circleDiameter = Range("B8").Value

    cylinderLength = Range("B9").Value

    Call CreateCylinder(0, 0, circleDiameter, cylinderLength, currentOffset)

    currentPart.Update

    currentOffset = currentOffset + cylinderLength

    CATIA.ActiveWindow.ActiveViewer.Reframe

End Sub




Sub CreateCylinder(iCenterX, iCenterY, iDiameter, iLength, iPlaneOffset)

    Set CATIA = GetObject(, "CATIA.Application")
    Set openDocument = CATIA.ActiveDocument
    Set currentPart = openDocument.Part
    Set plnYZ = currentPart.OriginElements.PlaneYZ
    Set currentGeometricalSet = currentPart.HybridShapeFactory

    Set planeOffset1 = currentGeometricalSet.AddNewPlaneOffset(plnYZ, iPlaneOffset, False)

    Set currentHybridBody = currentPart.HybridBodies.Item("GeometricalSet")

    currentHybridBody.AppendHybridShape (planeOffset1)

    openDocument.Part.Update

    Set currentBodies = currentPart.Bodies

    Set currentBody = currentBodies.Add()

    Set currentSketch = currentBody.Sketches.Add(planeOffset1)

    Dim Factory2D As Object

    Set Factory2D = currentSketch.OpenEdition

    Set geometricElements1 = currentSketch.GeometricElements

    Dim axis2D1 As Object

    Set axis2D1 = geometricElements1.Item("AbsoluteAxis")

    Dim line2D1 As Object

    Set line2D1 = axis2D1.GetItem("HDirection")

    Dim line2D2 As Object

    Set line2D2 = axis2D1.GetItem("VDirection")

    Set currentCircle = Factory2D.CreateClosedCircle(iCenterX, iCenterY, iDiameter / 2)

    Dim point2D1 As Object

    Set point2D1 = axis2D1.GetItem("Origin")

    Dim constraints1 As Object

    Set constraints1 = currentSketch.Constraints

    Dim reference2 As Object

    Set reference2 = currentPart.CreateReferenceFromObject(currentCircle)

    Dim constraint1 As Object

    Set constraint1 = constraints1.AddMonoEltCst(catCstTypeRadius, reference2)

    Dim catCstModeDrivingDimensions As Object

    'Set constraint1.Mode = catCstModeDrivingDimensions  'Here I get the error

    Dim iRadius As Double

    iRadius = iDiameter / 2       

    currentCircle.CenterPoint = point2D1

    currentSketch.CloseEdition

    Dim newPad As Object

    Set newPad = currentPart.ShapeFactory.AddNewPad(currentSketch, iLength)

End Sub

On that commented line I get error 438: Object doesn't support this property or method.

The code works without that line, but the geometric elements are not constrained, instead they appear fixed and I don't want this.

That code works fine in Visual Express and put all the constraints where they should be.

Can anyone tell me how to link that Catia command to excel vb.

This is from v5 automation documentation:

enum CatConstraintMode { catCstModeDrivingDimension, catCstModeDrivenDimension }

Also any feedback on my code is appreciated.

Thank you.

excel sheet

Edit: The only references I seem to be allowed to import are these: references

If I select others I receive an error: Error in loading DLL. Catia is installed on a server but I can point to it using Browse... still I'm not sure what to select there because there are a lot of files.


Solution

  • Here is a code to create a bolt. Paste the code in a module in Excel and assign a button to the macro.

    Sub Button1_Click()
      Dim CATIA As Object
        
      'Get CATIA or Launch it if necessary.
      On Error Resume Next
      Set CATIA = GetObject(, "CATIA.Application")
      If CATIA Is Nothing Then
         Set CATIA = CreateObject("CATIA.Application")
        CATIA.Visible = True
      End If
      On Error GoTo 0
      
      ' Add a new Part
      Set MyDocument = CATIA.documents.Add("Part")
      Set PartFactory = MyDocument.part.ShapeFactory  ' Retrieve the Part Factory.
      Set MyBody1 = MyDocument.part.Bodies.Item("PartBody")
      CATIA.ActiveDocument.part.InWorkObject = MyBody1 ' Activate "PartDesign"
      
    ' Creating the Shaft
      Set ReferencePlane1 = MyDocument.part.CreateReferenceFromGeometry(MyDocument.part.OriginElements.PlaneYZ)
      
      ' Create the sketch1 on ReferencePlane1
      Set Sketch1 = MyBody1.Sketches.Add(ReferencePlane1)
      Set MyFactory1 = Sketch1.OpenEdition() ' Define the sketch
    
    
      
      h1 = Range("E6").Value ' height of the bolt
      h2 = Range("E7").Value ' total height
      r1 = Range("E8").Value ' external radius
      r2 = Range("E9").Value ' Internal radius
      s1 = Range("E10").Value ' Size of the chamfer
      
      Set l101 = MyFactory1.CreateLine(0, 0, r1 - 20, 0)
      Set l102 = MyFactory1.CreateLine(r1 - 20, 0, r1, -20)
      Set l103 = MyFactory1.CreateLine(r1, -20, r1, -h1 + 20)
      Set l104 = MyFactory1.CreateLine(r1, -h1 + 20, r1 - 20, -h1)
      Set l105 = MyFactory1.CreateLine(r1 - 20, -h1, r2, -h1)
      Set l106 = MyFactory1.CreateLine(r2, -h1, r2, -h2 + s1)
      Set l107 = MyFactory1.CreateLine(r2, -h2 + s1, r2 - s1, -h2)
      Set l108 = MyFactory1.CreateLine(r2 - s1, -h2, 0, -h2)
      Set l109 = MyFactory1.CreateLine(0, -h2, 0, 0)
      Sketch1.CenterLine = l109
      
      Sketch1.CloseEdition
      Set AxisPad1 = PartFactory.AddNewShaft(Sketch1)
      
    ' Creating the Pocket
      Set ReferencePlane2 = MyDocument.part.CreateReferenceFromGeometry(MyDocument.part.OriginElements.PlaneXY)
        
      ' Create the sketch2 on ReferencePlane2
      Set Sketch2 = MyBody1.Sketches.Add(ReferencePlane2)
      Set MyFactory2 = Sketch2.OpenEdition() ' Define the sketch
      D = 1 / 0.866
      
      Set l201 = MyFactory2.CreateLine(D * 100, 0, D * 50, D * 86.6)
      Set l202 = MyFactory2.CreateLine(D * 50, D * 86.6, D * -50, D * 86.6)
      Set l203 = MyFactory2.CreateLine(D * -50, D * 86.6, D * -100, 0)
      Set l204 = MyFactory2.CreateLine(D * -100, 0, D * -50, D * -86.6)
      Set l205 = MyFactory2.CreateLine(D * -50, D * -86.6, D * 50, D * -86.6)
      Set l206 = MyFactory2.CreateLine(D * 50, D * -86.6, D * 100, 0)
    
      ' Create a big circle around the form to get a Hole
      Set c2 = MyFactory2.CreateClosedCircle(0, 0, 300)
      
      Sketch2.CloseEdition
      Set AxisHole2 = PartFactory.AddNewPocket(Sketch2, h1)
      
      MyDocument.part.Update
    
    
    End Sub

    enter image description here

    https://www.dropbox.com/s/rjuadpmsso8fe1p/20160423_2208_36.avi?dl=0