| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Color über fromNames oder fromDictionaryName (3416 mal gelesen)
|
Gloem Mitglied Geoinformatiker
Beiträge: 179 Registriert: 07.12.2007 Windows 10 - 64 Bit, mindestens 16 GB RAM <P>AutoCAD Map 2020, VBA, Dot-Net
|
erstellt am: 24. Okt. 2009 15:52 <-- editieren / zitieren --> Unities abgeben:
Hallo, kann mir jemand erklären wie ich die Farbfunktionen Color.fromNames() und Color.fromDictionaryName() für Palettenfarben verwenden muss. Immer wenn ich entweder color.FromName("Pantone 17...", "Pantone(R)...") or Color.FromDictionaryName("Pantone(R)...$Pantone 17...") verwende zeigt der Debugger mir zwar die meisten der Werte meiner neuen Farbe richtig an (siehe Anhang) jedoch hat die Farbe keinen Rot, Grün und Blau-Anteil sondern ist einfach Schwarz. Ebenfalls haben die Boolschen-Variablen "isByColor" and "isByLayer" die falschen Werte (false und true anstatt true und false). Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 24. Okt. 2009 16:15 <-- editieren / zitieren -->
Hi, ein CodeSnippet wäre da mal schon vorteilhaft, denn wenn Du irgendwas ColorDialog-artiges zeigst, dann kann das nichts mit der Entity-Methode byColor oder byLayer zu tun haben (ausser ich interpretiere den Screenshot ganz falsch, aber leider ohne zu sehen, wo Du im Code gerade bist, ist's auch schwer). Ich fang halt mal mit einem CodeSnippet an und hoffentlich nähern wir uns: Code: 'Farbe des Elements auf Farbindex (<tColorIndex>): DBEntity.Color = Colors.Color.FromColorIndex(Colors.ColorMethod.ByAci, tColorIndex)'Farbe des Elements auf einen RGB-Wert DBEntity.Color = Colors.Color.FromRgb(tR, tG, tB) 'Farbe des Elements auf byLayer DBEntity.Color = Colors.Color.FromColorIndex(Colors.ColorMethod.ByLayer, 256)
- alfred - ------------------ www.hollaus.at |
Gloem Mitglied Geoinformatiker
Beiträge: 179 Registriert: 07.12.2007 Windows 10 - 64 Bit, mindestens 16 GB RAM <P>AutoCAD Map 2020, VBA, Dot-Net
|
erstellt am: 24. Okt. 2009 16:27 <-- editieren / zitieren --> Unities abgeben:
Danke für die schnelle Antwort Alfred - Du scheinst echt keine anderen Hobbys zu haben als hier im Forum rumzuhängen. Hier mal folgende Fuktion um die es sich dreht: Code: ' Funktion um anhand der übergebenen Werte eine AutoCAD-Farbe zu erzeugen ' - AutoCAD-Stiftfarbe, Index oder RGB-Farbwert sowie Palettenfarben werden unterstützt Private Function getAutoCADColor(ByVal colorTyp As String, ByVal colorName As String) As Autodesk.AutoCAD.Colors.Color ' Prüfen welche Farbart verwendet werden soll Select Case colorTyp ' AutoCAD-Stiftfarbe Case "Stift" Return Color.FromColorIndex(ColorMethod.ByPen, [Enum].Parse(GetType(colorsByPen), colorName)) ' Index-Farbwert Case "Index" Return Color.FromColorIndex(ColorMethod.ByAci, colorName) ' RGB-Farbwert Case "Echtfarbe" Dim rgbValues As String() = Split(colorName.Substring(5, colorName.Length - 6), ", ") Return Color.FromRgb(rgbValues(0), rgbValues(1), rgbValues(2)) ' Palette Case Else Return Color.FromNames(colorName, colorTyp) End Select End Function
In der Variablen colorTyp steht entweder 'Stift', 'Index', 'Echtfarbe' oder der Bookname wenn es sich um eine Palettenfarbe handelt. In der Variablen colorName steht entweder 'Rot', 'Grün', usw. wenn es eine Stiftfarbe ist, '10', '11', ..., '255' wenn es eine Indexfarbe ist, 'RGB (12,20,30)' o.ä. wenn es eine Echtfarbe ist oder eben der Farbname wenn es eine Palettenfarbe ist. Folgende Enumeration ist vielleicht auch noch interessant:
Code: ' Aufzählung mit den AutoCAD-Stiftfarben Public Enum colorsByPen As Short Rot = 1 Gelb = 2 Grün = 3 Cyan = 4 Blau = 5 Magenta = 6 Weiss = 7 End Enum
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 24. Okt. 2009 20:01 <-- editieren / zitieren -->
Hi, wenn ich dieses schreibe, dann kann ich keinen Fehler feststellen, die Linie erhält die gewünschte Farbe (und steht dann auch nicht auf byLayer oder ähnliches). Kannst Du das mal bei Dir probieren? Code: <Autodesk.AutoCAD.Runtime.CommandMethod("CADde_EntColor")> _ Public Shared Sub CADde_EntColor() Dim tAcadDoc As ApplicationServices.Document = Nothing Dim tDocLock As ApplicationServices.DocumentLock = Nothing Dim tTrAct As DatabaseServices.Transaction = Nothing Try tAcadDoc = ApplicationServices.Application.DocumentManager.MdiActiveDocument tDocLock = tAcadDoc.LockDocument tTrAct = tAcadDoc.TransactionManager.StartTransaction Dim tBlTab As DatabaseServices.BlockTable = CType(tTrAct.GetObject(tAcadDoc.Database.BlockTableId, DatabaseServices.OpenMode.ForRead, True, True), DatabaseServices.BlockTable) Dim tModSp As DatabaseServices.BlockTableRecord = CType(tTrAct.GetObject(tBlTab.Item("*Model_Space"), DatabaseServices.OpenMode.ForWrite, True, True), DatabaseServices.BlockTableRecord) Dim tLine As DatabaseServices.Line = New DatabaseServices.Line(Geometry.Point3d.Origin, New Geometry.Point3d(10, 10, 0)) tLine.Color = Autodesk.AutoCAD.Colors.Color.FromNames("RAL 1000", "RAL CLASSIC") tModSp.AppendEntity(tLine) tTrAct.AddNewlyCreatedDBObject(tLine, True) MsgBox("LineColor: " & tLine.Color.ToString) tTrAct.Commit() Catch ex As Exception MsgBox("Unknown Error in CADde_EntColor" & vbNewLine & ex.Message) Finally If tTrAct IsNot Nothing Then tTrAct.Dispose() : tTrAct = Nothing End Try End Sub
Bzgl. 'ColorMethod.ByPen' kann ich leider gar nix sagen, nur vermuten, dass diese mit STB-Files zu tun hat und mit denen hab ich noch nie gemacht (und um ganz ehrlich zu sein, wenn ich nicht so eine Zeichnung geliefert bekomme, werd ich auch nix mehr damit zu tun bekommen), ich hoffe aber wohl, dass wir Deinem Problem näherrücken, denn bei mir erhält die Linie dann nach der Farbzuweisung die richtigen Einstellungen, zumindest sehe ich keine Fehler.
- alfred - ------------------ www.hollaus.at |
Gloem Mitglied Geoinformatiker
Beiträge: 179 Registriert: 07.12.2007 Windows 10 - 64 Bit, mindestens 16 GB RAM <P>AutoCAD Map 2020, VBA, Dot-Net
|
erstellt am: 24. Okt. 2009 22:59 <-- editieren / zitieren --> Unities abgeben:
Hab dein Beispiel mal kurz ausprobiert. Die Linie besitzt bei mir die Farbe "VonLayer" was sowohl von der MsgBox als auch vom Debugger und dem Eigenschaftsfenster angezeigt wird. Vielleicht ist es relevant das ich AutoCAD Map 2009 nutze und auch mit dem dazugehörigen SDK programmiere. Ach ja, die anderen 3 Case-Fälle in meiner Funktion funktionieren soweit ich das bislang getestet hab tadellos nur die Palettenfarben machen Ärger [Diese Nachricht wurde von Gloem am 24. Okt. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 24. Okt. 2009 23:10 <-- editieren / zitieren -->
Hi, nein, ich kann nicht annehmen, dass dies mit Map3D in Zusammenhang zu bringen ist. Ich habe diesen Code mit Civil3D2009 und Civil3D2010 probiert (und da wäre ja auch Map3D enthalten), in beiden Fällen bekomme ich nicht 'byLayer' angezeigt. Siehe auch meinen Screenshot. Was passiert denn eigentlich nach Ablauf der Funktion, wenn Du Befehl: _audit startest, bekommst Du dann Fehler geliefert? Bzw. wenn Du diese Linie dann anklickst, welche Meinung hat denn das Eigenschaftsfenster von der Elementfarbe? - alfred - ------------------ www.hollaus.at |
Ex-Mitglied
|
erstellt am: 24. Okt. 2009 23:20 <-- editieren / zitieren -->
Hi STOP ZURÜCK!!!! Meine Meinung, dass ich es mit 2009 probiert hätte, ist scheinbar auf Unterbrechungen zurückzuführen. Als ich jetzt bewusst mal auf pures AutoCAD 2009 gestellt habe und nochmals probiert habe, sah ich Dein Problem und damit ist es auch für mich reproduzierbar. Und da es mit 2010 funktioniert, halte ich es (leider aus Deiner Sicht) für einen Bug. Also probier, wenn es in Deinem Code möglich ist, mal über den COM-Objekt-Zugriff umzustellen, vielleicht geht's damit (und hoffentlich geht's in Deiner Struktur). Nochmals Sorry für meine erste Rückmeldung, da hab ich einfach Debuggen gestartet und nicht darauf geachtet, dass es eigentlich 2010 war. Aber wenigstens ist damit auch ausgeschlossen, dass es von Map3D abhängt.! - alfred - ------------------ www.hollaus.at |
Gloem Mitglied Geoinformatiker
Beiträge: 179 Registriert: 07.12.2007 Windows 10 - 64 Bit, mindestens 16 GB RAM <P>AutoCAD Map 2020, VBA, Dot-Net
|
erstellt am: 24. Okt. 2009 23:47 <-- editieren / zitieren --> Unities abgeben:
Das es ein Bug ist hatte ich auch schon befürchtet da man bei der Funktion eigentlich nicht viel verkehrt machen kann. Ist es denn wohl ein Bug in AutoCAD oder im sdk? Kann man das 2010er sdk auch mit AutoCAD2009 nutzen? Der Zugriff über COM sagt mir jetzt nicht viel. Die Funktion wird per Doppelklick auf ein Feld in einem datagridview aufgerufen und baut aus den dortigen werten die autocadfarbe zusammen. Kann man ansonsten den colordialog dazu bringen den Tab mit den palettenfarben nicht anzuzeigen? [Diese Nachricht wurde von Gloem am 24. Okt. 2009 editiert.]
[Diese Nachricht wurde von Gloem am 24. Okt. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 24. Okt. 2009 23:54 <-- editieren / zitieren -->
Hi, >> Kann man das 2010er sdk auch mit AutoCAD2009 nutzen? Was bezeichnest Du mit SDK, wenn Du mit vb.NET programmierst? Eigentlich brauchst Du das ObjectARX-SDK nur für Beispiele und Hilfefiles, aber Deine Applikation greift auf nichts aus dem SDK hin! Du zeigst in den Verweisen lediglich auf dll's des AutoCAD's oder auf Assemblies, die über die GAC registriert sind. Die Applikationen die Du mit Verweisen auf 2009-Lib's erzeugst, sind nicht mit 2010 verwendbar, da zwischen 2009 und 2010 die Binärkompatibilität gebrochen wurde. Daher leider: NEIN. - alfred - ------------------ www.hollaus.at |
Ex-Mitglied
|
erstellt am: 25. Okt. 2009 00:06 <-- editieren / zitieren -->
Hi, und zu COM-basierter Farbvergabe: - nimm aus obigem Code die Farbzuweisung heraus - setze nachfolgenden Code nach der Zeile, in der die Linie der TransAction hinzugefügt wird, ein Code: Dim tLineCOM As Interop.Common.AcadLine = CType(tLine.AcadObject, Interop.Common.AcadLine) Dim tColor As Interop.Common.AcadAcCmColor = New Interop.Common.AcadAcCmColor tColor.SetColorBookColor("RAL CLASSIC", "RAL 1000") tLineCOM.TrueColor = tColor
Das funktioniert jetzt auch mit 2009, Voraussetzung dazu ist leider, das Du Zugriff auf die COM-bezogenen Eigenschaften nur dann bekommst, wenn es der Datenbank zugehörig ist (zumindest 'isTransActionResident' oder 'isPersistent' müssen auf TRUE stehen, anderenfalls hab ich schon den einen oder anderen Abflug bei Zugriff auf die Entity-Eigenschaften gehabt). HTH, - alfred - ------------------ www.hollaus.at [Diese Nachricht wurde von a.n. am 25. Okt. 2009 editiert.] |
Gloem Mitglied Geoinformatiker
Beiträge: 179 Registriert: 07.12.2007 Windows 10 - 64 Bit, mindestens 16 GB RAM <P>AutoCAD Map 2020, VBA, Dot-Net
|
erstellt am: 25. Okt. 2009 00:07 <-- editieren / zitieren --> Unities abgeben:
Mhm, irgendwie war das programmieren mit vba einfacher :-) was hab den jetzt für Möglichkeiten? Kompletter Umstieg auf AutoCAD2010 - doof, COM-Umstieg-keine Ahnung, weglassen der Unterstützung für palettenfarbe -ärgerlich aber ok. Kann man beim colordialog den Tab mit den palettenfarben weglassen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Gloem Mitglied Geoinformatiker
Beiträge: 179 Registriert: 07.12.2007 Windows 10 - 64 Bit, mindestens 16 GB RAM <P>AutoCAD Map 2020, VBA, Dot-Net
|
erstellt am: 25. Okt. 2009 00:23 <-- editieren / zitieren --> Unities abgeben:
Du antwortest zu schnell. So schnell kann ich mit meinem iTouch nicht tippen. Zuerst mal möchte ich einen colordialog mit einer vorgewählten Farbe aufrufen und diese Farbe wird aus farbwerten aus einem datagridview erstellt. Letztendlich sollen anhand einer zuordnungstabelle allen Elementen der Zeichnung eine Farbe entsprechend ihrer linienstärke zugewiesen werden Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 25. Okt. 2009 00:28 <-- editieren / zitieren -->
Hi, wenn Du nicht unbedingt auf Farben von AutoCAD angewiesen bist, dann kannst Du ja statt des AutoCAD-Farbdialogs doch den Windows-Farbdialog verwenden und gleich die RGB-Farben aussuchen/zuweisen lassen. Einen Weg, den AutOCAD-Farbdialog so zu starten, dass die Farbbücher nicht auswählbar sind, hätte ich mir nicht angesehen, nur rein vom Bauchgefühl wird's nicht funken. Hilft die obige Lösung mit COM nicht? Denn dann würde ja wieder alles funktionieren, wie Du es erhoffst. - alfred - ------------------ www.hollaus.at |
Gloem Mitglied Geoinformatiker
Beiträge: 179 Registriert: 07.12.2007 Windows 10 - 64 Bit, mindestens 16 GB RAM <P>AutoCAD Map 2020, VBA, Dot-Net
|
erstellt am: 25. Okt. 2009 10:43 <-- editieren / zitieren --> Unities abgeben:
Guten morgen, hatte gestern dann doch irgendwann beschlossen den iTouch zur Seite zu legen und einzuschlafen. Deinen Vorschlag mit dem COM-Objekt hab ich ausprobiert, allerdings kann ich in meiner obigen Funktion nicht einfach dasObjekt zurückgeben Code: Public Function getAutoCADColor(ByVal colorTyp As String, ByVal colorName As String) As Autodesk.AutoCAD.Colors.Color ' Prüfen welche Farbart verwendet werden soll Select Case colorTyp ' Palette Case Else Dim col As AcadAcCmColor = New AcadAcCmColor col.SetColorBookColor(colorTyp, colorName) Return col End Select End Function
Und wahrscheinlich würde der ColorDialog dieses Objekt auch nicht akzeptieren. Folgendes funktioniert aber, auch wenn ich so in meinem ganzen Programm keine Palettenfarben mehr zulasse Code: colorDialog.SetDialogTabs(Autodesk.AutoCAD.Windows.ColorDialog.ColorTabs.ACITab Xor Autodesk.AutoCAD.Windows.ColorDialog.ColorTabs.TrueColorTab)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 25. Okt. 2009 11:10 <-- editieren / zitieren -->
Hi, >> Folgendes funktioniert aber, auch wenn ich so in meinem >> ganzen Programm keine Palettenfarben mehr zulasse... wieder was gelernt Du kannst ja vor Deinem Aufruf die aktuelle Einstellung ändern und dann wieder zurücksetzen. Ist Deine Aufgabe mit all den Informationen aus diesem Thread jetzt gelöst oder noch was offen? - alfred - ------------------ www.hollaus.at |
Gloem Mitglied Geoinformatiker
Beiträge: 179 Registriert: 07.12.2007 Windows 10 - 64 Bit, mindestens 16 GB RAM <P>AutoCAD Map 2020, VBA, Dot-Net
|
erstellt am: 25. Okt. 2009 11:20 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für deine Hilfe. Wirklich gelöst wäre es ja eigentlich erst mit unserem Umstieg auf AutoCAD2010. Aber das Weglassen der Palettenfarben ist auch kein Beinbruch, die Benutzen wir eh nie. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 25. Okt. 2009 11:32 <-- editieren / zitieren -->
Hi, Du kannst doch auf die Beschränkung verzichten, wenn Du statt: Code: Public Function getAutoCADColor(ByVal colorTyp As String, ByVal colorName As String) As Autodesk.AutoCAD.Colors.Color
die Funktion so aufbaust, dass Du das Entity übergibst und in der Sub die Farbe den Entity zuweisen lässt: Code: Public Function setAutoCADColor(ByRef Ent as DatabaseServices.Entity, ByVal colorTyp As String, ByVal colorName As String) As boolean Dim tRetVal as Boolean = True Try ' Prüfen welche Farbart verwendet werden soll Select Case colorTyp case .... 'fuer jeden Typ ausser ColorBook-bezogene Dein Handling von oben Case Else Dim tEntCOM As Interop.Common.AcadEntity = CType(Ent.AcadObject, Interop.Common.AcadEntity) Dim tColor As Interop.Common.AcadAcCmColor = New Interop.Common.AcadAcCmColor tColor.SetColorBookColor("RAL CLASSIC", "RAL 1000") tEntCOM.TrueColor = tColor End Select Catch ex as Exception tRetVal = False End Try Return tRetVal End Function
Dabei kannst Du durchaus auch einen zuvor ermittelten FarbTyp mitübergeben, und wenn dieser nicht gültig übergeben ist (im Falle von Farbbuch-Wert), dann eben die COM-bezogene Aktion durchführen lassen. HTH, - alfred - ------------------ www.hollaus.at [Diese Nachricht wurde von a.n. am 25. Okt. 2009 editiert.] |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|