| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Blockattributdaten (1113 mal gelesen)
|
Detlef.w Mitglied Bauzeichner
Beiträge: 6 Registriert: 22.02.2006
|
erstellt am: 22. Feb. 2006 20:18 <-- editieren / zitieren --> Unities abgeben:
Hallo Lispler, bisher habe ich mit euren Beiträgen gut helfen können, nun aber brauche eure Hilfe Ich habe mir eine eigene Layer und Ebenensteuerung erstellt So kann ich z.B. Automatisch den Layer -2estrich erstellen und ein und ausschalten. Somit kann ich im Kellergeschoß den Estrich auf dem Layer -2Estrich zeichnen. Der Layer für das Erdgeschoß würde dann 10Estrich heißen. Nun zu meinem Problem. Ich habe mir ein Programm geschrieben, mit dem ich die Zimmertüröfnung mit zwei punkten anklicken kann und dann mit dem 3 Punkt die Mauerstärke. Das Lips soll dann die Türbreite und die Mauerstärke berechnen, sowie den Mittelpunkt Zwischen der Türe und dem Mauerwerk. Dann soll berechnet werden wie lang der Sturz wird und welcher Fertigsturz und deren Anzahl gebraucht wird. Als Text wird nun die Türbreite und die Sturzhöhe als Block eingefügt. in dem Block werden auch die Daten des Sturzes und die Anzahl mit eingegeben. Sinn des Ganzen ist, das ich dann über meine Datenbank die Anzahl und Art der Stürze für das ganze Bauobjekt nach Ebenen als Stückliste ausgeben kann. Alles Funtioniert auch Tadellos, solange die Variablen der Estrichhöhe und die Variable der Ebene vorhanden ist. Mein Problem ist das ich die Variablen nach jeder Neuladung der Zeichnung neu eingeben muß. Ich habe nun einen einzigen Block in der Zeichnung mit den Objektdaten des Bauobjekt als Attribute hinterlegt. Die Attribute lauten z.B.: -2Estrichhöhe = 12 -2Wandhöhe = 252 10Estrichhöhe = 16 10Wandhöhe = 277 12Estrichhöhe = 14 12Wandhöhe = 264 usw. Nun möchte ich wenn ich in der Ebene -2 bin, der Variable -2Estrichhöhe den Wert aus dem Block Objektdaten zuweisen. und das ist mein großes Problem, wie bekomme ich nun die Daten der einzelnen Variablen des Blockes. Und hier nun mein Lips ;......................................................... ;: DATE : 02.2005 Kunde: : ;: Wendt AutoCAD-Version 2005 : ;: Version 1.0 : ;: : ;: Türbreite.LSP Berechnet die Türbreite und ermittelt die Stürze laut Wandstärke...: ; Ausführung: Erst die Linke Seite der Türeöffnung auswählen, dann die Rechte und danach die Wandstärke ;Deklaration: ; stpt Startpunk ; ep 2 Punkt der Türöffnung ; leny Länge in Y (DEFUN C:türbreite () (Setvar "Osmode" 1) (SETQ stpt (GETPOINT "Startpunkt der Türe wählen: ") ep (GETPOINT stpt "Zweiter Punkt der Türe: ") T_breite (GETPOINT ep "Zweiter Punkt der Wand: ") lenx (Distance Stpt ep) Türbreite (rtos lenx 2 2) Mauerstaerke (rtos (Distance ep t_breite) 2 2) wi (Angle stpt ep) win (angtos wi 0 1) winkel_1 (Angle stpt t_breite) ;Winkel im Bogenmaß winkel_2 (angtos winkel_1 0 1) ;Winkelangabe Winkel_3 (distance Stpt t_breite) Teiler (/ winkel_3 2) startpunkt (polar stpt winkel_1 teiler) Anzahl 0 Sturzbreite 0 Sturzlänge 0 Teiler 0 ) ;________________Anzahl der Stürze berechnen_______________ (if (= Mauerstaerke "11.5") (SETQ Anzahl 1) ) (if (= Mauerstaerke "17.5") (SETQ Anzahl 1) ) (if (= Mauerstaerke "24") (SETQ Anzahl 2) ) (if (= Mauerstaerke "36.5") (SETQ Anzahl 2) ) ;=================Sturzbreite berechnen==================== (if (= Mauerstaerke "11.5") (SETQ Sturzbreite 11.5) ) (if (= Mauerstaerke "17.5") (SETQ Sturzbreite 17.5) ) (if (= Mauerstaerke "24") (SETQ Sturzbreite 11.5) ) (if (= Mauerstaerke "36.5") (SETQ Sturzbreite 17.5) ) ;--------------Sturzlänge berechnen------------------------ (if (and (> lenx 0) (< lenx 77.1)) (SETQ Sturzlänge 115) ) (if (and (> lenx 77.1) (< lenx 90.1)) (SETQ Sturzlänge 130) ) (if (and (> lenx 90.1) (< lenx 101.1)) (SETQ Sturzlänge 150) ) (if (and (> lenx 101.1) (< lenx 125.1)) (SETQ Sturzlänge 175) ) (if (and (> lenx 125.1) (< lenx 150.1)) (SETQ Sturzlänge 200) ) (if (and (> lenx 150.1) (< lenx 175.1)) (SETQ Sturzlänge 225) ) (if (and (> lenx 175.1) (< lenx 200.1)) (SETQ Sturzlänge 250) ) (if (and (> lenx 225.1) (< lenx 250.1)) (SETQ Sturzlänge 300) ) ;---------------------Estrichhöhen nach Ebene--------------------------------------- (if (not Estrich) (setq Estrich (GETINT "\nEstrichhöhe eingeben :")) ) (setq Estrich2 (rtos (+ Estrich 202)2 2) ) ;========================Ebene Setzen================================== (if (not ebene) (setq ebene (Getstring "\nEbene eingeben :")) ) ;========================================================== (Setvar "ATTDIA" 0) (Setvar "Osmode" 0) (Command "_insert" "zimaß" startpunkt "" "" win ebene Türbreite estrich2 "Flachsturz" mauerstaerke (rtos sturzlänge 2 2) Anzahl (rtos Sturzbreite 2 2)) (Setvar "ATTDIA" 1) (Setvar "Osmode" 1) (PRINC) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 23. Feb. 2006 08:00 <-- editieren / zitieren --> Unities abgeben: Nur für Detlef.w
Dann mach dir eine Externe asciidatei, in der Kerngrößen gespeichert sind und beim Start deines Programmes ausgelesen werden. Diese werden dan Variablen zugewiesen und du hast immer was du brauchst. Zum Thema Blockreferenz auslesen kannst du auch mal die Suche bemühen - da gabs schon genug Beiträge zu ------------------ Gruß CADwiesel Besucht uns im CHAT
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: 23. Feb. 2006 08:03 <-- editieren / zitieren --> Unities abgeben: Nur für Detlef.w
Hallo Detlef, ich kann mich der Meinung von CADwiesel nur anschließen, aber falls Du doch mal auf Attibutswerte von Blöcken zugreifen mußt, könntest Du das ungefähr so lösen: Code:
(defun attwerte_aus_block ( / obj aws liste blockname) (setq blockname "zimaß") (if (setq aws(ssget "X" (list(cons 0 "INSERT")(cons 2 blockname)))) (progn (setq obj (ssname aws 0)) (while (and(setq obj (entnext obj)) (/=(cdr(assoc 0(entget obj)))"SEQEND")) (setq liste (cons (cdr(assoc 1 (entget obj)))liste)))) (alert (strcat"\nEs wurde kein Block \"" blockname"\" gefunden."))) liste)
------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9732 Registriert: 01.12.2003 One AutoCAD 2.5 - 2023, Civil 3D, Win10/win11
|
erstellt am: 23. Feb. 2006 11:35 <-- editieren / zitieren --> Unities abgeben: Nur für Detlef.w
Ein Vorschlag zur Codeoptimierung: Verwende COND statt eine Folge von IF s. Mit IF (verwendet wie im Beispiel) muss jeder Vergleich durchgeführt werden. bei COND wird beim Erreichen der Bedingung die Funktion beendet. Code:
;________________Anzahl der Stürze berechnen___ ____________ (if (= Mauerstaerke "11.5") (SETQ Anzahl 1) ) (if (= Mauerstaerke "17.5") (SETQ Anzahl 1) ) (if (= Mauerstaerke "24") (SETQ Anzahl 2) ) (if (= Mauerstaerke "36.5") (SETQ Anzahl 2) ) ;=================Sturzbreite berechnen==================== (if (= Mauerstaerke "11.5") (SETQ Sturzbreite 11.5) ) (if (= Mauerstaerke "17.5") (SETQ Sturzbreite 17.5) ) (if (= Mauerstaerke "24") (SETQ Sturzbreite 11.5) ) (if (= Mauerstaerke "36.5") (SETQ Sturzbreite 17.5) )
Besser
Code:
;_Anzahl der Stürze und Sturzbreite berechnen (COND ((= Mauerstaerke "11.5") (SETQ Anzahl 1 Sturzbreite 11.5 ) ) ((= Mauerstaerke "17.5") (SETQ Anzahl 1 Sturzbreite 17.5 ) ) ; ... (T ; Alle anderen Fälle ) )
------------------ Mit freundlichem Gruß Udo Hübner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Detlef.w Mitglied Bauzeichner
Beiträge: 6 Registriert: 22.02.2006
|
erstellt am: 24. Feb. 2006 16:37 <-- editieren / zitieren --> Unities abgeben:
Hallo Cadwiesel, danke für deine Antwort. Als absoluter Neuling in der Lipswelt (seit 3 Monaten) kenne ich mich noch nicht so viel mit Lips aus und freue mich über jeden Hinweis. Bei deiner Idee mit einer Externen Ascidatei müßte ich, wenn ich es richtig verstanden habe, für jedes Neue Bauvorhaben eine datei einrichten, denn die Daten die ich brauche änderen sich von Bauvorhaben zu Bauvorhaben. Der Hinweis, dass ich die Suche benutzen sollte war eigendlich überflüssig, denn ich habe es vorher schon getan und fand aber keine Antwort auf mein Problem. Ich möchte einer Variable den Wert eines bestimmten Attribut zuweisen, der in einem Block mit weiteren Attributen gespeichert ist. Ich würde mich freuen wenn du mir doch noch helfen könntest, so das ich es auch als Neuling verstehen kann. In Lips muß ich noch viel lernen und bitte daher um etwas Geduld mit mir. Gruß Detlef Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Detlef.w Mitglied Bauzeichner
Beiträge: 6 Registriert: 22.02.2006
|
erstellt am: 24. Feb. 2006 16:40 <-- editieren / zitieren --> Unities abgeben:
|
Detlef.w Mitglied Bauzeichner
Beiträge: 6 Registriert: 22.02.2006
|
erstellt am: 24. Feb. 2006 16:46 <-- editieren / zitieren --> Unities abgeben:
Hallo Jörn Bosse, Danke für deinen Tip, aber leider klappt es nicht mit deiner Hilfe. Ich möchte einer Variable den Wert eines bestimmten Attribut zuweisen, der in einem Block Namens Objektdaten mit weiteren Attributen gespeichert ist. Ich würde mich freuen wenn du mir doch noch helfen könntest, so das ich es auch als Neuling verstehen kann. Gruß Detlef 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: 27. Feb. 2006 07:24 <-- editieren / zitieren --> Unities abgeben: Nur für Detlef.w
Hallo Detlef, was Du aus meiner Funktion als Rückgabewert bekommst ist eine Liste. In der Liste sind die Attributswerte in umgekehrter Reihenfolge aufgelistet. Wenn Du z.B. jetzt weißt, das in dem Block, den Du ausgewählt hast, das 3.te Attribut die Hausnummer ist, dann kannst Du an diese über folgenden Funktionsaufruf heran: (nth 2 ;;;Gibt Dir das 3. Element einer Liste (reverse ;;;gibt die Liste in umgekehrter Reihenfolge wieder (attwerte_aus_block) )) ------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 27. Feb. 2006 09:58 <-- editieren / zitieren --> Unities abgeben: Nur für Detlef.w
Mein Vorschlag wäre eine asciidatei, die so ähnlich aufgebaut sein könnte Projektdatei.txt [Projekt1] (Mauerstaerke . "11.5") (Sturzbreite . 11.5) [Projekt2] (Mauerstaerke . "17.5") (Sturzbreite . 17.5) usw.... Diese Datei könntest du einlesen (read-line) und dann per assoc auf die gewünschten Größen zugreifen (assoc Mauerstaerke liste) Die eine oder andere Feinheit müsste noch beachtet werden, aber ich denke that's it. Um die Werte in die Attribute zu bekommen kannst du dieses VL-Bauteilchen anpassen (if (= (vla-get-tagstring tag) ATTNAME) (vla-put-TextString tag ATTWERT) siehe auch hier ------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Detlef.w Mitglied Bauzeichner
Beiträge: 6 Registriert: 22.02.2006
|
erstellt am: 27. Feb. 2006 12:05 <-- editieren / zitieren --> Unities abgeben:
Hallo Joern Bosse, besten Dank für deine weitere Hilfe. Nun kann ich auf meine Blockattribute zugreifen. Hier nun der gesamte Code, sollte ihn noch jemand gebrauchen: (defun attwerte_aus_block ( / obj aws liste blockname) (setq blockname "Aktuelle Bauherrndaten") (if (setq aws(ssget "X" (list(cons 0 "INSERT")(cons 2 blockname)))) (progn (setq obj (ssname aws 0)) (while (and(setq obj (entnext obj)) (/=(cdr(assoc 0(entget obj)))"SEQEND")) (setq liste (cons (cdr(assoc 1 (entget obj)))liste)))) (alert (strcat"\nEs wurde kein Block \"" blockname"\" gefunden."))) liste) (setq Bauort (nth 38 liste)) (setq Baustrasse (nth 39 liste)) (setq Wohnort (nth 40 liste))
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Detlef.w Mitglied Bauzeichner
Beiträge: 6 Registriert: 22.02.2006
|
erstellt am: 27. Feb. 2006 12:13 <-- editieren / zitieren --> Unities abgeben:
Hallo CadWiesel, Danke für deinen Tip, aber ich denke das ich mit den Blockattributen besser dran bin, da die Werte je Bauvorhaben andere sind und ich so nicht für jedes Bauvrhaben eine neue TxT-Datei erstellen müßte. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Bauteilverantwortlicher (m/w/d) Automotive | Menschen und Technologien verbinden. Den Perfect Match für unsere Kunden gestalten. Immer die richtigen Experten für die jeweilige Herausforderung finden - das ist unser Anspruch bei FERCHAU und dafür suchen wir Sie: als ambitionierten Kollegen, der wie wir Technologien auf die nächste Stufe bringen möchte. Wir realisieren spannende Projekte für namhafte OEMs und Zulieferer der Automobilindustrie und übernehmen Verantwortung für komplexe Entwicklungsprojekte.... | Anzeige ansehen | Fahrzeugtechnik |
|
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2490 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 27. Feb. 2006 14:33 <-- editieren / zitieren --> Unities abgeben: Nur für Detlef.w
|