Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  API - Stückliste auf automatische Spaltenbreite setzen

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 SOLIDWORKS
  
FMB
Autor Thema:  API - Stückliste auf automatische Spaltenbreite setzen (3521 mal gelesen)
Andi Beck
Ehrenmitglied V.I.P. h.c.
Konstrukteur



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

Beiträge: 2572
Registriert: 02.10.2006

Firma: SW 2023-4.0 + PDM Prof.
Windows 10 Pro 64bit, i9-11900
32 GbRAM, Quadro P2200
Home:
SW 2022-5.0
Passungstabelle von Heinz
Windows 11 Pro 64bit,
i7-12700K, 32 GbRAM,
GeForce GTX 1050Ti
Samsung C34H892, 3440x1440 Pixel

erstellt am: 25. Mrz. 2018 15: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

Hallo,
ich bin gerade an einem Makro dran, welches mir eine vorhandene Stückliste nach der verwendeten Konfig aktualisiert und die Zeilen sortiert.
Jetzt suche ich noch den passenden Befehl, der mir die Spalten auf die automatische max. Spaltenbreite einstellt, ich finde aber keinen passenden Schnipsel dazu. 
Also entsprechend dem Doppelklick auf die Trennlinie zweier Spalten.

Momentan kann ich mit diesem Code eine feste (40 mm) Spaltenbreite einstellen:

Code:

Dim swBomFeat      As SldWorks.BomFeature
Dim vTables        As Variant
Dim swBomTable      As SldWorks.BomTableAnnotation
Dim boolstatus      As Boolean

swBomFeat.SetConfigurations False, vConfVis, vConfNames
vTables = swBomFeat.GetTableAnnotations
Set swBomTable = vTables(0)

boolstatus = swBomTable.SetColumnWidth(-2, 0.04, 0)  'Spaltenbreite auf 40 mm Breite einstellen


Hat jemand eine Idee, ob dies überhaupt per Makro funktioniert?

Grüße, Andi 

------------------
Hast du kein Problem?
Such dir eins. ( Und löse es )

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

Torsten Niemeier
Ehrenmitglied V.I.P. h.c.
Maschinenbau Ingenieur



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

Beiträge: 3682
Registriert: 21.06.2001

"ZUSE I.36", 8 BIT, 32 Lämpchen, Service-Ölkännchen "ESSO-Super", Software: AO auf Kuhlmann-Parallelogramm-Plattform
** CSWP 04/2011 **
** CSWE 08/2011 **

erstellt am: 25. Mrz. 2018 17:58    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 Andi Beck 10 Unities + Antwort hilfreich

Moin.

Ich finde nicht mal Hinweise, warum Dein SetColumnWidth überhaupt geht. 

Aber wenn ja, was macht dann dieser Befehl?


http://help.solidworks.com/2018/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.ITableAnnotation~SetLockColumnWidth.html


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

Andi Beck
Ehrenmitglied V.I.P. h.c.
Konstrukteur



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

Beiträge: 2572
Registriert: 02.10.2006

Firma: SW 2023-4.0 + PDM Prof.
Windows 10 Pro 64bit, i9-11900
32 GbRAM, Quadro P2200
Home:
SW 2022-5.0
Passungstabelle von Heinz
Windows 11 Pro 64bit,
i7-12700K, 32 GbRAM,
GeForce GTX 1050Ti
Samsung C34H892, 3440x1440 Pixel

erstellt am: 25. Mrz. 2018 18:33    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


Lock-Stueckliste.jpg

 
Hallo Torsten,
mein Hinweis kommt von hier.

http://help.solidworks.com/2017/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.itableannotation~setcolumnwidth.html?verRedirect=1


Der Lock Befehl sperrt doch tatsächlich die Spalte.
Schaue das Bild an, da wird der Cursor zum Verboten-Schild und die Spalte lässt sich nicht mehr verändern, witzig.

Also noch nicht das richtige, aber Danke für deine Mühen.

Grüße, Andi 

------------------
Hast du kein Problem?
Such dir eins. ( Und löse es )

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

nahe
Ehrenmitglied



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

Beiträge: 1747
Registriert: 18.01.2001

arbeite mit:
Dell Precision 7750
i7 2,6 GHz 6 Kerne
32GB RAM
512GB SSD
NVIDIA Quadro RTX 4000
------------------------
SWX-2020 SP5.0
EPDM
----------------
Windows 10
----------------
VB.net
VB
VBA
ein wenig Swift am Mac

erstellt am: 26. Mrz. 2018 10:45    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 Andi Beck 10 Unities + Antwort hilfreich

Hallo Andi,

direkt über einen SWX-Api-Aufruf habe ich auch nichts gefunden,
aber anbei ein Link, was ich zu dem Thema gefunden habe

https://stackoverflow.com/questions/5012465/vb-macro-string-width-in-pixel

Du müsstest halt dann noch den Font-Namen und Größe anpassen

Ich habe aber nicht geprüft ob das für SWX richtige Werte liefert.

------------------
Grüße
Heinz

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

Andi Beck
Ehrenmitglied V.I.P. h.c.
Konstrukteur



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

Beiträge: 2572
Registriert: 02.10.2006

Firma: SW 2023-4.0 + PDM Prof.
Windows 10 Pro 64bit, i9-11900
32 GbRAM, Quadro P2200
Home:
SW 2022-5.0
Passungstabelle von Heinz
Windows 11 Pro 64bit,
i7-12700K, 32 GbRAM,
GeForce GTX 1050Ti
Samsung C34H892, 3440x1440 Pixel

erstellt am: 26. Mrz. 2018 10:59    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

Hallo Heinz,
danke schön für deinen Beitrag, aber wenn ich das richtig sehe, bezieht sich dieser Thread auf Excel.
Für Excel kenne ich die entsprechende Funktion.

Code:

xlWs.UsedRange.EntireColumn.AutoFit    'Spaltenbreite automatisch anpassen

Aber bei diesem Problem befinde ich mich bei einer Stückliste auf einer SW-Zeichnung, sorry, wenn das nicht klar war.

Grüße, Andi

------------------
Hast du kein Problem?
Such dir eins. ( Und löse es )

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

nahe
Ehrenmitglied



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

Beiträge: 1747
Registriert: 18.01.2001

arbeite mit:
Dell Precision 7750
i7 2,6 GHz 6 Kerne
32GB RAM
512GB SSD
NVIDIA Quadro RTX 4000
------------------------
SWX-2020 SP5.0
EPDM
----------------
Windows 10
----------------
VB.net
VB
VBA
ein wenig Swift am Mac

erstellt am: 26. Mrz. 2018 11:20    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 Andi Beck 10 Unities + Antwort hilfreich

Hallo Andi,

ich hab Dich schon richtig verstanden

Ich meinte auch die Lösung die als Antwort gepostet wurde
damit liefert Dir

"getLabelPixel(String)"

einen Breitenwert, den Du dann als Breite für die Spalte verwenden kannst
Natürlich musst Du zuerst den längsten Text bestimmen.

Etwas umständlich, aber sonst habe ich in SWX dazu, bis jetzt, nichts gefunden

#If VBA7 Then
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
    Private Declare PtrSafe Function CreateDC Lib "gdi32.dll" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As Long) As Long
    Private Declare PtrSafe Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
    Private Declare PtrSafe Function CreateFontIndirect Lib "gdi32.dll" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
    Private Declare PtrSafe Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
    Private Declare PtrSafe Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
    Private Declare PtrSafe Function GetTextExtentPoint32 Lib "gdi32.dll" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As SIZE) As Long
    Private Declare PtrSafe Function MulDiv Lib "kernel32.dll" (ByVal nNumber As Long, ByVal nNumerator As Long, ByVal nDenominator As Long) As Long
    Private Declare PtrSafe Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
    Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32.dll" (ByVal hdc As Long, ByVal nIndex As Long) As Long
    Private Declare PtrSafe Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
#Else
    Private Declare Function CreateDC Lib "gdi32.dll" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As Long) As Long
    Private Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
    Private Declare Function CreateFontIndirect Lib "gdi32.dll" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
    Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
    Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
    Private Declare Function GetTextExtentPoint32 Lib "gdi32.dll" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As SIZE) As Long
    Private Declare Function MulDiv Lib "kernel32.dll" (ByVal nNumber As Long, ByVal nNumerator As Long, ByVal nDenominator As Long) As Long
    Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
    Private Declare Function GetDeviceCaps Lib "gdi32.dll" (ByVal hdc As Long, ByVal nIndex As Long) As Long
    Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
#End If

Private Const LOGPIXELSY As Long = 90

Private Type LOGFONT
    lfHeight As Long
    lfWidth As Long
    lfEscapement As Long
    lfOrientation As Long
    lfWeight As Long
    lfItalic As Byte
    lfUnderline As Byte
    lfStrikeOut As Byte
    lfCharSet As Byte
    lfOutPrecision As Byte
    lfClipPrecision As Byte
    lfQuality As Byte
    lfPitchAndFamily As Byte
    lfFaceName As String * 32
End Type

Private Type FNTSIZE
    cx As Long
    cy As Long
End Type


Public Function GetLabelPixelWidth(label As String) As Integer

    Dim font As New StdFont
    Dim sz As FNTSIZE
    font.Name = "Arial Narrow"
    font.Size = 9.5

    sz = GetLabelSize(label, font)
    getLabelPixelWidth = sz.cx

End Function


Public Function GetStringPixelHeight(text As String, fontName As String, fontSize As Single, Optional isBold As Boolean = False, Optional isItalics As Boolean = False) As Integer

    Dim font As New StdFont
    Dim sz As FNTSIZE
    font.Name = fontName
    font.Size = fontSize
    font.Bold = isBold
    font.Italic = isItalics

    sz = GetLabelSize(text, font)
    GetStringPixelWidth = sz.cy

End Function


Public Function GetStringPixelWidth(text As String, fontName As String, fontSize As Single, Optional isBold As Boolean = False, Optional isItalics As Boolean = False) As Integer

    Dim font As New StdFont
    Dim sz As FNTSIZE
    font.Name = fontName
    font.Size = fontSize
    font.Bold = isBold
    font.Italic = isItalics

    sz = GetLabelSize(text, font)
    GetStringPixelWidth = sz.cx

End Function


Private Function GetLabelSize(text As String, font As StdFont) As FNTSIZE
    Dim tempDC As Long
    Dim tempBMP As Long
    Dim f As Long
    Dim lf As LOGFONT
    Dim textSize As FNTSIZE

    ' Create a device context and a bitmap that can be used to store a
    ' temporary font object
    tempDC = CreateDC("DISPLAY", vbNullString, vbNullString, ByVal 0)
    tempBMP = CreateCompatibleBitmap(tempDC, 1, 1)

    ' Assign the bitmap to the device context
    DeleteObject SelectObject(tempDC, tempBMP)

    ' Set up the LOGFONT structure and create the font
    lf.lfFaceName = font.Name & Chr$(0)
    lf.lfHeight = -MulDiv(font.Size, GetDeviceCaps(GetDC(0), 90), 72) 'LOGPIXELSY
    lf.lfItalic = font.Italic
    lf.lfStrikeOut = font.Strikethrough
    lf.lfUnderline = font.Underline
    If font.Bold Then lf.lfWeight = 800 Else lf.lfWeight = 400
    f = CreateFontIndirect(lf)

    ' Assign the font to the device context
    DeleteObject SelectObject(tempDC, f)

    ' Measure the text, and return it into the textSize SIZE structure
    GetTextExtentPoint32 tempDC, text, Len(text), textSize

    ' Clean up (very important to avoid memory leaks!)
    DeleteObject f
    DeleteObject tempBMP
    DeleteDC tempDC
    ' Return the measurements
    GetLabelSize = textSize

End Function

------------------
Grüße
Heinz

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

Andi Beck
Ehrenmitglied V.I.P. h.c.
Konstrukteur



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

Beiträge: 2572
Registriert: 02.10.2006

Firma: SW 2023-4.0 + PDM Prof.
Windows 10 Pro 64bit, i9-11900
32 GbRAM, Quadro P2200
Home:
SW 2022-5.0
Passungstabelle von Heinz
Windows 11 Pro 64bit,
i7-12700K, 32 GbRAM,
GeForce GTX 1050Ti
Samsung C34H892, 3440x1440 Pixel

erstellt am: 27. Mrz. 2018 01:13    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

Hallo Heinz,
bei dieser Zeile bekomme ich eine Fehlermeldung "Benutzerdefinierter Typ nicht definiert"

Code:

Private Declare PtrSafe Function GetTextExtentPoint32 Lib "gdi32.dll" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As Size) As Long

Ich schätze lpSize As Size macht hier Probleme.
Als Variant deklariert, bekomme ich auch Ärger.

Hast du eine Idee, woran das liegen kann?
Wenn ich die Zeile auskommentiere, bekomme ich im Code weiter unten Probleme, wird also benötigt.

Grüße, Andi  

------------------
Hast du kein Problem?
Such dir eins. ( Und löse es )

[Diese Nachricht wurde von Andi Beck am 27. Mrz. 2018 editiert.]

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

nahe
Ehrenmitglied



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

Beiträge: 1747
Registriert: 18.01.2001

arbeite mit:
Dell Precision 7750
i7 2,6 GHz 6 Kerne
32GB RAM
512GB SSD
NVIDIA Quadro RTX 4000
------------------------
SWX-2020 SP5.0
EPDM
----------------
Windows 10
----------------
VB.net
VB
VBA
ein wenig Swift am Mac

erstellt am: 27. Mrz. 2018 07:23    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 Andi Beck 10 Unities + Antwort hilfreich


tw.zip

 
Hallo Andi,

schläfst Du eigentlich auch mal? (Antwort um 01:13)

Also bei mir funktioniert das unter SWX 2016 SP5.0
Ich hab das Makro auch angehängt

------------------
Grüße
Heinz

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

Andi Beck
Ehrenmitglied V.I.P. h.c.
Konstrukteur



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

Beiträge: 2572
Registriert: 02.10.2006

Firma: SW 2023-4.0 + PDM Prof.
Windows 10 Pro 64bit, i9-11900
32 GbRAM, Quadro P2200
Home:
SW 2022-5.0
Passungstabelle von Heinz
Windows 11 Pro 64bit,
i7-12700K, 32 GbRAM,
GeForce GTX 1050Ti
Samsung C34H892, 3440x1440 Pixel

erstellt am: 27. Mrz. 2018 08:00    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

Zitat:
Original erstellt von nahe:

schläfst Du eigentlich auch mal?  nofrown:Antwort um 01:13)

Moin Heinz,
jo, zwischen den Zeilen, grins.....

Ich glaube, in deinem Zip-Ordner ist nix drin und du bist noch nicht wach. 

Grüße, Andi 

------------------
Hast du kein Problem?
Such dir eins. ( Und löse es )

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

nahe
Ehrenmitglied



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

Beiträge: 1747
Registriert: 18.01.2001

arbeite mit:
Dell Precision 7750
i7 2,6 GHz 6 Kerne
32GB RAM
512GB SSD
NVIDIA Quadro RTX 4000
------------------------
SWX-2020 SP5.0
EPDM
----------------
Windows 10
----------------
VB.net
VB
VBA
ein wenig Swift am Mac

erstellt am: 27. Mrz. 2018 10: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 Nur für Andi Beck 10 Unities + Antwort hilfreich


tw.zip

 
Hallo Andreas,

2. Versuch

------------------
Grüße
Heinz

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

Andi Beck
Ehrenmitglied V.I.P. h.c.
Konstrukteur



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

Beiträge: 2572
Registriert: 02.10.2006

Firma: SW 2023-4.0 + PDM Prof.
Windows 10 Pro 64bit, i9-11900
32 GbRAM, Quadro P2200
Home:
SW 2022-5.0
Passungstabelle von Heinz
Windows 11 Pro 64bit,
i7-12700K, 32 GbRAM,
GeForce GTX 1050Ti
Samsung C34H892, 3440x1440 Pixel

erstellt am: 28. Mrz. 2018 00:19    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

Hallo Heinz,
jetzt habe ich den Fehler gefunden.
Der verbarg sich im Schreibfehler in deinem obigen veröffentlichen Massen-Code.

Code:

Private Type FNTSIZE  ' ist falsch, muss heißen "Private Type SIZE"
    cx As Long
    cy As Long
End Type

Nun kann ich hier mal weiter rumprobieren, aber widerwillig, nur weil der passende Befehl hier fehlt.

Grüße, Andi 

------------------
Hast du kein Problem?
Such dir eins. ( Und löse es )

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

Andi Beck
Ehrenmitglied V.I.P. h.c.
Konstrukteur



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

Beiträge: 2572
Registriert: 02.10.2006

Firma: SW 2023-4.0 + PDM Prof.
Windows 10 Pro 64bit, i9-11900
32 GbRAM, Quadro P2200
Home:
SW 2022-5.0
Passungstabelle von Heinz
Windows 11 Pro 64bit,
i7-12700K, 32 GbRAM,
GeForce GTX 1050Ti
Samsung C34H892, 3440x1440 Pixel

erstellt am: 07. Apr. 2018 13:39    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

Zitat:
Original erstellt von Andi Beck:

Nun kann ich hier mal weiter rumprobieren, aber widerwillig, nur weil der passende Befehl hier fehlt.

Hallo Heinz,
ich habe nun (mit Schwierigkeiten) einen brauchbaren Code aus deinem obigen Beispiel zusammengebastelt.
Diese Routine gibt nur ungenaue Werte zurück, welche nicht dem tatsächlich Möglichen entspricht.

Nach langem rumprobieren habe ich folgende Vorgehensweise gewählt:

- beim auslesen der verwendeten Schriftgröße darf nicht nach Pt sondern muss nach mm ausgelesen werden.
  Erst dann muss von mm nach Pt umgerechnet werden. (Gibt sonst zu grobe Werte)

- Bei der Verwendung der obigen Routine vergrößere ich zunächst die verwendete Schriftgröße um den Faktor 1000,
  um anschließend das Ergebnis wieder um den gleichen Wert zu verkleinern. (Gibt genauere Werte zurück)

- Das erhaltene Ergebnis muss zum Schluss noch in mm umgerechnet werden.
  Leider hat sich hier kein passender pauschaler Wert gefunden.
  3.76 für dpt bzw. 3.527 für pt bzw. 3.51 für ppt bzw. 2.5683186 für SolidWorks passen nicht
  Ich habe mir für jede Schriftgröße einen eigenen Divisor ermittelt.
  Zudem sollte zuvor noch ein Korrekturfaktor hinzugefügt werden.

Solange als Schrifttype Arial verwendet wird, kommt meine Logik sehr dem Optimum nahe.
Sobald eine andere Schrifttype verwendet wird, kann es passen, muss aber nicht.
Hier wären eigene Korrekturfaktoren nötig.

Dabei könnte es doch so einfach sein....:D

Code:

xlWs.UsedRange.EntireColumn.AutoFit    'Spaltenbreite automatisch anpassen

Also, nochmals Danke für den Hinweis.

Viele Grüße, Andi 

------------------
Hast du kein Problem?
Such dir eins. ( Und löse es )

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

Dimitrie Kuhn
Mitglied
Freiberuflicher Ingenieur


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

Beiträge: 13
Registriert: 05.11.2011

Win10 64bit
SOLIDWORKS CAD 2018/19
SOLIDWORKS PDM 2019

erstellt am: 11. Apr. 2018 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 Nur für Andi Beck 10 Unities + Antwort hilfreich


AutoColumnWidth_01.zip

 
Hallo Andi,

die "AutoFit"-Funktion in der API sollte für SWX kein Problem sein, im Userinterface, per Mausklick geht es ja problemlos.
Möglicherweise implementiert SWX die Funktion irgendwann ...

Ich hab dir ein Beispiel Makro angehängt.
Hoffe es hilft dir.

Viele Grüße
Dimitrie

------------------
KUHN ENGINEERING
OPTIMIERUNG & PARAMETRISIERUNG

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

Andi Beck
Ehrenmitglied V.I.P. h.c.
Konstrukteur



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

Beiträge: 2572
Registriert: 02.10.2006

Firma: SW 2023-4.0 + PDM Prof.
Windows 10 Pro 64bit, i9-11900
32 GbRAM, Quadro P2200
Home:
SW 2022-5.0
Passungstabelle von Heinz
Windows 11 Pro 64bit,
i7-12700K, 32 GbRAM,
GeForce GTX 1050Ti
Samsung C34H892, 3440x1440 Pixel

erstellt am: 13. Apr. 2018 22:11    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


Stueckliste-Breite-01.JPG


Stueckliste-Breite-02.JPG

 
Hallo Dimitrie,
ein schönes Makro hast du hier geschrieben, allerdings ebenfalls sehr Aufwendig wie das meine.
Und Prima, dass du auch meinen Beitrag im englischen Forum bemerkt hast.

Im Geschäft hat es auch gleich wunderbar funktioniert und ein besseres Ergebnis erzeugt als mein Makro, jedoch noch nicht so gut wie der Doppelklick auf die Trennlinie.
Wobei deine Iteration schon merkbar an Zeit benötigt.

Aber zu Hause mit meiner Testzeichnung hat sich dein Makro in eine Endlosschleife begeben und ich musste SW abschießen. 
Ich benötigte ein wenig Zeit, um mich deiner Logik zu nähern.

Ich habe dir 2 Bilder angehängt, um das Problem zu verdeutlichen.
Im ersten Bild siehst du ein optimales Ergebnis.
Im zweiten siehst du ein fehlerhaftes Ergebnis, da die Zelle "CM30-16BPP-KC1-." noch 2-Zeilig ist.
Diese 2-Zeiligkeit führt zu der Endlosschleife beim Durchgang für die nächste Spalte.
Die Zelle "CM30-16BPP-KC1-." hat genauso viele Buchstaben wie die Überschrift "Zeichnungsnummer", nach der die Spaltenbreite optimiert wurde.
Offensichtlich benötigt die Zelle "CM30-16BPP-KC1-." aber etwas mehr Platz.

Ich habe jetzt noch keinen schnellen Ansatz, um dies zu beheben.
Evtl. muss man nochmals alle Zellen einer Spalte kontrollieren, ob sie tatsächlich 1-Zeilig formatiert sind, und wenn nicht, den Durchlauf mit der entsprechenden Zelle erneut durchführen, und dies sooft, bis alle Zellen 1-Zeilig sind.

Aber evtl. fällt dir noch etwas besseres ein.

Grüße, Andi

------------------
Hast du kein Problem?
Such dir eins. ( Und löse es )

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

Daniel Kuhn
Mitglied
Freiberuflicher Ingenieur


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

Beiträge: 13
Registriert: 05.11.2011

Win10 64bit
SOLIDWORKS CAD 2018/19
SOLIDWORKS PDM 2019

erstellt am: 14. Apr. 2018 09:46    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 Andi Beck 10 Unities + Antwort hilfreich


AutoFitTableColumns.zip

 
Hallo Andi,

wie gesagt, es handelt sich nur um einen Lösungsvorschlag auf deinen Forumsbeitrag.
Es wurde von mir kaum getestet und soll keine fertige Lösung abbilden.
Jedoch vielen Dank für deine Rückmeldung.

Das 2-Zeilen-Problem:
Ich habe deinen Fall nachgebildet und komme auch auf das 2-Zeilen-Problem.
Für diesen Fall habe ich eine weitere Überprüfung eingebaut, es sollte jetzt passen.

Die Endlosschleife:
Bisher konnte ich bei allen Tests, in keine Endlosschleife kommen.
Um die Endlosschleife jedoch sicher auszuschließen, habe ich eine Abbruchbedingung implementiert.

Zur Laufzeit:
Die Laufzeit kann durch die Konstante:
Const stepSizeColumnWidth As Double = 0.001    ' [m]
beeinflusst werden, ich habe diese jetzt auf 1 mm gesetzt und komme somit selbst bei großen Tabellen nicht auf über 2 Sekunden (hardwareabhängig).
Diese Laufzeit kann jedoch, falls notwendig, weiter optimiert werden.
Z. B. kann eine variable Schrittweite implementiert werden.
Diese wählt zu Beginn sehr große Schritte, die hin zum Optimum kontinuierlich kleiner werden.
Denke aber nicht, dass dies in diesem Beispiel notwendig ist.

Ich hoffe, ich konnte helfen und freue mich auf deine Rückmeldung.

Viele Grüße
Dimitrie

------------------
KUHN ENGINEERING
OPTIMIERUNG & PARAMETRISIERUNG

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

Andi Beck
Ehrenmitglied V.I.P. h.c.
Konstrukteur



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

Beiträge: 2572
Registriert: 02.10.2006

Firma: SW 2023-4.0 + PDM Prof.
Windows 10 Pro 64bit, i9-11900
32 GbRAM, Quadro P2200
Home:
SW 2022-5.0
Passungstabelle von Heinz
Windows 11 Pro 64bit,
i7-12700K, 32 GbRAM,
GeForce GTX 1050Ti
Samsung C34H892, 3440x1440 Pixel

erstellt am: 14. Apr. 2018 19: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


Stueckliste-Breite-0.0005.JPG


Stueckliste-Breite-0.0002.JPG


Stueckliste-Breite-0.0001-B.JPG

 
Hallo Dimitrie,
wau, sehr schnelle Reaktionszeit  , danke für deine Vorschläge.

Ja, jetzt hat es auch mit meiner Testzeichnung funktioniert.
Das mit der Laufzeit war mir schon klar, dass ich das dort verändern kann.
Allerdings hat deine Konstante mit 1mm ein etwas schlechteres Ergebnis als mit meinem Makro erbracht.

Ich habe jetzt verschiedene Durchläufe gemacht, welche du in den Bildern sehen kannst.
Die Summe der einzelnen Abmessungen entsprechen dem Optimum mit Doppelklick auf die Trennlinie.
Das Maß 158,55 entspricht meinem Makro.

Bild Stueckliste-Breite-0.0005 = 0,5mm in 2 Sekunden

Bild Stueckliste-Breite-0.0002 = 0,2mm in 3 Sekunden

Bild Stueckliste-Breite-0.0001 = 0,1mm in 6 Sekunden (nicht zu sehen)

Bild Stueckliste-Breite-0.0001-B = 0,1mm in 25 Sekunden

Das letzte Bild habe ich bei mehreren Durchläufen 2x gehabt.
Das Feld "Kapazitiver Näherungssensor" ist dort 2-Zeilig und in der Folge sind die nächsten Spalten deutlich breiter als sie sollen.
Hier wirkt sich deine Abbruchbedingung aus, und gäbe es die nicht, hätten wir hier wieder eine Endlosschleife.

Mit 0,1mm Schritten kommt das Ergebnis schon fast dem Optimum nahe.

Also nochmals, du hast da ein tolles Makro geschrieben und ich bin dir deinem Beitrag sehr dankbar.

Schöne Grüße noch, Andi 

------------------
Hast du kein Problem?
Such dir eins. ( Und löse es )

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

Andi Beck
Ehrenmitglied V.I.P. h.c.
Konstrukteur



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

Beiträge: 2572
Registriert: 02.10.2006

Firma: SW 2023-4.0 + PDM Prof.
Windows 10 Pro 64bit, i9-11900
32 GbRAM, Quadro P2200
Home:
SW 2022-5.0
Passungstabelle von Heinz
Windows 11 Pro 64bit,
i7-12700K, 32 GbRAM,
GeForce GTX 1050Ti
Samsung C34H892, 3440x1440 Pixel

erstellt am: 18. Apr. 2018 19:18    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 nochmal,
ich habe jetzt festgestellt, dass manche Zellen mit weniger Buchstaben als andere, dennoch mehr Platz benötigen können.
Ich habe bisher die Zelle mit den meisten Buchstaben verwendet, und danach die Spaltenbreite eingestellt.
Dies hat zuweilen zu Fehlergebnissen geführt.
Ich glaube Dimitrie, du zählst (indirekt) ebenfalls die Anzahl der Buchstaben.

Da ich sowieso eine Routine zur Ermittlung der Textlänge habe, suche ich jetzt die Zelle mit dem längsten Platzbedarf raus.
Und da ist es egal, ob da mehr oder weniger Buchstaben dabei sind.

Mein Ergebnis ist jetzt fast am Optimum, was die jeweilige Spaltenbreite angeht.

Ich würde ja mein Makro hier anhängen, aber ich habe jetzt noch Probleme mit der Sortierung nach der richtigen Spalte. 
Aber dazu mache ich einen neuen Beitrag auf.

Grüße, Andi

------------------
Hast du kein Problem?
Such dir eins. ( Und löse es )

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

nahe
Ehrenmitglied



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

Beiträge: 1747
Registriert: 18.01.2001

arbeite mit:
Dell Precision 7750
i7 2,6 GHz 6 Kerne
32GB RAM
512GB SSD
NVIDIA Quadro RTX 4000
------------------------
SWX-2020 SP5.0
EPDM
----------------
Windows 10
----------------
VB.net
VB
VBA
ein wenig Swift am Mac

erstellt am: 26. Jun. 2018 15:05    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 Andi Beck 10 Unities + Antwort hilfreich

Hallo Andi,

keine Ahnung ob das Thema noch aktuell ist
anbei ein Link zu einer, scheinbar, einfachen Routine.
Genau habe ich es noch nicht getestet, aber die ersten Versuche, waren vielversprechend.

https://stackoverflow.com/questions/5245845/detect-width-of-text-in-vb-net

------------------
Grüße
Heinz

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

Andi Beck
Ehrenmitglied V.I.P. h.c.
Konstrukteur



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

Beiträge: 2572
Registriert: 02.10.2006

Firma: SW 2023-4.0 + PDM Prof.
Windows 10 Pro 64bit, i9-11900
32 GbRAM, Quadro P2200
Home:
SW 2022-5.0
Passungstabelle von Heinz
Windows 11 Pro 64bit,
i7-12700K, 32 GbRAM,
GeForce GTX 1050Ti
Samsung C34H892, 3440x1440 Pixel

erstellt am: 26. Jun. 2018 20:07    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

Zitat:
Original erstellt von nahe:
Hallo Andi,

keine Ahnung ob das Thema noch aktuell ist


Hallo Heinz,
für mich momentan nicht, da mein Makro inzwischen geräuschlos funktioniert und regelmäßig im Einsatz ist.
Aber toll, dass du dich an diesen Beitrag erinnert hast und diese Routine hier anhängst.
Wenn ich mal wieder Zeit habe, schaue ich mir das näher an, scheint wirklich Interessant zu sein.

Aber zur Zeit habe ich, was Makros angeht, eine dickere Baustelle, die ist mir wichtiger. 

Liebe Grüße, Andi 

------------------
Hast du kein Problem?
Such dir eins. ( Und löse es )

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

nahe
Ehrenmitglied



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

Beiträge: 1747
Registriert: 18.01.2001

arbeite mit:
Dell Precision 7750
i7 2,6 GHz 6 Kerne
32GB RAM
512GB SSD
NVIDIA Quadro RTX 4000
------------------------
SWX-2020 SP5.0
EPDM
----------------
Windows 10
----------------
VB.net
VB
VBA
ein wenig Swift am Mac

erstellt am: 14. Aug. 2018 11:05    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 Andi Beck 10 Unities + Antwort hilfreich

Hallo Andi,

da ich vor dem gleichen Problem stand, anbei nun eine Lösung mit SWX Api Bordmitteln

Achtung:
das ganze funktioniert nur, wenn ich jeder Zelle ein Text steht und wenn es nur " " ist

Dim swApp As Object
Sub main()
  Dim swmodel As ModelDoc2
  Dim swdraw As DrawingDoc
  Dim tab1 As TableAnnotation
 
   
  Set swApp = Application.SldWorks
  Set swmodel = swApp.ActiveDoc
  Set swdraw = swmodel
 
  Set tab1 = swdraw.SelectionManager.GetSelectedObject6(1, 0)
  SetColumnWithAuto tab1
 
End Sub


Sub SetColumnWithAuto(swTable As TableAnnotation)
        Dim index As Integer
        Dim swAnnotation As Annotation
        Dim swDislplayData As DisplayData
        Dim TextWidth As Double

       
        Set swAnnotation = swTable.GetAnnotation
        Set swDislplayData = swAnnotation.GetDisplayData

        For i = 0 To swTable.ColumnCount - 1
            For j = 0 To swTable.RowCount - 1
                If swDislplayData.GetTextInBoxWidthAtIndex(index) > TextWidth Then
                    TextWidth = swDislplayData.GetTextInBoxWidthAtIndex(index)
                End If
                index = index + swTable.ColumnCount
            Next
            swTable.SetColumnWidth i, TextWidth + 0.001, swTableRowColSizeChangeBehavior_e.swTableRowColChange_TableSizeCanChange
            TextWidth = 0#
            index = i + 1
        Next
    End Sub

------------------
Grüße
Heinz

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

nahe
Ehrenmitglied



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

Beiträge: 1747
Registriert: 18.01.2001

arbeite mit:
Dell Precision 7750
i7 2,6 GHz 6 Kerne
32GB RAM
512GB SSD
NVIDIA Quadro RTX 4000
------------------------
SWX-2020 SP5.0
EPDM
----------------
Windows 10
----------------
VB.net
VB
VBA
ein wenig Swift am Mac

erstellt am: 17. Aug. 2018 21:19    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 Andi Beck 10 Unities + Antwort hilfreich

und leider habe ich noch einen Makel festgestellt,
wenn in einer Zelle ein zweizeiliger Text steht funktioniert es auch nicht

------------------
Grüße
Heinz

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)2024 CAD.de | Impressum | Datenschutz