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.
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.
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
https://www.dropbox.com/s/rjuadpmsso8fe1p/20160423_2208_36.avi?dl=0