| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SolidEdge |
| |
| Mehr Prozesssicherheit durch PLM bei autonox Robotics GmbH, ehemals MAJAtronic GmbH , ein Anwenderbericht
|
Autor
|
Thema: VB.Net kopieren einer Baugruppe mit Links (1738 / mal gelesen)
|
Andy313 Mitglied Konstruktöör
Beiträge: 212 Registriert: 10.02.2005 Solid Edge ST10 mit CIM Database (von Contact) Windows 10 64bit Intel Xeon E5-1620 v2 (3.7Ghz) 16 GB RAM / SSD HD
|
erstellt am: 04. Aug. 2017 08:11 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen Zusammen Ich stehe wider mal an bei meinem Programm mit VB.Net. Ich versuche eine Baugruppe mit allen Teilen zu kopieren. In dieser Baugruppe gibt es eine Skizze und 2 Teile sind mit dieser Skizze verknüpft (um die Grösse und Pos. der Teile zu verändern). Wenn ich das ganze mit dem Design Manager mache (ohne VB), ist es kein Problem, dann sind die Teile an der neuen Baugruppe angehängt und die Links stimmen. Wenn ich es im VB mit dem Design Manager mache, sind auch alle neuen Teile an der neuen Baugruppe angehängt, aber die Links sind immer noch auf die alte Baugruppe bezogen... Das passiert wenn die alten Dateien schreibgeschützt sind, wenn sie nicht schreibgeschützt sind werden die Links der neuen Teile auf die neue Baugruppe bezogen, aber die alten Teile verweisen dann auch auf die neue Baugruppe Irgendwie müsste man, wie im Design Manager alles auf einmal kopieren.. nur weis ich nicht wie Das ist mein Code den ich bis jetzt habe: Function CopyRHTemplate(TemplatePath As String, TemplateName As String, NewPath As String, NewName As String) MyRevManDoc = MyRevMan.Open(TemplatePath & TemplateName & ".asm") MyRevManDoc.Copy(NewPath & NewName & ".asm") MyRevManDoc.Close() MyRevManDoc = MyRevMan.Open(NewPath & NewName & ".asm") Dim copiedFiles As New Collections.Specialized.StringDictionary() copiedFiles.Add(NewPath & NewName & ".asm", "") CopyLinkedDocuments(MyRevManDoc, NewPath, copiedFiles) MyRevManDoc.SaveAllLinks() End Function Sub CopyLinkedDocuments(ByVal objDoc As RevisionManager.Document, ByVal strDstPath As String, ByRef copiedFiles As Collections.Specialized.StringDictionary) Dim objLinks As RevisionManager.LinkedDocuments = objDoc.LinkedDocuments If objLinks IsNot Nothing Then Dim objLinkInfo As FileInfo Dim strExt As String For Each objLinkedDoc As RevisionManager.Document In objLinks objLinkInfo = New FileInfo(objLinkedDoc.FullName) strExt = objLinkInfo.Extension.ToLower() If strExt = ".asm" OrElse strExt = ".par" OrElse strExt = ".dft" OrElse strExt = ".psm" Then 'Alle Linked Files die schon kopiert wurden, ausschliessen (sind in "copiedFiles" eingetragen) If Not copiedFiles.ContainsKey(objLinkInfo.FullName) Then copiedFiles.Add(objLinkInfo.FullName, "") 'Jedes Unterobjekt kopieren CopyLinkedDocuments(objLinkedDoc, SubPath, copiedFiles) 'eine Kopie erstellen objLinkedDoc.Copy(IO.Path.Combine(SubPath, objLinkInfo.Name)) End If Else ' Do a simple file copy copiedFiles.Add(objLinkInfo.FullName, "") objLinkInfo.CopyTo(IO.Path.Combine(SubPath, objLinkInfo.Name), True) End If Next End If End Sub 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: 7478 Registriert: 05.2002.24 Solid Edge Seminarunterlagen Training, Beratung, Programmierung
|
erstellt am: 04. Aug. 2017 08:29 <-- editieren / zitieren --> Unities abgeben: Nur für Andy313
Im Zweifelsfalle könntest Du eine Liste mit alten und neuen Dateinamen mitschreiben und am Ende jedes Dokument einzeln bearbeiten. Ich hab das mal zum Umbenennen gemacht. Aber in VB6. Die Dokumente hab ich vorher einfach über das FileSystemObject umbenannt. 1. Alle Dateien kopieren und Liste füllen mit altem und neuem Namen inkl. Pfad. 2. Jedes Dokument mit RevisionManager öffnen und Links ersetzen. Wenn man jedes Dokument einzeln abarbeitet, spart es den rekrusiven Aufruf. Bei der rekrusiven Suche muss man je nach Typ des Links etwas aufpassen, dass man nicht in einer Endlosschleife landet. Zum Beispiel bei XpresRoute. ------------------ Arne Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andy313 Mitglied Konstruktöör
Beiträge: 212 Registriert: 10.02.2005 Solid Edge ST10 mit CIM Database (von Contact) Windows 10 64bit Intel Xeon E5-1620 v2 (3.7Ghz) 16 GB RAM / SSD HD
|
erstellt am: 04. Aug. 2017 08:57 <-- editieren / zitieren --> Unities abgeben:
Hallo Arne Danke für die schnelle Antwort =) Danach habe ich auch schon gesucht; bei jedem Element den Link einzeln bearbeiten. Auch so.. jetzt wo du eine Liste der Files erwähnst: dann währe das wohl mit der "RedefineLinks Method" zu bewerkstelligen. Ich habe immer bei "Document" und nicht bei "Application" gesucht. Supper.. ich werde das mal ausprobieren und mich danach nochmal Melden 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: 7478 Registriert: 05.2002.24 Solid Edge Seminarunterlagen Training, Beratung, Programmierung
|
erstellt am: 04. Aug. 2017 09:11 <-- editieren / zitieren --> Unities abgeben: Nur für Andy313
Probier mal. Wie gesagt, ich hab die Dokumente einfach so kopiert/umbenannt und mich hinterher bei jedem einzeln um die Verknüpfungen gekümmert. Bei mir ginge s darum, Dateien, die von extern kamen, mit einer eindeutigen Nr am Dokumentnamen zu versehen. Danach stimmt kein einziger Link mehr. Die Methode arbeitet gut und schnell. Hab nochmal nachgesehen. Ich hatte es so gemacht: 1. Jedes Dokument einzeln im Revision Manager öffnen. 2. LinkedDocuments abarbeiten ------------------ Arne [Diese Nachricht wurde von Arne Peters am 04. Aug. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andy313 Mitglied Konstruktöör
Beiträge: 212 Registriert: 10.02.2005 Solid Edge ST10 mit CIM Database (von Contact) Windows 10 64bit Intel Xeon E5-1620 v2 (3.7Ghz) 16 GB RAM / SSD HD
|
erstellt am: 04. Aug. 2017 15:43 <-- editieren / zitieren --> Unities abgeben:
Ich hatte nicht viel Zeit heute, das auszuprobiern.. Aber ich komme auf keinen grünen Zweig heute.. könnte sein, weil heute Freitag ist Könntest du mir ein Beispiel aus deinem Code geben, wie du das gelöst hast? Nur den Teil mit den Links, das kopieren war natürlich kein Problem, das geht sogar am Freitag PS: Schönes Wochenende [Diese Nachricht wurde von Andy313 am 04. Aug. 2017 editiert.] 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: 7478 Registriert: 05.2002.24 Solid Edge Seminarunterlagen Training, Beratung, Programmierung
|
erstellt am: 05. Aug. 2017 13:39 <-- editieren / zitieren --> Unities abgeben: Nur für Andy313
********************* Anmerkungen 1 ********************* Ich weiß nicht , ob man sich da so einfach in den Code anderer reinarbeitet. Ich hab ja auch meinen eigenen Stil.
Baugruppenfamilien können Probleme machen wenn der Name deas Familienmitglieds kommt "Dateiname.asm!Member" Prüfe, welche Links du verarbeiten musst. Ich hoffe ich hab alles rausgeschmissen, was von der Funktion zum Füllen mit kopiert was, aber nicht gebrau cht wird. Das Füllen der Liste war etwas aufwendiger. Das Reparieren der Links ist einfach. In der Liste kommt nix doppelt vor. ********************* Anmerkungen 2 *********************
o_rendocs ist public und schon gefüllt. o_rendoc ist eine einfache VB6 Klasse, wo ich die Namen und Aktionen speichere. Statt Tabelle oder Array. Da schreibe ich auch rein, ob ich ein Dokument schon bearbeitet habe. Dann muss ich es nicht nochmal anfassen, falls es erneut auftaucht. Da ist Folgendes drin. - Oldname - Newname - toRename As Boolean - Message As String - document As Object - isRenamed As Boolean - isReplaced As Boolean
******************* ' Wieder alle Dokumente auf und Links reparieren. ' Funktion ist weitgehend wie F_FillList. Damit fülle ich vorher die Liste der Dokumente Function f_replaceScan(o_doc As Object, logfile) ' Logfile ist nur für das Protokoll
Dim o_LinkedDocs As LinkedDocuments Dim o_LinkedDoc As Document Dim o_rendoc As MyDoc Dim m_filename As String Dim m_linkedFilename As String Dim i As Integer m_filename = f_Filename(o_doc.FullName) Set o_LinkedDocs = o_doc.LinkedDocuments(seLinkTypeAll) If o_LinkedDocs.Count > 0 Then For Each o_LinkedDoc In o_LinkedDocs m_linkedFilename = f_Filename(o_LinkedDoc.FullName) For i = 1 To o_rendocs.Count Set o_rendoc = o_rendocs(i) If o_rendoc.toReplace Then If o_rendoc.Oldname = m_linkedFilename Then o_LinkedDoc.Replace o_rendoc.Newname Print #logfile, "Replace;" & m_filename & ";;" & m_linkedFilename & ";" & o_rendoc.Newname End If End If Next i Next End If ende: Set o_rendoc = Nothing Set o_LinkedDocs = Nothing Set o_LinkedDoc = Nothing End Function ------------------ Arne Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andy313 Mitglied Konstruktöör
Beiträge: 212 Registriert: 10.02.2005 Solid Edge ST10 mit CIM Database (von Contact) Windows 10 64bit Intel Xeon E5-1620 v2 (3.7Ghz) 16 GB RAM / SSD HD
|
erstellt am: 07. Aug. 2017 08:43 <-- editieren / zitieren --> Unities abgeben:
Besten Dank für dein ausführlichen Beitrag. Ich habe es nun so gemacht wie du vorgeschlagen hast. 1) Alle Files kopiert mit IO.File.CopyTo 2) Eine Liste mit den alten Dateinamen und den neuen Dateinamen erstellt 3) Die Zusammenstellung im RevMan geöffnet 4) Jedes angehängte Teil ersetzt mit .Replace 5) Während des Ersetzten die Links jedes Teils durch die neue Baugruppe ersetzt Komischerweise meldet er einen Fehler wenn ich die Links ersetzten will, das diese Eigenschaft schreibgeschützt ist. Aber er ersetzt es trotzdem. Daher habe diese ersetzten mit Try gemacht. Mein Code sieht dann so aus: NewFiles ist eine Liste der alten und neuen Dateinamen getrennt durch ";" (weil ich die Files während des Kopierens noch umbenenne) MyRevManDoc = MyRevMan.Open(NewPath & NewName & ".asm") For Each o_LinkedDoc In MyRevManDoc.LinkedDocuments(RevisionManager.LinkTypeConstants.seLinkTypeAll) For Each NewFile In NewFiles If Split(NewFile, ";")(0) = o_LinkedDoc.FullName Then o_LinkedDoc.Replace(Split(NewFile, ";")(1)) For Each o_LinkedDocSub In o_LinkedDoc.LinkedDocuments(RevisionManager.LinkTypeConstants.seLinkTypeAll) If Mid(o_LinkedDocSub.FullName, InStrRev(o_LinkedDocSub.FullName, "\") + 1) = TemplateName & ".asm" Then Try o_LinkedDocSub.Replace(MyRevManDoc.FullName) Catch ex As Exception End Try End If Next End If Next Next Schönen Tag Ü's sind unterwegs 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: 7478 Registriert: 05.2002.24 Solid Edge Seminarunterlagen Training, Beratung, Programmierung
|
erstellt am: 07. Aug. 2017 09:21 <-- editieren / zitieren --> Unities abgeben: Nur für Andy313
Super. Und das ist nett, dass Du auch "o_" für Objekte nimmst. Ich hab das mal so gelernt. Aber sonst steht überall "obj" Ich hatte da mal was rekursives. Da ich aber die Liste mit allen Dateien hab, hab ich einfach jede einzeln aufgemacht, statt mich da durchzuhanglen. Soweit ich mich entsinne, ging das sogar schneller. Es wird kein Dokument doppelt angefasst, auch wenn es 100x verbaut ist. Evtl kommt die Fehlermeldung bei mehrfach verbauten Dateien, wenn die noch offen sind. Da gibt es ja manchmal auch Timing-Probleme. ------------------ Arne Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Kricher Mitglied Entwickler
Beiträge: 270 Registriert: 10.09.2004 Solid Edge (ST6 - SE2020) SolidWorks (2014 - 2020) DraftSight 2016 und 2018 Creo Elements Direct Modeling (SolidDesigner V17, V18, V19, V20) Inventor 2018 ACAD/Mechanical 2018
|
erstellt am: 07. Aug. 2017 10:18 <-- editieren / zitieren --> Unities abgeben: Nur für Andy313
Hi Ihr, funktioniert das eigentlich auch mit den CFG-Dateien von Baugruppen, wenn Ihr die nur auf Dateiebene kopiert? Ich erzeuge die Kopien immer über den RVManager (DA): int res = rvDoc.Copy(trgFile, Missing.Value, Missing.Value, Missing.Value); Auf diese Weise muss ich mich nicht um die cfg-Dateien explizit kümmern, sofern dies überhaupt sonst funzt. CU Kricher
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: 7478 Registriert: 05.2002.24 Solid Edge Seminarunterlagen Training, Beratung, Programmierung
|
erstellt am: 07. Aug. 2017 10:47 <-- editieren / zitieren --> Unities abgeben: Nur für Andy313
|
Kricher Mitglied Entwickler
Beiträge: 270 Registriert: 10.09.2004 Solid Edge (ST6 - SE2020) SolidWorks (2014 - 2020) DraftSight 2016 und 2018 Creo Elements Direct Modeling (SolidDesigner V17, V18, V19, V20) Inventor 2018 ACAD/Mechanical 2018
|
erstellt am: 07. Aug. 2017 12:50 <-- editieren / zitieren --> Unities abgeben: Nur für Andy313
|
Andy313 Mitglied Konstruktöör
Beiträge: 212 Registriert: 10.02.2005 Solid Edge ST10 mit CIM Database (von Contact) Windows 10 64bit Intel Xeon E5-1620 v2 (3.7Ghz) 16 GB RAM / SSD HD
|
erstellt am: 07. Aug. 2017 14:02 <-- editieren / zitieren --> Unities abgeben:
|
Arne Peters Ehrenmitglied V.I.P. h.c. CAD Dokumentation / Training / Programmierung / Datenbanken
Beiträge: 7478 Registriert: 05.2002.24 Solid Edge Seminarunterlagen Training, Beratung, Programmierung
|
erstellt am: 07. Aug. 2017 14:10 <-- editieren / zitieren --> Unities abgeben: Nur für Andy313
|