| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Collection (1867 mal gelesen)
|
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004 Map 2015 x64 Win7 x64 12 GB RAM ADN OpenDCL
|
erstellt am: 17. Okt. 2005 13:46 <-- editieren / zitieren --> Unities abgeben:
|
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 17. Okt. 2005 15:59 <-- editieren / zitieren --> Unities abgeben: Nur für fred_tomke
Leider musst du die Collection durchlaufen und schauen, ob der Layer existiert Function ExistsLayer(LayerName As String) As Boolean Dim n1 As AcadLayer For Each n1 In ThisDrawing.Layers If n1.Name = LayerName Then ExistsLayer = True: Exit Function Next End Function Eine 2. (aber meiner Meinung nach unsaubere) Möglichkeit waäre, beim Zugriff mittels Layername einen eventuellen fehler abzufangen LayerName = "hugo" On Error Resume Next Layer = ThisDrawing.Layers.Item(LayerName) If Err.Number <> 0 Then ThisDrawing.Layers.Add (LayerName) Err.Clear End If ------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 17. Okt. 2005 16:01 <-- editieren / zitieren --> Unities abgeben: Nur für fred_tomke
Hallo Fred, mit try and error beim Layer
Code:
dim Layer as acadlayeron error resume next set layer = thisdrawing.layers("MyLayer") if err.number <> 0 then msgbox "Layer war noch nicht vorhanden" thisdrawing.layers.add("MyLayer") end if
oder mit einer Schleife
Code:
function ExistLayer (Layername as string) as boolean dim Layer as acadlayer for each Layer in Thisdrawing.layers if Layer.name = Layername then ExistLayer=true exit function end if next Layer end function
Bei den anderen läufst im Prinzip genauso. Stelli ------------------ Warum lisp'eln wenn's auch anders geht. [Diese Nachricht wurde von Stelli1 am 17. Okt. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 17. Okt. 2005 16:06 <-- editieren / zitieren --> Unities abgeben: Nur für fred_tomke
|
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 17. Okt. 2005 16:25 <-- editieren / zitieren --> Unities abgeben: Nur für fred_tomke
Zitat: Original erstellt von Stelli1: @anton War´s ein wenig schneller. Aber immerhin sind die Antworten fast gleich.Gruß STelli
sehr beeindruckend unser doch sehr ähnlicher Stil
ich Function ExistsLayer(LayerName As String) As Boolean du function ExistLayer (Layername as string) as boolean
------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004
|
erstellt am: 17. Okt. 2005 19:28 <-- editieren / zitieren --> Unities abgeben:
Hallo, Eure Antworten hatte ich befürchtet. Habe mich (laut fuchsi) für die unsaubere Methode entschieden, somit gelingt es mir eine GetOrCreate-Funktion zu schreiben: <code> Function GetOrCreateDict(strName As String) Dim oDics As AcadDictionaries Dim oDic As AcadDictionary Set oDics = oDoc.Dictionaries On Error GoTo errDicItemGet Set oDic = oDics.Item(strName) GoTo exitDicItemGet errDicItemGet: Set oDic = oDics.Add(strName) exitDicItemGet: Set GetOrCreateDict = oDic End Function </code> Vielen Dank für Eure Hilfe VG, Fred Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 17. Okt. 2005 21:17 <-- editieren / zitieren --> Unities abgeben: Nur für fred_tomke
Hallo Fred, noch ein paar Anregungen 1. wenn du anstelle <code> mit der eckigen Klammer [ arbeitest kommst richtig. Bin ich auch drauf reingefallen. 2. Der Rückgabewert deiner Funktion ist Variant(Deklarierung fehlt) 3. Mit den ganzen Goto würde ich möglichst verbannen. Wenn VBA.net kommt gibts nur Probleme. Dann hast du es etwa so
Code:
Try x= 7 / 0 catch messagebox.show "Alles Quark" End Try
Dann kommst du mit On Error Resume Next und Abfrage der Fehlernummer besser weg.Viel Erfolg STelli ------------------ Warum lisp'eln wenn's auch anders geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004
|
erstellt am: 18. Okt. 2005 00:07 <-- editieren / zitieren --> Unities abgeben:
|
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 18. Okt. 2005 08:23 <-- editieren / zitieren --> Unities abgeben: Nur für fred_tomke
Zitat: Original erstellt von fred_tomke: Hallo, Eure Antworten hatte ich befürchtet. Habe mich (laut fuchsi) für die unsaubere Methode entschieden, somit gelingt es mir eine GetOrCreate-Funktion zu schreiben:<code> Function GetOrCreateDict(strName As String) Dim oDics As AcadDictionaries Dim oDic As AcadDictionary Set oDics = oDoc.Dictionaries On Error GoTo errDicItemGet Set oDic = oDics.Item(strName) GoTo exitDicItemGet errDicItemGet: Set oDic = oDics.Add(strName) exitDicItemGet: Set GetOrCreateDict = oDic End Function </code> Vielen Dank für Eure Hilfe VG, Fred
dann würd ich die Function so schreiben wieder als Beispiel die Layertabelle Public Function GetOrCreateLayer(Layername As String) As AcadLayer Dim layer As AcadLayer For Each layer In ThisDrawing.Layers If layer.Name = Layername Then Set GetOrCreateLayer= layer Exit Function End If Next Set GetOrCreateLayer= ThisDrawing.Layers.Add("Layername") End Function
------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 18. Okt. 2005 09:00 <-- editieren / zitieren --> Unities abgeben: Nur für fred_tomke
Hallo Fred, mit Function GetOrCreateDict(strName As String) ist die Rückgabe vom Typ Variant. mit Function GetOrCreateDict(strName As String) As AcadDictionary ist es korrekt. Stelli
------------------ Warum lisp'eln wenn's auch anders geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004
|
erstellt am: 18. Okt. 2005 09:27 <-- editieren / zitieren --> Unities abgeben:
Hallo, erst mal muss ich sagen, dat sieht ja Klasse aus. Dann fällt mir auf, dass ja der Layername "Abc" streng genommen ungleich "ABC" ist. Demnach gehe ich davon aus, dass das einzelne = in der Bedingung layer.Name = Layername die beiden Texte als UpperStrings vergleicht. Frage: wie würde ich das dann casesensitiv vergleichen? VG und vor allem vielen Dank! Fred
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 18. Okt. 2005 09:32 <-- editieren / zitieren --> Unities abgeben: Nur für fred_tomke
|
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004
|
erstellt am: 18. Okt. 2005 09:38 <-- editieren / zitieren --> Unities abgeben:
Schreiben wir also am Ende unseres 2. VBA-Schulungstages in der Prüfung folgende Funktion: Public Function GetOrCreateLayer(Layername As String) As AcadLayer Dim layer As AcadLayer For Each layer In ThisDrawing.Layers If ucase(layer.Name) = ucase(Layername) Then Set GetOrCreateLayer= layer Exit Function End If Next Set GetOrCreateLayer= ThisDrawing.Layers.Add(Layername) End Function Mei, dann wirds ja doch was mit dem VBA. VG und VD, Fred Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 18. Okt. 2005 09:45 <-- editieren / zitieren --> Unities abgeben: Nur für fred_tomke
Hallo Fred, super, bestanden, setzen und hau rein! Kriegt´s ne Belohnung! Stelli ------------------ Warum lisp'eln wenn's auch anders geht. [Diese Nachricht wurde von Stelli1 am 18. Okt. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 18. Okt. 2005 09:57 <-- editieren / zitieren --> Unities abgeben: Nur für fred_tomke
Zitat: "Abc" like "ABC" ist true
seit wann ? der vergleichsoperator LIKE verwendet genausso die OPTION COMPARE Einstellung. Ist diese nicht gesetzt, wird Option Comapre Binary angenommen und dann lautet: A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø erst bei OPTION COMPARE TEXT gilt (A=a) < (À=à) < (B=b) < (E=e) < (Ê=ê) < (Z=z) < (Ø=ø)
------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 18. Okt. 2005 10:01 <-- editieren / zitieren --> Unities abgeben: Nur für fred_tomke
|
fred_tomke Mitglied Applikationsingenieur
Beiträge: 156 Registriert: 14.06.2004
|
erstellt am: 18. Okt. 2005 11:04 <-- editieren / zitieren --> Unities abgeben:
ähm, ich muss das jetzt nicht verstehen oder? Wat macht OPTION COMPARE TEXT genau? Ich gehe davon aus, dass OPTION Einstellungen für das Modul trifft. Wann macht es Sinn, OPTION COMPARE TEXT zu setzen, wohin setzt Ihr es (vor die Function oder ganz zu Beginn des Moduls oder gar in Projekteigenschaften)? VG und VD, Fred Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 18. Okt. 2005 11:57 <-- editieren / zitieren --> Unities abgeben: Nur für fred_tomke
Hallo Fred, Anton hat mich auch auf einen Punkt gebracht. Da muss ich mal mein Projekt nach like durchsuchen ob es da immer richtig ist. Ansonsten OPTION COMPARE TEXT und F1 Wenn du mit UCASE() arbeitets (ich habs hoffe ich immer) kanst du die Einstellung vergessen. Stelli ------------------ Warum lisp'eln wenn's auch anders geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |