Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  Makro vereinfachen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  Makro vereinfachen (2855 mal gelesen)
deadpant
Mitglied



Sehen Sie sich das Profil von deadpant an!   Senden Sie eine Private Message an deadpant  Schreiben Sie einen Gästebucheintrag für deadpant

Beiträge: 13
Registriert: 12.11.2012

Creo Parametric 2.0 M10
Vatia V5 R18
Intel core i7-4710HQ
NVidia GeForce GTX850M
Win10 64 bit 16GB

erstellt am: 08. Nov. 2016 12:39    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo liebes Forumsmitglieder,

ich konnte mir mit Hilfe des Makrorecorders und dem Forum hier mein Makro zum laufen bringen. Dabei zeichnete der Makrorekorder leider zu viel, bzw. überflüssige Dinge auf. An einigen Stelle konnte ich herausfinden wie ich mein Programm verkürzen/vereinfachen kann, aber leider nicht überall. 

Meine Frage ist daher welche Teile vom Code kann ich noch weiter zusammenfassen oder durch andere Befehle vereinfachen?
Für Hinweise und Tipps wäre ich sehr dankbar.

Hier ist mein Code wie er aktuell funktioniert:

Ein anderer Teil meines Codes importiert mir XYZ-Punkte aus einer Exceltabelle und verbindet diese zu mehrern Splines. Das folgende Makro verbindet diese Splines und erzeugt eine Geometrie, die dem Spline folgt. Zum Schluss wird das erzeugte Volumen Modell von einen bereits vorhandnen Part (Trommel) abgezugen.

'Registering CATIA Libraries  http://www.scripting4v5.com/additional-articles/registering-catia-libraries/
'1. Splines miteinander verbinden
'2. Ebene erzeugen
'3. Geometrie Ellipse Ebene
'4. Sweep von Ellipsengeometrie dem Spline folgen lassen
'5. Seil als Volumenmodell
'6. Boolische Operation Trommel minus Seil

Public Sub Join_Spline()
'Dimensionierung der Variablen
     
Dim CATIA As Object
Set CATIA = GetObject(, "CATIA.Application")

Dim partDocument1 As Document
Set partDocument1 = CATIA.ActiveDocument

Dim part1 As Part
Set part1 = partDocument1.Part

Dim hybridShapeFactory1 As Factory
Set hybridShapeFactory1 = part1.HybridShapeFactory

Dim hybridBodies1 As HybridBodies
Set hybridBodies1 = part1.HybridBodies

Dim hybridBody1 As HybridBody
Set hybridBody1 = hybridBodies1.Item("GeometryFromExcel")

Dim hybridShapes1 As HybridShapes
Set hybridShapes1 = hybridBody1.HybridShapes


'Anzahl der Splines bestimmen
Dim selection1 As Selection
Set selection1 = CATIA.ActiveDocument.Selection
'selection1.Search "Name=Spline*,all"
selection1.Search "((((CATStFreeStyleSearch.GSMCurve + CAT2DLSearch.2DSplineCurve) + CATSketchSearch.2DSplineCurve) + CATDrwSearch.2DSplineCurve) + CATGmoSearch.GSMCurve),all"


anzahlspline = selection1.Count
'MsgBox anzahlspline

Dim i As Integer
'----------------------------
   
    Dim hybridShapeSpline1 As HybridShape
    Set hybridShapeSpline1 = hybridShapes1.Item("Spline.1")
   
    Dim ref1 As Reference
    Set ref1 = part1.CreateReferenceFromObject(hybridShapeSpline1)
   
    Dim hybridShapeSpline2 As HybridShape
    Set hybridShapeSpline2 = hybridShapes1.Item("Spline.2")
   
    Dim ref2 As Reference
    Set ref2 = part1.CreateReferenceFromObject(hybridShapeSpline2)
   
    Dim hybridShapeAssemble1 As HybridShapeAssemble
    Set hybridShapeAssemble1 = hybridShapeFactory1.AddNewJoin(ref1, ref2)


'Spline3-6 erzeugen und verbinden

'--------
'!!!!!!!!
' "object" als wort im folgenden ersetzen durch was anderes

