| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | Bechtle Competence Days | Online |
Autor
|
Thema: API - Zeichenansicht als TIFF in Excel einfügen (1821 mal gelesen)
|
AlexSchaaf Mitglied
Beiträge: 21 Registriert: 23.09.2014 SWX 2014 SP5
|
erstellt am: 13. Okt. 2014 16:00 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum! Wir haben uns in der Firma dazu entschieden, die Stücklisten von den Zeichnungen zu entfernen, da diese einfach zu viel platz weg nehmen. Also habe ich mich dran gesetzt, einen einfachen Weg zu finden wie wir die Stücklisten in Excel exportieren können und das ganze noch Ansehnlich bleibt. Ich habe daraufhin Excel Vorlagen erstellt die ich mit Informationen aus SolidWorks heraus fülle. Auf dem Titelblatt der Stückliste soll die angewählte Zeichenansicht eingefügt werden. Dazu hatte ich mir folgende Prozedur überlegt: Zeichenansicht kopieren, neues temporäres Blatt einfügen, Zeichenansicht drauf, alle Bemaßungen/Beschriftungen weg, als TIFF abspeichern und fertig. Leider wird das TIFF immer so groß abgespeichert, wie der Benutzer die Arbeitsfläche in Solid definiert hat -> kleine Arbeitsfläche kleines Bild. Dazu kommt, dass wenn das Ausgabeformat der TIFF nicht immer gleich groß ist, die Grafik in Excel nicht korrekt positioniert werden kann. Diese rutscht dann mal gerne auf ein zweites Blatt über. Nun meine Frage: Habt ihr eine Idee, wie ich von einer Zeichenansicht ein Bild bekomme, das immer in der selben größe ausgegeben wird? Mein Quellcode ist im Anhang. Verzeiht mir die dortige unordnung, aber es ist ja noch nicht fertig =) Gestartet wird direkt aus der UserForm heraus. Gruß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HenryV Mitglied Konstrukteur, Engineering
Beiträge: 813 Registriert: 18.05.2005 SolidWorks 2022 x64 SP5.0 Dell Precision 5820 Intel Xeon W-2125 4x4GHz NVIDIA Quadro P2000 5GB 32GB RAM 2x Dell U2412M, 24" TFT Windows 10 Enterprise x64 22H2 Microsoft 365 E5 Microsoft Visual Studio Enterprise 2022
|
erstellt am: 13. Okt. 2014 17:18 <-- editieren / zitieren --> Unities abgeben: Nur für AlexSchaaf
|
AlexSchaaf Mitglied
Beiträge: 21 Registriert: 23.09.2014 SWX 2014 SP5
|
erstellt am: 14. Okt. 2014 07:18 <-- editieren / zitieren --> Unities abgeben:
Hallo HenryV, Die Einstellungen kenne ich mittlerweile Auswendig. Die "Print" option bei TIFF hat das Problem, dass die Zeichenansichten auf das blatt passen müssen. Ich generiere ein neues blatt mit den Maßen 1mmx1mm damit man auf dem Bild keinen Rand sieht. So ist das Blatt immer so klein, dass man es im Bild nicht sieht. Wenn ich also z.b. ein A4 Print versuche, muss ich die Ansicht erst auf ein A4 Blatt anpassen. Gruß Alex Edit:
Ich habe jetzt die Methode swView.GetOutline benutzt um den Rahmen der Zeichenansicht zu bekommen. Das neue Blatt wird nun nach dem Rückgabewert der Outline angepasst. Allerdings ist auch hier wieder das Problem die Zeichenansicht Mittig ins Blatt einzufügen. Dabei habe ich wieder den selben workaround benutzt wie vorher, ich selektiere die Zeichenansicht mit .SelectByID2 erneut an den Koordinaten X=(vOutline(2) + vOutline(0))und Y=(vOutline(1) =(vOutline(3) + vOutline(1)). Kann mir irgend jemand bestätigen, dass der Nullpunkt einer Ansicht sich in der Mitte befindet und nicht unten links? Gibt es hierfür eventuell eine elegantere Lösung? Ich habe bemerkt, dass die Print TIF option unabhängig vom gezeichneten Blattformat die Ausgabe immer perfekt auf das Blatt anpasst, deshalb versuche ich es nun auf diesem Weg. Edit 2:
Sehe ich das richtig, dass .GetOutline(0) bzw. GetOutline(1) die Postition der linken unteren Ecke der Ansicht relativ zum Blatturpsrung zurück geben, GetOutline(2) bzw. GetOutline(3) die obere rechte Ecke der Ansicht? Wenn dem wirklich so ist, muss die wahre Ansichtsgröße doch X=(vOutline(2) + vOutline(0)) breit und Y=(vOutline(3) + vOutline(1)) hoch sein? Leider ist dem nicht so. Kann mir jemand erklären, wie diese Funktion zu benutzen ist? [Diese Nachricht wurde von AlexSchaaf am 14. Okt. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AlexSchaaf Mitglied
Beiträge: 21 Registriert: 23.09.2014 SWX 2014 SP5
|
erstellt am: 14. Okt. 2014 11:27 <-- editieren / zitieren --> Unities abgeben:
Hallo, Ich habe es geschafft! Code:
'Mit dieser Funktion stelle ich auf das vOutline Array pos 0 und 1 die wahren Aussenmaße. Private Function paperSize(swView As SldWorks.View, ByRef vOutline As Variant) vOutline = swView.GetOutline vOutline(0) = (vOutline(2) - (vOutline(0))) vOutline(1) = (vOutline(3) - (vOutline(1))) End Function
anschließend selektiere ich die mitte mithilfe von Code: swModel.Extension.SelectByID2 swView.Name, "DRAWINGVIEW", (vOutline(0) / 2), (vOutline(1) / 2), 0, False, 0, Nothing, 0
Die Blattgröße ist dann einfach vOutline(0) x vOutline(1) und fertig. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HenryV Mitglied Konstrukteur, Engineering
Beiträge: 813 Registriert: 18.05.2005 SolidWorks 2022 x64 SP5.0 Dell Precision 5820 Intel Xeon W-2125 4x4GHz NVIDIA Quadro P2000 5GB 32GB RAM 2x Dell U2412M, 24" TFT Windows 10 Enterprise x64 22H2 Microsoft 365 E5 Microsoft Visual Studio Enterprise 2022
|
erstellt am: 14. Okt. 2014 12:14 <-- editieren / zitieren --> Unities abgeben: Nur für AlexSchaaf
Hallo Alex Hab es auch noch mal genauer angeschaut. Hier mein Code (Dieser Speichert die selektierte Ansicht als 100x100mm Tiff ab) Code: Option ExplicitDim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swDraw As SldWorks.DrawingDoc Dim swView As SldWorks.View Dim vOutline As Variant Dim vPos As Variant Dim boolstatus As Boolean Dim nErrors As Long Dim nWarnings As Long Dim sPartTemplateName As String Dim sPathName As String Sub main() Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc Set swDraw = swModel Set swView = swDraw.ActiveDrawingView If swView Is Nothing Then Exit Sub 'Anisicht kopieren swDraw.EditCopy 'Neues Blatt erstellen sPartTemplateName = swApp.GetUserPreferenceStringValue(swDefaultTemplateDrawing) vOutline = swView.GetOutline boolstatus = swDraw.NewSheet3("Tiff", 12, 12, 1, 1, True, sPartTemplateName, vOutline(2) - vOutline(0), vOutline(3) - vOutline(1), "Standard") boolstatus = swModel.Extension.SelectByID2("Tiff", "SHEET", 0, 0, 0, False, 0, Nothing, 0) 'Anisicht einfügen swDraw.Paste 'Anisicht verschieben Set swView = swDraw.GetFirstView Set swView = swView.GetNextView vPos = swView.Position vPos(0) = (vOutline(2) - vOutline(0)) / 2 vPos(1) = (vOutline(3) - vOutline(1)) / 2 swView.Position = vPos swModel.GraphicsRedraw2 'Tiff Optionen setzen boolstatus = swApp.SetUserPreferenceIntegerValue(swTiffImageType, 0) boolstatus = swApp.SetUserPreferenceIntegerValue(swTiffCompressionScheme, 2) boolstatus = swApp.SetUserPreferenceIntegerValue(swTiffScreenOrPrintCapture, 1) swApp.SetUserPreferenceToggle swTiffPrintAllSheets, False swApp.SetUserPreferenceToggle swTiffPrintUseSheetSize, False boolstatus = swApp.SetUserPreferenceIntegerValue(swTiffPrintDPI, 200) boolstatus = swApp.SetUserPreferenceIntegerValue(swTiffPrintPaperSize, swDwgPapersUserDefined) boolstatus = swApp.SetUserPreferenceDoubleValue(swTiffPrintDrawingPaperWidth, 0.1) boolstatus = swApp.SetUserPreferenceDoubleValue(swTiffPrintDrawingPaperHeight, 0.1) swApp.SetUserPreferenceIntegerValue swTiffPrintScaleToFit, True sPathName = swModel.GetPathName If sPathName <> "" Then 'Zusammenstellen des Speichernnamens If UCase(Right(sPathName, 7)) = ".SLDDRW" Then sPathName = Left(sPathName, Len(sPathName) - 7) & ".tif" Else sPathName = sPathName & ".tif" End If Else sPathName = "c:\Temp\Zeichnung.tif" End If 'Abspeichern des Files boolstatus = swModel.SaveAs4(sPathName, swSaveAsCurrentVersion, swSaveAsOptions_Silent, nErrors, nWarnings) 'Blatt löschen boolstatus = swModel.Extension.SelectByID2("Tiff", "SHEET", 0, 0, 0, False, 0, Nothing, 0) swModel.DeleteSelection (False) End Sub
Gruss Andreas
------------------ 21 ist nur die halbe Antwort. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AlexSchaaf Mitglied
Beiträge: 21 Registriert: 23.09.2014 SWX 2014 SP5
|
erstellt am: 14. Okt. 2014 13:08 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas, erstmal vielen Dank für deine Hilfe.Das Ergebnis ist bei deiner als auch bei meiner Funktion letztendlich das gleiche. Ich selektiere die ansicht auf dem Punkt, an den du sie verschiebst, was nach dem einfügen/verschieben das selbe Ergebnis liefert. Leider musste ich feststellen, dass es nicht immer funktioniert. Ich kann es mir nicht erklären. Bei 80% der Zeichenansichten funktioniert diese Berechnung der Position. Im Anhang findest du eine der Problemansichten, einmal als Screenshot mit angezeigtem Ansichtsrahmen und einmal als TIF ausgabe. Falls du eine Idee hast, woran das liegen kann, wäre ich dir sehr dankbar! Das Problem tritt sowohl bei deiner als auch bei meiner Funktion auf, und zwar mit identischen Abweichungen. Gruß Alex Edit: Ich habe die Problemansichten mal genau Analysiert. Die Ausgangsansicht, von der also kopiert wird, wird korrekt ausgelesen und auch die Maße für das Blattformat werden demnach korrekt eingestellt. In dem Moment, in dem die Ansicht eingefügt wird, ändert sich die Größe! Vor dem kopieren hatte die Ansicht im Anhang Maße von 712,114618671435mm x 603,349370140365mm. Nach diesen Maßen wird dann das Blatt erstellt. Wenn daraufhin dann die Zeichnung eingefügt wird, hat die Ansicht nur noch die Maße 702,60859347705mm x 593,84334494598mm. Wie kann das zustande kommen? Der Maßstab wurde nicht verändert, die Beschriftungen werden mit kopiert. Ich sehe keinen grund warum die Ansicht ihre größe ändern sollte bzw. dies überhaupt kann. [Diese Nachricht wurde von AlexSchaaf am 14. Okt. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AlexSchaaf Mitglied
Beiträge: 21 Registriert: 23.09.2014 SWX 2014 SP5
|
erstellt am: 28. Okt. 2014 14:59 <-- editieren / zitieren --> Unities abgeben:
Hat keiner eine Idee, wieso sich die Ansichten nach dem Kopieren in der Größe verändern? Oder ist das vielleicht eine einstellungssache? Leider werden immer mehr Stücklisten bei uns mit leicht abgeschnittenen Bildern generiert, weshalb ich über eine Lösung sehr froh wäre. Gruß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|