| |
 | CATIA V5 Grundkurs | Einsteiger - 5 Std. 15 Min 48 |
| |
 | KISTERS 3DViewStation: Unterstützung für 3D CAD Kollaboration mit Lieferanten, eine Pressemitteilung
|
Autor
|
Thema: Normalenvektoren (2907 mal gelesen)
|
tgeier Mitglied

 Beiträge: 20 Registriert: 14.03.2006
|
erstellt am: 29. Nov. 2006 14:54 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen, weiss nicht so recht ob ich in dieser rubrik richtig bin, oder ob meine frage vielleicht eher unter flächen o.ä. gehört. und zwar habe ich ein Problem bzgl dem Rausfinden von Normalenvektoren bei Körpern allgemein. Es sollte irgendwie möglich sein, die Normalenvektoren von Körpern aus dem Code rauszufinden (mit VB) also über die Makros.? Da ich jedoch absoluter Neuling bzgl programmieren bin, weiss ich nicht so recht wo ich danach suchen soll. Weiss jemand wie ich die Normalenvektoren zu einem beliebigen Körper/Fläche rausfinden kann? Oder wo ich im Code suchen muss? Vielen Dank im Vorraus
Gruß Tobi [Diese Nachricht wurde von tgeier am 29. Nov. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlausJ Mitglied
   
 Beiträge: 1336 Registriert: 17.03.2003 CATIA V4.2.4 Ref 2 CATIA V5R16SP7 AIX 5.3 Windows 2000 und XP
|
erstellt am: 29. Nov. 2006 15:27 <-- editieren / zitieren --> Unities abgeben:          Nur für tgeier
Hallo Tobi, ich bin kein Programmierer, aber Deine Frage ist falsch gestellt. Mathematisch ist es nur möglich, einen Normalenvektor zu einer Ebene zu ermitteln. Hast Du eine beliebige Fläche, gilt das nur für einen Punkt auf dieser. Für einen Körper gibt es per Definitionem keine Normale, sondern nur für einzelne Begrenzungsflächen. ------------------ Nichts ändern ist langweilig !! Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tgeier Mitglied

 Beiträge: 20 Registriert: 14.03.2006
|
erstellt am: 29. Nov. 2006 15:49 <-- editieren / zitieren --> Unities abgeben:         
Hallo Klaus, das ist mir auch klar, dass es keine Normale auf einen Körper gibt. Ich meine natürlich die Normalenvektoren von Flächen eines beliebigen Körpers. Gibt es irgend eine Möglichkeit diese Vektoren rauszufinden? Wo könnten ich sie finden? [Diese Nachricht wurde von tgeier am 29. Nov. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlausJ Mitglied
   
 Beiträge: 1336 Registriert: 17.03.2003 CATIA V4.2.4 Ref 2 CATIA V5R16SP7 AIX 5.3 Windows 2000 und XP
|
erstellt am: 29. Nov. 2006 17:43 <-- editieren / zitieren --> Unities abgeben:          Nur für tgeier
Ich bin auch kein Programmierer, aber grundsätzlich mußt Du die Flächen aus dem Körper extrahieren und dann eine Loop über die Flächen laufen lassen. Ich glaube nicht, daß es für einen geübten "CATScript" Programmierer ein großes Problem ist, solange die Flächen eben sind. ------------------ Nichts ändern ist langweilig !! Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tgeier Mitglied

 Beiträge: 20 Registriert: 14.03.2006
|
erstellt am: 30. Nov. 2006 11:39 <-- editieren / zitieren --> Unities abgeben:         
zunächst mal vielen Dank für deine Mühe. --> 10 Unities. das mit dem Loop werd ich auch mal versuchen, ob ich da irgendwas rausbekomme. aber vielleicht sollte ich meine frage etwas anders stellen:
nehmen wir mal an ich habe eine beliebige Fläche generiert. Nun möchte ich zu dieser Fläche den/die Normalenvektor/en rausfinden. Ist es irgendwie möglich sich diese ausgeben zu lassen? oder wo könnte man die finden? müssen doch irgendwo im code versteckt sein. Hoffe mir kann hier jemand helfen, denn ich denke auch dass es für einen der sich mit programmierung auskennt recht einfach sein könnte.
Vielen Dank im Vorraus
Gruß Tobi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
  
 Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 30. Nov. 2006 11:47 <-- editieren / zitieren --> Unities abgeben:          Nur für tgeier
Hallo, du musst die Flächen nicht extrahieren. Wenn du dein Volumen in eine Selection schiebst und ein Search (Topology.CGMFace) durchführst, erhälst du über das jeweilige Selection.Item(n).Reference einen Verweis zu allen Teilflächen der Oberfläche deines Volumens (also der BReps). Über den Namen des Verweises (Reference.Name) kannst du dir mit .CreateReferenceFromName eine "richtige" Referenz erzeugen, welche die Grundlage einer Messung bildet: ...Measureable.getPlane gibt dir ein array zurück, welches u.a. die Vektoren der Flächennormalen enthält, sofern die Fläche planar ist. Gruss TomTom
------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
  
 Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 30. Nov. 2006 11:56 <-- editieren / zitieren --> Unities abgeben:          Nur für tgeier
Hallo, jetzt warst du mit deinem Beitrag schneller als ich. Das funktioniert wie gesagt über eine Messung. Wobei ich zu "beliebig" auch nicht planare Flächen zähle, und diese haben keinen (eindeutigen) Normalenvektor, sonder beliebig (unendlich) viele. Du musst also noch defineren, welcher Normalenvektor (in welchem Punkt der Fläche) für dich von Interesse ist (z.B. im Schwerpunkt), wobei dieser Vektor dann keinen Rückschluss auf die gesammte Fläche zulässt, sondern nur auf ihre Stetigkeit in dem Punkt, in welchem der Normalenvektor die Fläche durchstösst (weil der Schwerpunkt einer gewölbten Fläche selten auf der Fläche sebst zu finden ist.) Hilft dir das irgendwie weiter? Gruss TomTom ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tgeier Mitglied

 Beiträge: 20 Registriert: 14.03.2006
|
erstellt am: 30. Nov. 2006 12:45 <-- editieren / zitieren --> Unities abgeben:         
Hallo TomTom, ich glaube das ist genau das was ich gesucht habe. werde das mal ausprobieren. wenn ich nun also eine beliebige fläche habe, und diese mehrere teilflächen, also mehrere Normalenvektoren, wie definiere ich dann die einzelnen punkte die ich betrachten will, bzw alle punkte, also alle Normalenvektoren dieser flächen? P.S. auch für dich 10 Unities !!
[Diese Nachricht wurde von tgeier am 30. Nov. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
  
 Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 30. Nov. 2006 13:59 <-- editieren / zitieren --> Unities abgeben:          Nur für tgeier
Hallo, die Frage geht schon wieder vom falschen Ansatz aus (oder ich verstehe dich einfach nicht richtig): Die Teilfläche einer Fläche ist noch lange keine planare Fläche, die durch eine Normale beschrieben werden könnte. Ein Extrem-Beispiel: Die Oberfläche einer Kugel ist eine einzige in sich geschlossene Fläche (die keine Teilflächen mehr enthält). Jede "Normale" durch jeden Punkt auf der Oberfläche der Kugel wird durch andere (unterschiedliche) Vektoren beschrieben. Du kannst unendlich viele unterschiedliche Punkte auf die Oberfläche der Kugel legen und bekommst unendlich viele unterschiedliche "Normalen". Unendlich ist nun halt ein bischen viel. Also musst du diskretisieren. Und damit stellt sich die Frage: wie genau soll die Beschreibung deiner Fläche (ich bleibe mal bei meiner Kugel) werden? Man kann z.B. die Oberfläche der Kugel in Dreicke aufteilen. Das nennt man Triangulisierung. Je nach Größe der Kantenlänge der Dreiecke wird die Kugel mehr oder weniger genau beschrieben. Kleine Kantenlängen = viele Dreiecke = genaue Beschreibung der Oberfläche. Die Dreicke selbst können nun mathematisch ganz einfach beschreiben werden. Das gleiche gilt für ihre Lage und Aussrichtung im Raum. Bei einer Kugel ist das natürlich Blödsinn, da deren Oberfläche mathematisch einfacher zu Beschreiben ist als die ganzen Dreiecke. Bei komplexen Geometrien ist das allerdings anders. Die Darstellung von CGR-Files beruht auf Triangulisierung (wenn du den cgr mit der Maus anwählst, sieht man die Dreiecke). Die Frage ist also immer noch: was genau hast du vor? Gruss TomTom ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlausJ Mitglied
   
 Beiträge: 1336 Registriert: 17.03.2003 CATIA V4.2.4 Ref 2 CATIA V5R16SP7 AIX 5.3 Windows 2000 und XP
|
erstellt am: 30. Nov. 2006 15:22 <-- editieren / zitieren --> Unities abgeben:          Nur für tgeier
|
tomtom1972 Mitglied dipl ing maschinenbau
  
 Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 30. Nov. 2006 15:26 <-- editieren / zitieren --> Unities abgeben:          Nur für tgeier
Hallo, so könnte man es auch direkt formulieren. Wobei es - wenn wir jetzt schon bei Definitionen sind - auch noch einen Unterschied zwischen einer planaren Fläche und einer Ebene gibt. Gruss TomTom ------------------ tomtom1972 [Diese Nachricht wurde von tomtom1972 am 30. Nov. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tgeier Mitglied

 Beiträge: 20 Registriert: 14.03.2006
|
erstellt am: 30. Nov. 2006 23:21 <-- editieren / zitieren --> Unities abgeben:         
Hallo, also mir ist das schon klar das z.B. eine Kugel mit 'unendlich' vielen Normalenvektoren beschrieben werden kann. Was ich lediglich suche sind die Normalenvektoren. Wo ich diese also im Code rauslesen kann, bzw ob ich mir die irgendwie ausgeben lassen kann. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
  
 Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 02. Dez. 2006 15:35 <-- editieren / zitieren --> Unities abgeben:          Nur für tgeier
Hallo, also noch mal: die Normale durch den Schwerpunkt einer planaren Fläche (d.h. einer Fläche, die keiner Krümmung aufweisst) kannst du wie vorher beschieben mit Hilfe des .Measurable.GetPlane auslesen (da sie eindeutig ist !!!) ohne irgendwie neue Geometrie zu erzeugen. Das funktioniert manuell genauso, indem du mit dem "Messschieber" auf die Fläche klickst. Wenn du eine gekrümmte Fläche hast, geht das nicht. Da gibst nämlich keinen eindeutigen Normalenvektor. Dann musst du 1.) einen (oder wegen mir mehrere) Punkte auf der gekrümmten Fläche erzeugen; am einfachsten du erzeugst den Schwerpunkt, auch wenn der nicht auf der Fläche liegt 2.) dann erzeugst du eine Normale (durch den Punkt) zur Fläche 3.) dann liest du die Normale aus 4.) dann hast du das, was du scheinbar sucht. Nur wie gesagt lässt die Normale noch lange keinen Rückschluss auf die Fläche selbst zu. Die Normlenvektoren sind auf jeden Fall nirgenswo in der Fläche (oder sonstwo) hinterlegt, so das du diese finden bzw. auslesen könntest. Wie soll den das auch gehen? Wenn dir klar ist, das es bzg. auf eine gekrümmte Fläche unendlich viele Normalenvektoren gibt müsste dir doch eigentlich auch klar sein, das die nicht irgenwo "gespeichert" sein können? Wie sollen irgendwo unendlich viele Vektoren gespeichert sein, sodass du dir diese ausgeben lassen kannst? Es gibt jetzt zwar Windows VISTA mit 64 bit Achitektur, aber selbst das dürfte nicht genügen ... Mir ist immer noch nicht klar, was du eigentlich vor hast. Und solange du das für dich behältst wird dir wohl auch keiner bei der Suche nach deinen Normalenvektoren helfen können. Trotzdem weiterhin viel Erfolg Gruss TomTom ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
takushi Mitglied Entwicklungsingenieur

 Beiträge: 66 Registriert: 11.07.2003
|
erstellt am: 04. Dez. 2006 08:52 <-- editieren / zitieren --> Unities abgeben:          Nur für tgeier
Hallo, ich glaube mit dem Normalenvektor ist bei genanntem Problem eher die Orientierung der Fläche gemeint, das heisst, auf welcher Seite der Flächen die Normalenvektoren per (User)-Definition positiv angezogen werden sollen. Und diese Orientierung, denke ich auch, müsste doch irgendwo auslesbar sein. Ich könnte mir vorstellen, der Zweck ist dabei in einer automatisierten Vereinheitlichung der Normalenvektor-Ausrichtung einer Menge von Flächen zu suchen, um hinterher ein Volumen/Join bilden zu können. Schöne Grüsse takushi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
  
 Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 04. Dez. 2006 09:02 <-- editieren / zitieren --> Unities abgeben:          Nur für tgeier
|
tgeier Mitglied

 Beiträge: 20 Registriert: 14.03.2006
|
erstellt am: 05. Dez. 2006 15:40 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen,
Zitat: Original erstellt von tomtom1972:
Wenn du dein Volumen in eine Selection schiebst und ein Search (Topology.CGMFace) durchführst, erhälst du über das jeweilige Selection.Item(n).Reference einen Verweis zu allen Teilflächen der Oberfläche deines Volumens (also der BReps). Über den Namen des Verweises (Reference.Name) kannst du dir mit .CreateReferenceFromName eine "richtige" Referenz erzeugen, welche die Grundlage einer Messung bildet: ...Measureable.getPlane gibt dir ein array zurück, welches u.a. die Vektoren der Flächennormalen enthält, sofern die Fläche planar ist.
also das hier ist glaube ich ziemlich genau das was ich gesucht habe. komme allerdings nicht so richtig klar mit der Ausführung, da ich noch recht wenig Erfahrung habe mit Programmierung. Vielleicht könntest du mir noch etwas genauer erklären wie ich das hin bekomme. Bei mir funktioniert das irgendwie nicht so recht. Was meinst du z.B. mit: " Wenn du dein Volumen in eine Selection schiebst und ein Search (Topology.CGMFace) durchführst, erhälst du über das jeweilige Selection.Item(n).Reference einen Verweis zu allen Teilflächen der Oberfläche deines Volumens (also der BReps). ? Wie soll ich das genau machen? Bin etwas überfordert mit den Anweisungen. Nehmen wir mal an ich möchte mir den Normalenvektor durch einen beliebigen Punkt auf einer planaren Fläche ausgeben lassen (müssten ja alle die selbe richtung haben, daher reicht einer).
Wie würde ich das schreiben?
[Diese Nachricht wurde von tgeier am 05. Dez. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Augustiner Mitglied Konstrukteur
 
 Beiträge: 188 Registriert: 02.12.2005 HP Workstation Windows XP Professional Visual Studio 2005 Professional CATIA V5 R14SP5 & R17SP3
|
erstellt am: 05. Dez. 2006 16:29 <-- editieren / zitieren --> Unities abgeben:          Nur für tgeier
|
tomtom1972 Mitglied dipl ing maschinenbau
  
 Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 06. Dez. 2006 09:40 <-- editieren / zitieren --> Unities abgeben:          Nur für tgeier
Hallo tobi, öffne ein Part und erzeuge ein pad. Einfach einen Würfel. Sonst nix. Der Würfel hat 6 Flächen. Die lesen wir jetzt mal aus. Dazu das Volumen selektieren und das Script starten. Die MsgBoxes geben dir folgendes aus: 1) Namen des BReps (also der Teilfläche) 2) Ursprungskoordinate des Vektors (ist hier irgend ein Eckpunkt der Teilfläche 3) Der Vektor (die Normale zu der Fläche) selbst = first direction 4) Ein zweiter Vektor, der in diesem Fall die Rotation der Fläche um den Normalenvektor angibt = second direction Im Script ist kein Err.Handling eingebaut, d.h. a) Vor Scriptstart Vol selektieren b) nur planare Flächen vorhanden Hoffe das veranschaulicht die grundsätzliche Vorgehensweise. Gruss TomTom Sub CATMain() Set oDoc = Catia.ActiveDocument Set oProd = oDoc.Product Set oSelection = oDoc.Selection Set TheSPAWorkbench = oDoc.GetWorkbench("SPAWorkbench") oSelection.Search ("Topology.CGMFace,sel") Dim aPlane() ReDim aPlane(8) MsgBox oSelection.Count, 64, "No of BReps" For i = 1 To oSelection.Count Set oRef = oSelection.Item(i).Reference Set oReference = oProd.CreateReferenceFromName(oProd.PartNumber & "/!" & oRef.Name) Set TheMeasurable = TheSPAWorkbench.GetMeasurable(oReference) TheMeasurable.GetPlane aPlane MsgBox oReference.DisplayName, 64, "Name of the " & i & ". Reference / Brep" MsgBox "X: " & aPlane(0) & vbLf & "Y: " & aPlane(1) & vbLf & "Z: " & aPlane(2), 64, "Coordinates of the " & i & ". origin" MsgBox "X-Dir: " & aPlane(3) & vbLf & "Y-Dir: " & aPlane(4) & vbLf & "Z-Dir: " & aPlane(5), 64, "Vector of the first direction of the " & i & ". plane" MsgBox "X-Dir: " & aPlane(6) & vbLf & "Y-Dir: " & aPlane(7) & vbLf & "Z-Dir: " & aPlane(8), 64, "Vector of the second direction of the " & i & ". plane" Next End Sub ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tgeier Mitglied

 Beiträge: 20 Registriert: 14.03.2006
|
erstellt am: 06. Dez. 2006 13:42 <-- editieren / zitieren --> Unities abgeben:         
Wow, Super !!! Vielen Dank TomTom. Funktioniert super! Nun hab ich jedoch noch eine kleine Erweiterung. Die Vektoren ausgeben lassen ist echt klasse. Wäre es jedoch weiterhin möglich diese Vektoren in einer Funktion zu speichern? oder alle auf zu addieren und ein 'Gesamtvektor' auszugeben?
Ist das irgendwie möglich? Hätte da jemand eine Idee? Bin wie gesagt leider noch nicht so eingearbeitet in die Programmierung 
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
  
 Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 06. Dez. 2006 14:43 <-- editieren / zitieren --> Unities abgeben:          Nur für tgeier
Hallo, Da stellt sich mir dann wieder zuerst die Frage, was du eigentlich vor hast? Die ausgelesen Vektoranteile sind die Richtungsbeschreibung eines Vektors, deren Wert immer zwischen -1 und 1 liegt, der Vektor sebst hat immer die Länge 1. Die Richtungsanteile zu Addieren ist eine Kleinigkeit. Nochmal zur Erklärung: Mit TheMeasurable.GetPlane aPlane wird eine Flaeche/Plane ausgemessen, indem ein Array (Feld) mit der entsprechenden Info befüllt wird. Das Array besthet aus: aPlane(0) = X Coordinate of the origin aPlane(1) = Y Coordinate of the origin aPlane(2) = Z Coordinate of the origin aPlane(3) = X-Value of the Vector of the first direction of the plane aPlane(4) = Y-Value of the Vector of the first direction of the plane aPlane(5) = Z-Value of the Vector of the first direction of the plane aPlane(6) = X-Value of the Vector of the second direction of the plane aPlane(7) = Y-Value of the Vector of the second direction of the plane aPlane(8) = Z-Value of the Vector of the second direction of the plane Die Werte, die dich interessieren (die den Normalenvektor beschreiben) sind wie bereits gesagt aPlane(3), aPlane(4), aPlane(5) Also dann jetzt so (ohne die ganzen MsgBoxes): Sub CATMain() Set oDoc = Catia.ActiveDocument Set oProd = oDoc.Product Set oSelection = oDoc.Selection Set TheSPAWorkbench = oDoc.GetWorkbench("SPAWorkbench") oSelection.Search ("Topology.CGMFace,sel") Dim aPlane() ReDim aPlane(8) Dim aGesNormale ReDim aGesNormale(2) For i = 1 To oSelection.Count Set oRef = oSelection.Item(i).Reference Set oReference = oProd.CreateReferenceFromName(oProd.PartNumber & "/!" & oRef.Name) Set TheMeasurable = TheSPAWorkbench.GetMeasurable(oReference) TheMeasurable.GetPlane aPlane For j = 0 to UBound(aGesNormale) aGesNormale(j) = aGesNormale(j) + aPlane(j+3) Next Next MsgBox "X-Dir: " & aGesNormale(0) & vbLf & "Y-Dir: " & aGesNormale(1) & vbLf & "Z-Dir: " & aGesNormale(2), 64, "The Result Vector" End Sub Gruss TomTom ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tgeier Mitglied

 Beiträge: 20 Registriert: 14.03.2006
|
erstellt am: 06. Dez. 2006 16:14 <-- editieren / zitieren --> Unities abgeben:         
Zitat: Original erstellt von tomtom1972:
öffne ein Part und erzeuge ein pad. Einfach einen Würfel. Sonst nix. Der Würfel hat 6 Flächen. Die lesen wir jetzt mal aus. Dazu das Volumen selektieren und das Script starten. Die MsgBoxes geben dir folgendes aus: 1) Namen des BReps (also der Teilfläche) 2) Ursprungskoordinate des Vektors (ist hier irgend ein Eckpunkt der Teilfläche 3) Der Vektor (die Normale zu der Fläche) selbst = first direction 4) Ein zweiter Vektor, der in diesem Fall die Rotation der Fläche um den Normalenvektor angibt = second direction
nochmal kurz zu dem vorigen Beitrag: also die Message Box gibt mir zu jeder Fläche nun 2 Vektoren aus. Diese sind meiner Meinung nach jedoch die Richtungsvektoren. Diese muss man also noch mit Hilfe des Kreuzproduktes multiplizieren und dann hat man die Normalenvektoren. Wenn ich nun diese 6 (im Fall des Würfels) Normalenvektoren habe, und diese aufaddieren mittels Vektoraddition, müssten diese Vetoren sich doch quasi aufheben und die Summe zu Null werden.
Das war so mein Gedanke, darauf wollte ich hinaus. Nun fehlt mir also nur noch das Vektorprodukt und die Summation am Ende. Gibt es einen Befehl für das Kreuzprodukt? oder muss ich mir diesen selbst zusammen basteln?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
  
 Beiträge: 608 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 07. Dez. 2006 08:31 <-- editieren / zitieren --> Unities abgeben:          Nur für tgeier
Hallo, Du hast recht mit deiner Vermutung. Den Normalenvektor muss man erst noch ausrechnen (das Kreuzprodukt). Das zu Berechnen ist einfach ein bischen Mathe. Dafür gibts keine eigene Funktion. Siehe unten (Script). Das Script erzeugt zur Veranschaulichung mal die Vektoren (als Linien). Siehe auch Screenshot im Anhang. Allerdings ist die Schleife nicht mehr drin. Wird also nur für die erste Fläche durchgeführt. Mit einer Fläche wirds auch anschaulicher wie bei einem Würfel. Part auf und eine planare Fläche erzeugen (am besten nicht rechteckig) die im Raum gekippt ist. Fläche auswählen, Script starten. Gruss TomTom Sub CATMain()
Set oDoc = Catia.ActiveDocument Set oProd = oDoc.Product Set oSelection = oDoc.Selection oSelection.Search ("Topology.CGMFace,sel") Set TheSPAWorkbench = oDoc.GetWorkbench("SPAWorkbench") Set oHBs = oDoc.Part.HybridBodies Set oHSF = oDoc.Part.HybridShapeFactory Set oHB = oHBs.Add() Dim aPlane() ReDim aPlane(8) Set oRef = oSelection.Item(1).Reference Set oReference = oProd.CreateReferenceFromName(oProd.PartNumber & "/!" & oRef.Name) Set TheMeasurable = TheSPAWorkbench.GetMeasurable(oReference) TheMeasurable.GetPlane aPlane 'create Origin Dim oPoint FUNC_CreatePt oDoc, oHSF, oHB, oPoint, aPlane(0), aPlane(1), aPlane(2) oPoint.Name = "Origin" Set oRefPoint = oDoc.Part.CreateReferenceFromObject(oPoint) 'create first Direction Dim oLine1 FUNC_CreateLinePtDir oDoc, oHSF, oHB, oLine1, oPoint, aPlane(3), aPlane(4), aPlane(5) oLine1.Name = "First_Direction" 'create second Direction Dim oLine2 FUNC_CreateLinePtDir oDoc, oHSF, oHB, oLine2, oPoint, aPlane(6), aPlane(7), aPlane(8) oLine2.Name = "Second_Direction" 'crossproduct Dim aKreuzProd ReDim aKreuzProd(2) aKreuzProd(0) = aPlane(4)*aPlane(8) - aPlane(5)*aPlane(7) aKreuzProd(1) = aPlane(5)*aPlane(6) - aPlane(3)*aPlane(8) aKreuzProd(2) = aPlane(3)*aPlane(7) - aPlane(4)*aPlane(6) 'create crossproduct/Normalvector Dim oNorm FUNC_CreateLinePtDir oDoc, oHSF, oHB, oNorm, oPoint, aKreuzProd(0),aKreuzProd(1),aKreuzProd(2) oNorm.Name = "Normal_Vector" End Sub Function FUNC_CreatePt(oDoc, oHSF, oHB, oPoint, iCord1, iCor2, iCord3) Set oPoint = oHSF.AddNewPointCoord(iCord1, iCord2, iCord3) oHB.AppendHybridShape oPoint oDoc.Part.InWorkObject = oPoint oDoc.Part.Update End Function Function FUNC_CreateLinePtDir(oDoc, oHSF, oHB, oLine, oPoint, iDir1, iDir2, iDir3) Set oDir = oHSF.AddNewDirectionByCoord(iDir1, iDir2, iDir3) Set oLine = oHSF.AddNewLinePtDir(oPoint, oDir, 0.000000, 20.000000, False) oHB.AppendHybridShape oLine oDoc.Part.InWorkObject = oLine oDoc.Part.Update End Function ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tgeier Mitglied

 Beiträge: 20 Registriert: 14.03.2006
|
erstellt am: 07. Dez. 2006 10:20 <-- editieren / zitieren --> Unities abgeben:         
hab auch selbst schon angefangen zu probieren das kreuzprodukt zu berechnen, geht bei mir leider nicht ganz so flott. aber werd mal noch ein wenig weiter probieren und auch dein skript mal testen Nochmals Vielen Dank für deine Mühen.
Muss jetzt selbst mal ein wenig rumprobieren. Gruß Tobi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tgeier Mitglied

 Beiträge: 20 Registriert: 14.03.2006
|
erstellt am: 13. Dez. 2006 17:24 <-- editieren / zitieren --> Unities abgeben:         
Hallo, hab mir nun den code soweit zusammen gebastelt aus TomTom's Vorlagen, dass ich mir die Summe der Normalen ausgeben lasse, welche bei einem Würfel z.B. '0' sein müsste. Bei mir kommt jedoch nicht '0' raus, sondern als gesamtnormalenvektor kommt (0,0,2) für den Würfel. Und zwar ist das Problem, dass 2 meiner Normalenvektoren in die gleiche Richtung zeigen, was laut Definition so nicht sein sollte. Also die Idee von 'takushi' war gar nicht so schlecht. Weiss jemand wie die Ausrichtung der Normalen hier definiert ist? bzw. wie man sich diese ausgeben lassen könnte oder wo die berechnet wird?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tgeier Mitglied

 Beiträge: 20 Registriert: 14.03.2006
|
erstellt am: 05. Jan. 2007 16:52 <-- editieren / zitieren --> Unities abgeben:         
Hallo, also das mit dem Auslesen und Berechnen der Normalenvektoren funktioniert jetzt soweit. Allerdings gibt's dabei noch ein kleines Problem. Und zwar bekomm ich für z.B. einen Würfel, bei dem die Vektoraddition aller Flächennormalen auf das Ergebnis '0' führen müsste nicht Null heraus, sondern meistens sowas wie (0 2 0) oder (2 0 0) als Vektor. Könnte das evtl mit der Orientierung der Flächen zusammenhängen? Denn von den Normalenvektoren die bei der Berechnung herauskommen zeigen immer 2 in die gleiche Richtung und heben sich somit nicht gegenseitig auf, sondern addieren sich zu '2'. Oder könnte es mit der Reihenfolge der Wahl der Richtungsvektoren einer Ebene zusammenhängen? (denn a x b = - b x a) Kennt vielleicht jemand die Kriterien bzw. Regeln nach denen das Programm bei der Auswahl der Flächen oder Richtungsvektoren vorgeht? Evtl liegt das Problem auch beim Auslesen der Flächen.? Weiss jemand wie deren Ursprung festgelegt wird? oder wird einfach willkürlich ein Eckpunkt(im Falle des Würfel) gewählt? Denn die Wahl des Eckpunktes spielt auch eine Rolle bei der Berechnung der Normalen. Vielleicht hat das etwas damit zu tun?
Ausserdem habe ich noch beim Stöbern den Befehl 'GetPlaneNormal' gefunden. Könnte es damit vielleicht fumtionieren oder gibt es einen anderen Befehl der die Normalen ausliest? Wäre froh um jede Hilfe. Komm irgendwie nicht so recht weiter. Vielen Dank im Vorraus
Gruß Tobi
[Diese Nachricht wurde von tgeier am 10. Jan. 2007 editiert.] [Diese Nachricht wurde von tgeier am 10. Jan. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tgeier Mitglied

 Beiträge: 20 Registriert: 14.03.2006
|
erstellt am: 07. Feb. 2007 14:40 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen, ist es möglich (mit Hilfe eines Makro) herauszufinden in welcher Ebene die Skizze erstellt wurde? Denn genau die beiden Normalenvektoren in dieser und der (wegen Block) dazu parallelen Ebene zeigen immer in die gleiche Richtung. wenn man rausfinden könnte in welcher Ebene der Block erstellt wurde, könnte man das dann so hintüfteln, dass man einen der beiden Vektoren dreht un dsomit zum richtigen Ergebnis kommt, hoffe ich. Hoffe das mir damit jemand behilflich sein kann. Gruß Tobi
[Diese Nachricht wurde von tgeier am 07. Feb. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |