| |
| 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: Blöcke in DWG bekommen (967 mal gelesen)
|
Bäumchen Mitglied Technischer Assistent für Informatik
Beiträge: 36 Registriert: 21.04.2007
|
erstellt am: 16. Dez. 2007 18:01 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich bins mal wieder dadurch das ich jetzt Scheme (LISP-Sprache) habe, komme ich auch glaub mit AutoLISP besser klar! ich suche n Befehl wie ich auf die Blocktabelle von AutoCAD zugreifen kann. also ich will die Blockliste durchsuchen und eine andere Liste hochzählen ich hoffe ich habe mich deutlich ausgedrückt
mfg norbert baum
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 16. Dez. 2007 19:50 <-- editieren / zitieren --> Unities abgeben: Nur für Bäumchen
(defun BLOCKNAMES(/ BLOCK) (While (setq BLOCK(tblnext "BLOCK" (null BLOCK))) (setq LISTE(cons(cdr(assoc 2 BLOCK)) LISTE)) ) LISTE ) sowas? ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bäumchen Mitglied Technischer Assistent für Informatik
Beiträge: 36 Registriert: 21.04.2007
|
erstellt am: 16. Dez. 2007 20:19 <-- editieren / zitieren --> Unities abgeben:
guten abend, danke dir schon mal ähm joa das liefert mich schon mal was gutes nur wenn ich Blöcke löschen, bleiben die in der"Blocktabelle" warum? also Tote Blöcke dürfen nicht mit dabei sein dann n andere kleine syntax-frage: (setq ElementeListeAll (list (cons "Einzelfundament" 4) (cons "Generator" 1) (cons "HEM400" 8) )) (setq ElementeListeDWG '())
(defun copyListe (all /) (cond ((null all) nil) (else (cons (cons (cons (caar all) 0) (copyListe (cdr all))))))) liefert mir nil zurück! ich will aber die Liste ElementeListeAll, nur das bei den Werten überall 0 steht vielen Dank schon einmal norbert
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 16. Dez. 2007 20:22 <-- editieren / zitieren --> Unities abgeben: Nur für Bäumchen
|
Bäumchen Mitglied Technischer Assistent für Informatik
Beiträge: 36 Registriert: 21.04.2007
|
erstellt am: 16. Dez. 2007 21:26 <-- editieren / zitieren --> Unities abgeben:
Befehl: BLOCKNAMEN ("HEM500_d_k40_10670" "A$C1A36630F") also ich brauch da eh nur ("HEM500_d_k40_10670") die referenz is mir egal wenn ich den block lösche: dann bleibt die Liste so! aber sie soll ja dann wieder nil werden - also wirklich nur die aktuellen Blöcke und keine Leichen von sonst wann! aber zu dem anderen Problem copyListe....danke dir schon mal [Diese Nachricht wurde von Bäumchen am 16. Dez. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 17. Dez. 2007 08:02 <-- editieren / zitieren --> Unities abgeben: Nur für Bäumchen
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 17. Dez. 2007 08:08 <-- editieren / zitieren --> Unities abgeben: Nur für Bäumchen
Hallo Norbert, mal gleich am Anfang der Woche was zum Verständniss: Das was du vom Programm "BLOCKNAMEN" als Ergebniss bekommst sind die Namen der BLOCKDEFINITIONEN. Das was du meinst sind BLOCKEINFÜGUNGEN. Eine Blockdefinition (das sagt der Name schon) definiert die Geometrie eines Blockes. Wenn eine Blockgeometrie definiert ist, heist das nicht daß du die auch irgendwo in der Zeichnung sichtbar findest. Was du als Block einfügst ist in Wirklichkeit nur ein Objekt daß Informationen darüber enthält wie eine definierte Geometrie an einer bestimmten Stelle dargestelt werden soll. Wenn du mal (entget (car (entsel)) eintippst und dann auf so einen "Block" klickst wirst du in der Liste der Objektdaten nichts über die Objekte finden die du eigentlich sehen kannst. Allerdings findest du den Einfügefunkt, die Skalierung, den Layer, usw. und halt eben auch den "Blocknamen". Aus diesen (wenigen) Informationen bastelt ACAD dann das was du als Block siehst. Wenn du so eine Einfügung löschst ist das der Blockdefinition sowas von egal. Deshalb ändert sich deine Liste auch nicht. Verwende mal den Befehl "Bereinig", das sollte dir weiterhelfen Gruß Andreas [Diese Nachricht wurde von Andreas Kraus am 17. Dez. 2007 editiert.] [Diese Nachricht wurde von Andreas Kraus am 17. Dez. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bäumchen Mitglied Technischer Assistent für Informatik
Beiträge: 36 Registriert: 21.04.2007
|
erstellt am: 17. Dez. 2007 09:09 <-- editieren / zitieren --> Unities abgeben:
Guten morgen, also "Bereinig" das sieht schon ganz gut aus, eben das auf AutoLISP ebene, das der User net auswählen soll, dass die Bolckleichen entfernet werden soll. ODER sollte ich mir noch einen Reactor für das löschen von Blöcken basteln, damit ich nicht den rechenlastigen "Bereinig" Befehl ausführen muss - sondern selber meine aktuelle Elemente Liste in der DWG selber pflege (hoch und RUNTER zählen) das andere Probleme mit copyListe ist immer noch da! in Scheme geht das so! warum nicht in AutoCAD? die rekursion? lg norbert
ps. in Scheme muss ich immer lambda nutzen, in AutoLISP reicht ja defun, aber ab und zu mal habe ich gesehen, das man lambda brauch - gibts da zu n kurze, leichte erkläuterung? danke ------------------------------------ noch mal kurze Problem beschreibung: eine Liste((bockname wert)(bockname wert)...) wenn ein Objekt eingefügt wurde, soll die DWGLsite hoch gezählt werden, solange sie nicht größer als meine AllListe ist. mit Rekursion/car/cdr würde ich das noch schaffen! aber da müsste ich auch beim löschen wieder die DWG Liste bearbeiten! nur beim ersten mal einfügen, würde ich die BLOCKTABELLE von ACAD nehmen, zur initalisierung
ich hoffe, ích haben niemanden verwirrt [Diese Nachricht wurde von Bäumchen am 17. Dez. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bäumchen Mitglied Technischer Assistent für Informatik
Beiträge: 36 Registriert: 21.04.2007 ACAD2007 WinXP Prof
|
erstellt am: 17. Dez. 2007 09:19 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 17. Dez. 2007 09:23 <-- editieren / zitieren --> Unities abgeben: Nur für Bäumchen
Zitat: Original erstellt von Bäumchen: einfach mit der Maus drauf und "ENTF" Taste drücken
.. damit löscht du die Referenzen!!! Blöcke (die nicht mehr referenziert werden!!!) entfernst du mit der vom mir geposteten Zeile aus der ZeichnungsDatenbank! ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bäumchen Mitglied Technischer Assistent für Informatik
Beiträge: 36 Registriert: 21.04.2007
|
erstellt am: 17. Dez. 2007 09:31 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von CADmium: .. damit löscht du die Referenzen!!! Blöcke (die nicht mehr referenziert werden!!!) entfernst du mit der vom mir geposteten Zeile aus der ZeichnungsDatenbank!
also einfach wie in meinem Post drüber mit einem Reactor, dann den Befehl durchlaufen lassen? mfg ich melde mich heute mittag oder abend wieder - in der Hochschule bis dahin schönen tag Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 17. Dez. 2007 09:43 <-- editieren / zitieren --> Unities abgeben: Nur für Bäumchen
Sorry, das alles liest sich für mich so, als wenn du wieder probierst dir ein Programm zusammnezukopieren und dabei nicht weißt was du tust.. was hat lambda mit defun zu tun und das Blöckebereinigen mit nem Reaktor ?? Tipp(zum wiederholten Male): Fang mit dem Anfang an!! Und bedenke, dass AutoLisp nicht nur Lisp ist, sondern auch die Befehle zur Zeichnungsdatenbankmanipulation enthält. Den Blocknamen aus der Liste löschen bereinigt ihn noch lange nicht aus der Zeichnungsdatenbank. ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bäumchen Mitglied Technischer Assistent für Informatik
Beiträge: 36 Registriert: 21.04.2007
|
erstellt am: 17. Dez. 2007 14:22 <-- editieren / zitieren --> Unities abgeben:
aha.. NEIN ich möchte mir nix zusammen kopieren!! aber könnt ihr mir wenigstens sagen, warum mir diese funktion immer nil zurück gibt! Code: (setq ElementeListeAll (list (cons "Einzelfundament" 4) (cons "Generator" 1) )) (setq ElementeListeDWG '())(defun copyListe (all /) (cond ((null all) '()) (else (cons (cons (caar all) 0) (copyListe (cdr all)))))) >(copyListe ElementeListeAll) nil
WARUM?? danke euch schon mal (in Scheme geht das so!) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 17. Dez. 2007 14:39 <-- editieren / zitieren --> Unities abgeben: Nur für Bäumchen
(else .. die funktion hast du nirgends definiert du nutzt die Funktionsrückgaben nicht, das ist z. B Blödsinn: (cond ((null all) '()) und für Listenmanipulation gibts mapcar und lambda :
demnach sollte deine funktion so aussehen: (defun copyliste (ALL) (if(=(type all)'LIST) (mapcar '(lambda(X)(cons (car X) 0)) all ) ) )
------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bäumchen Mitglied Technischer Assistent für Informatik
Beiträge: 36 Registriert: 21.04.2007
|
erstellt am: 18. Dez. 2007 01:09 <-- editieren / zitieren --> Unities abgeben:
guten abend mit mapcar - klingt logisch (hatten in Scheme Map(wende eine einstellige Lambda-Funktion auf eine Liste aus)) DANKE DIR habe jetzt lange mit n kumpel zusammen unsere scheme-wissen in AutoLISP umgesetzt! warum geht in der IB.LSP (load ".\\init.lsp") (load ".\\func.lsp")
nicht? IB, init und func liegen alle in einem Ordner. werde dann morgen noch mal in ruhe die ganzen funktionen zur Elemente Kontrolle etc überprüfen und testen. und mich dann morgen noch mal melden wegen der BLOCKTabelle DANKE DIR SCHON MAL - DU BIST ECHT EIN RICHTIGER HELFER
lg norbert
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bäumchen Mitglied Technischer Assistent für Informatik
Beiträge: 36 Registriert: 21.04.2007 ACAD2007 WinXP Prof
|
erstellt am: 18. Dez. 2007 10:53 <-- editieren / zitieren --> Unities abgeben:
Hallo, nach dem einfügen eines Blockes, egal ob es in er Liste steht oder nicht kommt immer: Fehler: Fehlerhafter Argumenttyp: 0 Warum? und woher? wie kann ich sinnvoll debuggen? ich glaube ich bin zu sehr von Java verwöhnt mit der IDE aber zum glück haben die Funktionen vom Lambda-Kalkül alle so geklappt wie ich das wollte... ich wollte ihr könnt und wollt mir noch helfen
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Hunchback Mitglied CAD-Tech
Beiträge: 63 Registriert: 10.10.2007 Win2K AutoCAD 2007
|
erstellt am: 18. Dez. 2007 11:44 <-- editieren / zitieren --> Unities abgeben: Nur für Bäumchen
|