'--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'-------------------------------------------------CreateFrontViewTo3Points------------------------------------------------------------------------------------------------------
'Author:       Daniel Frauenrath
'Mail:            daniel.frauenrath@gmx.com
'Release:     17.12.2008
'Version:      1.3
'
'*************************************************************************************************************************************************************************
'<<<<<<<<<<<<<<<<Beschreibung / Discription>>>>>>>>>>>>>>>>>>>>
'**************************************************************************************************************************************************************************
'
'DE: Das Makro erstellt eine Vorderansicht auf einer Zeichnung. Die Vorderansicht wird im Part-Document
'    durch 3 Punkte definiert
'
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'
'EN: The macro creates a front view on a drawing. The front view is defined at the part document by 3 points
'
'*************************************************************************************************************************************************************************
'<<<<<<<<<<<<<<<<Veränderungen / Change log>>>>>>>>>>>>>>>>>>>>
'**************************************************************************************************************************************************************************
'Autor:                        Datum:            Zeile/Line:        Anmerkung/Remark:
'--------------------------------------------------------------------------------------------------------------------------
'
'Daniel Frauenrath     17.12.2008      Alle                  Erstellung und release
'Daniel Frauenrath     17.12.2008      169                  3D Punkte werden in View angezeigt
'Daniel Frauenrath     18.12.2008      67-97               Anwender kann Part auswählen
'Daniel Frauenrath     18.12.2008      107-144           Selektion der Punkte geändert
'Daniel Frauenrath     18.12.2008      Ab 196             Wertetabellen für selektierte Punkte werden erstellt
'
'****************************************************************************************************************************************************
'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Hauptmakro>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'****************************************************************************************************************************************************

Sub CATMain()

'**********************************Deklarationen**********************************
    Dim oDoc As Document
    Dim oDocs As Documents
    Dim Check As Boolean
    Dim myDraw As DrawingDocument
    Dim myPart As PartDocument
    Dim oDocSelType(0)
    Dim PartRef As Product
    Dim oPart As Part
    Dim oSheets As DrawingSheets
    Dim oSheet As DrawingSheet
    Dim newView As DrawingView
    Dim oView As DrawingView
    Dim otype(0)
    Dim Auswahl
    Dim RefPoint(2) As Object
    Dim Vektor1(2)
    Dim Vektor2(2)
    Dim oGeoSet As HybridBody
    Dim oRefPlane As Plane
    Dim DrawingSelection
    Dim oTables As DrawingTables
    Dim newTable As DrawingTable
    
    
    
'**********************************Check Parameter**********************************
    Check = False
    
'**********************************Abfrage Dokumente**********************************
    Set oFenster = CATIA.Windows
    If oFenster.Count = 0 Then
        Box = MsgBox("Es ist kein Dokument geladen!" + Chr(10) + "Das Makro kann nicht ausgeführt werden und wird beendet!", vbCritical, "Keine Dokument geladen")
        Exit Sub
    End If
    
 '**********************************Auswahl der Zeilzeichnung und des Quellparts**********************************
    Set oDoc = CATIA.ActiveDocument
    ObjType = TypeName(oDoc)
    If ObjType <> "DrawingDocument" Then
        Box = MsgBox("Das aktive Dokument ist KEINE Zeichnung!" + Chr(10) + "Bitte aktivieren Sie eine Zeichnung und" _
                   & " starten Sie das Makro erneut!", vbCritical + vbOKOnly, "Abbruch: Falscher Dokumententyp")
        Exit Sub
    Else
        Set myDraw = oDoc
        Set oSheets = oDoc.Sheets
        Set oSheet = oSheets.ActiveSheet
        Set oViews = oSheet.Views
        Set newView = oViews.Add("Vorderansicht")
    End If
    
    Set Drawing = CATIA.ActiveDocument
    Set DrawingSelection = Drawing.Selection
    oDocSelType(0) = "Part"
    Box = MsgBox("Bitte wählen Sie das Part aus das Projeziert werden soll!", vbInformation + vbOKCancel, "Part auswählen")
    If Box = vbCancel Then
        Box = MsgBox("Sie haben die Selektion abgebrochen" + Chr(10) + _
        "Das Makro wird nun beendet!", vbCritical, "Abbruch durch Nutzer")
        DrawingSelection.Add newView
        DrawingSelection.Delete
        Exit Sub
    End If
    Auswahl = DrawingSelection.SelectElement4(oDocSelType, "Bitte wählen Sie ein Part aus", _
                                    "Select a CATPart", False, PartDocument)
    If Auswahl = "Normal" Then
        Set myPart = PartDocument.Selection.Item2(1).Value.Parent
        myPart.Activate
        Set oPart = myPart.Part
    Else
        DrawingSelection.Clear
        Box = MsgBox("Sie haben die Selektion abgebrochen" + Chr(10) + _
        "Das Makro wird nun beendet!", vbCritical, "Abbruch durch Nutzer")
        DrawingSelection.Add newView
        DrawingSelection.Delete
        Exit Sub
    End If
    DrawingSelection.Clear
                
'**********************************Selektion der Punkte**********************************
    Set oSel = oDoc.Selection
    oSel.Clear
    otype(0) = "Point"
    oSel.Clear
    myPart.Activate
    Box = MsgBox("Bitte wählen sie die Punkte (3 Stück) aus!" + Chr(10) + Chr(10) + _
                "Hinweise:" + Chr(10) + Chr(10) + "1. Halten Sie dabei die SHIFT-Taste gedrückt." + Chr(10) + _
                "2. Wählen Sie die Punkte in der richtigen Reihenfolge (Punkt.1, Punkt.2, Punkt.3)" + Chr(10) + _
                "3. Zum Fertigstellen der Selektion wählen Sie den ==> BEENDEN <== Button auf der Toolauswahl Symbolleiste" _
                , vbInformation + vbOKCancel, "Punkte auswählen")
    If Box = vbCancel Then
        Box = MsgBox("Sie haben die Selektion abgebrochen" + Chr(10) + _
        "Das Makro wird nun beendet!", vbCritical, "Abbruch durch Nutzer")
        Exit Sub
    End If
    Do
        Auswahl = oSel.SelectElement3(otype, "Bitte wählen sie den " & ii + 1 & " Punkt aus", False, CATMultiSelTriggWhenUserValidatesSelection, False)
        If Auswahl = "Normal" Then
            If oSel.Count = 3 Then
                Set RefPoint(0) = oSel.Item(1).Value
                Set RefPoint(1) = oSel.Item(2).Value
                Set RefPoint(2) = oSel.Item(3).Value
            Else
                Box = MsgBox("Bitte wählen Sie DREI Punkte aus!", vbInformation + vbOKOnly, "Ungültige Punktauswahl")
            End If
        Else
            Box = MsgBox("Sie haben die Selektion abgebrochen" + Chr(10) + _
            "Das Makro wird nun beendet!", vbCritical, "Abbruch durch Nutzer")
            myDraw.Activate
            oSel.Clear
            Set oSel = CATIA.ActiveDocument.Selection
            oSel.Add newView
            oSel.Delete
            Exit Sub
        End If
    Loop Until oSel.Count = 3
    oSel.Clear
    
'**********************************Erstellen der Referenzebene**********************************
    Set oFac = oPart.HybridShapeFactory
    Set oGeoSet = RefPoint(0).Parent.Parent
    Set oShapes = oGeoSet.HybridShapes
    Set oRefPlane = oFac.AddNewPlane3Points(RefPoint(0), RefPoint(1), RefPoint(2))
    oGeoSet.AppendHybridShape oRefPlane
    oRefPlane.Name = "Referenz fuer Zeichnungsableitung"
    oPart.Update
    oSel.Add oRefPlane
    oSel.VisProperties.SetRealColor 255, 127, 36, 1
    Set BiDimFeature = oSel.Item2(1).Value
    oSel.Clear
    
 '--->>>Punktfarben
    oSel.Add RefPoint(0)
    oSel.VisProperties.SetRealColor 0, 0, 255, 1
    oSel.Clear
    oSel.Add RefPoint(1)
    oSel.VisProperties.SetRealColor 50, 205, 50, 1
    oSel.Clear
    oSel.Add RefPoint(2)
    oSel.VisProperties.SetRealColor 255, 20, 147, 1
    oSel.Clear

'**********************************Erstellung der Vektoren**********************************
    BiDimFeature.GetFirstAxis Vektor1
    BiDimFeature.GetSecondAxis Vektor2
    
'**********************************View Link erstellen**********************************
    Dim oBehavior As DrawingViewGenerativeBehavior
    Set oBehavior = newView.GenerativeBehavior
    oBehavior.Document = myPart
    oBehavior.DefineFrontView Vektor1(0), Vektor1(1), Vektor1(2), Vektor2(0), Vektor2(1), Vektor2(2)
    oBehavior.PointsProjectionMode = catPointsProjectionModeOn
    newView.GenerativeBehavior.ColorInheritanceMode = cat3DColorInheritanceModeOn
    oSheet.ForceUpdate
    newView.X = 100
    newView.Y = 100
    oBehavior.Update
    myDraw.Update
    myDraw.Activate
    
'**********************************Punktetabellen erstellen**********************************
'--->>>Selektion für Farbgebung
    Set oSel = CATIA.ActiveDocument.Selection
    oSel.Clear


'--->>>Koordinaten auslesen
    Dim RefPoint1Coord(2)
    Dim RefPoint2Coord(2)
    Dim RefPoint3Coord(2)
    
    RefPoint(0).GetCoordinates RefPoint1Coord
    RefPoint(1).GetCoordinates RefPoint2Coord
    RefPoint(2).GetCoordinates RefPoint3Coord
    
'--->>>Tabelle 1 erstellen
    newView.Activate
    Set oView = oViews.ActiveView
    Set oTables = oView.Tables
    Set newTable = oTables.Add(-60, 250, 4, 2, 10, 60)
    newTable.MergeCells 1, 1, 1, 2
    
    newTable.Name = "Tabelle 1.Punkt"
    newTable.SetCellString 1, 1, RefPoint(0).Name
    newTable.SetCellString 2, 1, "X"
    newTable.SetCellString 3, 1, "Y"
    newTable.SetCellString 4, 1, "Z"
    newTable.SetCellString 2, 2, CStr(RefPoint1Coord(0))
    newTable.SetCellString 3, 2, CStr(RefPoint1Coord(1))
    newTable.SetCellString 4, 2, CStr(RefPoint1Coord(2))

    newTable.SetCellAlignment 1, 1, CatTableMiddleCenter
    newTable.SetCellAlignment 2, 1, CatTableMiddleLeft
    newTable.SetCellAlignment 3, 1, CatTableMiddleLeft
    newTable.SetCellAlignment 4, 1, CatTableMiddleLeft
    newTable.SetCellAlignment 2, 2, CatTableMiddleLeft
    newTable.SetCellAlignment 3, 2, CatTableMiddleLeft
    newTable.SetCellAlignment 4, 2, CatTableMiddleLeft
    
    oSel.Add newTable
    oSel.VisProperties.SetRealColor 0, 0, 255, 1
    oSel.Clear

    Set newTable = Nothing
    
 '--->>>Tabelle 2 erstellen
    Set newTable = oTables.Add(-60, 200, 4, 2, 10, 60)
    newTable.MergeCells 1, 1, 1, 2
    
    newTable.Name = "Tabelle 2.Punkt"
    newTable.SetCellString 1, 1, RefPoint(1).Name
    newTable.SetCellString 2, 1, "X"
    newTable.SetCellString 3, 1, "Y"
    newTable.SetCellString 4, 1, "Z"
    newTable.SetCellString 2, 2, CStr(RefPoint2Coord(0))
    newTable.SetCellString 3, 2, CStr(RefPoint2Coord(1))
    newTable.SetCellString 4, 2, CStr(RefPoint2Coord(2))

    newTable.SetCellAlignment 1, 1, CatTableMiddleCenter
    newTable.SetCellAlignment 2, 1, CatTableMiddleLeft
    newTable.SetCellAlignment 3, 1, CatTableMiddleLeft
    newTable.SetCellAlignment 4, 1, CatTableMiddleLeft
    newTable.SetCellAlignment 2, 2, CatTableMiddleLeft
    newTable.SetCellAlignment 3, 2, CatTableMiddleLeft
    newTable.SetCellAlignment 4, 2, CatTableMiddleLeft

    oSel.Add newTable
    oSel.VisProperties.SetRealColor 50, 205, 50, 1
    oSel.Clear

    Set newTable = Nothing
   
 '--->>>Tabelle 3 erstellen
    Set newTable = oTables.Add(-60, 150, 4, 2, 10, 60)
    newTable.MergeCells 1, 1, 1, 2
    
    newTable.Name = "Tabelle 3.Punkt"
    newTable.SetCellString 1, 1, RefPoint(2).Name
    newTable.SetCellString 2, 1, "X"
    newTable.SetCellString 3, 1, "Y"
    newTable.SetCellString 4, 1, "Z"
    newTable.SetCellString 2, 2, CStr(RefPoint3Coord(0))
    newTable.SetCellString 3, 2, CStr(RefPoint3Coord(1))
    newTable.SetCellString 4, 2, CStr(RefPoint3Coord(2))

    newTable.SetCellAlignment 1, 1, CatTableMiddleCenter
    newTable.SetCellAlignment 2, 1, CatTableMiddleLeft
    newTable.SetCellAlignment 3, 1, CatTableMiddleLeft
    newTable.SetCellAlignment 4, 1, CatTableMiddleLeft
    newTable.SetCellAlignment 2, 2, CatTableMiddleLeft
    newTable.SetCellAlignment 3, 2, CatTableMiddleLeft
    newTable.SetCellAlignment 4, 2, CatTableMiddleLeft
    
    oSel.Add newTable
    oSel.VisProperties.SetRealColor 255, 20, 147, 1
    oSel.Clear


'**********************************Beenden**********************************
    Box = MsgBox("Das Makro wurde erfolgreich beendet!" + Chr(10) + _
                "Es wurde eine neue Vorderansicht erzeugt.", vbInformation + vbOKOnly, "Makro erfolgreich beendet")
    PartDocument.Selection.Clear
End Sub