| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX |
Autor
|
Thema: Fläche über Namen auswählen? (2973 mal gelesen)
|
FTD Mitglied Doktorand
Beiträge: 92 Registriert: 28.11.2012 NX 8.0.0.25
|
erstellt am: 05. Mrz. 2014 14:53 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich möchte gerne einer Fläche einen Tag zuweisen und diese dann auswählen/markieren. Ich habe bereits eine Lösung die folgendermaßen aussieht:
Code: static tag_t select_a_cae_face(char *prompt) { int resp; double cp[3]; tag_t object, view; UF_CALL(UF_UI_select_with_single_dialog("Select a CAE face", prompt, UF_UI_SEL_SCOPE_WORK_PART, mask_for_cae_faces, NULL, &resp, &object, cp, &view)); if (resp == UF_UI_OBJECT_SELECTED | | resp == UF_UI_OBJECT_SELECTED_BY_NAME) { UF_CALL(UF_DISP_set_highlight(object, FALSE)); return object; } else return NULL_TAG; }
Ich möchte nun die Fläche nicht über "anklicken" und oder "Namen in das Suchfeld eingeben" auswählen, sondern dies soll einfach über einen Parameter den ich vorher setzten möchte geschehen. (Also ganz ohne klicken und eingeben) Bin in NXOpen Programmierung nicht wirklich so fit, daher würde ich mich über ein paar Lösungsvorschläge sehr freuen. Beste Grüße =) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wladlaw Mitglied Ingenieur
Beiträge: 72 Registriert: 11.01.2012
|
erstellt am: 08. Mrz. 2014 13:15 <-- editieren / zitieren --> Unities abgeben: Nur für FTD
Hallo FTD, jedes NXObjekt hat 3 Eigenschaften .Name (Custom Name), .JournalIdentifier(System Name) und .Tag (ID). System Name und ID sind vom NX gesteuert und End-User hat kein Einfluss auf diese Eigenschaften (Read only). Mithilfe der Funktion .SetName(String) könnte man Custom Name festlegen. Es gibt auch Objekt-Attributen, die für Auswahl benutzt werden könnten. Das heißt bei der NXObjekt-Erzeugung muss man entweder "Custom Name" oder ein Attribut [ab NX8 .SetUserAttribute(...)] einsetzen und später diese Eigenschaft für die Auswahl benutzen.
------------------ Gruß Wladimir Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
FTD Mitglied Doktorand
Beiträge: 92 Registriert: 28.11.2012 NX 8.0.0.25
|
erstellt am: 10. Feb. 2016 15:57 <-- editieren / zitieren --> Unities abgeben:
Tja mein altes Problem hat mich 2 Jahre später wieder eingeholt und ich muss nun doch eine anständige Lösung finden. Daher krame ich den Thread mal wieder raus. Ich möchte meine Frage an der Stelle auch noch etwas präzisieren. In meinem aufgezeichnetem Skript gibt es Momentan zwei Stellen die mir Probleme machen, beide aus dem gleichen Grund. Hier der Code: Code: NXOpen.Assemblies.Component component1 = (NXOpen.Assemblies.Component)workSimPart.ComponentAssembly.RootComponent.FindObject("COMPONENT Casing_Solig_2_fem1 1"); NXOpen.CAE.CAEFace cAEFace1 = (NXOpen.CAE.CAEFace)component1.FindObject("PROTO#CAE_Body(1)|CAE_Face(210)");
und Code: NXOpen.CAE.SetObject[] objects2 = new NXOpen.CAE.SetObject[1]; Point point1 = (Point)component1.FindObject("PROTO#.Points|HANDLE R-428387");
Gerade der zweite Abschnitt ist besonders kritisch. Er sucht einen Punkt über ein Handle mit eienr ID. Die ID ändert sich jedoch, wenn ich z.B. neu vernetze, was mein Skript anschließend unbrauchbar macht. Ich würde gerne anstatt mit FindObject() nach einer ID zu suchen, ihn nach einem von mir vergebenen Namen suchen lassen (eine Art "tag" sozusagen). Wie geht denn sowas bitte? Vielen Dank wie immer und beste Grüße!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2624 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-1980 3D Printer Prusa MK2 S
|
erstellt am: 10. Feb. 2016 17:39 <-- editieren / zitieren --> Unities abgeben: Nur für FTD
|
FTD Mitglied Doktorand
Beiträge: 92 Registriert: 28.11.2012 NX 8.0.0.25
|
erstellt am: 16. Feb. 2016 16:12 <-- editieren / zitieren --> Unities abgeben:
Zitat: In UF_OBJ gibt's Cycle- Funktionen, u.a. mit Bezug auf selbst vergebene Objektnamen.
Hm... Damit konnte ich leider noch nicht so viel anfangen. Bin wohl noch nicht fit genug. Ich habe aber folgende Methode die mir die Fläche im der Modell-Umgebung richtig raussucht: Code:
public NXOpen.Face ReturnFaceByName(string thisfaceString) { Session theSession = Session.GetSession(); Part workPart = theSession.Parts.Work; // get face by given name-string of face foreach (Body thisbody in workPart.Bodies) { foreach (Face thisface in thisbody.GetFaces()) { if (thisface.Name == thisfaceString) { return thisface; } } } }
Bin mir nicht sicher ob er den Flächennamen in der Advanced Simulation Umgebung auch findet. Im Moment ist aber auch das Problem, dass er hier ja ein einfaches Face zurück gibt. Ich brauche aber ein CAEFace und er meldet, dass er die Fläche nicht implizit konvertieren kann. Gibt es vielleicht eine Methode oder eine andere Möglichkeit diese Fläche "umzuwandeln"? Vielen Dank! =) EDIT: Ich habe auch folgendes gefunden: https://community.plm.automation.siemens. com/t5/NX-Programming-Customization/Find-a-named-polygon-face-with-NXopen-python/td-p/317221 Zitat:
You can use NXOpen.UF.UFSf.AskAllPolygonBodies() to get all of the bodies. For each body, use NXOpen.UF.UFSf.BodyAskFaces() to get the faces. Or you can do as you suggest and use NXOpen.UF.UFObj.CycleByNameAndType(), looking for objects with type UFConstants.UF_caegeom_type. You would then need to use NXOpen.UF.UFObj.ask_type_and_subtype() to verify that the subtype is UFConstants.UF_caegeom_face_subtype
Scheint ja in die Richtung zu gehen, die schon vorgeschlagen wurde! Naja muss noch bisschen üben... [Diese Nachricht wurde von FTD am 17. Feb. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Ingenieure und Techniker im Bereich Elektrotechnik (m/w/d) | EWEX-Weber Engineering GmbH ist ein erfolgreich wachsendes Unternehmen innerhalb der Weber-Unternehmensgruppe. Die Weber-Unternehmensgruppe beschäftigt 2.000 Mitarbeiter und gehört zu den führenden Anbietern von industriellen Dienstleistungen mit einem umfassenden Know-how in Planung, Bau und Optimierung von Industrieanlagen. Unsere Kunden sind in der chemischen und petrochemischen ... | Anzeige ansehen | Elektrotechnik, Elektronik |
|
FTD Mitglied Doktorand
Beiträge: 92 Registriert: 28.11.2012 NX 8.0.0.25
|
erstellt am: 01. Mrz. 2016 12:13 <-- editieren / zitieren --> Unities abgeben:
So! Ich bin schon ein Stück weiter gekommen... Ich möchte erstmal den richtigen Polygonbody finden und dann alle Flächen auf diesem Body absuchen. Hier mal der aktuelle Stand: Code:
using System; using NXOpen; using NXOpen.UF; using NXOpenUI;public class NXJournal { public static void Main(string[] args) { Session theSession = Session.GetSession(); NXOpen.UI theUISession = NXOpen.UI.GetUI(); NXOpen.UF.UFSession theUFSession = UFSession.GetUFSession(); NXOpen.Utilities.NXObjectManager ObjectManager = new NXOpen.Utilities.NXObjectManager(); String BodyName = "BodyName"; int bodynumber; NXOpen.Tag[] PolygonBodyTags; theUFSession.Sf.AskAllPolygonBodies(out bodynumber, out PolygonBodyTags); foreach (NXOpen.Tag PolygonBodyTag in PolygonBodyTags) { NXOpen.TaggedObject BodyObject = ObjectManager.GetTaggedObject(PolygonBodyTag); String BodyString = BodyObject.ToString(); theUISession.NXMessageBox.Show("Info", NXOpen.NXMessageBox.DialogType.Information, BodyString); if (BodyString == BodyName) { theUISession.NXMessageBox.Show("Info" ,NXOpen.NXMessageBox.DialogType.Information,"Body with tag: '" + BodyString + "' has been found!"); } } }//end Main
Er geht aber irgendwie erst garnicht in die for-Schleife und fängt an zu suchen!? Weiß jemand warum? Vielen Dank und beste Grüße EDIT: Habe zwei Probleme gefunden. Zum einen funktioniert das Absuchen der Bodies nur in dem .fem Datei. Zum anderen gibt "BodyObject.ToString()" nicht den Tag wieder, sondern "CAEBody 12345" o.Ä. ... [Diese Nachricht wurde von FTD am 01. Mrz. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |