| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX |
Autor
|
Thema: [VB.Net Journal] Stage / Boundingbox (2640 mal gelesen)
|
met Mitglied CAD-Admin / Konstrukteur
Beiträge: 142 Registriert: 23.07.2004
|
erstellt am: 11. Mrz. 2009 07:47 <-- editieren / zitieren --> Unities abgeben:
Hallo, hat jemand ne Ahnung, wie man die Position des Umgebungswürfels (Dispaly.Stage) so verändern kann, dass die Mitter der Buttom-Seite genau bei 0,0,10 liegt? Ich habe bisher geschafft die einzelnen Wände (Display.Wall) zu verändern und die Stage auszurichten, aber die Bottom-Fläche wird immer auf die Fläche der Boundingbox gesetzt. Kann man die Boundingbox eines Parts (mit Bodies und Komponenten) auslesen? dann könnte ich die Stage über Offset verschieben. Code:
'Umgebungswürfel Dim Umgebung As Display.Stage = displayPart.Views.CreateStage(Ansicht, True) Umgebung = displayPart.Views.CreateStage(Ansicht, True) Dim Wand As Display.Wall = Nothing For WandTyp As Display.Stage.WallType = 0 To 5 theSession.ListingWindow.WriteLine(WandTyp.ToString) Wand = displayPart.Views.CreateWall(Ansicht, WandTyp) If WandTyp = Display.Stage.WallType.Bottom Then Dim Bild As Display.Image = displayPart.Views.CreateImage(Ansicht) Wand.Image = Bild Wand.ImageFilename = "K:\NX-MAKROS\white.tif" If Bild.Validate Then Bild.Commit() Wand.WallMaterialType = Display.Wall.MaterialType.ShadowCatcher Else Wand.WallMaterialType = Display.Wall.MaterialType.Invisible End If theSession.ListingWindow.WriteLine(Wand.Validate) Try If Wand.Validate Then Wand.Commit() Catch ex As Exception theSession.ListingWindow.WriteLine(ex.ToString) End Try Umgebung.SetWallInList(WandTyp, Wand) Next Umgebung.Size = 1000 Umgebung.AlignFloorPlane(displayPart.Planes.CreatePlane(New Point3d(0, 0, 0), New Vector3d(0, 0, 1), SmartObject.UpdateOption.WithinModeling)) 'Umgebung.Offset = Umgebung.Size / 2 'Größter Wert unter 0 in Z Umgebung.CommitOffset(Ansicht) If Umgebung.Validate Then Umgebung.Commit()
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Siassei Mitglied MB - Student
Beiträge: 490 Registriert: 08.07.2007 SWX NX 3 und höher ;) Windows and UNIX<P>C, C++, Java, Phyton,...</P>
|
erstellt am: 11. Mrz. 2009 21:16 <-- editieren / zitieren --> Unities abgeben: Nur für met
Servus, irgendwie werde ich aus deiner Beschreibung nicht ganz schlau. - Die Box auf die Position 10,0,0 verschieben: Leider konnte ich das Problem auch nicht mit der NXOpen-API lösen. Es gäbe auch noch die alte C-API (UF), vielleicht geht es da? Leider fehlt mir die Zeit um sie zu durchsuchen Als alternative könnte ich dir den manuellen Weg nahe legen. Linke Maustaste auf eine Ecke der Box und die Größe notieren -> Linke Maus auf den Ursprungpunkt des dyn. WCS (liegt genau in der Mitte) -> Werte umrechnen Edit: Im Aufzeichnungsmodus des Journals erhält der Befehl keine Unterstützungsmakierung, folglich wird es höchstwahrscheinlich auch nicht von der NXOpen-API unterstützt. - BoundingBox aller Komponenten auslesen: Auch hier kenne ich auf die schnelle keine Methode hierfür. Jedoch könntest du den Platzbedarf selbst berechenen, in dem du dir alle Eckpunkte oder Kanten ausgeben lässt und einen Würfel berechnest. Eine BG durchläufst du mittels der AssemblyCollection Gruß, Thomas ------------------ Hopfen und Mals Gott erhalts Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life. [Diese Nachricht wurde von Siassei am 11. Mrz. 2009 editiert.] [Diese Nachricht wurde von Siassei am 11. Mrz. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
met Mitglied CAD-Admin / Konstrukteur
Beiträge: 142 Registriert: 23.07.2004
|
erstellt am: 17. Mrz. 2009 10:46 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe folgende Funktion gebastelt, doch manchmal schlägt die Funktion AskVisibleObjects fehl. Hat jemand diese schon nachgebaut und verbessert? Gruß, met Code: Private Function GetBoundingBox() As cBoundingBox Dim Wert As New cBoundingBox() For Each Obj As DisplayableObject In dP.Views.WorkView.AskVisibleObjects If TypeOf (Obj) Is Edge Then Dim E As Edge = Obj Dim Vert1 As Point3d = Nothing, Vert2 As Point3d = Nothing E.GetVertices(Vert1, Vert2) If Vert1.X < Wert.Corner1.X Then Wert.Corner1.X = Vert1.X If Vert1.X > Wert.Corner2.X Then Wert.Corner2.X = Vert1.X If Vert1.Y < Wert.Corner1.Y Then Wert.Corner1.Y = Vert1.Y If Vert1.Y > Wert.Corner2.Y Then Wert.Corner2.Y = Vert1.Y If Vert1.Z < Wert.Corner1.Z Then Wert.Corner1.Z = Vert1.Z If Vert1.Z > Wert.Corner2.Z Then Wert.Corner2.Z = Vert1.Z If Vert2.X < Wert.Corner1.X Then Wert.Corner1.X = Vert2.X If Vert2.X > Wert.Corner2.X Then Wert.Corner2.X = Vert2.X If Vert2.Y < Wert.Corner1.Y Then Wert.Corner1.Y = Vert2.Y If Vert2.Y > Wert.Corner2.Y Then Wert.Corner2.Y = Vert2.Y If Vert2.Z < Wert.Corner1.Z Then Wert.Corner1.Z = Vert2.Z If Vert2.Z > Wert.Corner2.Z Then Wert.Corner2.Z = Vert2.Z End If Next Return Wert End Function Public Class cBoundingBox Public Corner1 As Point3d = Nothing Public Corner2 As Point3d = Nothing Public Sub New() Dim Wert As Double = 999999999 Corner1 = New Point3d(Wert, Wert, Wert) Corner2 = New Point3d(-Wert, -Wert, -Wert) End Sub End Class
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
met Mitglied CAD-Admin / Konstrukteur
Beiträge: 142 Registriert: 23.07.2004 Solidworks 2017 TCE 9.1.3 NX 5 3ds max 2017/2019 CorelDraw 12
|
erstellt am: 23. Mrz. 2009 08:59 <-- editieren / zitieren --> Unities abgeben:
Hallo, im GTAC steht, dass AskVisibleObjects Probleme macht und in NX6 gefixt ist, aber es in der C API eine funktionierende Funktion gibt. Ist es sehr dreist, wenn ich einfach mal frage, ob mir jemand von euch mit der C-Lizenz eine kleine DLL schreibt, die ich in ein VB.Net Journal einbauen kann. Sonst wird mir nix anderes übrig bleiben, als darauf zu warten, dass wir auf NX6 umsteigen, oder ich gehe jede Komponente meiner Baugruppe durch und rechne die Koordinaten der Edges hoch. Gruß, met Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
met Mitglied CAD-Admin / Konstrukteur
Beiträge: 142 Registriert: 23.07.2004
|
erstellt am: 24. Mrz. 2009 12:00 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe jetzt die Function GetBoundingBox gebastelt (siehe Anhang), habe aber noch 1 Problem. Ich selektiere alle Kanten der aktuellen Baugruppe über den SelectionManager. Kann ich das auch irgendwie automatisch, ohne Benutzereingriff machen? Gruß, met Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Siassei Mitglied MB - Student
Beiträge: 490 Registriert: 08.07.2007 SWX NX 3 und höher ;) Windows and UNIX<P>C, C++, Java, Phyton,...</P>
|
erstellt am: 24. Mrz. 2009 17:20 <-- editieren / zitieren --> Unities abgeben: Nur für met
Servus, ja natürlich kannst du das. Sorry, aber ich finde C# einfacher zu lesen und die meisten kommen heutzutage aus der Java oder C++ Ecke und können das mit Sicherheit lesen. Falls du es in VB haben möchtest, dann sag es einfach und ich poste es nochmals als VB. Achja, das Ganze ist nicht getestet und ich gebe daher keine Garantie auf Richtigkeit Code: public static void selectAllPointOfAssembly(Component root) { Component[] ca = root.GetChildren(); // Rekursive Lösung // Achtung: In jeder Iteration wird ein neuer Stack angelegt // // Alternative: Iterative Lösung if (ca != null && ca.Length > 0) { foreach (Component c in ca) selectAllPointOfAssembly(c); } else { // Da bin ich mir nicht 100% sicher //Part p = (Part) root.Prototype; //Part p = (Part) root.OwningPart; // Ansonsten Part p = (Part)Session.GetSession().Parts.FindObject(root.DisplayName); // Alles auf einmal PointCollection pc = p.Points; LineCollection lc = p.Lines; // Nach Bodys sortiert IEnumerator<Body> bc = (IEnumerator <Body>) p.Bodies.GetEnumerator(); while (bc.MoveNext()) { Body b = bc.Current; // Kanten des Volumenkörpers Edge[] edge = b.GetEdges(); } }
Gruß, Thomas ------------------ Hopfen und Mals Gott erhalts Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
met Mitglied CAD-Admin / Konstrukteur
Beiträge: 142 Registriert: 23.07.2004
|
erstellt am: 25. Mrz. 2009 08:13 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas, danke für die schnelle Antwort. Ich hab mal ne Funktion gebaut, die alle Kanten aller Komponenten sucht. Doch wenn ich die Koordinaten auslese, werden die Koordinaten aus den einzelnen Parts ausgegeben. Und nicht wie mit der Selection Methode die aus dem DisplayPart. Hast Du noch ne Idee? Code: Private Sub GetKanten(ByVal aktPart As Part, ByRef Liste() As Edge) For Each aktBody As Body In aktPart.Bodies For Each Kante As Edge In aktBody.GetEdges() If Liste Is Nothing Then ReDim Liste(0) Liste(0) = Kante Else ReDim Preserve Liste(Liste.Length) Liste(Liste.Length - 1) = Kante End If Next Next If Not aktPart.ComponentAssembly.RootComponent Is Nothing Then For Each Comp As Assemblies.Component In aktPart.ComponentAssembly.RootComponent.GetChildren() Dim P As Part = Comp.Prototype GetKanten(P, Liste) Next End If End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Siassei Mitglied MB - Student
Beiträge: 490 Registriert: 08.07.2007 SWX NX 3 und höher ;) Windows and UNIX<P>C, C++, Java, Phyton,...</P>
|
erstellt am: 25. Mrz. 2009 13:51 <-- editieren / zitieren --> Unities abgeben: Nur für met
Jeep, überprüfe, ob die Komponente, Part, Body, ... dargestellt werden Code: Component c; if(c.IsBlanked) { // eingeblendet } else { // ausgeblendet }Body b; if(b.IsBlanked) { // eingeblendet } else { // ausgeblendet } ...
Gruss, Thomas ------------------ Hopfen und Mals Gott erhalts Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
met Mitglied CAD-Admin / Konstrukteur
Beiträge: 142 Registriert: 23.07.2004
|
erstellt am: 30. Mrz. 2009 09:03 <-- editieren / zitieren --> Unities abgeben:
|
Siassei Mitglied MB - Student
Beiträge: 490 Registriert: 08.07.2007 SWX NX 3 und höher ;) Windows and UNIX<P>C, C++, Java, Phyton,...</P>
|
erstellt am: 30. Mrz. 2009 23:16 <-- editieren / zitieren --> Unities abgeben: Nur für met
Code: Private Sub GetKanten(ByVal aktPart As Part, ByRef Liste() As Edge) For Each aktBody As Body In aktPart.Bodies For Each Kante As Edge In aktBody.GetEdges() If Kante.IsBlanked = False Then theSession.ListingWindow.WriteLine(Kante.JournalIdentifier) If Liste Is Nothing Then ReDim Liste(0) Liste(0) = Kante Else ReDim Preserve Liste(Liste.Length) Liste(Liste.Length - 1) = Kante End If End If Next Next If Not aktPart.ComponentAssembly.RootComponent Is Nothing Then For Each Comp As Assemblies.Component In aktPart.ComponentAssembly.RootComponent.GetChildren() If Comp.IsBlanked = False Then 'Dim P As Part = Comp.Prototype Try Dim P As Part = theSession.Parts.FindObject("@DB/" & Comp.DisplayName) // Wieso erstellst du zweimal die Variable P ??? // Ist das in VB zulässig? In C#, Java, ... führt dies // zu einem Compiler fehler!!! GetKanten(P, Liste) Catch ex As Exception End Try End If Next End If End Sub
Was meinst du mit Koordinaten? Start- und Entpunkt? Code:
// Warnung: // // Zusammenfassung: // Returns the vertices of the edge. // // Parameter: // vertex1: // First vertex in the edge // // vertex2: // Second vertex in the edge // // Hinweise: // If the edge is closed, the second vertex is the same as the first. // License requirements: solid_modeling ("SOLIDS MODELING") public void GetVertices(out Point3d vertex1, out Point3d vertex2);// Kanten des Volumenkörpers Edge[] edge = b.GetEdges(); foreach (Edge e in edge) { Point3d p1, p2; e.GetVertices(p1, p2); }
------------------ Hopfen und Mals Gott erhalts Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
met Mitglied CAD-Admin / Konstrukteur
Beiträge: 142 Registriert: 23.07.2004
|
erstellt am: 31. Mrz. 2009 08:07 <-- editieren / zitieren --> Unities abgeben:
Hallo, die GetVertices verwende ich doch schon in der Funktion GetBoundingBox(). Und diese liefern eben die Koordinaten der Vertice aus den einzelnen Parts und nicht aus dem DisplayPart. einfaches Beispiel: Baugruppe1 (=DisplayPart) enthält Komponente Teil1 an Position 100,100,100. Teil1 enthält eine Linie von P1(0,0,0) zu P2(10,0,0). GetVertices liefert (0,0,0) und 100,0,0), ich benötige aber (100,100,100) und (110,100,100) Gruß, met Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| CNC-Erodierer/in | Die Christoph Liebers GmbH & Co. KG ist ein mittelständiges Unternehmen mit 138-jähriger Familientradition. Wir sind Spezialisten in den Bereichen der Verschleissteile für Textilmaschinen (Strickerei , weltweit) und der Werkzeuge für Stanz-Biege-Montage-Automaten (Bihler, alle Branchen). Der Stanz-Biegewerkzeugbau der Christoph Liebers GmbH & Co. KG in Gaimersheim mit momentan 20 Mitarbeitern ... | Anzeige ansehen | Feste Anstellung |
|
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2704 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 31. Mrz. 2009 10:28 <-- editieren / zitieren --> Unities abgeben: Nur für met
Zitat: Original erstellt von met:
Und diese liefern eben die Koordinaten der Vertice aus den einzelnen Parts und nicht aus dem DisplayPart.einfaches Beispiel: Baugruppe1 (=DisplayPart) enthält Komponente Teil1 an Position 100,100,100. Teil1 enthält eine Linie von P1(0,0,0) zu P2(10,0,0). GetVertices liefert (0,0,0) und 100,0,0), ich benötige aber (100,100,100) und (110,100,100)
Hallo met, spricht was dagegen, zunächst Position und Orientierung der Komponente, bezogen auf das DP zu ermitteln, danach die Position der Vertices bezogen auf die Komponente ? Aus beiden läßt sich dann über ein Point Mapping oder eine Transformation (csys-, mtx* oder trns- Klasse der UFSession) der Vertex bezogen auf das DisplayedPart berechnen. Im Beitrag http://ww3.cad.de/foren/ubb/Forum4/HTML/007419.shtml#000009 findest Du ein Beispiel zum Thema Koordinatentransformation. Gruß, Michael
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|