| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | |  | PNY wird von NVIDIA zum Händler des Jahres gewählt - zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Liegt eine Blockref an diesem Punkt? (1096 mal gelesen)
|
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 25. Mai. 2009 10:06 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen  , ich hab mal wieder ein kleines Problem: Ich möchte wissen, ob an einer bestimmten Koordinate eine Blockreferenz liegt. Gibt es hierfür vllt eine Funktion, der ich den Punkt übergebe und die Funktion sagt mir, ob da eine Blockreferenz liegt? Ich vermute mal, Ihr werdet sagen, dass der Punkt sehr genau angegeben werden muss, damit man was findet. Ich habe den evtl vorhandenen Block aber selber mit 3 Nachkommastellen Genauigkeit eingefügt, und da wird auch nicht dran rumskaliert oder so. Deshalb kann ich den Punkt ziemlich genau wieder angeben. Da ich noch keinerlei Erfahrungen mit SelectionSet habe, wäre eine alternative Lösung sehr hilfreich Danke für Hilfestellungen gruß Frank ------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 25. Mai. 2009 10:48 <-- editieren / zitieren -->
Hi Frank, wenn Du unabhängig von SelectionSet sein willst, musst Du die ganze Geometrie durchscannen, das macht bei kleinen Zeichnungen kein Problem, bei grossen Zeichnungen kann das schon mal ein Problem werden. Die BlockReference hat die Eingeschaft 'InsertionPoint', diese ist ein Array von 3 Doubles (X/Y/Z) und die kannst Du mit Deinem gesuchten Punkt vergleichen, wenn Du eine Toleranz mitgibst, dann folgender Vergleich möglich: Code: Dim tInsPnt as Variant tInsPnt = BlRef.InsertionPoint 'diese BlockReference willst Du prüfen'Pnt sehe ich nachfolgend als ein Array von 3 Doubles, welche Deinen gesuchten Punkt darstelle if (Abs(tInsPnt(0)-pnt(0)) <= Tolerance) then if (Abs(tInsPnt(1)-pnt(1)) <= Tolerance) then if (Abs(tInsPnt(2)-pnt(2)) <= Tolerance) then 'dann ist das ein Treffer
- alfred - ------------------ www.hollaus.at |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 25. Mai. 2009 11:56 <-- editieren / zitieren --> Unities abgeben:         
Hallo Alfred, schon mal Danke für die Antwort, aber ich glaube, dass ich meine Frage etwas anders stellen sollte: Ich suche mit 'For Each Enity in ThisDrawing' nach Blockreferenzen. Mit der mir schon bekannten InsertionPoint-Funktion lese ich den Einfügepunkt aus. Dann rechne ich mit diesem Punkt einen neuen Punkt aus. Jetzt möchte ich wissen, ob an diesem neuen Punkt ebenfalls eine Blockreferenz liegt oder nicht. Ich habe in anderen Beiträgen schon etwas mit SelectAtPoint gesehen, aber das scheint was mit SelectionSet zu sein. Vielleicht sollte ich mir das doch mal anschauen? gruß Frank ------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 25. Mai. 2009 12:03 <-- editieren / zitieren -->
Hi, Zitat: 'For Each Enity in ThisDrawing'
...das kann so nicht funktionieren, oder? Müsste doch heissen ...in ThisDrawing. ModelSpace  (oder ein Layout-Block, wenn nicht ModelSpace) Mit 'SelectAtPoint' hast Du das Problem, dass der Punkt im Bildschirmbereich (im sichtbaren Bereich) liegen muss und zusätzlich, dass da nicht mehrere Elemente liegen sollten, er gibt sonst alles zurück, was in die Größe der Pickbox fällt; und wenn Du dann auch noch einen Block hast, der am Einfügepunkt keine Geometrie hat (z.B. Kreis), dann selektiert er diesen nicht. Wenn Du den Vorgang sehr oft wiederholen musst (....Dann rechne ich mit diesem Punkt einen neuen Punkt aus....), dann würde ich mir zuerst aus allen Blockreferenzen ein Array mit deren Koordinaten erstellen und dann in dem Array rechnen. - alfred - ------------------ www.hollaus.at [Diese Nachricht wurde von a.n. am 25. Mai. 2009 editiert.] |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 25. Mai. 2009 12:33 <-- editieren / zitieren --> Unities abgeben:         
Hallo, das mit dem Array klingt schon ganz gut. Das kann zwar etwas größer werden (ich hab bis zu 90000 Blöcke), aber ich werd das mal ein wenig ausprobieren und lasse Euch das Ergebnis dann wissen. gruß Frank ------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 25. Mai. 2009 12:48 <-- editieren / zitieren -->
Hi, 90.000 Blöcke sind für ein Array nicht viel! Davon ausgehend, dass wir 8Byte je Double-Wert haben, dann das ganze mal 3 (X/Y/Z) ergibt das gerade mal 2MB Speicher, den hast Du schon eingebaut, oder? Zum Suchen könntest Du hier einen kleinen Trick verwenden und die Koordinaten zu einem Key machen udn alles in einer Collection speichern, vor allem, wenn Du begrenzte Genauigkeit brauchst, das Suchen über Key geht dann deutlich schneller als das Array durchzuschaufeln. Code: Dim tColl as Collection Set tColl = new CollectionDim tEnt as AcadEntity For Each tEnt in ThisDrawing.ModelSpace If Type Of tEnt is AcadBlockReference then tColl.Add(tEnt, getKey(tEnt.InsertionPoint)) 'vorsicht, hier wäre eine Fehlermeldung, wenn 2 Blöcke an der gleichen Koordinate liegen und damit den gleichen Key hätten End If Next '...... 'und das suchen würde dann folgendermaßen funktionieren dim tSearchPnt(2) as Double tSearchPnt(0) = 4711.23 tSearchPnt(1) = 711.23 if tColl.Contains(getKey(tSearchPnt)) then 'dann gibt's hier eine BlockReference '------------------- 'und den Key ausrechnen: Private Function getKey(byVal Pnt as Variant) as String dim tRetVal as String tRetVal = "X" & format(Pnt(0),"#.000") 'genauigkeit auf 3 Stellen begrenzt tRetVal = tRetVal & "_" 'einfacher Seperator tRetVal = tRetVal & "Y" & format(Pnt(1),"#.000") 'und wenn Z-Wert auch noch dazusollte, dann hier entsprechen anfügen getKey = tRetVal End Function
nur geschrieben, nicht laufen gelassen, also Fehler möglich, aber der Sinn sollte daraus hervorgehen.
- alfred - ------------------ www.hollaus.at |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 26. Mai. 2009 12:47 <-- editieren / zitieren --> Unities abgeben:         
Hallo, habe mal eine Collection angelegt und mit Keys gefüllt, läuft alles prima und auch super fix. Nur die Methode ".Contains" ist anscheinend nicht bekannt oder wird nicht unterstüzt. Ich habs auch schon mit ner Dictionary(hab auch den Verweis auf die MS Scripting Runtime gemacht) anstatt ner Collection getestet, geht aber auch nicht. code: If Coll.Contains(getKey(TestPoint)) Then... Hier zickt das Programm rum. Beim Debuggen wird die Function getKey noch ordentlich durchlaufen und dann kommt "Object unterstützt diese Eigenschaft oder Methode nicht" Gibts ne Alternative, sonst versuch ichs mit nem Array und schaufel mich da durch gruß Frank
------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 26. Mai. 2009 13:09 <-- editieren / zitieren -->
Hi, sorry, da war ich gedanklich in dotNET In VBA/VB6: Code: On Error Resume Next dim tItem as AcadBlockReference set tItem = nothing 'nur damit nicht von vorheriger Schleife was drinsteht set tItem = tColl.Item(getKey(tSearchPnt)) if (not (tItem is Nothing)) then 'fündig
- alfred -
------------------ www.hollaus.at |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 26. Mai. 2009 15:33 <-- editieren / zitieren --> Unities abgeben:         
Hallo Alfred, danke für die Korrektur, ist bestimmt nicht einfach, immer zwischen den verschiedenen Sprachen zu wechseln. Jetzt hat sich aber das nächste Problem ergeben. Wenn ein Punkt abgefragt wird, an dem keine Bockref liegt sagt mir das Programm: "ungültiger Prozeduraufruf oder ungültiges Argument". Der key des Punktes wird aber noch sauber erstellt. Langsam komm ich mir schon etwas blöd vor weil ich selbst nix mehr hinkriege. Kann man da noch was machen? gruß Frank ------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 26. Mai. 2009 15:42 <-- editieren / zitieren -->
Hi, die Zeile 'set tItem = tColl.Item(getKey(tSearchPnt))' bringt dann einen Fehler, wenn in der Collection kein Item mit dem gesuchten Key (an den gesuchten Koordinaten) vorhanden ist, genau das ist das Zeichen, dass dort eben keine BlockReferenz besteht. Darum steht auch davor 'On Error Resume Next' damit der Code weiterlaufen kann und damit Deine Entscheidung, ob dort eine BlockReference vorhanden ist oder nicht, trotzdem verfügbar ist. Mit 'On Error Resume Next' muss man schon vorsichtig umgehen, weil Fehler in der Regel auch länger zum 'Aufgefangen werden' brauchen, der Codeablauf daher auch langsamer wird. Abhängig von 'wie oft suchst Du einen Punkt' und 'mit welcher zu erwartenden Trefferquote' kann das auch spürbar werden. Ich glaube aber doch, dass über den Key einer Collection schneller die Entscheidung (Block an dieser Position vorhanden oder nicht) gefunden werden kann, als ein Array durchzuscannen und in diesem jeweils mit Toleranz die 3 Doubles zu überprüfen. - alfred - ------------------ www.hollaus.at |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 26. Mai. 2009 15:48 <-- editieren / zitieren --> Unities abgeben:         
|
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 29. Jun. 2009 14:38 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich dachte, dass diese Sache abgeschlossen wäre, ist sie aber leider doch noch nicht ganz  Ich hab jetzt doch eine SelectionSet eingebaut, damit evtl später eingefügte Blockrefs durch Neuaufruf der Selection passend erkannt werden. Erst schreib ich alle Elemente der SelSet in die Collection, läuft alles prima. Aber wenn ich jetzt noch mal jedes Element der SelSet mit "For Each "anspreche, ist die Reihenfolge, in der ich die Elemente kriege genau umgekehrt zu der Reigenfolge, in der ich die Elemente erstellt habe. Beispiel: Ich füge eine Blockref ein, und dann rechts daneben noch eine. Jetzt gibt mir die SelSet erst die rechte Blockref, und dann die linke, ich will es aber umgekehrt! mein Code: Dim Entity As AcadEntity Dim Item As AcadBlockReference Dim Coll As Collection Dim SelSet1 As AcadSelectionSet Dim Filtercode (0 to 2) As Integer Dim Filterwert (0 to 2) As Variant Set Coll = New Collection On Error Resume Next Set SelSet1 = ThisDrawing.SelectionSets( “Auswahl1” ) If Err.Number Then Set SelSet1 = ThisDrawing.SelectionSets.Add( “Auswahl1” ) End If Filtercode(0) = 8: Filterwert(0) = “Module” ’alles vom Layer Module Filtercode(1) = 0: Filterwert(1) = “Insert” ’alleBlockrefs Filtercode(2) = 2: Filterwert(2) = “Modul” ’alles mit Namen Modul SelSet1.Select acSelectionSetAll,,,Filtercode,Filterwert '*** Koordinaten aller Module als Key(String)in Collection schreiben *** For Each Entity In SelSet1 Coll.Add Entity, getKey(Entity.InsertionPoint) Next Entity '*** jetzt noch mal jedes einzelne Modul bearbeiten *** For Each Entity In SelSet1 InsertPoint = Entity.InsertionPoint TestPoint(0) = Format(InsertPoint(0), "#.000"): TestPoint(1) = Format(InsertPoint(1), "#.000"): TestPoint(2) = 0 Set Item = Nothing TestPoint(0) = TestPoint(0) + Modulbr + Modulabst Set Item = Coll.Item(getKey(TestPoint)) If (Not (Item Is Nothing)) Then ‘Es wurde was gefunden, also mach was damit Else ‘nix gefunden, weiter gehts End If
Next Entity Meine Vermutung ist, dass irgendwas mit "Set Item = Coll.Item(getKey(TestPoint))" nicht passt.
Ich hab auch schon viel rumprobiert, aber es funktioniert einfach nicht. Weiß vllt jemand Rat? Danke für Hilfe gruß Frank
------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 29. Jun. 2009 21:23 <-- editieren / zitieren -->
Hi, dann bräucht ich auch noch Deine Funktion für 'getKey' Was mir auch auffällt: - für die Variable 'TestPoint' sehe ich hier keine Deklaration (es wird mal als 'Array of Double' verwendet und mal als 'Array of Mixed?' (2*String, 1*Integer)) - wenn ein SelectionSet schon existiert, dann solltest Du SelSet1.Clear machen, sonst steht ev. zuvor selektiertes noch drin (Reihenfolge?). Und noch eine Frage, wenn Du eine Collection befüllst, wozu ist die Reihenfolge im SelectionSet wichtig? - alfred - ------------------ www.hollaus.at |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 30. Jun. 2009 09:07 <-- editieren / zitieren --> Unities abgeben:         
Hallo Alfred, dann will ich die Liste mal abarbeiten... 1) getKey steht oben, dab ich nur wenig verändert, so dass alles auf einmal reingeschrieben wird: tRetval = "X" & format(Pnt(0),"#.000") & " " & "Y" & format(Pnt(1),"#.000") 2)Natürlich ist Dim TestPoint(0 To 2) As Double mit drin. TestPoint(0) = Format(InsertPoint(0), "#.000"): TestPoint(1) = Format(InsertPoint(1), "#.000"): TestPoint(2) = 0 Also ich seh hier nur Double? TestPoint(0) = TestPoint(0) + Modulbr + Modulabst Und hier wird dem Double noch zwei andere Double hinzuaddiert. Passt doch, oder? 3)ich hab SelSet1.Delete drin, sollte dasselbe bewirken. 4) Also die Reihenfolge in der Collection ist mir ziemlich egal, mir ist aber wichtig, dass die SelSet die Reihenfolge passend ausgibt, und die ist im Moment genau verkehrt herum. Mit dieser Reihenfolge möchte ich nähmlich die Module zu Gruppen zusammenschalten und mit den Modulen beginnen, die als erste in die Zeichnung eingefügt wurden. Wie kann ich denn die Reihenfolge ändern? gruß Frank
------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 30. Jun. 2009 09:22 <-- editieren / zitieren -->
Hi, 1) sorry, hab nicht nach oben geguckt und nachdem's sogar von mir ist, gehe ich mal so aus, dass es passt 2) Da ist ein Denkfehler, wenn Du Format(InsertPoint(0), "#.000") hinschreibst, dann liefert Dir das einen String, und kein Double (da wäre die VB-Funktion ROUND angebracht)! Und der Key ist eigentlich so ausgelegt, dass der Einfügepunkt geprüft wird, wenn Du einmal in der Collection den Key mit Einfügepunkt rechnest und dann den Key mit Einfügepunt PLUS Modulbr, dann wird's mit finden nix (ausser ich lese den Code falsch), denn oben baust Du die Collection auf Basis des Einfügepunkts Coll.Add Entity, getKey(Entity.InsertionPoint) und unten vergleichst Du mit anderen Punkten. Kann Absicht sein, weiss ich nicht. 4) Du kannst Dich auf Sortierung im SelectionSet keinesfalls verlassen, NO WAY, einmal Darstellungsreihenfolge ändern (oder ähnliche Manipulationen, z.B. Löschen und Undo) und das war's dann. Wenn Du das willst, dann kannst Du innerhalb einer Zeichnung ev. eine Liste mit Handles führen und den Event ObjectAdded überwachen, der diese Liste aktualisiert (natürlich dann auch ObjectErased), aber wenn die Zeichnung geschlossen wird und wieder geöffnet wird, ist das damit hinfällig. Alternativ kannst Du beim Einfügen eines Blocks Datum und Uhrzeit in ein Attribut und in EED schreiben und baust Deine eigene Sortierung ==> das wäre der (nach meinem derzeitigen (Halb-)Verständnis Deiner Aufgabe) der stabilste Weg. - alfred - ------------------ www.hollaus.at |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 30. Jun. 2009 12:00 <-- editieren / zitieren --> Unities abgeben:         
Hallo, zu 2) das mit dem +Modulbreite ist gewollt, weil so ein anderer Einfügepunkt berechnet wird. Das hat auch schon mindesten 20 mal so funktioniert. Mein momentanes Hauptproblem ist, dass wenn ich eine Blockref nachträglich einfüge, die bei "For Each..." erst als letzte ausgegeben wird. Es wäre aber schön, wenn die Blockref quasi in die Liste "einsortiert" würde. Das müsste doch in einer nachträglich erstellten SelSet passieren, oder? gruß Frank ------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 30. Jun. 2009 12:20 <-- editieren / zitieren -->
Hi, Zitat: Es wäre aber schön, wenn die Blockref quasi in die Liste "einsortiert" würde
...geb Dir schon recht, es ist aber eben kein Verlass drauf. Du kannst ja (auf eigene Gefahr) mal so probieren: Code: Dim i as Integer Dim tEnt as AcadBlockReferenceFor i = (SelSet1.Count -1) To 0 Step -1 set tEnt = SelSet1.Item(i) '... damit kommt der letzte zuerst Next
Ich würd's aber, wenn 'nur' die Einfügung überwacht wird, trotzdem mit Event 'ObjectAdded' probieren. - alfred - ------------------ www.hollaus.at |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 30. Jun. 2009 14:17 <-- editieren / zitieren --> Unities abgeben:         
Hallo, Danke für die Tipps. Werde ich mal testen und Euch das Ergebnis wissen lassen. gruß Frank ------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 04. Jul. 2009 11:17 <-- editieren / zitieren --> Unities abgeben:         
Hallo, bin erst jetzt wieder zum programmieren gekommen und gleich über eine neue Frage gestolpert. Da ich aber nicht gleich ein neues Thema aufmachen will und es um Collections geht, schreib ichs hier noch rein. Kann ich in einer Collection auch nur einfache Double-Zahlen(nur 3 Nachkommastellen) ablegen und dann schauen, ob eine bestimmte Zahl schon in der Collection ist. Es werden so 1000 Zahlen, und etwa 500 Abfragen, ob die Zahl schon in der Collection existiert. Bisher hab ich in einer Collection ja nur Objekte, die anhand einer Zahl oder eines Keys erkannt werden, aber vllt kann man ja auch nur Zahlen in die Collection schreiben. Gibts da ne Möglichkeit, oder eine Alternative? Danke für Hilfe gruß Frank ------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 04. Jul. 2009 11:29 <-- editieren / zitieren -->
Hi Frank, in VB6/VBA kannst Du ein Array von 3 Doubles erzeugen und dieses einer Collection als Item übergeben, also z.B. Zitat: Dim tPnt(2) as Double tPnt(0) = 1.23 tPnt(1) = 2.34 tPnt(2) = 3.45Dim tColl as Collection: set tColl = new Collection Call tColl.Add(tPnt)
Alternative kann sein, Du erzeugst dies über Klassendefinition, halte ich zu aufwendig für diese Aufgabe, und ändert leider nichts an der Tatsache, dass man trotzdem der Collection nicht beibringen kann, wie es einen Comparer baut (so nennt sich die Funktion, die selbständig für eine Suche vergleicht). Damit ist das Suchen basierend auf Wert (und nicht auf Key) leider njet. Letzlich war das auch der Grund, wieso ich oben die Variante mit getKey (als den schnellsten und einfachsten Suchvorgang) empfohlen habe. Wenn du in vb.NET bist, da kannst Du auf einen Objekttyp 'SortedList Of' eingehen. Aber das erklär ich, wenn Du umgestiegen bist, denn sonst sitz ich eine halbe Stunde hier umsonst. - alfred - ------------------ www.hollaus.at |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 04. Jul. 2009 12:01 <-- editieren / zitieren --> Unities abgeben:         
hallo, kann ich aus meinen Double-Wert denn nicht mit CStr(12,345) den Key generieren und irgendein Objekt mit diesem Key einfügen? zB einfach mit "Dim Obj As Item" und dann Obj mehrfach mit verschiedenen Keys in die Collection schreiben? Danach dann wieder die Abfrage wie oben und alles ist gut? gruß Frank ------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 04. Jul. 2009 12:07 <-- editieren / zitieren -->
Hi, jetzt wird's mir leider unklar, denn wozu machst Du aus Double einen String, wenn Du den Wert dann wieder als Zhal brauchst (das nehme ich zumindest mal an)? Beim Umwandeln und zurückwandeln wirst Du dann immer wieder Probleme mit Dezimalpunkt versus Dezimalkomma bekommen. Ein Collection-Item kann nur einen Key haben, ich verstehe auch hier nicht: 'mehrfach mit verschiedenen Keys in die Collection schreiben' Und Du kannst natürlich eine Klasse definieren, die Dir die Punkte als Einzelwerte hält. Nur solange ich nicht weiss, worauf Du hinauswillst, kann ich da nicht wirklich helfen, weil's da zu viele unterschiedliche Varianten gibt; und mir alle Varianten aus dem, was ich oben lese, als viel komplizierter erscheinen. - alfred - ------------------ www.hollaus.at |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 04. Jul. 2009 12:44 <-- editieren / zitieren --> Unities abgeben:         
Hallo, dann werde ich mal etwas weiter ausholen: Ich möchte in einer Zeichnung mehrere Polylinien einzeichnen. Ich bekomme aus Excel jede Menge X- und Y-Werte (Z immer 0) und zeichne diese Linien. Das funktioniert alles schon super. Jetzt kommt das Problem: Es kann sein, dass zwei oder meherere Linien horizontal übereinander liegen (vertikal ist mir egal) und ich kann evtl nicht erkennen, wie viele Linien es sind. Als Lösung möchte ich die Linien mit einem kleinen Y-Versatz zeichnen. Ich möchte mir die Y-Werte(Double mit 3 Nachkomma) der bereits gezeichneten Linien in einer Collection "zwischenspeichern" und dann bei einer neuen linie schauen, ob ich an diesm Y-Wert schon was gezeichnet hab. Wenn ja, dann soll ein fester Versatz draufaddiert werden. Zum Teil läuft das schon. Wenn aus Excel direkt nacheinander koordinaten mit gleichen Y-Werten kommen, frage ich den letzten Y-Wert ab(in einer Variablen zwischengespeichert). Wenn Y-Wet gleich ist, Versatz = Versatz + 0.01 Wenn die Werte aus Excel aber nicht direkt hintereinander sind, muss ich mehrere Werte zwischenspeichern, gerne in einer Collection. Es könnte zwar auch ein Array sein, aber da dauert mir das durchsuchen zu lang. Ich hoffe ich konnte Licht ins Dunkel bringen gruß Frank ------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 04. Jul. 2009 14:10 <-- editieren / zitieren -->
Hi, und dann stell mir noch das dvb und ein Muster-XLS als Upload zur Verfügung, dann bau ich's Dir (wenn ich Deinen Code verstehe, wo es hineingehört). Ich fürchte mit 'Diskutieren' kommen wir da nicht wirklich weiter, denn eigentlich ist die Lösung mit dem getKey ja oben schon gegeben. - alfred - ------------------ www.hollaus.at |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 04. Jul. 2009 15:26 <-- editieren / zitieren --> Unities abgeben:         
Hi, Danke für die Hilfe und das Angebot. ich werd mal was zusammenbauen, kann aber bis morgen dauern. gruß Frank ------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 05. Jul. 2009 10:58 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich hab jetzt mal ein Beispiel hochgeladen. Wenn man die dvb einfach ausführt, sieht man nur 6 Polylinien, es sind aber 12. Über den 6 unteren waagerechten Linien sond noch 6 andere "versteckt". Diese werden später gezeichnet und über die bestehenden gelegt. Ich hätte diese Linien aber gerne mit Versatz nach unter gezeichnet, damit man auch alle 12 Linien sehen kann. Dafür müsste man einen Zwischenspeicher haben, in dem alle Y-Werte der schon gezeichneten Linien enthalten sind, um abzufragen, ob am dem neuen Y-wert schon was liegt. (wenn mehrere Y-Werte gleich sind, natürlich nur einmal in den Speicher schreiben). Wie könnte so ein "Zwischenspeicher" aussehen? Danke für die Hilfe gruß Frank ------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 05. Jul. 2009 11:37 <-- editieren / zitieren -->
Zwischenfrage: gibt's eine Begründung, die alte Polylinie (2D) zu verwenden oder darf's auch die aktuelle Version (LW-) sein? - alfred - ------------------ www.hollaus.at |
Ex-Mitglied
|
erstellt am: 05. Jul. 2009 13:51 <-- editieren / zitieren -->
Hi Frank, ich hab's jetzt mit LWPolyline gemacht, hoffe ich hab's richtig verstanden und es passt jetzt für Dich. Ganz klar ist nicht, ob die Problematik immer nur waagrechte Linien betrifft, wo sich der Y-Wert kumuliert durch DeltaY erhöht fortsetzen soll? Die Sichtbarkeit von überlagernden Linien hast Du nämlich (wenn ich es richtig verstehe) nicht gelöst, denn wenn es unterschiedliche X-Werte gibt, dann gibt es keine überlagernden Punkte (damit keinen Y-Versatz), aber überlagernde Linien. z.B. eine Linie von (0,0,0) nach (20,0,0) und eine Linie mit (5,0,0) nach (15,0,0) werden sich gegenseitig nicht finden, weil da keine doppelten Punkte vorkommen. Wie hast Du Dir das vorgestellt? Die Gesamtaufgabe zu kennen, was wird da eigentlich gezeichnet, wäre schon interessant. - alfred - ------------------ www.hollaus.at |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 05. Jul. 2009 14:59 <-- editieren / zitieren --> Unities abgeben:         
Hallo Alfred, erst einmal Danke dass du deinen Sonntag für mich opferst! Ich hab noch nicht reingeschaut, werde ich aber gleich machen. Zu der 2D-Linie. Ist eigentlich egal, ich hab nur gedacht, dass man die evtl später schneller auf 3D umändern kann, ist aber nicht so wichtig. Das mit den beiden Linien, die du als Beispiel gebracht hast,müsste doch eigentlich klappen, da die beide den Y-Wert=0 haben und deshalb sollte die zeite mit versatz gezeichnet werden. Zu der Gesamtaugabe darf ich leider nicht viel sagen, weil ich dann Schwierigkeiten mit meinem "Auftraggeber" bekomme. Ich würde ja gerne mehr sagen, dann würde für dich vllt alles viel klarer, aber ich darf halt nicht. Ich bitte um Verständnis. Ich schau mal rein und melde mich dann noch mal. gruß Frank ------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 05. Jul. 2009 15:29 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich habs mir jetzt mal angesehen. Ich merke schon, dass ich noch ein ziemlicher Anfänger bin, wenn man so unsere Programmcodes vergleicht... Trotzdem ist das genau das, was ich haben wollte. DANKE!!! Einen kleinen Schönheitsmakel hätte ich noch;-) Die Linien sollten eigentlich parallel (Orthogonal) sein, aber das macht nichts. Das werd ich schon noch hinbekommen. Ich wünsche noch einen erholsamen Sonntag. gruß Frank ------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 05. Jul. 2009 15:31 <-- editieren / zitieren -->
Hi, na dann geht's so nicht, Du hast ein neues Problem (neu für mich, weil hier nicht beschrieben gewesen)  ich stelle mal folgende Linien zur Verfügung: L1: (0,0,0) - (5,1,0) - (10,0,0) L2: (0,1,0) - (5,0,0) - (10,1,0) wo sollte denn jetzt die zweite Poly hin? Sie hat zwar den mittleren Punkt auf Y=0, liegt aber nicht auf einer anderen drüber. Kann es sein, dass Du kein punkt-bezogenes Problem hast, sondern eines, das eigentlich jedes Liniensegment prüfen sollte? Dann hiesse es Steigungen vergleichen etc. Ich hab Dir Code geliefert, aus dem Du, glaub ich, einiges ablesen kannst, ich mach aber erst weiter, wenn alles beschrieben/definiert ist - alfred - ------------------ www.hollaus.at |
Ex-Mitglied
|
erstellt am: 05. Jul. 2009 16:12 <-- editieren / zitieren -->
Hi Frank, sorry unsere Antworten überschnitten sich OK, wenn es nur orthogonale Linien gibt, dann vereinfacht das zwar ein wenig, aber es fehlen dann trotzdem noch die Info's, wie das DeltaY für weitere Punkte wirken soll, wenn es 'einmal getroffen hat' ==> die gesamte Polylinie anheben? Das führt dann (je nach Abstand DeltaY) zu überhaupt keinen Zusammenhängen mehr mit den ursprünglichen Koordinaten, befürchte ich halt mal. Wenn Du damit weiterkommst, ist es für mich OK. Für Dich hoffe ich, nicht in obige Situation zu geraten. - alfred - ------------------ www.hollaus.at |
Frank136 Mitglied

 Beiträge: 45 Registriert: 06.04.2009 P4 WinXP Acad2004,2005,2008 Office2003
|
erstellt am: 05. Jul. 2009 17:59 <-- editieren / zitieren --> Unities abgeben:         
Hallo, du vermutest schon richtig, ich möchte die ganze Linie angehoben haben. Dass sich die Koordinaten verschieben, ist nicht das Problem, ich hab sie ja noch als Orginal in Excel stehen, wenn ich sie noch mal brauche. Ich denke mal, dass diese Baustelle damit erst mal wieder geschlossen ist :-) Danke nochmals für die Bemühungen. gruß Frank ------------------ Wenn das Wasser bis zum Hals steht, sollte man den Kopf nicht hängen lassen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |