Inventor 2016 - Explosionszeichnung: Koordinaten der Positionsnummer exportieren

Inventor 2016 - Explosionszeichnung: Koordinaten der Positionsnummer exportieren

edv
Participant Participant
4.201Aufrufe
25Antworten
Nachricht 1 von 26

Inventor 2016 - Explosionszeichnung: Koordinaten der Positionsnummer exportieren

edv
Participant
Participant

Hallo,

ich möchte aus einer 3D-Zeichnung ein 2D-Explosionszeichnung erstellen.

Es soll dabei einmal eine Bilddatei generiert werden als z.B. TIFF und zum anderen möchte ich auch die Stückliste mit Artikelnummer, Positionsnummer und auch die Koordinaten des Teils und auch die Koordinaten der Positionsnummer als XLSX oder XML exportieren.

Die Stückliste zu exportieren habe ich schon geschafft, aber wie komme ich an die Koordinaten des Teils und der Positionsnummer.

Hier ein Beispiel einer Schraube und Mutter:

 

export.png

 

Im Export sollte dann folgendes stehen:

result.png

Ist so etwas möglich? Wenn ja, gibt es dazu auch ein Beispielscript?

Falls es in Inventor nicht geht, gibt es andere Programme aus der Suite, mit denen man dies machen könnte?

0 „Gefällt mir“-Angaben
4.202Aufrufe
25Antworten
Antworten (25)
Nachricht 2 von 26

fullevent
Advisor
Advisor

Hallo @edv,

 

interessante Fragestellung.

Kannst du mir kurz beschreiben was genau X1 X2 Y1 Y2 für "Teil" und "Position" bedeutet?

Woher hast du die Zahlen?

 

Grüße


Aleksandar Krstic
Produkt- und Projektmanager

0 „Gefällt mir“-Angaben
Nachricht 3 von 26

edv
Participant
Participant

Die Zahlen sind die Pixel gemessen von der linken oberen Ecke des Bildes aus, wenn ich z.B. die Zeichnung als TIFF exportiere.

In diesem Beispiel habe ich diese einmal grob ausgemessen, da ich diese auch nicht in Inventor gefunden habe.

Die Koordinaten könnten sich aber auch auf einen anderen Bezugspunkt beziehen, das wäre ja dann nur eine Umrechnung, wenn ich die Daten weiter verarbeite.

X1/Y1 wäre die linke obere Ecke der Zahl "1"=Position bzw. die Umrandung der Schraube=Teil

X2/Y2 wäre die rechte untere Ecke der Zahl "1"=Position bzw. die Umrandung der Schraube=Teil

0 „Gefällt mir“-Angaben
Nachricht 4 von 26

fullevent
Advisor
Advisor

Also die Position der Positionsnummern sind durch einen Punkt definiert (keine viereckige Umrandung oder so).

Mit folgendem (VBA) Codesnippet kannst du dir beispielsweise alle Positionsnr. (des aktiven Blatts) mit deren Koordinaten ausgeben lassen.

 

 

'Keine Fehlerbehandlung

Private Sub Ballon_Positions()
    Dim oDoc As DrawingDocument
    Set oDoc = ThisApplication.ActiveDocument

    Dim oBallon As Balloon
    Dim oBallons As Balloons
    Set oBallons = oDoc.ActiveSheet.Balloons

    Dim s As String
    s = "No." & vbTab & vbTab & "X-Coor." & vbTab & vbTab & "Y-Coor."
    For Each oBallon In oBallons
        s = s & vbCr & oBallon.BalloonValueSets.Item(1).ItemNumber & vbTab & vbTab & Math.Round(oBallon.Position.x, 7) & vbTab & Math.Round(oBallon.Position.y, 7)
    Next
    MsgBox s, , "KrA"
End Sub

 

 

Bei meiner kleinen Testdatei sieht das z.B. so aus.

2020-05-05 08_18_59-Autodesk Inventor Professional 2018.png

 

Ich hoffe das hilft dir erstmal weiter.

 

Gruß


Aleksandar Krstic
Produkt- und Projektmanager

Nachricht 5 von 26

edv
Participant
Participant

Hallo,

das ist super und hilft auf alle Fälle weiter. Die Umrechnung in Pixel und den Rahmen um die Zahl kann ich dann anderweitig berechnen lassen.

Es scheinen die Angaben in cm zu sein, zumindest, wenn ich ein A4-Dokument habe.

Einen Export als PDF und TIFF habe ich auch schon per Script hinbekommen. Hier ist es allerdings so, das beim PDF ein A4 exportiert wird, von genau dem Dokument, das in einem Zeichnungsrahmen (Vorlage) ist. Beim TIFF hingegen wird der gesamte Bereich exportiert, der auch aktuell am Bildschirm zu sehen ist, also eine Art Screenshot von dem Fenster. Wo könnte man das einstellen?

Und die letzte Frage wäre, ob man auch die Position bzw. auch Breite und Höhe der Teile auslesen kann, also wie bei den Positionsnummern? Wo würde ich denn eine Doku von den Scriptbeispielen finden?

0 „Gefällt mir“-Angaben
Nachricht 6 von 26

fullevent
Advisor
Advisor

Bei den Bauteilen wird es sich identisch verhalten. Die Position ist durch einen Punkt definiert, die Koordinaten werden sich aber auch auslesen lassen. Ich versuche mich morgen mal an einem entsprechenden Code.

Übrigens ist die interne Längeneinheit mit der Inventor rechnet [cm].

 

Bzgl. dem Export würde ich dich bitten einen separaten Thread zu erstellen bzw. noch besser, durchsuche mal das Forum nach ähnlichen Fragestellungen. Dazu gibt es bestimmt schon was.. 🤔

 

Schönen Abend noch.

 


Aleksandar Krstic
Produkt- und Projektmanager

0 „Gefällt mir“-Angaben
Nachricht 7 von 26

edv
Participant
Participant

Also die Positionsnummern funktionieren schon.

Für das TIFF habe ich das Dokument als PDF exportiert und wandle es dann mit ImageMagic als TIFF um und schneide mir dann den Bereich mit den Bauteilen aus. Da ich dann die Größe der Zeichnung habe, z.B. A4 kann ich das anhand der DPI in die Pixel umrechnen und so auch bei den Positionen mit Pixeln weiterarbeiten.

Bei den Bauteilen würde mit der (Mittel-)Punkt nur dann weiterhelfen, wenn ich auch die Länge und Breite des Bauteils (Außenmaße) bekommen würde. Bei den Positionen kann ich die Breite anhand der Länge der Nummer ermitteln und die Höhe anhand der Schriftgröße ermitteln und diesen Wert dann einfach für alle Zeichnungen nehmen.

Es wäre also super, wenn man an die Werte der Bauteile irgendwie rankommen könnte.

 

0 „Gefällt mir“-Angaben
Nachricht 8 von 26

fullevent
Advisor
Advisor

Also Mittelpunkt (Ursprung) der Bauteile wäre kein Problem.. das würde man schon irgendwie hinbekommen. Das würde ich mir mal heute Abend anschauen.

Das mit dem Rechteck ist allerdings nicht ganz so leicht. Wie setzt man das Rechteck, wenn das Bauteil mal nicht "horizontal" liegt? Folgendes Beispiel:

2020-05-11 16_09_46-Autodesk Inventor Professional 2018 - [DIN 912 - ersetzt durch DIN EN ISO 4762 M.png

Die ersten drei Abbildungen wären vielleicht noch vergleichsweise einfach realisierbar. Die rechten Beiden, aus meine Sicht, eher nur mit viel Aufwand. Hinzukommt die Frage, welche Ecke in rechten beiden Abbildungen ist die "obere linke Ecke" und warum? Wie soll das definiert werden.. usw...

 

Du siehst, ganz so leicht ist das nicht.

 

Gruß


Aleksandar Krstic
Produkt- und Projektmanager

Nachricht 9 von 26

edv
Participant
Participant

Aus deinem Beispiel würde ich das Rechteck immer wie in den ersten 3 Abbildungen gezeigt ziehen.

Welche Ecken ich bekomme wäre egal, so lange diese sich gegenüberliegen.

Anhand der zwei Ecken, kann man ja ermitteln, was dann links oben und rechts unten wäre.

0 „Gefällt mir“-Angaben
Nachricht 10 von 26

michele.mk
Alumni
Alumni

Hallo @edv,


wie sieht es mit deiner Frage aus? Bist du weiter gekommen oder hat dir einer der Beiträge von @fullevent in diesem Thema geholfen eine Lösung zu finden? Wenn ja, kannst du gerne in der entsprechenden Antwort auf den Button "Als Lösung akzeptieren" klicken, dann profitieren auch andere Anwender von der Information.

Gib uns einfach ein Update. Wenn du selber auf eine Lösung gekommen bist, darfst du sie sehr gerne mit uns hier in der Community teilen. Das ist dann sicherlich für alle mitlesenden Anwender und Helfer spannend zu lesen.

Gruß,
Michèle

-------------------------------------------------------------------------------------------------------
Ihr fandet einen Beitrag hilfreich? Dann vergebt dafür Likes!
Eure Anfrage wurde erfolgreich gelöst? Dann einfach auf den 'Als Lösung akzeptieren'-Button klicken!


Michèle Matzeck-Kunstman
Community Manager
0 „Gefällt mir“-Angaben
Nachricht 11 von 26

edv
Participant
Participant

Hallo @fullevent,

 

hast du mittlerweile eine Idee, wie man an die Koordinaten/Maße der Bauteile kommt?

Ich bin für jeden Tipp dankbar.

0 „Gefällt mir“-Angaben
Nachricht 12 von 26

fullevent
Advisor
Advisor

Halloe @edv,

 

grad wollte ich dir schreiben 😀

Ich war bis heute im Urlaub und bin nicht dazu gekommen hier weiter zu machen.
Eine Idee hab ich. Ich versuch da heute Abend ein Beispiel zu erstellen.

Ich werde versuchen mich ein bisschen an dem Beitrag von Xiaodong Liang zu orientieren.
Falls du da mal rein schauen möchtest => Display range box of componenets in assembly context 

 

Grüße


Aleksandar Krstic
Produkt- und Projektmanager

0 „Gefällt mir“-Angaben
Nachricht 13 von 26

edv
Participant
Participant

Hallo @fullevent ,

 

mit deinem Tipp der "RangeBox" habe ich glaube ich eine Lösung gefunden, das zumindest bei meinem sehr einfachen Beispiel die Größe des Bauteils ausgibt.

(oBallon.BalloonValueSets.Item(1).ReferencedRow.BOMRow.ComponentDefinitions.Item(1).RangeBox.MaxPoint.X - oBallon.BalloonValueSets.Item(1).ReferencedRow.BOMRow.ComponentDefinitions.Item(1).RangeBox.MinPoint.X) * oView.Scale()

Jetzt fehlt noch die Position (X/Y-Koordinate) des Bauteils selbst innerhalb der Zeichnung. 

Nachricht 14 von 26

fullevent
Advisor
Advisor

Hier mal ein VBA Snippet, dass alle Ballons durchläuft und folgendes in der Konsole ausgibt..
BallonNr + Ballon X-Koordinate + Ballon Y-Koordinate

Zugehörigen Komponentennamen + X/Y-Koordinate Ecke Linksoben + X/Y-Koordinate Ecke Rechtsunten

Alles Koordinaten sind auf das aktuelle Blatt bezogen.

2020-05-25 17_56_42-Microsoft Visual Basic for Applications - Default.ivb.png

 

Der Code funktioniert nur solange die Ansicht auf der Zeichnung, die gleiche ist, wie im Modell auf die XZ-Ebene. Da ich "MaxPoint.X" bzw. "MaxPoint.Z" usw. genutzt habe.
Hier die Bilder zur Veranschaulichung was ich meine.

Ansicht auf XZ-EbeneAnsicht auf XZ-EbeneGleiche Ansicht auf ZeichnungGleiche Ansicht auf Zeichnung

 

Auch wichtig: Die Ballonspitzen müssen auf eine Kante referenzieren.. alles andere wird nicht abgefangen.
Bei automatisch gesetzten Ballons sind es nämlich in der Regel immer Kanten.

 

Es gäbe noch eine elegantere Möglichkeit:
Jedes DrawingView hat die Methode "ModelToSheetSpace".. damit müsste man weniger selber rechnen und evtl. lässt sich die Thematik mit der XZ-Ebene bzw. Ansicht schön lösen.
2020-05-25 17_54_37-Autodesk Inventor 2018 API Help.png

 

Ich hoffe das löst dein Problem bzw. hilft dir bei der Lösungsfindung.
Hier noch der Code..

 

Private Sub test()
    Dim oDoc As DrawingDocument
    Set oDoc = ThisApplication.ActiveDocument
    Dim oBalloons As Balloons
    Set oBalloons = oDoc.ActiveSheet.Balloons
    Dim oLeader As Leader
    Dim oLeaderNode As LeaderNode
    Dim oIntent As GeometryIntent
    Dim oCurve As DrawingCurve
    Dim oEdgePx As EdgeProxy
    Dim oOccurrence As ComponentOccurrence
    Dim oBox As Box
    Dim dScale As Double
    Dim dLiOb(1) As Double
    Dim dReUn(1) As Double
    Dim dModelToSheet(1) As Double
    Dim sBalloon As String
    Dim sModel As String
    Dim oBalloon As Balloon

    For Each oBalloon In oBalloons
        Set oLeader = oBalloon.Leader
        Set oLeaderNode = oLeader.AllNodes(2)
        Set oIntent = oLeaderNode.AttachedEntity
        Set oCurve = oIntent.Geometry
        Set oEdgePx = oCurve.ModelGeometry
        Set oOccurrence = oEdgePx.ContainingOccurrence
        Set oBox = oOccurrence.RangeBox
        
        dScale = oBalloon.ParentView.Scale
        dLiOb(0) = Round(oBox.MinPoint.X * 10 * dScale, 3)
        dLiOb(1) = Round(oBox.MaxPoint.Z * 10 * dScale, 3)
        dReUn(0) = Round(oBox.MaxPoint.X * 10 * dScale, 3)
        dReUn(1) = Round(oBox.MinPoint.Z * 10 * dScale, 3)
        dModelToSheet(0) = Round(oBalloon.ParentView.Position.X * 10, 3)
        dModelToSheet(1) = Round(oBalloon.ParentView.Position.Y * 10, 3)
        sBalloon = oBalloon.BalloonValueSets.Item(1).ItemNumber & vbTab & Round(oBalloon.Position.X * 10, 3) & " / " & Round(oBalloon.Position.Y * 10, 3)
        sModel = oOccurrence.Name & vbTab & "Ecke1: " & dLiOb(0) + dModelToSheet(0) & " / " & dLiOb(1) + dModelToSheet(1) & vbTab & "Ecke2: " & dReUn(0) + dModelToSheet(0) & " / " & dReUn(1) + dModelToSheet(1)
        Debug.Print sBalloon
        Debug.Print sModel
    Next
End Sub

Weitere genutzte Quelle: https://adndevblog.typepad.com/manufacturing/2012/06/use-the-api-to-find-a-component-occurrence-from... 

 

Viel Spaß damit!
Gruß


Aleksandar Krstic
Produkt- und Projektmanager

Nachricht 15 von 26

edv
Participant
Participant

Hallo @fullevent ,

danke erst einmal für dein Script. In meinem Beispiel funktioniert es aber leider nicht.

Ein paar Koordinaten scheinen zu stimmen, aber der überwiegende Teil nicht.

Wenn ich dein Beispiel anschaue, verstehe ich auch einige Koordinaten nicht ganz.

Bsp: Position 2. Die Ecke sollte bei 79,423/313,287 sein. Wenn ich aber das Bild anschaue, wo die Position 2 ist (230,5/ 348,631), müsste die Koordinate 313,287 doch über der Position2=348,631 liegen?

Oder ist das das Problem mit den Achsen, das ich leider aktuell noch nicht so ganz verstehe, da ich noch ganz neu bin was Inventor überhaupt betrifft?

Die Achse sollte eigentlich gar keine Rolle spielen, da ich das erstellen bei unseren Konstrukteuren vermutlich auch nicht beeinflussen kann.

Kannst du nochmal das mit dem zweiten Ansatz "ModelToSheetSpace" versuchen?

 

 

0 „Gefällt mir“-Angaben
Nachricht 16 von 26

fullevent
Advisor
Advisor

Hallo @edv,

 

da hast du recht.. da hab ich vielleicht die falschen Punkte bzw. Koordinaten abgefragt.
Unabhängig davon.. Das Problem ist, das was du gesagt hast. Du kannst nicht beeinflussen wie der Konstrukteur das Modell in der Zeichnung positioniert. Daher weißt du gar nicht welche Ecke der Rangebox im Modell später in der Zeichnung "links oben" und welche "rechts unten" ist..

Vielleicht klappt eine Erklärung mit Bild besser 😅 Je nachdem wie die Ansicht in der Zeichnung auf das Modell liegt (hier mit verschiedenen Farben dargestellt). Wandern natürlich auch die gesuchten Punkte.

Quelle: https://adndevblog.typepad.com/manufacturing/2013/11/display-range-box-of-componenets-in-assembly-context.htmlQuelle: https://adndevblog.typepad.com/manufacturing/2013/11/display-range-box-of-componenets-in-assembly-context.html

 

Ehrlich gesagt weiß ich auf Anhieb nicht wie ich diesen Bezug erstellen soll 🤔
Ich überleg mir was..


Aleksandar Krstic
Produkt- und Projektmanager

Nachricht 17 von 26

fullevent
Advisor
Advisor

Oh man.. klar gibt es eine einfache Lösung.
Genau mit der besagten "ModelToSheetSpace" Methode..

Hol dir die Koordinaten aller 8 Punkte der Rangebox aus dem Modell. (3D-Koordinaten im Modell)

Jage sie alle durch die Methode und erhalte dadurch 8 Punkte (2D-Koordinaten auf dem Blatt). Von den 8 Punkten werden in den Zeichnungsansichten immer je 2 aufeinander liegen.. außer bei der Iso-Ansicht, aber das ist ein Sonderfall.

Die Koordinaten der 4 unterschiedlichen Punkte kannst du dann im Code vergleichen um die Ecke "linksoben" und die Ecke "rechtsunten" zu ermitteln. Das schöne dabei.. diese Koordinaten beziehen sich bereits auf die linke untere Ecke des Blatts. Also das was du eigentlich suchst.

Hilft dir der Hinweis schon um dich selber an einer Lösung zu versuchen? Ansonsten kann ich morgen bestimmt ein entsprechendes Makro erstellen um die Theorie zu testen.

 

Grüße


Aleksandar Krstic
Produkt- und Projektmanager

0 „Gefällt mir“-Angaben
Nachricht 18 von 26

edv
Participant
Participant

Hallo @fullevent ,

wäre super, wenn du das noch machen könntest.

Es reicht dann aber, wenn du einfach alle Koordinaten ausgibst, die Ecken kann ich dann selbst ermitteln.

Vielen Dank!

0 „Gefällt mir“-Angaben
Nachricht 19 von 26

fullevent
Advisor
Advisor

Alles klar. Ich hab da heute Vormittag schon was gemacht.
Viel Spaß beim Testen.

 

2020-05-27 08_56_49-Microsoft Visual Basic for Applications - Default.ivb.png

 

Code enthält keine Fehlerbehandlung..

Private Sub Blattkoordinaten_edv()
    Dim oDoc As DrawingDocument
    Set oDoc = ThisApplication.ActiveDocument
    Dim oBalloons As Balloons
    Set oBalloons = oDoc.ActiveSheet.Balloons
    Dim oBalloon As balloon
    Dim oLeader As leader
    Dim oLeaderNode As leaderNode
    Dim oIntent As GeometryIntent
    Dim oCurve As DrawingCurve
    Dim oEdgePx As EdgeProxy
    Dim oOccurrence As ComponentOccurrence
    Dim oTG As TransientGeometry
    Set oTG = ThisApplication.TransientGeometry
    Dim oBox As Box
    Dim dMin(2) As Double
    Dim dMax(2) As Double
    Dim oModelPoints(7) As Point
    Dim oSheetPoints(7) As Point2d
    Dim dSheetMax(1) As Double
    Dim dSheetMin(1) As Double

    For i = 0 To 7
        Set oModelPoints(i) = oTG.CreatePoint(0, 0, 0)
        Set oSheetPoints(i) = oTG.CreatePoint2d(0, 0)
    Next
    For Each oBalloon In oBalloons
        dSheetMax(0) = 0
        dSheetMax(1) = 0
        dSheetMin(0) = 9999
        dSheetMin(1) = 9999
        Set oLeader = oBalloon.leader
        Set oLeaderNode = oLeader.AllNodes(2)
        Set oIntent = oLeaderNode.AttachedEntity
        Set oCurve = oIntent.Geometry
        Set oEdgePx = oCurve.ModelGeometry
        Set oOccurrence = oEdgePx.ContainingOccurrence
        Set oBox = oOccurrence.RangeBox
        
        Call oBox.GetBoxData(dMin, dMax)
        
        oModelPoints(0).x = dMin(0)
        oModelPoints(0).y = dMax(1)
        oModelPoints(0).z = dMax(2)
        oModelPoints(1).x = dMax(0)
        oModelPoints(1).y = dMax(1)
        oModelPoints(1).z = dMax(2)
        oModelPoints(2).x = dMax(0)
        oModelPoints(2).y = dMin(1)
        oModelPoints(2).z = dMax(2)
        oModelPoints(3).x = dMin(0)
        oModelPoints(3).y = dMin(1)
        oModelPoints(3).z = dMax(2)
        
        oModelPoints(4).x = dMin(0)
        oModelPoints(4).y = dMax(1)
        oModelPoints(4).z = dMin(2)
        oModelPoints(5).x = dMax(0)
        oModelPoints(5).y = dMax(1)
        oModelPoints(5).z = dMin(2)
        oModelPoints(6).x = dMax(0)
        oModelPoints(6).y = dMin(1)
        oModelPoints(6).z = dMin(2)
        oModelPoints(7).x = dMin(0)
        oModelPoints(7).y = dMin(1)
        oModelPoints(7).z = dMin(2)

        For i = 0 To 7
            Set oSheetPoints(i) = oBalloon.ParentView.ModelToSheetSpace(oModelPoints(i))
        Next
        For i = 0 To 7
            If oSheetPoints(i).x > dSheetMax(0) Then dSheetMax(0) = oSheetPoints(i).x
            If oSheetPoints(i).y > dSheetMax(1) Then dSheetMax(1) = oSheetPoints(i).y
            If oSheetPoints(i).x < dSheetMin(0) Then dSheetMin(0) = oSheetPoints(i).x
            If oSheetPoints(i).y < dSheetMin(1) Then dSheetMin(1) = oSheetPoints(i).y
        Next
        
        Debug.Print "PosNr.:" & vbTab & oBalloon.BalloonValueSets.Item(1).ItemNumber & vbTab & oBalloon.Position.x & " / " & oBalloon.Position.y
        Debug.Print "Komponente:  " & oOccurrence.Name
        Debug.Print "Ecke linksoben:  " & vbTab & dSheetMin(0) & " / " & dSheetMax(1)
        Debug.Print "Ecke rechtsoben: " & vbTab & dSheetMax(0) & " / " & dSheetMax(1)
        Debug.Print "Ecke linksunten: " & vbTab & dSheetMin(0) & " / " & dSheetMin(1)
        Debug.Print "Ecke rechtsunten:" & vbTab & dSheetMax(0) & " / " & dSheetMin(1)
        Debug.Print
    Next
End Sub

 

Gruß


Aleksandar Krstic
Produkt- und Projektmanager

0 „Gefällt mir“-Angaben
Nachricht 20 von 26

edv
Participant
Participant

Hallo @fullevent ,

ich konnte dein Script nun testen.

Es sind bei mir aber nicht die Koordinaten aus der 2D- sondern aus der 3D-Zeichnung.

Die Werte aus dem Script würden anzeigen, das die Mutter noch auf der Schraube wäre, aber auf der Zeichnung wurde die Mutter versetzt zur Schraube angezeigt.

Da muss ich aber vielleicht nochmal unsere Konstrukteure fragen, wie aus 3D ein 2D wird und wie diese zusammenhängen.

_Test.png

 

Vielen Dank auf jeden Fall einmal für deine super Unterstützung und Scripte 🙂

 

0 „Gefällt mir“-Angaben