For i = 3 To selection1.Count
    Set obj = selection1.Item(i).Value 'Auswahl der Spline.i im Geometrischem Set "Geometrie von Excel
'MsgBox object.Name ' gibt den Instanznamen aus
     
    Dim hybridShapeSplinei As HybridShape
    Set hybridShapeSplinei = hybridShapes1.Item(obj.Name) 'Auswahl des Splines der hinzugefügt werden soll
     
'MsgBox hybridShapes1.Item(object.Name).Name
   
    Dim ref3 As Reference
    Set ref3 = part1.CreateReferenceFromObject(hybridShapeSplinei) ' REferenz wird generiert

    hybridShapeAssemble1.AddElement ref3 'Spline wir hinzugefügt

Next
'-----------------------------------------------------
'Eigenschaften Join Befehl
hybridShapeAssemble1.SetConnex 1
hybridShapeAssemble1.SetManifold 1
hybridShapeAssemble1.SetSimplify 0
hybridShapeAssemble1.SetSuppressMode 0
hybridShapeAssemble1.SetDeviation 0.001
hybridShapeAssemble1.SetAngularToleranceMode 0
hybridShapeAssemble1.SetAngularTolerance 0.5
hybridShapeAssemble1.SetFederationPropagation 0
'------------------------------------------------------

hybridBody1.AppendHybridShape hybridShapeAssemble1

part1.InWorkObject = hybridShapeAssemble1

part1.Update
'_________________________________________________________________________
'2.Ebene an Point1 erstellen
'Dient als skizzen Ebene für den Querschnittt der Geometrie

Dim hybridShapeAssemble2 As HybridShape
Set hybridShapeAssemble2 = hybridShapes1.Item("Join.1")

Dim ref4 As Reference
Set ref4 = part1.CreateReferenceFromObject(hybridShapeAssemble2)

Dim hybridShapePointCoord1 As HybridShape
Set hybridShapePointCoord1 = hybridShapes1.Item("Point.1")

Dim ref5 As Reference
Set ref5 = part1.CreateReferenceFromObject(hybridShapePointCoord1)

Dim hybridShapePlaneNormal1 As HybridShapePlaneNormal
Set hybridShapePlaneNormal1 = hybridShapeFactory1.AddNewPlaneNormal(ref4, ref5)

hybridBody1.AppendHybridShape hybridShapePlaneNormal1

part1.InWorkObject = hybridShapePlaneNormal1

part1.Update


'Create Geometry of the ellipse on Plane.1 = Skizze

Dim sketches1 As Sketches
Set sketches1 = hybridBody1.HybridSketches

Dim ref6 As HybridShape
Set ref6 = hybridShapes1.Item("Plane.1")

Dim sketch1 As Sketch
Set sketch1 = sketches1.Add(ref6)

part1.InWorkObject = sketch1

Dim factory2D1 As Factory2D
Set factory2D1 = sketch1.OpenEdition()

A = Range("a").Value 'X Richtung = V = R2
B = Range("b").Value 'Y Richtung = H = R1

'MsgBox A & vbLf & B

Dim ellipse2D1 As Ellipse2D
Set ellipse2D1 = factory2D1.CreateClosedEllipse(0#, 0#, 0#, 0#, B, A) '(X,Y,DX1,DY1,R1,R2)

sketch1.CloseEdition

part1.InWorkObject = hybridBody1

part1.Update

' Sweep Seilhülle generieren

Set sketch2 = sketches1.Item("Sketch.2")

Dim ref7 As Reference
Set ref7 = part1.CreateReferenceFromObject(sketch2)

'Dim hybridShapes1 As HybridShapes
Set hybridShapes1 = hybridBody1.HybridShapes

'Dim hybridShapeAssemble1 As HybridShape
Set hybridShapeAssemble1 = hybridShapes1.Item("Join.1")

Dim ref8 As Reference
Set ref8 = part1.CreateReferenceFromObject(hybridShapeAssemble1)

Dim hybridShapeSweepExplicit1 As HybridShapeSweepExplicit
Set hybridShapeSweepExplicit1 = hybridShapeFactory1.AddNewSweepExplicit(ref7, ref8)

hybridShapeSweepExplicit1.SubType = 1

Dim originElements1 As OriginElements
Set originElements1 = part1.OriginElements

Dim hybridShapePlaneExplicit1 As AnyObject
Set hybridShapePlaneExplicit1 = originElements1.PlaneXY

Dim ref9 As Reference
Set ref9 = part1.CreateReferenceFromObject(hybridShapePlaneExplicit1)

hybridShapeSweepExplicit1.Reference = ref9

hybridShapeSweepExplicit1.SetAngleRef 1, 0#

hybridShapeSweepExplicit1.SolutionNo = 0

hybridShapeSweepExplicit1.SmoothActivity = False

hybridShapeSweepExplicit1.GuideDeviationActivity = False

hybridShapeSweepExplicit1.SetbackValue = 0.02

hybridShapeSweepExplicit1.FillTwistedAreas = 1

hybridBody1.AppendHybridShape hybridShapeSweepExplicit1

part1.InWorkObject = hybridShapeSweepExplicit1

part1.Update


'Volumenmodell aus sweep erstellen

'Dim part1 As Part
'Set part1 = partDocument1.Part

Dim bodies1 As Bodies
Set bodies1 = part1.Bodies

Dim body1 As Body
Set body1 = bodies1.Item("Seil")

part1.InWorkObject = body1

Dim shapeFactory1 As Factory
Set shapeFactory1 = part1.ShapeFactory

Dim ref10 As Reference
Set ref10 = part1.CreateReferenceFromName("")

Dim closeSurface1 As CloseSurface
Set closeSurface1 = shapeFactory1.AddNewCloseSurface(ref10)

'Dim hybridBodies1 As HybridBodies
Set hybridBodies1 = part1.HybridBodies

'Dim hybridBody1 As HybridBody
Set hybridBody1 = hybridBodies1.Item("GeometryFromExcel")

'Dim hybridShapes1 As HybridShapes
Set hybridShapes1 = hybridBody1.HybridShapes

'Dim hybridShapeSweepExplicit1 As HybridShape
Set hybridShapeSweepExplicit1 = hybridShapes1.Item("Sweep.1")

Dim ref11 As Reference
Set ref11 = part1.CreateReferenceFromObject(hybridShapeSweepExplicit1)

closeSurface1.Surface = ref11

part1.Update


''Boolische Operation Trommel minus Seil

Set part1 = partDocument1.Part

'Dim bodies1 As Bodies
Set bodies1 = part1.Bodies

Dim body2 As Body
Set body2 = bodies1.Item("Trommel")

part1.InWorkObject = body2

'Dim shapeFactory1 As Factory
Set shapeFactory1 = part1.ShapeFactory

Dim body3 As Body
Set body3 = bodies1.Item("Seil")

Dim remove1 As Remove
Set remove1 = shapeFactory1.AddNewRemove(body3)

part1.Update

'Dim selection1 As Selection
Set selection1 = partDocument1.Selection

Dim visPropertySet1 As VisPropertySet
Set visPropertySet1 = selection1.VisProperties

'Dim part1 As Part
Set part1 = partDocument1.Part

'Dim hybridBodies1 As HybridBodies
Set hybridBodies1 = part1.HybridBodies

'Dim hybridBody1 As HybridBody
Set hybridBody1 = hybridBodies1.Item("GeometryFromExcel")

Set hybridBodies1 = hybridBody1.Parent

Dim bSTR1 As String
bSTR1 = hybridBody1.Name

selection1.Add hybridBody1

Set visPropertySet1 = visPropertySet1.Parent

Dim bSTR2 As String
bSTR2 = visPropertySet1.Name

Dim bSTR3 As String
bSTR3 = visPropertySet1.Name

visPropertySet1.SetShow 1

selection1.Clear

'-----------------------------------
'NEW 21.10.16
'Catia File speichern unter

Dim Datei, strFilePath As String

Set Datei = CATIA.ActiveDocument
Fehler:
strFilePath = CATIA.FileSelectionBox("SaveAs", "*.CATPart", 1)
'If user clicked cancel (empty string is returned), then exit the program
If strFilePath = "" Then
    Exit Sub
ElseIf Dir(strFilePath) <> "" Then
    MsgBox "Datei ist noch geöffnet"
    GoTo Fehler:
Else
    Datei.SaveAs strFilePath
End If
'----------------------------------
End Sub


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

RSchulz
Moderator²
Head of CAD, Content & Collaboration / IT-Manager



Sehen Sie sich das Profil von RSchulz an!   Senden Sie eine Private Message an RSchulz  Schreiben Sie einen Gästebucheintrag für RSchulz

Beiträge: 5541
Registriert: 12.04.2007

@Work
Lenovo P510
Xeon E5-1630v4
64GB DDR4
Quadro P2000
256GB PCIe SSD
512GB SSD
SmarTeam V5-6 R2016 Sp04
CATIA V5-6 R2016 Sp05
E3.Series V2019
Altium Designer/Concord 19
Win 10 Pro x64

erstellt am: 08. Nov. 2016 13:36    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für deadpant 10 Unities + Antwort hilfreich

Hallo DeadP,

also generell gibt es ein paar Regeln, die jeder anders sieht 

Ich selbst mag late binding nicht, da es sehr schlecht lesbar ist und stellenweise zu Problemen führen kann.Hierbei gibt es nur wenige Ausnahmen, die ein Latebinding notwendig machen!
Daher Regel 1 die Variablen\Objektdefinitionen immer an den Anfang.

Dann würde ich für alles was doppelt oder öfter vorkommt eine Unteroutine (Sub oder Function) je nach Bedarf definieren. Gleiches gilt für klar abgegrenzte Funktionen.
Daher Regel 2 Unteroutinen sinnvoll definieren.

Bei Makrorekorder wird auch sehr viel aufgenommen, was für den Ablauf total irrelevant ist.
Regel 3 aufräumen!

Alle Elemente die zusammen gehören sollten zusammengerückt sein. Dann immer mit einer Leerzeile trennen. Ist fürs Lesen besser. Die Struktur sollte sauber sein. Ist am Anfang zwar viel Arbeit, aber im späteren Verlauf immer entscheidend.
Regel 4 Struktur schaffen und aufräumen 

Fehlerroutinen sollten nicht vernachlässigt werden! Das bläht zwar den Code auf, aber wenn man es strukturiert macht und es klar als solches erkennbar ist, macht es den Code nicht weniger lesbar. Hierfür muss man überlegen was passieren kann und was man dagegen machen kann. Ein harter Abruch ist für einen Code im ein Stich ins Herz. Ein Programm ist meines Erachtens nur so gut wie die Fehlerbehandlung. Daher macht in der Regel die nachträgliche Fehlerbehandlung mindestens 30% der Programmierarbeit aus (Meine Meinung) und nicht selten fast 50% des Gesamtcodes!
Regel 5 die richtige Fehlerbehandlung!

Die Namensgebung von Variablen und Objekten ist sehr entscheiden für den lesefluss eines Programms! Ich habe hierfür klar Strukturen definiert (behandelt aber jeder anders). Ein String wird mit str benannt zB strText1 oder Integer mit int Boolean mit b oder ein Returncode mit retCode, Objekte mit o oder obj und so weiter. Einzig die Variablen in Funktionen bzw der Übergabe haben bei mir rein sprechende Namen. Hierbei wähle ich generell englischsprachig.
Regel 6 Variablen und Objekte klar definieren und benennen

...und so weiter 

------------------
MFG
Rick Schulz

Nettiquette (CAD.de)  -  Was ist die Systeminfo?  -  Wie man Fragen richtig stellt.  -  Unities

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

joehz
Moderator
Freiberuflicher Konstrukteur


Sehen Sie sich das Profil von joehz an!   Senden Sie eine Private Message an joehz  Schreiben Sie einen Gästebucheintrag für joehz

Beiträge: 1057
Registriert: 25.11.2006

Win7 Pro 64 + Ubuntu + Irix6.5.20
Dell Precision M6600 i7-2960XM 2.7GHz 16GB
NVidia Quadro M5010
Catia V5R19
VB6Pro.SP6/VBA 6.5.1053

erstellt am: 08. Nov. 2016 14:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für deadpant 10 Unities + Antwort hilfreich

Hi dead,
ich hab kurz mal den Anfang umgestrickt und hierbei die Struktur angedeutet, sowie die Variablen teilweise angepasst; den Rest entsprechend ergänzen ...
Code:

Option Explicit

Public CATIA As Object

Sub CatMain()
'Dimensionierung der Variablen
  Dim oADP As Part
  Dim hybridShapeFactory1 As factory
  Dim hybridBodies1 As hybridBodies

  Set CATIA = GetObject(, "CATIA.Application")

  Set oADP = CATIA.ActiveDocument.Part

  Set hybridShapeFactory1 = oADP.HybridShapeFactory
  Set hybridBodies1 = oADP.hybridBodies

  Join_Spline oADP, hybridShapeFactory1, hybridBodies1

End Sub

Sub Join_Spline(oParent As Part, oHSF As factory, oHBs As hybridBodies)
'Splines miteinander verbinden

  Dim hybridBody1 As HybridBody
  Dim hybridShapes1 As HybridShapes
  Dim selection1 As Selection
  Dim i As Integer
  Dim hybridShapeSpline1 As HybridShape
  Dim ref1 As Reference
  Dim hybridShapeSpline2 As HybridShape
  Dim ref2 As Reference
  Dim hybridShapeAssemble1 As HybridShapeAssemble
  Dim hybridShapeSplinei As HybridShape
  Dim ref3 As Reference

  On Error GoTo Join_Spline_Error

  Set hybridBody1 = oHBs.Item("GeometryFromExcel")
  Set hybridShapes1 = hybridBody1.HybridShapes

  'Anzahl der Splines bestimmen
  Set selection1 = CATIA.ActiveDocument.Selection
  'selection1.Search "Name=Spline*,all"
  selection1.Search "((((CATStFreeStyleSearch.GSMCurve + CAT2DLSearch.2DSplineCurve) + CATSketchSearch.2DSplineCurve) + CATDrwSearch.2DSplineCurve) + CATGmoSearch.GSMCurve),all"

  anzahlspline = selection1.Count
  'MsgBox anzahlspline

  '----------------------------
  Set hybridShapeSpline1 = hybridShapes1.Item("Spline.1")
  Set ref1 = oParent.CreateReferenceFromObject(hybridShapeSpline1)
  Set hybridShapeSpline2 = hybridShapes1.Item("Spline.2")
  Set ref2 = oParent.CreateReferenceFromObject(hybridShapeSpline2)

  Set hybridShapeAssemble1 = oHSF.AddNewJoin(ref1, ref2)
  'Spline3-6 erzeugen und verbinden

  '--------
  '!!!!!!!!
  ' "object" als wort im folgenden ersetzen durch was anderes

  For i = 3 To selection1.Count
      Set obj = selection1.Item(i).Value                  'Auswahl der Spline.i im Geometrischem Set "Geometrie von Excel
      'MsgBox object.Name ' gibt den Instanznamen aus

      Set hybridShapeSplinei = hybridShapes1.Item(obj.Name)  'Auswahl des Splines der hinzugefügt werden soll

      'MsgBox hybridShapes1.Item(object.Name).Name

      Set ref3 = oParent.CreateReferenceFromObject(hybridShapeSplinei)  ' REferenz wird generiert
      hybridShapeAssemble1.AddElement ref3                'Spline wir hinzugefügt
  Next

  '-----------------------------------------------------
  'Eigenschaften Join Befehl
  hybridShapeAssemble1.SetConnex 1
  hybridShapeAssemble1.SetManifold 1
  hybridShapeAssemble1.SetSimplify 0
  hybridShapeAssemble1.SetSuppressMode 0
  hybridShapeAssemble1.SetDeviation 0.001
  hybridShapeAssemble1.SetAngularToleranceMode 0
  hybridShapeAssemble1.SetAngularTolerance 0.5
  hybridShapeAssemble1.SetFederationPropagation 0
  '------------------------------------------------------

  hybridBody1.AppendHybridShape hybridShapeAssemble1
  oParent.InWorkObject = hybridShapeAssemble1
  oParent.Update

  Exit Sub
'---------------------------------------------------------------------------------------
Join_Spline_Error:
  Dim errMsg As String
  Dim errRet As VbMsgBoxResult

  Select Case Err.Number
'      Case 438
'      Case -2147467259
      Case Else
        errMsg = Err.Number & ": " & Err.Description & " in procedure Join_Spline"
        errRet = MyMsgBox(errMsg, vbOKOnly, "Join_Spline")
  End Select

  'Resume Next                                          'fall thru to quit sub
'---------------------------------------------------------------------------------------

End Sub



Allgemein: Keine Dims innerhalb von Schleifen!
Nicht geprüft hab ich, ob zB der Schleifenzähler ab '3' sinnvoll ist.
Der Code ist ungetestet.
Ausserdem:
- Bearbeiten würde ich das Makro im VBA-Makro-Editor.
- statt 8x hybridShapeAssemble1 auszuschreiben würde ich einen 'With'-Block einsetzen
- statt die vom Makro-Rekorder vorgegebenen Variablen zu übernehmen würd' ich zB 'oSel' statt 'selection1' schreiben(auch entprechend dem von Rick vorgetragenen)
- ditto ein Beispiel für eine Fehlerroutine

Hope it helps,
Joe

------------------
Inoffizielle Catia Hilfeseite

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

deadpant
Mitglied



Sehen Sie sich das Profil von deadpant an!   Senden Sie eine Private Message an deadpant  Schreiben Sie einen Gästebucheintrag für deadpant

Beiträge: 13
Registriert: 12.11.2012

Creo Parametric 2.0 M10
Vatia V5 R18
Intel core i7-4710HQ
NVidia GeForce GTX850M
Win10 64 bit 16GB

erstellt am: 08. Nov. 2016 15:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Ein herzliches Dankeschön an euch beide für die Tipps und den Beispielcode. Ich werde die Vorschläge anwenden und meinen Code verbessern. Wird wohl ein Weilchen daueren 

Beste Grüße Dead

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

deadpant
Mitglied



Sehen Sie sich das Profil von deadpant an!   Senden Sie eine Private Message an deadpant  Schreiben Sie einen Gästebucheintrag für deadpant

Beiträge: 13
Registriert: 12.11.2012

Creo Parametric 2.0 M10
Vatia V5 R18
Intel core i7-4710HQ
NVidia GeForce GTX850M
Win10 64 bit 16GB

erstellt am: 28. Dez. 2016 16:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo, der Code ist zwar noch nicht ganz fertig, aber hier schon mal ein Teil des Codes, wie ich ihn umgeschrieben habe.

Ein großen Dank an Joe und Rick. Eure Tipps haben sehr viel gebracht.

Gruß Dead

Code:

Option Explicit
Public CATIA As Object

Sub Seil()

Dim objADP As Part
Dim objHSF As Factory
Dim objHBies As HybridBodies
Dim objHB As HybridBody
Dim objHS As HybridShapes

On Error GoTo FehlerSeil

Set CATIA = GetObject(, "CATIA.Application")

Set objADP = CATIA.ActiveDocument.Part
Set objHSF = objADP.HybridShapeFactory
Set objHBies = objADP.HybridBodies
Set objHB = objHBies.Item("GeometryFromExcel")
Set objHS = objHB.HybridShapes

'-----------------------------------------------------------------------------
'Unterskripte aufrufen
Call Join_Spline(objADP, objHSF, objHBies, objHB, objHS)
Call Ebene_Point1(objADP, objHSF, objHBies, objHB, objHS)
Call Ellipse(objADP, objHSF, objHBies, objHB, objHS)
Call Sweep_Huelle(objADP, objHSF, objHBies, objHB, objHS)
Call Vol_Seil(objADP, objHSF, objHBies, objHB, objHS)
Call BoolOP(objADP, objHSF, objHBies, objHB)
Call mHoehe_h.Rechteck(objADP)  'Höhe h Seilzwischenreum Lage 1
Call Ausblenden
objADP.Update
Call Save_file
 
End Sub
'1.
Sub Join_Spline(part1 As Part, objHSF As Factory, objHBies As HybridBodies, objHB As HybridBody, objHS As HybridShapes)

'Anzahl der Splines bestimmen
Dim objSel As Selection
Dim i, anzahlspline As Integer
Dim objHSS1, objHSS2, objHSSi As HybridShape 'HSS=HybridShapeSpline
Dim objRefSpline1, objRefSpline2, objRefSplinei As Reference
Dim objHSA As HybridShapeAssemble
Dim obj As Object
   
Set objSel = CATIA.ActiveDocument.Selection
objSel.Search "((((CATStFreeStyleSearch.GSMCurve + CAT2DLSearch.2DSplineCurve) + CATSketchSearch.2DSplineCurve) + CATDrwSearch.2DSplineCurve) + CATGmoSearch.GSMCurve),all"
anzahlspline = objSel.Count
'----------------------------
    Set objHSS1 = objHS.Item("Spline.1")
    Set objRefSpline1 = part1.CreateReferenceFromObject(objHSS1)
    Set objHSS2 = objHS.Item("Spline.2")
    Set objRefSpline2 = part1.CreateReferenceFromObject(objHSS2)
    Set objHSA = objHSF.AddNewJoin(objRefSpline1, objRefSpline2)

'Spline3-6 erzeugen und verbinden

For i = 3 To objSel.Count
    Set obj = objSel.Item(i).Value 'Auswahl der Spline.i im Geometrischem Set Geometrie von Excel
'MsgBox obj.Name ' gibt den Instanznamen aus
    Set objHSSi = objHS.Item(obj.Name) 'Auswahl des Splines der hinzugefügt werden soll
'MsgBox objHS.Item(obj.Name).Name
    Set objRefSplinei = part1.CreateReferenceFromObject(objHSSi) ' REferenz wird generiert
    objHSA.AddElement objRefSplinei 'Spline wir hinzugefügt
Next
'-----------------------------------------------------
'Eigenschaften Join Befehl
With objHSA
    .SetConnex 1
    .SetManifold 1
    .SetSimplify 0
    .SetSuppressMode 0
    .SetDeviation 0.001
    .SetAngularToleranceMode 0
    .SetAngularTolerance 0.5
    .SetFederationPropagation 0
End With
'------------------------------------------------------

objHB.AppendHybridShape objHSA

part1.InWorkObject = objHSA

End Sub

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 28. Dez. 2016 17:44    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für deadpant 10 Unities + Antwort hilfreich

Servus
Ein paar Anmerkungen/Empfehlungen zu deinem Code.
Gehe niemals blind von bestimmten Vorbedingungen aus (Fehlerbehandlung). zB
- Was ist wenn Catia nicht gestartet ist?
- wenn kein Part geöffnet ist?
- wenn kein GeoSet mit dem Namen GeometryFromExcel existiert?
- .....

Wenn du Variablen zB über Dim i, anzahlspline As Integer definierst ist i vom Typ Variant und nur Anzahlspline ein Integer. (findet man sehr häufig falsch)

Bei deiner Suche suchst du im kompletten Dokument, und nicht nur im entsprechenden GeoSet? Ist das so gewollt?
Die ersten beiden Splines sprichst du über den Namen an (gefährlich!) an und nicht mit der Selektion.
Was ist wenn kein Spline gefunden wird?
Statt die gefunden Elemente per Namen anzusprechen kannst du diese direkt ansprechen:

Code:
Set oSpline = objSel.Item(i).Value 'i-gefundener Spline
Set ref3 = part1.CreateReferenceFromObject(oSpline)
'ggf geht sogar direkt:
set ref3 = objSel.Item(i).Reference
und dann daraus die Reference  bilden.


Gruß
Bernd

PS: Bitte in Zukunft Code in den entsprechenden Code-Tags posten.

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

joehz
Moderator
Freiberuflicher Konstrukteur


Sehen Sie sich das Profil von joehz an!   Senden Sie eine Private Message an joehz  Schreiben Sie einen Gästebucheintrag für joehz

Beiträge: 1057
Registriert: 25.11.2006

Win7 Pro 64 + Ubuntu + Irix6.5.20
Dell Precision M6600 i7-2960XM 2.7GHz 16GB
NVidia Quadro M5010
Catia V5R19
VB6Pro.SP6/VBA 6.5.1053

erstellt am: 28. Dez. 2016 19:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für deadpant 10 Unities + Antwort hilfreich

Hi dead,

noch zwei Anmerkungen meinerseits:

- Leg einen Header zu (fast) jeder Routine an
- Kommentier deinen Code

Ersteres beinhaltet:

Name der Routine:
Wer: (hat programmiert)
Wann:
Wofür: (welches Release)
Wozu: (was tut das Makro)
Voraussetzungen: (was braucht das Makro)
Syntax: (des Aufrufs; Übergabeparameter)
Ergebnis: (was kommt zurück)
.
.

Das sieht bei mir so aus:

Code:

'---------------------------------------------------------------------------------------
' Procedure : CreateNewPart
' Author    : jherzog
' Date      : 08.12.2016
' Time      : 22:02
' Languages : VBA 6.5
' V5-Release: V5R19/21
' Purpose  : create sketch and 3d-pad based on sketch
' Parms    : -
' Ret. Value: -
'
' Syntax    : CreateNewPart
'
' Prereqs  : open catia session
' Remarks  : sketch support plane is created in script
'---------------------------------------------------------------------------------------
'


Unter Prereqs könnte zB stehen: Laufende Catia-Session, geladenes Part; GeoSet 'GeometryFromExcel', ...

Der Vorteil eines Headers erschliesst sich dir, wenn Du mehr als ein Makro hast und was suchst.


Kommentare: Nach einem halben Jahr weisst nicht mehr sofort wie Du was warum programmiert hast.

Das könnte dann so aussehen:

Code:

Public Const lDelay1 As Long = 1000                    'the time in ms between WM_TIMER events
Public Const lDelay2 As Long = 1000                    'the time in ms between WM_TIMER events


oder so:
Code:

'---------------------------------------------------------------------------------------
' Procedure : StartTimer
' Author    : jherzog
' Date      : 19.06.2015
' Time      : 11:44
' Languages : VBA 6.5
' V5-Release: V5R19/21
' Purpose  : Start the timer/init the timerproc
' Parms    : none; lDelay is global;
' Ret. Value: -
'
' Syntax    : StartTimer
'
' Prereqs  : -
' Remarks  : -
'---------------------------------------------------------------------------------------
'
Public Sub StartTimer(iTimerID As Integer, lDelay As Long)
  Dim iTimer As Integer
 
  iTimer = SetTimer(UF_hWnd, iTimerID, lDelay, AddressOf WndProc)              'start timer
 
  If iTimer <> 0 Then                                              'is there a timer
      frmSB_Demo.SetSBText "Timer " & CStr(iTimerID) & " started", 0
  Else                                                              'if no timer exists
      MsgBox "Couldn't create timer. Exiting...", _
        vbOKOnly Or vbCritical, "StartTimer"                        'send message
      End                                                            'exit macro
  End If
 
End Sub

Ausserdem:
Was Bernd zu der Zeile

Code:

Dim i, anzahlspline As Integer


geschrieben hat, gilt auch hier:
Code:

Dim objHSS1, objHSS2, objHSSi As HybridShape 'HSS=HybridShapeSpline
Dim objRefSpline1, objRefSpline2, objRefSplinei As Reference

Und zuletzt:
Es gibt ein AddOn für Dinge wie Header, Fehlerroutinen etc. und zwar hier:
http://mz-tools-for-vba.software.informer.com/3.0/

Es existiert auch eine Freeware-Version für VB6.
Die kostenpflichtige ist für .Net.

Tschau,
Joe

------------------
Inoffizielle Catia Hilfeseite

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz