Option Explicit '------------------------------------------------------------------------ ' COPYRIGTH DASSAULT SYSTEMES 2000 '------------------------------------------------------------------------ Dim Language as String Language="VBScript" ' *********************************************************************** ' Purpose: Create an helicoidal Stair ' Assumtions: ' Author: ' Languages: VBScript ' Locales: English ' CATIA Level: V5R6 ' *********************************************************************** ' ------------------------------------------------------------------------ ' VB Macro ' ' Object: ' Generate and helicoidal stair ' Input data ' Origin point and helix direction ' Starting point of helix and its pitch / height definition ' Height of each Step ' ' VB macro ' Initialize input data ' Compute number of required step for the helix height ' Loop on number of step and generate the geometry for each step in a HybridBody ' ' CATIA VB tools related to this sample ' Open a CATIA document and a CATPart ' Show/Noshow of wireframe and surfacic object ' Adding new Open-Body ' Create parameters and formula / Use it in geomety definition ' Catia methods required CATIAReference as input object / Generate reference for each input geometry ' Create Generative Shape Design feature ' Update geometry / Note: done at the end in order to enhance creation performances ' '------------------------------------------------------------------------ '------------------------------------------------------------------------ ' Global Variables ' --------------------------------------------------------- ' Origin Points Dim X0 As Double Dim Y0 As Double Dim Z0 As Double ' Starting Point of the stair helix Dim X1 As Double Dim Y1 As Double Dim Z1 As Double ' Direction of the helix Dim A1 As Double Dim B1 As Double Dim C1 As Double ' Pitch and height of the helix Dim Pitch As Double Dim Height As Double ' Step height value Dim StepValue As Double '------------------------------------------------------------------------ ' Main program '------------------------------------------------------------------------ ' Open a New Part ' Init global variable ' Generate geometry ' ------------------------------------------------------------------------ ' Sub CATMain() ' -------------------------------------------------------------- ' Create a CATIA Part Docuument ' -------------------------------------------------------------- ' Creating a Part Document Dim PartDoc As Document Set PartDoc = CATIA.Documents.Add ( "Part" ) ' Retrieving HybridBodies collection in Part Document Dim hybridBodies1 As HybridBodies Set hybridBodies1 = PartDoc.Part.HybridBodies ' Adding an OpenBody Dim myHBody As HybridBody Set myHBody = hybridBodies1.Add() Dim referencebody As Object Set referencebody = PartDoc.Part.CreateReferenceFromObject(myHBody) PartDoc.Part.HybridShapeFactory.ChangeFeatureName referencebody, "ConstructionElements" ' -------------------------------------------------------------- ' Init global Values ' -------------------------------------------------------------- X0 = 0 Y0 = 0 Z0 = 0 X1 = 1000 Y1 = 0 Z1 = 0 A1 = 0 B1 = 0 C1 = 1 Pitch = 3600 Height = 3000 StepValue = 100 ' -------------------------------------------------------------- ' Declaring and setting working variables ' -------------------------------------------------------------- Dim iValide As Integer Dim iLigne As Integer Dim Point1 As Object Dim Point2 As Object Dim HelixPitch As Integer Dim HelixHeight As Integer Dim HauteurMarche As Integer HelixPitch = Pitch HelixHeight = Height HauteurMarche = StepValue ' -------------------------------------------------------------- ' Setting knowledge objects and variables ' -------------------------------------------------------------- ' Init working knowledge parameters Dim parameters As Object Set parameters = PartDoc.Part.parameters ' Working Parm object Dim Parm As Object ' Init working knowledge relations Dim relations As Object Set relations = PartDoc.Part.relations ' Working Formula object Dim Formula As Object ' Set Parameters for stair generation Set Parm = parameters.CreateDimension("HelixPitch", "LENGTH", Pitch) Set Parm = parameters.CreateDimension("HelixHeight", "LENGTH", Height) Set Parm = parameters.CreateDimension("StepHeight", "LENGTH", StepValue) ' -------------------------------------------------------------- ' Generating starting geometry (Reference points /Direction of helix /Helix) ' -------------------------------------------------------------- ' ' Origin and Starting Point Set Point1 = PartDoc.Part.HybridShapeFactory.AddNewPointCoord(X0, Y0, Z0) myHBody.AppendHybridShape Point1 Set Point2 = PartDoc.Part.HybridShapeFactory.AddNewPointCoord(X1, Y1, Z1) myHBody.AppendHybridShape Point2 ' Plan horizontal XY Dim Origin As Object Set Origin = PartDoc.Part.OriginElements Dim Plane As Object Set Plane = Origin.PlaneXY Dim Ref As Object Set Ref = PartDoc.Part.CreateReferenceFromObject(Plane) ' Direction of helix Dim Dir As Object Set Dir = PartDoc.Part.HybridShapeFactory.AddNewDirectionByCoord(A1, B1, C1) ' Note: Another way to create direction using horizontal plane ' Set Dir = PartDoc.Part.HybridShapeFactory.AddNewDirection(Ref) ' Line for helix definition Dim Line As Object Set Line = PartDoc.Part.HybridShapeFactory.AddNewLinePtDir(Point1, Dir, 0, HelixHeight, False) myHBody.AppendHybridShape Line ' Create formula defining Line offset value equal to helix height parameter Set Formula = relations.CreateFormula("Formula.0", "", Line.EndOffset, "HelixHeight") ' Helix Dim RefH1 As Object Set RefH1 = PartDoc.Part.CreateReferenceFromObject(Line) Dim RefH2 As Object Set RefH2 = PartDoc.Part.CreateReferenceFromObject(Point2) Dim Helix As Object Set Helix = PartDoc.Part.HybridShapeFactory.AddNewHelix(RefH1, False, RefH2, HelixPitch, HelixHeight, False, 0, 0, False) myHBody.AppendHybridShape Helix Set Formula = relations.CreateFormula("Formula.1", "", Helix.Pitch, "HelixPitch") Set Formula = relations.CreateFormula("Formula.2", "", Helix.Height, "HelixHeight") ' -------------------------------------------------------------- ' Generating Steps ' -------------------------------------------------------------- Dim RefLine As Object Dim RefPlane As Object Dim RefHelix As Object Dim RefPlaneOffset As Object Dim Pt0 As Object Dim Pt1 As Object Dim Pt2 As Object Dim Pt3 As Object Dim LinePt0Pt1 As Object Dim LinePt0Pt2 As Object Dim RefFill As Object Dim RefExtrude As Object ' Compute number of step to generate Dim indice As Integer indice = HelixHeight / HauteurMarche ' Starting plane for helix/steps Dim PlaneOffset1 As Object Set PlaneOffset1 = PartDoc.Part.HybridShapeFactory.AddNewPlaneOffset(Plane, 0, False) myHBody.AppendHybridShape PlaneOffset1 ' Setting reference objet use for each step ' Note: RefPlane is the basic plane used for each step / it is updated in the loop Set RefLine = PartDoc.Part.CreateReferenceFromObject(Line) Set RefPlane = PartDoc.Part.CreateReferenceFromObject(PlaneOffset1) Set RefHelix = PartDoc.Part.CreateReferenceFromObject(Helix) ' -------------------------------------------------------------- ' Loop on steps ' -------------------------------------------------------------- ' Dim CounterStep As Integer For CounterStep = 1 To indice Step 1 ' Create a new openbody Set myHBody = PartDoc.Part.HybridBodies.Add() Dim stepbody As Object Set stepbody = PartDoc.Part.CreateReferenceFromObject(myHBody) PartDoc.Part.HybridShapeFactory.ChangeFeatureName stepbody, "Step." & CounterStep 'Point0 = Point reference for the step on axis Dim Intersection1 As Object Set Intersection1 = PartDoc.Part.HybridShapeFactory.AddNewIntersection(RefLine, RefPlane) myHBody.AppendHybridShape Intersection1 Set Pt0 = PartDoc.Part.CreateReferenceFromObject(Intersection1) PartDoc.Part.HybridShapeFactory.GSMVisibility Pt0, 0 'Point1 = Point reference for the step on helix Dim Intersection2 As Object Set Intersection2 = PartDoc.Part.HybridShapeFactory.AddNewIntersection(RefPlane, RefHelix) myHBody.AppendHybridShape Intersection2 Set Pt1 = PartDoc.Part.CreateReferenceFromObject(Intersection2) PartDoc.Part.HybridShapeFactory.GSMVisibility Pt1, 0 'PlanOffset= Step height reference plane Dim PlaneOffset2 As Object Set PlaneOffset2 = PartDoc.Part.HybridShapeFactory.AddNewPlaneOffset(RefPlane, HauteurMarche, False) myHBody.AppendHybridShape PlaneOffset2 Set Formula = relations.CreateFormula("Formula.Step.1", "", PlaneOffset2.Offset, "StepHeight") Set RefPlaneOffset = PartDoc.Part.CreateReferenceFromObject(PlaneOffset2) PartDoc.Part.HybridShapeFactory.GSMVisibility RefPlaneOffset, 0 'Point3 = Point reference on helix Dim Intersection3 As Object Set Intersection3 = PartDoc.Part.HybridShapeFactory.AddNewIntersection(RefPlaneOffset, RefHelix) myHBody.AppendHybridShape Intersection3 Set Pt3 = PartDoc.Part.CreateReferenceFromObject(Intersection3) PartDoc.Part.HybridShapeFactory.GSMVisibility Pt3, 0 'Point2 = Point Projected from helix on step ground plane Dim Project1 As Object Set Project1 = PartDoc.Part.HybridShapeFactory.AddNewProject(Pt3, RefPlane) Project1.SolutionType = 0 Project1.Normal = True myHBody.AppendHybridShape Project1 Set Pt2 = PartDoc.Part.CreateReferenceFromObject(Project1) PartDoc.Part.HybridShapeFactory.GSMVisibility Pt2, 0 ' Step definition contours : 2 lines and a circle arc ' Line1 Set LinePt0Pt1 = PartDoc.Part.HybridShapeFactory.AddNewLinePtPt(Pt0, Pt1) myHBody.AppendHybridShape LinePt0Pt1 Dim RefLinePt0Pt1 As Object Set RefLinePt0Pt1 = PartDoc.Part.CreateReferenceFromObject(LinePt0Pt1) PartDoc.Part.HybridShapeFactory.GSMVisibility RefLinePt0Pt1, 0 ' Line2 Set LinePt0Pt2 = PartDoc.Part.HybridShapeFactory.AddNewLinePtPt(Pt0, Pt2) myHBody.AppendHybridShape LinePt0Pt2 Dim RefLinePt0Pt2 As Object Set RefLinePt0Pt2 = PartDoc.Part.CreateReferenceFromObject(LinePt0Pt2) ' Circle arc Dim Circle3Points As Object Set Circle3Points = PartDoc.Part.HybridShapeFactory.AddNewCircle3Points(Pt0, Pt1, Pt2) Circle3Points.SetLimitation 2 myHBody.AppendHybridShape Circle3Points Dim RefCircle As Object Set RefCircle = PartDoc.Part.CreateReferenceFromObject(Circle3Points) Dim Split As Object Set Split = PartDoc.Part.HybridShapeFactory.AddNewHybridSplit(RefCircle, RefLinePt0Pt1, 1) PartDoc.Part.HybridShapeFactory.GSMVisibility RefLinePt0Pt1, 0 PartDoc.Part.HybridShapeFactory.GSMVisibility RefLinePt0Pt2, 0 PartDoc.Part.HybridShapeFactory.GSMVisibility RefCircle, 0 myHBody.AppendHybridShape Split Dim RefSplit As Object Set RefSplit = PartDoc.Part.CreateReferenceFromObject(Split) ' Step surface Dim Fill As Object Set Fill = PartDoc.Part.HybridShapeFactory.AddNewFill() Fill.AddBound(RefLinePt0Pt1) Fill.AddBound(RefSplit) Fill.AddBound(RefLinePt0Pt2) myHBody.AppendHybridShape Fill 'Riser (Opposite-step) surface Dim Extrude As Object Set Extrude = PartDoc.Part.HybridShapeFactory.AddNewExtrude(RefLinePt0Pt2, HauteurMarche, 0, Dir) myHBody.AppendHybridShape Extrude Set Formula = relations.CreateFormula("Formula.Step.2", "", Extrude.BeginOffset, "StepHeight") ' Join of two surfaces Set RefFill = PartDoc.Part.CreateReferenceFromObject(Fill) Set RefExtrude = PartDoc.Part.CreateReferenceFromObject(Extrude) Dim Join As Object Set Join = PartDoc.Part.HybridShapeFactory.AddNewJoin(RefFill, RefExtrude) PartDoc.Part.HybridShapeFactory.GSMVisibility RefFill, 0 PartDoc.Part.HybridShapeFactory.GSMVisibility RefExtrude, 0 myHBody.AppendHybridShape Join ' End of loop - re-init ref plane for next step ' RefPlane = RefPlaneOffset Set RefPlane = PartDoc.Part.CreateReferenceFromObject(PlaneOffset2) Next 'Updating CATIA Part Document ' Note : Performed only at the end of geometry generation PartDoc.Part.Update ' Reframing CATIA Part Window Dim specsAndGeomWindow1 As Window Set specsAndGeomWindow1 = CATIA.ActiveWindow Dim viewer3D1 As Viewer Set viewer3D1 = specsAndGeomWindow1.ActiveViewer viewer3D1.Reframe Dim viewpoint3D1 As Viewpoint3D Set viewpoint3D1 = viewer3D1.Viewpoint3D End Sub