| |
| Dassault PLM Integrationen mit der 3DViewStation, eine Pressemitteilung
|
Autor
|
Thema: Punkte finden und Abstände messen (6619 mal gelesen)
|
akrohn Mitglied
Beiträge: 28 Registriert: 06.09.2004 Catia V5 R 14 VBA
|
erstellt am: 28. Apr. 2005 10:57 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich versuche in einer Zusammenbaudatei alle Punkte eines bestimmten Namens zu finden. Das mache ich momentan mit der "Selection". Dann würde ich gerne die gefundenen Punkte in ein Array legen, damit ich immer direkt auf diese Punkte zugreifen kann. Wie geht das? Danach könnte ich von den einzelnen Punkten die Koordinaten auslesen über: punktx.GetCoordinates Dann könnte ich über den Vergleich der Koordinaten den Abstand errechnen. Hab Ihr Tipps wie ich das realisieren kann? vor allem das Ablegen der Objekte in ein Array? Danke, Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
em Michael Kirsch Mitglied Teamleiter Model-Based Design & Digital Enterprise
Beiträge: 222 Registriert: 21.10.2002 CATIA V5 R16 CATIA V5 R18 CATIA V5 R19 NX 5 NX 6 NX 7.5
|
erstellt am: 28. Apr. 2005 15:42 <-- editieren / zitieren --> Unities abgeben: Nur für akrohn
Hallo akron, ein Array kann nur "klassische" Variablen aufnehmen (String, Double, etc.) Für Objektvariablen gibt es in Visual Basic das Listenobjekt (Collection). In den reinen Skriptsprachen CATScript und CATvbs steht die Collection leider nicht zur Verfügung. Dim i As Long Dim MySelection As Selection Dim MyList As Collection Set MyList = New Collection For i = 1 To MySelection.Count MyList.Add MySelection.Item(i).Value Next ...und schon stehen die Punkte in der Liste. Hope that helps, Michael
------------------
www.em.ag
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
akrohn Mitglied
Beiträge: 28 Registriert: 06.09.2004 Catia V5 R 14 VBA
|
erstellt am: 29. Apr. 2005 10:24 <-- editieren / zitieren --> Unities abgeben:
Hallo! Danke für den Tip. Das klappt anscheinend auch, aber mit dem Messen habe ich noch so ´meine Probleme. Ich habe schon die anderen Posts durchgeschaut, bekomme die Beispiele von dort aber nicht zum Laufen. Ich benutze VBA und habe folgenden Code: Sub CATMain() Dim APListe As Selection Dim MyList As Collection Set MyList = New Collection Set myDocument = CATIA.ActiveDocument Set MySelection = myDocument.Selection MySelection.Clear MySelection.Search (".Punkt.Name=augenpunkt1;Alle") Number = MySelection.count For I = 1 To Number MyList.Add MySelection.Item(I) Next Dim TheSPAWorkbench As SPAWorkbench Dim TheMeasurable 'As Measurable Dim referenceObject(20) As Reference
Dim coords(2) As Variant Dim Reference As Reference Dim selectedElement As selectedElement Dim object For I = 1 To MySelection.count Set selectedElement = MySelection.Item(I) Set referenceObject(I) = selectedElement.Reference MySelection.EndSelectElement Next
For I = 1 To (MySelection.count - 1) Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench") Set TheMeasurable = TheSPAWorkbench.GetMeasurable(referenceObject(I)) MinDist = TheMeasurable.GetMinimumDistance(referenceObject(I + 1)) MsgBox MinDist Next End Sub
Leider bekomme ich immer den Abstand "0". Obwohl die Punkte nicht übereinander liegen. ACHTUNG: Es handelt sich hier um ein Product, in das Teile über schnellcopie mehrfach eingefügt wurden. Wer kann mir helfen?? Danke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
prosper Mitglied Dipl.-Ing. -- Methoden und Prozessentwicklung Catia V5
Beiträge: 86 Registriert: 05.05.2004
|
erstellt am: 29. Apr. 2005 18:48 <-- editieren / zitieren --> Unities abgeben: Nur für akrohn
Hallo akrohn, wenn ich richtig verstehe, hast du ein Product in dem ein Part mehr mals instanziiert ist. Die Parts sind im Raum verschoben (translate + rotate). Die GetCoordinnates function gibt dir die coordinates inerhalb vom Part, deswegen hasst du vielleicht immer ein Abstand von 0mm, und das ist auch richtig. Ich werde es so machen: - Punkten suchen - Coordinnates auslesen - PositionsMatrize vom Part inerhalb vom Product auslesen - Trafo berechnen, damit du die lokale coordinnates (Part Ebene) im globalen Product (Activedocument.product) rausfindest (coordinnates vom Punkt im RootProduct) - mit Wurzel(x^2 + y^2 +z^2) (oder sowas ) den Abstand zwischen deine Punkten berrechnen (SPA Workbench ist damit nicht notwendig, eine MD2 reicht...) - und dann hat sich die Sache schon! Kann dir gern ein Beispiel liefern falls du es nicht hinkriegst. Habe sowas ähnliches schon gemacht, ist schon anstrengt. Wenns aber in der WissensDatenBank steht, dann braucht man sich solche Gedanken (Trafo Local to Global) nicht mehr machen!!! viel Spass! Gruss Chris Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
akrohn Mitglied
Beiträge: 28 Registriert: 06.09.2004 Catia V5 R 14 VBA
|
erstellt am: 01. Mai. 2005 20:19 <-- editieren / zitieren --> Unities abgeben:
Hi Chris! So etwas habe ich mir schon fast gedacht. Du hast natürlich Recht mit Deiner Vermutung. Da ich noch Anfänger bin wäre es super, wenn Du mir Dein Beispiel geben könntest. Vielen Dank, Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
schotti Mitglied Student
Beiträge: 15 Registriert: 02.05.2005
|
erstellt am: 02. Mai. 2005 18:53 <-- editieren / zitieren --> Unities abgeben: Nur für akrohn
Hallo, ich habe ein ähnliches Problem. Ich will die Koordinaten eines Punktes in einem Product/Part auslesen. Dieses Part hat ein eignes Koordinatensystem mit einem Point im Koordinatenursprung. Struktur: Product |__Product |__Part |__Koordinatensystem_1 |__ ... Wenn ich die Koordinaten des gewünschten Punktes und des "Nullpunktes" (Part) auslese, bekomme ich die Koordinaten in Bezug auf das Koordinatensystem des Vater-Products. Gibt es eine Möglichkeit die Koordinaten zu Transformieren, so dass Koordinatensystem_1 als Referenz wirkt. Die Koordinaten bekomme ich über: Dim TheSPAWorkbench As SPAWorkbench Dim TheMeasurable 'As Measurable TheMeasurable.GetPoint(coord) ... Wenn ich mit der Funktion "Measure" in Space Anal. beide Punkte per Hand wähle, rechnet CATIA die richtigen Koordinaten aus. Oder nutze ich eine falsche Funktion? Für Tips bin ich sehr Dankbar ------------------ MfG schotti Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
prosper Mitglied Dipl.-Ing. -- Methoden und Prozessentwicklung Catia V5
Beiträge: 86 Registriert: 05.05.2004
|
erstellt am: 02. Mai. 2005 19:13 <-- editieren / zitieren --> Unities abgeben: Nur für akrohn
Hallo, vielleicht kann sowas weiterhelfen: Sub CATMain() Set osel = CATIA.ActiveDocument.Selection osel.Clear Dim afilter(0) afilter(0) = "Point" Status = osel.SelectElement(afilter, "Select a point.", False) Set opoint = osel.Item(1).Value osel.EndSelectElement Dim acoord_in_part(2) opoint.GetCoordinates acoord_in_part Dim acoord_part_in_product(11) Dim acoord_product_in_sub_product(11) Dim atmp(2) Dim acoord_in_product(2) osel.Clear osel.Add opoint Set opart_product = osel.FindObject("CATIAProduct") opart_product.Position.GetComponents acoord_part_in_product acoord_in_product(0) = acoord_part_in_product(0) * acoord_in_part(0) + acoord_part_in_product(3) * acoord_in_part(1) + acoord_part_in_product(6) * acoord_in_part(2) + acoord_part_in_product(9) acoord_in_product(1) = acoord_part_in_product(1) * acoord_in_part(0) + acoord_part_in_product(4) * acoord_in_part(1) + acoord_part_in_product(7) * acoord_in_part(2) + acoord_part_in_product(10) acoord_in_product(2) = acoord_part_in_product(2) * acoord_in_part(0) + acoord_part_in_product(5) * acoord_in_part(1) + acoord_part_in_product(8) * acoord_in_part(2) + acoord_part_in_product(11) Set oparent_product = opart_product.Move.Parent.Parent Do oparent_product.Position.GetComponents acoord_product_in_sub_product atmp(0) = acoord_in_product(0) atmp(1) = acoord_in_product(1) atmp(2) = acoord_in_product(2) acoord_in_product(0) = acoord_product_in_sub_product(0) * atmp(0) + acoord_product_in_sub_product(3) * atmp(1) + acoord_product_in_sub_product(6) * atmp(2) + acoord_product_in_sub_product(9) acoord_in_product(1) = acoord_product_in_sub_product(1) * atmp(0) + acoord_product_in_sub_product(4) * atmp(1) + acoord_product_in_sub_product(7) * atmp(2) + acoord_product_in_sub_product(10) acoord_in_product(2) = acoord_product_in_sub_product(2) * atmp(0) + acoord_product_in_sub_product(5) * atmp(1) + acoord_product_in_sub_product(8) * atmp(2) + acoord_product_in_sub_product(11) Set oparent_product = oparent_product.Move.Parent.Parent Loop Until CATIA.ActiveDocument.Product.Name = oparent_product.Name spart = "Local coordinates are:" & vbCrLf & vbCrLf & "X=" & acoord_in_part(0) & vbCrLf & "Y=" & acoord_in_part(1) & vbCrLf & "Z=" & acoord_in_part(2) & vbCrLf & vbCrLf sproduct = "Global coordinates are:" & vbCrLf & vbCrLf & "X=" & acoord_in_product(0) & vbCrLf & "Y=" & acoord_in_product(1) & vbCrLf & "Z=" & acoord_in_product(2) MsgBox spart & sproduct End Sub Gruss Chris
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
akrohn Mitglied
Beiträge: 28 Registriert: 06.09.2004 Catia V5 R 14 VBA
|
erstellt am: 04. Mai. 2005 10:41 <-- editieren / zitieren --> Unities abgeben:
Hi chris, das sieht sehr hilfreich aus, aber mein VBA akzeptiert den Befehl irgendwie nicht: (Object doesn't support this property or method) oparent_product.Position.GetComponents acoord_product_in_sub_product Hast Du eine Ahnung warum? Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
akrohn Mitglied
Beiträge: 28 Registriert: 06.09.2004 Catia V5 R 14 VBA
|
erstellt am: 04. Mai. 2005 12:19 <-- editieren / zitieren --> Unities abgeben:
Wenn ich in der Zeile vor dem Loop von oparent_... auf opart_... ändere funktioniert es, jedoch bekomme ich auch für die globale Position hier immer die gleichen Werte, egal welche Instanz ich ausgewählt habe. Die Instanzen liegen örtlich unterschiedlich im Produkt. Was mache ich falsch? Set oparent_product = opart_product.Move.Parent.Parent Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
schotti Mitglied Student
Beiträge: 15 Registriert: 02.05.2005
|
erstellt am: 07. Mai. 2005 16:55 <-- editieren / zitieren --> Unities abgeben: Nur für akrohn
Hi, danke an Chris für das Posting, es hat mich sehr viel weiter gebracht. Ich habe das Makro unter VBScript und unter VBA ausprobiert und es läuft ohne Änderungen. Warum du (Andreas) eine Fehlermeldung bekommst kann ich mir auch nicht erklären. ------------------ MfG schotti Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
akrohn Mitglied
Beiträge: 28 Registriert: 06.09.2004 Catia V5 R 14 VBA
|
erstellt am: 09. Mai. 2005 09:02 <-- editieren / zitieren --> Unities abgeben:
Hallo schotti und prosper! Könnt Ihr mir den Gefallen tun und das Skript von prosper noch einmal anhand meines Beispiels testen? Das Produkt beinhaltet drei Parts "Punkt" zwei sind direkt eingeladen und das rechte ist als Schnellkopie vom Mittleren erzeugt. Wenn ich jetzt "punkt.1" selektiere gibt mir das Skript immer die gleichen globalen Koordinaten an, egal aus welchem Part ich den Punkt gewählt habe. Könntet Ihr das noch einmal in VBA testen? Hier nochmal das Skript: Sub CATMain()
Set osel = CATIA.ActiveDocument.Selection osel.Clear Dim afilter(0) afilter(0) = "Point" Status = osel.SelectElement(afilter, "Select a point.", False) Set opoint = osel.Item(1).Value osel.EndSelectElement Dim acoord_in_part(2) opoint.GetCoordinates acoord_in_part Dim acoord_part_in_product(11) Dim acoord_product_in_sub_product(11) Dim atmp(2) Dim acoord_in_product(2) osel.Clear osel.Add opoint Set opart_product = osel.FindObject("CATIAProduct") opart_product.Position.GetComponents acoord_part_in_product acoord_in_product(0) = acoord_part_in_product(0) * acoord_in_part(0) + acoord_part_in_product(3) * acoord_in_part(1) + acoord_part_in_product(6) * acoord_in_part(2) + acoord_part_in_product(9) acoord_in_product(1) = acoord_part_in_product(1) * acoord_in_part(0) + acoord_part_in_product(4) * acoord_in_part(1) + acoord_part_in_product(7) * acoord_in_part(2) + acoord_part_in_product(10) acoord_in_product(2) = acoord_part_in_product(2) * acoord_in_part(0) + acoord_part_in_product(5) * acoord_in_part(1) + acoord_part_in_product(8) * acoord_in_part(2) + acoord_part_in_product(11) Set oparent_product = opart_product.Move.Parent.Parent Do oparent_product.Position.GetComponents acoord_product_in_sub_product atmp(0) = acoord_in_product(0) atmp(1) = acoord_in_product(1) atmp(2) = acoord_in_product(2) acoord_in_product(0) = acoord_product_in_sub_product(0) * atmp(0) + acoord_product_in_sub_product(3) * atmp(1) + acoord_product_in_sub_product(6) * atmp(2) + acoord_product_in_sub_product(9) acoord_in_product(1) = acoord_product_in_sub_product(1) * atmp(0) + acoord_product_in_sub_product(4) * atmp(1) + acoord_product_in_sub_product(7) * atmp(2) + acoord_product_in_sub_product(10) acoord_in_product(2) = acoord_product_in_sub_product(2) * atmp(0) + acoord_product_in_sub_product(5) * atmp(1) + acoord_product_in_sub_product(8) * atmp(2) + acoord_product_in_sub_product(11) Set oparent_product = oparent_product.Move.Parent.Parent Loop Until CATIA.ActiveDocument.Product.Name = oparent_product.Name spart = "Local coordinates are:" & vbCrLf & vbCrLf & "X=" & acoord_in_part(0) & vbCrLf & "Y=" & acoord_in_part(1) & vbCrLf & "Z=" & acoord_in_part(2) & vbCrLf & vbCrLf sproduct = "Global coordinates are:" & vbCrLf & vbCrLf & "X=" & acoord_in_product(0) & vbCrLf & "Y=" & acoord_in_product(1) & vbCrLf & "Z=" & acoord_in_product(2) MsgBox spart & sproduct End Sub Wie oben schon beschrieben musste ich bei mir eine Änderung machen, damit es überhaupt läuft. (Siehe Posts oben).
Vielen Dank Nochmal.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
prosper Mitglied Dipl.-Ing. -- Methoden und Prozessentwicklung Catia V5
Beiträge: 86 Registriert: 05.05.2004
|
erstellt am: 12. Mai. 2005 23:59 <-- editieren / zitieren --> Unities abgeben: Nur für akrohn
Hallo zusamen, ja gut, ich glaube es liegt daran: Das Makro funktionniert glaube ich nur wenn das Part in dem sich den Punkt befindet nicht direkt unter dem Root Produkt hängt sondern tiefer in der Struktur. Das muss man aber nur ein bischen umprogrammieren. soll ich das machen oder passt es so? Gruss
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
akrohn Mitglied
Beiträge: 28 Registriert: 06.09.2004 Catia V5 R 14 VBA
|
erstellt am: 13. Mai. 2005 10:40 <-- editieren / zitieren --> Unities abgeben:
Hallo Prosper! Ich habe schon bemerkt, dass die Schleife eine Ebene zu hoch geht, aber da ich absoluter Anfänger bin und mich gerade erst einarbeite bin ich trotzdem verloren ;-) Ich finde es unglaublich, dass Du Dich hier so nett anbietest das für mich zu lösen. Es wäre super, wenn das nicht zu viel Aufwand ist, dann lerne ich dabei bestimmt eine Menge. Vielen Dank, Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
akrohn Mitglied
Beiträge: 28 Registriert: 06.09.2004 Catia V5 R 14 VBA
|
erstellt am: 23. Mai. 2005 12:46 <-- editieren / zitieren --> Unities abgeben:
Hi Prosper! Ich habe im ersten schritte infach mal meine Datei soweit geändert, dass dein script ohne änderung läuft. Habe also das Produkt tiefer in die struktur gelegt. Leider bekomme ich aber bei zwei verschiedenen Instanzen meines Parts immer die gleichen werte (lokal und global). Es wird also egal wie weit ich die instanzen im Raum verschiebe global der gleiche wert angegeben. Somit ist das Ergebnis falsch. Warum ist das so? Gruß, Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |