Autor
|
Thema: Automatische erstellung und Benennung von Annotations (3096 mal gelesen)
|
Starbirth Mitglied Konstrukteur
Beiträge: 119 Registriert: 22.10.2009
|
erstellt am: 27. Okt. 2009 10:16 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum, ich zerbreche mir nun schon seit einigen Tagen den Kopf ob und wie sich soetwas per VBA Macro machen lässt. Das Macro soll ein vom User angegebenes Geometrical Set durchsuchen, die Anzahl der darunter befindlichen Sets ermitteln und dann für jedes Set eine Annotation auf der ersten Kurve in diesem Set anlegen, wobei der Name des Sets in die Annotation übernommen wird. Im Pseudocode habe ich mir das Ganze ungefähr so gedacht:
Code: UserSelection -> GeoSet_Arbeitsordner Zähler=0 FOR EACH GeometricalSet in GeoSet_Arbeitsordner IF Anzahl_der_enthaltenen_Elemente > 0 THEN Name des GeometricalSets auslesen -> Var: Name (hier wäre es später evtl noch schön zu testen ob das Set auch wirklich Kurven/Graden enthält) Punkt in der Mitte der ersten Kurve erzeugen Annotation auf erzeugtem Punkt anlegen, Inhalt aus Var:Name Zähler=Zähler+1 ELSE NEXT MsgBox: Es wurden %Zähler% Annotations erzeugt
Ist natürlich noch n wenig rudimentär und es gibt noch ein paar Punkte an denen man Fehler abfangen könnte, aber es soll ja erstmal laufen. Verbessern kann man immer noch.Ich stehe jetzt "nur" noch vor dem Problem das ins CATIAnische zu übersetzen. Die V5Automation.chm will mir da irgendwie noch nicht weiterhelfen. Da blicke ich einfach noch nicht durch. Die User Auswahl sollte sich ja über
Code: Dim InputObjectType() InputObjectType(0)="HybridBody"Status = selection1.SelectElement2(InputObjectType, "Bitte das Geometrical Set auswählen aus dem die Annotations erstellt werden sollen.", False)
(Quelle: Das Kochbuch V5 Automation) machen lassen, oder? Aber selbst wenn ich nur schon mal die Userselection testen will bekomme ich lediglich einen "Run Time Error '9': Subscript out of range" als Ausgabe. Nichts was annähernd so aussieht als könnte man etwas selektieren.Dann zum Abschluss meine Frage: Wo lerne ich am einsteigerfreundlichsten das Ganze zu übersetzen? Editiert@10:36h zwecks Rechtschreibung [Diese Nachricht wurde von Starbirth am 27. Okt. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DanielFr. Moderator Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 27. Okt. 2009 13:27 <-- editieren / zitieren --> Unities abgeben: Nur für Starbirth
Hallo Starbirth, schau mal in meinen Anhang. Ein fertiges Makro das genau macht was du willst. Die Fehlerbehandlung ist auch schon implementiert. Ich gebe zu es ist ein wenig unübersichtlich für einen Anfänger (ich habe selber ein wenig rumexperimentiert) aber mit dem Step-by-Step Debugging im Visaul Basic Editor solltest du hinter die Struktur steigen. Der Inhalt des angehängten *.zip Files gestaltet sich wie folgt: 1. Baumstruktur.jpg => mit dieser Baumstruktur habe ich getestet 2. CreateAnnotationSets_v1.0_R19.CATPart => Mein Beispiel-Part (allerdings in R19 und deswegen auch der Baumstruktur-Screenshot. Falls du es nicht öffnen kannst) 3. CreateAnnotationSets_v1.bas => Eine Sicherungsdatei aus dem Visual Basic Editor -> Muss in einem vorhanden Projekt über File -> import importiert werden 4. CreateAnnotationSets_v1.CATScript => Falls du keine Visual Basic Editor installiert hast bzw. das Teil auch auf UNIX laufen lassen willst hier eine leicht geändertes CATScript Jetzt zu deinen Fragen: [CODE][Dim InputObjectType() InputObjectType(0)="HybridBody" Status = selection1.SelectElement2(InputObjectType, "Bitte das Geometrical Set auswählen aus dem die Annotations erstellt werden sollen.", False)/CODE] Wenn du ein Array ohne feste Länge deklarierst dann musst du ihm bevor du ihm ein Wert zuweist erst eine Länge geben. Dim InputObjectType() => Eine Array ohne feste Länge InputObjectType(0)="HybridBody" => Woher soll das Script überhaupt wissen das das Array eine Dimension hat? Folgendes schafft Abhilfe: Dim InputObjectType(0) => Ein Array mit der Länge 0 InputObjectType(0)="HybridBody" oder Dim InputObjectType() => Eine Array ohne feste Länge Redim Preserve InputObjectType(0) => Hier wird dem Array die Länge 0 zugewiesen InputObjectType(0)="HybridBody" Dein Problem liegt somit nicht bei CATIA oder der V5Automation.chm sondern eher bei Grundlegenden Sachen aus Visual Basic. Von dem her würde ich dir empfehlen dir hier erst mal ein paar Skills anzueignen um dann tiefer in die CATIA Methodik einzusteigen ------------------ MFG Daniel Systeminformation | Inoffizielle CATIA Hilfeseite | CATIA FAQ | Suche | TraceParts (Normteile...) | 3D Content Central (noch mehr Normteile...) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Starbirth Mitglied Konstrukteur
Beiträge: 119 Registriert: 22.10.2009
|
erstellt am: 27. Okt. 2009 13:46 <-- editieren / zitieren --> Unities abgeben:
Wow, auf den ersten Blick sieht das wirklich super aus. Du hast recht, ein wenig verwirrend, aber ich schneusel mich da schon durch. Werd dann mal zum testen übergehen und danach sind VB Tutorials dran. Ich hab auch das Gefühl, dass es bereits in den Grundlagen hängt. Aber gut, bin Azubi und hab vorher nie damit gearbeitet. Und auf einmal soll ich Makros schreiben. Das Ergebnis war zu erwarten Dir auf jeden Fall herzlichsten Dank. Gruß, Starbirth Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Starbirth Mitglied Konstrukteur
Beiträge: 119 Registriert: 22.10.2009 Catia V5-6 R24 Windows 7 64bit Intel Xeon (4x3,5GHz) 32B Ram Nvidia Quatro K4200
|
erstellt am: 16. Nov. 2009 14:38 <-- editieren / zitieren --> Unities abgeben:
Hallo Daniel, hab endlich Gelegenheit gefunden alles durchzutesten. Schon n ganz schönes Stück Arbeit was du da abgeliefert hast. Und das in der Zeit. Respekt. Allerdings muss ich sagen, dass noch nicht alles 100%ig so funktioniert wie es soll. Und ich kann mir nicht erklären weshalb. Ich hänge mal n Zip mit meiner Testdatei an. Dies ist ein wenig komplizierter als deine. Wenn du es mal damit testest wirst du sehen, dass gar keine Annotation erzeugt wird. Bei DummyPart1-4 ist das nicht weiter verwunderlich. Die zugrunde liegenden Kurven sind nicht connex und somit gibt es den Mittelpunkt nicht. Wenn man die Kurven vorher händisch per Disassemble auseinander nimmt werden auf DummyPart1-3 Annotations erzeugt (leider in deinem Original eine Annotation pro Teillinie, aber das hatte ich selber schnell im Griff). Ich versuche grade dein Script so umzubauen, dass in solchen Fällen (Linienzug nicht connex) ein Extremum erzeugt wird, statt eines Mittelpunktes und auf diesem dann die Annotation. Daran hab ich grade gut zu knabbern. Was mir noch aufgefallen ist, dass auf DummyPart 4+5 nie Annotations erzeugt werden. Dabei ist 5 extra so erstellt, dass es connex ist. Bei 4 bringt auch der Disassemble keinen Erfolg. Das verstehe ich einfach nicht. Könnte es an der Prüfug liegen ob das grade bearbeitet Element eine Kurve ist? Wobei ja eigentlich auch Kreisbögen als Kurven zählen sollten, so wie Graden. Ähm, ja. Glaube das wars erstmal. Ich versuch dann mal weiter die richtige Richtung für den Extrempunkt zu finden. EDIT (17.11.09): Kreisbögen wurden tatsächlich nicht als Kurven erkannt und somit auch nicht bearbeitet. Hab ich jetzt auch angepasst. Obendrein werden jetzt weiße Annotations erzeugt und die Namen ein wenig angepasst. [Diese Nachricht wurde von Starbirth am 17. Nov. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DanielFr. Moderator Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 17. Nov. 2009 10:47 <-- editieren / zitieren --> Unities abgeben: Nur für Starbirth
|
Starbirth Mitglied Konstrukteur
Beiträge: 119 Registriert: 22.10.2009
|
erstellt am: 20. Nov. 2009 08:52 <-- editieren / zitieren --> Unities abgeben:
Hab jetzt noch ein wenig rum getippt und auch eine in meinen Augen ganz brauchbare Lösung gefunden. Was mir dabei noch im Weg steht ist die Erzeugung des Extrempunktes. Hier mal der derzeitige Code: Code: Private Function Point_n_Annotation(ByRef iHybShape As HybridShape, ByRef iHybBody As HybridBody, ByRef iPart As Part, ByRef iHybShapeFac As HybridShapeFactory)'***********Deklaration********** Dim iRef As Reference Dim iRefPlane As Reference Dim iRefPlaneDirection As HybridShapeDirection Dim iCheckpoint As HybridShapePointOnCurve Dim iPoint As AnyObject Dim connex As Boolean Dim iSelection As Selection '***********Connex Check*********** Set iRef = iPart.CreateReferenceFromObject(iHybShape) Set iCheckpoint = iHybShapeFac.AddNewPointOnCurveFromPercent(iRef, 0.5, False) iHybBody.AppendHybridShape iCheckpoint On Error Resume Next iPart.Update If Err.Number <> 0 Then connex = False Else connex = True Set iSelection = CATIA.ActiveDocument.Selection iSelection.Clear iSelection.Add iCheckpoint iSelection.Delete End If On Error GoTo 0 '***********Punkt erstellen********** If connex = True Then Set iRef = iPart.CreateReferenceFromObject(iHybShape) Set iPoint = iHybShapeFac.AddNewPointOnCurveFromPercent(iRef, 0.5, False) Else Set iRef = iPart.CreateReferenceFromObject(iHybShape) Set iRefPlane = iPart.CreateReferenceFromObject(iPart.OriginElements.PlaneYZ) Set iRefPlaneDirection = iHybShapeFac.AddNewDirection(iRefPlane) Set iPoint = iHybridShapeFac.AddNewExtremum(iRef, iRefPlaneDirection, 1) End If iHybBody.AppendHybridShape iPoint iPoint.Name = "Punkt_fuer_Annotation" Set iSelection = CATIA.ActiveDocument.Selection iSelection.Clear iSelection.Add iPoint iSelection.VisProperties.SetShow catVisPropertyNoShowAttr
In der fett hervorgehobenen Zeile steigt er dann mit "Run-Time Error 424: Object required" aus. So wie ich die V5Automation.chm lese hab ich alles angegeben was benötigt wird. Auch hab ich das ganze mit dem Macro Recorder aufgezeichnet und angepasst. Wer kann mir sagen wo mein Fehler ist.EDIT: Hab auf Wunsch noch n eine aktuelle .bas angehangen. EDIT2: Neue .bas angehängt. Code zur Erzeugung der Annotation ist jetzt auch mit drin. [Diese Nachricht wurde von Starbirth am 20. Nov. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DanielFr. Moderator Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 21. Nov. 2009 11:16 <-- editieren / zitieren --> Unities abgeben: Nur für Starbirth
|
Starbirth Mitglied Konstrukteur
Beiträge: 119 Registriert: 22.10.2009
|
erstellt am: 23. Nov. 2009 10:38 <-- editieren / zitieren --> Unities abgeben:
Autsch. Das ist peinlich. Dachte ich hätte in die Richtung alles 3x gecheckt. Jetzt hab ich endlich mein Extremum. Juhu. Läuft auch alles wie es soll. Stelle gleich noch die aktuelle .bas rein. Kann ja sein, dass noch jemand anderes Verwendung dafür hat. EDIT: .bas angehangen An dieser Stelle noch mal meinen herzlichsten Dank an dich, Daniel, für die tatkräftige Unterstützung und die geniale Vorarbeit ohne die ich sicherlich verloren gewesen wäre. Unities sind auf dem Weg (kann man da irgendwie mehr als 10 pro Beitrag vergeben?).
[Diese Nachricht wurde von Starbirth am 23. Nov. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DanielFr. Moderator Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 23. Nov. 2009 14:16 <-- editieren / zitieren --> Unities abgeben: Nur für Starbirth
|
Starbirth Mitglied Konstrukteur
Beiträge: 119 Registriert: 22.10.2009
|
erstellt am: 24. Nov. 2009 13:05 <-- editieren / zitieren --> Unities abgeben:
Jaja, Annotation bedeuten ewiges Rätselraten... N paar Sachen gibts da jetzt noch anzupassen. Vor allem Positionierung und Stil. Positionierung versuch ich mal selber sobald ich es hin bekommen habe dem (Mittel-/Extrem-)Punkt seine Koordinaten zu entlocken. Aber beim Stil schauts wirklich schlecht aus. Prinzipiell brauchen diese Dinger nur noch einen geschlossenen Pfeil und alle wären glücklich. Hab mit ein bisschen Recherche das hier gefunden. Ist da und in der Automation.chm zwar aufs Drawing beschränkt, aber das muss man ja nicht so eng sehen. Denkste Kurz: Kennt jemand eine vergleichbare Funktion für Annotations? (Der Macrorecorder gibt an dieser Stelle leider lediglich ein leeres Script zurück). EDIT: Anscheinend lag ich mit meiner Idee doch nicht so falsch. Wie es wirklich gemacht wird wurde mir dann hier gezeigt. [Diese Nachricht wurde von Starbirth am 15. Dez. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|