| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: linienkoordinaten in block (1061 / mal gelesen)
|
fca_mi2 Mitglied Bauingenieur
Beiträge: 508 Registriert: 10.01.2003 ACAD2018
|
erstellt am: 02. Jul. 2021 07:54 <-- editieren / zitieren --> Unities abgeben:
hallo, ich habe einen block in meinem plan. gibt es eine möglichkeit die koordinaten einer linie in diesem gedrehten (verzerrten) block auszulesen ? ich meine ohne selbst mit koordinatentransformationen rechnen zu müssen ?
------------------ MfG Frank Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 02. Jul. 2021 08:20 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
ohne groß drüber nachzudenken schieß ich mal einen wilden gedanken raus hohhe das reicht für einen Freitag morgen. da es ohne große berechnungen sein soll: command nk letztes objekt anfang ende ermitteln letztes objekt löschen ------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fca_mi2 Mitglied Bauingenieur
Beiträge: 508 Registriert: 10.01.2003 ACAD2018
|
erstellt am: 02. Jul. 2021 08:38 <-- editieren / zitieren --> Unities abgeben:
|
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 02. Jul. 2021 08:40 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 02. Jul. 2021 10:28 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
Hallo Frank, wenn du Anfangs- und Endpunkt einer Linie aus einer bestimmten Blockeinfügung brauchst musst du ja auch wissen welche Blockeinfügung das ist. Ich gehe also mal davon aus dass du das weist. Wenn du die Linie mit (nentsel) anklickst bekommst du als letzen Eintrag in der Ergebnisliste die Liste der Blöcke in der die Linie verschachtelt ist. Diese Liste brauchst du. Außerdem brauchst du natürlich des erste Element der Ergebnisliste, das ist ja die Linie selbst. Jetzt ermittelst du z.B. den Startpunkt und benutzt die unten stehende Funktion "k_blk-p->layout-p" (die beiden anderen Funktionen musst du auch laden weil die unterwegs gebraucht werden) und bekommst den entsprechenden Punkt außerhalb des Blocks zurück. Es wird hier der ursprüngliche Punkt mit den Skalierfaktoren multipliziert die Blockeinfügepunkte addiert und der Drehwinkel berücksichtigt egal wie weit die Struktur verschachtelt ist. Hab ich auch anders herum (also von außerhalb des Blocks hinein) Viel Spass damit Code: (defun k_blk-p->layout-p (p inslist) ;;; gibt von einem Punkt in einer Blockdefinition den entsprechenden Punkt in der Zeichnung zurück ;;; p = Punkt in der Blockdefinition ;;; inslist = Liste der Inserts wie sie z.B. von nentsel zurückgegeben wird (setq p (k_3d->2d p)) (foreach ins inslist (setq ent_data (entget ins)) (setq p (mapcar '* p (list (cdr (assoc 41 ent_data)) (cdr (assoc 42 ent_data))) ) ) (setq p (mapcar '+ p (k_3d->2d (cdr (assoc 10 ent_data))))) (setq p (k_p_twist p (cdr (assoc 10 ent_data)) (cdr (assoc 50 ent_data)) ) ) ) p )(defun k_p_twist (p px wx) ;;; Punkt um ein Zentrum rotieren ;;; Winkel in rad (setq pz (caddr p) pxz (caddr px)) (setq p (k_3d->2d p) px (k_3d->2d px)) (vl-remove 'nil (append (polar px (+ (angle px p) wx) (distance px p)) (list pz))) ) (defun k_3d->2d (wert / dummy) (if (vl-every '(lambda (dummy) (= (type dummy) 'LIST)) wert) (mapcar '(lambda (dummy) (list (car dummy) (cadr dummy))) wert ) (list (car wert) (cadr wert)) ) )
------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de 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: 02. Jul. 2021 11:26 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
Zitat: Original erstellt von Andreas Kraus: [i]Es wird hier der ursprüngliche Punkt mit den Skalierfaktoren multipliziert die Blockeinfügepunkte addiert und der Drehwinkel berücksichtigt egal wie weit die Struktur verschachtelt ist.
Das funktioniert natürlich für jeden beliebigen Koordinatenpunkt innerhalb der Blockdefinition ganz genau so wie für die Punkte, die mit Entities in der Blockdefinition zusammen hängen. Und das geht mit 3D genau so wie mit 2D. Ich würde deshalb eine allgemeine Funktion zur Transformation aus der Blockdefinition in die Blockreferenz schreiben (also z.B. (TRANS-BD->BR pt en) mit en als Ename der Blockreferenz), die man vielfältig auch in anderem Kontext verwenden kann. Und wie der Koordinatenpunkt pt der Blockdefinition gefunden wird, hängt von den Umständen ab, beispielsweise eben durch Wahl eines Entities mit NENTSEL, oder mittels Durchsuchen der Blockdefiniton usw.. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 02. Jul. 2021 12:22 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 02. Jul. 2021 12:29 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
Zitat: Original erstellt von cadffm: Der einfache Weg ist: Explodieren, am besten über vla-explode, Daten greifen, Objekte löschen.
Das geht meistens schief. Nimm mal an, Du willst eine Ellipse zeichnen, die deckungsgleich über einem in der ungleich skalierten und gedrehten Blockreferenz liegenden Kreis liegen soll. Um die Transformationsberechnung kommt da keiner vorbei, und die ist hier überaus trivial, und die brauchst Du sowieso bei vielen anderen Aufgaben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 02. Jul. 2021 12:42 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
[Recht hast du] Aberfür das Annehmen habe ich heute keine Zeit, vor-Urlaub-Stress. Ich lese nur Koordinaten und was mit denen passiert steht nicht geschrieben, für Koordinaten sollte es passen. (TRANS sollte wohl noch eingesetzt werden) Ich nehme auch kein exlode, aber es wurde nach dem "einfachsten" Weg gefragt und das fiel mir dazu ein, dies erfordert die wenigsten Programmierkenntnisse (vom Code copy&pasten mal abgesehen) Aber auch wnn nicht, bin auf dem weg Gruß Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 02. Jul. 2021 13:09 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
Zitat: ist das dann noch so nach k_blk-p->layout-p ?
Also ich verwende die Funktion um Koordinaten aus zum Teil verschachtelten Blöcken in den Modellbereich zu übertragen. Bei mir konkret hauptsächlich Leuchten und Brandmelderpositionen aus Xrefs (dort sind die Teile als Blöcke eingefügt) in einen Leerrohrplan. Damit werden dann automatisch die Deckendosen in den Beton gezeichnet (macht Spass ). Umrechnen muss ich da gar nichts mehr. Ich arbeite allerdings im WKS. Wenn das nicht so ist muss man da noch mit (trans ... ) ran. Ach ja, die Funktion ist nur für 2D. 3D hab ich dafür noch nie gebraucht, kann aber jeder umbauen der Lust dazu hat . ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 03. Jul. 2021 13:01 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
Also da das Thema hier von linie zu Elipse und Kreis weiter zu Xref gekletter ist. Wäre hier mein Ansatz für die linie ohne command. Code: (if (and (setq e (nentselp "\nLinie in Block wählen: ")) (= (length e) 4) (setq Start (getpropertyvalue (car e) "StartPoint")) (setq Ende(getpropertyvalue (car e) "EndPoint")) (setq matrix (caddr e)) ) (progn (setq Start(list (+ (* (caar matrix) (car Start)) (last (car matrix))) (+ (* (cadadr matrix) (cadr Start)) (last (cadr matrix))) (+ (* (cadadr matrix) (caddr Start)) (last (caddr matrix))) )) (setq Ende (list (+ (* (caar matrix) (car Ende)) (last (car matrix))) (+ (* (cadadr matrix) (cadr Ende)) (last (cadr matrix))) (+ (* (cadadr matrix) (caddr Ende)) (last (caddr matrix))) )) ) )
------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 04. Jul. 2021 14:32 <-- editieren / zitieren --> Unities abgeben: Nur für fca_mi2
@Wolfgang Kann man so machen aber hier wird nur eine Verschachtelungsebene berücksichtigt und die Blockdrehung würde ich auch noch reinbringen, dann ist das universeller. k_blk-p->layout-p macht das ja. Ich würds halt so machen: Code: (setq e (nentselp "\nLinie in Block wählen: ") start (getpropertyvalue (car e) "StartPoint") ende (getpropertyvalue (car e) "EndPoint") )(if (vl-every '(lambda (dummy) (= (type dummy) 'LIST)) (last e)) (setq start (k_blk-p->layout-p start (last e) ) ende (k_blk-p->layout-p ende (last e) ) ) )
Muss aber noch gecheckt werden dass man auch eine Linie anklickt oder wenigstens was mit Start- und Endpunkt sonst gibts ne Fehlermeldung. ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |