| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Brenndatei mit Markierungen erstellen (2089 mal gelesen)
|
2paul Mitglied
Beiträge: 20 Registriert: 13.01.2014
|
erstellt am: 18. Jan. 2014 11:25 <-- editieren / zitieren --> Unities abgeben:
Erstmal möchte kurz "Hallo" sagen, ich bin neu hier. Wirklich tolles Forum, ich habe hier schon viel gelesen, selten dass man so ein umfangreiches und hilfsbereites Forum findet. Ich bin eigentlich Informatiker, daher schon mal vorab eine Entschuldigung, wenn ich nicht alle Maschinenbautechnische Begriffe benutze. Ich habe den Auftrag bekommen ein Makro für IV zu schreiben, dass die Erstellung von Brenndatein erleichtert oder vielleicht sogar das komplett übernimmt. Der aktuelle Workflow sieht so aus: - Modell ist fertig konstruiert - Alle Brennteile werden in einer Baugruppe geöffnet - Jedes einzelne Brennteil wird dann mit den zugehörigen anderen Brennteilen, die eine Kontaktfläche haben, in eine neue IAM abgelegt - Daraus wird dann eine IDW erstellt, wodurch die ganzen Markierungen, die in der Brenndatei vorhanden sein müssen, schon da sind. - Als DWG speichern und dann in ACAD bereinigen Ich habe mich jetzt schon einige Zeit damit beschäftigt und meine Idee ist folgende: 1. Ein Makro, welches alle Brennteile durchsucht, und mir alle anderen Brennteile findet, die mit diesem eine Kontaktfläche haben, und mir das dann als eigene IAM abspeichert 2. Ein weiteres Makro welches man dann in diesen kleinen IAMs ausführt und die Positionsnummern an die jeweiligen Objekte schreibt, sodass ich diese Informationen in den Exportierten DWGs und DXFs habe. Die endgültige Bereinigung und Aufbereitung für die Brennsoftware müsste man dann in ACAD machen Ein kleines Beispiel einer extrahierten IAM und den Brenn-DWGs habe ich angehängt. Dass das 2. Makro möglich ist, davon gehe ich das, was ich bisher gelesen habe, meine Frage wäre eher, ob das erste Makro auch realisiert werden kann. Viele Grüße Michael
[Diese Nachricht wurde von 2paul am 18. Jan. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 21. Jan. 2014 22:25 <-- editieren / zitieren --> Unities abgeben: Nur für 2paul
Hallo Schau dir mal die AssemblyComponentDefinition.AnalyzeInterference Methode an. Das müßte doch das gewünschte Ergebnis (Bauteile mit Kontaktfläche) liefern oder? Ich würde die gefundenen Bauteile in eine Unterbaugruppe verschieben und die Suche in den Bauteilen der Hauptbaugruppe neu starten. Die Teile der Unterbaugruppe sind dann als Proxyelemente im neuen Suchergebnis leicht von noch in der Hauptbaugruppe befindlichen Bauteilen unterscheidbar. Zum Schluß einmal Speichern und dabei die Hauptbaugruppe ausklammern. Soweit die Theorie. Willkommen im Forum. EDIT: Schade der Abstand null wird nicht als Kollision erkannt. Eventuell geht's dann mit der GetMinimumDistance Methode. ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
2paul Mitglied
Beiträge: 20 Registriert: 13.01.2014
|
erstellt am: 22. Jan. 2014 16:30 <-- editieren / zitieren --> Unities abgeben:
Ersteinmal vielen Dank für deine Antwort, ich hatte schon befürchtet, dass es dafür keine Lösung gibt. Ich hab mir die GetMinimumDistance Methode angesehen. Das sieht gut aus, mit meinem Basiswissen. - Durchsuche alle Bauteile - Durchsuche alle Flächen des Bauteils - Messe Abstand der Flächen zu allen Flächen des Original-Bauteils - Wenn alle Deltas 0 sind -> Kontakt gefunden Ich weiss nicht, ob ich Deinen Vorschlag jetzt richtig verstanden habe, aber das würde ja bedeuten, dass ein Bauteil nur einmal gefunden werden kann, danach wäre es in der Unterbaugruppe und würde nicht mehr durchsucht werden. Meine Idee war, Isoliere mir alle Bauteile, die in Kontakt stehen, generiere mir daraus eine IDW mit 3 Ansichten und dann Unisoliere wieder und suche weiter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 22. Jan. 2014 17:53 <-- editieren / zitieren --> Unities abgeben: Nur für 2paul
Hallo Ich dachte die Bauteile sollen nicht doppelt gefunden werden. Daher meine Idee in eine Unter-BG zu verschieben. Die Schleifendurchläufe werden eine ziemlich lange Laufzeit verursachen fürchte ich. Eventuell könnte man das verkürzen, wenn der User das jeweilige Startbauteil selbst wählt? Ich überlege noch das der Winkel der mutmaßlichen Kontaktflächen zueinander geprüft werden sollte. Sonst werden aufeinander stehende Flächen auch erkannt, da ein Punkt auf der "Berührungskante" den Abstand null hat. ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
2paul Mitglied
Beiträge: 20 Registriert: 13.01.2014
|
erstellt am: 22. Jan. 2014 18:12 <-- editieren / zitieren --> Unities abgeben:
Also sagen wir mal ich habe 100 Brennteile in meiner Konstruktion, dann sollen 100 Brenndatein (erstmal als idw, später als dxf) erstellt werden, und auf jeder sollen die Markierungen gesetzt werden, wo die anderen Brennteile aufgeschweisst werden sollen. Ich denke nicht, dass Zeit bei dieser Abfrage eine Rolle spielt. Konstruktion ist fertig, dann kann der theoretisch auch die Nacht durchlaufen, um die Brenndatein zu erzeugen. Ja, ich hab auch schon gesehen, dass mir das GetMinimumDistance kein Delta zurückgibt, wie die Messmethode innerhalb von Inventor, schade eigentlich. Ich weiss auch nicht, ob ich damit dann letztendlich zum Ziel kommen werde, auch mit einer Winkelabfrage, nehmen wir an, 2 Kanten berühren sein, aber nicht die Flächen, dann würden sich ja auch die Objekte finde Distance=0 und Angle-Diffence=0. Aber ich denke, das kann ich vernachlässigen, die Datein (idw) müssen sowieso noch einmal geöffnet werden, und dabei wären diese Fehler sichtbar, und können manuell behoben werden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
2paul Mitglied
Beiträge: 20 Registriert: 13.01.2014
|
erstellt am: 22. Jan. 2014 20:24 <-- editieren / zitieren --> Unities abgeben:
Das nenn ich mal ein For-Verschaltelung Funktioniert soweit, aber eben auch nicht Er findet dabei auch alle Parts, die irgendwo ein Delta auf 0 haben, also wenn 2 Flächen z.B. auf der selben Y-Ebene liegen.
Code:
For Each oOcc In oDoc.ComponentDefinition.Occurrences For Each oOcc2 In oDoc.ComponentDefinition.Occurrences If oOcc.Name <> oOcc2.Name Then contact_found = False For Each oSurfaceBody In oOcc.SurfaceBodies For Each oSurfaceBody2 In oOcc2.SurfaceBodies For Each oFace In oSurfaceBody.Faces For Each oFace2 In oSurfaceBody2.Faces dist = ThisApplication.MeasureTools.GetMinimumDistance(oFace, oFace2) If dist = 0 Then contact_found = True End If Next Next Next Next If contact_found = True Then MsgBox oOcc.Name & " " & oOcc2.Name End If End If Next Next
[Diese Nachricht wurde von 2paul am 22. Jan. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
2paul Mitglied
Beiträge: 20 Registriert: 13.01.2014
|
erstellt am: 24. Jan. 2014 14:42 <-- editieren / zitieren --> Unities abgeben:
Ich glaub, ich hab Ihn ausgetrickst .... Code:
Dim oHS1 As HighlightSet Dim oHS2 As HighlightSet For Each oOcc In oDoc.ComponentDefinition.Occurrences For Each oOcc2 In oDoc.ComponentDefinition.Occurrences If oOcc.Name <> oOcc2.Name Then contact_count = 0 Set oHS1 = oDoc.HighlightSets.Add Set oHS2 = oDoc.HighlightSets.Add For Each oSurfaceBody In oOcc.SurfaceBodies For Each oSurfaceBody2 In oOcc2.SurfaceBodies For Each oFace In oSurfaceBody.Faces For Each oFace2 In oSurfaceBody2.Faces dist = ThisApplication.MeasureTools.GetMinimumDistance(oFace, oFace2) If dist = 0 Then contact_count = contact_count + 1 oHS1.AddItem oFace oHS1.AddItem oFace2 End If Next Next Next Next If contact_count > 2 Then MsgBox oOcc.Name & " " & oOcc2.Name End If End If Next Next
Ich zähle einfach die Abstände hoch, die 0 sind, wenn er drei mal Abstand = 0 findet, dann ist das in Kontaktfläche, bei meine Testprojekt funktioniert s, bei größeren Projekten müsst man das nochmal testen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2580 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 27. Jan. 2014 18:50 <-- editieren / zitieren --> Unities abgeben: Nur für 2paul
|
2paul Mitglied
Beiträge: 20 Registriert: 13.01.2014
|
erstellt am: 28. Jan. 2014 08:51 <-- editieren / zitieren --> Unities abgeben:
Woowww, vielen Dank für die Lösung Die Idee mit dem Extrudieren und auf Kollision prüfen hatte ich auch schon, nur war ich mir als VB-Anfänger zu unsicher, all die Funktionen richtig zu implementieren: - Generiere eine Skizze auf der Fläche - Mache darauf eine 2D-Zeichnung der Fläche - Extrudiere die Fläche - Prüfe auf Kollision - Lösche das neue Hilfsobjekt Jetzt mit dem Code von Autodesk ist das natürlich klasse ... Ich werde beide Methoden mal bei einem großen Projekt testen, einmal auf Fehler und auf Performance, und gebe dann Feedback, das kann aber noch ein wenig dauern. ##### Ansonsten bin ich ja wirklich begeistert von den Möglichkeiten in VB. Ich bin fast fertig mit meiner Testimplementierung, ich hab noch eine Berechnung der Kontaktflächengröße eingebaut, da ich ja in der Brenndatei nicht den Part haben möchte, auf den das aktuelle Bauteil aufgeschweisst wird. Ich möchte ja nur die Markierungen haben, wenn ein anderes Bauteil auf mein aktuelle Bauteil geschweißt wird. Er generiert mir daraus dann eine neue temporäre IAM, die ich abspeichern muss und daraus dann gleich eine IDW mit der richtigen Ansicht (Front-, Seiten-, Draufsicht). Schliesst dann gleich wieder die Datein und durchsucht das nächste Bauteil... Alles in einem Durchlauf, ich brauch gar kein neues Makro starten, ich mach das alles in einem großen Makro Wirklich klasse gemacht die Implementierung von VB in Inventor Und was war ich am Anfang am Meckern über die Sprache - Keine Relativen Dateipfade, mit SplitString den richtigen Dateipfad generieren - Jede noch so unwichtige Variable definieren - Keine geschweiften Klammern für If oder For, keine normalen Klammern für die Abfrage z.B. if (i == 1) {make somthing} - usw... Und jetzt krieg ich das Grinsen gar nicht mehr aus dem Gesicht. Ich muss mich aber nochmal ganz besonders bei Dir bedanken, Ralf, nicht nur für deine direkte Hilfe hier im Thread, sondern auch für die vielen Hilfen, die Du hier im Forum postest, das hat es mir den Einstieg in die Sprache sehr vereinfacht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
2paul Mitglied
Beiträge: 20 Registriert: 13.01.2014
|
erstellt am: 30. Jan. 2014 16:37 <-- editieren / zitieren --> Unities abgeben:
Ich gebe nochmal eben Feedback an dieser Stelle: Meine Methode funktioniert nicht. Wenn ich 2 gleich Parts habe, die ich nur in einer Achse verschiebe, dann finden die auch mehr als 2 passende 0 Distanzen. Dann ich hab versucht seine Methode umzuschreiben, da hab ich irgendwann abgebrochen, da mir die Dimension in großen Baugruppen bewusst wurde, massenhaft an Temporären Skizzen müssen erzeugt werden, usw... Ich hatte das Gefühl, dass mir das unter Umständen den Speicher überlaufen lässt oder sonst etwas passiert. Also habe ich nochmal nach einer anderen Methode gesucht, die vielleicht einfach zum Ziel führt. Und bin so auf die MoveFaceFeatures-Methode gestoßen Ich nehme jetzt jeweils ein Face und verschiebe es um 0.001 in Richtung der Normalen. Dann prüfe ganz normal auf Kollision mit AnalyzeInterference Und mache danach mit TransactionManager.UndoTransaction diese Verschiebung rückgängig Und das funktioniert super. Diese Funktion erscheint mir noch schlanker als der erster Ansatz, da ich jetzt nicht mehr rekusiv jedes Face mit jedem Face vergleichen muss. Sondern nur einmal alle Faces durchlaufen muss. Dafür wird die Abfrage "AnalyzeInterference" sicherlich intern aufwendiger sein, als die GetMinimumDistance-Methode. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
2paul Mitglied
Beiträge: 20 Registriert: 13.01.2014
|
erstellt am: 05. Feb. 2014 14:50 <-- editieren / zitieren --> Unities abgeben:
So langsam nähert sich das Projekt dem Ende. Ich hab noch eine Features eingebaut: - Durchsuchen der Baugruppen-Struktur - Abwicklungen für Biegeteile - Ausklammern der Brenndateierstellung von nicht Blechteilen - Texte zum Auflasern, die in die Brenndatei eingepflegt werden sollen, werden schon in 10mm Schriftgröße eingefügt, und müssen nur noch in ACAD verschoben werden - Bohrbleche werden in seperaten Ordner abgelegt - Ordner werden selbstständig erzeugt, wenn sie nicht vorhanden sind - Material-Stärke in den Dateinamen eingebaut - Richtige Ausrichtung bei nicht 90° Bauteilen oder Baugruppen Die Sprache ist echt mächtig und die Integration von Inventor hervorragend, ich bin wirklich begeistert. Anbei noch einmal ein Präsentationsvideo, wie das Makro in Aktion aussieht: http://www.youtube.com/watch?v=A0w8wiRVH-w Da es sich um eine Auftragsarbeit handelt, kann ich den VBA-Code nicht zur Verfügung stellen [Diese Nachricht wurde von 2paul am 06. Feb. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|