Autor
|
Thema: Instanz-Name in einer Komponente ändern (3458 mal gelesen)
|
LargeAssy Mitglied
Beiträge: 12 Registriert: 04.03.2010 XP32/64bit, V5R18SP2HF88
|
erstellt am: 04. Mrz. 2010 14:13 <-- editieren / zitieren --> Unities abgeben:
Hallo, erstmal Danke an den Thread "Name der Instanz ändern". Dieser Thread und einige andere mehr, haben mir sehr geholfen beim Schreiben diese Macros. Das Macro wandert durch den ganzen Baum und benennt die Instanzen auf "Partnumber.Zähler". Das funktioniert alles auch ganz prima, mit Ausnahme von Parts/Produkten welche in einer Komponente eingebaut sind. Die Komponente selber wird noch richtig umbenannt, nicht aber die Objekte, welche in der Komponente verbaut sind. Hier der Teil welcher das umbenennen macht: ........ Sub renameInstance(theProduct As Product) Dim newName As String Dim myParent As Product On Error Resume Next newName = createInstanceName(theProduct) ' hier wird der neuen Instanzname gebaut Set myParent = theProduct.Parent.Parent.ReferenceProduct.Parent.Product 'theProduct.Parent.Parent.Products.Item(theProduct.Name).Name = newName ' 3 Varianten um den Instanz-Name zu ändern myParent.Products.Item(theProduct.Name).Name = newName ' 'theProduct.Name = newName ' End Sub .................... Ich habe, dank Suche im Forum, 3 Varianten um den Instanz-Namen zu ändern. Nur leider funktioniert keine bei Instanzen innerhalb einer Komponente. Wahrscheinlich seh ich den Wald vor lauter Bäumen nicht. Vielen Dank schon mal. Gruss
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lusilnie Mitglied
Beiträge: 1486 Registriert: 13.07.2005
|
erstellt am: 08. Mrz. 2010 00:19 <-- editieren / zitieren --> Unities abgeben: Nur für LargeAssy
Hallo LargeAssy, ich habe mir jetzt Deinen Code ein paar mal durchgelesen und denke, Deinen Fehler gefunden zu haben. Einige der Beispiele, die Du genutzt hast, funktionieren nur für "Products"! Grund: Das "ReferenceProduct" einer "Component" ist das übergeordnete "Product", da "Components" kein eigenes Dokument besitzen. Du aber bestimmst die "Sub-Products" aus dem Dokument und da werden natürlich Deine umzubenennenden Instanzen nicht gefunden, da sie erst "Sub-Products" der "Sub-Products" sind. Davon ausgehend müsste die 3.Variante funktionieren. Allerdings gibt es hier ein kleines Hindernis: Der Instanzenname darf nicht schon einmal irgendwo im gesamten geöffneten "Product" vorkommen. Falls doch, wird er nicht ersetzt bzw. das Programm bricht ab! Falls Du damit noch keine Lösung findest, ein Beispiel wäre nicht schlecht! Und natürlich soviel Information wie möglich, z.B. über den neuen Instanzennamen bzw. den "Component"-Namen. mfg, Lusilnie
------------------ Alle Aussagen zu DassaultSystemes-Produkten sind sehr optimistisch, selbst diese!!! frei nach größeren Geistern Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LargeAssy Mitglied
Beiträge: 12 Registriert: 04.03.2010 XP32/64bit, V5R18SP2HF88
|
erstellt am: 08. Mrz. 2010 06:51 <-- editieren / zitieren --> Unities abgeben:
Hallo Lusilnie, vielen Dank für den Hinweis. In der Richtung hatte ich auch rumprobiert. Irgendwie muß ich die Komponenten "aktivieren" im darin Instanzen umbenennen zu können. Hier die Lösung, wie sie momentan funktioniert. Zumindest bei den Produkten, welche ich getestet habe. ... ... Sub scanProductStructure(theProducts As Products) Dim actProducts As Products Dim ii As Integer Dim goDeeper As Boolean On Error Resume Next For ii = 1 To theProducts.Count toDesignMode theProducts.Item(ii) If theProducts.Item(ii).Products.Count > 0 Then 'TypeName(theProducts.Item(ii)) = "ProductDocument" renameInstance theProducts.Item(ii) goDeeper = True For j = 0 To count_01 - 1 If theProducts.Item(ii).PartNumber = alreadyBeenTo(j) Then goDeeper = False Exit For End If Next j If goDeeper Then ReDim Preserve alreadyBeenTo(count_01) alreadyBeenTo(count_01) = theProducts.Item(ii).PartNumber count_01 = count_01 + 1 Set actProducts = theProducts.Item(ii).Products scanProductStructure actProducts End If Else renameInstance theProducts.Item(ii) End If Next On Error GoTo 0 End Sub ' ' rename the Instance '------------------------------------------------------------------------------------------ Sub renameInstance(theProduct As Product) Dim newName As String Dim myParent As Product On Error Resume Next If isComponent(theProduct.Parent.Parent) Then Set myParent = theProduct.Parent.Parent.ReferenceProduct Else Set myParent = theProduct.Parent.Parent.ReferenceProduct.Parent.Product End If newName = createInstanceName(theProduct, myParent) ' sorgt für einen einzigartigen Namen 'theProduct.Parent.Parent.Products.Item(theProduct.Name).Name = newName myParent.Products.Item(theProduct.Name).Name = newName 'theProduct.Name = newName End Sub ' ' Test auf Componente '------------------------------------------------------------------------------------------ Function isComponent(theProduct As Product) As Boolean isComponent = False If theProduct.Name <> CATIA.ActiveDocument.Product.Name Then If theProduct.ReferenceProduct.Parent.Name = theProduct.Parent.Parent.ReferenceProduct.Parent.Name Then isComponent = True End If End If End Function ... ... Vielleicht ein bischen umständlich. Es sollte doch möglich sein ohne den Test "isComponente" auszukommen. Aber, immerhin, es funktioniert, und macht was es soll. Gruß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lusilnie Mitglied
Beiträge: 1486 Registriert: 13.07.2005
|
erstellt am: 09. Mrz. 2010 00:15 <-- editieren / zitieren --> Unities abgeben: Nur für LargeAssy
Hallo LargeAssy, mir scheint, Du machst Dir selber das Leben schwer! Warum übergibst du in der Sub "scanProductStructure" denn die Products? Die lassen sich doch einfach auslesen, wenn Du das die Products enthaltende Product übergibst. Dann hast Du auch das "Parent-Product" und brauchst es nicht so umständlich später wieder bestimmen. Du kannst es direkt zum Umbenennen mit übergeben, etwa als "renameInstance theProduct.Products.Item(ii) theProduct". Dann wird Deine Routine viel einfacher: Code: Sub renameInstance(theProduct As Product, myParent As Product) Dim newName As String newName = createInstanceName(theProduct, myParent) ' sorgt für einen einzigartigen Namen theProduct.Name = newName End Sub
Auch Deine Eingangsaussage 'Irgendwie muß ich die Komponenten "aktivieren" im darin Instanzen umbenennen zu können.' kann ich nicht nachvollziehen. Anders als in der interaktiven Arbeit, arbeitest Du im Script immer mit den gewählten Elementen, wenn Du die richtige Workbench aktiv hast. Da gibt es hier auch schon unzählige Diskussionen dazu... mfg, Lusilnie
------------------ Alle Aussagen zu DassaultSystemes-Produkten sind sehr optimistisch, selbst diese!!! frei nach größeren Geistern Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LargeAssy Mitglied
Beiträge: 12 Registriert: 04.03.2010 XP32/64bit, V5R18SP2HF88
|
erstellt am: 10. Mrz. 2010 06:29 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|