Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  DraftSight 2D
  Lisp Datei elemente erzeugen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: DraftSight - Warum hat ein 2D-CAD System einen solchen Erfolg?
Autor Thema:  Lisp Datei elemente erzeugen (1167 mal gelesen)
marcel3
Mitglied
Konstrukteur


Sehen Sie sich das Profil von marcel3 an!   Senden Sie eine Private Message an marcel3  Schreiben Sie einen Gästebucheintrag für marcel3

Beiträge: 88
Registriert: 30.04.2008

erstellt am: 24. Apr. 2017 16:17    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 24. Apr. 2017 16:54    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für marcel3 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von marcel3 an!   Senden Sie eine Private Message an marcel3  Schreiben Sie einen Gästebucheintrag für marcel3

Beiträge: 88
Registriert: 30.04.2008

erstellt am: 24. Apr. 2017 17:09    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 24. Apr. 2017 18:11    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für marcel3 10 Unities + Antwort hilfreich


170424_NONAME_0.dwg

 
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


Sehen Sie sich das Profil von jörg.jwd an!   Senden Sie eine Private Message an joerg.jwd  Schreiben Sie einen Gästebucheintrag für joerg.jwd

Beiträge: 3109
Registriert: 05.11.2003

erstellt am: 25. Apr. 2017 06:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für marcel3 10 Unities + Antwort hilfreich

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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 25. Apr. 2017 07:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für marcel3 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von marcel3 an!   Senden Sie eine Private Message an marcel3  Schreiben Sie einen Gästebucheintrag für marcel3

Beiträge: 88
Registriert: 30.04.2008

erstellt am: 25. Apr. 2017 08:30    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von jörg.jwd an!   Senden Sie eine Private Message an joerg.jwd  Schreiben Sie einen Gästebucheintrag für joerg.jwd

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für marcel3 10 Unities + Antwort hilfreich

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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 25. Apr. 2017 09:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für marcel3 10 Unities + Antwort hilfreich

"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


Sehen Sie sich das Profil von jörg.jwd an!   Senden Sie eine Private Message an joerg.jwd  Schreiben Sie einen Gästebucheintrag für joerg.jwd

Beiträge: 3109
Registriert: 05.11.2003

erstellt am: 25. Apr. 2017 09:35    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für marcel3 10 Unities + Antwort hilfreich

...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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz