| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: IDW:(PL) Add-In-Funktin von Drittanbieter ausführen und auf Place-Funktion reagieren? (1035 mal gelesen)
|
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 723 Registriert: 06.09.2012
|
erstellt am: 01. Apr. 2020 07:33 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, wir arbeiten zukünftig mit Inventor 2020 in Verbindung mit einem PDM-System. Dieses PDM-System hat im Inventor einen eigenen Reiter sowie einen Knopf (Funktion) zum Platzieren der Stückliste aus dem PDM. Diese Stückliste sieht 1:1 aus wie eine Inventor-Stückliste, aber bekommt alles aus dem PDM und nichts von der dargestellten BG vererbt. Leider "endet" die Funktion "Stückliste aus PDM einfügen" damit, dass man mit dem Mauszeiger die X-Y-Position der Stückliste klicken muss, so dass diese auf der Zeichnung platziert werden kann. Ich kann die geschilderte Funktion mittels Command-Manager ausführen lassen. (Siehe Code-Ausschnitt unten) Jedoch habe ich das Problem, dass ich dann nicht automatisch eine X-Y-Position in VBA angeben kann, sondern immer eine Benutzer-Interaktion stattfinden muss. Wie kann ich diese "Platzier-Funktion" mittels Maus abfangen oder ähnliches, so dass keine Benutzer-Interaktion nötig ist? Public Sub insertBOMonIDW () . . . . . Dim oCommandMgr As CommandManager Set oCommandMgr = ThisApplication.CommandManager Dim oControlDef As ControlDefinition Set oControlDef = oCommandMgr.ControlDefinitions.Item("Stückliste aus PDM einfügen") Call oControlDef.Execute . . . . . End Sub Vielen Dank im Voraus für Eure Antworten. Danke und Grüße MB-Ing. ------------------ Wissen ist Macht. Nichts wissen macht auch nichts Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 723 Registriert: 06.09.2012 Inventor 2021 WIN 10 (64bit), Dell Precision T1650, 16GB (Pro.File 8.7)
|
erstellt am: 02. Apr. 2020 07:42 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, kann man im Inventor einen Klick mit der linken Maustaste simulieren? Das sieht gut aus: Public Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As LongPtr Public Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) Public Const MOUSEEVENTF_LEFTDOWN = &H2 Public Const MOUSEEVENTF_LEFTUP = &H4 Public Const MOUSEEVENTF_RIGHTDOWN As Long = &H8 Public Const MOUSEEVENTF_RIGHTUP As Long = &H10 Private Sub SingleClick() SetCursorPos 800, 600 'x and y position mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 End Sub Oder ist das richtiger Murks? Wie kann man in VBA warten bis eine andere Funktion fertig ist? Kann man mit ThisApplication.ApplicationAddIns….. abfragen, ob das Add-In schon fertig ist? Danke und Grüße MB-Ing. ------------------ Wissen ist Macht. Nichts wissen macht auch nichts Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 723 Registriert: 06.09.2012
|
erstellt am: 02. Apr. 2020 07:42 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, kann man im Inventor einen Klick mit der linken Maustaste simulieren? Das sieht gut aus: Public Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As LongPtr Public Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) Public Const MOUSEEVENTF_LEFTDOWN = &H2 Public Const MOUSEEVENTF_LEFTUP = &H4 Public Const MOUSEEVENTF_RIGHTDOWN As Long = &H8 Public Const MOUSEEVENTF_RIGHTUP As Long = &H10 Private Sub SingleClick() SetCursorPos 800, 600 'x and y position mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 End Sub Oder ist das richtiger Murks? Wie kann man in VBA warten bis eine andere Funktion fertig ist? Kann man mit ThisApplication.ApplicationAddIns….. abfragen, ob das Add-In schon fertig ist? Danke und Grüße MB-Ing. ------------------ Wissen ist Macht. Nichts wissen macht auch nichts Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 723 Registriert: 06.09.2012 Inventor 2021 WIN 10 (64bit), Dell Precision T1650, 16GB (Pro.File 8.7)
|
erstellt am: 02. Apr. 2020 07:42 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, kann man im Inventor einen Klick mit der linken Maustaste simulieren? Das sieht gut aus: Public Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As LongPtr Public Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) Public Const MOUSEEVENTF_LEFTDOWN = &H2 Public Const MOUSEEVENTF_LEFTUP = &H4 Public Const MOUSEEVENTF_RIGHTDOWN As Long = &H8 Public Const MOUSEEVENTF_RIGHTUP As Long = &H10 Private Sub SingleClick() SetCursorPos 800, 600 'x and y position mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 End Sub Oder ist das richtiger Murks? Wie kann man in VBA warten bis eine andere Funktion fertig ist? Kann man mit ThisApplication.ApplicationAddIns….. abfragen, ob das Add-In schon fertig ist? Danke und Grüße MB-Ing. ------------------ Wissen ist Macht. Nichts wissen macht auch nichts Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 723 Registriert: 06.09.2012
|
erstellt am: 02. Apr. 2020 08:57 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, sorry für den "Doppel-Post" Ist der folgende Code-Ausschnitt legitim, um zu prüfen, ob eine Stückliste existiert? Dim partListExists As Boolean partListExists = True Dim i As Integer i = 1 Do While doc.activeSheet.PartsLists.Count = 0 If i >= 50 Then partListExists = False Set oControlDef = oCommandMgr.ControlDefinitions.Item("AppContextual_CancelCmd") Call oControlDef.Execute Exit Do End If DoEvents i = i + 1 Loop If partListExists Then Danke und Grüße MB-Ing. ------------------ Wissen ist Macht. Nichts wissen macht auch nichts Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 02. Apr. 2020 09:00 <-- editieren / zitieren --> Unities abgeben: Nur für mb-ing
Zitat: Original erstellt von mb-ing: Wie kann man in VBA warten bis eine andere Funktion fertig ist?
Du kannst die ControlDefinition.Execute2 Method ausprobieren. Auszug aus der Hilfe: Zitat:
Syntax ControlDefinition.Execute2( Synchronous As Boolean ) Parameters Synchronous Input Boolean that specifies whether to execute the control definition synchronously ('Send Message') or asynchronously ('Post Message').
------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 02. Apr. 2020 09:20 <-- editieren / zitieren --> Unities abgeben: Nur für mb-ing
Zu dem Thema mit der (Klick)Position könnte man mit der CommandManager.PostPrivateEvent Method etwas rumspielen. Ich benutze das, um den Eingabedialog eines Speicherpfades o.ä. abzufangen. In der Hilfe liest es sich nicht unbedingt so, als ob das auch für einen Mauklick gedacht ist/funktioniert, aber versuchen kann man es ja trotzdem. Das mit dem Mausklick per WinAPI finde ich nicht ganz falsch. Ich meine Klick ist Klick. Ich stelle es mir nur nicht ganz einfach vor, die richtigen Koordinaten zu finden (ich gehe davon aus, dass die API Koordinaten bzgl. der "Darstellungsfläche" sprich Monitor(e) nimmt). Eine mögliche Brotkrume: Camera.ModelToViewSpace Method edit: kurz mit Camera.ModelToViewSpace rum probiert (im 3d-Modell, nicht in einer idw). -> liefert Koordinaten innerhalb des 'aktive View'. Zu Koordinaten im 'Screen Space' kommt man dann über .GetWindowExtents.
Code: Dim oView As View Set oView = ThisApplication.ActiveView Dim Top As Long, Left As Long, Height As Long, Width As Long Call oView.GetWindowExtents(Top, Left, Height, Width)
Du musst also den gewünschten Punkt im KS der Zeichnung kennen. ModelToViewSpace sollte dazu die Koordinaten im View liefern. Wenn man dann dazu noch Top bzw. Left von GetWindowExtents dazu addiert, sollten das die 'Screen'Koordinaten für den Mausklick sein. ------------------ Gruß KraBBy [Diese Nachricht wurde von KraBBy am 02. Apr. 2020 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 723 Registriert: 06.09.2012
|
erstellt am: 02. Apr. 2020 11:11 <-- editieren / zitieren --> Unities abgeben:
@KraBBy: Vielen Dank für Deine Antwort. Eigentlich muss ich nur irgendwo in der IDW auf die Zeichnungsfläche klicken. Die Stückliste schiebe ich dann mittels VBA an die richtige Stelle... Die anderen Anregungen von Dir muss ich mal ausprobieren. Danke und Grüße MB-Ing. ------------------ Wissen ist Macht. Nichts wissen macht auch nichts Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frank_Schalla Ehrenmitglied CAD_SYSTEMBETREUER
Beiträge: 1731 Registriert: 06.04.2002 DELL M6800 Cad Admin Methodikentwickler 3D
|
erstellt am: 02. Apr. 2020 16:12 <-- editieren / zitieren --> Unities abgeben: Nur für mb-ing
finde einen Punkt der dir gefällt Dim oTG As TransientGeometry oTG = ThisApplication.TransientGeometry oSketchedSymbol = oTG.CreatePoint2d(15, 5), 0, 1) ------------------ ************************************ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 723 Registriert: 06.09.2012
|
erstellt am: 15. Apr. 2020 08:10 <-- editieren / zitieren --> Unities abgeben:
|
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 723 Registriert: 06.09.2012 Inventor 2021 WIN 10 (64bit), Dell Precision T1650, 16GB (Pro.File 8.7)
|
erstellt am: 15. Apr. 2020 08:21 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von KraBBy: Zu dem Thema mit der (Klick)Position könnte man mit der CommandManager.PostPrivateEvent Method etwas rumspielen. Ich benutze das, um den Eingabedialog eines Speicherpfades o.ä. abzufangen. In der Hilfe liest es sich nicht unbedingt so, als ob das auch für einen Mauklick gedacht ist/funktioniert, aber versuchen kann man es ja trotzdem.
@Krabby: Habe mir dazu die Hilfe durchgelesen und die Funktion greift nur aufs Clipboard zu, oder? Wie kann ich da die Brücke zum Mausklick schlagen? ^^ Danke und Grüße MB-Ing. ------------------ Wissen ist Macht. Nichts wissen macht auch nichts Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 15. Apr. 2020 13:25 <-- editieren / zitieren --> Unities abgeben: Nur für mb-ing
Der Gedanke war, vor dem execute des "Stücklisten einfügen", die Position in das interne clipboard zu legen (über das post private event). Damit die Hoffnung, dass der Klick erst gar nicht nötig ist. Wie schon geschrieben, verspreche ich mir davon nicht viel. Aber wer weiß... 🙄 ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 723 Registriert: 06.09.2012
|
erstellt am: 15. Apr. 2020 16:50 <-- editieren / zitieren --> Unities abgeben:
|
RolandD Mitglied
Beiträge: 533 Registriert: 07.01.2005 i7-9700k 32GB DDR4-RAM Nvidia RTX 2060 SSD 970 m.2 Win10-64 (21H2) AIP 2020.3 Dell U3417W
|
erstellt am: 15. Apr. 2020 17:57 <-- editieren / zitieren --> Unities abgeben: Nur für mb-ing
Zitat: Original erstellt von mb-ing: ..Wie bekomme ich einen Point2D in den Befehl?
Du könntest den Punkt rechts oben vom Schriftfeld nehmen:
Code: Dim oSheet As Sheet oSheet = oDoc.ActiveSheet Dim oTitleBlockPoint As Point2d If Not oSheet.TitleBlock Is Nothing Then 'TitleBlock existiert. SL rechts oben ausrichten oTitleBlockPoint = oSheet.TitleBlock.RangeBox.MaxPoint Else 'kein TitleBlock vorhanden. MsgBox("kein Schriftfeld zum Ausrichten der SL vorhanden") Exit Sub End If 'oSheet.TitleBlock Is Nothing
Oder eben feste Koordinaten nutzen:
Code: Dim Pkt As Point2d = invApp.TransientGeometry.CreatePoint2d(0, 0)
------------------ Gruß Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 723 Registriert: 06.09.2012
|
erstellt am: 16. Apr. 2020 07:10 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von RolandD:
Du könntest den Punkt rechts oben vom Schriftfeld nehmen:
Code: Dim oSheet As Sheet oSheet = oDoc.ActiveSheet Dim oTitleBlockPoint As Point2d If Not oSheet.TitleBlock Is Nothing Then 'TitleBlock existiert. SL rechts oben ausrichten oTitleBlockPoint = oSheet.TitleBlock.RangeBox.MaxPoint Else 'kein TitleBlock vorhanden. MsgBox("kein Schriftfeld zum Ausrichten der SL vorhanden") Exit Sub End If 'oSheet.TitleBlock Is Nothing
Oder eben feste Koordinaten nutzen:
Code: Dim Pkt As Point2d = invApp.TransientGeometry.CreatePoint2d(0, 0)
@Roland: Danke für Deine Antwort. Wie kann ich den oSheet.TitleBlock.RangeBox.MaxPoint in Pixel umrechnen, so dass ich meine Klick-Position erhalte? Hierzu habe ich folgendes gefunden, aber das berücksichtigt nicht zwei Bildschirme... https://forums.autodesk.com/t5/inventor-customization/how-to-get-the-pixel-coordinates-of-the-sketch-point-on-the/td-p/8119360 Der post private event klappt leider nicht, da ich hier keine Koordinaten einlesen kann Ich will es nun so machen, dass ich die ZN einpasse dann vom Schriftkopf eine Position auslesen möchte und diese "anklicke". Anschließend wird die Stüli einfach dort positioniert und dann wieder zu der alten Position verschoben. Aber leider brauche ich hierzu immer die "Pixel-Koordinaten. Ich muss berücksichtigen, dass das Makro ausgeführt wird, wenn zwei Bildschirme vorhanden sind, Inventor nicht maximiert ist, etc. Deswegen ist es vermutlich sinnvoll die ZN vorab einzupassen und eine Position am Schriftkopf auszulesen. Danke und Grüße MB-Ing. ------------------ Wissen ist Macht. Nichts wissen macht auch nichts Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 16. Apr. 2020 09:24 <-- editieren / zitieren --> Unities abgeben: Nur für mb-ing
Das mit den Pixel Koordinaten habe ich oben schon angesprochen. Vorher so zu zoomen, dass alles sichtbar ist, ist ein guter Plan. Dann sollte es auch keinen Unterschied machen, ob das IV Fenster maximiert ist oder nicht. Mehrere Monitore sollte sich auch ergeben, da es für den klick 'eine Fläche' ist (1 KS das sich über beide Monitore erstreckt) ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 723 Registriert: 06.09.2012
|
erstellt am: 16. Apr. 2020 10:10 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, perfekt, jetzt passt es. Top und Left addieren dann klappt es auch mit dem Nachbarn Vielen herzlichen Dank an alle! Danke und Grüße MB-Ing. ------------------ Wissen ist Macht. Nichts wissen macht auch nichts Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RolandD Mitglied
Beiträge: 533 Registriert: 07.01.2005 i7-9700k 32GB DDR4-RAM Nvidia RTX 2060 SSD 970 m.2 Win10-64 (21H2) AIP 2020.3 Dell U3417W
|
erstellt am: 16. Apr. 2020 10:10 <-- editieren / zitieren --> Unities abgeben: Nur für mb-ing
|
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 723 Registriert: 06.09.2012
|
erstellt am: 16. Apr. 2020 10:13 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von RolandD: Wie wäre das: 1. an beliebige Stelle (z.B. 0,0) platzieren lassen 2. mit VBA auf die gewünschte Position verschieben
Hallo Roland, danke für Deine Antwort. Leider geht das nicht, da das Add-In des Drittanbieters explizit einen Klick mit der linken Maustaste auf eine Position in der Zeichnung erwartet. Bevor das nicht erfolgt ist, wird keine Stückliste aus dem PLM auf der ZN platziert... Danke und Grüße MB-Ing.
------------------ Wissen ist Macht. Nichts wissen macht auch nichts Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |