| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: eindeutiger Blockname (580 mal gelesen)
|
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 29. Jun. 2004 11:28 <-- editieren / zitieren --> Unities abgeben:
ich weiss das thema hatten wir bereits, aber mir geht es NICHT um eindeutige namen mit cdate sondern ... ich erstelle mittels Variantenkonstruktion Möbel der benutzer wählt z.B.: aus einem Menü einen Tisch aus. Danach gibt er in einem Dialog die Tischbreite, Tischhöhe, Tischtiefe, Plattenart, Verkabelung ja/nein usw. ein. diese Infos müssen ja in den Blocknamen eingehen, umd diesen eindeutig zu machen z.B.: könnte daraus ein blocknamen der in etwa so lautet herauskommen TISCH1_BR-1000_TI-800_HO-720_PL-MA der Block Tisch1 mit Breite 1000, Tiefe 800, Höhe 720 und Plattenart mit Massivanleimer da jedoch manche Möbel bei uns etwas komplexer aufgebaut sind, (da können schon mal 20 Merkmale zum Ausfülen sein) komme ich da auf sehr lange Blocknamen.
(z.B.: aus einer aktuellen Zeichnung ein Blockname 72BTR2BTW04DG__0500010024002110000000000000________ALUAL2F33A2F63A2F53A2FUBH1F3 3A1F63A1F53A1FUBH) gibst es da nicht einen Algorithmus, um diese Informatioenen verkürzt darzustellen. Der Blockname muss nicht mehr entschlüsselbar sein, er muss aber für die Konfiguration des Tisches eindeutig bleiben. ich hab mir gedacht , so ala winzip-mässig, das kann ja auch eine datei komprimieren und wieder 1 zu 1 herstellen, nur halt mit einem langen string. Ich möchte bewusst NICHT auf datum, Uhrzeit ausweichen,sondern bei den konfigurationsmermalen bleiben, da 2 komplett gleich konfigurierte Tische den gleichen Blocknamen ergeben sollen, bzw. die Teile auch zwischen Zeichnungen hin- und her kopiert werden können . (ok. die chance, das 2 planer in untersch. zeichnungen genau zur gleichen millisekunde den tisch1 konfigurieren ist zwar minimal, aber der teufel schläft Nicht) ich hoffe ich hab mich jetzt verständlich ausgedrückt.
------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 29. Jun. 2004 13:54 <-- editieren / zitieren -->
Zitat: Original erstellt von fuchsi: gibst es da nicht einen Algorithmus, um diese Informatioenen verkürzt darzustellen. Der Blockname muss nicht mehr entschlüsselbar sein, er muss aber für die Konfiguration des Tisches eindeutig bleiben.
Da Du dann ja einen Tisch mit den Merkmalen 800, 320, 720, 1850, 2499 von einem anderen Tisch mit den Merkmalen 800, 320, 720, 1850, 2498 unterscheiden willst, gibt's eigentlich nur eine Lösung: Du musst auf ein anderes Zahlensystem ausweichen, also beispielsweise Hexadezimalzahlen statt Dezimalzahlen verwenden. Damit bleibt die vollständige Info erhalten, der String wird kürzer. Bei entsprechend umfangreichen Infos aber wirst Du die maximal zulässige Länge der Blocknamen immer überschreiten, und dagegen hilft Dir absolut kein Kraut: Du kannst nicht beliebig viel Informationen in 128 oder 256 Byte unterbringen (genaue MaxLänge habe ich jetzt nicht im Kopf). Du wirst Dich für Dein Anliegen also zwingend (!) auf eine Anzahl von Merkmalen beschränken müssen, die zusammen genommen diese Bytelänge nicht überschreiten. Tom Berger ------------------
|
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 29. Jun. 2004 14:06 <-- editieren / zitieren --> Unities abgeben: Nur für fuchsi
Hi Fuchsi, wenn du diesen Blocknamen mit WinZip einpackst, werden aus 91 Bytes 191, da beim Einpacken erstmal ein gewisser Overhead entsteht. Für so kleine Sachen bringt das nix! Mit einem ZIP-Verfahren, dass ausschließlich Zeichen erzeugt, die für Blocknamen gültig sind, wird das noch viel länger, und außerdem äußerst kompliziert! Wenn die Merkmale M in Abstufungen vorliegen, kannst du evtl. alle Kombinationen (M1 * M2 * ... * Mn = Anzahl der Möglichkeiten) und durchnummerieren. Das macht eine kleine Lisproutine sehr schnell. Problem: Wenn sich was an der Produktpalette ändert, siehst du alt aus. Einzig realistischer Ansatz: Hash-Werte berechnen - allerdings sind die nicht eindeutig, es kann immer mal vorkommen, dass zwei Produkte den selben Hashwert haben. Wenn man's geschickt macht, aber eher selten. Die Idee an sich finde ich nicht so gut - wer soll mit solchen Blocknamen denn arbeiten? Ich würde Zufallszahlen verwenden und über eine DB abgleichen, ob der Block schon vorhanden ist. Da reichen 8 Stellen von 0..Z bis ins übernächste nächste Jahrtausend. Gruß, Axel Gruß, Axel ------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 29. Jun. 2004 14:44 <-- editieren / zitieren -->
Zitat: Original erstellt von mapcar: Wenn die Merkmale M in Abstufungen vorliegen, kannst du evtl. alle Kombinationen (M1 * M2 * ... * Mn = Anzahl der Möglichkeiten) und durchnummerieren. Das macht eine kleine Lisproutine sehr schnell. Problem: Wenn sich was an der Produktpalette ändert, siehst du alt aus.
Nun ergibt aber die Kombination der Merkmale Breite 3 x Höhe 4 denselben Blocknamen wie die Merkmale Breite 4 x Höhe 3. Klappt also auch nicht. Zitat:
Einzig realistischer Ansatz: Hash-Werte berechnen - allerdings sind die nicht eindeutig, es kann immer mal vorkommen, dass zwei Produkte den selben Hashwert haben. Wenn man's geschickt macht, aber eher selten.
Da auch hier die Strings unkontrollierbar lang werden können, ist auich das keine Lösung. Eine sichere Lösung existiert nur, wenn an die Blockdefinitionen XDATA gehängt werden, die alle Merkmale - am besten in einer ASSOC-Liste - enthalten. Damit nicht bei jedem Block die gesamte Blocktabelle durchsucht werden muss, holt man sich beim Öffnen einer Zeichnung die Liste aller dieser XDATA in eine globale Variable, so dass dann bequem gesucht werden kann, ob die aktuelle Merkmalskombination schon in der Liste enthalten ist oder nicht. Bei dieser sicheren Lösung aber ist dann der Blockname wieder völlig frei und kann am sinnvollsten aus einer Kombination von irgend einem wichtigen Merkmal und CDATE gebildet werden. Gruß Tom Berger ------------------
|
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 29. Jun. 2004 14:44 <-- editieren / zitieren --> Unities abgeben: Nur für fuchsi
Hai fuchsi ich würde genauso wie Axel es sagt über eine Datenbank an die Problematik rangehen. Es muss ja nicht unbedingt eine DB sein, aber irgendeine Datei, worin die Realnames zu Kurzbezeichnungen zugeordnet werden. Das ganze lässt sich sicherlich dann auch schön per dcl einbauen, so das die Geschichte ziemlich DAU sicher sein könnte ------------------ Gruß CADwiesel Besucht uns im CHAT
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: 29. Jun. 2004 15:43 <-- editieren / zitieren --> Unities abgeben:
also dass mit einer DB ist glaube ich schon mal ein ganz guter Lösungsansatz. @mapcar Die Idee an sich finde ich nicht so gut - wer soll mit solchen Blocknamen denn arbeiten? was meinst du mit arbeiten ?, den planern interresiert der blockname nicht (die wenigstens meiner planer wissen überhaupt was ein block ist, für die ist das trum in der zeichnung ein tisch, ein schrank usw. den sie hin- und herschieben :-) @tom.berger Eine sichere Lösung existiert nur, wenn an die Blockdefinitionen XDATA gehängt werden, die alle Merkmale - am besten in einer ASSOC-Liste - enthalten
das ist sowieso geplant, für stücklisten, preisrechnung usw. werte ich nur die grundartikelnummer und die merkmale in den xdatas aus. der blockname soll nur für ein konfiguriertes Möbel eindeutig sein. und das nicht nur pro zeichnung sondern zeichnungsübergreifend (fertige Möblierungsvorschläge abspeichern und in jede Planung reinkopieren) na ich werd mir am abend bei einem bierchen (da fallen mir immer die besten ideen ein) die idee mit der db überlegen, damit wäre ich zumindest mal pro Filiale eindeutig. (ev. pro filiale ein eigener nummernkreis)
------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 29. Jun. 2004 18:59 <-- editieren / zitieren --> Unities abgeben: Nur für fuchsi
Zitat: Original erstellt von Tom: >Original erstellt von mapcar: >Wenn die Merkmale M in Abstufungen vorliegen, kannst du evtl. alle >Kombinationen (M1 * M2 * ... * Mn = Anzahl der Möglichkeiten) und >durchnummerieren. Das macht eine kleine Lisproutine sehr schnell. >Problem: Wenn sich was an der Produktpalette ändert, siehst du alt >aus.Nun ergibt aber die Kombination der Merkmale Breite 3 x Höhe 4 denselben Blocknamen wie die Merkmale Breite 4 x Höhe 3. Klappt also auch nicht.
Nö. Wenn es Breiten von 3 und Höhen von 4 gibt, lautet die Rechnung 2 x 2 = 4 mögliche Produkte - ich habe doch nicht gesagt, dass man Breite x Höhe x Farbe x Preis oder so etwas ausrechnen soll;-) Code:
BREITE HÖHE NUMMER/BLOCKNAME 3 3 0 3 4 1 4 3 2 4 4 3
Also: 50 Breiten x 75 Längen x 70 Höhen x 24 Farben x 150 Sonstwas ergeben z.B 945 Millionen Möglichkeiten - die lassen sich hexadezimal mit 8 Ziffern darstellen lassen (ich gehe hier vom Datentype LONG aus, da ist noch Luft). 5 weitere Features lassen sich mit einem weiteren Long erfassen usw. In der Realität wird sowieso keine Firma Tische in 70 verschiedenen Höhen anbieten;-) Verwendet man dann noch das Zahlensystem mit der Basis 36 [0..Z], kann man mit einem 8stelligen Namen ca. 8 Billiarden möglicher Produkte benennen. Das dürfte doch reichen, oder? Zitat: Original erstellt von Tom: >Original erstellt von mapcar: >Einzig realistischer Ansatz: Hash-Werte berechnen - allerdings sind >die nicht eindeutig, es kann immer mal vorkommen, dass zwei Produkte >den selben Hashwert haben. Wenn man's geschickt macht, aber eher >selten.Da auch hier die Strings unkontrollierbar lang werden können, ist auich das keine Lösung.
Auch Nö. Ein Hashwert muss nicht länger werden. Nimm irgendwas, meinetwegen die Quersumme der Summe der ASCII-Werte aller zu codierenden Merkmale) modulo 65531, dann liegt der Hash im Bereich 0 ... 0xFFF0 und hat garantiert max. 4 Stellen Gruß, Axel ------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 29. Jun. 2004 19:59 <-- editieren / zitieren -->
Zitat: Original erstellt von mapcar: Nö. Wenn es Breiten von 3 und Höhen von 4 gibt, lautet die Rechnung 2 x 2 = 4 mögliche Produkte - ich habe doch nicht gesagt, dass man Breite x Höhe x Farbe x Preis oder so etwas ausrechnen soll;-)
Ich ging fälschlich davon aus, dass Du daraus den Blocknamen basteln wolltest. Deine Tabelle ist zwar auch nur dann eine 100%ige Lösung, wenn es für jedes Merkmal eine begrenzte Menge von zulässigen Werten gibt, aber ich schätze mal, dass so ein Blockname dann schon etwa für die Anzahl der Sterne im Universum ausreichen sollte :-) Gruß Tom Berger ------------------
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|