Autor
|
Thema: Elemente aus Geometrischen Set in txt-File exportieren (3898 mal gelesen)
|
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 03. Nov. 2006 16:17 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute! Ich bin dabei eine Schnittstelle zu programmieren. dazu ist es erstmal notwendig daten aus einem geometrischen set in eine txt-datei zu exportieren. Also, ich habe ein geometrisches set in dem punkte, linien, kreis, splines vorhanden sind. Nun möchte ich das ich das makro starte, er mich fragt welches geo-set ich exportieren möchte, ich dieses selektieren und dann soll er erkennen was für elemente darin sind. den elementtyp und die dazugehörigen koordinaten sollen dann in einem txt-file gespeichert werden! Kann mir jemand ein tip geben mit welchen mitteln ich das erstmal hinbekomme? wichtig wäre erstmal, das er erkennt was im set ist und den typ und die punkte speichert im txt-file. vereinfacht nehmen wir erstmal an das dort nur punkte, linien und evtl noch kreise vorhanden sind - splines, halbkreis, etc kommen später! wäre um tipps dankbar habe zwar schon etwas gefunden hier im forum, aber nur ein skript welches nur mit punkte funzt. Grüsse Matthias
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 03. Nov. 2006 16:26 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
|
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 03. Nov. 2006 17:02 <-- editieren / zitieren --> Unities abgeben:
naja, bislang habe ich nur ein skript aus dem forum, welches ich versuche umzuwandeln. aber das funktioniert ja leider nur, wenn das set nur aus punkten besteht. das heißt ich brauche vorab eine abfrage, um welchen elemnttyp es sich handelt, wenn es ein punkt ist, soll das makro dann z.b, Punk und dann die koordinaten dahinter in die txt datei schreiben , bei iener line dann z.b. Linie start und endpunkt, bei einem kreis zb kreis mittelpunkt radius oder sowas in der art! das makro welches ich abwandeln wollte ist dieses hier: _____________ Sub CATMain() ' Was soll selektierbar sein Dim EnableSelectionFor(0) EnableSelectionFor(0) = "HybridBody" ' Selektion definieren und leeren -------------------------------------------------- Set sSEL = CATIA.ActiveDocument.Selection sSEL.Clear UserSelection = sSEL.SelectElement(EnableSelectionFor, "Bitte das Geometrische Set auswählen, welches exportiert werden soll", False) ' Auswertung ob Selektion erfolgreich ----------------------------------------------- If UserSelection <> "Normal" Then MsgBox "Fehler bei der Auswahl" Exit Sub Else Set ohybridbody = sSEL.Item(1).Value End If ReDim acoord(2) Set Datei = CATIA.FileSystem.CreateFile("C:\Dokumente und Einstellungen\All Users\Desktop\export.txt", True) Set ostream = Datei.OpenAsTextStream("ForAppending") Set oshapes = ohybridbody.HybridShapes For i = 1 To oshapes.Count oshapes.Item(i).GetCoordinates acoord ostream.Write (acoord(0) & ";" & acoord(1) & ";" & acoord(2) & Chr(10)) Next ostream.Close End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 06. Nov. 2006 09:17 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Hi Matthias, ich hab dein Skript mal erweitert für das Auslesen von Punkten, Linien und Kreisen. Const sPOINT = "HybridShapePoint" Const sLINE = "HybridShapeLine" Const sCIRCLE = "HybridShapeCircle" Const sFILEPATH = "C:\Dokumente und Einstellungen\All Users\Desktop\export.txt"
Sub CATMain() ' Was soll selektierbar sein Dim sSel Dim UserSelection Dim EnableSelectionFor(0) Dim oHybridbody Dim aCoord(2) Dim aPoints(8) Dim oStream Dim oShapes Dim ii Dim oSpaWB 'As SPAWorkbench Dim oMeas 'As Measurable Dim oDatei Dim sType EnableSelectionFor(0) = "HybridBody" ' Selektion definieren und leeren -------------------------------------------------- Set sSel = CATIA.ActiveDocument.Selection sSel.Clear Call MsgBox("Bitte GeoSet selektieren", vbOKOnly) UserSelection = sSel.SelectElement2(EnableSelectionFor, "Bitte das Geometrische Set auswählen, welches exportiert werden soll", False) ' Auswertung ob Selektion erfolgreich ----------------------------------------------- If UserSelection <> "Normal" Then MsgBox "Fehler bei der Auswahl" Exit Sub Else Set oHybridbody = sSel.Item(1).Value sSel.Clear End If 'Kontrolle, ob Datei schon vorhanden ist ' wenn ja dann Daten anhängen If CATIA.FileSystem.FileExists(sFILEPATH) Then Set oDatei = CATIA.FileSystem.GetFile(sFILEPATH) ' sonst Datei erstellen Else Set oDatei = CATIA.FileSystem.CreateFile(sFILEPATH, True) End If ' zum Schreiben(Anhängen wenn schon vorhanden) öffnen Set oStream = oDatei.OpenAsTextStream("ForAppending") ' Liste der GeoElemente des GeoSets speichern Set oShapes = oHybridbody.HybridShapes ' Workbench zum Messen holen Set oSpaWB = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench") ' Fehlerbehandlung abschalten On Error Resume Next ' alle Elemente im GeoSet durchlaufen For ii = 1 To oShapes.Count ' Type des GeoElement abfragen sType = TypeName(oShapes.Item(ii)) ' GeoElement in MessObjekt umwandeln Set oMeas = oSpaWB.GetMeasurable(oShapes.Item(ii)) 'Type Kontrollieren ' Wenn Punkt If (InStr(1, sType, sPOINT) <> 0) Then Call oMeas.GetPoint(aCoord) Call oStream.Write("Punkt: (" & aCoord(0) & ";" & aCoord(1) & ";" & aCoord(2) & ")" & vbCrLf) ' wenn Linie ElseIf InStr(1, sType, sLINE) <> 0 Then ' PointsOnCurve liefert die Start-, Mittel- und Endpunktkoordinaten zurück Call oMeas.GetPointsOnCurve(aPoints) Call oStream.Write("Line: Anfang(" & aPoints(0) & ";" & aPoints(1) & ";" & aPoints(2) & _ ") Ende(" & aPoints(6) & ";" & aPoints(7) & ";" & aPoints(8) & ")" & vbCrLf) ' wenn Kreis ElseIf InStr(1, sType, sCIRCLE) <> 0 Then Call oMeas.GetCenter(aCoord) Call oStream.Write("Kreis: Mittelpunkt(" & aCoord(0) & ";" & aCoord(1) & ";" & aCoord(2) & _ ") Radius(" & oMeas.radius & ")" & vbCrLf) End If Next ' Fehlerbehandlung wieder einschalten On Error GoTo 0 ' Datei schliessen oStream.Close MsgBox ("Fertig!") End Sub wenn es noch fragen gibt sag einfach bescheid Gruß Proofin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 06. Nov. 2006 12:14 <-- editieren / zitieren --> Unities abgeben:
|
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 06. Nov. 2006 12:32 <-- editieren / zitieren --> Unities abgeben:
gleich noch eine frage: ist es möglich ein koordinate die z.B. bei 10,3467 liegt so darzustellen : 1.034670000000e+01 , also erstmal das komma durch ounkt ersetzten und dann eine exponetielle schreibweise mit 12nachkommerstellen? ist wichtig für die schnittstelle! [Diese Nachricht wurde von dersummi am 06. Nov. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 06. Nov. 2006 13:19 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Das Komma kannst du wie folgt ersetzen: Replace(aCoord(0),",",".") Der komplette Aufruf für die Ausgabe beim Punkt sieht dann wie folgt aus: Call oStream.Write("Punkt: (" &replace(aCoord(0),",",".") & ";" & replace(aCoord(1),",",".") & ";" & replace(aCoord(2),",",".") & ")" & vbCrLf) mit der exp. Schreibweise weiß ich jetzt auf anhieb nicht ob es da vielleicht eine Format Funktion gibt. Gruß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 06. Nov. 2006 13:50 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Ich hab noch eine Lösung für die Nachkommastellen, hier mal das geänderte Skript: Const sPOINT = "HybridShapePoint" Const sLINE = "HybridShapeLine" Const sCIRCLE = "HybridShapeCircle" Const sFILEPATH = "C:\Dokumente und Einstellungen\All Users\Desktop\export.txt" Sub CATMain() ' Was soll selektierbar sein Dim sSel Dim UserSelection Dim EnableSelectionFor(0) Dim oHybridbody Dim aCoord(2) Dim aPoints(8) Dim oStream Dim oShapes Dim ii Dim oSpaWB 'As SPAWorkbench Dim oMeas 'As Measurable Dim oDatei Dim sType EnableSelectionFor(0) = "HybridBody" ' Selektion definieren und leeren -------------------------------------------------- Set sSel = CATIA.ActiveDocument.Selection sSel.Clear Call MsgBox("Bitte GeoSet selektieren", vbOKOnly) UserSelection = sSel.SelectElement2(EnableSelectionFor, "Bitte das Geometrische Set auswählen, welches exportiert werden soll", False) ' Auswertung ob Selektion erfolgreich ----------------------------------------------- If UserSelection <> "Normal" Then MsgBox "Fehler bei der Auswahl" Exit Sub Else Set oHybridbody = sSel.Item(1).Value sSel.Clear End If 'Kontrolle, ob Datei schon vorhanden ist ' wenn ja dann Daten anhängen If CATIA.FileSystem.FileExists(sFILEPATH) Then Set oDatei = CATIA.FileSystem.GetFile(sFILEPATH) ' sonst Datei erstellen Else Set oDatei = CATIA.FileSystem.CreateFile(sFILEPATH, True) End If ' zum Schreiben(Anhängen wenn schon vorhanden) öffnen Set oStream = oDatei.OpenAsTextStream("ForAppending") ' Liste der GeoElemente des GeoSets speichern Set oShapes = oHybridbody.HybridShapes ' Workbench zum Messen holen Set oSpaWB = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench") ' Fehlerbehandlung abschalten On Error Resume Next ' alle Elemente im GeoSet durchlaufen For ii = 1 To oShapes.Count ' Type des GeoElement abfragen sType = TypeName(oShapes.Item(ii)) ' GeoElement in MessObjekt umwandeln Set oMeas = oSpaWB.GetMeasurable(oShapes.Item(ii)) 'Type Kontrollieren ' Wenn Punkt If (InStr(1, sType, sPOINT) <> 0) Then Call oMeas.GetPoint(aCoord) ' MyFomart siehe unten Call oStream.Write("Punkt: (" & MyFormat(aCoord(0)) & ";" & MyFormat(aCoord(1)) & ";" & MyFormat(aCoord(2)) & ")" & vbCrLf) ' wenn Linie ElseIf InStr(1, sType, sLINE) <> 0 Then ' PointsOnCurve liefert die Start-, Mittel- und Endpunktkoordinaten zurück Call oMeas.GetPointsOnCurve(aPoints) Call oStream.Write("Line: Anfang(" & aPoints(0) & ";" & aPoints(1) & ";" & aPoints(2) & _ ") Ende(" & aPoints(6) & ";" & aPoints(7) & ";" & aPoints(8) & ")" & vbCrLf) ' wenn Kreis ElseIf InStr(1, sType, sCIRCLE) <> 0 Then Call oMeas.GetCenter(aCoord) Call oStream.Write("Kreis: Mittelpunkt(" & aCoord(0) & ";" & aCoord(1) & ";" & aCoord(2) & _ ") Radius(" & oMeas.Radius & ")" & vbCrLf) End If Next ' Fehlerbehandlung wieder einschalten On Error GoTo 0 ' Datei schliessen oStream.Close MsgBox ("Fertig!") End Sub Private Function MyFormat(Value) Dim str ' Zahlenwert mit 12 Nachkommastellen formatieren str = FormatNumber(Value, 12) ' Komma durch Punkt ersetzen und Zahl zurückgeben MyFormat = Replace(str, ",", ".") End Function um den exp. Schreibweise zu erhalten kommst du ums selber rechnen wohl nicht drum herum.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 08. Nov. 2006 14:10 <-- editieren / zitieren --> Unities abgeben:
dank dir! konnte die funktion ergänzen und nun exportiert er die koordinaten tatsächlich in exponetieller schreibweise mit 12 nachkommerstellen hoffe ich hab auch alles berücksichtigt. bei weiteren fragen werde ich hier posten ;-) dank dir/euch grüsse matthias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 08. Nov. 2006 16:20 <-- editieren / zitieren --> Unities abgeben:
Schon ist es wieder soweit :-( Wie bekomme ich es hin das das makro einen Vollkreis und einen Kreisbogen unterscheiden kann? Habe die Funktion "GetLimitation" gefunden die dann z.B. 0 oder 1 ausgeben soll, aber ich bekomme es nicht hin das er dann endweder 0 oder 1 in einer Variablen speichert, so dass ich dann für den kreis oder den halbkreis unterschiedlich exportieren kann! grüsse matthias
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 08. Nov. 2006 18:08 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Hi Matthias, ohne es getestet zu haben: probier mal die Property Angle vom oMeas Objekt. ... ' wenn Kreis ElseIf InStr(1, sType, sCIRCLE) <> 0 Then Call oMeas.GetCenter(aCoord) dAngle = oMeas.Angle if dAngle < 360 then 'tut etwas else Call oStream.Write("Kreis: Mittelpunkt(" & aCoord(0) & ";" & aCoord(1) & ";" & aCoord(2) & _ ") Radius(" & oMeas.radius & ")" & vbCrLf) end if ... Gruß Proofin [Diese Nachricht wurde von Proofin am 08. Nov. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 08. Nov. 2006 18:26 <-- editieren / zitieren --> Unities abgeben:
|
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 09. Nov. 2006 09:08 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
|
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 11. Nov. 2006 16:14 <-- editieren / zitieren --> Unities abgeben:
so, mit dem makro bin ich nun recht weit alleine gekommen - aber nun kommt wieder ein kleines problem, das aber hoffetnlich einfach zu lösen ist! Einer von den Sonderfällen ist, das im GeoSet Elemente we Kreise und Linien nicht direkt sonder in einer Skizze liegen! Gibt es deine Möglichkeit auch diese Elemente auszulesen und die entsprechenden Punkte und Daten auszugeben, wie es auch mit den 3d-Objekten möglich ist? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 15. Nov. 2006 09:16 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Moin Matthias, vielleicht hab ich heute etwas Zeit mir das mal anzuschauen. Aber im Prinzip funktioniert es ähnlich wie bei den Shapes, nur das du jetzt die HybridSketches abfragen mußt. -------------------------------------------- Code -------------------------------------------- ... Dim oSketches Dim oSketch Dim yy ... ' Liste der GeoElemente des GeoSets speichern Set oShapes = oHybridbody.HybridShapes Set oSketches = oHybridbody.HybridSketches ... ' nach der Schleife für die Shapes For ii=1 to oSketches.Count Set oSketch = oSketches.Item(ii) For yy=1 to oSketch.GeometricElements.Count ' hier ähnlichen If Else Konstrukt wie in den Shapes ' die Typen sollten Line2D und Circle2D sein oder was du auslesen willst next next ... -------------------------------------------------- Code Ende -------------------------------------------------- Ich hab das nicht getestet. Aber vielleicht hilft es dir ja schon weiter. Gruß Proofin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 15. Nov. 2006 13:11 <-- editieren / zitieren --> Unities abgeben:
Danke Schon mal! Also ich bekomme es soweit hin das er die Elemente in der Skizze Abfragt und prüft ob es z.B. ein kreis ist! nun dachte ich, ich könnte mit den "alten" codes mir die benötigten Daten daraus exportieren lassen, also damit hier: Dim oSketches Dim oSketch Dim yy Dim xx ' Liste der GeoElemente des GeoSets speichern Set oSketches = oHybridbody.HybridSketches For xx=1 to oSketches.Count Set oSketch = oSketches.Item(xx) For yy=1 to oSketch.GeometricElements.Count set osketchelement = oSketch.GeometricElements.Item(yy) ' Element in MessObjekt umwandeln Set oMeas = oSpaWB.GetMeasurable(osketchelement) ' Type des GeoElement abfragen sType = TypeName(osketchelement) ' wenn Kreis If InStr(1, sType, sCIRCLE2D) <> 0 Then 'Bis hier läufts, nun muß ich aber Eigenschaften wie den Mittelpunkt abfragen Call oMeas.GetCenter(aCoord) 'oder z.B über oMeas.radius den radius rausholen End If next next ------------------------------ Liegt es daran das ich bei der deklaration von oMeas und sowas fehler gemacht habe, oder gibt es andere Befehle für die Elemente in Skizze? Also ich brauche bei dem Kreis, den Mittelpunkt, Radius, Winkel und dann nachher noch von der Skizze die Orientierung! [Diese Nachricht wurde von dersummi am 15. Nov. 2006 editiert.] [Diese Nachricht wurde von dersummi am 15. Nov. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 15. Nov. 2006 19:24 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Nein mit dem oMeas kommst du bei 2D nicht weiter!! Funktioniert nur mit 3D. Du kannst aber die Sachen direkt abfragen: 'Type des GeoElement abfragen sType = TypeName(osketchelement) ' wenn Kreis If InStr(1, sType, sCIRCLE2D) <> 0 Then 'Bis hier läufts, nun muß ich aber Eigenschaften wie den Mittelpunkt abfragen dim a2DCoord(2) osketchelement.Radius osketchelement.GetCenter(a2DCoord) end if
Für die Linie kannst du GetEndPoints(aCoords) verwenden mit aCoords(3) aCoords(0) -> x erster Punkt aCoords(1) -> y erster Punkt aCoords(2) -> x zweiter Punkt aCoords(3) -> y zweiter Punkt Hab es aber nicht weiter getestet, hab leiderr keine Zeit gehabt Zusatz: kennst du eigendlich die V5Automation.chm? Die liegt in dem Installationsverzeichnis von Catia. Gruß Proofin [Diese Nachricht wurde von Proofin am 15. Nov. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 15. Nov. 2006 23:23 <-- editieren / zitieren --> Unities abgeben:
V5Automation.chm hab ich schon und nutze ich auch (mehr oder weniger) Leider komme ich damit noch nicht so klar das ich die Befehle auch funktionsfähig umsetzen kann! GetCenter hab ich z.B. auch gefunden, aber irgendwie nicht zum laufen bekommen, obwohl es doch ganz einfach erscheint! Genau so muß ich nun noch den Winkel des Kreises rausbekommen und weiß wieder nicht weiter! Sind immer so kleinigkeiten die ganz einfach sind und ich einfach nicht aus dem V5Automation umsetzen kann! Aber ich bemühe mich, hin und wieder klappt es jo und so bekomme ich z.b. auch die Ausrichtung der Skizze ausgelesen und exportiert - geht halt immer weiter aber manchmal sieht man den wald vor lauter bäumen nicht oder mir fehlt schlichtweg die erfahrung im umgang mit V5Automation Versuche auch verzweifelt die Ausrichtung eines Achsensystems, welches im Geoset liegt auszulesen [Diese Nachricht wurde von dersummi am 15. Nov. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 16. Nov. 2006 09:22 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Moin Matthias, ich hab mal gerade die Ausgabe für die 2D Linien und Kreise ausprobiert. ----------------------------------- Code ----------------------------------- ... Dim oLine2D Dim oCircle2D Dim aPoints2D(3) Dim aPoint2D(1) ... sType = TypeName(oGeoElements.Item(yy)) 'Type Kontrollieren ' wenn Linie If InStr(1, sType, sLine2D) <> 0 Then ' GetEndPoints liefert die Start- und Endpunktkoordinaten zurück Set oLine2D = oGeoElements.Item(yy) Call oLine2D.GetEndPoints(aPoints2D) Call oStream.Write("Line2D: Anfang(" & aPoints2D(0) & ";" & aPoints2D(1) & _ ") Ende(" & aPoints2D(2) & ";" & aPoints2D(3) & ")" & vbCrLf) ' wenn Kreis ElseIf InStr(1, sType, sCircle2D) <> 0 Then Set oCircle2D = oGeoElements.Item(yy) Call oCircle2D.GetCenter(aPoint2D) Call oStream.Write("Kreis2D: Mittelpunkt(" & aPoint2D(0) & ";" & aPoint2D(1) & _ ") Radius(" & oCircle2D.Radius & ")" & vbCrLf) ... ---------------------------------- Code Ende ---------------------------------- Mußt natürlich noch die Ausgabe formatieren. Mit den Achsensystemen im Geoset ist es nicht so einfach. Gruß Proofin
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 16. Nov. 2006 09:31 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
|
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 16. Nov. 2006 10:48 <-- editieren / zitieren --> Unities abgeben:
also es werden mehrere axensysteme in dem geoset vorkommen und ich brauche die ausrichtung der achsen! bei den kreisen bin ich auch schon so weit gekommen *stolz* kennst du einen befehlt um den winkel bei kreisen in skizzen auszulesen? Danke für die viele Hilfe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 16. Nov. 2006 13:16 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
so wie ich das sehe gibt es keinen Befehl dafür. Ich würde es pauschal mal über die Vektormathematik versuchen. Du hast 2 Vektoren Mitte->End und Mitte->Start dann den Winkel zwischen den beiden berechnen. Mit den Achsensystemen hab ich vielleicht eine Idee, das kann ich aber erst am Wochenende ausprobieren. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 20. Nov. 2006 09:36 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Moin Matthias, deine Achsensysteme kannst du folgender Maßen auslesen: -------------------------------------------------- Code -------------------------------------------------- ... '------------------------------------------------------------------------- ' Achsensysteme auslesen '------------------------------------------------------------------------- ' selektion leeren sSel.Clear ' Geoset zur Selektion hinzufügen sSel.Add (oHybridbody) ' in dieser selektion die achsessysteme selektieren Call sSel.Search("Typ=Achsensystem,sel") ' alle gefundenen systeme auslesen For ii = 1 To sSel.Count ' system speichern Set oAxisSys = sSel.Item(ii).Value ' Ursprung Call oAxisSys.GetOrigin(aCoord) Call oStream.Write("KO-Sys: Ursprung(" & aCoord(0) & ";" & aCoord(1) & ";" & aCoord(2) & ")" & vbCrLf) ' X Achse Call oAxisSys.GetXAxis(aCoord) Call oStream.Write("KO-Sys: X-Dir(" & aCoord(0) & ";" & aCoord(1) & ";" & aCoord(2) & ")" & vbCrLf) ' Y Achse Call oAxisSys.GetYAxis(aCoord) Call oStream.Write("KO-Sys: Y-Dir(" & aCoord(0) & ";" & aCoord(1) & ";" & aCoord(2) & ")" & vbCrLf) ' Z Achse Call oAxisSys.GetZAxis(aCoord) Call oStream.Write("KO-Sys: Z-Dir(" & aCoord(0) & ";" & aCoord(1) & ";" & aCoord(2) & ")" & vbCrLf) Next Call sSel.Clear ... ---------------------------------------------------- Code Ende ---------------------------------------------------- Das ist zwar nicht sehr schön, da nur für das deutsche V5, aber vielleicht hilft es dir weiter. Gruß Proofin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 21. Nov. 2006 20:24 <-- editieren / zitieren --> Unities abgeben:
hatte bislang keine zeit das auszuprobieren-werd ich hoffentlich morgen zu kommen! Danke schon mal, werd das mal testen! warum funzt es denn nur für das deutsche V5? Was müsste denn für das englische anders sein? liegt es an der bezeichnung der achsensysteme? grüsse matthias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 22. Nov. 2006 11:11 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Moin Matthias, das liegt an dem Suchstring: ' in dieser selektion die achsessysteme selektieren Call sSel.Search("Typ=Achsensystem,sel") Diesen String muß du in der englischen Version anpassen, ich hab es nicht im englischen getestet. müßte dann sowas sein wie: ' in dieser selektion die achsessysteme selektieren Call sSel.Search("Type=Axis System,sel") aber wie gesagt hab ich nicht getestet. Das kannst du aber auch in Catia ausprobieren, wenn in das Menü "Bearbeiten/Suchen..." gehst. Da siehst du die Suchstrings. Gruß Proofin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 24. Nov. 2006 14:32 <-- editieren / zitieren --> Unities abgeben:
Also erstmal danke für die Arbeit! Im deutschen funzt es ausgezeichnet mit den Achsensystemen! Nun habe ich versucht es auch im Englischen hin zu bekommen! Laut Suchstring sollte der Typ , wie von dir angegeben, "Axis System" sein! Also habe ich es so versucht wie von dir vermutet! Leider ohne Erfolg! woran kann es noch liegen? hast du eine Idee? Muß es noch hinbekommen das es auch im Englischen funktioniert! Alternativ kann ich das Problem vll auch Methodisch lösen, in dem ich Vorgebe das die Systeme immer AxisSystem.1 , AxisSystem.2 , ....... , heißen müssen und dann anhand des Namen die selektion durchführen zu lassen! Noch was zu dem auslesen aus Skizzen , ich habe jetzt einiges in Automation gefunden mit dem ich arbeiten kann, nur stehe ich vor dem Problem das ich bei Punkten ja immer den Punkt in der Skizze bekomme und nicht die Koordinaten des Punktes im Raum, also die absoluten Koordinaten! Ich denke das man das auch durch Vektorrechnung evtl errechnen kann, weiß aber noch nciht wie - Aber Catia hat doch bestimmt vll ja auch eine lösung parat wie ich das umrechnen lassen kann. grüsse Matthias
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 24. Nov. 2006 18:42 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Hi Matthias, ich habe gerade den Suchstring mal im englischen ausprobiert, also bei mir funktioniert es. Mein Aufruf lautet: sSel.Add (oHybridbody) sSel.Search ("Type=Axis System,sel") Was die 2D Punkte angeht kannst du folgendes in die Abfrage der Skizzen einbauen: ------------------------------------------------- Code ------------------------------------------------- ' wenn Kreis ElseIf InStr(1, sType, sCircle2D) <> 0 Then Set oRef = CATIA.ActiveDocument.Part.CreateReferenceFromObject(oGeoElements.Item(yy)) Set oMeas = oSpaWB.GetMeasurable(oRef) Call oMeas.GetCenter(aCoord) Call oStream.Write("Kreis: Mittelpunkt(" & aCoord(0) & ";" & aCoord(1) & ";" & aCoord(2) & _ ") Radius(" & oMeas.Radius & ")" & vbCrLf) ElseIf InStr(1, sType, sPoint2D) <> 0 Then Set oRef = CATIA.ActiveDocument.Part.CreateReferenceFromObject(oGeoElements.Item(yy)) Set oMeas = oSpaWB.GetMeasurable(oRef) Call oMeas.GetPoint(aCoord) Call oStream.Write("Punkt2D: (" & MyFormat(aCoord(0)) & ";" & MyFormat(aCoord(1)) & ";" & MyFormat(aCoord(2)) & ")" & vbCrLf) End If ------------------------------------------------- Code Ende ------------------------------------------------- wie du sicher bemerkt hast kann man die 2D Objekte doch über das oMeas Objekt abfragen, tut mir leid hab ich auch jetzt erst bemerkt. Allerdings mußt du aufpassen den die Koordinaten des Mittelpunkt erhälts du zweimal einmal bei der Abfrage des Kreises und einmal bei der Abfrage der Punkte. Denn Catia legt im Sketch auch noch einen extra Punkt für den Mittelpunkt des Kreises an. Schönes Wochenende Proofin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lusilnie Mitglied
Beiträge: 1486 Registriert: 13.07.2005
|
erstellt am: 24. Nov. 2006 21:26 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Hallo dersummi, versuch es doch mal mit: Code: sSel.Search ("'Type=Axis System',sel")
Vielleicht funktioniert es ja! Der Grund ist dann, das im Englischen in "Axis System" ein Leerzeichen steht, und da hat CATIA oft ein Problem. mfg, Lusilnie
------------------
Alle Aussagen zu DassaultSystemes-Produkten sind sehr optimistisch, selbst diese!!! frei nach größeren Geistern Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 27. Nov. 2006 14:38 <-- editieren / zitieren --> Unities abgeben:
Dank für die Antworten! Also das mit den Achsensystemen hab ich nun auch endlich hinbekommen, zusätzlich wird in einer Function die Sprache geprüft so dass je nach dem der englische oder deutsche suchstring verwednet wird! Das ich über measurable auch in skizze arbeiten kann hatte ich mir auch schon irgendwie gedacht und auch schon rumprobiert, allerdings bislang ohne erfolg! nun funzt es aber, hab halt anscheinend immer probleme die richtigen referenzen anzugeben-aber nun geht es ja, manchmal schreibe ich genau das gleich dort hin und es geht nicht, wenn ich dann dein code nehme klappts, sind wohl immer irgendwie kleine fehler drin:-( ein weiteres problem hab ich nun auch wieder, und ich weiß wieder nciht was ich falsch mache! also, ich brauche von einem halbkreis zum beispiel den vektor (normiert) von mittelpunkt zu startpunkt und dann senkrecht zu diesem vektor in der ebene des kreises einen weiteren -> Ziel ist also ein neues koorinaten system zu erstellen wobei die X-Achse zum startpunkt des kreises zeigt. soweit so gut! ich habe also , vll etwas umständlich, aber das ist nun mal egal (Himmerhin komme ich so auch zum Ziel). der code funzt einwandfrei im 3D, nun wollte ich das einfach in den Teil nochmals kopieren in dem Kreise aus Skizzen ausgelesen werden, und dort funzt es nicht. Hier mal der Code: ... Dim startPoint Dim mPoint Dim halfPoint Dim LineX , RefLineX Dim LineY , RefLineY Dim XDir(2),yDir(2) Dim RefP1, RefP2, RefP0, RefPlane Dim oPart Set oPart = CATIA.ActiveDocument.Part Dim Wzk3D as Factory Set Wzk3D = oPart.HybridShapeFactory Dim oPlane ... For yy=1 to oSketch.GeometricElements.Count set osketchelement = oSketch.GeometricElements.Item(yy) ' Type des GeoElement abfragen sType = TypeName(osketchelement) Set oRef =CATIA.ActiveDocument.Part.CreateReferenceFromObject(osketchelement) Set oMeas = oSpaWB.GetMeasurable(oRef) ... ' wenn Kreis ElseIf InStr(1, sType, sCIRCLE2D) <> 0 Then '------------------------------------------------------------------Ausrichtung Call oMeas.GetCenter(aCoord) Call oMeas.GetPointsOnCurve(aPoints) ' X-Direction Set mPoint = Wzk3D.AddNewPointCoord (aCoord(0),aCoord(1),aCoord(2)) 'Alle Punkte und deren Refernece erstellen Set startPoint = Wzk3D.AddNewPointCoord (aPoints(0),aPoints(1),aPoints(2)) Set halfPoint = Wzk3D.AddNewPointCoord (aPoints(3),aPoints(4),aPoints(5)) Set RefP0 = oPart.CreateReferenceFromObject (mPoint) Set RefP1 = oPart.CreateReferenceFromObject (startPoint) Set RefP2 = oPart.CreateReferenceFromObject (halfPoint) 'oHybridBody.AppendHybridShape mPoint 'oHybridBody.AppendHybridShape startPoint Set LineX = Wzk3D.AddNewLinePtPt(RefP0, RefP1) 'Line für X-Direction oHybridBody.AppendHybridShape LineX Set RefLineX = oPart.CreateReferenceFromObject (LineX) Set oPlane = Wzk3D.AddNewPlane3Points (RefP0, RefP1 , RefP2) 'Ebene als Stützelement erstellen oHybridBody.AppendHybridShape oPlane Set RefPlane = oPart.CreateReferenceFromObject (oPlane) Set LineY = Wzk3D.AddNewLineAngle(RefLineX, RefPlane, RefP0, true , 0 , 1, 90, false ) 'Line für Y-Direction oHybridBody.AppendHybridShape LineY Set RefLineY = oPart.CreateReferenceFromObject (LineY) opart.update ' X-Richtung speichern Set oMeasLine = oSpaWB.GetMeasurable(RefLineX) Call oMeasLine.GetDirection(xDir) ' Y-Richtung Set oMeasLine = oSpaWB.GetMeasurable(RefLineY) Call oMeasLine.GetDirection(yDir) ' Elemente löschen Call Wzk3D.DeleteObjectForDatum(mPoint) Call Wzk3D.DeleteObjectForDatum(startPoint) Call Wzk3D.DeleteObjectForDatum(halfPoint) 'Call Wzk3D.DeleteObjectForDatum(oPlane) 'Call Wzk3D.DeleteObjectForDatum(LineY) 'Call Wzk3D.DeleteObjectForDatum(LineX) xDir = norm(xdir) 'Normieren yDir = norm(yDir) opart.update .... ich versteh einfach noch nicht warum das nciht geht! die Koordinaten der Punkte werden in aCoord und aPoints gespeicher, das habe ich geprüft, nun dachte ich das der Rest also auch hier funktionieren sollte, weil es im 3D ja auch geht! Ich denke mal das ich wieder ein Problem bei dei der Reference habe, oder habe ich einen solchen Denkfehler gerade???? [Diese Nachricht wurde von dersummi am 27. Nov. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 27. Nov. 2006 17:06 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Moin, ich verstehen dein Problem im Moment nicht! Ich habe deinen Code bei mir ausprobiert und ich erhalte dir Richtungen der Linien. Was funktioniert bei dir nicht oder nicht richtig?? Gruß Proofin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 27. Nov. 2006 22:48 <-- editieren / zitieren --> Unities abgeben:
Er erstellt die linien und die ebene bei mir nicht richtig! kommentiere mal das löschen der elemente aus dem code aus, bei mir werden die elemente dann nur mit fehler erstelle! Bei dir etwa nicht? Oder ist das zum Auslesen der Direction erstmal egal? [Diese Nachricht wurde von dersummi am 27. Nov. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 28. Nov. 2006 19:02 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
|
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 29. Nov. 2006 12:58 <-- editieren / zitieren --> Unities abgeben:
jetzt scheint es zu gehen! Ich habe beim auskommentieren der löschbefehle weiterhin die punkte lösche lassen, daher konnten die linie nicht fehlerfrei dargestellt werden - blöder fehler! nachdem ich meinem rechner mal einen neustart gegönnt habe, scheinen auch nun die richtungen richtig zu sein - wenn der pc zu lange läuft und zu viel nebenbei macht, dann scheine ich probleme mit catia zu bekommen! wenn das jedenfalls nicht am skript liegt, weil es so wie ich es mir gedacht hat sowohl beim auslesen aus dem 3d als auch aus dem 2d funzt! aber entscheident ist ja nur das ich aus meiner skizze die benötigten punkte als 3d koordinaten bekomme - der rest erfolgt ja dann mit diesen koordinaten im 3d! Danke fürs Testen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dersummi Mitglied
Beiträge: 43 Registriert: 03.11.2006
|
erstellt am: 01. Dez. 2006 14:01 <-- editieren / zitieren --> Unities abgeben:
|
volks Mitglied
Beiträge: 2 Registriert: 09.12.2007
|
erstellt am: 10. Dez. 2007 17:37 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Hallo Leute, ich bin hier neu und wollte zu eurem Skript mal was fragen. Mal abgesehen davon, dass es super funktioniert. Aber wie müßte es angepasst werden um zu den Koordinaten der Punkte auch den jeweiligen Namen des Elements mit auszugeben? Vielleicht könnt ihr mir damit ja mal auf die Sprünge helfen. Danke, Grüße Volks. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Proofin Mitglied Dpl.Ing
Beiträge: 208 Registriert: 24.11.2004
|
erstellt am: 13. Dez. 2007 13:11 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Moin Volks, kannst du bitte mal dein Skript posten oder zu mindestens den Bereich der Ausgabe. Dann kann man dir besser helfen. Im Normalfall kommst du mit DeinObjekt.Name an den Namen des Objektes. Gruß Proofin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
volks Mitglied
Beiträge: 2 Registriert: 09.12.2007
|
erstellt am: 08. Jan. 2008 20:18 <-- editieren / zitieren --> Unities abgeben: Nur für dersummi
Hallo Proofin, sorry, dass ich mich erst jetzt melde aber ich war die letzte Zeit nicht im Land und konnte so nicht nachsehen, ob ich eine Antwort auf meine Frage bekommen habe. Also mir geht es darum, dass ich als Ausgabe nicht nur die Koordinaten wie folgt: "Punkt: (x1,y1,z1)" "Punkt: (x2,y2,z2)" ... "Punkt: (xi,yi,zi)" nacheinander in das .txt-file schreibe. Ich möchte gern ein GeoSet (z. B. "GeoSet.Befestigungspunkte") selektieren, dieses nach vorhandenen Punkten ("Pkt.vorne links", "Pkt.vorne rechts", usw.) durchsuchen und dann in das .txt-file den Namen des gewählten GeoSets, die gefundenen Punkte mit Objektnamen und dahinter die entsprechenden Koordinaten schreiben. Die Ausgabe könnte also wie folgt aussehen: "GeoSet.Befestigungspunkte: Pkt.vorne links: (100;50;-20) Pkt.vorne rechts: (-150;-50;20)" Ich hoffe, mein Problem wird nun deutlicher und du kannst mir dabei helfen. Bis dann und thanks, Volks. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |