| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: automatisch Polygon aus einzelnen Linien erstellen (1274 mal gelesen)
|
ritchie1 Mitglied
Beiträge: 25 Registriert: 10.10.2017 AutoCAD 2008, AutoCAD 2011
|
erstellt am: 04. Dez. 2018 11:08 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, Gegeben ist ein Vieleck aus einzelnen Linien. Das Vieleck wird zeichnerisch ermittelt. Beim Klick auf eine Linie (egal welche) des Vielecks sollen alle anderen Linien (welche über die Endpunke miteinander verbunden sind) zu einem einem Polygon (Polylinie) zusammengefügt werden. Hat jemand eine Idee wie das am schnellsten umzusetzen wäre?
lg, ritchie
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Ehrenmitglied V.I.P. h.c. CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 ACAD20XX, defun-tools
|
erstellt am: 04. Dez. 2018 13:45 <-- editieren / zitieren --> Unities abgeben: Nur für ritchie1
Hallo ritchie, du kannst einen Auswahlsatz bilden, bei dem der Start oder Endpunkt einer Linie dem aktuell betrachteten Punkt entspricht. Aus dem Auswahlsatz musst du dann natürlich die aktuell betrachtete Linie entfernen. Das andauernde Bilden eines Auswahlsatzes ist langsam. Du kannst auch einmal alle Linien ermitteln und aus diesen dann die jeweils passende Linie über den Punktevergleich ermitteln. Hast du dann alle Punkte beisammen, kannst damit ja dann die Polylinie bilden. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 04. Dez. 2018 14:02 <-- editieren / zitieren --> Unities abgeben: Nur für ritchie1
Hallo Ritchie, Du kennst den Befehl PEdit? Mit der Option mehrfach kannst Du doch genau dies durchführen solange vom Endpunkt keine zwei Linien abzweigen. Ansonsten gäbe es über MAP, falls Du das hast, noch die Möglichkeit auch einen geringen Abstand der Linienendpunkte zu überbrücken. Grüße Klaus PS.: Natürlich gäbe es auch eine Programmlösung wenn man im Netz mal sucht Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rexxitall Mitglied Dipl. -Ing. Bau
Beiträge: 266 Registriert: 07.06.2013 Various: systems, Operating systems, cad systems, cad versions, programming languages.
|
erstellt am: 05. Dez. 2018 14:31 <-- editieren / zitieren --> Unities abgeben: Nur für ritchie1
Hi, sowas in der Art macht der Befehl JOIN. Nur ist der etwas wählerisch. 3d Polylinien mag der z.B. nicht. Für meine Höhenlinien ist sowas demnächst in der Mache. Haken an der Sache dort, von denen habe ich ein paar tausend in der Zeichnung. Anyhow. Was dem Menschen leicht fällt führt bei brute force Methoden (Enpunktevergleich) zu nicht annehmbaren Laufzeiten. Ich lese derzeit die Koordinaten der Elemente aus, speichere diese in Datensätzen und prüfe welche Endpunkt zusammen passen. Ne Linie oder Polylinie hat 2 Enden, was die Sache nicht besser macht . Passen die zusammen, werden die Koordinaten einer der beiden (poly)Linien passig zugefügt (obacht, die können ja auch im oder gegen den Uhrzeigersinn gestrickt worden sein-man muss die erst mal auf eines von beiden normieren, sonst wirst irre), die andere Linie gelöscht. Das ganze wird so lange betrieben bis "nichts mehr passt". Die Problematik liegt im Punktvergleich. Derzeit habe ich einen B+Tree eingesetzt. Drastisch schneller aber immer noch zu langsam. Durch Zufall bin ich über Quad und Octrees gestolpert. Danach mal googeln. Diese Bäume sind recht einfach zu implementieren. Steht bei mir über Weihnachten an. Eine weitere Hürde ist die, das die Endpunkte numerisch nich EXAKT identisch sein müssen. Da ist entweder Rasterrunden oder Phytagoras angesagt. Das ganze ist machbar allerdings zeitaufwändig und wenn es viele Linien sind nicht gerade trivial. Allein das Linien zusammenfügen sorgte da schon für manches graue Haar Lieben Gruß Thomas ------------------ Wer es nicht versucht, hat schon verlorn Und bei 3 Typos gibts den vierten gratis ! <<< not for sale ! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 06. Dez. 2018 10:08 <-- editieren / zitieren --> Unities abgeben: Nur für ritchie1
Zitat: Original erstellt von rexxitall: Eine weitere Hürde ist die, das die Endpunkte numerisch nich EXAKT identisch sein müssen. Da ist entweder Rasterrunden oder Phytagoras angesagt.
Was meinst Du mit Rasterrunden? Ich verwende in solchen Fällen immer den Vergleich der absoluten Koordinatendifferenz mit einem Schwellwert. Selten mehr als der x-Wert erforderlich außer bei reinen Rasterkoordinaten, da muß man dann anders vorgehen. Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rexxitall Mitglied Dipl. -Ing. Bau
Beiträge: 266 Registriert: 07.06.2013 Various: systems, Operating systems, cad systems, cad versions, programming languages.
|
erstellt am: 07. Dez. 2018 09:58 <-- editieren / zitieren --> Unities abgeben: Nur für ritchie1
HI, Anstelle mit dem Phytagoras zu hantieren kann man z.B. festlegen das die Endpunkte auf einem 5 mm Raster liegen (Ich komm vom Bau ) das ist durch Runden oder Nachkommastellen entfernen schneller als der Phytagoras. Nun kann man diese Zahlen als String abspeichern und mit einfachem String vergleich nachsehen ob die Werte identisch sind. Diese Strings kann man auch in einem Dictionary als Schlüssel verwenden. Zum Beispiel ein Dictionary welches die Endpunkte der (Poly)Linien als Schlüssel hat und als Wert einen Index auf eine COLLECTION welches die Polygonkoordinaten enthält. Auch dieses Vorgehen ist deutlich schneller als jeden Punkt mit Phytagoras einzeln "brute force" mäßig zu vergleichen. Gibt es so einen Schlüssel kannst du die Linien verbinden, gibt es ihn nicht ist dies der Endpunkt dieser Linie. Dabei verliert man nicht einmal an Genauigkeit, weil die Koordinaten in der Collection ungerundet bleiben können. Ich verwende oft Dictionarys als "Arme Leute Datenbank". Ich habe auch mal SQLITE für diesen Zweck probiert. Klar schneller als "Brute Force" aber man verliert viel Zeit durch das umformulieren und Parsen beim Übergnag zu SQL. Für andere Dinge ist SQLITE durchaus eine "Waffe". Das Datenformat ist normiert (Single File Datenbank), man kann komplizierteste Abfragen elegant tätigen, sie besitzt eine Volltextsuche usw usw. Für Excel gibt es eine Direktanbindung welche auch im Autocad VBA problemlos nutzbar ist. Das mein kein Office professionell kaufen muss und ein Linux User auch etwas mit diesen Daten anfangen kann kommt erschwerend hinzu. Ich habe mir mal den Spaß gemacht die Autocad Hilfe zu parsen und in eine SQLITE Datenbank zu stopfen (mit Volltextindex). Das ganze wurde mit etwas PHP und Javascript angereichert und ist somit besser Nutzbar als die Originalhilfe. Andere Anwendung sind z.B. Stahlprofildaten für HEB etc. Damit passende Träger zu suchen macht auch mehr Freude als in irgendwelchen Excel Tabellen zu wühlen. Selct * from STEEL where IX > 1000 und man bekommt ein Array welches alle Daten entthält wo die Trägheitsmomente größer 1000 cm4 sind. Lieben Gruß Thomas ------------------ Wer es nicht versucht, hat schon verlorn Und bei 3 Typos gibts den vierten gratis ! <<< not for sale ! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 07. Dez. 2018 13:12 <-- editieren / zitieren --> Unities abgeben: Nur für ritchie1
HI, Interessanter Ansatz die Koordinaten als Stringwerte in der DB zu speichern. Muß ich mal bei Gelegenheit testen ob das Zeitgewinne bringt. Pythagoros fällt sowieso raus, viel zu viele Rechenoperationen. Reine Differenzenbildung und Vergleich mit Absolutwert ist da deutlich schneller. Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rexxitall Mitglied Dipl. -Ing. Bau
Beiträge: 266 Registriert: 07.06.2013 Various: systems, Operating systems, cad systems, cad versions, programming languages.
|
erstellt am: 07. Dez. 2018 18:31 <-- editieren / zitieren --> Unities abgeben: Nur für ritchie1
|