| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Intelligenter Workflow von Köln bis Delhi mit SAP PLM - KHD Humboldt Wedag (CIDEON, SAP, PLM, ERP, Autodesk Inventor, AutoCAD), ein Anwenderbericht |
Autor
|
Thema: Linie löschen (1854 mal gelesen)
|
AB Mitglied
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 29. Aug. 2002 12:00 <-- editieren / zitieren --> Unities abgeben:
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, Anlagenplanerin, HKS
Beiträge: 201 Registriert: 23.08.2002
|
erstellt am: 29. Aug. 2002 12:34 <-- editieren / zitieren --> Unities abgeben: Nur für AB
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
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 29. Aug. 2002 12:37 <-- editieren / zitieren --> Unities abgeben:
|
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. Aug. 2002 13:05 <-- editieren / zitieren --> Unities abgeben: Nur für AB
|
AB Mitglied
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 29. Aug. 2002 15:18 <-- editieren / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für AB
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
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 30. Aug. 2002 08:05 <-- editieren / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für AB
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
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 30. Aug. 2002 09:04 <-- editieren / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für AB
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
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 30. Aug. 2002 10:56 <-- editieren / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für AB
|
AB Mitglied
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 30. Aug. 2002 13:03 <-- editieren / zitieren --> Unities abgeben:
|
AB Mitglied
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 11. Sep. 2002 08:09 <-- editieren / zitieren --> Unities abgeben:
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 |