| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für DraftSight |
| |
| KISTERS 3DViewStation: Mit Modellbasiertem Design zum Modellbasierten Unternehmen (MBE), eine Pressemitteilung
|
Autor
|
Thema: Lisp Datei elemente erzeugen (1196 / mal gelesen)
|
marcel3 Mitglied Konstrukteur
Beiträge: 88 Registriert: 30.04.2008
|
erstellt am: 24. Apr. 2017 16:17 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen ich beschäftige ich mich gerad damit ein kleines Lisp Programm zu erstellen. Das Programm soll Kreise mit einem Achsenkreuz erstellen und am Schluss diese neu erstellte Geometrie in einen Block zusammenfassen. Der Teil die Kreise erstellen ist soweit gegangen. Hier mein bisheriger Code: (Linienart Center muss vorhanden sein)
Code: (defun c:Krlu () (setq p1 (getpoint "punkt angeben:")) (setq v1 (getreal "durchmesser angeben:")) (setq x (car p1)) (setq y (cadr p1)) (setq v2 (+ 2 (/ v1 2))) (setq v3 0.0) (setq p2 (+ x v2)) (setq p3 (+ y v3)) (setq p4 (- x v2)) (setq p5 (- y v3)) (setq p6 (+ x v3)) (setq p7 (+ y v2)) (setq p8 (- x v3)) (setq p9 (- y v2)) (setq v4 (list p2 p3)) (setq v5 (list p4 p5)) (setq v6 (list p6 p7)) (setq v7 (list p8 p9)) (command "_CIRCLE" p1 "D" v1) (command "-LINIENART" "A" "CENTER" "") (command "LINIE" p1 v4 "") (command "LINIE" p1 v5 "") (command "LINIE" p1 v6 "") (command "LINIE" p1 v7 "") (command "-LINIENART" "A" "ByLayer" "") (princ) )
Wie muss ich das anstellen damit ich daraus direkt einen Block mit dem Einfügepunkt des Mittelpunkts vom Kreis erhalte? Ich danke für die Hilfe. In Lisp bin ich völliger Anfänger. Gruss Marcel ------------------ Gruss marcel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22277 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 24. Apr. 2017 16:54 <-- editieren / zitieren --> Unities abgeben: Nur für marcel3
Da du völliger Anfänger bist, bleiben wir mal bei dieser "scriptartigen Variante". Also wenig Lisp, viele Standard-Befehle über die Befehlszeile steuern = (Command "...") Der Befehl um einen Block zu definieren lautet BLOCK, um es 1:1 in der Befehlszeile zu testen, mußt du den Befehl "-BLOCK" anwenden. Dies ist die Befehlszeilenversion des Befehls "BLOCK". Er verlangt Basispunkt Objekte Namen usw., das siehst du dann beim testen in der Befehlszeile. Problem wird die Übergabe der Objekte sein, hierfür muss man sich einen Weg überlegen. << An dieser Stelle mal ein STOP >> Wenn dir der Block längst bekannt ist, warum dann auf diese Weise erstellen? Wäre es nicht besser eine Vorlage(dwg) vorzubereiten und in der Datei/im Programm dann einfach diesen Block einzufügen, falls noch kein Block mit dem Namen XY vorhanden ist. Oder ist es gewünscht das es nur eine Blockreferenz von einem Block gibt? Etwas verwirrt mich die Aufgabe, da nicht alle Hintergründe bekannt sind. <<------------------------------->> Variante1) Sorge dafür das ALLE Objekte im aktuellen Bereich die gewünschten sind, dann kann man bei der Abfrage des Befehls BLOCK nach den Objekten einfach ALLE angeben. Dazu kann man sich ja verschiedene Vorgehensweisen ausdenken.
Variante2) Einen Auswahlsatz erstellen Code:
(setq AWS (ssadd)) (command "_CIRCLE" p1 "D" v1) (ssadd (entlast) AWS) (command "-LINIENART" "A" "CENTER" "") (command "LINIE" p1 v4 "") (ssadd (entlast) AWS) (command "LINIE" p1 v5 "") (ssadd (entlast) AWS) (command "LINIE" p1 v6 "") (ssadd (entlast) AWS) (command "LINIE" p1 v7 "") (ssadd (entlast) AWS) (command "-BLOCK" undsoweiter)
unabhängig von deiner Fragestellung: - (setq v2 (+ 2 (/ v1 2))) Großes FAUL, welchen Wert bekommt V2 wenn die Durchmesserangabe des User eine Ganzzahl/Integer ist? Teste mal mit Wert V1=5! Sollte ich mich nicht irren, so erhält V2 anschließend den Wert=4, vermutlich möchtest du aber den Wert 4.5 erhalten? Dann schreibe (setq v2 (+ 2 (/ v1 2.0))) - Bei Ausgaben am Monitor solltest du Leerzeichen oder Zeilenumbrüche mit hinein bringen (setq p1 (getpoint "punkt angeben:"))| |(setq p1 (getpoint "\nPunkt angeben: ")) - Eine Zentrumsmarke sollte aus zwei, nicht aus vier Linien bestehen (unnötige Objektfang-Punkte, unnötige Anzahl von Objekten) - Warum DEnglisch? CIRCLE und LINIE / am besten ist international _CIRCLE und _LINE, aber zumind. einheitlich sollte es sein, sonst verwirrt es unnötig. - usw. Wie in meinem STOP angesprochen, würde man die (nicht komplett bekannte) Aufgabe wohl anders angehen ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marcel3 Mitglied Konstrukteur
Beiträge: 88 Registriert: 30.04.2008
|
erstellt am: 24. Apr. 2017 17:09 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm danke für die Antwort. Der Hintergrund meiner Aufgabenstellung ist folgende: Ich benötige viel Kreis mit unterschiedlichem Durchmesser die an einem durch den User bestimmten Einfügepunkt positioniert werden. Am besten als Block definiert und auf vorgegebenen Layer. Wie würde das "professionell" gemacht? Später möchte ich evt. noch weitere Formen z.B Rechteck auf gleiche weise erstellen können. habe die Variable mit dem Wert 5 getestet, der Kreis bekommt einen Durchmesser von 5. Danke für den Hinweis, sicherheitshalber würde ich das im Code noch anpassen. ------------------ Gruss marcel
[Diese Nachricht wurde von marcel3 am 24. Apr. 2017 editiert.] [Diese Nachricht wurde von marcel3 am 24. Apr. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22277 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 24. Apr. 2017 18:11 <-- editieren / zitieren --> Unities abgeben: Nur für marcel3
V1 beim Kreis ist klar, es geht um V2 und alles was von V2 aus berechnet wird! - Wenn man öfters Kreise mit Zentrumsmarke benötigte.. Jetzt muß ich weiter ausholen.. Wenn einem Zeichnungsnormen bzgl. des Überstandes der Linien ein wenig egal sind, dann setzt EINEN Block ein, Kreisdurchmesser=1 Nun setzt man für die Darstellung Blockreferenzen ein, welche skaliert werden. Kreisdurchmesser=2; setze eine Blockreferenz mit XY-Faktor=2 ein Kreisfurchmesser=0.5; setze den Faktor auf 0.5 usw. Befehl müsste EINFÜGE sein, oder Blockeinfüg Das ist der Sinn von Blöcken, einmal in der Datei definiert, tausendmal dargestellt. Sollte man später die Darstellung ändern wollen, so genügt es die Blockdefinition zu ändern und alle Tausend Blockreferenzen des Blockes zeigen die geänderte Blockdefinition an. - weitere (andere) Themen: Du arbeitest mit Command und normalen DraftSight-Befehlen, du simulierst dabei also Tastatureingabe . Bedenke dabei: OBJEKTFÄNGE! Sollte es auf den übergebenen Koordinaten andere Objekte in der Nähe geben, so wird bei aktiviertem Objektfang womöglich der falsche Punkt ermittelt, Deine Linien würden dann nicht wie gewünscht erstellt werden. Daher sollte man im Programm sicherstellen das dies nicht vorkommen kann. Ebenso könnte man sicherstellen das benötigte Layer vorhanden sind, oder Linientypen. So wird das Programm unabhängig(er) von der aktuellen Zeichnung. Gibt soviel an was man denken kann oder sollte, belassen wir es vorerst bei deinen Fragen. EDIT: DWG angehängt - Auch wenn es nichts mit Lisp zutun hat, anbei eine Beispieldatei. Ein Block als Beispiel, Blockreferenzen in mehreren Größen dargestellt. Der Block enthält einen Hyperlink sowie mit Attribute(ok, den Teil hätte ich mir sparen sollen ), so wie Layouts um Möglichkeiten der Layerverschachtelung und Steuermöglichkeit zu zeigen. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD
[Diese Nachricht wurde von cadffm am 24. Apr. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jörg.jwd Ehrenmitglied V.I.P. h.c. CAD-PDM Administrator
Beiträge: 3109 Registriert: 05.11.2003
|
erstellt am: 25. Apr. 2017 06:40 <-- editieren / zitieren --> Unities abgeben: Nur für marcel3
Hallo Marcel, hier mal ein Codeschnipsel zu Layer und Linientyp (ob vorhanden oder nicht) (if (not (tblsearch "LTYPE" "center")) (progn (command "-ltype" "_l" "center" "MM.LIN" "") (alert "der Linientyp Center \nwar nicht vorhanden" "Layer" "Information") );;;end progn );;;end if (command "_-layer" "_m" "center" "_lc" 1 "center" "_ls" "center" "center" "_lw" 0.25 "center" "") @Sebastian nicht wundern über die "lange" Command-Zeile, aber DraftSight will das so haben ------------------ Grüße Jörg da ich weiß daß ich nichts weiß weiß ich immer noch mehr als die die nicht wissen daß sie nichts wissen (weiß nicht von wem) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22277 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 25. Apr. 2017 07:41 <-- editieren / zitieren --> Unities abgeben: Nur für marcel3
Zitat: Original erstellt von jörg.jwd: @Sebastian nicht wundern über die "lange" Command-Zeile, aber DraftSight will das so haben
Was könnte mir daran unnötig lang vorkommen Mir sind die Zeilen eher zu kurz . ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marcel3 Mitglied Konstrukteur
Beiträge: 88 Registriert: 30.04.2008
|
erstellt am: 25. Apr. 2017 08:30 <-- editieren / zitieren --> Unities abgeben:
So nun habe ich dank euch das Programm soweit fertig. hier einmal der Code, für Verbesserungen und allfällige Hinweise auf Probleme bin ich weiterhin sehr dankbar. Das Programm wird grundsätzlich für das zeichnen von Rohrleitungen verwendet z.B für Lüftungsanlagen. Deshalb will ich in einem nächsten Schritt noch eines für Rechtecke auf die gleiche Art und Weise erstellen. Code: (defun c:Krlu () (setq v1 (getreal "durchmesser angeben:")) (setq n1 (getstring "name angeben:")) (setq x 0.0) (setq y 0.0) (setq v2 (* 1.1 (/ v1 2.0))) (setq p2 (+ x v2)) (setq p4 (- x v2)) (setq p6 (+ y v2)) (setq p8 (- y v2)) (setq v4 (list p2 Y)) (setq v5 (list p4 Y)) (setq v6 (list x p6)) (setq v7 (list x p8)) (setq AWS (ssadd)) (if (not (tblsearch "LTYPE" "center")) (progn (command "-ltype" "_l" "center" "MM.LIN" "") (alert "der Linientyp Center \nwar nicht vorhanden" "Layer" "Information") );;;end progn );;;end if (command "_-layer" "_m" "2" "_lc" 7 "2" "_ls" "durchgehend" "2" "_lw" 0.50 "2" "") (command "_CIRCLE" "0.0,0.0" "D" v1) (ssadd (entlast) AWS) (command "_-LINETYPE" "A" "center" "") (command "_-LWEIGHT" 0.25 "") (command "_LINE" v4 v5 "") (ssadd (entlast) AWS) (command "_LINE" v6 v7 "") (ssadd (entlast) AWS) (command "_-BLOCK" n1 "0,0" AWS "") (command "_-LINETYPE" "A" "byblock" "") (command "_-LWEIGHT" "byblock" "") (command "_-INSERT" n1 pause "1.0" "1.0" "0") (princ) )
Besten Dank für die Hilfe, super ------------------ Gruss marcel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jörg.jwd Ehrenmitglied V.I.P. h.c. CAD-PDM Administrator
Beiträge: 3109 Registriert: 05.11.2003 Win7-64,Win10-64 SWX 2010/11/12/13/14/15/16/17/18,19,20,21,22 Immer das aktuellste SP Autodesk Product Design Suite Standard 2020 DraftSight Énterprise 2021SP2 CIM Database 11.3 32GB RAM. NVIDIA Quadro P1000
|
erstellt am: 25. Apr. 2017 08:42 <-- editieren / zitieren --> Unities abgeben: Nur für marcel3
Zitat: Original erstellt von cadffm:
Mir sind die Zeilen eher zu kurz .
...was fehlt denn da deiner Meinung nach? @Marcel wenn das Ding läuft kannst du logischerweise die "alert" Zeile und das progn rausschmeißen. ------------------ Grüße Jörg da ich weiß daß ich nichts weiß weiß ich immer noch mehr als die die nicht wissen daß sie nichts wissen (weiß nicht von wem) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22277 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 25. Apr. 2017 09:10 <-- editieren / zitieren --> Unities abgeben: Nur für marcel3
"was fehlt denn da deiner Meinung nach?" Wenn du mir sagst warum es mir zu lang erscheinen könnte, dann sage ich was man länger machen könnte(lach). Also, warum "lang / DS möchte dies" Hier schon mal mein Kommentar: Außer dem Unterstrich zu internationalen Aufruf für LTYPE vermisse ich nichts. Wenn man aber command-Geschichten mit Standardbefehlen und Optionen nutzt(oder Menümakro und Skript), dann ist es nicht dumm die Optionen auszuschreiben, wie _load anstatt _l Hintergrund: Der Hersterller(zumindest der mit A beginnt ) wechselt öfter die Schlüsselaufrufe. Habe gerade das Wort nicht im Sinn, ich meine den Grossgeschriebenen oder Unterstrichenen Teil der Option, welcher als Kürzel genutzt werden kann: eigenSchaft = S startet Option"Eigenschaft" Der komplette Optionstitel wird hingegen seltener geändert, was weniger Änderungen an eigenen Commands, Makro, Skripten bei Versionswechseln bedeuten kann, wenn man Optionen ausschreibt. Und: Es wird "lesbarer" für sich selbst ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jörg.jwd Ehrenmitglied V.I.P. h.c. CAD-PDM Administrator
Beiträge: 3109 Registriert: 05.11.2003
|
erstellt am: 25. Apr. 2017 09:35 <-- editieren / zitieren --> Unities abgeben: Nur für marcel3
...Besten Dank für den Tipp. Den Unterstrich hatte ich wohl vergessen. Wenn's trotzdem läuft fällt's hinterher nicht mehr auf. Deshalb haben die Bücherschreiber wahrscheinlich ihre Lektoren da man die eigenen Fehler i.d.R. ja nicht sieht ------------------ Grüße Jörg da ich weiß daß ich nichts weiß weiß ich immer noch mehr als die die nicht wissen daß sie nichts wissen (weiß nicht von wem) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |