| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | PNY: der unverzichtbare Partner für umfassende KI-Lösungen von Workstations bis zu Edge Computing und KI-Cluster-Bereitstellung, eine Pressemitteilung
|
Autor
|
Thema: Maßstab erzeugen (2753 mal gelesen)
|
Danillo Mitglied Bauingenieur
 
 Beiträge: 245 Registriert: 12.11.2003 Windows 11 - AutoCAD 2023
|
erstellt am: 21. Apr. 2013 14:59 <-- editieren / zitieren --> Unities abgeben:         
Hallo Leute, kann mir jemand verraten, wie ich über Lisp einen Maßstab (Cannoscale) erzeugen kann. Das Problem rührt daher, dass ich bisher eine Benutzereingabe hatte, über welche der Maßstab inkl. Maßeinheit festgelegt wurde. Nachdem jetzt (?) in AutoCAD die annotativen Stile vorhanden sind, welche in Abhängigkeit von Cannoscale erzeugt werden, würde ich gerne meine bisherige Abfrage gleich lassen und einen entsprechenden Scale erzeugen und aktuell setzen. Vor dem Erzeugen muss man wahrscheinlich abchecken, dass der Maßstab noch nicht vorhanden ist. Habe es mit Tablesearch probiert, aber das führt nicht ans Ziel... Danke für die Hilfe und Grüße Daniel 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: 9807 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 21. Apr. 2013 16:22 <-- editieren / zitieren --> Unities abgeben:          Nur für Danillo
Zitat: Original erstellt von Danillo: ...wie ich über Lisp einen Maßstab (Cannoscale) erzeugen kann....
Eine einfache Methode wäre über den passenden Command-Aufruf, also (command "_-SCALELISTEDIT" "_Add" "1:75" "1:75" "_exit")
Sollte der Maßstab schon existieren, kannst du die Meldung z.B. durch setzen von EXPERT unterdrücken. ------------------ Mit freundlichem Gruß Udo Hübner www.CAD-Huebner.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danillo Mitglied Bauingenieur
 
 Beiträge: 245 Registriert: 12.11.2003 Windows 11 - AutoCAD 2023
|
erstellt am: 21. Apr. 2013 16:36 <-- editieren / zitieren --> Unities abgeben:         
|
CADmium Moderator Maschinenbaukonstrukteur
       

 Beiträge: 13530 Registriert: 30.11.2003 .
