| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Inselflächen und Richtundbestimung von Polylinien (1553 mal gelesen)
|
steinemann09 Mitglied Dipl. Ing.
Beiträge: 47 Registriert: 27.08.2008 AutoCAD 2005, AutoCAD 2009, Windows XP
|
erstellt am: 19. Sep. 2008 11:43 <-- editieren / zitieren --> Unities abgeben:
Hallo miteinander, noch eine Ergänzung zum oben genannten Thema. Inselflächen werden in Abhaängigkeit von der Richtung zum Hauptpolygon zur Polygonfläche adiert oder subtrahiert. Im Anhang (PDF oder DWG) ist die Problematik in einer Übersicht detailliert dargelegt. Wenn über den Umgrenzungsbefehl von ACAD diese Arte von Polygonen generiert werden, beachtet ACAD automatisch den korrekten Richtungsverlauf. Wenn aber aufgrund des mangelhaften Umgrenzungsbefehls (Stützpunkte werden übersprungen etc.) mit pedit Polygone mit Inselflächenerzeugt werden, kann bei falchen Richtingssinn die Inselfläche nicht als Abzugs- sondern als Zuzugsfläche erkannt werden. Ich suche nach einer Möglichkeit Inselflächen herauszufiltern und den Richtungssinn der Hauptpolygone und der Inselpolygonabschnittes mir anzeigem zu lassen (Entscheidungskrierium Gegen - oder Uhrzeigersinn des Polygons bzw. des Inselpolygonabschnittes). Da auf den Inselpolygonabschnitte zusätzlich deckungsgleiche Polygone exestieren, kann man die Fehlflächen nicht mit dem Schraffurbefehl ermitteln. Vielleicht hat von Euch jemand einen Ansatz, Gruß Volker Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
andi2050 Mitglied
Beiträge: 107 Registriert: 11.03.2003
|
erstellt am: 19. Sep. 2008 17:23 <-- editieren / zitieren --> Unities abgeben: Nur für steinemann09
Vielleicht hilft Dir der folgende Code weiter ? Aus einem Auswahlsatz werden die Polylinien nach Laufrichtung CW gefiltert und dann 'gehighlightet'. Mit 'REGEN' wid das Highlight wieder aufgehoben. Grüße Andi Code:
(defun c:test (/ ss-original ss-gefiltert) (setq ss-original (ssget '((0 . "LWPOLYLINE"))) ss-gefiltert (dir-filter ss-original "CW") ) (ss-foreach ss-gefiltert '(lambda (ename) (redraw ename 3))) ) ;;;--------------------------------------------- ;; Filtert Auswahlsatz mit Plines nach Laufrichtung ;;; Argumente: ss - Auswahlsatz (nur Polylinien dürfen enthalten sein) ;;; dir - "CW" oder "CCW" ;;; Rückgabe: gefilterter Auswahlsatz ;;;--------------------------------------------- (defun dir-filter (ss dir / ssneu) (setq ssneu (ssadd)) (ss-foreach ss '(lambda (ename /) (if (= dir (getdir-pline ename)) (ssadd ename ssneu) ) ) ) ;; Rückgabe ssneu ) ;;; --------------------------------------- ;;; ermittelt Laufrichtung von Pline ;;; Argumente: ename - ename von Pline ;;; Rückgabe: "CW" oder "CCW" ;;; --------------------------------------- (defun getdir-pline (ename /) (if (minusp (seglist-area (obj2seglist (vlax-ename->vla-object ename))) ) "CW" "CCW" ) ) ;;; --------------------------------------- ;;; ermittelt Fläche von Segmentliste nach Gauss... Algorithmus ;;; Argumente: seglist - Segmentliste ;;; Rückgabe: Flächeninhalt: negativ bei Laufrichtung CW ;;; positiv bei Laufrichtung CCW ;;; ACHTUNG: ggf. Fehlerhaft bei offenen Konturen ;;; --------------------------------------- (defun seglist-area (seglist /) (* 0.5 (apply '+ (mapcar '(lambda (seg) (+ (if (zerop (caddr seg)) 0.0 (* 2 (seg-area seg)) ) (* (- (caar seg) (caadr seg)) (+ (cadar seg) (cadadr seg))) ) ) seglist ) ) ) ) ;;; Hilfsfunktionen (defun ss-foreach (ss expr / i) (if ss (repeat (setq i (sslength ss)) ((eval expr) (ssname ss (setq i (1- i))))) ) ) (defun seg2rad (seg /) (/ (* 0.5 (distance (car seg) (cadr seg))) (sin (* 0.5 (* 4 (atan (caddr seg))))) ) ) (defun seg-area (seg / alfa r) (setq alfa (* 4 (atan (caddr seg))) r (seg2rad seg) ) (* (* 0.5 (* r r)) (- alfa (sin alfa))) ) (defun obj2seglist (obj / endpara para seglist) (setq endpara (vlax-curve-getendparam obj) para (vlax-curve-getstartparam obj) ) (while (< para endpara) (setq seglist (cons (list (vlax-curve-getpointatparam obj para) (vlax-curve-getpointatparam obj (1+ para)) (vla-getbulge obj para) ) seglist ) para (1+ para) ) ) (reverse seglist) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Projektingenieur (w/m/d) Versorgungstechnik (HLSK) | Als führendes europäisches Beratungs-, Planungs- und Projektmanagementunternehmen bietet Drees & Sommer Lösungen für erfolgreiche Gebäude, renditestarke Portfolios, leistungsfähige Infrastruktur und lebenswerte Städte. In interdisziplinären Teams unterstützen unsere über 5.100 Mitarbeiterinnen und Mitarbeiter an 59 internationalen Standorten Auftraggeber unterschiedlichster Branchen. Bei uns gestalten Sie Ihren individuellen Karriereweg aktiv mit.... | Anzeige ansehen | Gebäude-, Versorgungs-, Sicherheitstechnik |
|
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 22. Sep. 2008 12:32 <-- editieren / zitieren --> Unities abgeben: Nur für steinemann09
Hallo, nur mal so ... wenn Du Deine Polylinien (Dein Anhang oben) sprengst und die Teilstücke dem Befehl Region übergibst, erhälst Du erstmal die "richtige" Anzahl Regionen (solange die Pl nicht zu sehr verschachtelt ist oder sich selbst kreuzt), Diese Regionen kannst Du nun auswerten nach Flächen und "Eckpunkten"/Stützpunkten. (größte Fläche sollte dann die Hauptfläche sein) Über die Eckpunkt sollte es nun möglich sein die Laufrichtung zu bestimmen. Wenn Polygonabschnitte sich überschneiden, sollte dies beim Abgleich mit der Liste der Stützpunkte der Ursprungsline eingehen... Naja... Mfg Heiko Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|