| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Blöcke skalieren (5695 mal gelesen)
|
ChristianV Mitglied
Beiträge: 79 Registriert: 14.01.2009 AutoCAD Map 2013, 64 Bit
|
erstellt am: 12. Okt. 2011 15:34 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen Folgende Situation: Habe eine Zeichnung mit verschiedenen Blöcken. Nun möchte ich alle diese diese Blöcke um einen Faktor skalieren. Der Basispunkt der Skalierung ist der Basispunkt des Blockes. Für die Texte gibt es ja den Befehl Textscale. Ich möchte das Ganze in ein Script einbinden. Ohne Skript könnte ich ja alles auswählen, im Eigenschaftsfenster die Blöcke wählen und anschliessen den X und Y Faktor anpassen. Da ich mit dem Script noch andere Anpassungen in der Zeichnung mache, möchte ich die Blockanpassung auch noch mit dem Skript ausführen. Also muss ich die Anpassung irgendwie über die Befehlszeile hinbekommen. Es sind etwa 20 verschieden Blockdefinitionen. Hat jemand eine Idee, mit welchem Befehl ich das machen kann? Danke für die Hilfe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dig15 Ehrenmitglied V.I.P. h.c. Dipl.-Ing. für Markscheidewesen und Geodäsie
Beiträge: 5833 Registriert: 27.02.2003 DWG TrueView 2014
|
erstellt am: 12. Okt. 2011 15:44 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
|
ChristianV Mitglied
Beiträge: 79 Registriert: 14.01.2009 AutoCAD Map 2013, 64 Bit
|
erstellt am: 12. Okt. 2011 21:40 <-- editieren / zitieren --> Unities abgeben:
Hallo Besten Dank für die Antwort, das LSP funktioniert. Nun wäre es für mich ideal, wenn ich anstelle der Blockauswahl den Blockname fix ins lisp schreiben kann (z.B. AV001). Das gleiche auch bei der Skalierung (x=2 und y=2 und z=1). Ich versuchte die Auswahl durch einen fixen Wert zu ersetzten, aber habe etwas falsch gemacht. Hat leider nicht funktioniert! Dies muss ich dann für die Blöcke AV002, AV003, … auch noch machen, wobei die Skalierung bei diesen Blöcken gleich bleibt. Eventuell kann man das in einem Guss programmieren oder muss ich es dann für jeden Block kopieren und den Namen anpassen? Für Tipps und Hinweise wäre ich sehr dankbar Der Code von CADmium wo ich verwendet habe:
(defun INSERT-SCALE (AUSWAHL X Y Z / NAME OBJEKT OBJEKTDATEN BLOCKDEF INDEX) (setq NAME(cdr(assoc 2 (entget (ssname AUSWAHL 0))))) ; und jetzt alle Blockreferenzen auf Blattebene updaten .. (setq INDEX -1) (if(setq AUSWAHL (ssget "_X" '((0 . "INSERT")))) ;(ssget "_X" (list '(0 . "INSERT")(cons 2 NAME) ))) funzt nicht bei unbenannten Blöcken ! (repeat (sslength AUSWAHL) (setq OBJEKTDATEN(entget(ssname AUSWAHL(setq INDEX(1+ INDEX))))) (if(=(strcase(cdr(assoc 2 OBJEKTDATEN))) (strcase NAME)) (progn (setq OBJEKTDATEN(subst(cons 41 (* (cdr(assoc 41 OBJEKTDATEN)) X)) (assoc 41 OBJEKTDATEN) OBJEKTDATEN ) ) (setq OBJEKTDATEN(subst(cons 42 (* (cdr(assoc 42 OBJEKTDATEN)) Y)) (assoc 42 OBJEKTDATEN) OBJEKTDATEN ) ) (setq OBJEKTDATEN(subst(cons 43 (* (cdr(assoc 43 OBJEKTDATEN)) Z)) (assoc 43 OBJEKTDATEN) OBJEKTDATEN ) ) (entmod OBJEKTDATEN) ) ) ) ) ; und jetzt alle Blockreferenzen in verschachtelten Blöcken.. (while (setq BLOCKDEF (tblnext "BLOCK" (null BLOCKDEF))) (if (and(/=(logand(cdr(assoc 70 BLOCKDEF))4)4) (or(/= (logand(cdr(assoc 70 BLOCKDEF))1)1) (=(substr (cdr(assoc 2 BLOCKDEF)) 1 2) "*U") ) ) (progn (setq OBJEKT (cdr (assoc -2 BLOCKDEF))) (while OBJEKT (setq OBJEKTDATEN (entget OBJEKT)) (if (and (=(cdr(assoc 0 OBJEKTDATEN)) "INSERT") (=(cdr(assoc 2 OBJEKTDATEN)) NAME) ) (progn (setq OBJEKTDATEN(subst(cons 41 (* (cdr(assoc 41 OBJEKTDATEN)) X)) (assoc 41 OBJEKTDATEN) OBJEKTDATEN ) ) (setq OBJEKTDATEN(subst(cons 42 (* (cdr(assoc 42 OBJEKTDATEN)) Y)) (assoc 42 OBJEKTDATEN) OBJEKTDATEN ) ) (setq OBJEKTDATEN(subst(cons 43 (* (cdr(assoc 43 OBJEKTDATEN)) Z)) (assoc 43 OBJEKTDATEN) OBJEKTDATEN ) ) (entmod OBJEKTDATEN) ) ) (setq OBJEKT (entnext OBJEKT)) ) (entupd (cdr (assoc -2 BLOCKDEF))) ) ) ) ) (defun C:INSERT-SCALE ( / AUSWAHL X Y Z ) (if (and(setq AUSWAHL (ssget "_:S" '((0 . "INSERT")))) (setq X (getreal "\nRelativen Vergrößerungsfaktor X : "))(> X 0) (setq Y (getreal "\nRelativen Vergrößerungsfaktor Y : "))(> Y 0) (setq Z (getreal "\nRelativen Vergrößerungsfaktor Z : "))(> Z 0) ) (progn (INSERT-SCALE AUSWAHL X Y Z) (command "._regen") ) (princ "\nKeine Blockreferenz gewählt!\n") ) (princ) ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 12. Okt. 2011 22:29 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
(and(setq AUSWAHL (ssget "_:S" '((0 . "INSERT")))) (setq X (getreal "\nRelativen Vergrößerungsfaktor X : "))(> X 0) (setq Y (getreal "\nRelativen Vergrößerungsfaktor Y : "))(> Y 0) (setq Z (getreal "\nRelativen Vergrößerungsfaktor Z : "))(> Z 0) ) wird zu (and(setq AUSWAHL (ssget "_:S" '((0 . "INSERT")(2 . "Blockname1,Blockname2,Blockname3")))) (setq X 2 Y 2 Z 1) ;(setq X (getreal "\nRelativen Vergrößerungsfaktor X : "))(> X 0) ;(setq Y (getreal "\nRelativen Vergrößerungsfaktor Y : "))(> Y 0) ;(setq Z (getreal "\nRelativen Vergrößerungsfaktor Z : "))(> Z 0) ) SO würde jetzt Blockname1+2+3 ausgewählt werden und allen die Faktoren 2 2 und 1 zugewiesen werden.
------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ChristianV Mitglied
Beiträge: 79 Registriert: 14.01.2009 AutoCAD Map 2013, 64 Bit
|
erstellt am: 13. Okt. 2011 08:18 <-- editieren / zitieren --> Unities abgeben:
Hallo Irgendwie läuft es noch nicht richtig. (Meine Blöcke heisen AV001,AV002,AV003). So kann ich den Code mit INSERT-SCALE nicht starten: Ersetzer Code:
. . . (defun C:INSERT-SCALE ( / AUSWAHL X Y Z ) (if (and(setq AUSWAHL (ssget "_:S" '((0 . "INSERT")(2 . "AV001,AV002,AV003")))) (setq X 2 Y 2 Z 1) ;(setq X (getreal "\nRelativen Vergrößerungsfaktor X : "))(> X 0) ;(setq Y (getreal "\nRelativen Vergrößerungsfaktor Y : "))(> Y 0) ;(setq Z (getreal "\nRelativen Vergrößerungsfaktor Z : "))(> Z 0) ) . . . Mit dem folgenden Code, muss nun immernoch die Block auswählen und die skalierung (x,y,z) von hand eingeben werden
. . . (defun C:INSERT-SCALE ( / AUSWAHL X Y Z ) (if (and(setq AUSWAHL (ssget "_:S" '((0 . "INSERT")(2 . "AV001,AV002,AV003")))) (setq X 2 Y 2 Z 1) (setq X (getreal "\nRelativen Vergrößerungsfaktor X : "))(> X 0) (setq Y (getreal "\nRelativen Vergrößerungsfaktor Y : "))(> Y 0) (setq Z (getreal "\nRelativen Vergrößerungsfaktor Z : "))(> Z 0) ) . . .
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 13. Okt. 2011 09:15 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
;;; Der Code von CADmium(sorry) für dich überarbeitet: (defun INSERT-SCALE (AUSWAHL X Y Z / NAME OBJEKT OBJEKTDATEN BLOCKDEF INDEX) ;(setq NAME(cdr(assoc 2 (entget (ssname AUSWAHL 0))))) ; und jetzt alle Blockreferenzen auf Blattebene updaten .. (setq INDEX -1) ;(if(setq AUSWAHL (ssget "_X" '((0 . "INSERT")))) ;(ssget "_X" (list '(0 . "INSERT")(cons 2 NAME) ))) funzt nicht bei unbenannten Blöcken ! (repeat (sslength AUSWAHL) (setq OBJEKTDATEN(entget(ssname AUSWAHL(setq INDEX(1+ INDEX))))) ;(if(=(strcase(cdr(assoc 2 OBJEKTDATEN))) (strcase NAME)) (progn (setq OBJEKTDATEN(subst(cons 41 (* (cdr(assoc 41 OBJEKTDATEN)) X)) (assoc 41 OBJEKTDATEN) OBJEKTDATEN ) ) (setq OBJEKTDATEN(subst(cons 42 (* (cdr(assoc 42 OBJEKTDATEN)) Y)) (assoc 42 OBJEKTDATEN) OBJEKTDATEN ) ) (setq OBJEKTDATEN(subst(cons 43 (* (cdr(assoc 43 OBJEKTDATEN)) Z)) (assoc 43 OBJEKTDATEN) OBJEKTDATEN ) ) (entmod OBJEKTDATEN) ) ;) ) ;) ; und jetzt alle Blockreferenzen in verschachtelten Blöcken.. (while (setq BLOCKDEF (tblnext "BLOCK" (null BLOCKDEF))) (if (and(/=(logand(cdr(assoc 70 BLOCKDEF))4)4) (or(/= (logand(cdr(assoc 70 BLOCKDEF))1)1) (=(substr (cdr(assoc 2 BLOCKDEF)) 1 2) "*U") ) ) (progn (setq OBJEKT (cdr (assoc -2 BLOCKDEF))) (while OBJEKT (setq OBJEKTDATEN (entget OBJEKT)) (if (and (=(cdr(assoc 0 OBJEKTDATEN)) "INSERT") (=(cdr(assoc 2 OBJEKTDATEN)) NAME) ) (progn (setq OBJEKTDATEN(subst(cons 41 (* (cdr(assoc 41 OBJEKTDATEN)) X)) (assoc 41 OBJEKTDATEN) OBJEKTDATEN ) ) (setq OBJEKTDATEN(subst(cons 42 (* (cdr(assoc 42 OBJEKTDATEN)) Y)) (assoc 42 OBJEKTDATEN) OBJEKTDATEN ) ) (setq OBJEKTDATEN(subst(cons 43 (* (cdr(assoc 43 OBJEKTDATEN)) Z)) (assoc 43 OBJEKTDATEN) OBJEKTDATEN ) ) (entmod OBJEKTDATEN) ) ) (setq OBJEKT (entnext OBJEKT)) ) (entupd (cdr (assoc -2 BLOCKDEF))) ) ) ) )
(defun C:INSERT-SCALE ( / AUSWAHL X Y Z ) (if (and(setq AUSWAHL (ssget "_X" '((0 . "INSERT")(2 . "AV001,AV002,AV003")))) (setq X 2 Y 2 Z 1) ;(setq X (getreal "\nRelativen Vergrößerungsfaktor X : "))(> X 0) ;(setq Y (getreal "\nRelativen Vergrößerungsfaktor Y : "))(> Y 0) ;(setq Z (getreal "\nRelativen Vergrößerungsfaktor Z : "))(> Z 0) ) (progn (INSERT-SCALE AUSWAHL X Y Z) (command "._regen") ) (princ "\nKeine Blockreferenz gewählt!\n") ) (princ) ) Jetzt bleibt nur zu hoffen das du das wirklich wolltest (kann ich mir fast nicht vorstellen). ------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ChristianV Mitglied
Beiträge: 79 Registriert: 14.01.2009 AutoCAD Map 2013, 64 Bit
|
erstellt am: 13. Okt. 2011 09:43 <-- editieren / zitieren --> Unities abgeben:
Hallo Es scheint nun zu funktionieren. Muss es noch genauer testen. Aber auf jedenfall ein sehr grosses Dankeschön. Doch es ist schon das, was ich wollte. Grund: wir erhalten immerwieder Zeichnungen mit disen Blocknamen, wobei diese immer zu klein sind. Nun können dies Zeichnungen einfach nach unseren Vorstellungen angepasst werden. Nocheinmal besten Dank Gruss Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-sauer Mitglied Zeichner
Beiträge: 314 Registriert: 01.03.2007 ACAD 2020, MEP 2020 CiVil 2020 64 bit, Windows 10,
|
erstellt am: 15. Dez. 2011 09:23 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
Hi Lisp´ler... hab heute dieses Lisp hier gefunden... und hab zuerst selbst probiert ob ich es finde...in dem ich einfach mal an verschiedenen Stellen meine Werte eingetragen habe.... bin aber nicht auf die Lösung gekommen.... vielleicht kann mir jemand helfen... brauche eigentlich genau sowas... allerdings immer mit den gleichen Skalierungsfaktor... z.B. für X-Wert = 4, Y-Wert = 20, Z-Wert = 1..... wo kann ich das in diesem Lisp ohne die Abfrage die da kommt fest einstellen... da ich viele verschiedene Blöcke habe mit unterschiedlichen Namen.... könnte ich mir damit das mühselige eintippen sparen.... wäre sonst auch net schneller als über die Eigenschaften... Danke... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 15. Dez. 2011 09:39 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
Der [Skalierfaktor] in AutoCAD ist ja nicht das gleiche wie "um einen Faktor Skalieren" und darum geht es in diesem Lisp, unabhängig von der bestehenden Skalierung sollen die Referenzen um FaktorX gehändert werden. Deine Anfrage ist aber: Ich möchte alle Referenzen, unabhängig von der bestehenden Skalierung, auf einen fest vorgegebenen Faktor einstellen, zumindest wenn ich dich recht verstehe. ------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 15. Dez. 2011 09:43 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
siehe cadffm Zitat: Original erstellt von cadffm: ;;; Der Code von CADmium(sorry) für dich überarbeitet: (defun C:INSERT-SCALE ( / AUSWAHL X Y Z ) (if (and(setq AUSWAHL (ssget "_X" '((0 . "INSERT")(2 . "AV001,AV002,AV003")) (setq X 2 Y 2 Z 1) ;(setq X (getreal "\nRelativen Vergrößerungsfaktor X : "))(> X 0) ;(setq Y (getreal "\nRelativen Vergrößerungsfaktor Y : "))(> Y 0) ;(setq Z (getreal "\nRelativen Vergrößerungsfaktor Z : "))(> Z 0) ) (progn (INSERT-SCALE AUSWAHL X Y Z) (command "._regen") ) (princ "\nKeine Blockreferenz gewählt!\n") ) (princ) )
Jetzt bleibt nur zu hoffen das du das wirklich wolltest (kann ich mir fast nicht vorstellen).
ggf. die sel-method anpassen (setq AUSWAHL (ssget '((0 . "INSERT"))) ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." [Diese Nachricht wurde von Dorfy am 15. Dez. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 15. Dez. 2011 10:21 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
wenn cadffm recht haben sollte dann q&d ohne Netz Code: (defun C:INSSCALE (/ AUSWAHL BlkObj INDEX X Y Z) (if (setq AUSWAHL (ssget '((0 . "Insert"))) X 2 Y 2 Z 1 ) (progn (setq INDEX -1) (repeat (sslength AUSWAHL) (setq BlkObj (vlax-ename->vla-object (ssname AUSWAHL (setq INDEX (1+ INDEX))) ) ) (vla-put-XScaleFactor BlkObj x) (vla-put-YScaleFactor BlkObj y) (vla-put-ZScaleFactor BlkObj z) ) ) ) (princ) )
------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-sauer Mitglied Zeichner
Beiträge: 314 Registriert: 01.03.2007 ACAD 2020, MEP 2020 CiVil 2020 64 bit, Windows 10,
|
erstellt am: 15. Dez. 2011 11:38 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
|
neo4matrix Mitglied
Beiträge: 136 Registriert: 15.01.2008 HP™ z2 Tower G4 Workstation mit Intel® Core™ i9-9900K 8x 3.6 GHz-5.0 GHz 32 GB Arbeitsspeicher 1 TB HP Z Turbo PCIe® SSD NVIDIA® Quadro® P2200 mit 5 GB RAM HP™ 24" LPS LED TFT 16:10 ZR2440w. Windows 10 Pro, 64 Bit AutoCAD 2019 Design Suite Standard, SP1, 64 Bit ecscad 2019, v19.1.0.20, 64 Bit Microstation v8 2004, 32 Bit MicroStation CONNECT Edition Update 11 Microsoft Office 365, 32 Bit Microsoft Visio 2013, 32 Bit
|
erstellt am: 28. Jul. 2017 14:41 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
Hallo Leute Das LISP von Dorfy erfüllt schon fast meine Wünsche. Ich möchte aber, dass das LISP den X-Faktor des Blocks zuerst ausliest, und dann den selben Wert als Z-Faktor einträgt. Aber nur bei Blöcken mit dem Namen ?_*_* (also z.B.: T_5002_10, U_0021_11, V_8000_11 oder L_311112_10). Die X-Faktoren (und somit später die Z-Faktoren) können also bei jedem Block verschieden sein. Der Y-Faktor soll unangetastet bleiben.
Mit meiner Anpassung kann ich schon mal mit dem Befehl "INSSCALE all" alle Blöcke mit dem Namen ?_*_* auf den X, Y und Z-Faktor von 0.01 stellen: Code: (defun C:INSSCALE (/ AUSWAHL BlkObj INDEX X Y Z) (if (setq AUSWAHL (ssget '((0 . "Insert")(2 . "?_*_*"))) X 0.01 Y 0.01 Z 0.01 ) (progn (setq INDEX -1) (repeat (sslength AUSWAHL) (setq BlkObj (vlax-ename->vla-object (ssname AUSWAHL (setq INDEX (1+ INDEX))) ) ) (vla-put-XScaleFactor BlkObj x) (vla-put-YScaleFactor BlkObj y) (vla-put-ZScaleFactor BlkObj z) ) ) ) (princ) )
Für Antworten bin ich sehr dankbar! mfg neo ------------------ Welcome to the Real Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1356 Registriert: 11.01.2006 Win 10 ACAD 2022
|
erstellt am: 28. Jul. 2017 15:00 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
Also wenn ich das richtig verstanden habe möchtest du nur für Z den selben Wert der schon in X steht haben. Also am Ende: (vla-put-ZScaleFactor BlkObj (vla-get-XScaleFactor BlkObj)) Oder ? ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neo4matrix Mitglied
Beiträge: 136 Registriert: 15.01.2008 HP™ z2 Tower G4 Workstation mit Intel® Core™ i9-9900K 8x 3.6 GHz-5.0 GHz 32 GB Arbeitsspeicher 1 TB HP Z Turbo PCIe® SSD NVIDIA® Quadro® P2200 mit 5 GB RAM HP™ 24" LPS LED TFT 16:10 ZR2440w. Windows 10 Pro, 64 Bit AutoCAD 2019 Design Suite Standard, SP1, 64 Bit ecscad 2019, v19.1.0.20, 64 Bit Microstation v8 2004, 32 Bit MicroStation CONNECT Edition Update 11 Microsoft Office 365, 32 Bit Microsoft Visio 2013, 32 Bit
|
erstellt am: 28. Jul. 2017 17:04 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
Haargenau! Besten Dank für den Tip! Von mir aus, auch ohne defun. Also ein LISP, das direkt beim Ausführen (via Schaltfläche) bei allen Blöcken mit Namen "?_*_*" den Z-Faktor analog vom X-Faktor übernimmt. So in der Art: Code: (progn (setq INDEX -1) (repeat (sslength (setq aws (ssget "_X" '((0 . "Insert")(2 . "?_*_*"))))) (setq BlkObj (vlax-ename->vla-object (ssname aws (Setq INDEX (1+ INDEX))) ) ) (vla-put-ZScaleFactor BlkObj (vla-get-XScaleFactor BlkObj)) ))
Kann das nochmal jemand auf Fehler überprüfen? Und ob man das evtl. noch vereinfachen kann? Warum schreibt AutoCAD immer "nil" in die Befehlszeile, obwohl alles zu funktionieren scheint? mfg neo [Diese Nachricht wurde von neo4matrix am 28. Jul. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 28. Jul. 2017 20:26 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
Wenn es läuft, dann passt es für nicht-dynamische Blockreferenzen welche auf entsperrten Layern liegt. Vereinfachen: Nein, ist vollkommen ok. Ich würde daraus nur eine benannte Funktion machen und am besten direkt als Autocad-Befehl erstellen. Diese würde man dann in "MeineDatei.lsp" packen (mit anderen Lispfunktionen die man hat oder noch sammelt), diese fügt man dann der Startgruppe (Befehl Appload) hinzu. Dazu würde ich das Wort progn tauschen gegen defun c:BlockfaktorZgleichX (/ INDEX AWS BLKOBJ) Als Menümakro zum aufrufen steht dann ^C^CBlockfaktorZgleichX Die Rückgabe nil ist die letzte Rückgabe aus dem Code und in diesem Fall wird nichts zurückgegeben. Nichts / nothing in list oder so ähnlich ;-) Es ist also kein Fehler wie du evtl. denkst. Um dieses unschöne nil zu unterbinden gibt es nur eines: Man sorgt für eine andere letzte Rückgabe! Vor der letzten schliessenden Klammer setze ein (princ) ein. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neo4matrix Mitglied
Beiträge: 136 Registriert: 15.01.2008 HP™ z2 Tower G4 Workstation mit Intel® Core™ i9-9900K 8x 3.6 GHz-5.0 GHz 32 GB Arbeitsspeicher 1 TB HP Z Turbo PCIe® SSD NVIDIA® Quadro® P2200 mit 5 GB RAM HP™ 24" LPS LED TFT 16:10 ZR2440w. Windows 10 Pro, 64 Bit AutoCAD 2019 Design Suite Standard, SP1, 64 Bit ecscad 2019, v19.1.0.20, 64 Bit Microstation v8 2004, 32 Bit MicroStation CONNECT Edition Update 11 Microsoft Office 365, 32 Bit Microsoft Visio 2013, 32 Bit
|
erstellt am: 31. Jul. 2017 11:04 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
Herzlichen Dank für die Ausführungen! Jetzt bin ich schlauer. Mein LIST sieht nun so aus: Code: (defun c:BlockfaktorZgleichX (/ INDEX AWS BLKOBJ) (setq INDEX -1) (repeat (sslength (setq aws (ssget "_X" '((0 . "Insert")(2 . "?_*_*"))))) (setq BlkObj (vlax-ename->vla-object (ssname aws (Setq INDEX (1+ INDEX))) ) ) (vla-put-ZScaleFactor BlkObj (vla-get-XScaleFactor BlkObj)) ) (princ "Bei allen relevanten Blöcken wurde der Z-Faktor korrigiert.") (princ) )
Falls es keine relevanten Blöcke hat kommt folgende Fehlermeldung: ; Fehler: Fehlerhafter Argumenttyp: lselsetp nil Könnte man das noch verbessern? Mit einer Meldung in der Befehlszeile: "Keine relevanten Blöcke gefunden." Vielen Dank! mfg neo
------------------ Welcome to the Real Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 31. Jul. 2017 11:38 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
Code: (defun c:BlockfaktorZgleichX (/ INDEX AWS BLKOBJ) (setq INDEX -1) (if (setq aws (ssget "_X" '((0 . "Insert")(2 . "?_*_*")))) (progn (repeat (sslength aws) (setq BlkObj (vlax-ename->vla-object (ssname aws (Setq INDEX (1+ INDEX))))) (vla-put-ZScaleFactor BlkObj (vla-get-XScaleFactor BlkObj)) ) (princ "\nBei allen relevanten Blöcken wurde der Z-Faktor korrigiert.") ) (princ "\nKeine relevanten Blöcke gefunden.") ) (princ) )
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neo4matrix Mitglied
Beiträge: 136 Registriert: 15.01.2008 HP™ z2 Tower G4 Workstation mit Intel® Core™ i9-9900K 8x 3.6 GHz-5.0 GHz 32 GB Arbeitsspeicher 1 TB HP Z Turbo PCIe® SSD NVIDIA® Quadro® P2200 mit 5 GB RAM HP™ 24" LPS LED TFT 16:10 ZR2440w. Windows 10 Pro, 64 Bit AutoCAD 2019 Design Suite Standard, SP1, 64 Bit ecscad 2019, v19.1.0.20, 64 Bit Microstation v8 2004, 32 Bit MicroStation CONNECT Edition Update 11 Microsoft Office 365, 32 Bit Microsoft Visio 2013, 32 Bit
|
erstellt am: 31. Jul. 2017 14:06 <-- editieren / zitieren --> Unities abgeben: Nur für ChristianV
|