|
erstellt am: 21. Apr. 2013 20:47 <-- editieren / zitieren --> Unities abgeben:          Nur für Danillo
mal ein Schubs für die Richtung: (defun SCALE-ADD(NAME PAPERUNIT DRAWINGUNIT / DICT SCALE) (if(>=(atof (substr (getvar "acadver") 1 4)) 17.1) (if(setq DICT(dictsearch (namedobjdict) "ACAD_SCALELIST")) (if(and(=(type NAME)'STR) (numberp PAPERUNIT) (numberp DRAWINGUNIT) (> PAPERUNIT 0) (> DRAWINGUNIT 0) ) (cond ; ('T (if(and(not(vl-catch-all-error-p (setq SCALE (vl-catch-all-apply 'entmakex (list (list (cons 0 "SCALE") (cons 100 "AcDbScale") (cons 70 0) (cons 300 NAME) (cons 140 PAPERUNIT) (cons 141 DRAWINGUNIT) (cons 290 0) ) ) ) ) ) ) (not(vl-catch-all-error-p (vl-catch-all-apply 'dictadd (list (cdr(assoc -1 DICT)) "*" SCALE) ) ) ) ) SCALE ) ) ) ) ) ) ) Aufruf: (SCALE-ADD "1:3" 1.0 3.0) ------------------ Also ich finde Unities gut ... und andere sicher auch ---------------------------------------
- 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 |
Danillo Mitglied Bauingenieur
 
 Beiträge: 245 Registriert: 12.11.2003 Windows 11 - AutoCAD 2023
|
erstellt am: 23. Apr. 2013 00:46 <-- editieren / zitieren --> Unities abgeben:         
|
Danillo Mitglied Bauingenieur
 
 Beiträge: 245 Registriert: 12.11.2003 Windows 11 - AutoCAD 2023
|
erstellt am: 24. Apr. 2013 00:10 <-- editieren / zitieren --> Unities abgeben:         
Hallo Leute, habe mir die 2 Vorschläge nun genauer angeschaut. Ich stelle mir den Ablauf so vor, dass ich zuerst prüfe, ob ein gewisser Maßstab vorhanden ist, falls ja setzte ich ihn aktuell, falls nein erzeuge ich ihn. Habe gehofft, dass es dafür einen ähnlichen Befehl wie Make bei der Layersteuerung gibt, d.h. falls vorhaden wird der gewünschte Maßstab aktuell gesetzt, falls nicht wird er erzeugt und dann aktuell gesetzt. Der von Cadmium vorgeschlagene Code funktioniert ja recht gut, aber leieder wird bei gleicher Eingabe immer wieder ein neuer Maßstab erzeugt. Letzte Frage: wie kann ich abchecken, ob es einen gewissen Maßstab schon gibt? Danke und Grüße Daniel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
       

 Beiträge: 13530 Registriert: 30.11.2003 .
|
erstellt am: 24. Apr. 2013 07:31 <-- editieren / zitieren --> Unities abgeben:          Nur für Danillo
|
Danillo Mitglied Bauingenieur
 
 Beiträge: 245 Registriert: 12.11.2003 Windows 11 - AutoCAD 2023
|
erstellt am: 24. Apr. 2013 11:19 <-- editieren / zitieren --> Unities abgeben:         
Hallo Thomas, du hast natürlich recht, dass es um das Verstehen und selbermachen geht (arbeite übrigens ohne direkte Bezahlung fürs Lispeln). Deshalb möchte ich auch keinen fertigen Code, sondern nur Denkanstöße. Der obige Denkanstoß war nur ein bisschen groß, ich muss mir den Code erst in mundgerechte Happen aufteilen... Neu ist für mich: dictsearch, entmakex Habe bisher immer mit Tablesearch gearbeitet und selten mit entmake gearbeitet. Wird schon werden... Danke für deine Hilfe und gute Arbeit Daniel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danillo Mitglied Bauingenieur
 
 Beiträge: 245 Registriert: 12.11.2003 Windows 11 - AutoCAD 2023
|
erstellt am: 25. Apr. 2013 14:11 <-- editieren / zitieren --> Unities abgeben:         
Hallo Thomas, muss dich nochmals belästigen: habe das mit dem Weiterhangeln ausprobiert, aber irgendwie nicht hinbekommen. Habe keine Ahnung, wo und wie ich es anfangen soll? Auch ein Schlagwort, um nachzulesen fehlt mir... Grüße Daniel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
       

 Beiträge: 13530 Registriert: 30.11.2003 .
|
erstellt am: 25. Apr. 2013 14:27 <-- editieren / zitieren --> Unities abgeben:          Nur für Danillo
na ok .. spendiere ich dir noch eine Funktion , obwohl mir so das Forum langsam zu einseitig wird ... ( wie kann ich eigentlich deine Eigeninitiative überprüfen ?  ) (defun SCALE-GETALL(/ DICT DICTNAME DICTOBJ DATA NAME PAPERUNIT DRAWINGUNIT LISTE) (if(setq DICT(dictsearch (namedobjdict) "ACAD_SCALELIST")) (while (setq DICT (member(assoc 3 DICT)DICT)) (if(and(setq DICTNAME (cdr(car DICT))) (setq DICTOBJ (cadr DICT)) (= 350 (car DICTOBJ)) (=(type(setq DICTOBJ(cdr DICTOBJ)))'ENAME) (setq DATA(entget DICTOBJ)) (setq NAME (cdr(assoc 300 DATA))) (setq NAME (strcase NAME)) (setq PAPERUNIT (cdr(assoc 140 DATA))) (setq DRAWINGUNIT(cdr(assoc 141 DATA))) ) (progn (if(and(numberp PAPERUNIT) (numberp DRAWINGUNIT) (< 0 PAPERUNIT) (< 0 DRAWINGUNIT) ) (setq FAKTOR (/ PAPERUNIT DRAWINGUNIT 1.0)) ) (setq LISTE (cons (list NAME DICTOBJ PAPERUNIT DRAWINGUNIT DICTNAME FAKTOR) LISTE ) ) ) ) (setq DICT (cdr DICT)) ) ) (reverse LISTE) )
------------------ Also ich finde Unities gut ... und andere sicher auch ---------------------------------------
- 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 |
Danillo Mitglied Bauingenieur
 
 Beiträge: 245 Registriert: 12.11.2003 Windows 11 - AutoCAD 2023
|
erstellt am: 25. Apr. 2013 14:51 <-- editieren / zitieren --> Unities abgeben:         
Bezüglich meiner Eigeninitiative: Heute ist in Italien Feiertag, schönstes Wetter und ich brühte zwischen AutoCad-Hilfe, autolisp.info und dem Forum. Danke für die Hilfe! Vielleicht schaffe ich es jetzt ja. Bezüglich Einseitigkeit: Wenn ich wüsste, welches deine Interessen, Tätigenkeiten sind, könnte ich dir vielleicht auch mal einen Tipp geben. Im Bereich Lisp sicherlich nicht... Grüße Daniel [Diese Nachricht wurde von Danillo am 25. Apr. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danillo Mitglied Bauingenieur
 
 Beiträge: 245 Registriert: 12.11.2003 Windows 11 - AutoCAD 2023
|
erstellt am: 25. Apr. 2013 15:14 <-- editieren / zitieren --> Unities abgeben:         
Hallo Thomas, habe den Code mal durchgeschaut: Sind diese Sicherheitschecks wirklich alle notwendig? Kann es beim Auslesen der Daten passieren, dass negative Maßstabszahlen oder keine Zahlen zurückkommen? Übrigens: hast eine sehr kompakte Scheibweise... Grüße Daniel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
       

 Beiträge: 13530 Registriert: 30.11.2003 .
|
erstellt am: 25. Apr. 2013 15:25 <-- editieren / zitieren --> Unities abgeben:          Nur für Danillo
|
Danillo Mitglied Bauingenieur
 
 Beiträge: 245 Registriert: 12.11.2003 Windows 11 - AutoCAD 2023
|
erstellt am: 26. Apr. 2013 00:05 <-- editieren / zitieren --> Unities abgeben:         
Hallo Experten, hätte es eigentlich Sinn mit vl-... Methoden das Problem anzugehen? Auf die Dictonaries kommt man ja mit: (vla-get-dictionaries (vla-get-activedocument (vlax-get-acad-object))) Wie man dann auf den Dictonary "ACAD_SCALELIST" gelangt und dort die vorhandenen Scales auszulesen, ist mir leider noch nicht gelungen... Die Frage ist eigentlich nur, ob dieser Weg einfacher wäre? Grüße Daniel
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
       

 Beiträge: 13530 Registriert: 30.11.2003 .
|
erstellt am: 26. Apr. 2013 07:51 <-- editieren / zitieren --> Unities abgeben:          Nur für Danillo
in der Com-Schnittstelle ist in der Hinsicht IMHO nicht alles implementiert : (if(and(setq DICTS(vla-get-dictionaries (vla-get-activedocument (vlax-get-acad-object)))) (not(vl-catch-all-error-p (setq SCALEDICT(vl-catch-all-apply 'vla-item (list DICTS "ACAD_SCALELIST"))) ) ) ) (vlax-for ITEM SCALEDICT (vlax-dump-object ITEM 'T) ) ) liefert dann für einen Scale: ; IAcadObject: Die Vorgabe-Schnittstelle für ein AutoCAD-Basisobjekt ; Eigenschaftswerte: ; Application (RO) = #<VLA-OBJECT IAcadApplication 0000000140433318> ; Document (RO) = #<VLA-OBJECT IAcadDocument 0000000028a2d0d8> ; Handle (RO) = "2FC" ; HasExtensionDictionary (RO) = 0 ; ObjectID (RO) = 44 ; ObjectID32 (RO) = 44 ; ObjectName (RO) = "AcDbScale" ; OwnerID (RO) = 42 ; OwnerID32 (RO) = 42 ; Unterstützte Methoden: ; Delete () ; GetExtensionDictionary () ; GetXData (3) ; SetXData (2) IMHO etwas wenig  ------------------ Also ich finde Unities gut ... und andere sicher auch ---------------------------------------
- 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 |
Danillo Mitglied Bauingenieur
 
 Beiträge: 245 Registriert: 12.11.2003 Windows 11 - AutoCAD 2023
|
erstellt am: 27. Apr. 2013 16:31 <-- editieren / zitieren --> Unities abgeben:         
Hallo, sobald ich nun abgecheckt habe, ob ein Maßstab vorhanden ist bzw. sobald ich einen neuen Maßstab erzeugt habe, stellt sich das Problem, wie ich diesen aktuell setze. Über die VL-Befehle geht das offensichtlich nicht. Leichter wäre es Maßstäbe zu löschen. Natürlich könnte man auf den Command-Befehl zurückgreifen, aber das wäre nach all dem Aufwand nicht wirklich eine elegante Lösung. Kann mir das "jeamand" weiter helfen? Danke und Grüße Daniel Hoppla: jetzt habe ich zu kompliziert gedacht: Das Einfachste ist es wohl Cannoscale den entsprechenden Namen zuzuweisen. Falls es eine andere Methode gibt, wäre ich natürlich auch daran interessiert... [Diese Nachricht wurde von Danillo am 27. Apr. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danillo Mitglied Bauingenieur
 
 Beiträge: 245 Registriert: 12.11.2003 Windows 11 - AutoCAD 2023
|
erstellt am: 29. Apr. 2013 00:07 <-- editieren / zitieren --> Unities abgeben:         
Hallo Leute, habe nun den obigen Code bei Cond so vervollständigt, dass bei Vorhandensein des gegenständlichen Scale, dieser nicht neu erzeugt wird. Habe dazu die Liste der vorhadenen Scales mit folgenden Code auf das Vorhandensein untersucht: ((= (car (member scale_gesucht (mapcar 'car scllst))) scale_gesucht)(princ "\nMaßstab bereits vorhanden...")) Nehme an, da gibt es eine elegantere Variante, aber was soll's... Dabei ist mir aufgefallen, dass der Name in der Liste in Großbuchstaben aufscheint, auch wenn er in Kleinbuchstaben erzeugt wurde. Ist kein größeres Problem, man muss halt alles in Großbuchstaben vergleichen. Anschließend setze ich den gewünschten Maßstab mit (setvar "Cannoscale" name) aktuell, dabei kommte es zum totalen Absturz, d.h. AutoCAD verabschiedet sich. Möglicherweise hängt das damit zusammen, dass ich Reaktoren habe, die auf die Änderung von Cannoscale reagieren. Probiere ich es händisch über die Befehlszeile mit (setvar...) dann klappt es, aber der Maßstab wird neu erzeugt und dann erst aktuell gesetzt, d.h. er ist am Ende 2 x vorhanden. Hat jemand eine Ahnung, warum es zu diser Verdoppelung kommt? Grüße Daniel
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
    

 Beiträge: 1997 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 29. Apr. 2013 06:54 <-- editieren / zitieren --> Unities abgeben:          Nur für Danillo
versuch mal über eine ActiveX Methode eine Variable zu setzen. z.B. so Code: (vl-catch-all-apply 'vlax-invoke(list (vla-get-activedocument (vlax-get-acad-object)) 'setvariable "cannoscale" "1:3") )
Außerdem solltest du schon genau wissen, was du mit Deinen Reaktoren machst.... vielleicht hast du ja command Aufrufe in den Reaktorfunktionen implementiert - das wäre sicher ein Fall von Absturtz.------------------ Gruß
CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Danillo Mitglied Bauingenieur
 
 Beiträge: 245 Registriert: 12.11.2003 Windows 11 - AutoCAD 2023
|
erstellt am: 30. Apr. 2013 00:43 <-- editieren / zitieren --> Unities abgeben:         
Hallo CADWiesel, du hast Recht: ein Blick in den Reaktor hat gezeigt, dass zwar kein Command-Befehl aufgerufen wird, dass ich aber die gleiche Routine aufrufe, mit der ich jetzt den Cannoscale auf den neuen Wert gesetzt habe. Das führt zwangsläufig zu einer Endlosschleife. Auch die Verdoppelung des Maßstabs hängt mit dem Reaktor zusammen; hatte ich übersehen; tut mir leid. Danke für den Tipp mit dem vl-Befehl; werde ich gerne ausprobieren. Kann mir jemand verraten, wo ich eine Erklärung zu den vl-Befehlen finde? Was bewirkt z.B. vl-catch-all-apply? Grüße Daniel
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
    
 Beiträge: 1776 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 30. Apr. 2013 07:09 <-- editieren / zitieren --> Unities abgeben:          Nur für Danillo
|