Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Weihnachtsgeschenk: Bool'sche Operationen für Polylinien

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Weihnachtsgeschenk: Bool'sche Operationen für Polylinien (1808 mal gelesen)
archtools
Mitglied



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 16. Dez. 2011 21:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Mein Weihnachtsgeschenk an die Lisp-Gemeinde ist dieses Jahr dieses ebenso kleine wie nützliche Programm. Man kann damit Bool'sche Operationen über Polylinien bilden, d.h. man bekommt für zwei oder mehrere Polylinien eine (oder auch mehrere) Polylinie(n), die alle vereinigt, oder bei der eine oder mehrere von einer Polylinie subtrahiert wird, oder die Schnittmenge von Polylinien.

Das Programm sollte mit allen AutoCAD-Versionen ab 2000 und mit BricsCAD ab V10 lauffähig sein. Viel Spaß damit.

Tom Berger


Code:

;;;***************************************************************************
;;;************* START BOOLEAN ***********************************************
;;;***************************************************************************
;;; Bool'sche Operationen für geschlossene Polylinien. Das Programm
;;; arbeitet mit dem ACIS Modellierer, indem es die Polylinien erst in
;;; Regionen umwandelt, dann die Operationen darüber ausübt, die Ergebnisse mit
;;; EXPLODE auflöst, und die Restergebnisse wieder zu Polylinien zusammen
;;; fügt.
;;;
;;; Die ursprünglichen Polylinien werden nicht zerstört.
;;;
;;; Es findet keine Prüfung statt, ob die Polylinien geschlossen sind, oder
;;; ob sie kurvenangeglichen sind.
;;;
;;; Die Hauptfunktionen sind:
;;;  - (BOOLEAN-UNION    <Liste von PLs>;)
;;;  - (BOOLEAN-SUBTRACT  <Ename einer PL> <Ename oder Liste mehrerer PLs>;)
;;;  - (BOOLEAN-INTERSECT <Liste von PLs>;)
;;; Jede Funktion gibt die aus der Operation erzeugten Entities als
;;; Rückgabewert zurück.
;;;
;;; (c) 2011 Tom Berger
;;; Erlaubnis zur freien Nutzung und Weiterverbreitung nur erlaubt
;;; mit Urheberrechtshinweis
;;;***************************************************************************


;; von einer Polylinie wird entweder eine einzelne andere subtrahiert,
;; oder eine Liste von Subtrahenden
(defun boolean-subtract (pl1 l-pl / lastent en r1 l-r regionset explodeset)
  (setq lastent (entlast))
  (setq r1 (polyline->region pl1))
  (if (= 'ENAME (type l-pl))
    (setq l-pl (list l-pl))
  )
  ;;
  (setq l-r (mapcar 'polyline->region l-pl))
  (if (and r1 l-r)
    (command "._subtract" (ssadd r1) "" (list->ss l-r) "")
  )
  (if (not (equal lastent (entlast)))
    (progn
      (command "._explode" (entlast))
      ;;
      (while (setq regionset (new-entities lastent '("REGION")))
(foreach en regionset
  (if (= "REGION" (cdr (assoc 0 (entget en))))
    (command "._explode" en)
  )
)
      )
      ;;
      (while (setq explodeset (new-entities lastent '("LINE" "ARC")))
(command "._pedit" (car explodeset) "_y" "_j" (list->ss (cdr explodeset)) "" "")
      )
    )
  )
  (newset lastent)
)


;; Liste von Polylinien wird vereinigt
(defun boolean-union (l-pl / lastent en l-r regionset explodeset)
  (setq lastent (entlast))
  (if (= 'ENAME (type l-pl))
    (setq l-pl (list l-pl))
  )
  ;;
  (setq l-r (mapcar 'polyline->region l-pl))
  (if l-r
    (command "._union" (list->ss l-r) "")
  )
  (if (not (equal lastent (entlast)))
    (progn
      (command "._explode" (entlast))
      ;;
      (while (setq regionset (new-entities lastent '("REGION")))
(foreach en regionset
  (if (= "REGION" (cdr (assoc 0 (entget en))))
    (command "._explode" en)
  )
)
      )
      ;;
      (while (setq explodeset (new-entities lastent '("LINE" "ARC")))
(command "._pedit" (car explodeset) "_y" "_j" (list->ss (cdr explodeset)) "" "")
      )
    )
  )
  (newset lastent)
)


;; Schnitt-Poly einer Liste von Polylinien
(defun boolean-intersect (l-pl / lastent en l-r regionset explodeset)
  (setq lastent (entlast))
  (if (= 'ENAME (type l-pl))
    (setq l-pl (list l-pl))
  )
  ;;
  (setq l-r (mapcar 'polyline->region l-pl))
  (if l-r
    (command "._intersect" (list->ss l-r) "")
  )
  (if (not (equal lastent (entlast)))
    (progn
      (command "._explode" (entlast))
      ;;
      (while (setq regionset (new-entities lastent '("REGION")))
(foreach en regionset
  (if (= "REGION" (cdr (assoc 0 (entget en))))
    (command "._explode" en)
  )
)
      )
      ;;
      (while (setq explodeset (new-entities lastent '("LINE" "ARC")))
(command "._pedit" (car explodeset) "_y" "_j" (list->ss (cdr explodeset)) "" "")
      )
    )
  )
  (newset lastent)
)

(defun polyline->region (pl / lastent cpl)
  (setq lastent (entlast))
  (command "._copy" (ssadd pl) "" '(0 0 0) '(0 0 0))
  (if (not (equal lastent (entlast)))
    (progn
      (setq cpl (entlast))
      (command "._region" cpl "")
    )
  )
  (if (and cpl (entget cpl))
    (entdel cpl)
  )
  (if (equal lastent (entlast))
    nil
    (entlast)
  )
)

(defun new-entities (en typelist / nset space el)
  (setq typelist (mapcar 'strcase typelist))
  (if en
    (progn (setq space (assoc 410 (entget en)))
          (while (and (setq en (entnext en)) (setq el (entget en)) (equal space (assoc 410 el)))
            (if (member (cdr (assoc 0 (entget en))) typelist)
              (setq nset (cons en nset))
            )
          )
    )
  )
  (reverse nset)
)

(defun newset (en / nset space el)
  (if en
    (progn (setq space (assoc 410 (entget en)))
          (while (and (setq en (entnext en)) (setq el (entget en)) (equal space (assoc 410 el)))
            (if (member (cdr (assoc 0 (entget en))) '("VERTEX" "SEQEND"))
              nil
              (setq nset (cons en nset))
            )
          )
    )
  )
  nset
)

(defun list->ss (eset / sset x)
  (setq sset (ssadd))
  (if (= 'LIST (type eset))
    (mapcar '(lambda (x)
      (if (= 'ENAME (type x))
(setq sset (ssadd x sset))
      )
    )
    eset
    )
  )
  sset
)

(defun ss->list (sset / eset counter)
  (setq counter 0)
  (if (= 'PICKSET (type sset))
    (repeat (sslength sset)
      (setq eset    (cons (ssname sset counter) eset)
    counter (1+ counter)
      )
    )
  )
  eset
)
;;;************* ENDE BOOLEAN ************************************************
;;;***************************************************************************


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Theodor Schoenwald
Ehrenmitglied



Sehen Sie sich das Profil von Theodor Schoenwald an!   Senden Sie eine Private Message an Theodor Schoenwald  Schreiben Sie einen Gästebucheintrag für Theodor Schoenwald

Beiträge: 1672
Registriert: 16.04.2002

erstellt am: 17. Dez. 2011 19:22    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für archtools 10 Unities + Antwort hilfreich

Danke Tom!

Ein schönes Fest, Theodor

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


Sehen Sie sich das Profil von joern bosse an!   Senden Sie eine Private Message an joern bosse  Schreiben Sie einen Gästebucheintrag für joern bosse

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 19. Dez. 2011 08:01    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für archtools 10 Unities + Antwort hilfreich

@Tom: schönen Dank, habs gerade ausprobiert, die Funktionen sind einwandfrei gelaufen. Ich habe sie in die Schublade mit nützlichen Funktionen reingepackt und hoffe, daß ich dran denke, wenn ich sie dann wirklich brauche.
Ein frohes Fest wünsche ich und die U's kannst Du Dir unter den Tannenbaum packen ;-)

------------------
viele Grüße

Jörn
http://www.bosse-engineering.com

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz