| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| AMB 2024 |
Autor
|
Thema: API: Benutzerdefinierte Eigenschaften von konfigurationsspezifischen unterscheiden (2039 mal gelesen)
|
Piet Mitglied Konstruktionsleiter & Konstrukteur
Beiträge: 661 Registriert: 20.11.2001 SWx 2021
|
erstellt am: 02. Jan. 2006 13:21 <-- editieren / zitieren --> Unities abgeben:
Ich hab ein Makro geschrieben, mit dem bei uns Teiledaten (Werkstoff, Name, Teilenummer usw.) als benutzerdefinierte Eigenschaften ans Teil, bzw. die Baugruppe gehängt werden. Jetzt möchte ich überprüfen, ob es in dem Teil Konfigurationen gibt, welche in der Tabelle diese Eigenschaften vielleicht schon festlegen. Dann kann ich einen Warnhinweis geben, dass diese Daten in der Konfigurationstabelle geändert werden müssen und das Eingabefeld sperren. Wie krieg ich raus, ob eine Dateieigenschaft benutzerdefiniert oder konfigurationsspezifisch ist? ModelDoc2.GetCustomInfoNames2() gibt alle Dateieigenschaften raus, egal woher. Ich hab schon versucht, mit ModelDoc2.GetCustomInfoNames2("Standard") die benutzerdefinierten Eigenschaften auszufiltern, aber das hat nicht funktioniert. Hat jemand eine Idee? Piet
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 02. Jan. 2006 14:13 <-- editieren / zitieren --> Unities abgeben: Nur für Piet
Hi, die Funktion CustomInfo2 gibt unterschiedliche Werte zurück abhängig davon ob du eine Konfiguration angibst oder einen leeren String. Str1=swModel.CustomInfo2(vConfigName, vCustInfoName) Str2=swModel.CustomInfo2("", vCustInfoName) Wenn Str2 leer ist, ist es eine konfigurationsspezifisch Eigenschaft. Gruß Oliver Knepper
------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBSpawn Mitglied Programmierer
Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück.
|
erstellt am: 02. Jan. 2006 15:01 <-- editieren / zitieren --> Unities abgeben: Nur für Piet
Hi, ich mach dat imma so ... Public Function GetConfigProps() Dim mDoc As ModelDoc2 Dim cfgNames As Variant Dim cfgCounter As Long Dim cNames, cVals, cType Dim cfg As Configuration Dim i As Long Dim swApp As SldWorks.SldWorks Set swApp = Application.SldWorks Set mDoc = swApp.ActiveDoc cfgNames = mDoc.GetConfigurationNames For cfgCounter = 0 To UBound(cfgNames) Set cfg = mDoc.GetConfigurationByName(cfgNames(cfgCounter)) Call cfg.GetCustomProperties(cNames, cVals, cType) If IsArray(cNames) Then For i = 0 To UBound(cNames) Debug.Print "config:=" & cfg.Name & " | " & "Name:=" & cNames(i) & " Wert:=" & cVals(i) Next i End If Next cfgCounter End Function Gruß Micha
------------------ Zitat: Interpunktion und Orthographie des Postings sind frei erfunden. Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lutz Federbusch Ehrenmitglied V.I.P. h.c. Dipl.-Ing. Maschinenbau
Beiträge: 3094 Registriert: 03.12.2001 alle SW seit 97+ AutoCAD2016-2022 ERP ProAlpha + CA-Link Intel Core i7-7820K 32GB Win10x64 Quadro K5000 SpacePilot
|
erstellt am: 02. Jan. 2006 16:22 <-- editieren / zitieren --> Unities abgeben: Nur für Piet
Nochmal zu Jens_Oliver: Mißverständlich! Wenn der String2 leer ist, ist der Wert für die benannte benutzerdefinierte Eigenschaft leer, das heißt allerdings noch nicht, daß es dieselbe Eigenschaft konfigurationsspezifisch gibt... ------------------ Lutz Federbusch Mein Gästebuch [Diese Nachricht wurde von Lutz Federbusch am 02. Jan. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Piet Mitglied Konstruktionsleiter & Konstrukteur
Beiträge: 661 Registriert: 20.11.2001 SWx 2021
|
erstellt am: 02. Jan. 2006 17:03 <-- editieren / zitieren --> Unities abgeben:
|
jens_oliver Mitglied Softwareentwickler
Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 03. Jan. 2006 00:38 <-- editieren / zitieren --> Unities abgeben: Nur für Piet
Hallo, ich hab noch mal getestet, bei mir (SW2006) funktioniert das mit Konfigurationsspezifische mit GetCustomInfoNames2(vConfigName) und für Benutzerspezifische mit GetCustomInfoNames2(„“ ). Achtung bei dem Beispiel in der Hilfe. ReDim Preserve vConfigNameArr(UBound(vConfigNameArr) + 1) Die Zeile fügt einen leeren Konfigurationsnamen in die Liste ein. Somit erhält man auch alle Benutzerdefinierten. Sub main() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim vConfigNameArr As Variant Dim vConfigName As Variant Dim vCustInfoNameArr As Variant Dim vCustInfoName As Variant Dim stri As String Dim ret As Integer Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc vConfigNameArr = swModel.GetConfigurationNames ' Konfigurationsspezifische For Each vConfigName In vConfigNameArr vCustInfoNameArr = swModel.GetCustomInfoNames2(vConfigName) If Not IsEmpty(vCustInfoNameArr) Then For Each vCustInfoName In vCustInfoNameArr stri = " Name=" + vCustInfoName + " Wert=" + swModel.GetCustomInfoValue(vConfigName, vCustInfoName) ret = MsgBox("ConfigName=" + vConfigName + " " + stri, vbInformation, "Konfiguration") Next End If Next ' Benutzer vCustInfoNameArr = swModel.GetCustomInfoNames2("") If Not IsEmpty(vCustInfoNameArr) Then For Each vCustInfoName In vCustInfoNameArr stri = " Name=" + vCustInfoName + " Wert=" + swModel.GetCustomInfoValue("", vCustInfoName) ret = MsgBox(stri, vbInformation, "Benutzer") Next End If End Sub Gruß Oliver Knepper @Lutz Federbusch Kann ein Wert für eine benutzerdefinierte Eigenschaft leer sein? Ich schaff das nicht in SW2006. ------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de
[Diese Nachricht wurde von jens_oliver am 03. Jan. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBSpawn Mitglied Programmierer
Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück.
|
erstellt am: 03. Jan. 2006 10:23 <-- editieren / zitieren --> Unities abgeben: Nur für Piet
Zitat:
Kann ein Wert für eine benutzerdefinierte Eigenschaft leer sein? Ich schaff das nicht in SW2006.
<grinz> also dat klappt bei mir .... Call mDoc.AddCustomInfo3(cfg.Name, "LEER", swDmCustomInfoText, "") von Hand geht es nicht ... Gruß Micha
------------------ Zitat: Interpunktion und Orthographie des Postings sind frei erfunden. Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Piet Mitglied Konstruktionsleiter & Konstrukteur
Beiträge: 661 Registriert: 20.11.2001 SWx 2021
|
erstellt am: 03. Jan. 2006 15:47 <-- editieren / zitieren --> Unities abgeben:
So, bei mir läuft's jetzt auch. Vielen Dank für die Tipps, das hat den Durchbruch gebracht. Meinen Code häng ich mal an. Manches kann man bestimmt eleganter lösen, aber ich bin als Programmierer immer noch ein einbeiniger Humpler mit Nagelbettentzündung. Verbesserungsvorschläge sind immer willkommen. Piet Sub GetKonfigs() Dim Konfig As Object Dim Farbe() As Variant Dim AnzKonfigs As Long Dim vConfigName As Variant Dim vConfigNameArr As Variant Dim vCustInfoName As Variant Dim vCustInfoNameArr As Variant Dim Felder() As String Dim StdEigenschaft() As Integer Dim KfgEigenschaft() As Integer Dim Zugang() As Boolean ReDim Felder(8) ReDim Farbe(UBound(Felder)) ReDim StdEigenschaft(UBound(Felder)) ' Name, Name2, Teilenummer, Werkstoff, Oberfläche, LayerHinten, Lieferant, KaufBezeichnung, Kaufnummer ReDim KfgEigenschaft(UBound(Felder)) ' 0 1 2 3 4 5 6 7 8 ReDim Zugang(UBound(Felder)) For i = 0 To UBound(Felder) StdEigenschaft(i) = 0 KfgEigenschaft(i) = 0 Farbe(i) = vbWhite Zugang(i) = True Next i Felder(0) = "Name" Felder(1) = "Name2" Felder(2) = "Teilenummer" Felder(3) = "Werkstoff" Felder(4) = "Oberfläche" Felder(5) = "LayerHinten" Felder(6) = "Lieferant" Felder(7) = "Bezeichnung Kaufteil" Felder(8) = "Bestellnummer" If RefModel Is Nothing Then MsgBox ("Kein Referenziertes Modell erkannt") Exit Sub End If AnzKonfigs = RefModel.GetConfigurationCount ' holt Anzahl der Konfigurationen If AnzKonfigs > 1 Then ' wenn es mehrere Konfigs gibt... vConfigNameArr = RefModel.GetConfigurationNames ' holt die Konfig-Namen ' Liest die benutzerdefinierten Dateieigenschaften aus For i = 0 To UBound(Felder) If RefModel.CustomInfo2("", Felder(i)) <> "" And RefModel.CustomInfo2("", Felder(i)) <> " " Then StdEigenschaft(i) = 1 End If Next i ' Liest die Konfigurationseigenschaften aus For Each vConfigName In vConfigNameArr Set Konfig = RefModel.GetConfigurationByName(vConfigName) vCustInfoNameArr = RefModel.GetCustomInfoNames2(vConfigName) For i = 0 To UBound(Felder) ' If Not IsEmpty(vCustInfoName) Then If RefModel.CustomInfo2(vConfigName, Felder(i)) <> "" And RefModel.CustomInfo2(vConfigName, Felder(i)) <> " " Then KfgEigenschaft(i) = KfgEigenschaft(i) + 1 End If ' End If Next i Next ' Vergleicht die benutzer- mit den konfigurationsspezifischen Eigenschaften For i = 0 To UBound(Felder) If StdEigenschaft(i) = 1 Then If KfgEigenschaft(i) > 0 Then ' widersprüchlich! Farbe(i) = vbRed frmMaterial.cmdRot.Visible = True Else Farbe(i) = vbWhite End If ElseIf StdEigenschaft(i) = 0 Then ' Eigenschaft wird in Tabelle festgelegt, Eingabefeld sperren If KfgEigenschaft(i) > 0 Then Farbe(i) = vbYellow Zugang(i) = False frmMaterial.cmdGelb.Visible = True Else Farbe(i) = vbWhite End If End If Next i frmMaterial.txtName.BackColor = Farbe(0) frmMaterial.txtName2.BackColor = Farbe(1) frmMaterial.txtTeilenummer.BackColor = Farbe(2) frmMaterial.cmbMaterial.BackColor = Farbe(3) frmMaterial.cmbFinish.BackColor = Farbe(4) frmMaterial.cmbLayerHinten.BackColor = Farbe(5) frmMaterial.txtKaufLieferant.BackColor = Farbe(6) frmMaterial.txtKaufBezeichnung.BackColor = Farbe(7) frmMaterial.txtKaufNummer.BackColor = Farbe(8) frmMaterial.txtName.Enabled = Zugang(0) frmMaterial.txtName2.Enabled = Zugang(1) frmMaterial.txtTeilenummer.Enabled = Zugang(2) frmMaterial.cmbMaterial.Enabled = Zugang(3) frmMaterial.cmbFinish.Enabled = Zugang(4) frmMaterial.cmbLayerHinten.Enabled = Zugang(5) frmMaterial.txtKaufLieferant.Enabled = Zugang(6) frmMaterial.txtKaufBezeichnung.Enabled = Zugang(7) frmMaterial.txtKaufNummer.Enabled = Zugang(8) End If End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |