| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Der Weg zur Smart Factory: Ganzheitliche Planung für eine digitale Zukunft, ein Webinar am 09.10.2024
|
Autor
|
Thema: Block auf Line verteilen LISP (1475 / mal gelesen)
|
nebuCADnezzar Mitglied
Beiträge: 292 Registriert: 17.10.2007 AutoCAD 2021 Mechanical 2021 Inventor 2021 64 bit Win 10 AMD Ryzen Pro 3700U
|
erstellt am: 18. Mrz. 2016 10:21 <-- editieren / zitieren --> Unities abgeben:
Moinmoin So dem schönen Freitag zuliebe dacht ich ich köönt mir das Leben mal wieder etwas vereinfachen. Die Aufgabe tönt eigentlich ganz leicht, ich muss nen Block auf ner Linie verteilen und nein messen geht nicht da der Abstand immer 300 ist und der End- und Anfangsabstand zwischen 100-150 sein muss (was heisst dass der vorletzte Block allenfalls n Spezialabstand hat wenns nicht aufgeht...) Mein gewünschtes Vorgehen wäre: Linie anklicken -> Zack alles da Ich hab hier auch was ähnliches gefunden: http://ww3.cad.de/foren/ubb/Forum54/HTML/007402.shtml aber war noch nicht die Lösung Dass hier macht schon sau gut was ich will, nur hab ich zwei Jahre nicht mehr gelispelt ich brauch hier n Anschupser wo ich die Berechnungen einfügen muss (die oben genannten Berechnungen wären ja nicht kompliziert) Ich seh grade nichtmal wo dass Programm die gemessene Linielänge halbiert?
Code: (defun c:Mins (/ name ss i e p1 p2) (if (and (or (/= (setq name (getstring t "\n Specify Block name :")) "") (/= name nil) ) (if (not (tblsearch "BLOCK" name)) (progn (alert " name of Block is not found !!") nil ) t ) (progn (prompt "\n Select lines ...") (setq ss (ssget '((0 . "LINE")))) ) ) (repeat (setq i (sslength ss)) (setq e (entget (ssname ss (setq i (1- i))))) (entmakex (list '(0 . "INSERT") (cons 10 (mapcar (function (lambda (q p) (/ (+ q p) 2.))) (setq p1 (cdr (assoc 10 e))) (setq p2 (cdr (assoc 11 e))) ) ) (cons 2 name) (cons 50 (if (or (eq (angle p1 p2) pi) (eq (angle p1 p2) (* pi 1.5)) ) pi (angle p1 p2) ) ) '(41 . 1.0) '(42 . 1.0) '(43 . 1.0) ) ) ) (princ) ) (princ) )
Aber vieleicht gibs ja schon n anderes LISP was Blöcke auf Linien verteilt und ich habs nur nicht gefunden...?! Gruss vom Bodensee ------------------ "Wissenschaft ist entweder Physik oder Briefmarkensammeln" Ernest Rutherford 1871-1937 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 18. Mrz. 2016 10:28 <-- editieren / zitieren --> Unities abgeben: Nur für nebuCADnezzar
Ich denke zwar das du hiermit(der Code oben) nicht so glücklich wirst, aber ich antworte dennoch mal: Code: (repeat (setq i (sslength ss)) ; <- Es erfolgt EIN Durchlauf pro gewählter Linie (da nur ein Objekt auf der Linie platziert werden muß in dem Beispielcode) (setq e (entget (ssname ss (setq i (1- i))))) (entmakex (list '(0 . "INSERT") (cons 10 (mapcar (function (lambda (q p) (/ (+ q p) 2.))); <- Hier wird der Mittelpunkt zwischen Start(10) und Endpunkt(11) der Linie ermittelt. (setq p1 (cdr (assoc 10 e))) (setq p2 (cdr (assoc 11 e)))
Hilft nicht wirklich, oder? Geht es wirklich nur um Linien? Nicht um ein oder mehrteilige Polylinien? STATIONIERUNG wäre ein guter Begriff wenn es auch um Polylininen geht. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nebuCADnezzar Mitglied
Beiträge: 292 Registriert: 17.10.2007 AutoCAD 2021 Mechanical 2021 Inventor 2021 64 bit Win 10 AMD Ryzen Pro 3700U
|
erstellt am: 18. Mrz. 2016 11:05 <-- editieren / zitieren --> Unities abgeben:
Hallo cadfmm ...naja war der einzige code den ich gefunden hab Aber ja dass mit der Stationierung ist ne gute Idee! Hab auch schon code gefunden und auf den ersten Blick sieht der aus als versteh ich was der tut und dann krieg ichs auch hin den "schreib stationierungs dahin" zu ersetzen mit "insert n block dahin"... Ich pröbel mal! Vielen Dank für den Anstupser soweit ------------------ "Wissenschaft ist entweder Physik oder Briefmarkensammeln" Ernest Rutherford 1871-1937 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 18. Mrz. 2016 13:58 <-- editieren / zitieren --> Unities abgeben: Nur für nebuCADnezzar
Zitat: Original erstellt von nebuCADnezzar:
...naja war der einzige code den ich gefunden hab
Hallo nebuCADnezzar, nicht irgendwelchen Code suchen, der "so ungefähr" das macht was Du willst Selber machen, so das genau das rauskommt, was Du willst, alos erstmal überlegen, wie man das machen könnte, der Code ist dann nicht das schwierigste. In Deinem Fall würde ich folgende Überlegungen anstellen. Ist es wirklich nur und immer eine Linie, auf der Du Blöcke verteilen willst? Kann es auch mal eine Polylinie sein? 2D/3D? Wenn 3D, Abstand der Blöcke dann "in Projektion" oder entlang der 3D-Linie? Das weiter gehört zwar eher ins LISP-Brett, aber wenn wir schon mal hier sind: Weitere Schritte (machen sich gut mit den vlax-curve-get... Funktionen, dazu Element mit (setq deinvlalobj (vlax-ename->vla-object dein_aktueller_elementname)) zu einem vla-Objekt machen): 1) Gesamtlänge des Objektes ermitteln (vlax-curve-getDistAtParam deinvlaobj (vlax-curve-getEndParam deinvlaobj)) 2) Anzahl ganzer Abschnitte mit Deinem Abstand ermitteln 3) "Restlänge" ermitteln und halbieren 4) Punkte für Blockpositione ermitteln, 1. Abstand = 1/2 Restabstand, alle weiteren jeweils + Dein Abstand, Punkt ermitteln mit (vlax-getPointAtDist deinvlaobj deinaktuellerAbstand) HTH Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 21. Mrz. 2016 16:33 <-- editieren / zitieren --> Unities abgeben: Nur für nebuCADnezzar
Zitat: Original erstellt von nebuCADnezzar: MoinmoinSo dem schönen Freitag zuliebe dacht ich ich köönt mir das Leben mal wieder etwas vereinfachen. Die Aufgabe tönt eigentlich ganz leicht, ich muss nen Block auf ner Linie verteilen und nein messen geht nicht da der Abstand immer 300 ist und der End- und Anfangsabstand zwischen 100-150 sein muss (was heisst dass der vorletzte Block allenfalls n Spezialabstand hat wenns nicht aufgeht...)
Hast Du Dir denn schon mal den GEOMCAL Kalkulator in AutoCAD angesehen? Der erledigt Dein Problem ohne Programmierung, und für noch mehr Komfort kannst Du die Befehle auch in eine kleine Lisp-Routine einbauen. Dieser Kalkulator ist eine der nützlichsten Sachen in AutoCAD. Und dennoch kennt den kaum jemand.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |