| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Blöcke an Linienenden platzieren und an Linie ausrichten (1967 mal gelesen)
|
furter Mitglied
Beiträge: 483 Registriert: 01.03.2004 Windows 7 Autodesk MAP 3D 2017 SP2 Autodesk Civil 2016
|
erstellt am: 24. Nov. 2016 07:04 <-- editieren / zitieren --> Unities abgeben:
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
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: 24. Nov. 2016 07:16 <-- editieren / zitieren --> Unities abgeben: Nur für furter
Hallo Furter, ja, das geht. Im folgenden nur der Ansatz, wie man beispielhaft Punkt A und B aus einer Linie bekommt, daraus läßt sich der Winkel dann berechnen. Dann kann z.B. mit einem Command-Befehl "_.INSERT" der Block auf Punkt A eingefügt werden, beim Einfügen würde ich die Drehung bei Null belassen, diese wird im Nachgang angepasst. Mit der Funktion vla-put-rotation wird der Winkel dann angepasst, wenn Attribute vorhanden sind werden die mitgedreht. Hinweis bei Attributierten Blöcken: um die Abfrage nach den Attributwerten beim Command-Befehl "_.insert" zu unterdrücken kann vorher die Variable "ATTREQ" auf 0 gesetzt werden. Im folgenden nur schnell hingetippt (nicht lauffähig)
Code:
(defun c:test ( / ) (if (and(setq obj (car (entsel "\nLinie auswählen:"))) (=(cdr(assoc 0 (entget obj)))"LINE")) (setq pA (cdr(assoc 10 (entget obj))) pE (cdr(assoc 11 (entget obj))) w (angle pA pE)) (command "_.insert" [Blockname] ....) (vla-put-rotation (vlax-ename->vla-object(entlast)) w) ) )
------------------ viele Grüße Jörn http://www.bosse-engineering.com Liniensignaturen Youtube Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
furter Mitglied
Beiträge: 483 Registriert: 01.03.2004 Windows 7 Autodesk MAP 3D 2017 SP2 Autodesk Civil 2016
|
erstellt am: 24. Nov. 2016 17:18 <-- editieren / zitieren --> Unities abgeben:
|
furter Mitglied
Beiträge: 483 Registriert: 01.03.2004 Windows 7 Autodesk MAP 3D 2017 SP2 Autodesk Civil 2016
|
erstellt am: 25. Nov. 2016 09:08 <-- editieren / zitieren --> Unities abgeben:
Hallo Jörn So geht es jetzt für mich: (defun c:test_index ( / ) (if (setq obj (car (entsel "\nLinie auswählen:"))) (=(cdr(assoc 0 (entget obj)))"LINE")) (setq pA (cdr(assoc 10 (entget obj))) pE (cdr(assoc 11 (entget obj))) w (angle pA pE)) (command "_.insert" "Aufn_terr" pE 100 100 0) (vla-put-rotation (vlax-ename->vla-object(entlast)) w) (command "_.erase" obj " ") ) Jetzt muss ich noch schauen, wie es ausschaut mit vielen Linien im Stapel. Danke nochmals für Deine Hilfe. Gruss furter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 25. Nov. 2016 09:45 <-- editieren / zitieren --> Unities abgeben: Nur für furter
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
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: 25. Nov. 2016 15:29 <-- editieren / zitieren --> Unities abgeben: Nur für furter
Hallo Furter, mir ist noch ein Fehler in Deinem Code aufgefallen: (if (setq obj (car (entsel "\nLinie auswählen:"))) (=(cdr(assoc 0 (entget obj)))"LINE")) Das würde bedeuten, wenn ein Objekt ausgewählt ist, dann wird einfach nochmal gefragt, ob es eine Linie ist. Danach wird der Code aber ausgeführt, auch wenn es gar keine Linie ist. dafür kannst Du die Funktion AND verwenden: dann würde die Abfrage lauten, wenn ein Objekt ausgewählt ist und dieses auch noch eine Linie ist, dann führe den Code aus. Wenn mehrere Funktionen ausgeführt werden sollen dann kann man diese mit der Funktion PROGN zusammenfassen. (and (setq obj (car (entsel "\nLinie auswählen:"))) (=(cdr(assoc 0 (entget obj)))"LINE")) Code:
(defun c:test_index ( / OBJ PA PE W) (if ;;;wenn Objek und Objekt = Linie (and (setq obj (car (entsel "\nLinie auswählen:"))) (=(cdr(assoc 0 (entget obj)))"LINE")) ;;;dann (progn (setq pA (cdr(assoc 10 (entget obj))) pE (cdr(assoc 11 (entget obj))) w (angle pA pE)) (command "_.insert" "Aufn_terr" pE 100 100 0) (vla-put-rotation (vlax-ename->vla-object(entlast)) w) (command "_.erase" obj " ") );;;end progn ;;;sonst (alert "Es wurde entweder kein Objekt ausgewählt oder das Objekt war keine Linie.") ) )
------------------ viele Grüße Jörn http://www.bosse-engineering.com Liniensignaturen Youtube Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
furter Mitglied
Beiträge: 483 Registriert: 01.03.2004 Windows 7 Autodesk MAP 3D 2017 SP2 Autodesk Civil 2016
|
erstellt am: 28. Nov. 2016 07:25 <-- editieren / zitieren --> Unities abgeben:
|
furter Mitglied
Beiträge: 483 Registriert: 01.03.2004 Windows 7 Autodesk MAP 3D 2017 SP2 Autodesk Civil 2016
|
erstellt am: 29. Nov. 2016 08:41 <-- editieren / zitieren --> Unities abgeben:
Guten Tag Mit einiger Mühe habe ich nun folgendes gebastelt: (defun c:test_index ( / obj zähler objekt pA pE w) (setq obj (ssget "X" '((0 . "LINE"))) zähler 0) (repeat (sslength obj) (setq objekt (ssname obj zähler) pA (cdr(assoc 10 (entget obj))) pE (cdr(assoc 11 (entget obj))) w (angle pA pE) zähler (1+ zähler)) (command "_.insert" "Aufn_terr" pE 100 100 0) (vla-put-rotation (vlax-ename->vla-object(entlast)) w) (command "_.erase" obj " ") ) ) Leider läuft das nicht durch. Fehler: Fehlerhafter Argumenttyp: lentityp <Selection set: 83a> Habt Ihr mir einen Tipp, wie ich weiterkomme? Gruss furter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 29. Nov. 2016 08:57 <-- editieren / zitieren --> Unities abgeben: Nur für furter
Fehler: Fehlerhafter Argumenttyp: Acad bekommt etwas anderes wie erwartet (zB. Zahl(int/real) statt Text(str) ) lentityp Acad erwartet ein Entity <Selection set: 83a> bekommt aber einen AuswahlsatzHabt Ihr mir einen Tipp, wie ich weiterkomme? Suche nach Flüchtigkeits-Schreibfehler. Vielleicht verwendest du auch einen anderen Variablennamen für den Auswahlsatz, dann kommst du nicht so leicht durcheinander, vielleicht einfach mal AWS für den AusWahlSatz-Namen einsetzen. Fehleranalyse: Lese in der Hilfe mal etwas zu ERRNO nach, zusammen mit dieser Liste sicher ab und an hilfreich: Klick! Wenn du den Tippfehler korrigiert hast, so lauert der zweite Fehler in deinem (Command ...), du solltest dir die Befehlsfolge von _erase noch einmal händisch durchgehen, dies stimmt nicht mit deiner Command-Anweisung überein. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1111 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 29. Nov. 2016 16:08 <-- editieren / zitieren --> Unities abgeben: Nur für furter
Hallo furter, hast Du Deinen Fehler schon gefunden? Wenn nicht, mach mal einen Klammernabgleich. M. E. löschst Du noch innerhalb der (repeat ...) Schleife, also nach dem platzieren der ersten Blockreferenz, Deinen Auswahlsatz obj. Der kann dann beim zweiten Durchlauf nicht mehr gefunden werden. HTH Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
furter Mitglied
Beiträge: 483 Registriert: 01.03.2004 Windows 7 Autodesk MAP 3D 2017 SP2 Autodesk Civil 2016
|
erstellt am: 29. Nov. 2016 16:29 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas Danke vielmals für den Tipp. Werde ich anschauen. Im Moment bin ich hier: (defun c:test_index ( / obj z AWS pA pE w) (setq AWS (ssget "_X" '((0 . "LINE"))) z 0) (repeat (sslength AWS) (setq pA (cdr(assoc 10 (entget (entlast)))) pE (cdr(assoc 11 (entget (entlast)))) w (angle pA pE) obj (ssname AWS z) z (1+ z)) (command "_.insert" "Aufn_terr" pE 100 100 0) (vla-put-rotation (vlax-ename->vla-object(entlast)) w) (command "_.erase" obj) ) ) Gruss furter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 29. Nov. 2016 16:40 <-- editieren / zitieren --> Unities abgeben: Nur für furter
Baue es von Grund auf neu zusammen, Schritt für Schritt, so das du auch verstehst was wann wie macht. Am Anfang deines Repeat-Laufes gibt es noch kein "obj" Dafür holst du dir immer wieder Objektdaten "vom letzten Objekt der Datei", das ist auch nicht gewollt, denn 10 und 11 möchtest eigentlich aus OBJ haben, nicht von "entlast" [editiert] ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 WINDOWS Vista Ultimate SP2 (64bit), NVIDIA Geforce 9600M GT, AutoCAD 2013.
|
erstellt am: 29. Nov. 2016 16:43 <-- editieren / zitieren --> Unities abgeben: Nur für furter
Mit einiger Mühe habe ich nun folgendes gebastelt: ... Und noch ein Tip:
Ein ENTER wird in einem (command ...)-Ausdruck nicht durch einen aus einem Leerzeichen bestehenden String (" "), sondern durch einen Leerstring ("") ausgedrückt. (Nach 4 kleinen Korrekturen läuft's bei mir prima ) Jürgen
------------------ Bildung kommt nicht vom Lesen, sondern vom Nachdenken über das Gelesene. (Carl Hilty) [Diese Nachricht wurde von jupa am 29. Nov. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
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: 29. Nov. 2016 16:50 <-- editieren / zitieren --> Unities abgeben: Nur für furter
Hallo Further, ich habe den Code nochmal ein bischen nachgearbeitet, wichtig sind für Dich sicherlich auf die Formatierungen. Durch Einrücken von Zeilen wird der Code viel leichter lesbar. Den Code mußt Du aber noch testen, ich habe ihn nicht ausprobiert, vielleicht sind Flüchtigkeitsfehler drin. Folgende Sachen habe ich angepasst: - ein IF vor die SSGET-Funktion gesetzt, damit keine Aktion erfolgt, wenn keine Linien gefunden worden sind. - wenn ein Auswahlsatz vorhanden ist, dann werden die nachfolgende Funktionen wieder mit PROGN zusammengefasst. - Löschen der Linien: diese können abschließend auch als Auswahlsatz "AWS" gelöscht werden. Vielleicht solltest Du Dich mit dem Visul-Lisp-Editor VLIDE beschäftigen, dort kannst Du ganz einfach formatieren und debuggen, durch einen farbigen Code (siehe angehängtes GIF)wird alles viel einfacher lesbar: http://www.bosse-engineering.com/JB_Data/Bosse-engineering/090501_VisualLISP-Editor.pdf Code:
(defun c:test_index ( / obj z AWS pA pE w) (if(setq AWS (ssget "_X" '((0 . "LINE")))) ;;;wenn Auswahlsatz, dann (progn (setq z 0) (repeat (sslength AWS) (setq pA (cdr(assoc 10 (entget (ssname aws z)))) pE (cdr(assoc 11 (entget (ssname aws z)))) w (angle pA pE) z (1+ z)) (command "_.insert" "Aufn_terr" pE 100 100 0) (vla-put-rotation(vlax-ename->vla-object(entlast)))w) ;;;abschließend die Linien im AWS löschen (command "_.erase" aws "") ) (alert "Es wurden keine Linien ausgewählt.") ) (princ) )
------------------ viele Grüße Jörn http://www.bosse-engineering.com Liniensignaturen Youtube Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
furter Mitglied
Beiträge: 483 Registriert: 01.03.2004 Windows 7 Autodesk MAP 3D 2017 SP2 Autodesk Civil 2016
|
erstellt am: 29. Nov. 2016 17:03 <-- editieren / zitieren --> Unities abgeben:
Hurra, das Skript ist geboren. Grosser Dank an alle, die mich unterstützt haben. (defun c:test_index ( / obj z AWS pA pE w) (setq AWS (ssget "_X" '((0 . "LINE"))) z 0) (repeat (sslength AWS) (setq obj (ssname AWS z) pA (cdr(assoc 10 (entget obj))) pE (cdr(assoc 11 (entget obj))) w (angle pA pE) z (1+ z)) (command "_.insert" "Aufn_terr" pE 100 100 0) (vla-put-rotation (vlax-ename->vla-object(entlast)) w)) (command "_.erase" AWS "") ) Gruss furter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
furter Mitglied
Beiträge: 483 Registriert: 01.03.2004 Windows 7 Autodesk MAP 3D 2017 SP2 Autodesk Civil 2016
|
erstellt am: 06. Dez. 2016 09:48 <-- editieren / zitieren --> Unities abgeben:
Guten Tag Nach unzähligen Versuchen gelange melde ich mich nochmals. Das Skript sieht jetzt so aus: (defun c:Aufn_index (/ c:GNSS obj z AWS pA pE w) (setq AWS (ssget "_X" '((0 . "LINE"))) z 0 ) (repeat (sslength AWS) (setq obj (ssname AWS z) pA (cdr (assoc 10 (entget obj))) pE (cdr (assoc 11 (entget obj))) w (angle pA pE) z (1+ z) ) (if (/= pA pE) (command "_.insert" "Aufn_Index_Lisp" pE 1 1 0) ) (vla-put-rotation (vlax-ename->vla-object (entlast)) w ) ) ) (defun c:GNSS (/ obj z AWS pA pE) (setq AWS (ssget "_X" '((0 . "LINE"))) z 0 ) (repeat (sslength AWS) (setq obj (ssname AWS z) pA (cdr (assoc 10 (entget obj))) pE (cdr (assoc 11 (entget obj))) z (1+ z) ) (if (equal pA pE) (command "_.insert" "GPS_Aufn_1fach" pE 0.5 0.5 0) ) ) (command "_.erase" AWS "") ) Das funktioniert bis auf eine Ausnahme. Mit dem if im ersten Teil sollen nur die Linien gezeichnet werden, die eine Länge grösser 0, bezw. wo der Startpunkt der Linie dem Endpunkt entspricht. Hier komme ich nicht weiter. Könnt Ihr mir nochmals einen Tipp geben? Herzlichen Dank für Eure Bemühungen. Gruss furter [Diese Nachricht wurde von furter am 06. Dez. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
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: 06. Dez. 2016 09:56 <-- editieren / zitieren --> Unities abgeben: Nur für furter
|
furter Mitglied
Beiträge: 483 Registriert: 01.03.2004 Windows 7 Autodesk MAP 3D 2017 SP2 Autodesk Civil 2016
|
erstellt am: 06. Dez. 2016 09:59 <-- editieren / zitieren --> Unities abgeben:
|
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 WINDOWS Vista Ultimate SP2 (64bit), NVIDIA Geforce 9600M GT, AutoCAD 2013.
|
erstellt am: 06. Dez. 2016 10:00 <-- editieren / zitieren --> Unities abgeben: Nur für furter
Nach flüchtigem drüberlesen denke ich, Du mußt die Aktionen, die bei Erfüllung der If-Bedingung ausgeführt werden sollen in eine (progn ...)-Anweisung einschließen: (if (/= pA pE) (progn (command "_.insert" "Aufn_Index_Lisp" pE 1 1 0) (vla-put-rotation (vlax-ename->vla-object (entlast)) w ) ) ; end_progn ) ;end_if Jürgen
------------------ Bildung kommt nicht vom Lesen, sondern vom Nachdenken über das Gelesene. (Carl Hilty) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 06. Dez. 2016 10:08 <-- editieren / zitieren --> Unities abgeben: Nur für furter
Zitat: Original erstellt von furter: sollen nur die Linien gezeichnet werden, die eine Länge grösser 0, bezw. wo der Startpunkt der Linie dem Endpunkt entspricht.
Der Fall wird genau NIE eintreten. Entweder ist die Linie >Null oder der Start- und Endpunkt sind identisch. Aber wie auch immer: Du hast zwei Probleme, das eine wurde dir oben bereits näher gebracht IF und PROGN Code: (if (/= pA pE) (progn ; hier alles hinein, was ausgeführt werden soll wenn die Bedingung erfüllt ist (command "_.insert" "Aufn_Index_Lisp" pE 1 1 0) );_progn_end (princ "\nLustige Textmeldung wenn das nicht der Fall ist, muss aber nicht" );_if_ende
Das andere Problem ist der Vergleich der Liste pA und pE, dieser wird oftmals nicht funktionieren da die Koordinaten sich durch mathematische Ungenauigkeit unterscheiden können. Hier wäre eine mögliche Lösung: Länge der Linie abfragen oder berechnen und mit einer zulässigen Ungenauigkeit vergleichen: (/= 0.0 (distance pA pE)) Um geringste Abweichungen als WAHR zuzulassen, das /= durch ein EQUAL ersetzen, schau dir dazu die Syntax von Equal an; Klick! Code:
Beispiel: Befehl: (equal 1 1.00001 0) nilBefehl: (equal 1 1.0001 0.00001) nil Befehl: (equal 1 1.0001 0.0001) T
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
furter Mitglied
Beiträge: 483 Registriert: 01.03.2004 Windows 7 Autodesk MAP 3D 2017 SP2 Autodesk Civil 2016
|
erstellt am: 06. Dez. 2016 12:57 <-- editieren / zitieren --> Unities abgeben:
Zitat: die eine Länge grösser 0, bezw. wo der Startpunkt der Linie dem Endpunkt entspricht.
Ja, war nicht richtig geschrieben -> nicht dem Endpunkt.... Vielen Dank an Jupa und Cadffm. Eure Tipps versuche ich auch umzusetzen, sobald ich wieder Zeit finde... Gruss furter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |