Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Inventor VBA
  Brenndatei mit Markierungen erstellen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Brenndatei mit Markierungen erstellen (2050 mal gelesen)
2paul
Mitglied



Sehen Sie sich das Profil von 2paul an!   Senden Sie eine Private Message an 2paul  Schreiben Sie einen Gästebucheintrag für 2paul

Beiträge: 20
Registriert: 13.01.2014

erstellt am: 18. Jan. 2014 11:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


Beispiel.zip

 
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




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2166
Registriert: 15.11.2006

Windows 10 x64, AIP 2022

erstellt am: 21. Jan. 2014 22:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für 2paul 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von 2paul an!   Senden Sie eine Private Message an 2paul  Schreiben Sie einen Gästebucheintrag für 2paul

Beiträge: 20
Registriert: 13.01.2014

erstellt am: 22. Jan. 2014 16:30    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2166
Registriert: 15.11.2006

Windows 10 x64, AIP 2022

erstellt am: 22. Jan. 2014 17:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für 2paul 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von 2paul an!   Senden Sie eine Private Message an 2paul  Schreiben Sie einen Gästebucheintrag für 2paul

Beiträge: 20
Registriert: 13.01.2014

erstellt am: 22. Jan. 2014 18:12    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von 2paul an!   Senden Sie eine Private Message an 2paul  Schreiben Sie einen Gästebucheintrag für 2paul

Beiträge: 20
Registriert: 13.01.2014

erstellt am: 22. Jan. 2014 20:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von 2paul an!   Senden Sie eine Private Message an 2paul  Schreiben Sie einen Gästebucheintrag für 2paul

Beiträge: 20
Registriert: 13.01.2014

erstellt am: 24. Jan. 2014 14:42    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2166
Registriert: 15.11.2006

Windows 10 x64, AIP 2022

erstellt am: 27. Jan. 2014 18:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für 2paul 10 Unities + Antwort hilfreich

Hallo

Hat etwas gedauert, aber ich hab die Frage mal an Autodesk weitergegeben. Hier die Antwort.
Deine Idee ist auch nicht schlecht. Mir fällt spontan keine Anordnung ein, bei der die Prüfung nicht funktioniert.


------------------
MfG
Ralf

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

2paul
Mitglied



Sehen Sie sich das Profil von 2paul an!   Senden Sie eine Private Message an 2paul  Schreiben Sie einen Gästebucheintrag für 2paul

Beiträge: 20
Registriert: 13.01.2014

erstellt am: 28. Jan. 2014 08:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von 2paul an!   Senden Sie eine Private Message an 2paul  Schreiben Sie einen Gästebucheintrag für 2paul

Beiträge: 20
Registriert: 13.01.2014

erstellt am: 30. Jan. 2014 16:37    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von 2paul an!   Senden Sie eine Private Message an 2paul  Schreiben Sie einen Gästebucheintrag für 2paul

Beiträge: 20
Registriert: 13.01.2014

erstellt am: 05. Feb. 2014 14:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz