Hot News aus dem CAD.de-Newsletter:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Rund um AutoCAD
  Linie löschen

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
Autor Thema:   Linie löschen (1286 mal gelesen)
AB
Mitglied



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

Beiträge: 255
Registriert: 24.05.2002

Mechanical Desktop 6
AutoCAD 2002

erstellt am: 29. Aug. 2002 12:00    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


Bsp.gif

 
Hallo,
also ich möchte folgendes in Lisp automatisieren:

Ich habe durch ein Bauteil einen Querschnitt gelegt, diesen mit "_explode" zerlegt und möchte nun die Linie löschen (s. Bild rote Linie), die sich in der x/y-Ebene befindet und einen Z-Wert von Null hat.
Wie mache ich das?

Viele Grüße
Andrea

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

Hetkala
Mitglied
technische Zeichnerin, HKS


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

Beiträge: 189
Registriert: 23.08.2002

ACAD2006 oder
ACAD2005 mit ADT2005 und pit-CUP 7.0
auf WinXP, 1GB RAM, 1GHz; beide mit ExpressTools

erstellt am: 29. Aug. 2002 12:34    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 AB 10 Unities + Antwort hilfreich

Geht das nicht mit 3D-Ansicht --> Draufsicht(bzw.Oben),
dann müßte doch die xy-Ebene wie eine 2D Zeichnung vor dir liegen und die rote Linie müßte anklickbar (und löschbar) sein...

Hast du das schon versucht ?

------------------
Hetkala

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

AB
Mitglied



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

Beiträge: 255
Registriert: 24.05.2002

Mechanical Desktop 6
AutoCAD 2002

erstellt am: 29. Aug. 2002 12:37    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

Ich möchte die Linie aber eben nicht anklicken müssen. Die sollte automatisch gelöscht werden. (Die Lösch-Bedingungen sind: 1. Linie in x/y-Ebene und 2. Linie mit z-Wert=0).

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

mapcar
Mitglied
CADmin



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

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 29. Aug. 2002 13:05    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 AB 10 Unities + Antwort hilfreich

(command "_erase"
  (ssget"X"
    '((0 . "LINE")(-4 . "*,*,=")(10 0 0 0)(-4 . "*,*,=")(11 0 0 0))
  )
)

------------------
http://www.tutorial.autolisp.info

http://www.advanced.autolisp.info


http://www.activex.autolisp.info

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

AB
Mitglied



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

Beiträge: 255
Registriert: 24.05.2002

Mechanical Desktop 6
AutoCAD 2002

erstellt am: 29. Aug. 2002 15:18    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

Dieser Befehl:
(command "_erase"
(ssget"X" '((0 . "LINE")(-4 . "*,*,=")(10 0 0 0)(-4 . "*,*,=")(11 0 0 0)))
)

funktioniert leider nur, wenn die Linie den Punkt (0 0 0) beinhaltet, aber nicht mehr, wenn die Linie auf der y-Achse verschoben wird (aber trotzdem noch x und z Null sind (also noch immer in der x/y-Ebene liegt, wie im Beispielsbild.

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

mapcar
Mitglied
CADmin



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

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 29. Aug. 2002 22: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 AB 10 Unities + Antwort hilfreich

Dieser Ausdruck löscht alle Linien, deren Anfangs- und Endpunkt bei Z=0 liegen. X Und Y spielen da überhaupt keine Rolle! Mit anderen Worten: Es werden alle Linien gelöscht, die in der XY-Ebene liegen.
Du kannst genausogut auch das schreiben:
(command "_erase"
  (ssget"X"
    '((0 . "LINE")(-4 . "*,*,=")(10 65535 128 0)(-4 . "*,*,=")(11
-65534 -127 0))
  )
)
Es macht __*null*__ Unterschied. Der Stern bei GC -4 bedeutet: Ignorieren, was da steht. X und Y spielen also keine Rolle.

Schwierigkeiten wird es allerdings dann geben, wenn die Z-Koordinate nahe 0 liegt, aber /= 0 ist. Dann muss man, da (ssget) kein (abs) kann, zu einem (-4 . "<OR")... greifen.

Hast du es wirklich ausprobiert, oder war's ein vorschnelles Urteil?

Gruss, Axel

------------------
http://www.tutorial.autolisp.info

http://www.advanced.autolisp.info


http://www.activex.autolisp.info

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

AB
Mitglied



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

Beiträge: 255
Registriert: 24.05.2002

Mechanical Desktop 6
AutoCAD 2002

erstellt am: 30. Aug. 2002 08:05    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

Guten Morgen Axel,

also, ich habe das ganze jetzt mal genauer untersucht.
Bei Objekten, die im aus dem Nullpunkt heraus erstellt habe, funktioniert dieser Code.
Wenn ich aber ein Objekt habe, welches ich z.B. bei Punkt (200 150 0) begonnen habe zu erstellen und dann in den Koordinatenursprung verlege, funktioniert es nicht. (Der Querschnitt wird zwar noch erzeugt, aber die Linie wird nicht herausgelöscht).

Liegt es an irgendeinem total doofen Denkfehler von mir?

Viele Grüße
Andre

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

mapcar
Mitglied
CADmin



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

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 30. Aug. 2002 08:38    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 AB 10 Unities + Antwort hilfreich

Morgen, Andrea,

dieser Code löscht mit Sicherheit alle Linien in der XY-Ebene! Wenn das bei dir nicht klappt, dann liegen bei dir die Linien eben nicht in dieser Ebene. Ich hab's eben mal hier getestet: Ein Rechteck zeichnen, um die Y-Achse 90° drehen, _explode und dann den Code abschicken. Eine Linie wird gelöscht, wie erwartet.

Ich hatte ja schon gesagt, dass es Schwierigkeiten geben kann, wenn Rundungsfehler auftreten - dann wird's mit einem ssget-Ausdruck ungemütlich. Da sollte man dann vielleicht doch eine Lisp-Routine mit (equal ... fuzz) verwenden.

Wenn ich mich recht erinnere, war das doch eigentlich alles schon drin in der Routine, die ich dir mal geschickt habe. Müsste eigentlich, aber ich weiss es nicht mehr so genau.

Gruss, Axel

------------------
http://www.tutorial.autolisp.info

http://www.advanced.autolisp.info


http://www.activex.autolisp.info

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

AB
Mitglied



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

Beiträge: 255
Registriert: 24.05.2002

Mechanical Desktop 6
AutoCAD 2002

erstellt am: 30. Aug. 2002 09:04    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

Die Routine, die Du mir geschickt hast zeichnet Querschnitt, auf allen Flächen eines Körpers in einen frei wählbaren Abstand (und löscht überzählige). Jetzt muss ich da noch versuchen einzubauen, dass die entsprechenden Linien auf der xy-Ebene (dem Boden) noch gelöscht werden, damit ich die Linien habe, die nicht ganz um das BT herumgehen, sondern nur drüber.
Das war der Code, den ich von dir bekommen habe. In den wollte ich die neue Lösch-Bedingung noch einbauen.

Aber ich hätte da auch noch mal eine andere Frage. Wie rufe ich dieses Programm, (als Unterprogramm) aus einem Hauptprogramm heraus auf? IN der Command-Zeile gebe ich ja (test(entlast)25)
ein.

(defun get-bbox(ent / pmin pmax)
(setq pmin(vlax-3d-point'(0 0 0)))
(setq pmax(vlax-3d-point'(0 0 0)))
(vlax-invoke-method
(vlax-ename->vla-object ent)
'getBoundingBox 'pmin 'pmax
)
(list
(vlax-safearray->list pmin)
(vlax-safearray->list pmax)
)
)

(defun newbies(lastent / retlist)
(while(setq lastent(entnext lastent))
(setq retlist(cons lastent retlist))
)
)

(defun streifen(ent plane ofs steps / ents lastent)
(repeat (1+ steps)
(setq lastent(entlast))
(apply'vlax-invoke-method
(append
(list(vlax-ename->vla-object ent))
(list 'SectionSolid)
(mapcar'vlax-3d-point plane)
)
)
(command"_explode"(entlast))
; gibt' da eigentlich kein vlax-put-them-into-jail???
(setq ents(append ents(newbies lastent)))
(setq plane
(mapcar'(lambda(p)(mapcar'+ p ofs))plane)
)
)
ents
)

(defun test(ent d / dimx dimz bb)
(setq bb(get-bbox ent))
(setq dimx(abs(-(caar bb)(caadr bb))))
(setq dimz(abs(-(caddar bb)(caddr(cadr bb)))))
(append
(streifen ent'((0 0 0)(0 1 0)(0 0 1))(list d 0 0)(fix(/ dimx d)))
(vl-remove-if
(function
(lambda(line / )
(if
(=(cadr(cdr(assoc 10(entget line))))
(cadr(cdr(assoc 11(entget line))))
)
(entdel line)
)
)
)
(streifen ent'((0 0 0)(1 0 0)(0 1 0))(list 0 0 d)(fix(/ dimz d)))
)
)
)

Viele Grüße
Andrea

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

mapcar
Mitglied
CADmin



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

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 30. Aug. 2002 10:21    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 AB 10 Unities + Antwort hilfreich

So ungefähr war's drin, allerdings wurden da die Linien aus der ZX-Ebene rausgekickt.
Diese Funktion brauchst du, weil man die immer braucht:

(defun ss-foreach(ss expr / i)
  (if ss
    (repeat(setq i(sslength ss))
      ((eval expr)(ssname ss(setq i(1- i))))
    )
  )
)

Und diese Prädikatfunktion (etwas abgeändert):

(defun line-in-xy-plane?(line / )
  (and
    (equal 0(caddr(cdr(assoc 10(entget line))))*epsilon*)
    (equal 0(caddr(cdr(assoc 11(entget line))))*epsilon*)
  )
)

Dann musst du die globale Variable *epsilon* setzen (sollte man auch immer haben):
(setq *epsilon* 1e-8) ; notfalls auch 1e-6

Und dann kannst du so die Linien löschen:

(ss-foreach(ssget"X"'((0 . "LINE")))
'(lambda(line)
    (if(line-in-xy-plane? line)(entdel line))
  )
)

Alles klar?

Zum Aufruf: Das kannst du aus jedem Programm heraus genauso aufrufen wie auf der Kommandozeile. Allerdings würde ich dann aus (test) eine richtige Funktion machen - die heisst ja so, weil's eher als Demo der Möglichkeiten gedacht war.

------------------
http://www.tutorial.autolisp.info

http://www.advanced.autolisp.info


http://www.activex.autolisp.info

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

AB
Mitglied



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

Beiträge: 255
Registriert: 24.05.2002

Mechanical Desktop 6
AutoCAD 2002

erstellt am: 30. Aug. 2002 10:56    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

Nee, leider ist gar nichts klar.

1. PROBLEM: Aufruf des Codes aus anderem Code heraus.
Dafür muss ich doch in der Hauptfunktion die Unterfunktionen bekannt geben. Danach habe ich ich den Aufruf-Befehl als command-Befehl eingefügt. Hier ein Beispiel. Funktioniert aber nicht. Was hane ich jetzt schon wieder nicht beachtet?

(defun c:Querschnitte ()
  (get-bbox)
  (newbies)
  (streifen)
  (test)
  (command "(test(entlast)27)")
)


(defun get-bbox(ent / pmin pmax)
(setq pmin(vlax-3d-point'(0 0 0)))..............


2.PROBLEM: Ich weiß nicht, wie ich die neuen Funktionen in dem ursprünglichen Skript einbauen muss. Ich habe gerade einiges ausprobiert, aber entwerde es kommt eine Fehlermeldung oder der Code läuft so durch, wie bisher.

Könntest Du mir vielleicht noch einen Tipp geben. Ich will´s nämlich wirklich unbedingt verstehen.

Gruß
Andrea

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

mapcar
Mitglied
CADmin



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

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 30. Aug. 2002 11:13    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 AB 10 Unities + Antwort hilfreich

(defun c:Querschnitte( / )
  (test(entlast)25)
  (ss-foreach(ssget"X"'((0 . "LINE")))
  '(lambda(line)
      (if(line-in-xy-plane? line)(entdel line))
    )
  )
)

Wenn du (get-bbox) hinschreibst, dann führst du die Funktion aus - ein 'Bekanntgeben in der Hauptfunktion' gibt es nicht in Lisp. Sowas wie forward-Deklaration gibt's in C, aber nicht hier... Allerdings erzeugt der Ausdruck (get-bbox) sofort einen Fehler, da diese Funktion ein Argument erwartet, du gibst aber keins mit.

Die Funktionen müssen aber allesamt definiert, d.h. geladen sein!
Jetzt alles klar?

Axel

------------------
http://www.tutorial.autolisp.info

http://www.advanced.autolisp.info


http://www.activex.autolisp.info

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

AB
Mitglied



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

Beiträge: 255
Registriert: 24.05.2002

Mechanical Desktop 6
AutoCAD 2002

erstellt am: 30. Aug. 2002 13:03    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

Ja, jetzt habe ich es.

Vielen Dank
Andrea

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

AB
Mitglied



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

Beiträge: 255
Registriert: 24.05.2002

Mechanical Desktop 6
AutoCAD 2002

erstellt am: 11. Sep. 2002 08:09    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

Guten Morgen Axel,

ich habe mal wieder etwas an Deinem Code ändern wollen. Eigentlich auch nichts schweres, aber irgendwie funktioniert das nicht.
Ich möchte, dass nicht nur die Linien, die in der xy-Ebene liegen und einen Z-Wert von 0 haben gelöscht werden, sondern auch die mit einem negativen Z-Wert. Also habe ich das bisherige:
(defun line-in-xy-plane?(line / )
(and
  (equal 0(caddr(cdr(assoc 10(entget line))))*epsilon*)
  (equal 0(caddr(cdr(assoc 11(entget line))))*epsilon*)))
So umgeschrieben:
...
  (<= 0 (caddr(cdr(assoc 10(entget line))))*epsilon*)
  (<= 0 (caddr(cdr(assoc 11(entget line))))*epsilon*)))

Das scheint aber nicht richtig zu sein, denn es funtioniert nicht.
Dazu wollte ich auch noch mal fragen, was die gobale Variable *epsilon* eigentlich bedeutet.

Viele Grüße
Andrea

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)2019 CAD.de | Impressum | Datenschutz