Autor
|
Thema: Einfügen einer Skizze in ein OGS (2259 mal gelesen)
|
MarkusFMT Mitglied Student
Beiträge: 2 Registriert: 17.12.2007
|
erstellt am: 15. Jan. 2008 11:39 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich versuche nun schon seit einiger Zeit mit Hilfe eines MS VisualBasic Makros eine Skizze in ein Ordered Geometrical Set einzufügen, bisher allerdings vergebens. Hier mein bisheriger Code (ohne Skizzengeometrie): -------------------------------------------------- Sub CATMain() Set Document = CATIA.ActiveDocument Set Part = Document.Part Set Bodies = Part.Bodies Set Body1 = Bodies.Add() Body1.Name = "Geometrie" Set OGSs = Body1.OrderedGeometricalSets Set OGS1 = OGSs.Add() OGS1.Name = "Skizzen" Set Sketches = OGS1.OrderedSketches Set Plane = Part.OriginElements.PlaneXY Set Sketch1 = Sketches.Add(Plane) (*) End Sub --------------------------------------------------- Bei (*) steigt er jedes Mal aus mit der Meldung, dass die Methode Add() gescheitert ist. Kann mir vielleicht jemand sagen, wo hier das Problem liegt? Vielen Dank! Gruß Markus (Version: CATIA V5 R16 SP5 HF54) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
danw Mitglied Student
Beiträge: 17 Registriert: 21.06.2012 CATIA V5 R18 Win7x64 Pro Intel Core i5/750 8GB DDR3/RAM
|
erstellt am: 21. Jun. 2012 12:31 <-- editieren / zitieren --> Unities abgeben: Nur für MarkusFMT
Hallo miteinander, ich weis der Beitrag ist schon sehr alt, ich stehe aber seit gestern genau vor dem selben Problem und finde keine Lösung. Vielleicht kann mir jemand weiterhelfen. Danke und Gruß Daniel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 21. Jun. 2012 16:50 <-- editieren / zitieren --> Unities abgeben: Nur für MarkusFMT
Servus Willkommen im Forum. Ich hab auf es auch auf die schnelle nicht mit der Methode "Add" hinbekommen. Als Workaround könnte vielleicht cut&paste gehen: Skizze in einem Körper/GeoSet erzeugen, dann ausschneiden und im Ordered geometrical Set einfügen Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
danw Mitglied Student
Beiträge: 17 Registriert: 21.06.2012 CATIA V5 R18 Win7x64 Pro Intel Core i5/750 8GB DDR3/RAM
|
erstellt am: 26. Jun. 2012 11:12 <-- editieren / zitieren --> Unities abgeben: Nur für MarkusFMT
Hallo Bernd, danke für die Antwort. Ich habe gesehen, dass es in meinem Fall keinen Unterschied macht, wenn ich die Skizzen in einem allgemeinen Body statt in einem OGS erzeuge. In meinem Makro will ich Punkte aus einer Excel Tabelle auslesen und anschließend eine Spline durchlegen lassen. Hat soweit auch geklappt, die Skizze und die Punkte sind dort, wo sie sein sollen. Nur beim Erzeugen der Spline hängt sich CATIA auf. Habe schon überprüft ob die Dimension von TopPoints stimmt (das tut sie), die Deklarierung sollte auch stimmen, es kann also eigentlich nur noch an der Definition der Spline liegen: Set TopSpline = myTools.CreateSpline(TopPoints) Da habe ich keine weiterführunden Informationen im Netz/CATDoc finden können. Hier der entsprechende Auszug aus dem Quellcode:
Code: ... Dim TopPoints(), BottomPoints() As CATSafeArrayVariant Dim myTools As Factory2D Dim TopSpline, BotSpline As Spline2D Dim XCoord,YCoord As Double Dim newPoint As Point2D Dim newControlPoint As ControlPoint2D Dim nRow, nIndex As Integer ... ' Skizze öffnen Set myTools = mySketch.OpenEdition ' Koordianten beginnen in der 3. Zeile der Tabelle nRow = 3 ' Array Start nIndex = -1 ' --- Oberseite --- ' Zeilen solange einlesen bis nichts mehr drin steht Do ' Spalte 1,2 = Werte XCoord = CDbl(WS.Cells(nRow, 1).Value) YCoord = CDbl(WS.Cells(nRow, 2).Value) ' Punkt mit den Koordinaten erstellen Set newPoint = myTools.CreatePoint(XCoord, YCoord) 'Set newControlPoint = myTools.CreateControlPoint(XCoord, YCoord) ' Array neue Dimension nIndex = nIndex + 2 ReDim Preserve TopPoints(nIndex) ' X-Wert im Array für die Spline speichern TopPoints(nIndex-1) = XCoord TopPoints(nIndex) = YCoord ' Zeile hochzählen nRow = nRow + 1 ' Schleife verlassen, wenn Zelle leer ist Loop While (WS.Cells(nRow, 1).Text <> "")' Spline durch die Punkte legen Set TopSpline = myTools.CreateSpline(TopPoints) ' Skizze schließen mySketch.CloseEdition ...
Wäre sehr dankbar wenn mir hier jemand noch auf die Sprünge hilft. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 26. Jun. 2012 12:25 <-- editieren / zitieren --> Unities abgeben: Nur für MarkusFMT
Servus IMHO musst du der Funktion "CreateSpline" einen Array mit den 2D-Kontrollpunkten übergeben, und nicht die Koordinaten dazu. Code: TopPoints(nIndex) = newPoint
Das redimensionieren des Arrays muss dann natürlich auch angepasst werden. Anbei ein Beispiel-Code:Code: Sub CATMain()Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part Dim hybridBodies1 As HybridBodies Set hybridBodies1 = part1.HybridBodies Dim hybridBody1 As HybridBody Set hybridBody1 = hybridBodies1.Item("Geometrisches Set.1") Dim sketches1 As Sketches Set sketches1 = hybridBody1.HybridSketches Dim reference1 As Reference Set reference1 = part1.CreateReferenceFromName("Selection_RSur:(Face:(Brp:(AxisSystem.1;2);None:();Cf11:());AxisSystem.1;Z0;G3491)") Dim sketch1 As Sketch Set sketch1 = sketches1.Add(reference1) Dim arrayOfVariantOfDouble1(8) arrayOfVariantOfDouble1(0) = 0# arrayOfVariantOfDouble1(1) = 0# arrayOfVariantOfDouble1(2) = 0# arrayOfVariantOfDouble1(3) = 0# arrayOfVariantOfDouble1(4) = 1# arrayOfVariantOfDouble1(5) = 0# arrayOfVariantOfDouble1(6) = 0# arrayOfVariantOfDouble1(7) = 0# arrayOfVariantOfDouble1(8) = 1# Set sketch1Variant = sketch1 sketch1Variant.SetAbsoluteAxisData arrayOfVariantOfDouble1 part1.InWorkObject = sketch1 Dim factory2D1 As Factory2D Set factory2D1 = sketch1.OpenEdition() Dim controlPoint2D1 As ControlPoint2D Set controlPoint2D1 = factory2D1.CreateControlPoint(29.670109, 40.994579) Dim controlPoint2D2 As ControlPoint2D Set controlPoint2D2 = factory2D1.CreateControlPoint(137.026077, 24.91383) Dim controlPoint2D3 As ControlPoint2D Set controlPoint2D3 = factory2D1.CreateControlPoint(123.889694, 46.883305) Dim controlPoint2D4 As ControlPoint2D Set controlPoint2D4 = factory2D1.CreateControlPoint(91.275223, 50.733624) Dim controlPoint2D5 As ControlPoint2D Set controlPoint2D5 = factory2D1.CreateControlPoint(61.605114, 33.293941) Dim arrayOfObject1(4) Set arrayOfObject1(0) = controlPoint2D1 Set arrayOfObject1(1) = controlPoint2D5 Set arrayOfObject1(2) = controlPoint2D4 Set arrayOfObject1(3) = controlPoint2D3 Set arrayOfObject1(4) = controlPoint2D2 Set factory2D1Variant = factory2D1
Set spline2D1 = factory2D1Variant.CreateSpline(arrayOfObject1) sketch1.CloseEdition part1.InWorkObject = hybridBody1 part1.Update End Sub
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
danw Mitglied Student
Beiträge: 17 Registriert: 21.06.2012 CATIA V5 R18 Win7x64 Pro Intel Core i5/750 8GB DDR3/RAM
|
erstellt am: 26. Jun. 2012 12:48 <-- editieren / zitieren --> Unities abgeben: Nur für MarkusFMT
Ja, so hatte ich es als erstes, da gibt CATIA folgende Fehlermeldung: Das Objekt unterstützt diese Eigenschaft oder Methode nicht ('TopPoints').Ein Punkt füllt doch dann genau ein Array-Feld aus, d.h. Dimension des Array -1 (da bei 0 begonnen wird) = Anzahl der Punkte? Ich habe meine Skizze in einem Body, bei deinem Beispiel ist sie ja in einem GS. Das sollte aber (außer der Deklaration) keinen Unterschied machen? Hier der veränderte Code:
Code: ' Excel starten Set Excel = CreateObject("Excel.Application") Excel.Visible = True ' Arbeitsmappe öffnen Set WB = Excel.Workbooks.Open(oFileSource) ' Tabelle holen Set WS = WB.Worksheets.Item(1) ' Aktives part holen Set myPart = CATIA.ActiveDocument.Part ' Umgebung holen Set HybShapeFac = myPart.HybridShapeFactory ' Körper holen (Name: SKIZZEN) Set myBodies = CATIA.ActiveDocument.Part.Bodies Set myBody = myBodies.Item ("SKIZZEN") ' Körper "In Bearbeitung" definieren myPart.InWorkObject = myBody' Referenzebene daklarieren Set myRefPlane = myPart.OriginElements.PlaneZX ' Skizze erstellen Set mySketches = myBody.Sketches Set mySketch = mySketches.Add(myRefPlane) ' Ausrichtung an Achsensystem.1 angleichen Set myAxisSystem = myPart.AxisSystems.Item(1) myAxisSystem.GetOrigin myAxisOrigin myAxisSystem.GetXAxis myXAxis myAxisSystem.GetYAxis myYAxis mySketchAxes(0) = myAxisOrigin(0) mySketchAxes(1) = myAxisOrigin(1) mySketchAxes(2) = myAxisOrigin(2) mySketchAxes(3) = myXAxis(0) mySketchAxes(4) = myXAxis(1) mySketchAxes(5) = myXAxis(2) mySketchAxes(6) = myYAxis(0) mySketchAxes(7) = myYAxis(1) mySketchAxes(8) = myYAxis(2) mySketch.SetAbsoluteAxisData mySketchAxes 'mySketch.InverseOrientation ' Skizze öffnen Set myTools = mySketch.OpenEdition ' Koordianten beginnen in der 3. Zeile der Tabelle nRow = 3 ' Array Start nIndex = 0 ' --- Oberseite --- ' Zeilen solange einlesen bis nichts mehr drin steht Do ' Spalte 1,2 = Werte XCoord = CDbl(WS.Cells(nRow, 1).Value) YCoord = CDbl(WS.Cells(nRow, 2).Value) ' Punkt mit den Koordinaten erstellen 'Set newPoint = myTools.CreatePoint(XCoord, YCoord) Set newControlPoint = myTools.CreateControlPoint(XCoord, YCoord) ' Array neue Dimension ReDim Preserve TopPoints(nIndex) ' X-Wert im Array für die Spline speichern TopPoints(nIndex) = newControlPoint ' Zeile hochzählen nRow = nRow + 1 nIndex = nIndex + 1 ' Schleife verlassen, wenn Zelle leer ist Loop While (WS.Cells(nRow, 1).Text <> "") ' Spline durch die Punkte legen Set TopSpline = myTools.CreateSpline(TopPoints) ' Skizze schließen mySketch.CloseEdition ' Part aktualisieren myPart.Update ' Ecxel schliessen Excel.Quit
[Diese Nachricht wurde von danw am 26. Jun. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 26. Jun. 2012 15:54 <-- editieren / zitieren --> Unities abgeben: Nur für MarkusFMT
Servus Dein Code sieht eigendlichh gut aus, mir fällt kein Fehler auf. Programmierst du in VBA? hast du mal de einzelnen Objekte im Watch-Fenster kontolliert? In VBA musst du folgenden Umweg gehen: Code: Dim factory2D1 As Factory2D Set factory2D1 = sketch1.OpenEdition() .... Set factory2D1Variant = factory2D1 Set spline2D1 = factory2D1Variant.CreateSpline(arrayOfObject1)
Da die CreateSpline-Methode "restriced" ist.Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
danw Mitglied Student
Beiträge: 17 Registriert: 21.06.2012 CATIA V5 R18 Win7x64 Pro Intel Core i5/750 8GB DDR3/RAM
|
erstellt am: 26. Jun. 2012 16:35 <-- editieren / zitieren --> Unities abgeben: Nur für MarkusFMT
Also ich editiere das .CATScript bisher mit Notepad++ mit VB als eignestellte Sprache. Bis zur CreateSpline Methode komme ich erst gar nicht, denn er steigt schon hier aus (Das Objekt unterstützt diese Eigenschaft oder Methode nicht ('TopPoints')):
Code: ' Punkt Array für die Spline speichern TopPoints(nIndex) = newControlPoint
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 27. Jun. 2012 16:51 <-- editieren / zitieren --> Unities abgeben: Nur für MarkusFMT
Servus Ist der Array richtig dimensioniert? (mit LBound oder Ubound mal checken) Ich empfehle dir im VBA-Editor zu programmieren und alle Variabel zu deklarieren. Die Objektüberwachung und das schrittweise asführen eines Programms sind srh nützlich, und natürlich noch InteliSense (Autovervollständigung) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
danw Mitglied Student
Beiträge: 17 Registriert: 21.06.2012 CATIA V5 R18 Win7x64 Pro Intel Core i5/750 8GB DDR3/RAM
|
erstellt am: 28. Jun. 2012 10:48 <-- editieren / zitieren --> Unities abgeben: Nur für MarkusFMT
Hallo Bernd, ja, das Array war richtig dimensioniert und deklariert. Nach mehrfachem an die Decke gehen habe ich rausgefunden woran es lag:
Code: Set TopPoints(nIndex) = newControlPoint
...er wollte scheinbar ein "Set" haben.Hoffe ich komme jetzt mit dem Rest dieses Makros ohne größere Probleme durch, ansonsten melde ich mich wieder. ;-) Danke für deine Hilfe! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |