| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SolidEdge |
Autor
|
Thema: Problem beim speichern der Dateieigenschaften im aktiven Dokument mit VB.NET (830 mal gelesen)
|
Matthias Leemann Mitglied Masch. Ing HTL
Beiträge: 393 Registriert: 03.10.2003 Windows 11 Pro Solid Edge 2022
|
erstellt am: 03. Mrz. 2004 16:55 <-- editieren / zitieren --> Unities abgeben:
Hallo SE Programmierer, wenn ich die Dateieigenschaften mittels VB.NET im aktuell geöffneten Dokument editieren und speichern will (SolidEdgeFramework.Properties), passieren komische Dinge. Irgendwie werden unleserliche Zeichen als Werte abgespeichert. Beim Bearbeiten der Dateieigenschaften über SolidEdgeFileProperties.Properties (Dokument ist nicht in SE geöffnet) funktioniert es gut. Ich benutze folgenden Code: (VB.NET) Dim objApp As SolidEdgeFramework.Application Dim oDoc As SolidEdgePart.PartDocument Dim oCustom As SolidEdgeFramework.Properties Dim oProp As SolidEdgeFramework.Property objApp = CType(GetObject(, "SolidEdge.Application"), SolidEdgeFramework.Application) oDoc = objApp.ActiveDocument oCustom = oDoc.Properties("Custom") oCustom.Add("MyTestprop", "MyText") 'das funktioniert gut oProp = oCustom.Item("MyTestprop") oProp.Value = "My New Text" 'gespeichert wird: ?®??P'2A€ oCustom.Save() oCustom = oDoc.Properties("SummaryInformation") oProp = oCustom.Item("Titel") oProp.Value = "My new Titel" 'gespeichert wird: ?®?? *À?_par oCustom.Save() System.Runtime.InteropServices.Marshal.ReleaseComObject(oProp) System.Runtime.InteropServices.Marshal.ReleaseComObject(oCustom) System.Runtime.InteropServices.Marshal.ReleaseComObject(objApp) System.Runtime.InteropServices.Marshal.ReleaseComObject(oDoc) oProp = Nothing oCustom = Nothing oDoc = Nothing objApp = Nothing GC.Collect() GC.WaitForPendingFinalizers() Das ganze klappt mit hinzufügen der Eigenschaften, aber auch nur bei den benutzerdefinierten Eigenschaften (Custom). Bei den festen im Dokument (SummaryInformation) kann man keine hinzufügen. Kann Jemand das Problem nachvollziehen? Bin froh über jeden Hinweis. Grüsse aus der winterlichen Schweiz Matthias Leemann ------------------ SE V14
[Diese Nachricht wurde von Matthias Leemann am 04. Mrz. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfiSbg Mitglied
Beiträge: 103 Registriert: 10.03.2003
|
erstellt am: 03. Mrz. 2004 21:22 <-- editieren / zitieren --> Unities abgeben: Nur für Matthias Leemann
Hallo Matthias, hab zwar kein net, aber eigentlich sollte es mit VB6 das gleiche sein. Ich hab mich mit deinem Code gar nicht weiter auseinandergesetzt, aber eine Frage: Ist in VB.net der SET Befehl nicht mehr nötig? Folgender Code in Kurzform sollte eigentlich funktionieren: Dim objSeApp As SolidEdgeFramework.Application Dim objSeDoc As Object Set objSeApp = GetObject(, "SolidEdge.Application") Set objSeDoc = objSeApp.ActiveDocument objSeDoc.Properties("SummaryInformation").Item("Titel").Value = "BlaBlaBla" Set objSeDoc = Nothing Set obseapp = Nothing Das einzige was du bei den verschiedenen Eigenschaften aufpassen musst, dass die teilweise in deutsch und teilweise in english anzusprechen sind. Ey kann ich die mal durch die Leitung ein paar Tonnen Schnee rüberschicken? Kann Ihn nicht mehr sehn! Achso: Hab SE V14
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
modeng Ehrenmitglied V.I.P. h.c.
Beiträge: 7061 Registriert: 10.12.2003
|
erstellt am: 03. Mrz. 2004 21:32 <-- editieren / zitieren --> Unities abgeben: Nur für Matthias Leemann
|
Matthias Leemann Mitglied Masch. Ing HTL
Beiträge: 393 Registriert: 03.10.2003 Windows 11 Pro Solid Edge 2022
|
erstellt am: 04. Mrz. 2004 08:49 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen, ich hab die Lösung von Jason Newell aus der englischen Newsgroup. Der Code von ihm funktioniert richtig. Es ist wirklich nicht dasselbe, ob man VB6 oder VB.NET verwendet. Ich sehe zwar noch nicht ganz durch, aber es funktioniert, ich vermute aber auch, dass in der Solid Edge API etwas nicht ganz sauber programmiert ist. Wir haben das Problem an UGS PLM Solutions weitergeleitet. Hier der Code von Jason Newell: Dim objApp As SolidEdgeFramework.Application Dim oCustom As SolidEdgeFramework.Properties Dim oProp As Object ' Declare an empty array that we'll populate later. We'll use this array with InvokeMember() Dim arguments() As Object ' Attach to Solid Edge. objApp = Marshal.GetActiveObject("SolidEdge.Application") ' Get the ActiveDocument's Custom Properties oCustom = objApp.ActiveDocument.Properties("Custom") ' Add the new Custom Property oProp = oCustom.Add("MyTestprop", "MyText") ' Populate the array with the new value. arguments = New String() {"My New Text"} ' InvokeMember() is a raw approach to calling a property or method. ' I always use it when the normal stuff doesn't work. oProp.GetType().InvokeMember("Value", Reflection.BindingFlags.SetProperty, Nothing, oProp, arguments) ' Save changes. oCustom.Save() Marshal.ReleaseComObject(oProp) Marshal.ReleaseComObject(oCustom) Marshal.ReleaseComObject(objApp) oProp = Nothing oCustom = Nothing objApp = Nothing GC.Collect() GC.WaitForPendingFinalizers() @WolfiSbg: Der Set Befehl wird in VB.NET nicht mehr benötigt. Die Entwicklungsumgebung löscht den Befehl selbstständig, wenn man Code von VB6 einfügt. Gruss Matthias ------------------ SE V14 [Diese Nachricht wurde von Matthias Leemann am 04. Mrz. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
modeng Ehrenmitglied V.I.P. h.c.
Beiträge: 7061 Registriert: 10.12.2003
|
erstellt am: 04. Mrz. 2004 09:32 <-- editieren / zitieren --> Unities abgeben: Nur für Matthias Leemann
Moin, so wie ich das sehe fuegt dieser code aber auch nur den "Custom" Properties etwas hinzu -- as I said before. Die Frage war aber doch ob auch den "Summary" oder anderen eine Variable hinzugefuegt werden kann, oder ? Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matthias Leemann Mitglied Masch. Ing HTL
Beiträge: 393 Registriert: 03.10.2003 Windows 11 Pro Solid Edge 2022
|
erstellt am: 04. Mrz. 2004 09:43 <-- editieren / zitieren --> Unities abgeben:
Hallo modeng, nein, mit folgenden Zeilen kannst du zB. die Eigenschaft Titel ("SummaryInformation") bearbeiten: ... oCustom = objApp.ActiveDocument.Properties("SummaryInformation") oProp = oCustom.Item("Titel") ' Populate the array with the new value. arguments = New String() {"Mein neuer Titel"} ' InvokeMember() is a raw approach to calling a property or method. ' I always use it when the normal stuff doesn't work. oProp.GetType().InvokeMember("Value", Reflection.BindingFlags.SetProperty, Nothing, oProp, arguments) ' Save changes. oCustom.Save() ... Gruss Matthias ------------------ SE V14 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
modeng Ehrenmitglied V.I.P. h.c.
Beiträge: 7061 Registriert: 10.12.2003
|
erstellt am: 04. Mrz. 2004 15:12 <-- editieren / zitieren --> Unities abgeben: Nur für Matthias Leemann
Moin, nicht falsch was ich meinte ist, dass man keine neue Variable hinzufuegen kann also in die Summary kann ich keine Variable "HUGO" hinzufuegen wohl kann ich der Variablen TITEL den Wert "HUGO" zuweisen. Im uebrigen haben wir das mit mit der Property ausprobiert und es funktioniert in VB einwandfrei. Sofern UGS nicht spezielle Abfragen hat einbauen muessen ob der Caller ein VB oder VB.Net ist wuerde ich sagen, dass der Fehler, wie so oft, bei MS und deren Parameteruebergabe zu suchen ist, Zumal hier ein String noch konvertiert werden muss (Unicode ANSI Problematik) Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matthias Leemann Mitglied Masch. Ing HTL
Beiträge: 393 Registriert: 03.10.2003 Windows 11 Pro Solid Edge 2022
|
erstellt am: 04. Mrz. 2004 16:10 <-- editieren / zitieren --> Unities abgeben:
Hallo modeng, da bin ich mir nicht sicher ob das Problem bei Microsoft oder .NET liegt. Ich weiss, dass eine Property.Value ein String, eine Zahl oder ein Datum sein kann, mindestens bei den Custom-Properties. Wenn ich jetzt ein String der Property.Value zuweise und SE-API den String nicht richtig annimmt weil der Typ zB. undefiniert wäre, dann gibts Probleme. Mit VB.NET ist das Variablenhandling nicht mehr so einfach wie bei VB6. Alles muss sauber in den gewünschten Type gewandelt werden. Ich kann abschliessend wirklich nicht sagen wo genau das Problem liegt. Abwarten und Tee trinken... Gruss Matthias
------------------ SE V14 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfiSbg Mitglied
Beiträge: 103 Registriert: 10.03.2003
|
erstellt am: 04. Mrz. 2004 17:04 <-- editieren / zitieren --> Unities abgeben: Nur für Matthias Leemann
Hallo Klaus, hallo Matthias, ich hatte zuerst auch auf ein Problem mit Unicode getippt, aber der Hinweis im ersten Beitrag von Matthias oProp.Value = "My new Titel" 'gespeichert wird: ?®?? *À?_par deutet für mich eindeutig auf ein Speicherproblem hin, sprich: Typumwandlung. Das _par kommt ja auch nicht so zufällig zustande. Wolfgang P.S.: Wobei noch immer mein Problem bleibt, ob ich nicht ein paar Tonnen Schnee in die Schweiz abschieben kann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
modeng Ehrenmitglied V.I.P. h.c.
Beiträge: 7061 Registriert: 10.12.2003
|
erstellt am: 04. Mrz. 2004 17:34 <-- editieren / zitieren --> Unities abgeben: Nur für Matthias Leemann
Moin, es werden ja nur Pointer oder Pointer auf Pointer uebergeben und bei der Typumwandlung wird der String in einem von VB verwalteten Bereich umgewandelt und dieser dann dem Aufgerufenen uebergeben. Ein Problem ist wenn der Aufgerufene diesen String dann modifiziert zurueckgeben will, was VB natuerlich nicht weiss ergo kein Ergebnis. Gerade die Ubergabe von Strings an NichtVBProgramme (WIN32API z.B.) ist ziemlich komplex und man muss manchmal tricksen um es zum 'fliegen' zu bekommen. Das nicht funktionierende Beispiel lief jedenfalls mit diesen Zeilen unter VB6 SP4 W3K OK Dim oCustom As SolidEdgeFramework.Properties Dim oProp As Object Set oCustom = seAppl.ActiveDocument.Properties("Custom") Set oProp = oCustom.Add("MyTestprop", "MyText") oProp = oCustom.Item("MyTestprop") oProp.Value = "My New Text" MsgBox "name " & oProp.Value '---> My New Text Call oCustom.Save()
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Benjamin Johann Mitglied Dipl.Ing.
Beiträge: 62 Registriert: 21.10.2003 HP XW-8000 (2 x XEON 2,4GHz) mit Wildcat III 6110 und 1GB RAM, Win2000, UG NX2-native, OfficeXP, GhostScript 8.11
|
erstellt am: 08. Jun. 2004 11:30 <-- editieren / zitieren --> Unities abgeben: Nur für Matthias Leemann
Hallo Zusammen! Habe mich gerade mal "eben" ein bisschen in die Problematik eingearbeitet. Mein VB-Progrämmchen kann jetzt sogar schon Titel und Autor ändern. Das geht über objApp.ActiveDocument.Properties("SummaryInformation") Wie komme ich an die anderen Karteikarten ran? Benutzerdefiniert ist objApp.ActiveDocument.Properties("Custom") Was ist Projekt? Wo kann man das nachlesen? Ich habe noch garkeine Dokumentation dazu gefunden! Programmieren tue ich mit dem OpenSource Hilfsmittel: SharpDevelop. Daher komme ich nicht immer so einfach ans Ziel - aber jetzt klappt es endlich! Benni Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matthias Leemann Mitglied Masch. Ing HTL
Beiträge: 393 Registriert: 03.10.2003 Windows 11 Pro Solid Edge 2022
|
erstellt am: 08. Jun. 2004 11:56 <-- editieren / zitieren --> Unities abgeben:
|
modeng Ehrenmitglied V.I.P. h.c.
Beiträge: 7061 Registriert: 10.12.2003
|
erstellt am: 08. Jun. 2004 11:59 <-- editieren / zitieren --> Unities abgeben: Nur für Matthias Leemann
... modifizierbar um alle aufzulisten, die es gibt. Achtung: manche sind u.U. sprachabhaengig [...] Private objApp As SolidEdgeFramework.Application Private foundProp As SolidEdgeFramework.Property [...] if getProp("xxx",foundProp) then [...] endif
Public Function getProp(pPropName As String, ByRef pProp As Object) As Boolean Static objProps As SolidEdgeFramework.PropertySets Static objProp As Object Set objProps = objApp.ActiveDocument.Properties ' ' Iterate through each properties collection ' in the PropertiesCollection collection. For Each objProp In objProps Debug.Print objProp.Name ' 'Iterate through each property 'in the Properties collection. For Each pProp In objProp Debug.Print objProp.Name & "." & pProp.name If LCase(pPropName) = LCase(pProp.Name) Then Exit For End If Next If Not pProp Is Nothing Then getProp = True Exit For End If Next End Function Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Arne Peters Ehrenmitglied V.I.P. h.c. CAD Dokumentation / Training / Programmierung / Datenbanken
Beiträge: 7321 Registriert: 05.2002.24 Solid Edge Seminarunterlagen Training, Beratung, Programmierung
|
erstellt am: 08. Jun. 2004 12:23 <-- editieren / zitieren --> Unities abgeben: Nur für Matthias Leemann
Ich hab jetzt nicht alle Antworten durchgelesen. Aber anmerkung zur Zeile oProp = oCustom.Item("MyTestprop") Ich denke entweder oPropo.oCustom.Item(Nummer) oder oPropo.oCustom("Eigenschaftsname als String") So ist es jedenfalls in VB. ------------------ APeters@BSS-Online.de [Diese Nachricht wurde von Arne Peters am 08. Jun. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
modeng Ehrenmitglied V.I.P. h.c.
Beiträge: 7061 Registriert: 10.12.2003
|
erstellt am: 08. Jun. 2004 12:46 <-- editieren / zitieren --> Unities abgeben: Nur für Matthias Leemann
|
WolfiSbg Mitglied
Beiträge: 103 Registriert: 10.03.2003
|
erstellt am: 09. Jun. 2004 13:37 <-- editieren / zitieren --> Unities abgeben: Nur für Matthias Leemann
Hallo, pass aber auf dass du für die Eigenschaftskategorie und den Eigenschaftsnamen die Bezeichnung verwendest und nicht den Index. Hab selber draufgezahlt, da sich der Index von V14 auf V15 teilweise geändert hat. Gruss Wolfgang
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
modeng Ehrenmitglied V.I.P. h.c.
Beiträge: 7061 Registriert: 10.12.2003
|
erstellt am: 09. Jun. 2004 13:41 <-- editieren / zitieren --> Unities abgeben: Nur für Matthias Leemann
|
Arne Peters Ehrenmitglied V.I.P. h.c. CAD Dokumentation / Training / Programmierung / Datenbanken
Beiträge: 7321 Registriert: 05.2002.24 Solid Edge Seminarunterlagen Training, Beratung, Programmierung
|
erstellt am: 09. Jun. 2004 16:00 <-- editieren / zitieren --> Unities abgeben: Nur für Matthias Leemann
Ich verwende eigentlich immer den Namen der Eigenschaft. Der Index über .Item() könnte sich ja ändern. Ansonsten PropertyByID. Da sehe ich von V10 zu V15 keine Änderungen in den Nummern. ------------------ APeters@BSS-Online.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
modeng Ehrenmitglied V.I.P. h.c.
Beiträge: 7061 Registriert: 10.12.2003
|
erstellt am: 09. Jun. 2004 17:08 <-- editieren / zitieren --> Unities abgeben: Nur für Matthias Leemann
nun bei .Index(nummer) kommt das retour was halt darunter gespeichert ist, welches durchaus in Vxx etwas anderes als in Vxx + 1 sein kann. Analog dazu koennte es sich mit .Index("string") verhalten, was eher unwahrscheinlich ist, wahrscheinlicher ist das nichts zurueckgegeben wird. modeng Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |