Autor
|
Thema: Parameter sperren (Schloss) (7563 mal gelesen)
|
Math.random Mitglied Ing
Beiträge: 8 Registriert: 23.02.2010
|
erstellt am: 15. Mrz. 2010 07:30 <-- editieren / zitieren --> Unities abgeben:
Einen schönen Montag-Morgen an alle! Ich scheitere bisher daran, Parameter per Makro zu sperren (Lock), d.h. mit Schloss zu versehen. Natürlich habe ich im Forum nach einer Lösung gesucht. An zwei Stellen bin ich auf erfolgversprechende Antworten gestoßen: Hier und hier. Beide Antworten schlagen den Zugriff auf die Parameter-Eigenschaft Constant vor. Leider funktioniert das bei mir nicht. Und da es in den Antworten keine Syntax-Beispiele gibt, habe ich den Verdacht, das Sperren von Parametern ist per Makro nicht möglich. Wer kann mir hier Gewissheit geben oder mich vom Gegenteil überzeugen? Untenstehend mein Test-Script (*.catvbs). Danke für Eure Antworten!
Code: Sub CATMain()'~~~~~Neuen Parameter erzeugen Set Neuer_Param = CATIA.ActiveDocument.Part.Parameters.CreateInteger("Glueckszahl", 313) '~~~~~Objekt mit untergeordneten Parametern erzeugen Set GeoSet = CATIA.ActiveDocument.Part.HybridBodies.Add() Set Pkt1 = CATIA.ActiveDocument.Part.HybridShapeFactory.AddNewPointCoord(0, 0, 0) GeoSet.AppendHybridShape Pkt1 CATIA.ActiveDocument.Part.Update '~~~~~Tests: Parameter sperren Pkt1.X.Comment = "!!!" 'Sowas geht Pkt1.X.Constant = True 'Aber das nicht! Constant Neuer_Param, True 'Sowas geht auch nicht! End Sub
[Diese Nachricht wurde von Math.random am 15. Mrz. 2010 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: 15. Mrz. 2010 08:48 <-- editieren / zitieren --> Unities abgeben: Nur für Math.random
Hallo , so wie du es versuchst ist es nicht möglich. Das Problem ist IMHO ein Bug im CAA. Es gibt eine Methode "isConst" die laut CAA Hilfe auch auf ein "KnowledgeObject" angewendet werden kann. Sie funktioniert auch auf Relations, Rules, Laws... ABER nicht auf Parameter?. Diese stehen aber IMHO auch im Namespace "KnowledgeObject" von dem her sage ich es ist ein Bug Die "Constant" Methode gibt es IMHO gar nicht. Dir bleibt aber noch ein Workaround...Du kannst den Parameter über einen StartCommand Befehl "Locken" und "Entlocken". Siehe hier mal das Beispielscript: Code:
Sub CATMain() Dim intDocObj As PartDocument Dim inPartObj As Part Dim inParasObj As Parameters Dim intParaToLockObj As RealParam Dim intSelObj As Selection Set intDocObj = CATIA.ActiveDocument Set intSelObj = intDocObj.Selection intSelObj.Clear Set inPartObj = intDocObj.Part Set inParaObj = inPartObj.Parameters Set intParaToLockObj = inParaObj.Item("Part1\Real.1") ' intSelObj.Add intParaToLockObj '***Parameter "locken" On Error Resume Next intSelObj.Copy If Err.Number <> 0 Then MsgBox Err.Description Exit Sub End If CATIA.StartCommand ("Lock") MsgBox "Der Parameter " & intParaToLockObj.Name & " wurde erfolgreich gesperrt" '***Parameter "unlocken" On Error Resume Next intSelObj.Copy If Err.Number <> 0 Then MsgBox Err.Description Exit Sub End If CATIA.StartCommand ("Unlock") MsgBox "Der Parameter " & intParaToLockObj.Name & " wurde erfolgreich entsperrt" intSelObj.Clear End Sub
ANMERKUNGEN: 1. Das ganze ist ein CATVba (du musst also die "Dims" auskommentieren wenn du ein CATVbs brauchst 2. Der StartCommand Befehl hängt von der Umgebungssprache ab 3. Du wirst fragen wofür man die Copies braucht => Eigentlich gar nicht aber manchmal kommt es vor das CATIA den Parameter der sich innerhlab der Selektion befindet nicht "sieht". D.h. das Script würde an dieser Stelle unterbrochen und der Anwender müsste den Parameter per Hand auswählen (ist zumindest bei R19 so...kann auch sein das es bei niedrigeren Releases zu einem Laufzeitfehler kommt). Deswegen wird der Parameter kopiert. Dann "sieht" CATIA erfahrungsgemäß diesen Parameter Du siehst das Script hat einige unschöne Sachen dabei und ist deswegen nur ein Workaround. Trotzdem sollte es stabil laufen ------------------ 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 |
Math.random Mitglied Ing
Beiträge: 8 Registriert: 23.02.2010
|
erstellt am: 16. Mrz. 2010 08:20 <-- editieren / zitieren --> Unities abgeben:
Danke, auf die gezeigte Weise funktioniert es. (Ohne dem ausgerückten Hochkomma) Im Kern sind es ja nur 2 (3) Anweisungen: Parameter selektieren ⇒ (Kopieren) ⇒ StartCommand ("Lock") Da ich erst seit wenigen Wochen mit Makros arbeite, hatte ich bisher nicht mit StartCommand zu tun. Nach ersten Recherchen scheint StartCommand immer dann als Zauberfee herhalten zu müssen, wenn ein Befehl im Prinzip nicht makrofähig ist. Wie es scheint, ist die Zauberfee im Dauereinsatz... StartCommand scheint jedoch etliche Tücken zu haben. Zu einer habe ich gleich eine Frage: Ist es sinnvoll, gleich den deutschsprachigen Command hinterherzuschieben? Um das Skript möglichst unabhängig von der Umgebungssprache zu machen?:
Code: CATIA.StartCommand ("Lock") : CATIA.StartCommand ("Sperren")
Oder sollte man besser eine Abfrage starten (If Umgebungssprache = English Then ... ElseIf ...) und wie würde die Abfrage nach der Umgebungssprache konkret aussehen?Und eine weitere Frage: Auf welchem unkomplizierten Weg lassen sich all die Meldungen über Bugs und mangelnde/fehlende Makrofähigkeit bestimmter Befehle direkt an Dassault herantragen? Ich weiß, das ist eine sehr naive Frage. Dassault würde von Fehlermeldungen und Verbesserungsvorschlägen (z.B. bezüglich Bedienfreundlichkeit!) erschlagen werden. Also wird alles abgeblockt. Ich denke jedoch, wie jeder Software-Entwickler ist Dassault auf Anwender-Feedback angewiesen. Die ärgsten Mängel ließen sich wahrscheinlich mit wenigen Codezeilen abstellen. Nur habe ich das Gefühl, dass Dassault bezüglich V5 mittlerweile fast völlig handlungsunfähig geworden ist. Ab einer bestimmten Größe geht nichts mehr – das kennt man ja von vielen Firmen. Also stirbt V5 langsam ab und die Leidtragenden sind die Anwender. Sorry für diesen Exkurs, aber es musste mal gesagt werden. 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: 16. Mrz. 2010 09:30 <-- editieren / zitieren --> Unities abgeben: Nur für Math.random
Hallo, der Befehl CATIA.StartCommand hat einen schlechteren Ruf als sie tatsächlich ist. Es ist aber so wie du sagst das der Befehl meistens dann eingesetzt wird wenn keine Methoden oder Klassen zur verfügung stehen. Das Problem an diesem Befehl ist erstens die Sprachabhängigkeit und zweitens das es ein asynchroner Aufruf ist. D.h. der Script läuft nach dem Aufruf einfach weiter und wartet z.B. nicht auf eine Anwendereingabe (das kannst du mal mit einem positionierten Sketch versuchen da wird das ganz deutlich was ich meine). Jetzt zu deinem ersten Vorschlag einfach die Umgebungssprache als zweiten Befehl in das Script aufzunehmen. Dieser Vorschlag ist zwar gut funktioniert aber in der Praxis nicht. CATIA löst einen Fehler aus (Unkownen command: XXX). Da dies ein interner CATIA Fehler ist (also kein VBA Automatisierungsfehler) kannst du diesen auch nicht einfach mit einem "On Error Resume next" Statement abfangen bzw. unterdrücken. Das heißt in jeder Zeile in der der Befehl steht der nicht in Umgebungssprache verfasst ist Pop in CATIA die Warnmeldung auf. Nach Bestätigung des Anwenders mit OK läuft das Script weiter. Du siehst so kann man es nicht einsetzen. Der zweite Vorschlag (If Umgebungssprache = "deutsch".... then ... Else ...) wäre die Lösung wenn da nicht ein riesiges Problem wäre. Es gibt keine Methode um die Umgebungssprache auszulesen . Das heißt es gibt schon eine Möglichkeit aber diese ist IMHO den Programmieraufwand nicht wert und mehr ein Workaround. Man ließt sich hierbei das Environment mit dem CATIA ausgeführt wird aus. Innerhalb des Installationsordners von CATIA gibt es zwei Batch Tools (CATBatGenXMLSet.exe und CATBatImpXMLSet.exe). Hiervon brauchst du das erste. Dieses Tool kann dir eine bestimmte (angegebene Setting Datei) in ein *.xml File exportieren. Der Aufruf aus VBA kann über den Shell Befehl laufen. Wenn du dann die richtige Setting Datei exportiert hast (in der die Umgebungssprache als Integerwert steht) kannst du diese *.xml Datei mit VBA auslesen und bekommst die Umgebungssprache raus. Die *.xml Datei ist temporär und kann danach gelöscht werden. Ich habe so ein Teil mal geschrieben. Sobald ich es gefunden habe stell ich es online dann kannst du dir das mal anschauen Wie du siehst die zweite Möglichkeit funktioniert (sogar relativ stabil) aber es ist halt ein riesen Aufwand. Wenn es aber nicht anderes geht dann rechtfertigt das Ziel den Aufwand . Wie und wo du Bugs, etc. berichten kannst weiß ich selber nicht (hab´s noch nicht gemacht). Ich denke aber es wird nichts passieren. Das liegt nicht unbedingt an DS da es ja bei SolidWorks einwandfrei funktioniert (was man an der 2010 Version zu sehen ist) sondern IMHO vielmehr daran das man V5 nicht zwingend weiterbringen will da man V6 schon hat. Dies muss vermarktet und verkauft werden was nicht einfach ist mit diesem System (das will ich hier aber nicht diskutieren). ------------------ 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 |
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: 16. Mrz. 2010 13:11 <-- editieren / zitieren --> Unities abgeben: Nur für Math.random
|
RSchulz Moderator² Head of CAD, Content & Collaboration / IT-Manager
Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 19. Dez. 2012 13:58 <-- editieren / zitieren --> Unities abgeben: Nur für Math.random
Hallo zusammen, erstmal danke an Daniel Da ich das ganze selbst immer wieder brauche und meine eigens dafür entwickelte Klasse, auch wenn ich damit nie Probleme hatte, mir selbst etwas unsicher schien, habe ich mich dieser Methode hier mal angenommen. Da ich nicht einfach nur nehme, stelle ich das Ergebnis mal hier rein. Unterschied in der Funktion ist einzig, dass ich auf die Systemsprache verzichte, da ich so oder so CATIA brauche und die Sprachdefinition nicht durch das System definiert werden darf! Ich habe den Code auf VB.Net migriert und auf Grund der vorhandenen Möglichkeiten vereinfacht... Code:
Public CATIA As INFITF.Application 'CATIA-Application / alternativ: As Object Public Function GetTheCATInterfaceLanguage() As String Dim ShellStr As String Dim Handle As Long Dim LangCodeInt As Integer Dim CATDDLPath As String Dim XMLFileName As String Dim CATTemp As String Dim RetCode As Boolean Const oNodeName As String = "CATSettingRepository" Const oAtrName As String = "UserInterfaceLanguage" Try 'instanziiere CATIA RetCode = Initialize_System() If RetCode = True Then CATDDLPath = CATIA.Path CATTemp = CATIA.SystemService.Environ("TEMP") XMLFileName = CATTemp & "\" & "FrameGeneral.xml" ShellStr = Chr(34) & CATDDLPath & "\CATBatGenXMLSet.exe" & """ """ & CATTemp & """ ""FrameGeneral""" 'prüfe ob schon vorhanden If FileIO.FileSystem.FileExists(XMLFileName) = True Then FileIO.FileSystem.DeleteFile(XMLFileName) End If 'erstelle XML-Datei Handle = Shell(ShellStr, vbHide, True) 'lese XML-Datei LangCodeInt = GetTheAttribut(XMLFileName, oNodeName, oAtrName) 'löscht die erstellte XML-Datei FileIO.FileSystem.DeleteFile(XMLFileName) 'internen Code in String konvertieren Select Case LangCodeInt Case 714 Return "English" Case 598 Return "French" Case 602 Return "German" Case 706 Return "Italian" Case 1337 Return "Error" Case 0 Return "Empty" Case Else Return "English" End Select Else MsgBox("CATIA is not running!") Return "no CATIA available" End If Catch ex As Exception MsgBox(ex.ToString) Return "Error while reading interface language." End Try End Function Public Function GetTheAttribut(ByVal XMLPfad As String, ByVal NodeName As String, ByVal AttributName As String) As String Dim XMLDoc As New Xml.XmlDocument Dim RootNode As Xml.XmlNode Dim ChildNode As Xml.XmlNode Try XMLDoc.Load(XMLPfad) For Each RootNode In XMLDoc.ChildNodes If RootNode.NodeType = Xml.XmlNodeType.Element And RootNode.Name = NodeName Then If RootNode.HasChildNodes = True Then For Each ChildNode In RootNode.ChildNodes If ChildNode.Attributes.Item(0).Value = AttributName Then Return ChildNode.FirstChild.InnerText End If Application.DoEvents() Next End If End If Application.DoEvents() Next Return "0" Catch ex As Exception Return "1337" End Try End Function Public Function Initialize_System() As Boolean On Error Resume Next 'Get CATIA-Application CATIA = GetObject(, "CATIA.Application") If Err.Number <> 0 Then Err.Clear() Return False End If Return True End Function
------------------ MFG Rick Schulz Nettiquette (CAD.de) - Was ist die Systeminfo? - Wie man Fragen richtig stellt. - Unities
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
InFlames Mitglied techn. Productdesigner
Beiträge: 72 Registriert: 22.09.2014 Windows 7 Professional Catia V5R26
|
erstellt am: 16. Sep. 2015 09:33 <-- editieren / zitieren --> Unities abgeben: Nur für Math.random
hi ich habe auch ein Makros erstellt in dem ich einige Parameter sperren will / muss. Funktioiert auch alles tadellos. Allerdings bekomm ich dann immer ein Fenster angezeigt "Lock / List of parameters to lock:". Dieses muss ich dann bestätigen oder abbrechen. Kann man diese Nachricht irgendwie unterdrücken vllt in den ToolsOptions? (FileAlerts geht nicht) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 17. Sep. 2015 11:54 <-- editieren / zitieren --> Unities abgeben: Nur für Math.random
|
PLP-consult Mitglied CATIA, SmarTeam & Windchill Anwenderbetreuer
Beiträge: 51 Registriert: 19.09.2005
|
erstellt am: 21. Sep. 2015 08:04 <-- editieren / zitieren --> Unities abgeben: Nur für Math.random
Hallo InFlames, ich habe in meinem *.catvba das Problem über einen SendKeys-Befehl gelöst. Dadurch bestätigst du den Dialog mit der voreingestellten Belegung (z.B. OK ist aktiver Button). .... selection1.Search "Name=ParameterName,all" CATIA.StartCommand ("Sperren") CATIA.RefreshDisplay = True SendKeys "{ENTER}" selection1.Clear end Sub Funktioniert bei mir wunderbar. Gruss Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|