How To Model Gears With VBA User Form Tutorial v1.1

VB Scripting for CATIA V5: How to Model Gears with VBA User Form Alireza Reihani Emmett Ross 1 Copyright Information

Views 107 Downloads 3 File size 4MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

VB Scripting for CATIA V5: How to Model Gears with VBA User Form

Alireza Reihani Emmett Ross

1

Copyright Information VB Scripting for CATIA V5: How to Model Gears with VBA User Form Version1.1, revised October 2015 Copyright ©2015 by Alireza Reihani and Emmett Ross All rights reserved. No part of this guide may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage and retrieval system, without permission in writing by the authors. The only exception is by a reviewer, who may quote short excerpts in a review. CATIA is a registered trademark of Dassault Systèmes. No affiliation with, or endorsed by anyone associated, or in any way connected with Dassault Systèmes, Microsoft Corporation, UNIX, or any of their fantastic products. We recognize that some words, model names and designations, for example, mentioned herein are the property of the trademark owner. We use them for identification purposes only. This is not an official publication.

Disclaimer Although the authors have attempted to exhaustively research all sources to ensure the accuracy and completeness of information on the subject matter, the authors assume no responsibility for errors, inaccuracies, omissions, or any other inconsistencies herein. The data contained herein is for informational purposes only and is not represented to be error free. Information may be rendered inaccurate by changes made to the subject of the material, such as the applicable software. No consequential damages can be sought against the authors for the use of these materials by any third parties or for any direct or indirect result of that use. The purpose of this text is to complement and supplement other texts and resources. You are urged to read all the available literature, learn as much as you can and adapt the information to your particular needs. There may be mistakes within this manual. Therefore, the text should only be used as a general and introductory guide and not as the sole source for CATIA macro programming. The information contained herein is intended to be of general interest to you and is provided “as is”, and it does not address the circumstances of any particular individual or entity. Nothing herein constitutes professional advice, nor does it constitute a comprehensive or complete statement of the issues discussed thereto. Readers should also be aware that internet websites listed in this work may have changed or disappeared between when this work was written and when it is read. A prerequisite for this guide is to know the basics of CATIA, programming by Visual Basic, and VBScript for CATIA. To start learning programming for CATIA V5 from scratch, please read VB SCRIPTING FOR CATIA V5 by Emmett Ross.

2

Contents Copyright Information .................................................................................................................... 2 Disclaimer ....................................................................................................................................... 2 Introduction ....................................................................................................................................... 5 Structure of this VB Program ......................................................................................................... 5 Initial Setting ...................................................................................................................................... 7 Step 1: Drawing Gear Types in CATIA ................................................................................................ 8 Step 2: Programming in CATIA step by step .................................................................................... 16 2-1) Getting Data and controlling them (sub: common) ............................................................. 16 2-1-1) Create Form in a new VBA project .................................................................................... 16 2-1-2) Get the Number of Gear Teeth and check its value .......................................................... 44 2-1-3) Get the Module of the Gear and check its value............................................................... 45 2-1-4) Get the thickness of the gear and check its value ............................................................. 46 2-1-5) Get the Diameter of the Shaft Hole and check its value ................................................... 47 2-1-6) Get the width and depth of the Key and check their values ............................................. 48 2-1-7) Get the Chamfer Data and check its value ........................................................................ 49 2-1-8) Get the Helix angle ............................................................................................................ 50 2-1-9) Get the Scale of Diameter and check its value .................................................................. 51 2-1-10) Calculate the five Radiuses necessary to draw Gear Tooth ............................................ 52 2-1-11) Get the gear pressure angle and calculate the other angles to draw ............................. 53 2-1-12) Control: shaft hole diameter must be smaller than Gear Dedendum ............................ 54 2-1-13) Check: Width of Key must be smaller than Shaft hole Diameter .................................... 55 2-1-14) Check: Corner point of Key must be Inside of Gear Dedendum ..................................... 56 2-1-15) Check: Chamfer................................................................................................................ 57 2-1-16) Find the center point of the pitch circle .......................................................................... 58 2-1-17) Find a point on pitch circle .............................................................................................. 59 2-1-18) Calculate the pitch circle radius ...................................................................................... 60 2-1-19) Find the intersection point on Addendum circle by Functions Xn,Yp ............................. 61 2-1-20) Control existence of the Addendum circle ...................................................................... 62 3

2-1-21) Find the center point of the fillet circle ........................................................................... 63 2-1-22) Find the intersection point of pitch circle and fillet circle .............................................. 64 2-1-23) Find the intersection point of the Dedendum circle and fillet circle .............................. 65 2-1-24) Find the last point on Dedendum circle .......................................................................... 66 2-1-25) Control the existence of the Dedendum circle ............................................................... 67 2-2) Create Body (Sub: common) .............................................................................................. 68 2-3) Create Plane for Tooth Profile Sketch .................................................................................. 69 2-4) Create Base Sketch (Tooth Profile Sketch) ........................................................................... 70 2-4-1) Find the Center points of circles and Start point and End point of Arcs ........................... 71 2-5) Create Full Teeth Profile (Circular Pattern) and Join them .................................................. 81 2-6) Type 1: Create Solid (Pad) ..................................................................................................... 85 2-7) Type 2: Create Solid (Multi-section solid) ............................................................................ 86 (Sub: Gear2).................................................................................................................................. 86 2-8) Type 3: Create Solid (Multi-section Solid) ............................................................................ 90 2-9) Type 4: Create Solid (Multi-section Solid) ............................................................................ 95 2-10) Create Hole and Key (Pocket) ........................................................................................... 103 2-11) Create Chamfer (Groove).................................................................................................. 107 2-12) Hiding main planes: .......................................................................................................... 114 2-13) Assign a Toolbar in CATIA ................................................................................................. 115 Thank You! ..................................................................................................................................... 118 Video Demo ................................................................................................................................... 119 Tips and Troubleshooting .............................................................................................................. 120 Appendix I: Keyboard Shortcuts .................................................................................................... 121 Appendix II: Resources................................................................................................................... 122

4

Introduction A good practice to take your CATIA programming skills to the next level is to model a complex example like a gear. In this guide, you’ll learn how to develop a CATVBA program to model different types of gears in CATIA V5. This guide is divided into two main steps: 1. Drawing gears in CATIA V5 using sketcher 2. Programming in CATIA V5 step-by-step including VBA user form In this case, step one is as important as step two, because there are many ways to model a gear but some of them are not good and are inefficient. This is especially evident in Helical Gears where sometimes they create errors in CATIA or the file size and/or time of creation is very high. Before starting these two steps, let’s briefly review the structure of this program.

Structure of this VB Program This program consists of one Module (Module 1) and one Form (FrmGear). Module 1 has two subroutines: CATMain() to show Form and HidePlanes to Hide three main planes (X, Y and Z). Subroutine HidePlanes is not necessary to draw gears, it’s just for better viewing of the gears.

5

Fig 1: Project explorer and Program window in design mode The UserForm consists of seven subroutine and two functions. At first, Subroutine common creates Full Gear Profile, and then, depending on the Gear Type, one of four subroutines that draws the desired gear type: • • • •

Gear 1 Type: Spur Gear 2 Type: Helical Gear 3 Type: Straight Bevel Gear 4 Type: Spiral Bevel

Two functions Xn and Yp are used to calculate coordinates of intersection of two circles (to draw Gear profile). Subroutines HoleKey and Chamfer draw Hole of Shaft and Chamfer.

Fig 2: Subroutines of FrmGear 6

Initial Setting This program creates Hybrid design (Planes, Points,…) in Body and not in Geometrical Set, so it’s necessary that you check Enable hybrid design when you want to create a new Part (Fig 3).

Fig 3: Initial setting: Enable hybrid design You can also change this setting by this method (Fig 4): Tools>Options…>Infrastructure>PartInfrastructure>Part Document (tab)>Hybrid Design: Enable hybrid design inside part bodies and bodies

Fig 4: Setting of Hybrid Design 7

Step 1: Drawing Gear Types in CATIA Before starting a Sketch of the Tooth Profile (manually or by programming), it’s necessary to have equations for drawing a gear tooth profile. • • • • •

Ro = m * Z / 2 where m=module and Z=number of gear teeth Rt = 0.94 * Ro Rd = Ro - 1.25 * m ; Dedendum Ru = Ro + m ; Addendum Rf = 0.35 * m ; (fillet; you can get the value from the user)

Beta

Ru Ro Rt

Rf

Rd Alpha

Gamma

Fig 1-1: Gear profile

8

Note 1: Normally to draw a tooth profile, you must draw circles and lines, then trim them. This can be very difficult to do by programming so use intersection points of two circles by these equations:

𝑥= 𝑦=

𝐿 ∗ (𝑋2 − 𝑋1 ) ℎ ∗ (𝑌2 − 𝑌1 ) ± + 𝑋1 𝑑 𝑑 𝐿 ∗ (𝑌2 − 𝑌1 ) ℎ ∗ (𝑋2 − 𝑋1 ) ∓ + 𝑌1 𝑑 𝑑

𝑑 = �(𝑋1 − 𝑋2 )2 + (𝑌1 − 𝑌2 )2 𝑅12 − 𝑅22 + 𝑑 2 𝐿= 2∗𝑑 ℎ = �𝑅12 − 𝐿2

where x,y are coordinates of intersection points, X1,Y1 are coordinates of center point of first circle with radius=R1 and X2,Y2 are coordinates of center point of second circle with radius=R2. The fillets will also be drawn in sketch rather than using the fillet tool because it will be easier to do programmatically. In this guide, you will draw the Gear Sketch in a plane parallel to XZ plane. As a practice, you can develop this program and then draw a gear in each plane.

9

Fig 1-2: Tooth Profile drawn by finding intersection points

Fig 1-3: First Tooth Profile (Sketch) 10

Note 2: Drawing Full Gear Profile For drawing full teeth profile, it doesn’t appear there is a VB function to have Circular Pattern in Sketch (

). Therefore, we will use Circular pattern in GSD (

).

Fig 1-4: Full Teeth Profile and Create Pad for Gear Type 1 In gear types 2,3 and 4, Multi-section Solid creates the volume. • • • •

Gear 1 Type: Spur = PAD Gear 2 Type: Helical = Multi-section Gear 3 Type: Straight Bevel = Multi-section Gear 4 Type: Spiral Bevel = Multi-section

11

In type 2 (helical gear); after Translating of full teeth profile; it must be rotated (Fig. 1-5).

Fig 1-5: Profile Translated and Rotated

Fig 1-6: Profile Translated and Rotated in normal view

12

Fig 1-7: Gear Type 2 In type 3 (straight bevel); after Translating of full teeth profile; it must be scaled (Fig. 1-8).

Fig 1-8: Profile Translated and Scaled in normal view 13

Fig 1-9: Gear Type 3 (straight bevel) In type 4 (spiral bevel); after Translating of full teeth profile; it must be rotated and be scaled. Do it two times (Fig. 1-10).

Fig 1-10: Profile Translated, Rotated and Scaled in normal view (two times)

14

Fig 1-11: Gear Type 4 (spiral bevel)

We have just created four different types of gear. Now it’s time to add automation so a user can change the size of gears through a user form.

15

Step 2: Programming in CATIA step by step 2-1) Getting Data and controlling them (sub: common)

2-1-1) Create Form in a new VBA project You can get the data needed by using an InputBox but the more user friendly way is to use a TextBox, ComboBox, CheckBox combination in a Form like Fig 2-1-1

Fig 2-1-1: Form to get data for creating the gears to the specified size

16

For creating this User Form, we need to create a new program file. In CATIA, click on the Tools>Macro>Visual Basic Editor... or press Alt+F11 (Fig 2-1-2).

Fig 2-1-2: Enter the Visual Basic Editor

17

If there is not a loaded CATVBA file, one message appears (Fig 2-1-3).

Fig 2-1-3: Launch VBA message Press Yes to create one VBA project. Now Macro libraries window appears (Fig 2-1-4)

18

Fig 2-1-4) Macro libraries window Click on Create new library... button (Library type must be VBA Project Fig 2-1-5). Now Create a new VBA project window appears (Fig. 2-1-5). Enter a path and name for your VBA project. (This path must be valid, otherwise an error message appears and CATIA doesn’t help you to create these Folders.)

19

Fig 2-1-5) Create a new VBA project window By clicking on the Ok button you will come back to Macro libraries window and you will see your new full path of new VBA project in this window (Fig 2-1-6).

20

Fig 2-1-6: new VBA project in Macro libraries window By clicking on Close button you will enter into the VBA environment (Fig 2-1-7)

21

Fig 2-1-7) VBA environment To create a Form, Right click on the Project window (left side in Fig 2-1-7) then click on Insert>UserForm (Fig 2-1-8) or use menu Insert>UserForm (Fig 2-1-9). New Form appears (Fig 2-1-10).

22

Fig 2-1-8: Add a new Form in your VBA project by right click

Fig 2-1-9: Add a new Form in your VBA project by menu 23

Fig 2-1-10: new Form To access to properties of this Form, click on menu View>Properties Window or press F4 or click on Properties window icon (

) or right-click on the form and select properties (Fig 2-

1-11) . Now properties window of Form appears (Fig 2-1-12). Change the Name property of form to FrmGear.

24

Fig 2-1-11: Access to properties of Form by right-click

Fig 2-1-12: properties of Form 25

To access CATIA when the Gear program is running, then set ShowModal property to False (Fig 2-1-13). Forms are displayed by the Show method of the form object. This method has an optional argument to specify whether the form should be displayed as either modal or modeless. A modal form will not let you interact with any other part of the application until that form is closed. This means that you cannot interactively use other CATIA commands or interact with any other forms that might be displayed at the time. Forms are, by default, modal unless otherwise specified. We want to interact with CATIA so set ShowModal property to False.

Fig 2-1-13: ShowModal property of Form Change the Caption property to 3D Gear (Fig 2-1-14). Finally, change the size of the Form (by dragging of corners of Form or by setting width and Height property).

26

Fig 2-1-14: Caption property of Form To classify the controls such as TextBoxes, Labels,... , insert a Frame (Fig 2-1-15) by dragging its icon on Toolbox window (Fig 2-1-16) to Form or by clicking on its icon and click a point on Form. (If you don’t see this window click on menu: View>Toolbox or click on its icon in Standard Toolbars

)

27

Fig 2-1-15: Add a Frame

Fig 2-1-16: Toolbox window

28

Fig 2-1-17: Add Label

Fig 2-1-18: Add TextBox 29

Change the Text Background Color by BackColor property of TextBox (Fig 2-1-19).

Fig 2-1-19: Change Backcolor property of TextBox

30

To show the user that TextBox is a place to enter text, change MousePointer (Fig 2-1-20) and MouseIcon property of TextBox.

Fig 2-1-20: Change MousePointer property of TextBox

31

Change Text Color of TextBox by ForeColor property of TextBox (Fig 2-1-21).

Fig 2-1-21: Change ForeColor property of TextBox

32

Change Font of TextBox and its Height to better viewing of texts by Font property of TextBox (Fig 2-1-22).

Fig 2-1-22: Change Font property of TextBox

33

Change BackStyle property of Label to 0 (Transparency) (Fig 2-1-23) now its color is dependent of Frame color.

Fig 2-1-23: Change BackStyle property of Label

34

To show pictures, put image control and set its Picture property. Pictures should be in format .bmp, .gif or .jpg. (Fig 2-1-24)

Fig 2-1-24: Add Image and set Picture property

35

Each type of gear can have a shaft hole or not. If a shaft hole exists, it can have a key or not. The best control for this purpose is to use a CheckBox (Fig 2-1-25). Put two CheckBoxes and change their Name property to ChHole and ChKey. In MouseUp event of ChHole, write the following code to control the key. Remember: the key can only exist when the shaft hole exists. Private Sub ChHole_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If ChHole.Value = True Then ChKey.Value = False ChKey.Enabled = False Else ChKey.Enabled = True End If End Sub

36

In addition, for gear types 1 and 2, we will add a chamfer option.

Fig 2-1-25: Add CheckBox and set Backstyle property to 0 (Transparent) Private Sub Op1_Click() ChChamfer.Enabled = True End Sub

Private Sub Op2_Click() ChChamfer.Enabled = True End Sub

37

Private Sub Op3_Click() ChChamfer.Value = False ChChamfer.Enabled = False End Sub Private Sub Op4_Click() ChChamfer.Value = False ChChamfer.Enabled = False End Sub

This program can draw four different types of gear but only one at a time can be select. Each time one type is drawn and the user can select only one type so we need four OptionButtons. You can add an image beside each optionButton to visually show the user what each type of gear is.

Fig 2-1-26: Add OptionButton 38

We need a Command button to execute the create gear program. Add a new command button and change the BackColor and ForeColor property (Black and white).

Fig 2-1-27: Add Command Button Continue adding controls and set their properties. After setting properties of a control, you can use Copy-Paste to quickly create the other controls.

39

Fig 2-1-28 shows the Name property of controls that will be used in the VBA program code. ChHole TxtKeyDepth

TxtKeyWidth

ChKeye

TxtZ TxtShaftDiae

CmbM TxtAlpha TxtT TxtY

Op4

Op1

Op3

Op2 TxtScale

TxtChX TxtChY ChChamfer CmdDraw

TxtHelixAngle

Fig 2-1-28: Control Names

40

To show the form of program, add a module to the project. A new module can be added just like adding a form: right-click on the project window and select Insert>Module (Fig 2-1-29).

Fig. 2-1-29 Add a module to VBA project

41

Fig. 2-1-30: New module Now add this code to your newly created module. This code will show the form when the program is run. Sub CATMain() FrmGear.Show End Sub Later on you’ll learn how you can assign this module to an icon in CATIA to show the Form.

42

When the program runs, after clicking on Draw command button, the variable ProfileError is set to false, a subroutines HidePlanes (to be explained later) and common will be executed.

Private Sub CmdDraw_Click() ProfileError = Falsend Call HidePlanes Call Common End Sub

Subroutine common gets the information from the form, analyzes it, creates the body and a plane parallel to XZ plane and finally draws a full gear profile. After assigning the input information to variables, they must be controlled. For example, if the teeth number, module or thickness is zero, the program must alert the user to change it. This is called error handling.

Sub Common() 'Create Base Wireframe of Gear Complete Profile Me.Hide

43

2-1-2) Get the Number of Gear Teeth and check its value

Dim QtyZ As Integer

'Gear Teeth Quantity

QtyZ = Val(TxtZ.Text) Dim Z As Double Z = CDbl(QtyZ) If QtyZ < 2 Then MsgBox "Please increase Gear Teeth.", , "Data Review" FrmGear.Show TxtZ.SetFocus Exit Sub End If

44

2-1-3) Get the Module of the Gear and check its value

Dim m As Double

'Gear Module

m = Val(CmbM.Text) If m = 0 Then MsgBox "Please increase Gear Module", , "Data Review" FrmGear.Show CmbM.SetFocus Exit Sub End If

45

2-1-4) Get the thickness of the gear and check its value

Dim t As Double

'Gear Thickness

t = Val(TxtT.Text) If t = 0 Then MsgBox "Please Enter Gear Thickness.", , "Data Review" FrmGear.Show TxtT.SetFocus Exit Sub End If

46

2-1-5) Get the Diameter of the Shaft Hole and check its value Dim SD As Double

'Gear Shaft Hole Diameter

If ChHole.Value = True Then SD = Val(TxtShaftDia.Text) If SD = 0 Then MsgBox "Please Enter Hole Diameter.", , "Data Review" FrmGear.Show TxtShaftDia.SetFocus Exit Sub End If End If

47

2-1-6) Get the width and depth of the Key and check their values Dim KW As Double

'Gear Key Width

Dim KD As Double

'Gear Key Depth

If ChKey.Value = True Then KW = Val(TxtKeyWidth.Text) If KW = 0 Then MsgBox "Please Enter Width of Key.", , "Data Review" FrmGear.Show TxtKeyWidth.SetFocus Exit Sub End If

KD = Val(TxtKeyDepth.Text) If KD = 0 Then MsgBox "Please Enter Depth of Key.", , "Data Review" FrmGear.Show TxtKeyDepth.SetFocus Exit Sub End If End If

48

2-1-7) Get the Chamfer Data and check its value

Dim ChX As Double 'Gear Chamfer in X (or H in sketcher) direction Dim ChY As Double 'Gear Chamfer in Y (or V in sketcher) direction If ChChamfer.Value = True Then ChX = Val(TxtChX.Text) If ChX = 0 Then MsgBox "Please Enter Chamfer in H Direction.", , "Data Review" FrmGear.Show TxtChX.SetFocus Exit Sub End If

ChY = Val(TxtChY.Text) If ChY = 0 Then MsgBox "Please Enter Chamfer in V Direction.", , "Data Review" FrmGear.Show TxtChY.SetFocus Exit Sub End If End If

49

2-1-8) Get the Helix angle

Dim HelixAngle As Double

'Gear Helix Angle

HelixAngle = Val(TxtHelixAngle.Text)

50

2-1-9) Get the Scale of Diameter and check its value Dim Sc As Double

'Scale in conic Gear types

Sc = Val(TxtScale.Text) If (Op3.Value = True Or Op4.Value = True) And Sc = 0 Then MsgBox "Please Increase Conic Scale.", , "Data Review" FrmGear.Show TxtScale.SetFocus Exit Sub End If

51

2-1-10) Calculate the five Radiuses necessary to draw Gear Tooth

Dim Rt As Double Dim Ro As Double Dim Rd As Double

'Gear minimum Radius (Dedendum)

Dim Ru As Double

'Gear Maximum Radius (Addendum)

Dim Rf As Double

'Fillet Radius

Ro = m * Z / 2# Rt = 0.94 * Ro Rd = Ro - 1.25 * m Ru = Ro + m Rf = 0.35 * m

If Rd Ru Then 'Chamfer in Y (V) Direction must be smaller than Gear Addendum MsgBox "Please reduce chamfer in V direction.", , "Data Review" FrmGear.Show TxtChY.SetFocus Exit Sub End If

If ChX > t / 2 Then 'Chamfer in X (H) Direction must be smaller than (or equal to) Half of Gear thickness MsgBox "Please reduce chamfer in H direction.", , "Data Review" FrmGear.Show TxtChX.SetFocus Exit Sub End If End If

57

2-1-16) Find the center point of the pitch circle

Dim X0 As Double Dim Y0 As Double Dim Z0 As Double X0 = 0 Y0 = Val(TxtY0.Text) Z0 = 0

Dim H0 As Double Dim V0 As Double H0 = 0 V0 = 0

Dim XPtOc1 As Double Dim YPtOc1 As Double XPtOc1 = Rt * Cos(GamaRad) YPtOc1 = Rt * Sin(GamaRad)

58

2-1-17) Find a point on pitch circle

Dim XPt1 As Double Dim YPt1 As Double XPt1 = -Ro * Sin(BetaRad) YPt1 = Ro * Cos(BetaRad)

59

2-1-18) Calculate the pitch circle radius Dim R1 As Double R1 = Sqr((XPtOc1 - XPt1) ^ 2 + (YPtOc1 - YPt1) ^ 2)

60

2-1-19) Find the intersection point on Addendum circle by Functions Xn,Yp

Dim XPt2 As Double Dim YPt2 As Double XPt2 = Xn(H0, V0, Ru, XPtOc1, YPtOc1, R1) YPt2 = Yp(H0, V0, Ru, XPtOc1, YPtOc1, R1)

61

2-1-20) Control existence of the Addendum circle XPt2 must be negative.

If XPt2 >= 0 Then MsgBox "Profile Error, ", , "Data Review" FrmGear.Show Exit Sub End If

62

2-1-21) Find the center point of the fillet circle

Dim XPtOc2 As Double Dim YPtOc2 As Double XPtOc2 = Xn(H0, V0, Rd + Rf, XPtOc1, YPtOc1, R1 + Rf) YPtOc2 = Yp(H0, V0, Rd + Rf, XPtOc1, YPtOc1, R1 + Rf)

63

2-1-22) Find the intersection point of pitch circle and fillet circle

Dim XPt3 As Double Dim YPt3 As Double XPt3 = Xn(XPtOc2, YPtOc2, Rf, XPtOc1, YPtOc1, R1) YPt3 = Yp(XPtOc2, YPtOc2, Rf, XPtOc1, YPtOc1, R1)

64

2-1-23) Find the intersection point of the Dedendum circle and fillet circle

Dim XPt4 As Double Dim YPt4 As Double XPt4 = Xn(XPtOc2, YPtOc2, Rf, H0, V0, Rd) YPt4 = Yp(XPtOc2, YPtOc2, Rf, H0, V0, Rd)

If ProfileError = True Then MsgBox "Profile Error", , "Data Review" FrmGear.Show Exit Sub End If

65

2-1-24) Find the last point on Dedendum circle

Dim TetaRad As Double TetaRad = TotalAngleRad - Atn(Abs(XPt4) / Abs(YPt4)) Dim XPt5 As Double XPt5 = -Rd * Sin(TetaRad) Dim YPt5 As Double YPt5 = Rd * Cos(TetaRad)

66

2-1-25) Control the existence of the Dedendum circle XPt5 must be smaller than XPt4.

If XPt5 >= XPt4 Then MsgBox "Profile Error", , "Data Review" FrmGear.Show Exit Sub End If

67

2-2) Create Body (Sub: common) '---Starting of Base Wireframe--Dim myPart As Part Set myPart = CATIA.ActiveDocument.Part Dim myBodies As Bodies Set myBodies = myPart.Bodies 'Create a new Body Dim myBody As Body Set myBody = myBodies.Add 'File: Gear1~4.CATPart/Body.2

68

2-3) Create Plane for Tooth Profile Sketch Sub: Common 'Define a Shape Factory Dim mySF As ShapeFactory Set mySF = myPart.ShapeFactory

'Define a Hybrid Shape Factory Dim HSF As HybridShapeFactory Set HSF = myPart.HybridShapeFactory

' ---Create Reference Plane (an Offset Plane of ZX Plane) -----Dim myOriginElements As OriginElements, myPlane Set myOriginElements = myPart.OriginElements 'Define ZX Plane Set myPlane = myOriginElements.PlaneZX Dim myPlaneY As HybridShapePlaneOffset Set myPlaneY = HSF.AddNewPlaneOffset(myPlane, Y0, False) 'File: Gear1~4.CATPart/Body.2/Plane.1

myBody.InsertHybridShape myPlaneY 'Create reference for Offset Plane Dim RefmyPlaneY As Reference Set RefmyPlaneY = myPart.CreateReferenceFromObject(myPlaneY) myPart.Update

69

2-4) Create Base Sketch (Tooth Profile Sketch) Sub: common. This sketch (like the sketch of Chamfer and Shaft Hole) is not fully defined. As a practice, you can add constraints to the objects.

70

2-4-1) Find the Center points of circles and Start point and End point of Arcs Use the Intersection points of the circles.

Fig. 2-4-1: Tree of tooth Sketch

71

Dim mySketches As sketches Set mySketches = myBody.sketches

Dim mySketch As Sketch Set mySketch = mySketches.Add(RefmyPlaneY) 'Add Sketch , File: Gear1~4.CATPart/Body.2/Sketch.1

myPart.InWorkObject = mySketch Dim F2D As Factory2D Set F2D = mySketch.OpenEdition()

AlphaRad = Pi * Alpha / 180

Dim PtOc1 As Point2D Set PtOc1 = F2D.CreatePoint(XPtOc1, YPtOc1) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Point.1

Dim Pt1 As Point2D Set Pt1 = F2D.CreatePoint(XPt1, YPt1) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Point.2

Dim PtCtr As Point2D Set PtCtr = F2D.CreatePoint(H0, V0) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Point.3

72

Dim Pt2 As Point2D Set Pt2 = F2D.CreatePoint(XPt2, YPt2) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Point.4

Dim PtOc2 As Point2D Set PtOc2 = F2D.CreatePoint(XPtOc2, YPtOc2) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Point.5

Dim Pt3 As Point2D Set Pt3 = F2D.CreatePoint(XPt3, YPt3) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Point.6

Dim Pt4 As Point2D Set Pt4 = F2D.CreatePoint(XPt4, YPt4) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Point.7

Dim Circle1 As Circle2D Set Circle1 = F2D.CreateCircle(XPtOc1, YPtOc1, R1, 0, Pi * 2) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Circle.1

Circle1.CenterPoint = PtOc1 Circle1.StartPoint = Pt2 Circle1.EndPoint = Pt3

73

Dim Circle2 As Circle2D Set Circle2 = F2D.CreateCircle(XPtOc2, YPtOc2, Rf, 0, Pi * 2) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Circle.2 Circle2.CenterPoint = PtOc2 Circle2.StartPoint = Pt4 Circle2.EndPoint = Pt3 '---Drawing Right side of Profile--Dim Pt2m As Point2D Set Pt2m = F2D.CreatePoint(-XPt2, YPt2) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Point.8

Dim PtOc1m As Point2D Set PtOc1m = F2D.CreatePoint(-XPtOc1, YPtOc1) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Point.9

Dim Pt3m As Point2D Set Pt3m = F2D.CreatePoint(-XPt3, YPt3) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Point.10

Dim Circle1m As Circle2D Set Circle1m = F2D.CreateCircle(-XPtOc1, YPtOc1, R1, 0, Pi * 2) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Circle.3 Circle1m.CenterPoint = PtOc1m Circle1m.StartPoint = Pt3m Circle1m.EndPoint = Pt2m

74

Dim PtOc2m As Point2D Set PtOc2m = F2D.CreatePoint(-XPtOc2, YPtOc2) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Point.11

Dim Pt4m As Point2D Set Pt4m = F2D.CreatePoint(-XPt4, YPt4) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Point.12

Dim Circle2m As Circle2D Set Circle2m = F2D.CreateCircle(-XPtOc2, YPtOc2, Rf, 0, Pi * 2) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Circle.4 Circle2m.CenterPoint = PtOc2m Circle2m.StartPoint = Pt3m Circle2m.EndPoint = Pt4m

Dim Pt5 As Point2D Set Pt5 = F2D.CreatePoint(XPt5, YPt5) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Point.13 '---------------------------------------------Dim CircleU As Circle2D Set CircleU = F2D.CreateCircle(-0, 0, Ru, 0, Pi * 2) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Circle.5 CircleU.CenterPoint = PtCtr CircleU.StartPoint = Pt2m CircleU.EndPoint = Pt2

75

Dim CircleD As Circle2D Set CircleD = F2D.CreateCircle(-0, 0, Rd, 0, Pi * 2) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Circle.6 CircleD.CenterPoint = PtCtr CircleD.StartPoint = Pt4 CircleD.EndPoint = Pt5 '----Drawing Construction Lines and Circles (It is not necessary; just to see Geometric relations) Dim Circle1Const As Circle2D Set Circle1Const = F2D.CreateClosedCircle(XPtOc1, YPtOc1, R1) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Circle.7 Circle1Const.Construction = True Dim Circle2Const As Circle2D Set Circle2Const = F2D.CreateClosedCircle(XPtOc2, YPtOc2, Rf) 'File: Gear1~4.CATPart/Body.2/Sketch.1/Circle.8 Circle2Const.Construction = True Dim CircleUConst As Circle2D Set CircleUConst = F2D.CreateClosedCircle(0, 'File: Gear1~4.CATPart/Body.2/Sketch.1/Circle.9

0,

Ru)

0,

Rd)

CircleUConst.Construction = True Dim CircleDConst As Circle2D Set CircleDConst = F2D.CreateClosedCircle(0, 'File: Gear1~4.CATPart/Body.2/Sketch.1/Circle.10 CircleDConst.Construction = True Dim CircletConst As Circle2D

76

Set CircletConst = F2D.CreateClosedCircle(0, 'File: Gear1~4.CATPart/Body.2/Sketch.1/Circle.11

0,

Rt)

0,

Ro)

CircletConst.Construction = True Dim CircleOConst As Circle2D Set CircleOConst = F2D.CreateClosedCircle(0, 'File: Gear1~4.CATPart/Body.2/Sketch.1/Circle.12 CircleOConst.Construction = True Dim Line1Const As Line2D Set Line1Const = F2D.CreateLine(0, 0, 'File: Gear1~4.CATPart/Body.2/Sketch.1/Line.1

XPtOc1,

YPtOc1)

Line1Const.Construction = True Dim Line2Const As Line2D Set Line2Const = F2D.CreateLine(0, 'File: Gear1~4.CATPart/Body.2/Sketch.1/Line.2

0,

XPt1,

YPt1)

Line2Const.Construction = True '---------------------------------------------

mySketch.CloseEdition myPart.InWorkObject = mySketch myPart.Update

'------------------------------------------------------Dim RefmySketch As Reference Set RefmySketch = myPart.CreateReferenceFromObject(mySketch)

Dim myJoin As HybridShapeAssemble Set myJoin = HSF.AddNewJoin(RefmySketch, RefmySketch) 77

'Join of first Profile Tooth of Gear 'File: Gear1~4.CATPart/Body.2/Join.1

Dim RefmyJoin As Reference Set RefmyJoin = myPart.CreateReferenceFromObject(myJoin)

myBody.InsertHybridShape myJoin myPart.Update

Public Function Xn(x1 As Double, y1 As Double, R1 As Double, x2 As Double, y2 As Double, R2 As Double) As Double Dim D As Double Dim L As Double Dim H As Double Epsilon = 0.00001 D = Sqr((x1 - x2) ^ 2 + (y1 - y2) ^ 2) L = (R1 ^ 2 - R2 ^ 2 + D ^ 2) / (2 * D)

If R1 - L < -Epsilon Then ProfileError = True ‘(R1 must be bigger than L because of Sqr(R1 ^ 2 - L ^ 2); else if R1 is smaller than L, variable ProfileError is set to True and Function will be terminated.) Exit Function End If

78

If Abs(R1 - L) < Epsilon Then H = 0 Else H = Sqr(R1 ^ 2 - L ^ 2) End If Xn = L * (x2 - x1) / D - H * (y2 - y1) / D + x1

End Function

Public Function Yp(x1 As Double, y1 As Double, R1 As Double, x2 As Double, y2 As Double, R2 As Double) As Double Dim D As Double Dim L As Double Dim H As Double Epsilon = 0.00001 D = Sqr((x1 - x2) ^ 2 + (y1 - y2) ^ 2) L = (R1 ^ 2 - R2 ^ 2 + D ^ 2) / (2 * D)

If R1 - L < -Epsilon Then ProfileError = True ‘(R1 must be bigger than L because of Sqr(R1 ^ 2 - L ^ 2) ) Exit Function End If

If Abs(R1 - L) < Epsilon Then 79

H = 0 Else H = Sqr(R1 ^ 2 - L ^ 2) End If Yp = L * (y2 - y1) / D + H * (x2 - x1) / D + y1

End Function

80

2-5) Create Full Teeth Profile (Circular Pattern) and Join them (Sub: common)

'---Create Full Gear Profile in GSD--Dim reference1 As Reference Set reference1 = myPart.CreateReferenceFromName("") Dim reference2 As Reference Set reference2 = myPart.CreateReferenceFromName("") Dim Factory2D1 As Factory2D Set Factory2D1 = mySketch.Factory2D

Dim myCP1 As CircPattern Set myCP1 = mySF.AddNewSurfacicCircPattern(Factory2D1, 1, 2, 20#, 45#, 1, 1, reference1, reference2, True, 0#, True, False) 'File: Gear1~4.CATPart/Body.2/CircPattern.1 myCP1.CircularPatternParameters = catInstancesandAngularSpacing Dim angularRepartition1 As AngularRepartition Set angularRepartition1 = myCP1.AngularRepartition Dim angle1 As Angle Set angle1 = angularRepartition1.AngularSpacing angle1.Value = 360 / Z

Dim angularRepartition2 As AngularRepartition Set angularRepartition2 = myCP1.AngularRepartition

Dim intParam1 As IntParam 81

Set intParam1 = angularRepartition2.InstancesCount intParam1.Value = Z + 1

Dim HS As HybridShapeFactory Set HS = myPart.HybridShapeFactory

HS.GSMVisibility RefmyPlaneY, 0

'Hiding Plane

Dim YDir As HybridShapeDirection

'Define Y direction

Set YDir = HS.AddNewDirectionByCoord(0#, 1#, 0#)

Dim RefYDir As Reference Set RefYDir = myPart.CreateReferenceFromObject(YDir) 'Define Rotation Axis of Circular Pattern

myCP1.SetRotationAxis RefYDir myPart.Update

Dim RefmyCP1 As Reference Set RefmyCP1 = myPart.CreateReferenceFromObject(myCP1) 'joining Full Profile Dim myJoin2 As HybridShapeAssemble Set myJoin2 = HSF.AddNewJoin(RefmyCP1, 'File: Gear1~4.CATPart/Body.2/Join.2

RefmyCP1)

myBody.InsertHybridShape myJoin2 82

myPart.Update

Dim RefmyJoin2 As Reference Set RefmyJoin2 = myPart.CreateReferenceFromObject(myJoin2)

HS.GSMVisibility RefmyJoin, 0 HS.GSMVisibility RefmyJoin2, 0

'---Calling a Subroutine relative to Gear Type---

If Op1.Value = True Then Call Gear1(RefmyJoin2, myPart, mySF, HS, RefmyJoin, t, Y0)

HSF,

RefmyPlaneY,

myBody,

If ChHole.Value = True Then Call HoleKey(mySketches, RefmyPlaneY, myPart, KW, KD, SD, F2D, t, mySF) End If If ChChamfer.Value = True Then Call Chamfer(myOriginElements, mySketches, myPart, ChX, ChY, Ru, Y0, F2D, t, mySF) End If ElseIf Op2.Value = True Then Call Gear2(RefmyJoin2, RefmyCP1, HSF, RefmyPlaneY, myBody, myPart, mySF, HS, RefmyJoin, t, HelixAngle, Y0) If ChHole.Value = True Then Call HoleKey(mySketches, RefmyPlaneY, myPart, KW, KD, SD, F2D, t, mySF)

83

End If If ChChamfer.Value = True Then Call Chamfer(myOriginElements, mySketches, myPart, ChX, ChY, Ru, Y0, F2D, t, mySF) End If ElseIf Op3.Value = True Then Call Gear3(RefmyJoin2, RefmyCP1, HSF, myBody, myPart, mySF, HS, RefmyJoin, t, Sc, Y0)

RefmyPlaneY,

If ChHole.Value = True Then Call HoleKey(mySketches, RefmyPlaneY, myPart, KW, KD, SD, F2D, t, mySF) End If ElseIf Op4.Value = True Then Call Gear4(RefmyJoin2, RefmyCP1, HSF, RefmyPlaneY, myBody, myPart, mySF, HS, RefmyJoin, t, HelixAngle, Sc, Y0) If ChHole.Value = True Then Call HoleKey(mySketches, RefmyPlaneY, myPart, KW, KD, SD, F2D, t, mySF) End If End If

84

2-6) Type 1: Create Solid (Pad) (Sub: Gear1)

Sub Gear1(RefmyJoin2 As Reference, HSF As HybridShapeFactory, RefmyPlaneY As Reference, myBody As Body, myPart As Part, mySF As ShapeFactory, HS As HybridShapeFactory, RefmyJoin As Reference, t As Double, Y0 As Double) 'Create Pad myPart.InWorkObject = myBody Dim myPad As Pad Set myPad = mySF.AddNewPadFromRef(RefmyJoin2, t) Gear1.CATPart/Body.2/Pad.1

'File:

myPart.Update

End Sub

85

2-7) Type 2: Create Solid (Multi-section solid) (Sub: Gear2) 2-7-1) Translate and Rotate of first profile 2-7-2) Create Loft (Multi-section Solid)

Sub Gear2(RefmyJoin2 As Reference, RefmyCP1 As Reference, HSF As HybridShapeFactory, RefmyPlaneY As Reference, myBody As Body, myPart As Part, mySF As ShapeFactory, HS As HybridShapeFactory, RefmyJoin As Reference, t As Double, HelixAngle As Double, Y0 As Double)

'MULTI-SECTION

myPart.InWorkObject = myBody

Set HS = myPart.HybridShapeFactory

Set YDir = HS.AddNewDirectionByCoord(0#, 1#, 0#) Set RefYDir = myPart.CreateReferenceFromObject(YDir) '---Create First Translation of Profile Dim myTranslate1 As HybridShapeTranslate Set myTranslate1 = HS.AddNewEmptyTranslate() 'File: Gear2.CATPart/Body.2/Translate.1

myTranslate1.ElemToTranslate = RefmyCP1 myTranslate1.VectorType = 0

86

myTranslate1.Direction = YDir myTranslate1.DistanceValue = -t myTranslate1.VolumeResult = False

myBody.InsertHybridShape myTranslate1 myPart.InWorkObject = myTranslate1

Dim RefmyTranslate1 As Reference Set RefmyTranslate1 = myPart.CreateReferenceFromObject(myTranslate1)

myPart.Update

'---Rotation of Translated Profile--Dim myRotate1 As HybridShapeRotate Set myRotate1 = HS.AddNewEmptyRotate() 'File: Gear2.CATPart/Body.2/Rotate.1

myRotate1.ElemToRotate = RefmyTranslate1 myRotate1.VolumeResult = False myRotate1.RotationType = 0

myRotate1.Axis = RefYDir myRotate1.AngleValue = HelixAngle myBody.InsertHybridShape myRotate1

87

myPart.InWorkObject = myRotate1 HS.GSMVisibility RefmyTranslate1, 0

Dim RefmyRotate1 As Reference Set RefmyRotate1 = myPart.CreateReferenceFromObject(myRotate1) myPart.Update

Dim myJoin3 As HybridShapeAssemble Set myJoin3 = HSF.AddNewJoin(RefmyRotate1, RefmyRotate1) 'File: Gear1.CATPart/Body.2/Join.3 myBody.InsertHybridShape myJoin3 myPart.Update

Dim RefmyJoin3 As Reference Set RefmyJoin3 = myPart.CreateReferenceFromObject(myJoin3)

myPart.Update '---Create Multi-Section Solid Dim SF As ShapeFactory Set SF = myPart.ShapeFactory

Dim myLoft As Loft Set myLoft = SF.AddNewLoft()

Dim LoftH As HybridShapeLoft Set LoftH = myLoft.HybridShape 88

'File: Gear2.CATPart/Body.2/Multi-sections Solid.1

LoftH.AddSectionToLoft RefmyJoin2, 1, Nothing LoftH.AddSectionToLoft RefmyJoin3, 1, Nothing

Dim RefmyLoft1 As Reference Set RefmyLoft1 = myPart.CreateReferenceFromObject(myLoft)

myPart.Update

HS.GSMVisibility RefmyJoin, 0 HS.GSMVisibility RefmyJoin2, 0 HS.GSMVisibility RefmyJoin3, 0 '''''''''''''' myPart.Update

End Sub

89

2-8) Type 3: Create Solid (Multi-section Solid) (Sub: Gear3) 2-8-1) Translate and Scale of first profile 2-8-1) Create Loft (Multi-section Solid)

Sub Gear3(RefmyJoin2 As Reference, RefmyCP1 As Reference, HSF As HybridShapeFactory,

RefmyPlaneY

As

Reference,

myBody

As

Body,

myPart As Part, mySF As ShapeFactory, HS As HybridShapeFactory, RefmyJoin As Reference, t As Double, Sc As Double, Y0 As Double)

'---MULTI-SECTION myPart.InWorkObject = myBody

Set HS = myPart.HybridShapeFactory

Set YDir = HS.AddNewDirectionByCoord(0#, 1#, 0#)

Set RefYDir = myPart.CreateReferenceFromObject(YDir) '---Create First Translation of Profile Dim myTranslate1 As HybridShapeTranslate Set myTranslate1 = HS.AddNewEmptyTranslate() 'File: Gear3.CATPart/Body.2/Translate.1

90

myTranslate1.ElemToTranslate = RefmyCP1 myTranslate1.VectorType = 0 myTranslate1.Direction = YDir myTranslate1.DistanceValue = -t myTranslate1.VolumeResult = False

myBody.InsertHybridShape myTranslate1 myPart.InWorkObject = myTranslate1

Dim RefmyTranslate1 As Reference Set

RefmyTranslate1

=

myPart.CreateReferenceFromObject(myTranslate1) HS.GSMVisibility RefmyTranslate1, 0 myPart.Update

'---Scale First Translation of Profile Dim PtCtr2 As HybridShapePointCoord Set PtCtr2 = HSF.AddNewPointCoord(0, Y0 - t, 0) 'File: Gear3.CATPart/Body.2/Point.1 myBody.InsertHybridShape PtCtr2 Dim RefPtCtr2 As Reference Set RefPtCtr2 = myPart.CreateReferenceFromObject(PtCtr2) 91

Dim myScaling1 As HybridShapeScaling Set

myScaling1

=

HSF.AddNewHybridScaling(RefmyTranslate1,

RefPtCtr2, Sc) 'File: Gear3.CATPart/Body.2/Scaling.1

myScaling1.VolumeResult = False myBody.InsertHybridShape myScaling1 Dim RefmyScaling1 As Reference Set

RefmyScaling1

=

myPart.CreateReferenceFromObject(myScaling1)

HS.GSMVisibility RefmyScaling1, 0 HS.GSMVisibility RefPtCtr2, 0

Dim myJoin3 As HybridShapeAssemble Set myJoin3 = HSF.AddNewJoin(RefmyScaling1, RefmyScaling1) 'File: Gear3.CATPart/Body.2/Join.3 myBody.InsertHybridShape myJoin3 myPart.Update

92

Dim RefmyJoin3 As Reference Set RefmyJoin3 = myPart.CreateReferenceFromObject(myJoin3)

myPart.Update

'---Create Multi-Section Solid Dim SF As ShapeFactory Set SF = myPart.ShapeFactory

Dim myLoft As Loft Set myLoft = SF.AddNewLoft() 'File: Gear3.CATPart/Body.2/Multi-sections Solid.1

Dim LoftH As HybridShapeLoft Set LoftH = myLoft.HybridShape

LoftH.AddSectionToLoft RefmyJoin2, 1, Nothing LoftH.AddSectionToLoft RefmyJoin3, 1, Nothing

Dim RefmyLoft1 As Reference Set RefmyLoft1 = myPart.CreateReferenceFromObject(myLoft)

93

myPart.Update

HS.GSMVisibility RefmyJoin, 0 HS.GSMVisibility RefmyJoin2, 0 HS.GSMVisibility RefmyJoin3, 0 '-------------------------------

myPart.Update

End Sub

94

2-9) Type 4: Create Solid (Multi-section Solid) (Sub: Gear4) 2-9-1) First Translate, Rotate and Scale of first profile 2-9-2) Second Translate, Rotate and Scale of first profile 2-9-3) Create Loft (Multi-section Solid)

Sub Gear4(RefmyJoin2 As Reference, RefmyCP1 As Reference, HSF As HybridShapeFactory, RefmyPlaneY As Reference, myBody As Body, myPart As Part, mySF As ShapeFactory, HS As HybridShapeFactory, RefmyJoin As Reference, t As Double, HelixAngle As Double, Sc As Double, Y0 As Double)

'---MULTI-SECTION myPart.InWorkObject = myBody

Set HS = myPart.HybridShapeFactory

Set YDir = HS.AddNewDirectionByCoord(0#, 1#, 0#)

Set RefYDir = myPart.CreateReferenceFromObject(YDir) '---Create First Translation of Profile Dim myTranslate1 As HybridShapeTranslate Set myTranslate1 = HS.AddNewEmptyTranslate() 'File: Gear4.CATPart/Body.2/Translate.1

myTranslate1.ElemToTranslate = RefmyCP1 myTranslate1.VectorType = 0 95

myTranslate1.Direction = YDir myTranslate1.DistanceValue = -t / 2 myTranslate1.VolumeResult = False

myBody.InsertHybridShape myTranslate1 myPart.InWorkObject = myTranslate1

Dim RefmyTranslate1 As Reference Set RefmyTranslate1 = myPart.CreateReferenceFromObject(myTranslate1)

myPart.Update

'---Rotate First Translation of Profile Dim myRotate1 As HybridShapeRotate Set myRotate1 = HS.AddNewEmptyRotate() 'File: Gear4.CATPart/Body.2/Rotate.1

myRotate1.ElemToRotate = RefmyTranslate1 myRotate1.VolumeResult = False myRotate1.RotationType = 0

myRotate1.Axis = RefYDir myRotate1.AngleValue = HelixAngle myBody.InsertHybridShape myRotate1

96

myPart.InWorkObject = myRotate1 HS.GSMVisibility RefmyTranslate1, 0

Dim RefmyRotate1 As Reference Set RefmyRotate1 = myPart.CreateReferenceFromObject(myRotate1) myPart.Update HS.GSMVisibility RefmyRotate1, 0 '---Scale First Translation of Profile Dim PtCtr2 As HybridShapePointCoord Set PtCtr2 = HSF.AddNewPointCoord(0, Y0 - t / 2, 0) 'File: Gear4.CATPart/Body.2/Point.1 myBody.InsertHybridShape PtCtr2 Dim RefPtCtr2 As Reference Set RefPtCtr2 = myPart.CreateReferenceFromObject(PtCtr2)

Dim myScaling1 As HybridShapeScaling Set myScaling1 = RefPtCtr2, (1 + Sc) / 2#)

HSF.AddNewHybridScaling(RefmyRotate1,

'File: Gear4.CATPart/Body.2/Scaling.1 myScaling1.VolumeResult = False myBody.InsertHybridShape myScaling1 Dim RefmyScaling1 As Reference Set RefmyScaling1 = myPart.CreateReferenceFromObject(myScaling1)

97

HS.GSMVisibility RefmyScaling1, 0 HS.GSMVisibility RefPtCtr2, 0

Dim myJoin3 As HybridShapeAssemble Set myJoin3 = HSF.AddNewJoin(RefmyScaling1, RefmyScaling1) 'File: Gear4.CATPart/Body.2/Join.3 myBody.InsertHybridShape myJoin3 myPart.Update

Dim RefmyJoin3 As Reference Set RefmyJoin3 = myPart.CreateReferenceFromObject(myJoin3)

myPart.Update '---Create Second Translation of Profile Dim myTranslate2 As HybridShapeTranslate Set myTranslate2 = HS.AddNewEmptyTranslate() 'File: Gear4.CATPart/Body.2/Translate.2

myTranslate2.ElemToTranslate = RefmyCP1 myTranslate2.VectorType = 0 myTranslate2.Direction = YDir myTranslate2.DistanceValue = -t myTranslate2.VolumeResult = False

myBody.InsertHybridShape myTranslate2 myPart.InWorkObject = myTranslate2 98

Dim RefmyTranslate2 As Reference Set RefmyTranslate2 = myPart.CreateReferenceFromObject(myTranslate2)

myPart.Update '---Rotate Second Translation of Profile Dim myRotate2 As HybridShapeRotate Set myRotate2 = HS.AddNewEmptyRotate() 'File: Gear4.CATPart/Body.2/Rotate.2

myRotate2.ElemToRotate = RefmyTranslate2 myRotate2.VolumeResult = False myRotate2.RotationType = 0

myRotate2.Axis = RefYDir myRotate2.AngleValue = 3 * HelixAngle / 2 myBody.InsertHybridShape myRotate2

myPart.InWorkObject = myRotate2 HS.GSMVisibility RefmyTranslate2, 0

Dim RefmyRotate2 As Reference Set RefmyRotate2 = myPart.CreateReferenceFromObject(myRotate2) HS.GSMVisibility RefmyRotate2, 0 99

myPart.Update

'---Scale Second Translation of Profile

Dim PtCtr3 As HybridShapePointCoord 'define center Point of Scale Set PtCtr3 = HSF.AddNewPointCoord(0, Y0 - t, 0) 'File: Gear4.CATPart/Body.2/Point.2 myBody.InsertHybridShape PtCtr3 Dim RefPtCtr3 As Reference Set RefPtCtr3 = myPart.CreateReferenceFromObject(PtCtr3)

Dim myScaling2 As HybridShapeScaling Set myScaling2 = HSF.AddNewHybridScaling(RefmyRotate2, RefPtCtr3, Sc) 'File: Gear4.CATPart/Body.2/Scaling.2 myScaling2.VolumeResult = False myBody.InsertHybridShape myScaling2 Dim RefmyScaling2 As Reference Set RefmyScaling2 = myPart.CreateReferenceFromObject(myScaling2)

HS.GSMVisibility RefmyScaling2, 0 HS.GSMVisibility RefPtCtr3, 0

Dim myJoin4 As HybridShapeAssemble 100

'Joining Scaled Profile Set myJoin4 = HSF.AddNewJoin(RefmyScaling2, RefmyScaling2) 'File: Gear4.CATPart/Body.2/Join.4 myBody.InsertHybridShape myJoin4 myPart.Update

Dim RefmyJoin4 As Reference Set RefmyJoin4 = myPart.CreateReferenceFromObject(myJoin4)

myPart.Update '---Create Multi-Section Solid Dim SF As ShapeFactory Set SF = myPart.ShapeFactory

Dim myLoft As Loft Set myLoft = SF.AddNewLoft() 'File: Gear4.CATPart/Body.2/Multi-sections Solid.1

Dim LoftH As HybridShapeLoft Set LoftH = myLoft.HybridShape

LoftH.AddSectionToLoft RefmyJoin2, 1, Nothing LoftH.AddSectionToLoft RefmyJoin3, 1, Nothing LoftH.AddSectionToLoft RefmyJoin4, 1, Nothing

Dim RefmyLoft1 As Reference 101

Set RefmyLoft1 = myPart.CreateReferenceFromObject(myLoft)

myPart.Update

HS.GSMVisibility RefmyJoin, 0 HS.GSMVisibility RefmyJoin2, 0 HS.GSMVisibility RefmyJoin3, 0 HS.GSMVisibility RefmyJoin4, 0 '------------------------------------------------

myPart.Update

End Sub

102

2-10) Create Hole and Key (Pocket) (Sub: HoleKey) 2-10-1) Create Sketch

Fig 2-10-1: Sketch of Shaft Hole and Key

Sub HoleKey(mySketches As sketches, RefmyPlaneY As Reference, myPart As Part, KW As Double, KD As Double, SD As Double, F2D As Factory2D, t As Double, mySF As ShapeFactory)

Dim mySketchHole As Sketch Set mySketchHole = mySketches.Add(RefmyPlaneY) 'File: Gear1~4.CATPart/Body.2/Pocket.1/Sketch.2

myPart.InWorkObject = mySketchHole 103

Set F2D = mySketchHole.OpenEdition()

Dim CircleShaft As Circle2D

If ChKey.Value = True Then

Dim XPt1Key As Double Dim YPt1Key As Double XPt1Key = KW / 2 YPt1Key = Sqr((SD / 2) ^ 2 - XPt1Key ^ 2)

Dim XPt2Key As Double Dim YPt2Key As Double XPt2Key = KW / 2 YPt2Key = YPt1Key + KD

Dim XPt3Key As Double Dim YPt3Key As Double XPt3Key = -KW / 2 YPt3Key = YPt2Key

Dim XPt4Key As Double Dim YPt4Key As Double XPt4Key = -KW / 2 YPt4Key = YPt1Key

104

Dim Pt1Key As Point2D Set Pt1Key = F2D.CreatePoint(XPt1Key, YPt1Key) 'File: Gear1~4.CATPart/Body.2/Pocket.1/Sketch.2/Point.1 Dim Pt2Key As Point2D Set Pt2Key = F2D.CreatePoint(XPt2Key, YPt2Key) 'File: Gear1~4.CATPart/Body.2/Pocket.1/Sketch.2/Point.2 Dim Pt3Key As Point2D Set Pt3Key = F2D.CreatePoint(XPt3Key, YPt3Key) 'File: Gear1~4.CATPart/Body.2/Pocket.1/Sketch.2/Point.3 Dim Pt4Key As Point2D Set Pt4Key = F2D.CreatePoint(XPt4Key, YPt4Key) 'File: Gear1~4.CATPart/Body.2/Pocket.1/Sketch.2/Point.4

Dim Line12Key As Line2D Set Line12Key = F2D.CreateLine(XPt1Key, YPt1Key, XPt2Key, YPt2Key) 'File: Gear1~4.CATPart/Body.2/Pocket.1/Sketch.2/Line.1 Line12Key.StartPoint = Pt1Key Line12Key.EndPoint = Pt2Key

Dim Line23Key As Line2D Set Line23Key = F2D.CreateLine(XPt2Key, YPt2Key, XPt3Key, YPt3Key) 'File: Gear1~4.CATPart/Body.2/Pocket.1/Sketch.2/Line.2 Line23Key.StartPoint = Pt2Key Line23Key.EndPoint = Pt3Key 105

Dim Line34Key As Line2D Set Line34Key = F2D.CreateLine(XPt3Key, YPt3Key, XPt4Key, YPt4Key) 'File: Gear1~4.CATPart/Body.2/Pocket.1/Sketch.2/Line.3 Line34Key.StartPoint = Pt3Key Line34Key.EndPoint = Pt4Key

Set PtCtr = F2D.CreatePoint(H0, V0) 'File: Gear1~4.CATPart/Body.2/Pocket.1/Sketch.2/Point.5

Set CircleShaft = F2D.CreateCircle(0, 0, SD / 2, Pi / 2 + Atn(XPt1Key / YPt1Key), Pi * 2 + Atn(YPt1Key / XPt1Key)) 'File: Gear1~4.CATPart/Body.2/Pocket.1/Sketch.2/Circle.1

Else Set CircleShaft = F2D.CreateClosedCircle(0, 0, SD / 2) 'File: Gear1~4.CATPart/Body.2/Pocket.1/Sketch.2/Circle.1 End If mySketchHole.CloseEdition myPart.InWorkObject = mySketchHole myPart.Update

Dim myPocket As Pocket Set myPocket = mySF.AddNewPocket(mySketchHole, t) myPart.Update End Sub 106

2-11) Create Chamfer (Groove) (Sub: Chamfer) 2-11-1) Create Sketch

Fig 2-11-1: Sketch of Chamfer

107

Fig 2-11-2: Tree of Sketch Chamfer

Sub Chamfer(myOriginElements As OriginElements, mySketches As sketches, myPart As Part, ChX As Double, ChY As Double, Ru As Double, Y0 As Double, F2D As Factory2D, t As Double, mySF As ShapeFactory)

Dim myPlaneYZ

Set myPlaneYZ = myOriginElements.PlaneYZ Dim RefmyPlaneYZ As Reference Set RefmyPlaneYZ = myPart.CreateReferenceFromObject(myPlaneYZ)

108

Dim mySketchChamfer As Sketch Set mySketchChamfer = mySketches.Add(RefmyPlaneYZ) 'File: Gear1,2.CATPart/Body.2/Groove.1/Sketch.3

myPart.InWorkObject = mySketchChamfer

Set F2D = mySketchChamfer.OpenEdition()

Dim XPt1Ch As Double Dim YPt1Ch As Double XPt1Ch = Y0 - ChX YPt1Ch = Ru

Dim XPt2Ch As Double Dim YPt2Ch As Double XPt2Ch = Y0 + 0 YPt2Ch = Ru - ChY

Dim XPt3Ch As Double Dim YPt3Ch As Double XPt3Ch = Y0 + 0 YPt3Ch = Ru + 2

Dim XPt11Ch As Double Dim YPt11Ch As Double

109

XPt11Ch = XPt1Ch - t + 2 * ChX YPt11Ch = YPt1Ch

Dim XPt22Ch As Double Dim YPt22Ch As Double XPt22Ch = XPt2Ch - t YPt22Ch = YPt2Ch

Dim XPt33Ch As Double Dim YPt33Ch As Double XPt33Ch = XPt3Ch - t YPt33Ch = YPt3Ch

Dim Pt1Ch As Point2D Set Pt1Ch = F2D.CreatePoint(XPt1Ch, YPt1Ch) 'File: Gear1,2.CATPart/Body.2/Groove.1/Sketch.3/Point.1 Dim Pt2Ch As Point2D Set Pt2Ch = F2D.CreatePoint(XPt2Ch, YPt2Ch) 'File: Gear1,2.CATPart/Body.2/Groove.1/Sketch.3/Point.2 Dim Pt3Ch As Point2D Set Pt3Ch = F2D.CreatePoint(XPt3Ch, YPt3Ch) 'File: Gear1,2.CATPart/Body.2/Groove.1/Sketch.3/Point.3

Dim Pt11Ch As Point2D Set Pt11Ch = F2D.CreatePoint(XPt11Ch, YPt11Ch)

110

'File: Gear1,2.CATPart/Body.2/Groove.1/Sketch.3/Point.4 Dim Pt22Ch As Point2D Set Pt22Ch = F2D.CreatePoint(XPt22Ch, YPt22Ch) 'File: Gear1,2.CATPart/Body.2/Groove.1/Sketch.3/Point.5 Dim Pt33Ch As Point2D Set Pt33Ch = F2D.CreatePoint(XPt11Ch, YPt33Ch) 'File: Gear1,2.CATPart/Body.2/Groove.1/Sketch.3/Point.6

Dim Line12Ch As Line2D Set Line12Ch = F2D.CreateLine(XPt1Ch, YPt1Ch, XPt2Ch, YPt2Ch) 'File: Gear1,2.CATPart/Body.2/Groove.1/Sketch.3/Line.1 Line12Ch.StartPoint = Pt1Ch Line12Ch.EndPoint = Pt2Ch

Dim Line23Ch As Line2D Set Line23Ch = F2D.CreateLine(XPt2Ch, YPt2Ch, XPt3Ch, YPt3Ch)

'File: Gear1,2.CATPart/Body.2/Groove.1/Sketch.3/Line.2 Line23Ch.StartPoint = Pt2Ch Line23Ch.EndPoint = Pt3Ch

Dim Line333Ch As Line2D Set Line333Ch YPt33Ch)

=

F2D.CreateLine(XPt3Ch,

YPt3Ch,

XPt33Ch,

'File: Gear1,2.CATPart/Body.2/Groove.1/Sketch.3/Line.3 111

Line333Ch.StartPoint = Pt3Ch Line333Ch.EndPoint = Pt33Ch

Dim Line3322Ch As Line2D Set Line3322Ch YPt22Ch)

=

F2D.CreateLine(XPt33Ch,

YPt32Ch,

XPt22Ch,

'File: Gear1,2.CATPart/Body.2/Groove.1/Sketch.3/Line.4 Line3322Ch.StartPoint = Pt33Ch Line3322Ch.EndPoint = Pt22Ch

Dim Line2211Ch As Line2D Set Line2211Ch YPt11Ch)

=

F2D.CreateLine(XPt22Ch,

YPt22Ch,

XPt11Ch,

'File: Gear1,2.CATPart/Body.2/Groove.1/Sketch.3/Line.5 Line2211Ch.StartPoint = Pt22Ch Line2211Ch.EndPoint = Pt11Ch

Dim Line111Ch As Line2D Set YPt1Ch)

Line111Ch

=

F2D.CreateLine(XPt11Ch,

YPt11Ch,

XPt1Ch,

'File: Gear1,2.CATPart/Body.2/Groove.1/Sketch.3/Line.6 Line111Ch.StartPoint = Pt11Ch Line111Ch.EndPoint = Pt1Ch

112

Dim CenterLine As Line2D Set CenterLine = F2D.CreateLine(0, 0, -t, 0) 'File: Gear1,2.CATPart/Body.2/Groove.1/Sketch.3/Line.7 mySketchChamfer.CenterLine = CenterLine

mySketchChamfer.CloseEdition myPart.InWorkObject = mySketchChamfer myPart.Update

Dim iGroove As Groove Set iGroove = mySF.AddNewGroove(mySketchChamfer)

myPart.Update End Sub

113

2-12) Hiding main planes: (sub HidePlanes) This subroutine just hides Planes XY, YZ and ZX for better viewing of Gears. Sub HidePlanes() Dim myPart As Part Set myPart = CATIA.ActiveDocument.Part Dim OriginElement, myPlaneZX, myPlaneXY, myPlaneYZ Set OriginElement = myPart.OriginElements Set myPlaneXY = OriginElement.PlaneXY Set myPlaneYZ = OriginElement.PlaneYZ Set myPlaneZX = OriginElement.PlaneZX

Dim RefmyPlaneXY As Reference Set RefmyPlaneXY = myPart.CreateReferenceFromObject(myPlaneXY) Dim RefmyPlaneYZ As Reference Set RefmyPlaneYZ = myPart.CreateReferenceFromObject(myPlaneYZ) Dim RefmyPlaneZX As Reference Set RefmyPlaneZX = myPart.CreateReferenceFromObject(myPlaneZX)

Set HS = myPart.HybridShapeFactory HS.GSMVisibility RefmyPlaneXY, 0 HS.GSMVisibility RefmyPlaneYZ, 0 HS.GSMVisibility RefmyPlaneZX, 0 myPart.Update End Sub

114

2-13) Assign a Toolbar in CATIA

As a last step, you can add an icon to a toolbar to quickly execute your program. Follow these pictures to add an icon assigned to your VB program.

115

Now you can Drag &Drop your Module in a Toolbar.

116

117

Thank You! Now you know how to model and program gears in CATIA V5! You're on your way to automating even more repetitive processes and impressing your co-workers and bosses. For more real world examples, articles, tutorials, and how-to videos please visit www.scripting4v5.com I hope you’ve enjoyed this program as much as we loved writing it for you. We really appreciate each and every one of you for taking time out of your day or evening to read this, and if you have an extra second, we would love to hear what you think about it. Please leave a comment or forum post at http://www.scripting4v5.com, or if you’d rather reach us in private, don’t hesitate to shoot us an email. We’ve worked very hard on this guide and spent countless hours working on the website and simply ask that you do not share this document with anyone who has not purchased it. Please refer all friends and colleagues to the website, www.scripting4v5.com. To all of my subscribers, followers and friends out there, old and new, thank you for the gift of your support. I only hope this guide can begin to repay you for the time and attention that you’ve given me. Here’s to you and your continued success! Thanks again, good luck, and happy programming! - Alireza Reihani and Emmett Ross

118

Video Demo Watch this program in action. https://www.youtube.com/watch?v=Q7pERp0PfvI

119

Tips and Troubleshooting If your code is not working, please double check these sections of code:

Confused or still stuck? Post your question in the forum if you get stuck or have any suggestions for improving the tutorial. http://www.scripting4v5.com/forums/forum/catia-macro-programming/ 120

Appendix I: Keyboard Shortcuts Default CATIA and VBA editor shortcuts: CATIA V5:  F1: Open the CATIA V5 online contextual help file  Alt+F8: Macro shortcut  Alt+F11: Open the macro editor VBA Editor:  F1: Visual Basic help  F2: Open the Object Browser  F4: Properties Window  F5: Run macro  F7: Code window  F8: Step Into  Crtl + Break: Break  Crtl + J: List properties and methods  Alt+F11: Go back to CATIA  End: Quit a running macro

121

Appendix II: Resources The following is a list of resources used when creating this tutorial and other recommended tools.

HOW TO: Création Roue Dentée Paramétrée CATIA V5 R20 By madriver30 https://www.youtube.com/watch?v=dvyLuOPvMV8

Helical gear part by Priyam Bajpai https://www.youtube.com/watch?v=H989ooFHrxo

Reference for finding intersection points of two circles: http://math.stackexchange.com/questions/256100/how-can-i-find-the-points-at-which-twocircles-intersect

Types of gears: http://sdp-si.com/resources/gears/pdf/gear_types_manufacturing.pdf

122