| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Linienselektion südlich von Mtext (1696 mal gelesen)
|
Christian01 Mitglied Technischer Zeichner
Beiträge: 281 Registriert: 17.04.2007
|
erstellt am: 06. Okt. 2014 12:04 <-- editieren / zitieren --> Unities abgeben:
Hallo liebe Community, meine LISP Kenntnisse sind leider nicht so groß. Folgendes Problem habe ich. Ich habe ein Zeichnung mit mehreren Linien und Texten. Ich möchte gerne eine LISP-Routine schreiben die mir den Text und die dazugehörige Linie auf einen anderen Layer verschiebt. Die dazugehörige Linie liegt südlich vom Mtext. Ich nicht sagen, das er die Linie im Umkreis nehmen kann, da auch nördlich vom Mtext eine Linie liegt. Folgende Vorgangsweise habe ich mir überlegt, aber ich weiß nicht wie ich das umsetzten kann. 1) Lisp sucht mir nach MTexten mit den Inhalten: *Kabel* 2) Danach wird die Rotation vom Mtext ausgelesen und die südliche Linie vom Mtext selektiert. 3) Den Mtext und die Linie werden auf den Layer: "Übersicht" verschoben. Kann mir jemand helfen? ------------------ Grüße Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 06. Okt. 2014 12:09 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
|
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. Okt. 2014 12:28 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
Ist die betreffende Linie genau so lang wie der Text (breit), oder länger, oder kürzer? Wie weit ist die Linie vom MText entfernt. Sind es mehrzeilige Textelemete oder stets einzeilig? Wo ist der Basispunkt der Textelemente? Am besten mal einen verallgemeinerungsfähigen Zeichnungsauschnitt posten. 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 |
Christian01 Mitglied Technischer Zeichner
Beiträge: 281 Registriert: 17.04.2007
|
erstellt am: 06. Okt. 2014 13:17 <-- 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. Okt. 2014 13:40 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
Darf man folgende Randbedingungen festlegen: - betreffender MText ist stets mit der Ausrichtungsoption "unten zentriert" positioniert worden - Linie befindet sich stets 0.25 ZE unterhalb des Einfügepunktes, parallel zur Textorientierung? - Es geht um alle MTextelemente, die die Zeichenfolge "*kabel*" beinhalten? (Ist ja eigentlich schon mit Ja beantwortet, aber doppelt hält besser ) Ich hoffe Du verstehst den Sinn dieser Fragen, nämlich: woran kann/soll das Programm erkennen, welche Linie zu welchem Textelement gehört. Erst wenn das geklärt ist kann man sich Gedanken machen, wie das zu automatisieren wäre. 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 |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 06. Okt. 2014 20:04 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
So richtig schlau bin ich nicht aus deinen Zeichnung geworden. Einmal liegt ein MText mit Basis (UM) und einmal ein Mtext mit Basis (OM) an der Linie. Es stellt sich die Frage, sollen die MText so verändert werden, wie sie im Ergebnis farblich dargestellt sind? Ansonsten müsstest du ja jedesmal eine Linie wählen und dann die betreffenden Mtext ihrer Eigenschaften aufrufen. Ausserdem müsstest du auch den Textwinkel mit einbeziehen. Ich würde mir vielleicht grundsätzlich erstmal überlegen, wie es "händisch" zu bewältigen wäre und dann wie man es automatisieren könnte. Denn dann wirst du vielleicht feststellen, dass der Umfang des Programms ziehmlich überhand nimmt und Fehler im Voraus beseitigt sein müssen, damit das Programm auch einwanfrei funktioniert. Mir hat sich eine solche Aufgabe noch nicht gestellt, ich sehe aber den Aufwand immens. ------------------ Gruss Dirk http://cadplayerlounge.blogspot.se Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Christian01 Mitglied Technischer Zeichner
Beiträge: 281 Registriert: 17.04.2007 Briscad V22 ACAD MAP 2019 Win 10 Pro 64bit Intel, 4x 3,0 GHz, 8GB RAM 2 x 24" TFT
|
erstellt am: 06. Okt. 2014 21:07 <-- editieren / zitieren --> Unities abgeben:
Zitat:
Darf man folgende Randbedingungen festlegen: - betreffender MText ist stets mit der Ausrichtungsoption "unten zentriert" positioniert worden Teilweise - Linie befindet sich stets 0.25 ZE unterhalb des Einfügepunktes, parallel zur Textorientierung? Ja - Es geht um alle MTextelemente, die die Zeichenfolge "*kabel*" beinhalten? (Ist ja eigentlich schon mit Ja beantwortet, aber doppelt hält besser ) Ja
Die Ausrichtungsposition von den betreffenden Mtexten in einer Zeichnung könnte unterschiedlich sein. ------------------ Grüße Christian 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: 07. Okt. 2014 05:56 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
Zitat: Original erstellt von Christian01:
Die Ausrichtungsposition von den betreffenden Mtexten in einer Zeichnung könnte unterschiedlich sein.
Was ist "unterschiedlich", was kann alles vorkommen? Auch unten links und unten rechts? Oder gar auch mitte links/rechts/zentriert und/oder oben links/rechts/zentriert? Falls von letztgenanntem auch nur eine Variante zutreffen sollte, dann stimmte die Aussage "Linie befindet sich ... unterhalb des Einfügepunktes" nicht. Stets einzeilig oder vllt. doch manchmal auch mehrzeilig? Hast Du noch nicht definitiv beantwortet. Alles noch ziemlich verschwommen ... Jürgen ------------------ Bildung kommt nicht vom Lesen, sondern vom Nachdenken über das Gelesene. (Carl Hilty) [Diese Nachricht wurde von jupa am 07. Okt. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 07. Okt. 2014 08:03 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
Hallo Christian, halo Jupa, nun, die Herausforderung der Entwickler besteht in aller Regel darin, die Aufgabe des Kunden in eine Idee eines Programmablaufplans zu übersetzen. Dabei sollten die Gegebenheiten so akzeptiert werden, wie diese sind. Die massenhafte manuelle Änderung der Ausgangssituation ist da in aller Regel keine Option. So verstehe ich meinen Job. Zu Christians Aufgabe habe ich, aufgrund meiner Erfahrung, bereits verschiedene Lösungsideen: A) Umkreissuche Vom Basispunkt des MTextes ausgehend werden in immer größeren Abständen die Linien gesucht, die den o.g. Bedingungen entsprechen. Anhand logisch zu analysierender Lageverhältnisse, sollte eine eindeutige Zuordnung möglich sein. B) Es werden zunächst alle MTexte und Linien ausgewählt. Zu den Linien werden die Einfügepunkte und Winkel berechnet und gemeinsam mit der Linien gespeichert. Danach werden alle MTexte durchlaufen und aus den Linien, mit den gleichen logischen Vergleichen wie bei (A), untersucht und so die eindeutige Zuordnung von Linie-MText ermittelt. Ich würde (B) bevorzugen, weil man hier nicht ständig irgendwelche Auswahlen treffen muss, die bekanntlich vom angezeigten Bildschirmausschnitt abhängig sind, was ein ständiges Zoomen notwendig machen würde. (B) wird auch deshalb performanter sein, weil man nur einmal jedes Objekt auswertet. So, ich denke, damit ist mal ein Ansatz klar, und du Christian kannst dich daran versuchen. Wenn du da nicht weiter kommst, dann poste am besten deinen Code, den du bis dahin hast. Ich poste hier jetzt keine Lösung, weil ich das in c#.Net schreiben würde - denke aber, dass meine Lisp-Kenntnisse noch ausreichen, um dir im Zweifel die richtigen Stichworte zum Weiterkommen geben kann - und es sindhier ja noch andere sehr gute Helfer aktiv. Bei Fragen ... Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 07. Okt. 2014 08:20 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
|
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: 07. Okt. 2014 10:06 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
Nun, mein Denkansatz war ein klein wenig anders (läuft aber im Prinzip auf das gleiche hinaus): - Suche alle MTexte, in denen "*kabel* (bel. groß/klein) vorkommt (ssget). - für jedes gefundene Element ermittle Einfügepunkt und Einfügewinkel - wähle ausgehend von Einfügepunkt das Objekt, welches sich im Abstand von 2.5 ZE im Winkel von Einfügewinkel-90° zu finden ist (ssget). - sammle alle Elemente in einem Auswahlssatz zusammen und ändere deren Eigenschaften wie gewünscht (Layer). Deshalb mein hartnäckiges Bohren, von welcher (gesicherten) Ausgangssituation man ausgehen kann. Na schaun wir mal. Bisher ist ja nicht mal die Frage von Holger ("wie sieht der Code bisher aus?") beantwortet. 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 |
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: 07. Okt. 2014 10:13 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
Zitat: Original erstellt von Brischke:
A) Umkreissuche Vom Basispunkt des MTextes ausgehend werden in immer größeren Abständen die Linien gesucht, die den o.g. Bedingungen entsprechen.
Und genau da liegt z. B. eine der Unwägbarkeiten nach Christians bisheriger Aufgabenstellung. Wenn der Basispunkt des Textes nun oben oder mittig liegt ...? 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 |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 07. Okt. 2014 10:24 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 07. Okt. 2014 13:26 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 13. Okt. 2014 09:18 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
|
Christian01 Mitglied Technischer Zeichner
Beiträge: 281 Registriert: 17.04.2007
|
erstellt am: 15. Okt. 2014 11:58 <-- editieren / zitieren --> Unities abgeben:
Hallo CADmium, entschudige. Danke für die testkombi.vlx. Genau das habe ich gemeint. Das andere Problem ist das, das er Auswurf nicht umbedingt den MText "Kabel" beinhalten muss, sondern ich die Liste ggf. Anpassen bzw. Erweitern müsste. Währe es möglich das ich diesen VLX als LSP bekommen könnte? ------------------ Grüße Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 15. Okt. 2014 12:42 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
|
Christian01 Mitglied Technischer Zeichner
Beiträge: 281 Registriert: 17.04.2007
|
erstellt am: 15. Okt. 2014 13:09 <-- editieren / zitieren --> Unities abgeben:
Trotzdem danke. Den Auswahlsatz für die MTexte, ist kein Problem. Die Selektion mit der Linie da hänge ich (ssget) Folgender Gedanke: 1) Ausrichtung von MText auslesen und 90 Grad hinzufügen (kein Problem) 2) Selektion von Elementen in einem Abstand von 2,5 ZE, südlich vom Einfügepunkt des Mtextes (--> KEINE Ahnung wie???) ------------------ Grüße Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 15. Okt. 2014 13:18 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
Es gibt die Objektwahl ZAUN. Aber denke immer daran das SSGET abhängig von der Bildschirmdarstellung (Ausschnitt&Zoom) arbeitet, zu dem Them würde man auch ein paar ältere Thread finden bei Interesse.. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 15. Okt. 2014 13:36 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
|
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: 15. Okt. 2014 13:41 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
Zitat: Original erstellt von Christian01:
1) Ausrichtung von MText auslesen und 90 Grad hinzufügen (kein Problem) 2) Selektion von Elementen in einem Abstand von 2,5 ZE, südlich vom Einfügepunkt des Mtextes (--> KEINE Ahnung wie???)
zu 1: Wenn Einfügepunkt unten ist (links, zentriert oder rechts), dann ist die Richtung nach unterhalb des Textes: W1=Ausrichtungswinkel - 90° (Minus!) zu 2: Wenn Einfügepunkt unten ist und das gesuchte Objekt 2.5 ZE vom Einfügepunkt entfernt, kann man es selektieren mittels (ssget (polar Einfügepunkt W1 2.5)) denn: (ssget) akzeptiert als Argument auch eine Koordinate und (polar Einfügepunkt W1 2.5) liefert genau den Punkt, der vom Einfügepunkt aus um 2.5 ZE in Richtung W1 entfernt ist, also so als hättest Du genau auf diese Stelle gepickt. Beachte: Winkelangaben in LISP-Funktionen erfolgen immer im Bogenmaß. 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 |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 15. Okt. 2014 13:55 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
|
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: 15. Okt. 2014 14:21 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
Zitat: Original erstellt von CADmium:
zu viele WENN s ... so funktioniert Software und Programmierung nicht
Es war ja auch nur die direkte Antwort auf seine Frage ("Selektion von Elementen in einem Abstand von 2,5 ZE, südlich vom Einfügepunkt des Mtextes"). Die WENNs sollten eher eine abschreckende Wirkung haben 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 |
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: 15. Okt. 2014 16:39 <-- editieren / zitieren --> Unities abgeben: Nur für Christian01
Hallo Christian, ich gebe hier auch nochmal meinen Senf dazu, vielleicht liege ich richtig, vielleicht ja auch falsch, ich habe den Beitrag nur überflogen. Ich würde folgende Ansatz wählen: 1. Mtext auswählen 2. Einfügepunkt Mtext und Drehung - 0.5 * PI => ist dann Richtung Süden (vom Text aus gesehen) 3. Temporäre Linie Richtung Süden, lang genug, daß alle möglichen Polylinien geschnitten werden 4. Schnittpunkte für alle PL's mit der Temporären Linie, davon über vl-sort immer den mit dem kleinsten Abstand zum Einfügepunkt Mtext. 5. Gesamtliste über vl-sort wieder nach dem kleinsten Abstand sortieren, die enthaltene PL mit dem kleinsten Abstand ist dann DIE Polyline. Natürlich mußt Du die Auswahl der Mtexte noch in eine Schleife packen, auf den Inhalt *Kabel* prüfen, aber vom Grundsatz her müßte das so funktionieren. Für die Schnittpunktfunktionen kann ich mal auf das Kochbuch oder die Seiten von Axel verweisen (googlen, habe gerade den Link nicht parat) Code:
(defun c:test ( / A AWS INSERTIONPOINT N OBJ PL POLYLIST ROTATION) (if (setq obj (car (entsel "Mtext wählen:"))) (progn (if (setq aws (ssget "_X" (list (cons 0 "POLYLINE,LWPOLYLINE")))) (progn (setq n 0) (repeat (sslength aws) (setq PolyList (cons (ssname aws n)PolyList) n (+ n 1))))) (setq InsertionPoint (vlax-get (vlax-ename->vla-object obj)'InsertionPoint) Rotation (vla-get-Rotation (vlax-ename->vla-object obj))) (entmake (list (cons 0 "LINE") (cons 10 InsertionPoint) (cons 11 (polar InsertionPoint (- Rotation (* 0.5 pi))10000.0)))) (setq PL(cadr (car (vl-sort (vl-remove-if '(lambda(A)(not(car A))) (mapcar '(lambda(A) (list (car (vl-sort (JBf_List:ObjSchnitt (entlast)A) '(lambda(e1 e2) (< (distance InsertionPoint e1) (distance InsertionPoint e2))))) A))PolyList)) '(lambda(e1 e2) (< (distance InsertionPoint (car e1)) (distance InsertionPoint (car e2)))))))) (entdel (entlast)))) (if PL (progn (redraw PL 3) (alert (strcat "Polylinie mit Handle: " (cdr(assoc 5 (entget PL)))))) (alert "Keine Poly gefunden."))) ;;;Schnittpunkte zweier Linienobjekte (defun JBf_List:ObjSchnitt(obj1 obj2 / SpArray)
(setq SpArray (vlax-invoke-method(vlax-ename->vla-object obj1) 'IntersectWith (vlax-ename->vla-object obj2) acExtendNone)) (if(/= -1 (vlax-safearray-get-u-bound (vlax-variant-value SpArray)1)) (JBf_List:ObjSchnitt:ArrayList->List (vlax-safearray->list(vlax-variant-value SpArray)) 3))) ;;;ArrayList in normale Liste (defun JBf_List:ObjSchnitt:ArrayList->List (ArrayList i / A N RETLIST SUBLIST) (setq n 0) (mapcar '(lambda(A) (setq n (+ n 1) subList (cons A subList)) (if (= n i) (setq retList (cons (reverse subList)retList) n 0 subList nil)))ArrayList) retList)
Nachtrag: den Abstand von 0.25 Zeicheneinheiten habe ich nicht berücksichtigt, aber das sollte dann mit einer Abstandsprüfung machbar sein.
------------------ viele Grüße
Jörn http://www.bosse-engineering.com Orthogonalvermassung Youtube [Diese Nachricht wurde von joern bosse am 15. Okt. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |