| |
| Dassault PLM Integrationen mit der 3DViewStation, eine Pressemitteilung
|
Autor
|
Thema: Catcolor in vba (2741 / mal gelesen)
|
Diesaster Mitglied Student
Beiträge: 61 Registriert: 05.11.2015
|
erstellt am: 24. Aug. 2017 07:27 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen Community, eine kurze Frage in Sachen Programmierung. Es gibt ja die Funktion Code:
Objekt.SetParameterOnSubString catColor, Start, Ende, Farbe
mit der man die Farbe ändern kann. Wieso warden hier die Farben nicht richtig umgesetzt? Wenn ich beispielsweise vbRed angebe, dann färbt sich mein ausgewählter Text stets Schwarz. Das Problem zusätzlich ist, dass nicht einmal der Integer-Wert funktioniert. Rot ist hier beispielsweise -16711680 und Blau 65280. Gibt es irgendwo eine Liste mit den Codes für die Standardfarben, wie Gelb, Grün, Cyan, Magenta? Wenn ja, wo finde ich diese? Google hat leider keinen Erfolg erzielt. Ebenso das Forum nicht. Gruß Diesaster Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 24. Aug. 2017 08:59 <-- editieren / zitieren --> Unities abgeben: Nur für Diesaster
|
Diesaster Mitglied Student
Beiträge: 61 Registriert: 05.11.2015
|
erstellt am: 25. Aug. 2017 07:37 <-- editieren / zitieren --> Unities abgeben:
Danke für deine Antwort. Diese hat mir leider nicht das zurück gegeben, was ich wissen wollte. Habe es selbst heraus gefunden, wie man auf diese Werte kommt. Für den Fall das es jemand wissen will hier die kurze Erklärung, wie z.B. die negative Zahl für die rote Farbe entsteht: Das Format ist RGBA (Rot-Grün-Blau-Transparenz: Wenn ich die Farbe Rot möchte muss ich also folgenden RGBA-Code umwandeln: 255 0 0 0 Ich habe es so gelöst, dass ich die Zahl 255 in Binärcode umgewandelt habe. Dieser ist in dem Fall 11111111. Die anderen werte sind alle 0. Anschließend habe ich den Code zusammengesetzt. Dieser sieht für die Farbe Rot folgendermaßen aus: 11111111000000000000000000000000 Diesen Binärcode habe ich in den Taschenrechner eingegeben und in Dezimalzahl umrechnen lassen. Die Dezimalzahl ist dann der Farbcode für die catcolor in Catia. Dies funktioniert mit jeder anderen Farbe. Bei Grün beispielsweise hat man den Code 111111110000000000000000. Hoffe es konnte ein bisschen helfen.
Gruss Diesaster Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 25. Aug. 2017 09:04 <-- editieren / zitieren --> Unities abgeben: Nur für Diesaster
Servus Diesaster Welches Release verwendest du? zB in R19 wird scheinbar noch RBG verwendet, da funktioniert diese Zeile: Code: MyDrawingText.SetParameterOnSubString catColor, 5 , 2 , RGB(255,255,0)
Gruß Bernd PS: Bitte Systeminfo ergänzen ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lionel Hutz Mitglied
Beiträge: 451 Registriert: 26.03.2014 CATIA V5 R26
|
erstellt am: 25. Aug. 2017 09:54 <-- editieren / zitieren --> Unities abgeben: Nur für Diesaster
Habe folgendes Makro ausgeführt Code: Sub CATMain() MsgBox RGB(0,255,255) End Sub
Ergebnis: 65535 Das entspricht 256*256-1 Deshalb vermute ich, dass ihr von der selben Zahl in unterschiedlichen Formaten redet. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Diesaster Mitglied Student
Beiträge: 61 Registriert: 05.11.2015
|
erstellt am: 25. Aug. 2017 11:08 <-- editieren / zitieren --> Unities abgeben:
Ich arbeite mit verschiedenen Catia-Versionen. Von R19 bis R26 ist alles dabei. In R24 wurde das Makro geschrieben. Und ja der Zahlenwert 65280 entspricht in dem Fall Blau also sollte eigentlich RGB (0 0 255) bzw. RBG (0 255 0). Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lionel Hutz Mitglied
Beiträge: 451 Registriert: 26.03.2014 CATIA V5 R26
|
erstellt am: 25. Aug. 2017 11:41 <-- editieren / zitieren --> Unities abgeben: Nur für Diesaster
Ich habe auch Quatsch geschrieben: Mit den Werten in dem Makro oben hatte ich schon rum gespielt. Mit RGB(255,255,0) komme ich auf den oben genannten Wert. Kann mir jemand diese Logik erklären?: RGB(0,0,255) => 16711680 =256*256*255 RGB(0,255,0) => 65025 = 256*255 RGB(255,0,0) => 255 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Diesaster Mitglied Student
Beiträge: 61 Registriert: 05.11.2015
|
erstellt am: 25. Aug. 2017 11:49 <-- editieren / zitieren --> Unities abgeben:
Leider kann ich das auch nicht erklären. catColor ist ziemlich Eigen. Wie oben im Text von mir beschrieben funktionieren die Farben vbRed und co nicht. Nur wenn man es mit dem Binärcode umrechnet und den Wert für die Farbe einsetzt klappt dies.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 27. Aug. 2017 21:34 <-- editieren / zitieren --> Unities abgeben: Nur für Diesaster
Servus Lionel Zu der Codierung der RGB-Farben: Ist eine Kombination von drei Bytes, beginnend mit blau, dann grün und dann rot. Also im Heximalsystem zu Long: rot: 0000FF = 255 grün: 00FF00 = 65280 blau: FF0000 = 16711680 Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EmilioSanchez Mitglied
Beiträge: 78 Registriert: 02.11.2003 Intel I7 4700MQQ 24GB Win10 Pro 64-Bit Catia V5 R19/R26/28/29/30/32
|
erstellt am: 17. Aug. 2019 11:02 <-- editieren / zitieren --> Unities abgeben: Nur für Diesaster
Hallo, stehe vor dem gleichen Problem wie von Diesaster beschrieben. Für viele Farbzuweisungen verwendet Catia ja RGB, bestehend aus drei Kanälen, für die Farbe Rot wäre das RGB(255,0,0). Diese drei Werte lassen sich über den Farbdialog ermitteln und zuweisen. Anders z.B. bei den DrawingTextProperties die Eigenschaft .Color. Hier erwartet Catia einen Long Integer Wert kodiert aus RGBA, bestehend aus vier Kanälen, wobei der vierte die Transparenz angibt (0=Transparent / 255=Undurchsichtig so folgere ich zumindest aus der Doku) Für die Farbe Rot wäre das laut Doku RGBA(255,0,0,255) -> was einem Long Integer von -16776961 entspricht. Wie Diesaster schon geschrieben hat muß diese RGBA nun in Binärcode und dann in Long Integer umgewandelt werden. Hat vielleicht von euch jemand eine Idee wie das mit VBA Code zu lösen ist? (Die Taschenrechnermethode hilft hier nicht, ich möchte ja vom Farbdialog direkt die Farbe zuweisen) THX Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 17. Aug. 2019 13:51 <-- editieren / zitieren --> Unities abgeben: Nur für Diesaster
Servus Bernd Ich vermute dass die Berechnung so geht: Code: Sub CATMain() MsgBox CLng(&HFF0000FF) 'Hex-Wert zum vergleichen MsgBox GetRGBALong(255,0,0,255) end Sub Function GetRGBALong(lRed as Long, lGreen as Long, lBlue as Long, lAlpha as long) as long
GetRGBALong = lRed + lGreen * 256 + lBlue * 256^2 - (lAlpha + 1 ) * 256^2 'Berechnung kann noch optimiert werden end function
Stimmt das so? Ich hab leider zu wenig Beispiele gefunden um den Code zu verifizieren. Gruß Bernd EDIT: Alternative Idee falls das zusammensetzen des Hexwerts so stimmt Code: Function GetRGBALong(lRed as Long, lGreen as Long, lBlue as Long, lAlpha as long) as long GetRGBALong = Clng( "&H" & hex(lAlpha) & right((hex(lBlue + 256)),2) & right((hex(lGreen + 256)),2) & right((hex(lRed + 256)),2)) end function
------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EmilioSanchez Mitglied
Beiträge: 78 Registriert: 02.11.2003 Intel I7 4700MQQ 24GB Win10 Pro 64-Bit Catia V5 R19/R26/28/29/30/32
|
erstellt am: 17. Aug. 2019 22:04 <-- editieren / zitieren --> Unities abgeben: Nur für Diesaster
Hallo Bernd, erst mal vielen Dank für die Blitzschnelle Antwort. Ich habe deinen Codevorschlag getestet, funktioniert aber nur bei der Farbe Rot. Sieht mit anderen Werten wie folgt aus: RGB Soll IST Rot 255,0,0,255 / -16776961 / -16776961 Blau 0,0,255,255 / 65535 / -65536 Grün 0,255,0,255 / 16711935 / -16711936 Hellgrün 192,255,192,255 / -1056980737 / -4128832 Leider spuckt das WWW hierzu auch nicht viel aus. Habe nur folgende Codezeile in Java gefunden: var rgb = (red << 24) + (green << 16) + (blue << 8) + (alpha); (https://stackoverflow.com/questions/17945972/converting-rgba-values-into-one-integer-in-javascript) Sagt mir aber leider nichts. Falls jemand mal den Zahlenwert für eine Farbe braucht: Drawing mit z.B. einer Linie erstellen und eine Bemaßung ranklicken. Der Bemaßung eine Farbe geben. Diesen Codeschnipsel in VBA ausführen: Sub CATMain() Dim drawingDocument1 As DrawingDocument Set drawingDocument1 = CATIA.ActiveDocument Dim selection1 As Selection Set selection1 = drawingDocument1.Selection selection1.Search "CATDrwSearch.DrwDimension,all" Dim Dimension As DrawingDimension Set Dimension = selection1.Item(1).Value Dim oDimLine As DrawingDimLine Set oDimLine = Dimension.GetDimLine MsgBox oDimLine.Color End Sub
Gruß Bernd [Diese Nachricht wurde von EmilioSanchez am 17. Aug. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EmilioSanchez Mitglied
Beiträge: 78 Registriert: 02.11.2003 Intel I7 4700MQQ 24GB Win10 Pro 64-Bit Catia V5 R19/R26/28/29/30/32
|
erstellt am: 18. Aug. 2019 10:49 <-- editieren / zitieren --> Unities abgeben: Nur für Diesaster
Hallo, folgender Code liefert zumindest schon mal das richtige Ergebnis: Sub CATMain() 'Encode RGB nach RGBA ohne Transparenz als long integer [R,G,B (A=immer 255 = keine Transparenz)] MsgBox GetRGBALong(255, 0, 128) End Sub Function GetRGBALong(lRed As Long, lGreen As Long, lBlue As Long) As Long 'Wenn Hex-Wert einstellig auf zweistellig auffüllen StrHexRed = Hex(lRed) If Len(StrHexRe) = 1 Then StrHexRed = "0" & StrHexRed StrHexGreen = Hex(lGreen) If Len(StrHexGreen) = 1 Then StrHexGreen = "0" & StrHexGreen StrHexBlue = Hex(lBlue) If Len(StrHexBlue) = 1 Then StrHexBlue = "0" & StrHexBlue
GetRGBALong = ("&H" & StrHexRed & StrHexGreen & StrHexBlue & Hex(255)) End Function Vielleicht geht's ja eleganter. Gruß Bernd [Diese Nachricht wurde von EmilioSanchez am 18. Aug. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |